Вопрос

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

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

Есть ли какой-нибудь способ "атомарно" размонтировать FS, создать моментальный снимок LVM и смонтировать его обратно?Будет нормально, если ОС заблокирует всю активность на несколько секунд для выполнения этой задачи.Или, может быть, какой-то атомарный "sync + snapshot"?Вызов ядра?

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

Это было полезно?

Решение

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

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

Это введение к моментальным снимкам утверждает столько же.

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

Другие советы

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

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

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

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

Есть ли какой-нибудь способ "атомарно" размонтировать FS, создать моментальный снимок LVM и смонтировать его обратно?

Можно создать моментальный снимок смонтированной файловой системы, даже если файловая система не находится на томе LVM.Если файловая система находится на LVM или имеет встроенные средства моментального снимка (напримерbtrfs или ZFS), затем используйте их вместо этого.

Приведенные ниже инструкции довольно низкоуровневые, но они могут быть полезны, если вам нужна возможность создания моментального снимка файловой системы, которая не находится на томе LVM, и вы не можете переместить ее на новый том LVM.Тем не менее, они не для слабонервных:если вы допустите ошибку, вы можете повредить свою файловую систему.Обязательно проконсультируйтесь официальная документация и 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 цель.

Устройство отображения устройств предоставляет три цели для создания моментальных снимков:

  • В snapshot целевой объект, который сохраняет записи на указанное устройство COW.(Обратите внимание, что, хотя это называется моментальным снимком, терминология вводит в заблуждение, поскольку моментальный снимок будет доступен для записи, но базовое устройство останется неизменным.)

  • В snapshot-origin целевой объект, который отправляет записи на базовое устройство, но также отправляет старые данные, которые были перезаписаны при записи, на указанное устройство COW.

Как правило, вы бы сделали home a snapshot-origin цель, затем создайте некоторые snapshot цели поверх него.Это то, что делает LVM.Однако более простым методом было бы просто создать snapshot нацеливайтесь напрямую, именно это я покажу ниже.

Независимо от выбранного вами метода, вы не должен запись на базовое устройство (/dev/sda2), или на моментальных снимках будет отображено поврежденное представление файловой системы.Итак, в качестве меры предосторожности вам следует пометить базовое блочное устройство как доступное только для чтения:

# blockdev --setro /dev/sda2

Это не повлияет на поддерживаемые им устройства отображения устройств, поэтому, если вы уже повторно смонтировали /home на /dev/mapper/home, это не должно иметь заметного эффекта.

Далее вам нужно будет подготовить устройство COW, в котором будут храниться изменения с момента создания моментального снимка.Это должно быть блочное устройство, но может быть поддержано разреженным файлом.Если вы хотите использовать разреженный файл, например32 ГБ:

# 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

Если это удастся, new записывает в /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, это не имеет смысла (поскольку состояние запущенных программ в памяти больше не будет соответствовать состоянию файловой системы), и это, скорее всего, приведет к повреждению вашей файловой системы.

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top