Использование клонов в ZFS: Откат системы

Материал из OpenWiki
Перейти к: навигация, поиск

Имеется 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 у пула.