2009-12-21 1 views
5

Я хотел бы программно сделать снимок живой файловой системы в Linux, предпочтительно используя LVM. Я бы не хотел его отключать, потому что у меня открыто много файлов (мой самый распространенный сценарий - у меня занятый рабочий стол с большим количеством программ).LVM-снимок смонтированной файловой системы

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

Есть ли способ «атомарно» размонтировать FS, сделать снимок LVM и установить его обратно? Будет нормально, если ОС будет блокировать все действия в течение нескольких секунд для выполнения этой задачи. Или, может быть, какая-то атомная синхронизация + моментальный снимок? Ядро называется?

Я не знаю, если это вообще возможно ...

+1

Я был в списке рассылки LVM на некоторое время, и, похоже, я помню, что файловые системы должны иметь вызовы для вызова файловой системы непосредственно на контрольную точку (т. Е. Настроить ее так, чтобы все записи журнала были воспроизведены для (fd) с журналом непосредственно перед операцией моментального снимка LVM. Это позволит убедиться, что сама файловая система по крайней мере находилась в согласованном состоянии в снимке. – Omnifarious

ответ

10

Вам не нужно ничего делать для большинства файловых систем Linux. Он должен работать без каких-либо усилий с вашей стороны. Сама команда моментальных снимков охотится за смонтированными файловыми системами с использованием моментального снимка и вызывает специальный крючок, который проверяет их в согласованном состоянии, монтируется и делает снимки атомарно.

Старые версии LVM поставляются с набором исправлений VFS, которые будут исправлять различные файловые системы, чтобы их можно было проверить на моментальный снимок. Но с новыми ядрами, которые уже должны быть встроены в большинство файловых систем Linux.

Этот intro on snapshots претензий так же.

И еще несколько исследований показывают, что для ядер в серии 2.6 все серии файловых систем должны поддерживать это. ReiserFS, вероятно, также. И если я знаю людей btrfs, это, вероятно, тоже.

+0

Вау, это здорово ... спасибо. – liori

+0

Конечно, если вы создаете моментальные снимки LVM для частички btrfs, вы довольно глупы. Btrfs обрабатывает все, что лучше, чем LVM. И btrfs не нуждается в контрольном крючке из-за того, как он работает. Либо вы получите суперблок, указывающий на новый корень, либо нет. Конечно, у него, вероятно, есть такой крючок, но он почти лишний. – Omnifarious

1

Я не уверен, если это будет делать трюк для вас, но вы можете перемонтировать файловую систему только для чтения. mount -o remount,ro /lvm (или что-то подобное) сделает трюк. После того, как вы сделаете свой снимок, вы можете переделать чтение-запись с помощью mount -o remount,rw /lvm.

+0

Это возможно только тогда, когда файл не открыт для записи ... с рабочим столом, много файлов, хотя приложения не пишут им все время; F.E. sqlite баз данных firefox и других приложений. – liori

3

Это зависит от используемой файловой системы. С помощью XFS вы можете использовать xfs_freeze -f для синхронизации и блокировки FS и xfs_freeze -u, чтобы активировать его снова, чтобы вы могли создать свой снимок из замороженного тома, который должен быть сохраненным.

4

Я знаю, что ext3 и ext4 в автоматической контрольной точке RedHat Enterprise, Fedora и CentOS при создании моментального снимка LVM. Это означает, что никогда не возникает проблем с установкой моментального снимка, потому что он всегда чист.

I считают XFS имеет одинаковую поддержку. Я не уверен в других файловых системах.

+1

"_RedHat Enterprise, Fedora и CentOS автоматически контрольная точка при создании моментального снимка LVM_": любая документация, подтверждающая это? Является ли это специфическим для RH? –

+0

@ Benoît: «многие из файловых систем в ядре 2.6 делают это автоматически при создании моментального снимка» - http://tldp.org/HOWTO/LVM-HOWTO/snapshotintro.html –

+1

Ну, это на самом деле довольно новый http : //kernelnewbies.org/Linux_2_6_29#head-b6c330f9e6d252b514138f042ac9b01e9d4170ca! –

1

Есть ли способ «атомарно» размонтировать 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 на базовом устройстве) или отменить его.

  • Чтобы объединить его:

    1. заменить таблицу с 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 
      
    2. Далее, не контролировать состояние слияния, пока все не -метадатные блоки объединяются:

      # watch dmsetup status home 
      ... 
      0 3864024960 snapshot-merge 281688/2097152 1104 
      

      Обратите внимание на 3 номера в конце (X/Y Z). Слияние будет завершено, когда X = Z.

    3. Далее, снова заменить таблицу с линейной цели:

      # dmsetup suspend home && \ 
          dmsetup reload home --table \ 
          "0 $(blockdev --getsz /dev/sda2) linear /dev/sda2 0" && \ 
          dmsetup resume home 
      
    4. Теперь вы можете демонтировать устройство обратной связи:

      # losetup -d /dev/loop0 
      
    5. Наконец , вы можете удалить файл COW.

      # rm /home_cow 
      
  • Чтобы отменить снимок, размонтировать /home, выполните шаги 3-5 выше, и перемонтировать /home. Хотя Device Mapper позволит вам сделать это без размонтирования /home, это не имеет смысла (поскольку состояние запущенных программ в памяти больше не будет соответствовать состоянию файловой системы), и это, скорее всего, испортит вашу файловую систему.

+0

Когда я читал «даже когда файловая система не находится на томе LVM», я подумал: «Это будет какая-то хорошая черная магия devicemapper!» Великолепный! Один вопрос: будет ли эта процедура запускать те же самые крючки, которые гарантируют, что моментальный снимок будет в согласованном состоянии? Я предполагаю, что это должно быть частью вызова 'blockdev --setro/dev/sda2'. – liori

+0

Вы можете добавить вызов 'sync' непосредственно перед созданием моментального снимка, однако, поскольку я не могу найти надежный источник того, действует ли' sync' выше или ниже уровня файловой системы, это может или не может ничего сделать. Независимо от этого, моментальный снимок * будет * последовательным в том смысле, что все изменения, которые будут или не будут включены в моментальный снимок, будут строго ограничены точкой во времени, а не, например, дискового смещения или имени файла, поэтому моментальный снимок будет выглядеть так, как если бы машина в этот момент была отключена. [...] –

+0

[...] Это достаточно, например. для баз данных ACID для продолжения сохранения целостности данных. И если вы не используете файловую систему, не относящуюся к журналам (ext3 и new - это журналирование), я думаю, что повреждение файловой системы также маловероятно, независимо от того, были ли очищены кэши файловой системы. –

0

Коррупция FS «крайне маловероятна», если вы никогда не работаете в какой-либо профессиональной среде. в противном случае вы встретите реальность, и вы можете попробовать обвинить «бит-гниль» или «аппаратное обеспечение» или что-то еще, но все сводится к тому, что они безответственны. замораживание/оттаивание (как уже упоминалось несколько раз, и только если вызвано правильно) достаточно снаружи условий базы данных. для баз данных вы все равно не будете иметь полную резервную копию транзакции, и если вы считаете, что резервная копия, которая откатывает транзакцию, прекрасна при восстановлении: см. начальное предложение. в зависимости от активности, которую вы могли бы просто добавить еще 5-10 минут простоя, если вам нужна эта резервная копия. Большинство нас могут легко себе позволить, но это не может быть общий совет. Будьте честны о недостатках, ребята.

+0

Благодарим за внимание. Однако, пожалуйста, не добавляйте комментарии к другим ответам в качестве отдельных ответов. Вот на что комментируются платформы StackExchange. Я предлагаю вам добавить часть о коррупции файловой системы в качестве комментария к ответу Владимира Пантелеева (который, как я полагаю, вы ссылаетесь), и часть о базах данных будет лучше размещена в качестве комментария к самому вопросу. – liori