Монтирование ZFS на запись в однопользовательском режиме.
mount -u /
Монтирование ZFS на запись в однопользовательском режиме.
mount -u /
При обновлении FreeBSD получаем ошибку:
Installing updates...chflags: ///var/empty: Read-only file system
Смотрим:
# zfs get readonly zroot/var/empty NAME PROPERTY VALUE SOURCE zroot/var/empty readonly on local
Решение:
# zfs set readonly=off zroot/var/empty
После обновления не забываем вернуть обратно:
# zfs set readonly=on zroot/var/empty
Решение подсмотрено здесь.
Имеем FreeBSD 9.2 RELEASE установленную в XenServer 6.2 — корневая файловая система ZFS. Задача установить xen-tools для полной оптимизации системы.
Исправляем файл:
/usr/src/sys/kern/subr_autoconf.c
Комментируем строку 136 и 145.
/* while (!TAILQ_EMPTY(&intr_config_hook_list)) { */ if (msleep(&intr_config_hook_list, &intr_config_hook_lock, 0, "conifhk", WARNING_INTERVAL_SECS * hz) == EWOULDBLOCK) { mtx_unlock(&intr_config_hook_lock); warned++; run_interrupt_driven_config_hooks_warning(warned); mtx_lock(&intr_config_hook_lock); } /* } */
Имеем 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 меток с сохранением данных и минимальным временем простоя.
Читать далее
Грузимся с загрузочного диска FreeBSD 9.0 RELEASE — выбираем shell.
Создаем разделы, записываем загрузчик.
gpart create -s gpt da0 gpart add -b 34 -s 94 -t freebsd-boot da0 gpart add -t freebsd-zfs -l disk0 da0 gpart bootcode -b /boot/pmbr -p /boot/gptzfsboot -i 1 da0
Создаем ZFS пул игнорируя предупреждения.
zpool create zroot /dev/gpt/disk0
Устанавливаем дополнительные параметры, указываем временную точку монтирования.
zpool set bootfs=zroot zroot zfs set checksum=fletcher4 zroot zfs set mountpoint=/mnt zroot
Экспортируем и импортируем пул.
zpool export zroot zpool import -o cachefile=/var/tmp/zpool.cache zroot
Создаем файловые системы на свой вкус и цвет.
zfs create zroot/usr zfs create zroot/usr/home zfs create zroot/var zfs create -o compression=on -o exec=on -o setuid=off zroot/tmp zfs create -o compression=lzjb -o setuid=off zroot/usr/ports zfs create -o compression=off -o exec=off -o setuid=off zroot/usr/ports/distfiles zfs create -o compression=off -o exec=off -o setuid=off zroot/usr/ports/packages zfs create -o compression=lzjb -o exec=off -o setuid=off zroot/usr/src zfs create -o compression=lzjb -o exec=off -o setuid=off zroot/var/crash zfs create -o exec=off -o setuid=off zroot/var/db zfs create -o compression=lzjb -o exec=on -o setuid=off zroot/var/db/pkg zfs create -o exec=off -o setuid=off zroot/var/empty zfs create -o compression=lzjb -o exec=off -o setuid=off zroot/var/log zfs create -o compression=gzip -o exec=off -o setuid=off zroot/var/mail zfs create -o exec=off -o setuid=off zroot/var/run zfs create -o compression=lzjb -o exec=on -o setuid=off zroot/var/tmp
Добавляем swap раздел.
zfs create -V 4G zroot/swap zfs set org.freebsd:swap=on zroot/swap zfs set checksum=off zroot/swap
Создаем линк, исправляем разрешения.
chmod 1777 /mnt/tmp cd /mnt ; ln -s usr/home home chmod 1777 /mnt/var/tmp
Установка FreeBSD.
sh cd /usr/freebsd-dist export DESTDIR=/mnt for file in base.txz lib32.txz kernel.txz doc.txz ports.txz src.txz; do (cat $file | tar --unlink -xpJf - -C ${DESTDIR:-/}); done
Копирование zpool.cache.
cp /var/tmp/zpool.cache /mnt/boot/zfs/zpool.cache
Создание rc.conf, loader.conf и пустого fstab.
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 touch /mnt/etc/fstab
Установка точек монтирования.
zfs set readonly=on zroot/var/empty zfs umount -af zfs set mountpoint=legacy zroot zfs set mountpoint=/tmp zroot/tmp zfs set mountpoint=/usr zroot/usr zfs set mountpoint=/var zroot/var
Перезагружаемся.
reboot
Дабы не ошибиться в наборе команд, можно сделать следующее — создать скрипт. Разместить его на любой машине куда имеется доступ оп ssh.
Настраиваем сетевой интерфейс.
ifconfig em0 inet 192.168.0.2 netmask 255.255.255.0 up
Выполняем скрипт:
ssh user@192.168.0.1 'cat zfs.sh' | sh
Имеем FreeBSD 9.0 RELEASE установленную в в качестве гостевой операционной системы с VMWare vSphere 5.0. Файловая система ZFS. Основной диск 100 Гб — маловат — задача перехать на диск большего объема — 200 Гб.
Мы уже рассматривали такой вариант — там мы просто средствами платформы виртуализации увеличивали объем диска. А если реальное железо? Пробуем тоже самое — но с заменой дисков.
Имеем:
# dmesg | grep da0 da0 at mpt0 bus 0 scbus2 target 0 lun 0 da0: <VMware Virtual disk 1.0> Fixed Direct Access SCSI-2 device da0: 320.000MB/s transfers (160.000MHz, offset 127, 16bit) da0: Command Queueing enabled da0: 102400MB (209715200 512 byte sectors: 255H 63S/T 13054C) # gpart show => 34 209715133 da0 GPT (100G) 34 94 1 freebsd-boot (47k) 128 209715039 2 freebsd-zfs (100G) # zpool status -v pool: zroot state: ONLINE scan: none requested config: NAME STATE READ WRITE CKSUM zroot ONLINE 0 0 0 da0p2 ONLINE 0 0 0 errors: No known data errors
Идем VMWare vShere Client выбираем Inventory — Virtual Machine — Edit Settings. Закладка Hardware — кнопка Add. Добавляем еще один жесткий диск объемом 200 Гб. Тут же получаем:
# tail /var/log/messages | grep da1 kernel: da1 at mpt0 bus 0 scbus2 target 1 lun 0 kernel: da1: <VMware Virtual disk 1.0> Fixed Direct Access SCSI-2 device kernel: da1: 320.000MB/s transfers (160.000MHz, offset 127, 16bit) kernel: da1: Command Queueing enabled kernel: da1: 204800MB (419430400 512 byte sectors: 255H 63S/T 26108C)
Размечаем новый диск с помощью gpart.
# gpart create -s gpt da1 da1 created # gpart add -b 34 -s 94 -t freebsd-boot da1 da1p1 added # gpart add -t freebsd-zfs -l disk0 da1 da1p2 added # gpart bootcode -b /boot/pmbr -p /boot/gptzfsboot -i 1 da1 bootcode written to da1
Смотрим что получилось.
# gpart show => 34 209715133 da0 GPT (100G) 34 94 1 freebsd-boot (47k) 128 209715039 2 freebsd-zfs (100G) => 34 419430333 da1 GPT (200G) 34 94 1 freebsd-boot (47k) 128 419430239 2 freebsd-zfs (200G)
Смотрим состояние переменной autoexpand нашего пула zroot.
# zpool get autoexpand zroot NAME PROPERTY VALUE SOURCE zroot autoexpand off default
Разрешаем автоувеличение пула.
# zpool set autoexpand=on zroot # zpool get autoexpand zroot NAME PROPERTY VALUE SOURCE zroot autoexpand on local
Присоединяем новый диск в массив.
# zpool attach zroot da0p2 da1p2 Make sure to wait until resilver is done before rebooting. If you boot from pool 'zroot', you may need to update boot code on newly attached disk 'da1p2'. Assuming you use GPT partitioning and 'da0' is your new boot disk you may use the following command: gpart bootcode -b /boot/pmbr -p /boot/gptzfsboot -i 1 da0
Смотрим что получилось.
# 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 Mon Dec 3 10:08:52 2012 1.40G scanned out of 3.14G at 23.4M/s, 0h1m to go 1.40G resilvered, 44.48% done config: NAME STATE READ WRITE CKSUM zroot ONLINE 0 0 0 mirror-0 ONLINE 0 0 0 da0p2 ONLINE 0 0 0 da1p2 ONLINE 0 0 0 (resilvering) errors: No known data errors
Идет перенос данных (ресилвер). Хоть мы и записывали загрузчик на новый диск в самом начале — но раз просит — обновим его везде, эту операцию можно производить прямо во время переноса данных.
# gpart bootcode -b /boot/pmbr -p /boot/gptzfsboot -i 1 da0 bootcode written to da0 # gpart bootcode -b /boot/pmbr -p /boot/gptzfsboot -i 1 da1 bootcode written to da1
Перенос данных проходит быстро. На моем оборудовании 3 Гб данных было перенесено за 1 минуту.
# zpool status -v pool: zroot state: ONLINE scan: resilvered 3.14G in 0h1m with 0 errors on Mon Dec 3 10:10:47 2012 config: NAME STATE READ WRITE CKSUM zroot ONLINE 0 0 0 mirror-0 ONLINE 0 0 0 da0p2 ONLINE 0 0 0 da1p2 ONLINE 0 0 0 errors: No known data errors
Удаляем старый диск из пула.
# zpool detach zroot da0p2
Смотрим что получилось.
# zpool status -v pool: zroot state: ONLINE scan: resilvered 3.14G in 0h1m with 0 errors on Mon Dec 3 10:10:47 2012 config: NAME STATE READ WRITE CKSUM zroot ONLINE 0 0 0 da1p2 ONLINE 0 0 0 errors: No known data errors # df -h zroot Filesystem Size Used Avail Capacity Mounted on zroot 189G 350M 189G 0% /
Возвращаем значения по умолчанию.
# zpool set autoexpand=off zroot # zpool get autoexpand zroot NAME PROPERTY VALUE SOURCE zroot autoexpand off default
Удаляем старый диск.
# tail /var/log/messages kernel: mpt0: Rescan Port: 0 kernel: (da0:mpt0:0:0:0): lost device - 0 outstanding kernel: (da0:mpt0:0:0:0): removing device entry # gpart show => 34 419430333 da1 GPT (200G) 34 94 1 freebsd-boot (47k) 128 419430239 2 freebsd-zfs (200G) # zpool status -v pool: zroot state: ONLINE scan: resilvered 3.14G in 0h1m with 0 errors on Mon Dec 3 10:10:47 2012 config: NAME STATE READ WRITE CKSUM zroot ONLINE 0 0 0 da1p2 ONLINE 0 0 0 errors: No known data errors
Ну и для очистки совести контрольная перезагрузка.
# gpart show => 34 419430333 da0 GPT (200G) 34 94 1 freebsd-boot (47k) 128 419430239 2 freebsd-zfs (200G) # zpool status -v pool: zroot state: ONLINE scan: resilvered 3.14G in 0h1m with 0 errors on Mon Dec 3 10:10:47 2012 config: NAME STATE READ WRITE CKSUM zroot ONLINE 0 0 0 da0p2 ONLINE 0 0 0 errors: No known data errors # df -h zroot Filesystem Size Used Avail Capacity Mounted on zroot 189G 350M 189G 0% /
Данный способ подходит для любого типа реального железа — более того, если у вас оборудование позволяет менять жесткие диски на горячую — мы можем произвести данную операцию без остановки обслуживания.
Имеем FreeBSD 9.0 RELEASE установленную в качестве гостевой ОС в VMWare vSphere 5.0. Корневой раздел в ZFS (swap тоже на ZFS). Ситуация — пожалели место — места стало нехватать.
# gpart show => 34 209715133 da0 GPT (100G) 34 94 1 freebsd-boot (47k) 128 209715039 2 freebsd-zfs (100G)
Увеличиваем размер корневого радела. Для этого в свойствах виртуальной машины просто вводим новый размер диска. Не мелочимся — добавим еще 100 Гб. Смотрим.
# camcontrol readcap da0 -h Device Size: 200 G, Block Length: 512 bytes # gpart show => 34 209715133 da0 GPT (100G) 34 94 1 freebsd-boot (47k) 128 209715039 2 freebsd-zfs (100G)
Не нашел способа заставить на горячую gpart увидеть измененный размер диска.
Перезагружаемся. Смотрим.
# gpart show => 34 209715133 da0 GPT (200G) [CORRUPT] 34 94 1 freebsd-boot (47k) 128 209715039 2 freebsd-zfs (100G)
Наш диск по мнению gpart поврежден. Исправляем. Смотрим что получилось.
# gpart recover da0 da0 recovered # gpart show => 34 419430333 da0 GPT (200G) 34 94 1 freebsd-boot (47k) 128 209715039 2 freebsd-zfs (100G) 209715167 209715200 - free - (100G)
Все отлично — система добавленные 100 Гб видит. Смотрим статус ZFS.
freebsd# zpool status -v pool: zroot state: ONLINE scan: none requested config: NAME STATE READ WRITE CKSUM zroot ONLINE 0 0 0 da0p2 ONLINE 0 0 0 errors: No known data errors # zfs list zroot NAME USED AVAIL REFER MOUNTPOINT zroot 7.26G 90.7G 350M /
Делаем resize раздела с помощью gpart.
# gpart show => 34 419430333 da0 GPT (200G) 34 94 1 freebsd-boot (47k) 128 209715039 2 freebsd-zfs (100G) 209715167 209715200 - free - (100G) # gpart resize -i 2 da0 gpart: Device busy freebsd# sysctl kern.geom.debugflags=16 kern.geom.debugflags: 0 -> 16 freebsd# gpart resize -i 2 da0 da0p2 resized # gpart show => 34 419430333 da0 GPT (200G) 34 94 1 freebsd-boot (47k) 128 419430239 2 freebsd-zfs (200G) # sysctl kern.geom.debugflags=0 kern.geom.debugflags: 16 -> 0
Разрешаем авторасширение ZFS, по умолчанию выключено.
# zpool set autoexpand=on zroot
Смотрим состояние ZFS.
# zfs list zroot NAME USED AVAIL REFER MOUNTPOINT zroot 7.26G 93G 350M / # zpool status -v pool: zroot state: ONLINE scan: none requested config: NAME STATE READ WRITE CKSUM zroot ONLINE 0 0 0 da0p2 ONLINE 0 0 0 errors: No known data errors
Отдаем команду ZFS использовать все доступное пространство — ключик -e.
# zpool online -e zroot da0p2
Смотрим что получилось.
# zfs list zroot NAME USED AVAIL REFER MOUNTPOINT zroot 7.26G 189G 350M / # zpool status -v pool: zroot state: ONLINE scan: none requested config: NAME STATE READ WRITE CKSUM zroot ONLINE 0 0 0 da0p2 ONLINE 0 0 0 errors: No known data errors
Задача установить FreeBSD 9.0 RELEASE используя в качестве корневой файловой системы ZFS.
Грузимся с загрузочного CD или DVD — в программе установки выбираем выход в shell.
Создаем необходимые разделы, записываем загрузчик.
gpart create -s gpt da0 gpart add -b 34 -s 94 -t freebsd-boot da0 gpart add -t freebsd-zfs -l disk0 da0 gpart bootcode -b /boot/pmbr -p /boot/gptzfsboot -i 1 da0
Создаем пул с оптимизацией под размер сектора 4К.
gnop create -S 4096 /dev/gpt/disk0 zpool create -o altroot=/mnt -o cachefile=/var/tmp/zpool.cache zroot /dev/gpt/disk0.nop zpool export zroot gnop destroy /dev/gpt/disk0.nop zpool import -o altroot=/mnt -o cachefile=/var/tmp/zpool.cache zroot
Установка дополнительных параметров.
zpool set bootfs=zroot zroot zfs set checksum=fletcher4 zroot
Создаем файловые системы на свой вкус и цвет.
zfs create zroot/usr zfs create zroot/usr/home zfs create zroot/var zfs create -o compression=on -o exec=on -o setuid=off zroot/tmp zfs create -o compression=lzjb -o setuid=off zroot/usr/ports zfs create -o compression=off -o exec=off -o setuid=off zroot/usr/ports/distfiles zfs create -o compression=off -o exec=off -o setuid=off zroot/usr/ports/packages zfs create -o compression=lzjb -o exec=off -o setuid=off zroot/usr/src zfs create -o compression=lzjb -o exec=off -o setuid=off zroot/var/crash zfs create -o exec=off -o setuid=off zroot/var/db zfs create -o compression=lzjb -o exec=on -o setuid=off zroot/var/db/pkg zfs create -o exec=off -o setuid=off zroot/var/empty zfs create -o compression=lzjb -o exec=off -o setuid=off zroot/var/log zfs create -o compression=gzip -o exec=off -o setuid=off zroot/var/mail zfs create -o exec=off -o setuid=off zroot/var/run zfs create -o compression=lzjb -o exec=on -o setuid=off zroot/var/tmp
Создаем swap раздел в 4 Гб.
zfs create -V 4G zroot/swap zfs set org.freebsd:swap=on zroot/swap zfs set checksum=off zroot/swap
Создаем линк на /home, исправляем разрешения.
chmod 1777 /mnt/tmp cd /mnt ; ln -s usr/home home chmod 1777 /mnt/var/tmp
Собственно установка FreeBSD.
sh cd /usr/freebsd-dist export DESTDIR=/mnt for file in base.txz lib32.txz kernel.txz doc.txz ports.txz src.txz; do (cat $file | tar --unlink -xpJf - -C ${DESTDIR:-/}); done
Копируем zpool.cache. Ключевой момент.
cp /var/tmp/zpool.cache /mnt/boot/zfs/zpool.cache
Устанавливаем дополнительные параметры в файл loader.conf и создаем пустой файл fstab.
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
Перезагружаемся.
reboot
Дабы не ошибиться в наборе команд, можно сделать следующее — создать скрипт. Разместить его на любой машине куда имеется доступ оп ssh.
Настраиваем сетевой интерфейс.
ifconfig em0 inet 192.168.0.2 netmask 255.255.255.0 up
Выполняем скрипт:
ssh user@192.168.0.1 'cat zfs.sh' | sh