집에서 NAS로 사용하던 FreeBSD 머신이 있는데, 이번에 12.0 Release가 나왔다 하여 업그레이드를 진행했다.

그런데 이 업그레이드를 완료한 후에 zpool 도 업그레이드 되었다기에 무심코 'zpool upgrade'를 실행했는데 boot code 업데이트에서 에러가 발생했다.


내용을 살펴보니 기존에 64k로도 충분했던 boot code 파티션이 100k로 늘어나 문제가 발생했던것.

우선 현재 상황을 먼저 정리해 봤다.


Upgrade FreeBSD to 12.0 Release

freebsd-update 툴을 이용해 12.0 으로 업그레이드는 어렵지않게 진행할 수 있었다(아래 URL 참조).
이 후 업데이트된 package 및 port를 통해 직접 컴파일해 설치한 package들도 모두 업데이트를 완료.
모든것이 정상적으로 업데이트가 완료되었다.
Root on ZFS 시스템을 사용하고 있던지라 zpool status 로 상태를 확인 했는데 아래와 같이 업그레이드가 필요하다는 메시지가 보인다.
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
zpool upgrade는 정상적으로 완료되었고 해당 zpool을 이용해 부팅하는 경우 boot code도 업그레이드 해주라는 메시지.
여기까지는 아무문제 없이 잘 질행되었으나, 이 boot code를 업그레이드 하면서 문제가 생겼다.

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를 완료할 수 있었다.

Posted by crane76
,