집에서 NAS로 사용하던 FreeBSD 머신이 있는데, 이번에 12.0 Release가 나왔다 하여 업그레이드를 진행했다.
그런데 이 업그레이드를 완료한 후에 zpool 도 업그레이드 되었다기에 무심코 'zpool upgrade'를 실행했는데 boot code 업데이트에서 에러가 발생했다.
내용을 살펴보니 기존에 64k로도 충분했던 boot code 파티션이 100k로 늘어나 문제가 발생했던것.
우선 현재 상황을 먼저 정리해 봤다.
Upgrade FreeBSD to 12.0 Release
root@fbnas:~ # zpool status pool: NAS state: ONLINE status: Some supported features are not enabled on the pool. The pool can still be used, but some features are unavailable. action: Enable all features using 'zpool upgrade'. Once this is done, the pool may no longer be accessible by software that does not support the features. See zpool-features(7) for details. scan: resilvered 166G in 0 days 15:31:07 with 0 errors on Thu Jan 28 01:46:22 2016 config: NAME STATE READ WRITE CKSUM NAS ONLINE 0 0 0 raidz1-0 ONLINE 0 0 0 gpt/disk0 ONLINE 0 0 0 gpt/disk1 ONLINE 0 0 0 gpt/disk2 ONLINE 0 0 0 gpt/disk3 ONLINE 0 0 0 errors: No known data errors
Upgrade ZPool
pool에 몇가지 추가기능이 있으니 업그레이드를 진행하는게 좋겠다는 메시지.
바로 'zpool upgrade NAS'를 실행했다.
root@fbnas:~ # zpool upgrade NAS This system supports ZFS pool feature flags. Enabled the following features on 'NAS': spacemap_histogram enabled_txg hole_birth extensible_dataset embedded_data bookmarks filesystem_limits large_blocks large_dnode sha512 skein device_removal obsolete_counts zpool_checkpoint spacemap_v2 If you boot from pool 'NAS', don't forget to update boot code. Assuming you use GPT partitioning and da0 is your boot disk the following command will do it: gpart bootcode -b /boot/pmbr -p /boot/gptzfsboot -i 1 da0
root@fbnas:~ # gpart bootcode -b /boot/pmbr -p /boot/gptzfsboot -i 1 ada0 gpart: /dev/ada0p1: not enough space
boot code를 업데이트 하려 하는데 파티션에 공간이 모자르다고 실행이 안되는 것 이다.
파티션 정보와 boot 파일들의 크기를 확인 해 보니 파티션은 64k, 부팅파일은 100k 가 넘는 것 이었다.
root@fbnas:~ # gpart show => 34 3907029101 ada0 GPT (1.8T) 34 6 - free - (3.0K) 40 128 1 freebsd-boot (64K) 168 3907028960 2 freebsd-zfs (1.8T) 3907029128 7 - free - (3.5K) => 34 3907029101 ada1 GPT (1.8T) 34 6 - free - (3.0K) 40 128 1 freebsd-boot (64K) 168 3907028960 2 freebsd-zfs (1.8T) 3907029128 7 - free - (3.5K) => 34 3907029101 ada2 GPT (1.8T) 34 6 - free - (3.0K) 40 128 1 freebsd-boot (64K) 168 3907028960 2 freebsd-zfs (1.8T) 3907029128 7 - free - (3.5K) => 34 3907029101 ada3 GPT (1.8T) 34 6 - free - (3.0K) 40 128 1 freebsd-boot (64K) 168 3907028960 2 freebsd-zfs (1.8T) 3907029128 7 - free - (3.5K) root@fbnas:~ # ls -l /boot/*boot -r--r--r-- 1 root wheel 8192 12월 18 00:43 /boot/boot -r--r--r-- 1 root wheel 1188 12월 18 00:43 /boot/cdboot -r--r--r-- 1 root wheel 62810 12월 18 00:43 /boot/gptboot -r--r--r-- 1 root wheel 108162 12월 18 00:43 /boot/gptzfsboot -r--r--r-- 1 root wheel 14363 12월 18 00:43 /boot/isoboot -r--r--r-- 1 root wheel 423936 12월 18 00:44 /boot/pxeboot -r--r--r-- 1 root wheel 262656 12월 18 00:44 /boot/zfsboot
Change Boot partition size and resilvering
방법은 raidz1에서 디스크를 offline으로 전환 후 다시 파티션 한 후 replace 를 모든 디스크에 적용하는 과정이 필요하다.
우선 zpool에서 디스크를 offline으로 전환한다. 이렇게 offline으로 전환 한 후에 gpart 정보를 모두 삭제하고 gpt정보를 다시 생성해준다.
향후 또 이런 문제가 발생할지 몰라 boot 파티션을 1MB로 만드는것도 생각 했었으나 64k에서 512k로 늘리는것도 상당히 많은 양을 늘리는 것(8배)이라 생각해 그냥 대부분의 검색에서 사용되는 512k로 진행했다.
root@fbnas:~ # zpool offline NAS gpt/disk0 root@fbnas:~ # gpart destroy -F ada0 ada0 destroyed root@fbnas:~ # gpart create -s gpt ada0 ada0 created root@fbnas:~ # gpart add -s 512k -t freebsd-boot ada0 ada0p1 added root@fbnas:~ # gpart add -t freebsd-zfs -l disk0 ada0 ada0p2 added root@fbnas:~ # gpart show ada0 => 40 3907029088 ada0 GPT (1.8T) 40 1024 1 freebsd-boot (512K) 1064 3907028064 2 freebsd-zfs (1.8T) root@fbnas:~ # ls -l /dev/gpt/ total 0 crw-r----- 1 root operator 0x74 Dec 18 13:16 disk0 crw-r----- 1 root operator 0x72 Dec 18 09:41 disk1 crw-r----- 1 root operator 0x77 Dec 18 09:41 disk2 crw-r----- 1 root operator 0x7c Dec 18 09:41 disk3
아래와 같은 방식으로 첫번째 디스크(ada0)에 대해 적용했더니 두시간 조금 넘는 시간에 끝이났다.
얼마 안걸리네... 하면서 두번째 디스크(ada1)에 적용했더니... 이 두번째 디스크부터(ada1, ada2, ada3)는 약 50시간 이상 씩 걸리는 것.
결죽 8일 꽉 채워 진행되었다.
한가지 이상한 점은 아침부터 밤까지(대략 06시 ~ 23시)는 scan 및 resilvering 이 거의 진행되지 않고 있다가 새벽시간대(01시 ~ 05시)에 대부분의 진행이 완료된다.
낮시간 때에는 진행률이 54~55% 정도로 진행되다가 아침에 일어나서 확인해보면 완료되어있는 상황.
ada0 디스크를 제외하고 ada1, 2, 3 모두 진행 %는 다르지만 모두 비슷한 현상을 보였다.
물론 이 시간 동안 모든 서비스를 정지시키고 진행했다.
혹시모를 에러상황을 최대한 줄이고자... 가장 중요한 것은 데이터이니...
12.0으로 업그레이드 되면서 gpart가 바뀐것 인지 시작블럭을 지정하지 않아도 40번 블럭부터 시작되고, 앞뒤로 free space가 없어지면서 gpart show 의 내용이 훨씬 간결해 졌다.
root@fbnas:~ # zpool replace NAS /dev/gpt/disk0 Make sure to wait until resilver is done before rebooting. If you boot from pool 'NAS', you may need to update boot code on newly attached disk '/dev/gpt/disk0'. 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 root@fbnas:~ # zpool status pool: NAS state: DEGRADED 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 Tue Dec 18 13:17:54 2018 157G scanned at 701M/s, 35.2M issued at 158K/s, 2.52T total 0 resilvered, 0.00% done, no estimated completion time config: NAME STATE READ WRITE CKSUM NAS DEGRADED 0 0 0 raidz1-0 DEGRADED 0 0 0 replacing-0 OFFLINE 0 0 0 10067766450592206588 OFFLINE 0 0 0 was /dev/gpt/disk0/old gpt/disk0 ONLINE 0 0 0 gpt/disk1 ONLINE 0 0 0 gpt/disk2 ONLINE 0 0 0 gpt/disk3 ONLINE 0 0 0 errors: No known data errors root@fbnas:~ # zpool status -v pool: NAS state: ONLINE scan: resilvered 641G in 0 days 02:49:04 with 0 errors on Tue Dec 18 16:06:58 2018 config: NAME STATE READ WRITE CKSUM NAS ONLINE 0 0 0 raidz1-0 ONLINE 0 0 0 gpt/disk0 ONLINE 0 0 0 gpt/disk1 ONLINE 0 0 0 gpt/disk2 ONLINE 0 0 0 gpt/disk3 ONLINE 0 0 0 errors: No known data errors
Add boot code to boot partition
root@fbnas:~ # gpart bootcode -b /boot/pmbr -p /boot/gptzfsboot -i 1 ada0 partcode written to ada0p1 bootcode written to ada0 root@fbnas:~ # gpart bootcode -b /boot/pmbr -p /boot/gptzfsboot -i 1 ada1 partcode written to ada1p1 bootcode written to ada1 root@fbnas:~ # gpart bootcode -b /boot/pmbr -p /boot/gptzfsboot -i 1 ada2 partcode written to ada2p1 bootcode written to ada2 root@fbnas:~ # gpart bootcode -b /boot/pmbr -p /boot/gptzfsboot -i 1 ada3 partcode written to ada3p1 bootcode written to ada3
이렇게 진행 후 reboot 해 zpool upgrade를 완료할 수 있었다.