Использование клонов в ZFS: Откат системы
Имеется FreeBSD 8.0-BETA1 с корнем на ZFS. Есть желание обновить систему до FreeBSD 9.0-CURRENT.
# zpool list NAME SIZE USED AVAIL CAP HEALTH ALTROOT zroot 119G 29,1G 89,9G 24% ONLINE - # zfs list NAME USED AVAIL REFER MOUNTPOINT zroot 29,1G 85,9G 567M legacy zroot/distfiles 1,48G 85,9G 1,48G /usr/ports/distfiles zroot/home 17,2G 85,9G 3,04G /usr/home zroot/home/butcher 5,72G 85,9G 5,42G /usr/home/butcher zroot/local 2,87G 85,9G 731M /usr/local zroot/obj 2,39G 85,9G 1,20G /usr/obj zroot/ports 220M 85,9G 174M /usr/ports zroot/src 458M 85,9G 407M /usr/src zroot/tmp 2,85G 85,9G 2,85G /tmp zroot/usr 637M 85,9G 478M /usr zroot/var 227M 85,9G 284K /var zroot/var/crash 18,5K 85,9G 18,5K /var/crash zroot/var/db 222M 85,9G 135M /var/db zroot/var/log 1,08M 85,9G 400K /var/log zroot/var/tmp 3,01M 85,9G 2,80M /var/tmp
На всякий случай создан снимок состояния файловой системы на момент до обновления.
# zfs snapshot -r zroot@20090824
После этого выполняем обновление системы и приложений, установленных из портов. Теперь предположим, что обнаружена проблема и нужно проверить её наличие в 8.0-BETA1, либо откатить систему на это состояние (мне нужно было проверить). Для этого я воспользовался клонами в ZFS.
Клоны - это доступные для записи копии снимков. Они так же как и снимки изначально почти не занимают места на диске, их размер увеличивается с изменением данных. С клонами можно работать точно так же, как и с обычными файловыми системами, с них даже можно делать снимки (snapshot). И что наиболее интересно мне - с них можно загружаться и выполнять замену файловых систем клонами (promote).
Так как я обновил систему, то, естественно, это привело к изменению данных в корневом разделе, в /usr и /usr/local, а так же в /var/db, где хранятся данные об установленных приложениях из портов.
Поэтому мне нужно создать клоны файловых систем zroot, zroot/local, zroot/usr, zroot/var/db
; загрузиться с использованием этих клонов, проверить наличие обнаруженной проблемы в старой версии системы, и при желании сделать откат (т.е. заменить файловые системы их клонами).
Итак, создам клоны:
# zfs clone -o mountpoint=/mnt zroot@20090824 zroot/root20090824 # zfs clone -o mountpoint=/mnt/usr zroot/usr@20090824 zroot/usr20090824 # zfs clone -o mountpoint=/mnt/usr/local zroot/local@20090824 zroot/local20090824 # zfs clone -o mountpoint=/mnt/var/db zroot/var/db@20090824 zroot/var/db20090824
Теперь нужно: поправить /boot/loader.conf на новом корне, чтобы загрузчик знал какую файловую систему нужно монтировать; указать в свойствах пула новую загрузочную FS; сменить точки монтирования у новых и старых файловых систем. Итак:
# echo 'vfs.root.mountfrom="zfs:zroot/root20090824"' >> /mnt/boot/loader.conf # zfs umount zroot/var/db20090824 # zfs umount zroot/local20090824 # zfs umount zroot/usr20090824 # zfs umount zroot/root20090824
Для новой корневой файловой системы нужно установить точку монтирования legacy, чтобы она не монтировалась автоматически, а только при запросе ядра:
# zfs set mountpoint=legacy zroot/root20090824
Для остальных файловых систем как обычно:
# zfs set mountpoint=/usr zroot/usr20090824 # zfs set mountpoint=/usr/local zroot/local20090824 # zfs set mountpoint=/var/db zroot/var/db20090824
Для изменения точек монтирования текущих файловых систем лучше перейти в однопользовательский режим:
# init 1 # zfs umount -fa # zfs set mountpoint=/mnt/usr zroot/usr # zfs set mountpoint=/mnt/usr/local zroot/local # zfs set mountpoint=/mnt/var/db zroot/var/db
Изменим загрузочную файловую систему пула и можно перезагружаться:
# zpool set bootfs=zroot/root20090824 zroot # reboot
После перезагрузки у меня имеется:
# uname -srm FreeBSD 8.0-BETA1 i386 # zfs mount zroot/root20090824 / zroot/usr /mnt/usr zroot/local /mnt/usr/local zroot/var/db /mnt/var/db zroot/tmp /tmp zroot/usr20090824 /usr zroot/home /usr/home zroot/home/butcher /usr/home/butcher zroot/local20090824 /usr/local zroot/obj /usr/obj zroot/ports /usr/ports zroot/distfiles /usr/ports/distfiles zroot/src /usr/src zroot/var /var zroot/var/crash /var/crash zroot/var/db20090824 /var/db zroot/var/log /var/log zroot/var/tmp /var/tmp
Т.е. я сделал временный откат системы к состоянию до обновления, не потеряв текущей обновленной системы. Если захочется сохранить текущее состояние, я просто выполню:
# zfs promote zroot/root20090824 # zfs promote zroot/usr20090824 # zfs promote zroot/local20090824 # zfs promote zroot/var/db20090824
А старые удалю при помощи zfs destroy
, после чего я смогу переименовать длинные имена в старые при помощи команды zfs rename
.
Я же верну всё обратно. Для этого нужно перейти в однопользовательский режим, отмонтировать все файловые системы, сменить точки монтирования у старых файловых систем с /mnt обратно в корень, а клоны удалить при помощи команды zfs destroy
. Ну и в конце не забываем сменить свойство bootfs
у пула.