我想使用 为现有块设备创建 COW 设备dmsetup
。该块设备是:
# blockdev --getsz /dev/loop0
3534848
我正在尝试使用 256M ramdisk 作为后备存储:
# blockdev --getsz /dev/zram1
524288
# dmsetup create mysnap --table '0 3534848 snapshot /dev/loop0 /dev/zram1 N 4'
但它失败了:
device-mapper: reload ioctl on mysnap failed: Invalid argument
Command failed
并且内核提供了以下附加信息:
[ 8372.346442] device-mapper: table: 253:11: snapshot: Couldn't create exception store
[ 8372.346454] device-mapper: ioctl: error adding target to table
我希望有人可以解释为什么上述命令会导致错误。
答案1
显然这与值有关chunksize
。使用chunksize
4 (如我的问题中所示)会导致错误,但如果我使用8
或16
等,它就可以正常工作:
dmsetup create mysnap --table '0 3534848 snapshot /dev/loop0 /dev/zram1 N 8'
答案2
dmesg
在我的情况下出现了不同的错误:
[ 5473.934324] device-mapper: table: 253:0: len=1953521668 not aligned to h/w logical block size 4096 of sdb
[ 5473.934327] device-mapper: core: Cannot calculate initial queue limits
[ 5473.934331] device-mapper: ioctl: unable to set up device queue for new table.
我可以通过将长度降低到 4096 的下一个倍数来解决这个问题(我可以这样做,因为磁盘末尾有足够多的未使用扇区)。
这个故事的主要寓意可能就是在很多情况下内核可能会给出一些有用的信息,而 dmsetup 却不一定会传递这些信息。