[lxc-devel] [lxd/master] {ceph, lvm}: generate new UUIDS for btrfs filesystems
brauner on Github
lxc-bot at linuxcontainers.org
Mon Nov 13 11:30:41 UTC 2017
A non-text attachment was scrubbed...
Name: not available
Type: text/x-mailbox
Size: 364 bytes
Desc: not available
URL: <http://lists.linuxcontainers.org/pipermail/lxc-devel/attachments/20171113/d1cddf99/attachment.bin>
-------------- next part --------------
From 8ed26ab33d9e46a4ca3f857f872058f862ef1d3a Mon Sep 17 00:00:00 2001
From: Christian Brauner <christian.brauner at ubuntu.com>
Date: Mon, 13 Nov 2017 12:24:06 +0100
Subject: [PATCH 1/2] lvm: generate new UUID on thinpools for btrfs
Signed-off-by: Christian Brauner <christian.brauner at ubuntu.com>
---
lxd/storage_lvm.go | 5 +++--
lxd/storage_lvm_utils.go | 21 ++++++++++++++++-----
lxd/storage_utils.go | 24 ++++++++++++++++++++++++
3 files changed, 43 insertions(+), 7 deletions(-)
diff --git a/lxd/storage_lvm.go b/lxd/storage_lvm.go
index 6e0937962..f227e66f7 100644
--- a/lxd/storage_lvm.go
+++ b/lxd/storage_lvm.go
@@ -971,9 +971,10 @@ func (s *storageLvm) ContainerCreateFromImage(container container, fingerprint s
containerLvDevPath := getLvmDevPath(poolName, storagePoolVolumeAPIEndpointContainers, containerLvmName)
// Generate a new xfs's UUID
lvFsType := s.getLvmFilesystem()
- if lvFsType == "xfs" {
- _, err := xfsGenerateNewUUID(containerLvDevPath)
+ if s.useThinpool {
+ msg, err := fsGenerateNewUUID(lvFsType, containerLvDevPath)
if err != nil {
+ logger.Errorf("Failed to create new \"%s\" UUID for container \"%s\" on storage pool \"%s\": %s", lvFsType, containerName, s.pool.Name, msg)
return err
}
}
diff --git a/lxd/storage_lvm_utils.go b/lxd/storage_lvm_utils.go
index 3eed137a9..6c14b34c4 100644
--- a/lxd/storage_lvm_utils.go
+++ b/lxd/storage_lvm_utils.go
@@ -295,12 +295,23 @@ func (s *storageLvm) copyContainerThinpool(target container, source container, r
containerLvmName := containerNameToLVName(containerName)
containerLvDevPath := getLvmDevPath(poolName,
storagePoolVolumeAPIEndpointContainers, containerLvmName)
- if LVFilesystem == "xfs" {
- msg, err := xfsGenerateNewUUID(containerLvDevPath)
+ if s.useThinpool {
+ // If btrfstune sees two btrfs filesystems with the same UUID it
+ // gets confused and wants both of them unmounted. So unmount
+ // the source as well.
+ if LVFilesystem == "btrfs" {
+ ourUmount, err := s.ContainerUmount(source.Name(), source.Path())
+ if err != nil {
+ return err
+ }
+ if ourUmount {
+ s.ContainerMount(source)
+ }
+ }
+
+ msg, err := fsGenerateNewUUID(LVFilesystem, containerLvDevPath)
if err != nil {
- logger.Errorf(`Failed to create new xfs UUID for `+
- `container "%s" on storage pool "%s": %s`,
- containerName, s.pool.Name, msg)
+ logger.Errorf("Failed to create new \"%s\" UUID for container \"%s\" on storage pool \"%s\": %s", LVFilesystem, containerName, s.pool.Name, msg)
return err
}
}
diff --git a/lxd/storage_utils.go b/lxd/storage_utils.go
index 923980aee..90019575d 100644
--- a/lxd/storage_utils.go
+++ b/lxd/storage_utils.go
@@ -214,6 +214,17 @@ func makeFSType(path string, fsType string, options *mkfsOptions) (string, error
return "", nil
}
+func fsGenerateNewUUID(fstype string, lvpath string) (string, error) {
+ switch fstype {
+ case "btrfs":
+ return btrfsGenerateNewUUID(lvpath)
+ case "xfs":
+ return xfsGenerateNewUUID(lvpath)
+ }
+
+ return "", nil
+}
+
func xfsGenerateNewUUID(lvpath string) (string, error) {
msg, err := shared.RunCommand(
"xfs_admin",
@@ -226,6 +237,19 @@ func xfsGenerateNewUUID(lvpath string) (string, error) {
return "", nil
}
+func btrfsGenerateNewUUID(lvpath string) (string, error) {
+ msg, err := shared.RunCommand(
+ "btrfstune",
+ "-f",
+ "-u",
+ lvpath)
+ if err != nil {
+ return msg, err
+ }
+
+ return "", nil
+}
+
func growFileSystem(fsType string, devPath string, mntpoint string) error {
var msg string
var err error
From 1e105566752030e16e0699e4634b90fe72f323ad Mon Sep 17 00:00:00 2001
From: Christian Brauner <christian.brauner at ubuntu.com>
Date: Mon, 13 Nov 2017 12:28:32 +0100
Subject: [PATCH 2/2] ceph: generate new UUID for btrfs
Signed-off-by: Christian Brauner <christian.brauner at ubuntu.com>
---
lxd/storage_ceph.go | 13 +++++--------
lxd/storage_ceph_utils.go | 13 ++++---------
2 files changed, 9 insertions(+), 17 deletions(-)
diff --git a/lxd/storage_ceph.go b/lxd/storage_ceph.go
index 32b0a5cf7..1af3cc410 100644
--- a/lxd/storage_ceph.go
+++ b/lxd/storage_ceph.go
@@ -1053,14 +1053,11 @@ func (s *storageCeph) ContainerCreateFromImage(container container, fingerprint
// Generate a new xfs's UUID
RBDFilesystem := s.getRBDFilesystem()
- if RBDFilesystem == "xfs" {
- msg, err := xfsGenerateNewUUID(RBDDevPath)
- if err != nil {
- logger.Errorf(`Failed to generate new xfs UUID for `+
- `RBD storage volume for container "%s": %s`,
- containerName, msg)
- return err
- }
+
+ msg, err := fsGenerateNewUUID(RBDFilesystem, RBDDevPath)
+ if err != nil {
+ logger.Errorf("Failed to create new \"%s\" UUID for container \"%s\" on storage pool \"%s\": %s", RBDFilesystem, containerName, s.pool.Name, msg)
+ return err
}
privileged := container.IsPrivileged()
diff --git a/lxd/storage_ceph_utils.go b/lxd/storage_ceph_utils.go
index 22017c67b..8294bd499 100644
--- a/lxd/storage_ceph_utils.go
+++ b/lxd/storage_ceph_utils.go
@@ -837,15 +837,10 @@ func (s *storageCeph) copyWithoutSnapshotsSparse(target container,
// Generate a new xfs's UUID
RBDFilesystem := s.getRBDFilesystem()
- if RBDFilesystem == "xfs" {
- msg, err := xfsGenerateNewUUID(RBDDevPath)
- if err != nil {
- logger.Errorf(`Failed to generate new xfs UUID for `+
- `RBD storage volume for container "%s" on `+
- `storage pool "%s": %s`, targetContainerName,
- s.pool.Name, msg)
- return err
- }
+ msg, err := fsGenerateNewUUID(RBDFilesystem, RBDDevPath)
+ if err != nil {
+ logger.Errorf("Failed to create new \"%s\" UUID for container \"%s\" on storage pool \"%s\": %s", RBDFilesystem, targetContainerName, s.pool.Name, msg)
+ return err
}
targetContainerMountPoint := getContainerMountPoint(s.pool.Name,
More information about the lxc-devel
mailing list