Зафиксировать или вернуть снимок Linux LVM?

16

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

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

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

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

Shewfig
источник

Ответы:

11

Функция объединения снимков LVM2 / устройства сопоставления доступна, если вы работаете в Linux 2.6.33+ и используете LVM 2.0.58+:

lvconvert --merge

Смотрите этот пост: http://www.jonnor.com/2010/02/lvm-snapshot-merging-avaliable/

Он ссылается на http://kernelnewbies.org/Linux_2_6_33 (см. Раздел 5, MD / DM) и журнал изменений LVM на 2.0.58: ftp://sources.redhat.com/pub/lvm2/WHATS_NEW

Но я пока не могу сказать, как правильно его использовать ;-)

Бертран Матье
источник
dmsetup targetsдолжен отображать snapshot-merge, если это так, команда merge, примененная к snapshot-lv, вернется в состояние, в котором был сделан снимок.
Нильс
ОП кажется смущенным при внесении изменений через какой-то шаг слияния. Изменения фиксируются по мере увеличения размера снимка. Снимок (изменений) - это информация, необходимая для их поддержки с помощью lvconvert --merge. Если ОП доволен своими изменениями, он может удалить снимок через lvremove.
Винс
21

Я только что попробовал обновление на основе снимка с 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

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

# lvremove lvm/root-new

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

# lvconvert --merge lvm/root-new

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

# lvrename lvm root root-new
# lvconvert --merge lvm/root-new
# lvrename lvm root-old root

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

Да, и кстати: при переключении между системами, не забудьте использовать соответствующее ядро. Поскольку / boot не является частью lvm, старое и новое ядра будут размещаться рядом.

Виктор Дик
источник
Спасибо за Ваш ответ. Я только что воспроизвел вашу процедуру на виртуальной машине CentOS 7, и она сработала как шарм. После сброса моей виртуальной машины в середине процесса слияния подсистема LVM возобновила ее, пока система все еще осуществляла доступ к обновленным файлам.
Андерсон Медейрос Гомес
Часть этого ответа, похоже, предполагает внесение изменений через lvconvert --merge. По мере увеличения размера снимка изменения также фиксируются. Lvconvert --merge отменяет (отменяет) изменения, используя информацию снимка.
Винс
10

Хорошо, думаю, я понял это, перечитав HOWTO 3.8.

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

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

  1. Что-то пытается написать в оригинал.
  2. Оригинал читается, а блоки из оригинала копируются в снимок.
  3. Оригинал меняется.
  4. Снимок содержит «обратные различия» - изменения, которые делают исходный вид таким же, каким он был при создании снимка.

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

Отвечая на мой собственный вопрос:

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

Потом:

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

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

Shewfig
источник
Еще нет доступных инструментов слияния LVM. Это было в работе, но я не верю, что это завершено.
Игнасио Васкес-Абрамс
инструмент объединения теперь существует (по крайней мере, в Ubuntu Trusty) - lvconvert --merge <snapshot-name>он «восстановит» исходный диск до этого снимка и удалит этот снимок. Конечно, вы можете быстро восстановить его сразу.
дпб
3

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

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

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

Яцек Конечны
источник
2
  1. Нет причин объединять некоторые. Просто удалите снимок, источник LV остается неизменным
  2. Объединение необходимо, чтобы отменить изменения lvconvert --merge <snapshot name>
  3. LVM работает с блочными устройствами. Любые изменения, связанные с FS, должны выполняться специальными утилитами (xfs_growfs, e2fsck, ...) в соответствии с типом FS

Снимок «заморозить» исходное состояние LV. Удалить снимок означает забыть это состояние. Объединить снимок означает возврат в это состояние

Но внутри LVM он сохраняет перезаписанные данные в снимке: убедитесь, что размер снимка соответствует ожидаемому количеству изменений в LV и снимке

deman_killer
источник
На самом деле, снимок ничего не замораживает. Он записывает изменения в дополнительном месте, чтобы они могли быть отменены последними, если это необходимо.
Винс
0

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

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

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

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

RedScourge
источник
Вы пишете в снимок просто монтируя снимок; то, что монтируется там, где не имеет ничего общего со значениями по умолчанию LVM - его не волнует, что именно вы делаете с каждым логическим томом, будь то снимок или нет, он просто отслеживает, открыт он или нет.
Иосип Роден