Назад | Перейти на главную страницу

Почему dmsetup не работает, когда я пытаюсь создать снимок?

Я хотел бы создать устройство 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'