Linux

Как зафиксировать/отменить снимок Linux LVM?

Я собираюсь выполнить экспериментальное обновление на моем сервере CentOS 5. Если обновление не удастся, я хочу иметь возможность отменить изменения в файловой системе. Этот сценарий кажется похожим на пример из раздела 3.8 LVM HOWTO для снимков LVM2 с чтением-записью, но в примере не хватает фактического способа.

Как зафиксировать изменения, объединив их с исходным разделом?

Как вернуть изменения, восстановив исходное состояние файловой системы? Должен ли я предполагать, что мне потребуется перезапустить несколько служб, а то и вовсе перезагрузиться?

Можно ли сделать моментальный снимок только определенных каталогов на разделе, или эта операция выполняется для всей системы в целом?

Ответ 1

Снимки только для чтения (например, LVM1) содержат различия на уровне блоков после создания снимка оригинал по-прежнему изменяется, но снимок сохраняет представление оригинала. Чтение из моментального снимка представляет данные в том виде, в котором они были на тот момент.

Снимки с записью на чтение (по умолчанию в LVM2) можно записывать: они являются вариантом исходного раздела. Запись на моментальный снимок не изменяет оригинал. Способ работы моментального снимка это набор изменений на уровне блоков по сравнению с оригиналом, поэтому при записи на оригинал происходят следующие вещи:

  1. Что-то пытается записать в оригинал.

  2. Оригинал считывается, и блоки из оригинала копируются в моментальный снимок.

  3. Оригинал изменяется.

  4. Снимок содержит «обратные различия» — изменения, которые заставляют оригинал выглядеть так, как он выглядел на момент создания снимка.

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

Поэтому создайте новый моментальный снимок с помощью LVM. Если обновление может быть настроено на запись в точку монтирования моментального снимка, используйте R/W моментальный снимок. В противном случае подойдет либо RO, либо R/W.

Затем:

  1. Если запись производится в точку монтирования R/W моментального снимка, зафиксируйте его, записав в оригинал, и вернитесь, выбросив моментальный снимок.

  2. Если запись производится в оригинальную точку монтирования, фиксация выполняется путем отбрасывания моментального снимка, а возврат путем записи из моментального снимка в оригинал.

Я все еще не нашел инструмента специально для выполнения этого слияния, и, учитывая, что мой сценарий не совсем подходит для использования моментальных снимков, его может и не быть. Это похоже на работу для rdiff.

Ответ 2

Документация сбивает с толку. Мне кажется, что lvcreate --merge означает возврат всех изменений, а lvremove означает фиксацию изменений. Разница в том, как вы используете это.

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

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

Пожалуйста, будьте осторожны при работе с моментальными снимками, поскольку некоторые люди будут считать, что вы хотите использовать их одним способом, и дадут вам инструкции, которые могут разрушить вашу систему, если вы будете действовать в соответствии с противоположным предположением!

Ответ 3

LVM работает на уровне блоков. Он даже «не знает», что такое файловая система. Поэтому вы не можете сделать моментальный снимок только определенных каталогов, если там не смонтирована файловая система из другого тома LVM.

Когда вы делаете снимок LVM, вы фактически запрашиваете «копию на запись» дубликата тома. Любой блок, который будет изменен на снимке тома, будет храниться в снимке без изменений, поэтому для «фиксации изменений» вам не нужно ничего делать. Просто удалите моментальный снимок тома.

Я не совсем понимаю, какой способ рекомендуется использовать для «отмены изменений», поскольку никогда не использовал LVM в таком сценарии, но, полагаю, он хорошо описан в документации по LVM. Что бы это ни было, вам, вероятно, придется перезапустить все, что было изменено, перезагрузка может быть хорошей идеей.

Ответ 4

Я только что попробовал обновление на основе моментального снимка с Ubuntu. И да, мне пришлось перезагрузиться несколько раз. Сначала переименуйте оригинальный root-lv во что-то другое, чтобы вы могли дать моментальному снимку оригинальное имя (поскольку обновление создает много изменений и изменения происходят быстрее на моментальном снимке, нежели на оригинале):

# lvrename lvm root root-old

# lvcreate -n root -s lvm/root-old -L 10G

Размер должен быть выбран соответствующим образом. Затем перезагрузитесь, чтобы «новый» lvm/ubuntu смонтировался как root и вы могли выполнить обновление. Теперь вы можете протестировать новую версию и даже перейти на старую систему, выполнив следующие действия:

# lvrename lvm root root-new

 # lvrename lvm root-old root

 # reboot

 Если вы хотите отказаться от обновления, просто запустите (из старой системы):

# lvconvert --merge lvm/root-new

 или из новой системы:

# lvrename lvm root root-new

# lvconvert --merge lvm/root-new

# lvrename lvm root-old root

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

Схожие статьи

Linux

Действительно ли изменение номера порта по умолчанию повышает безопасность?

Ubuntu Touch: определение, преимущества и правила установки вместо Android
Linux

Ubuntu Touch: определение, преимущества и правила установки вместо Android

Linux

Синхронизация снимков LVM с сервером резервного копирования

Linux

Запуск jmap, получение которого невозможно без открытия файла сокета