Я собираюсь выполнить экспериментальное обновление на моем сервере CentOS 5. Если обновление не удастся, я хочу иметь возможность отменить изменения в файловой системе. Этот сценарий похож на пример в Раздел 3.8 LVM HOWTO для моментальных снимков чтения-записи LVM2 - но в этом примере не хватает фактических практических рекомендаций.
Как я могу зафиксировать изменения, объединив их обратно в исходный раздел?
Как мне отменить изменения, вернув файловую систему в исходное состояние? Должен ли я предполагать, что мне нужно перезапустить несколько служб, если не перезагрузить сразу?
Можно ли сделать снимок только определенных каталогов в разделе или это операция для всего раздела?
Я только что попробовал обновить 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, старое и новое ядра будут размещены там рядом.
Хорошо, я думаю, что понял, перечитав HOWTO 3.8.
Способ работы снимка - это набор изменений на уровне блоков по сравнению с оригиналом. Итак, когда оригинал записывается, происходит следующее:
Таким образом, выброс снимка не повлияет на оригинал - потому что оригинал был изменен, а снимок просто содержал список этих изменений.
Отвечая на свой вопрос:
Создайте новый снимок с LVM. Если обновление можно настроить для записи в точку монтирования моментального снимка, используйте моментальный снимок для чтения / записи. В противном случае подойдет либо RO, либо R / W.
Затем:
Я до сих пор не нашел инструмента, специально предназначенного для этого слияния, и, учитывая, что мой сценарий не совсем соответствует предполагаемому использованию снимков, его может и не быть. Это похоже на работу для rdiff.
Функциональность слияния снимков 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
Но я пока не могу вам сказать, как его правильно использовать ;-)
LVM работает на уровне блоков. Он даже «не знает», что такое файловая система. Таким образом, вы не можете делать снимки только определенных каталогов, если только туда не смонтирована файловая система с другого тома LVM.
Когда вы делаете снимок LVM, вы фактически запрашиваете копию тома «копировать при записи». Любой блок, который будет изменен в моментальном снимке тома, будет сначала сохранен в нем без изменений. Итак, чтобы «зафиксировать изменения», вам не нужно ничего делать. Просто удалите том моментального снимка.
Я не совсем знаю, какой рекомендуемый способ «отменить изменения», так как я никогда не использовал LVM в таком сценарии, но я думаю, что он хорошо описан где-то в документации LVM. Что бы это ни было, вам, вероятно, потребуется перезапустить все, что было изменено, перезагрузка может быть хорошей идеей.
lvconvert --merge <snapshot name>
Снимок "замораживает" исходное состояние LV. Удалить снимок означает забыть это состояние. Снимок слияния означает возврат в это состояние
Но внутри LVM он сохраняет перезаписанные данные в снимке: убедитесь, что размер снимка соответствует ожидаемому количеству изменений на LV и снимке.
Документация сбивает с толку. Мне кажется, что lvcreate --merge означает отменить все изменения, а lvremove означает зафиксировать изменения. Разница в том, как вы его используете.
В большинстве случаев вы просто используете моментальный снимок как зафиксированную только для чтения копию рабочего тома на определенный момент времени, а рабочий том постоянно меняется. В этом случае, если вы выполните слияние, логически это будет означать, что вы собираетесь перезаписать живой том замороженной копией, или, другими словами, слияние означает откат изменений, а удаление означает фиксацию изменений.
Если вы выполняете запись в моментальный снимок (новая опция с LVM2), что, по-видимому, не является поведением по умолчанию и, вероятно, требует изменения конфигурации в другом месте, чтобы приложения записывали в моментальный снимок, а не на исходный том, тогда будет верно обратное.
Пожалуйста, будьте осторожны при работе со снимками, так как некоторые люди подумают, что вы хотите использовать их одним способом, и дадут вам инструкции, которые могут разрушить вашу систему, если вы будете действовать в противоположном предположении!