Перевод ZFS mirror-0 с 512 байт сектора на 4K (ashift: 9 — ashift: 12).

Имеем 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

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Этот сайт использует Akismet для борьбы со спамом. Узнайте как обрабатываются ваши данные комментариев.