Я хотел бы создать устройство COW для существующего блочного устройства, используя dmsetup
. Блочное устройство:
# blockdev --getsz /dev/loop0
3534848
Я пытаюсь использовать RAM-диск 256M в качестве резервного хранилища:
# 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
Я надеюсь, что кто-нибудь сможет объяснить, почему приведенная выше команда приводит к ошибке.
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 не обязательно передает.
Видимо, это связано с chunksize
стоимость. Используя chunksize
из 4, как в моем вопросе, приводит к ошибке, но если я использую 8
или 16
и т. д., он отлично работает:
dmsetup create mysnap --table '0 3534848 snapshot /dev/loop0 /dev/zram1 N 8'