Есть ли способ «атомарно» размонтировать FS, сделать снимок LVM и установить его обратно?
Возможно создание моментальной копии смонтированной файловой системы, даже если файловая система не находится на томе LVM. Если файловая система находится на LVM или имеет встроенные средства моментального снимка (например, btrfs или ZFS), используйте их вместо этого.
В приведенных ниже инструкциях достаточно низкоуровневые, но они могут быть полезны, если вы хотите получить снимок файловой системы, которая не находится на томе LVM, и не может переместить ее на новый том LVM. Тем не менее, они не для слабонервных: если вы допустили ошибку, вы можете повредить свою файловую систему.Обязательно проконсультируйтесь с the official documentation и dmsetup
справочной страницей, выполните тройную проверку команд, которые вы используете, и у есть резервные копии!
Ядро Linux имеет удивительное средство, называемое Device Mapper, которое может делать приятные вещи, такие как создание блочных устройств, которые являются «представлениями» других блочных устройств и, конечно, снимками. Это также то, что LVM использует под капотом для тяжелого подъема.
В приведенных ниже примерах я предположим, что вы хотите сделать снимок /home
, который является файловой системой ext4, расположенной по адресу /dev/sda2
.
Во-первых, найти имя картографа устройства устройства, которое перегородка установлена на:
# mount | grep home
/dev/mapper/home on /home type ext4 (rw,relatime,data=ordered)
Здесь имя картографа устройство устройство является home
. Если путь к блочному устройству не начинается с /dev/mapper/
, вам нужно будет создать устройство сопоставления устройств и перемонтировать файловую систему для использования этого устройства вместо раздела жесткого диска. Вам нужно будет сделать это только один раз.
# dmsetup create home --table "0 $(blockdev --getsz /dev/sda2) linear /dev/sda2 0"
# umount /home
# mount -t ext4 /dev/mapper/home /home
Далее, получить блочное устройство устройства сопоставитель таблицу:
# dmsetup table home
home: 0 3864024960 linear 9:2 0
Ваших номера, вероятно, будут отличаться. Цель устройства должна быть linear
; если у вас нет, вам могут потребоваться особые соображения. Если последнее число (начальное смещение) не равно 0, вам необходимо создать промежуточное блочное устройство (с той же таблицей, что и текущее), и использовать его как базу вместо /dev/sda2
.
В приведенном выше примере home
использует таблицу с одним номером с целью linear
. Вам нужно будет заменить эту таблицу новой, которая использует цель snapshot
.
Device Mapper обеспечивает три цели для мгновенных снимков:
В snapshot
цель, которая сохраняет записи в указанном устройстве КПС. (Обратите внимание, что даже если это называется снимком, терминология вводит в заблуждении, так как снимок будет доступен для записи, но основное устройство будет оставаться неизменным.)
snapshot-origin
цели, которая посылает запись в нижележащее устройство, но также и отправляет старые данные, которые записи записываются на указанное устройство COW.
Как правило, вы бы home
в snapshot-origin
цели, а затем создать некоторые snapshot
цели на вершине. Это то, что делает LVM. Однако более простым методом было бы просто создать цель snapshot
, что я покажу ниже.
Независимо от метода вы выбираете, вы не должны записи к базовому устройству (/dev/sda2
), или снимкам будут видеть поврежденный вид файловой системы.Таким образом, в качестве меры предосторожности, вы должны отметить блочное устройство базового, как только для чтения:
# blockdev --setro /dev/sda2
Это не повлияет на устройство-картограф устройств поддержанных ею, так что если вы уже повторно установлены /home
на /dev/mapper/home
, он не должен иметь заметного эффекта.
Далее вам нужно подготовить устройство COW, которое будет сохранять изменения с момента создания моментального снимка. Это должно быть блочное устройство, но может быть подкреплено разреженным файлом. Если вы хотите использовать разреженный файл, например. 32GB:
# dd if=/dev/zero bs=1M count=0 seek=32768 of=/home_cow
# losetup --find --show /home_cow
/dev/loop0
Очевидно, что разреженный файл не должен быть в файловой системе вы :)
мгновенных снимков
Теперь вы можете перезагрузить таблицу устройства и превратить его в снимок устройства:
# dmsetup suspend home && \
dmsetup reload home --table \
"0 $(blockdev --getsz /dev/sda2) snapshot /dev/sda2 /dev/loop0 PO 8" && \
dmsetup resume home
Если это удается, новые записи в /home
теперь должны записываться в файл /home_cow
, вместо того чтобы записываться в /dev/sda2
. Убедитесь, что вы контролируете размер файла COW, а также свободное место на файловой системе, на которой он включен, чтобы избежать пробега в пространстве COW.
Как только вам больше не нужен моментальный снимок, вы можете объединить его (чтобы окончательно зафиксировать изменения в файле COW на базовом устройстве) или отменить его.
Чтобы объединить его:
заменить таблицу с snapshot-merge
цели вместо snapshot
цели:
# dmsetup suspend home && \
dmsetup reload home --table \
"0 $(blockdev --getsz /dev/sda2) snapshot-merge /dev/sda2 /dev/loop0 P 8" && \
dmsetup resume home
Далее, не контролировать состояние слияния, пока все не -метадатные блоки объединяются:
# watch dmsetup status home
...
0 3864024960 snapshot-merge 281688/2097152 1104
Обратите внимание на 3 номера в конце (X/Y Z). Слияние будет завершено, когда X = Z.
Далее, снова заменить таблицу с линейной цели:
# dmsetup suspend home && \
dmsetup reload home --table \
"0 $(blockdev --getsz /dev/sda2) linear /dev/sda2 0" && \
dmsetup resume home
Теперь вы можете демонтировать устройство обратной связи:
# losetup -d /dev/loop0
Наконец , вы можете удалить файл COW.
# rm /home_cow
Чтобы отменить снимок, размонтировать /home
, выполните шаги 3-5 выше, и перемонтировать /home
. Хотя Device Mapper позволит вам сделать это без размонтирования /home
, это не имеет смысла (поскольку состояние запущенных программ в памяти больше не будет соответствовать состоянию файловой системы), и это, скорее всего, испортит вашу файловую систему.
Я был в списке рассылки LVM на некоторое время, и, похоже, я помню, что файловые системы должны иметь вызовы для вызова файловой системы непосредственно на контрольную точку (т. Е. Настроить ее так, чтобы все записи журнала были воспроизведены для (fd) с журналом непосредственно перед операцией моментального снимка LVM. Это позволит убедиться, что сама файловая система по крайней мере находилась в согласованном состоянии в снимке. – Omnifarious