GNU / Linux: наложенное блочное устройство / наращиваемое блочное устройство

14

GNU / Linux имеет монтируемое объединение, которое перекрывает каталоги. Таким образом, вы можете установить записываемый каталог поверх каталога, доступного только для чтения. Когда записываемый каталог отключен, доступный только для чтения каталог остается неизменным.

Я ищу те же функции для блочных устройств - желательно с записываемой частью, хранящейся в файле. Поэтому я хотел бы запустить что-то вроде:

device-setup /dev/newdevice /dev/read-only-device overlayfile

Если я пишу в / dev / newdevice, изменения должны быть сохранены в оверлейном файле. Если я читаю записанные сектора, я должен получить данные из оверлейного файла. Если я читаю сектора, не записанные в, я должен получить данные с / dev / read-only-device.

Существует ли такой инструмент?

Оле Танге
источник
Аналогичные вопросы и ответы: LVM-подобный снимок на обычном блочном устройстве .
imz - Иван Захарящев

Ответы:

22

Вы можете сделать это с помощью устройства отображения и его snapshotцели.

По сути, вы будете делать то же, что и LVM, когда создаете записываемый снимок.

dev=/dev/read-only-device
ovl=/path/to/overlay.file
newdevname=newdevice
size=$(blockdev --getsz "$dev")

loop=$(losetup -f --show -- "$ovl")
printf '%s\n' "0 $size snapshot $dev $loop P 8" |
  dmsetup create "$newdevname"

Затем вы можете получить доступ к наложенному устройству как /dev/mapper/newdevice.

Если вам одновременно необходим доступ к исходному устройству, вы можете сделать:

printf '%s\n' "0 $size snapshot-origin $dev" |
  dmsetup create originaldevice

И доступ к нему окончен /dev/mapper/originaldevice.

Вы можете записать на это устройство, тогда в дополнение к чанкам, записанным на устройство моментального снимка, файл оверлея будет содержать копию чанков, которые были перезаписаны при записи в источник моментального снимка.

Оверлейный файл может быть разреженным файлом. (например, создайте его как truncate -s10G the-file), и он не должен быть таким же большим, как оригинальное устройство. Вы можете сказать, насколько он полон dmsetup status "$newdevname".

Примечание. На устройстве моментальных снимков имеются требования к размеру и содержанию .

Стефан Шазелас
источник
1
Следующий интересный вопрос заключается в том, могут ли накопленные изменения позднее быть объединены в исходное устройство
imz - Иван Захарящев
1
Последующий ответ: да. «Device-mapper позволяет вам… *) объединить снимок блочного устройства обратно в исходное устройство снимка». kernel.org/doc/Documentation/device-mapper/snapshot.txt
imz - Иван Захарящев,
Что означает параметр chunksize для цели снимка (8 в вашем случае)? Как выбрать это?
imz - Иван Захарящев
1
@Tom Эти числа в таблицах DM всегда относятся к 512 байтам, а не к размеру физического сектора базовых блочных устройств. Поэтому использование чего-либо, не кратного 8, снимка поверх устройства с секторами 4K было бы плохой идеей.
Стефан
1
@Tom, размер фрагмента определяет гранулярность снимка. речь идет не о размере блока FS для оверлейного файла, а об общем количестве операций ввода-вывода, выполняемых на том, что находится на блочном устройстве. Отсюда и откат. Спасибо за Getz против GetSize.
Стефан