Имеем FreeBSD 9.1 RELEASE amd64 установка которой производилась следующим скриптом:
#!/bin/sh umount -f /dev/md1 mdmfs -s 512M md1 /tmp sysctl kern.geom.debugflags=0x10 /bin/dd if=/dev/zero of=/dev/ada0 bs=1024k count=10 /bin/dd if=/dev/zero of=/dev/ada1 bs=1024k count=10 sleep 10 zpool create -f zroot mirror ada0 ada1 zpool set bootfs=zroot zroot zfs set checksum=fletcher4 zroot zfs set mountpoint=/mnt zroot zpool export zroot zpool import -o cachefile=/tmp/zpool.cache zroot zfs create zroot/usr zfs create zroot/usr/home zfs create zroot/var zfs create zroot/wwwroot zfs create zroot/nfsroot zfs create zroot/tmp zfs create zroot/usr/ports zfs create zroot/usr/ports/distfiles zfs create zroot/usr/ports/packages zfs create zroot/usr/src zfs create zroot/var/crash zfs create zroot/var/db zfs create zroot/var/db/mysql zfs create zroot/var/db/pkg zfs create zroot/var/empty zfs create zroot/var/log zfs create zroot/var/mail zfs create zroot/var/run zfs create zroot/var/tmp zfs create -V 4G -o org.freebsd:swap=on -o volblocksize=4K -o checksum=off zroot/swap chmod 1777 /mnt/tmp chmod 1777 /mnt/var/tmp cd /mnt ; ln -s usr/home home echo "install ..." sleep 10 cd /usr/freebsd-dist export DESTDIR=/mnt for file in base.txz lib32.txz kernel.txz doc.txz src.txz; do (cat $file | tar --unlink -xvpJf - -C ${DESTDIR:-/}); done echo "install ok" sleep 1 cp /tmp/zpool.cache /mnt/boot/zfs/zpool.cache echo 'zfs_enable="YES"' >> /mnt/etc/rc.conf echo 'zfs_load="YES"' >> /mnt/boot/loader.conf echo 'vfs.root.mountfrom="zfs:zroot"' >> /mnt/boot/loader.conf echo '#vm.kmem_size="512M"' >> /mnt/boot/loader.conf touch /mnt/etc/fstab zfs set readonly=on zroot/var/empty zfs umount -a zfs set mountpoint=legacy zroot zfs set mountpoint=/tmp zroot/tmp zfs set mountpoint=/usr zroot/usr zfs set mountpoint=/var zroot/var zfs set mountpoint=/wwwroot zroot/wwwroot zfs set mountpoint=/nfsroot zroot/nfsroot /bin/dd if=/boot/zfsboot of=/dev/ada0 count=1 /bin/dd if=/boot/zfsboot of=/dev/ada1 count=1 /bin/dd if=/boot/zfsboot of=/dev/ada0 skip=1 seek=1024 /bin/dd if=/boot/zfsboot of=/dev/ada1 skip=1 seek=1024
Поскольку ZFS устанавливался на сырые диски — все установилось с размером сектора 512 байт (ashift: 9).
ada0: <WDC WD1003FBYX-01Y7B1 01.01V02> ATA-8 SATA 2.x device ada0: 300.000MB/s transfers (SATA 2.x, UDMA5, PIO 8192bytes) ada0: 953869MB (1953525168 512 byte sectors: 16H 63S/T 16383C) ada1: <Hitachi HDS721010CLA332 JP4OA3MA> ATA-8 SATA 2.x device ada1: 300.000MB/s transfers (SATA 2.x, UDMA5, PIO 8192bytes) ada1: 953869MB (1953525168 512 byte sectors: 16H 63S/T 16383C)
# zdb | grep ashift ashift: 9
Поставил себе задачу перевести пул на использование 4К секторов (ashift: 12) и GPT меток с сохранением данных и минимальным временем простоя.
Удаляем второй диск из пула.
# zpool status pool: zroot state: ONLINE scan: none requested config: NAME STATE READ WRITE CKSUM zroot ONLINE 0 0 0 mirror-0 ONLINE 0 0 0 ada0 ONLINE 0 0 0 ada1 ONLINE 0 0 0 errors: No known data errors # zpool detach zroot ada1 # zpool status pool: zroot state: ONLINE scan: none requested config: NAME STATE READ WRITE CKSUM zroot ONLINE 0 0 0 ada0 ONLINE 0 0 0 errors: No known data errors
Стираем метаданные с удаленного из пула диска.
# zpool labelclear /dev/ada1
Создаем «выравненные» разделы, определяем метки, задаем «геометрию».
# gpart create -s GPT ada1 ada1 created # gpart add -b 40 -s 1024 -t freebsd-boot ada1 ada1p1 added # gpart add -t freebsd-zfs -l disk1 -a 4K ada1 ada1p2 added # gpart bootcode -b /boot/pmbr -p /boot/gptzfsboot -i 1 ada1 bootcode written to ada1 # gpart show => 34 20971453 ada1 GPT (10G) 34 6 - free - (3.0k) 40 1024 1 freebsd-boot (512k) 1064 20970423 2 freebsd-zfs (10G) # gnop create -S 4096 /dev/gpt/disk1
Cоздаем пул и определяем его свойства.
zpool create -m /mnt/stor stor /dev/gpt/disk1.nop zfs set checksum=fletcher4 stor
Удаляем файлы геометрии дисков.
zpool export stor gnop destroy /dev/gpt/disk1.nop zpool import -d /dev/gpt stor
Делаем снимок старого пула, рекурсивно со всеми дочерними файловыми системами.
# zfs snapshot -r zroot@20130723 # zfs list -t snapshot NAME USED AVAIL REFER MOUNTPOINT zroot@20130723 0 - 373M - zroot/nfsroot@20130723 0 - 31K - zroot/swap@20130723 0 - 16K - zroot/tmp@20130723 0 - 36K - zroot/usr@20130723 0 - 317M - zroot/usr/home@20130723 0 - 31K - zroot/usr/ports@20130723 0 - 33K - zroot/usr/ports/distfiles@20130723 0 - 31K - zroot/usr/ports/packages@20130723 0 - 31K - zroot/usr/src@20130723 0 - 710M - zroot/var@20130723 0 - 126K - zroot/var/crash@20130723 0 - 31.5K - zroot/var/db@20130723 0 - 95.5K - zroot/var/db/mysql@20130723 0 - 31K - zroot/var/db/pkg@20130723 0 - 31K - zroot/var/empty@20130723 0 - 31K - zroot/var/log@20130723 0 - 74.5K - zroot/var/mail@20130723 0 - 31K - zroot/var/run@20130723 0 - 45.5K - zroot/var/tmp@20130723 0 - 32K - zroot/wwwroot@20130723 0 - 31K -
Передаем данные со старого пула в новый.
zfs send -vR zroot@20130723 | zfs receive -vFd stor
Перезагружаем машину, грузимся с установочного диска — выходим в «Shell». Затираем старый пул zroot.
zpool labelclear -f /dev/ada0
Переименовываем пул stor в zroot.
zpool import -f -R /tmp/st stor zroot
Свойство cachefile у этого пула установлено в none. Это результат использования опции -R при импорте. Для успешной загрузки с этого пула необходимо обновить файл /boot/zfs/zpool.cache, который находится в корневой файловой системе пула — zroot. Но эта файловая система не смонтирована (у неё свойство mountpoint=none), поэтому нужно изменить её точку монтирования и обновить устаревший zpool.cache (в нём ещё содержится информация о старом пуле stor).
zfs umount -a zfs set mountpoint=/ zroot mount zpool set cachefile=/tmp/st/boot/zfs/zpool.cache zroot
Если же мы переименовываем пул не в старое имя — незабываем соответственно поправить loader.conf
mv /tmp/st/boot/loader.conf /tmp/st/boot/loader.conf.old echo 'zfs_load="YES"' >> /tmp/st/boot/loader.conf echo 'vfs.root.mountfrom="zfs:zroot"' >> /tmp/st/boot/loader.conf
Возвращаем значение свойства mountpoint корневой файловой системы. Перезагружаемся.
zfs umount -f -a zfs set mountpoint=legacy zroot
При перезагрузке выставляем в BIOS компьютера загрузку со второго диска.
После загрузки в системе выполняем разметку диска ada0 аналогично проделанной ранее с ada1
# gpart create -s GPT ada0 ada0 created # gpart add -b 40 -s 1024 -t freebsd-boot ada0 ada0p1 added # gpart add -t freebsd-zfs -l disk0 -a 4K ada0 ada0p2 added # gpart bootcode -b /boot/pmbr -p /boot/gptzfsboot -i 1 ada0 bootcode written to ada0 # gpart show => 34 20971453 ada0 GPT (10G) 34 6 - free - (3.0k) 40 1024 1 freebsd-boot (512k) 1064 20970423 2 freebsd-zfs (10G)
Смотрим что имеем, добавляем диск в пул, смотрим что получилось.
# zpool status -v pool: zroot state: ONLINE scan: none requested config: NAME STATE READ WRITE CKSUM zroot ONLINE 0 0 0 gpt/disk1 ONLINE 0 0 0 errors: No known data errors # zpool attach zroot gpt/disk1 gpt/disk0 # zpool status -v pool: zroot state: ONLINE status: One or more devices is currently being resilvered. The pool will continue to function, possibly in a degraded state. action: Wait for the resilver to complete. scan: resilver in progress since Thu Jul 25 01:32:58 2013 843M scanned out of 1.54G at 64.9M/s, 0h0m to go 843M resilvered, 53.37% done config: NAME STATE READ WRITE CKSUM zroot ONLINE 0 0 0 mirror-0 ONLINE 0 0 0 gpt/disk1 ONLINE 0 0 0 gpt/disk0 ONLINE 0 0 0 (resilvering) errors: No known data errors # zpool status -v
Дожидаемся окончания переноса данных.
# zpool status -v pool: zroot state: ONLINE scan: resilvered 1.54G in 0h0m with 0 errors on Thu Jul 25 01:33:21 2013 config: NAME STATE READ WRITE CKSUM zroot ONLINE 0 0 0 mirror-0 ONLINE 0 0 0 gpt/disk1 ONLINE 0 0 0 gpt/disk0 ONLINE 0 0 0 errors: No known data errors # zdb | grep ashift ashift: 12