Назад | Перейти на главную страницу

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

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

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

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

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

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

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

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

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

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

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

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

Затем:

  • Если писать в 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. Что бы это ни было, вам, вероятно, потребуется перезапустить все, что было изменено, перезагрузка может быть хорошей идеей.

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

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

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

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

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

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

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