LINUX.ORG.RU

Задачка о трёх снапшотах

 


0

1

Требуется сделать систему безопасного обновления на основе снапшотов. Раньше делалось так: создавался снапшот текущей системы, выполнялся chroot, в chroot обновлялась система, потом корректировались fstab и конфиг загрузчика (вносился путь до обновлённого снапшота) и выполнялась перезагрузка в уже обновлённую систему. Но мне очень не нравятся постоянные редактирования fstab и конфига загрузчика.

Очевидное решение: оставлять в fstab и конфиг загрузчика текущий снапшот (скажем, «current»), все обновления выполнять на нём, а перед обновлениями делать снапшот текущего для подстраховки. Но мне очень не нравится делать обновления на текущей системе, потому что если обновление «тяжёлое» (например, обновляются кеды), то бывает, что полсистемы обновлено, а другая половина программ при запуске глючит или падает из-за этого.

В общем, задача такая: нужно сделать так, чтобы обновления проходили не в текущей системе, а в снапшотах с неё, но и чтобы не требовалось редактировать fstab и конфиг загрузчика.

Всякое начинание должно созреть, отлежаться. Через полгода я расскажу тебе решение.

anonymous
()
Ответ на: комментарий от Black_Roland

Вариант перейти на Fedora 18 с оффлайновыми обновлениями подойдет?

Не подойдёт.

ФС какая используется?

Btrfs.

Kindly_Cat
() автор топика
Ответ на: комментарий от Kindly_Cat

Можно не указывать параметр subvol при монтировании, если воспользоваться btrfs subvolume set-default. Эта команда указывает какой подраздел монтировать по умолчанию.

Алгоритм будет примерно следующий: примонтировать корень раздела (вместо подраздела по умолчанию); создать снапшот; chroot; обновление системы; btrfs subvolume set-default <ID_созданного_снапшота>.

Нужно будет повыкидывать все упоминания конкретного подраздела из fstab и загрузчика.

Чтобы примонтировать корень раздела нужно использовать параметр subvol=/ .

Black_Roland ★★★★
()
Ответ на: комментарий от Kindly_Cat

Покажу на примере, без примера я плохо объясняю :)

Есть раздел, в корне раздела есть два подраздела: __vol1 и __vol2. Если сделать mount, то в примонтированной директории мы их и увидим. Если сделать btrfs subvolume set-default для __vol2, то после mount (без параметров) в примонтированной директории мы увидим содержимое подраздела __vol2, т.е. доступ к корню раздела мы потеряем. Чтобы снова получить доступ к корню раздела, нужно делать mount -o subvol=/ /dev/<btrfs_раздел> <точка_монтирования>.
Получается можно создать новый подраздел и сделать его как бы разделом и тогда в загрузчике и fstab'е не нужно прописывать параметр subvol, т.к. монтирование без параметров будет происходить в дефолтный подраздел.
Текущий корень ФС так и останется без изменений до перезагрузки (перемонтирования).

Black_Roland ★★★★
()

Кстати у меня сейчас корень / смонтирован через set-default:

$ mount | grep " / "
/dev/sda3 on / type btrfs (rw,relatime,compress=lzo,ssd,discard,space_cache)
$ ls / | head                                              
bin
boot
core.4461
dev
etc
home
lib
lib64
lock
media
А утилита btrfs все равно использует истинный корень:
$ sudo btrfs subvolume list -p /
ID 256 parent 5 top level 5 path test-root
ID 264 parent 5 top level 5 path root
Только сегодня эту фишку узнал :)

Black_Roland ★★★★
()
Ответ на: комментарий от Kindly_Cat

Слушай, а что за «space_cache» в поциях?

Понятия не имею, оно само :) В гугле вот чего нашел:

Btrfs stores the free space data on-disk to make the caching of a block group much quicker. It's a persistent change and is safe to boot into old kernels.

И даже бенчмарк на похорониксе есть: http://www.phoronix.com/scan.php?page=article&item=btrfs_space_cache

Black_Roland ★★★★
()

Можно глупый вопрос? А почему бы не сделать в корневом каталоге подкаталог old_root и не сделать в него хардлинки всего рута (ну, кроме /dev /proc /sys и т. п.)? Это и будет бекап.

Kroz ★★★★★
()
Ответ на: комментарий от Kroz

Каким образом это будет бэкап? По хардлинкам тоже всё изменится.

Да и потом, хардлинк на каталог создать невозможно, насколько я помню.

Kindly_Cat
() автор топика
Ответ на: комментарий от Kindly_Cat

Каким образом это будет бэкап? По хардлинкам тоже всё изменится.

Если файл будет удаляться+создаваться новый, а не переименовываться/перезаписываться, то не изменится.

Да и потом, хардлинк на каталог создать невозможно, насколько я помню.

Да, но каталоги можно просто создавать: они-то место не занимают (если не придираться к деталям).

Kroz ★★★★★
()
Ответ на: комментарий от derlafff

Энтерпрайзный админ энтерпрайзного локалхоста, хочет своё аниме бекапить видимо

bhfq ★★★★★
()
Ответ на: комментарий от Kroz

Если файл будет удаляться+создаваться новый, а не переименовываться/перезаписываться, то не изменится.

Так, ладно, ну и что? Это всё равно не то же, что снапшот. Хотя бы по затратам на занимаемое место.

Да, но каталоги можно просто создавать: они-то место не занимают

Предлагаешь создавать дерево каталогов, а в них - линки на каждый файл? По-моему, это уже намного хуже снапшота по скорости.

Kindly_Cat
() автор топика
Ответ на: комментарий от Kindly_Cat

Это всё равно не то же, что снапшот.

Чем?

Хотя бы по затратам на занимаемое место.

Такое же, если не меньше.

Предлагаешь создавать дерево каталогов, а в них - линки на каждый файл? По-моему, это уже намного хуже снапшота по скорости.

У меня такая операция повешена в MC в меню. Делается скриптом строк 5. Выполняется мега быстро.

P. S. Я не навязываю, просто предлагаю обсудить решение.

Kroz ★★★★★
()
Последнее исправление: Kroz (всего исправлений: 2)
Ответ на: комментарий от Kroz

Сначала поясни: ты предлагаешь в каталоге old_root делать хардлинки на каталоги корня? Или наоборот? А обновления где накатываются?

Kindly_Cat
() автор топика
Ответ на: комментарий от Kroz

Хотя в принципе не важно. Там же по факту будет создаваться два разных файла. Даже если их содержимое совпадает на 99%. Чтобы не было дублирования, нужна дедупликация, а её в Btrfs нет.

Kindly_Cat
() автор топика
Ответ на: комментарий от Kindly_Cat

Сначала поясни: ты предлагаешь в каталоге old_root делать хардлинки на каталоги корня? Или наоборот?

Не важно, результат будет один.

А обновления где накатываются?

Как решишь. Я бы накатывал на корень. Если что-то не так - загружаешься с livecd (ну, это если совсем плохо) и переносишь содержимое old_root в / ; как угодно: копированием, rsync (мне кажется rsync лучше, так как будет определять хардлинки и не делать двойной работы).

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

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

Kroz ★★★★★
()
Ответ на: комментарий от Kroz

хардлинк - это указатель на тот же inode, то есть дедубликация на уровне файлов

Вот именно, что файлов. Поэтому если файлы отличаются на 99%, будет создано два разных файла, дублирующих друг друга на 99%.

В btrfs - сам бы хотел узнать, думал ты знаешь.

Мне кажется, там изменения на уровне блоков. Иначе смысла нет.

Kindly_Cat
() автор топика
Ответ на: комментарий от Kindly_Cat

В моей схеме я пока вижу одну проблему: «бекапные файлы» (в old_root) можно повредить если открыть их линк (в корне) для записи и туда что-то записать (а не удалить файл + записать новый пусть с таким же именем). Вряд ли при установке системы это происходит (ну, кроме логов но это не важно), но все равно риск остается.

Если честно, то я думал, что btrfs snapshot - это те же хардлинки, но без такого нюанса. Если это так - тогда это может быть достоинством. Если нет - мне кажется, что моя схема лучше.

Kroz ★★★★★
()
Ответ на: комментарий от Kindly_Cat

Поэтому если файлы отличаются на 99%, будет создано два разных файла, дублирующих друг друга на 99%.

Да. Но, как ты сказал, в btrfs дедубликации пока нет.

Kroz ★★★★★
()
Ответ на: комментарий от Kroz

Это не дедупликация, это снапшоты. Дедупликация покрывает всю ФС, не только снапшоты.

Kindly_Cat
() автор топика
Ответ на: комментарий от Kindly_Cat

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

Kroz ★★★★★
()
Ответ на: комментарий от Kindly_Cat

Может, i-rinat знает?

Нет, я не пользуюсь снапшотами, потому что не понимаю, как они устроены.

i-rinat ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.