Solaris zfs更換根池磁盤(Replace a Disk in the ZFS Root Pool)
某些時候,由於空間不足或是硬件故障等原因,我們需要更換啟動磁盤。
冗余池(mirrored pool)
在一個鏡像池裡面更遠硬盤相對簡單一些,只需要用replace命令直接更換硬盤即可。
# zpool offline rpool c1t0d0s0
# cfgadm -c unconfigure c1::dsk/c1t0d0
<Physically remove failed disk c1t0d0>
<Physically insert replacement disk c1t0d0>
# cfgadm -c configure c1::dsk/c1t0d0
# zpool replace rpool c1t0d0s0
# zpool online rpool c1t0d0s0
# zpool status rpool
<Let disk resilver before installing the boot blocks>
SPARC# installboot -F zfs /usr/platform/`uname -i`/lib/fs/zfs/bootblk /dev/rdsk/c1t0d0s0
x86# installgrub /boot/grub/stage1 /boot/grub/stage2 /dev/rdsk/c1t9d0s0
非冗余池
如果根池不是mirrored,那麼就需要先把新磁盤分區好,加入根池形成mirrored類型的池。
加入新盤並檢測
# devfsadm
分區並打標簽
# format -e c8t1d0
format> partition
SELECT ONE OF THE FOLLOWING:
1. Create a partition
...
partition> print
Current partition table (original):
Total disk cylinders available: 30398 + 2 (reserved cylinders)
Part Tag Flag Cylinders Size Blocks
0 root wm 1 - 30396 232.85GB (30396/0/0) 488311740
1 unassigned wu 0 0 (0/0/0) 0
2 backup wu 0 - 30396 232.85GB (30397/0/0) 488327805
3 unassigned wu 0 0 (0/0/0) 0
4 unassigned wu 0 0 (0/0/0) 0
5 unassigned wu 0 0 (0/0/0) 0
6 unassigned wu 0 0 (0/0/0) 0
7 unassigned wu 0 0 (0/0/0) 0
8 boot wu 0 - 0 7.84MB (1/0/0) 16065
9 unassigned wu 0 0 (0/0/0) 0
partition>quit
format> label
[0] SMI Label
[1] EFI Label
Specify Label type[0]: 0
Ready to label disk, continue? y
添加磁盤
現在把做好的新磁盤分區加入根池形成鏡像池,這一步裡數據的同步可能會花費比較長的時間
# zpool attach rpool c0d0s0 c0d2s0
Make sure to wait until resilver is done before rebooting.
# zpool status
pool: rpool
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 Wed Jul 24 15:39:51 2013
302M scanned out of 7.47G at 11.2M/s, 0h10m to go
269M resilvered, 3.95% done
config:
NAME STATE READ WRITE CKSUM
rpool ONLINE 0 0 0
mirror-0 ONLINE 0 0 0
c0d0s0 ONLINE 0 0 0
c0d2s0 ONLINE 0 0 0 (resilvering)
errors: No known data errors
安裝啟動塊
On a SPARC based system:
# installboot -F zfs /usr/platform/`uname -i`/lib/fs/zfs/bootblk /dev/rdsk/c1t9d0s0
On an x86 based system:
# installgrub /boot/grub/stage1 /boot/grub/stage2 /dev/rdsk/c1t9d0s0
驗證boot
首先查看boot path
# prtconf -vp|grep -i bootpath
bootpath: '/virtual-devices@100/channel-devices@200/disk@0:a'
可以推斷出新盤path的末尾是disk@2:a,然後啟動
{0} ok setenv boot-device /virtual-devices@100/channel-devices@200/disk@2:a
boot-device = /virtual-devices@100/channel-devices@200/disk@2:a
{0} ok printenv boot-device
boot-device = /virtual-devices@100/channel-devices@200/disk@2:a
ok boot /virtual-devices@100/channel-devices@200/disk@2:a
移除老磁盤
# zpool detach rpool c0d0s0
擴展池空間
由於之前的磁盤空間小於新盤,所以現在的空間是和之前一樣的,需要擴展一下。
# zpool set autoexpand=on rpool
至此為止,大功告成。