====== Проверка отказоустойчивости zpool ======
После завершения установки можно проверить как работает отказоустойчивость. Давайте посмотрим статус пула, когда все в порядке и работают оба диска:
# zpool status -v
pool: zroot
state: ONLINE
scan: none requested
config:
NAME STATE READ WRITE CKSUM
zroot ONLINE 0 0 0
mirror-0 ONLINE 0 0 0
da0p3 ONLINE 0 0 0
da1p3 ONLINE 0 0 0
errors: No known data errors
Оба диска на месте. Теперь выключим сервер и вынем один из дисков. Посмотрим, как поведет себя сервер.
# zpool status -v
pool: zroot
state: DEGRADED
status: One or more devices could not be opened. Sufficient replicas exist for
the pool to continue functioning in a degraded state.
action: Attach the missing device and online it using 'zpool online'.
see: http://illumos.org/msg/ZFS-8000-2Q
scan: none requested
config:
NAME STATE READ WRITE CKSUM
zroot DEGRADED 0 0 0
mirror-0 DEGRADED 0 0 0
2081140553640658652 UNAVAIL 0 0 0 was /dev/da0p3
da0p3 ONLINE 0 0 0
errors: No known data errors
Как видно, диска нет, но система благополучно загрузилась и нормально работает. Если мы вернем этот же диск на место и перезагрузимся, то все станет в порядке, никаких лишних движений делать не надо. Но представим, что у нас диск вышел из строя и нам надо установить новый. Вставляем новый чистый диск в сервер и загружаемся. Новый диск получил то же название, что и вышедший из строя — /dev/da0. Разделов на нем нет.
Первым делом отправляем сбойный диск в offline:
# zpool offline zroot da0p3
Пул теперь в таком состоянии:
# zpool status -v
pool: zroot
state: DEGRADED
status: One or more devices has been taken offline by the administrator.
Sufficient replicas exist for the pool to continue functioning in a
degraded state.
action: Online the device using 'zpool online' or replace the device with
'zpool replace'.
scan: none requested
config:
NAME STATE READ WRITE CKSUM
zroot DEGRADED 0 0 0
mirror-0 DEGRADED 0 0 0
2081140553640658652 OFFLINE 0 0 0 was /dev/da0p3
da1p3 ONLINE 0 0 0
errors: No known data errors
Скопируем таблицу разделов с живого диска на новый. Посмотрим для начала на нее:
# gpart show
=> 40 20971440 da1 GPT (10G)
40 1024 1 freebsd-boot (512K)
1064 984 - free - (492K)
2048 4194304 2 freebsd-swap (2.0G)
4196352 16773120 3 freebsd-zfs (8.0G)
20969472 2008 - free - (1.0M)
Создаем такую же таблицу на новом диске, скопировав ее со старого:
# gpart backup da1 > /root/da1.backup
# gpart restore da0 < /root/da1.backup
Смотрим, что получилось:
# gpart show
=> 40 20971440 da1 GPT (10G)
40 1024 1 freebsd-boot (512K)
1064 984 - free - (492K)
2048 4194304 2 freebsd-swap (2.0G)
4196352 16773120 3 freebsd-zfs (8.0G)
20969472 2008 - free - (1.0M)
=> 40 20971440 da0 GPT (10G)
40 1024 1 freebsd-boot (512K)
1064 984 - free - (492K)
2048 4194304 2 freebsd-swap (2.0G)
4196352 16773120 3 freebsd-zfs (8.0G)
20969472 2008 - free - (1.0M)
То, что надо. Запишем на новый диск загрузчик:
# gpart bootcode -b /boot/pmbr -p /boot/gptzfsboot -i 1 da0
partcode written to da0p1
bootcode written to da0
Говорим пулу, что мы меняем жесткий диск:
# zpool replace zroot /dev/da0p3
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 '/dev/da0p3'.
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 сам нам напомнил, чтобы мы не забыли про загрузчик. После замены диска быстро прошел resilver (синхронизация) и пул перешел в состояние ONLINE
# zpool status -v
pool: zroot
state: ONLINE
scan: resilvered 532M in 0h0m with 0 errors on Sat Oct 15 01:29:49 2016
config:
NAME STATE READ WRITE CKSUM
zroot ONLINE 0 0 0
mirror-0 ONLINE 0 0 0
da0p3 ONLINE 0 0 0
da1p3 ONLINE 0 0 0
errors: No known data errors
При желании можно теперь вынуть старый диск и убедиться, что с нового система нормально загружается. Я это сделал и убедился.