mdbooth / libldm

GNU General Public License v3.0
28 stars 15 forks source link

Add ability to override device mapper UUID #25

Closed takeshibaconsuzuki closed 1 month ago

takeshibaconsuzuki commented 4 months ago

Summary

See https://github.com/mdbooth/libldm/issues/24 for the problem statement.

This diff adds a new command line option --uuid_override <> which allows the user to specify the UUID suffix used for device mapper operations. This seems to be the most sensible option since we still get the atomic behavior for a given UUID.

Usage

Suppose we have a VM composed of ldm_span_1 and ldm_span_2. Suppose we have a cloned VM composed of ldm_span_1.cpy and ldm_span_2.cpy.

$ sudo losetup -a | grep ldm
/dev/loop8: [64769]:131514 (/home/ubuntu/ldm_span_2)
/dev/loop9: [64769]:131515 (/home/ubuntu/ldm_span_1.cpy)
/dev/loop7: [64769]:131513 (/home/ubuntu/ldm_span_1)
/dev/loop10: [64769]:131516 (/home/ubuntu/ldm_span_2.cpy)

We can see both VMs have the same disk group GUID, although they are backed by different disks:

$ sudo ldmtool scan -d /dev/loop7 -d /dev/loop8
[
  "8b8e67c1-2c14-45da-b742-00cb2dfea3c5"
]
$ sudo ldmtool scan -d /dev/loop9 -d /dev/loop10
[
  "8b8e67c1-2c14-45da-b742-00cb2dfea3c5"
]

With ldmtool 0.2.4, we are able to create separate devices for each VM by renaming the device:

$ sudo ldmtool create volume 8b8e67c1-2c14-45da-b742-00cb2dfea3c5 Volume1 -d /dev/loop7 -d /dev/loop8
[
  "ldm_vol_MyVGName_Volume1"
]
$ sudo ldmtool create volume 8b8e67c1-2c14-45da-b742-00cb2dfea3c5 Volume1 -d /dev/loop9 -d /dev/loop10
[
]
$ sudo dmsetup rename /dev/mapper/ldm_vol_MyVGName_Volume1 ldm_vol_MyVGName_Volume1_foo
$ sudo ldmtool create volume 8b8e67c1-2c14-45da-b742-00cb2dfea3c5 Volume1 -d /dev/loop9 -d /dev/loop10
[
  "ldm_vol_MyVGName_Volume1"
]
$ sudo dmsetup ls | grep ldm
ldm_vol_MyVGName_Volume1    (253:18)
ldm_vol_MyVGName_Volume1_foo    (253:17)

With ldmtool 0.2.5, this no longer works since we match by UUID instead of name:

$ sudo ldmtool create volume 8b8e67c1-2c14-45da-b742-00cb2dfea3c5 Volume1 -d /dev/loop7 -d /dev/loop8
[
  "ldm_vol_MyVGName_Volume1"
]
$ sudo ldmtool create volume 8b8e67c1-2c14-45da-b742-00cb2dfea3c5 Volume1 -d /dev/loop9 -d /dev/loop10
[
]
$ sudo dmsetup rename /dev/mapper/ldm_vol_MyVGName_Volume1 ldm_vol_MyVGName_Volume1_foo
$ sudo ldmtool create volume 8b8e67c1-2c14-45da-b742-00cb2dfea3c5 Volume1 -d /dev/loop9 -d /dev/loop10
[
]
$ sudo dmsetup ls | grep ldm
ldm_vol_MyVGName_Volume1_foo    (253:17)

With this diff, we are able to manually specify a UUID for use with device mapper so we can deduplicate the volumes:

$ sudo ldmtool create volume 8b8e67c1-2c14-45da-b742-00cb2dfea3c5 Volume1 -d /dev/loop9 -d /dev/loop10 --uuid_override ff481dc0-e1e4-4919-a9be-f1b89205065b
[
  "ldm_vol_MyVGName_Volume1"
]
$ sudo dmsetup ls | grep ldm
ldm_vol_MyVGName_Volume1    (253:18)
ldm_vol_MyVGName_Volume1_foo    (253:17)
$ sudo dmsetup info ldm_vol_MyVGName_Volume1_foo | grep UUID
UUID: LDM-Volume1-8b8e67c1-2c14-45da-b742-00cb2dfea3c5
$ sudo dmsetup info ldm_vol_MyVGName_Volume1 | grep UUID
UUID: LDM-Volume1-ff481dc0-e1e4-4919-a9be-f1b89205065b

--uuid_override is not allowed for shell mode or multiple volumes:

$ sudo ldmtool create all -d /dev/loop9 -d /dev/loop10 --uuid_override ff481dc0-e1e4-4919-a9be-f1b89205065b
UUID override cannot be used for multiple volumes
$ sudo ldmtool -d /dev/loop9 -d /dev/loop10 --uuid_override ff481dc0-e1e4-4919-a9be-f1b89205065b
UUID override cannot be used in shell mode

Implementation overview

make check

PASS: 2003R2_SIMPLE
PASS: 2003R2_SPANNED
PASS: 2003R2_STRIPED
PASS: 2003R2_MIRRORED
PASS: 2003R2_RAID5
PASS: 2008R2_SPANNED
PASS: 2008R2_STRIPED
PASS: 2008R2_MIRRORED
PASS: 2008R2_RAID5
PASS: 2003R2_MIRRORED_partial_1
PASS: 2003R2_MIRRORED_partial_2
PASS: 2008R2_MIRRORED_partial_1
PASS: 2008R2_MIRRORED_partial_2
============================================================================
Testsuite summary for libldm 0.2.5
============================================================================
# TOTAL: 13
# PASS:  13
# SKIP:  0
# XFAIL: 0
# FAIL:  0
# XPASS: 0
# ERROR: 0
============================================================================