zfs 單一裝置儲存池改為鏡映

標題有點難下 XD

前言及環境:

假設已經有一台 FreeBSD 預設將 root 安裝至 zfs 檔案系統,但一開始並沒有設定 mirror 或是 raidz ,之後想要將系統換硬碟,將原本的舊硬碟資料轉移出來,並設定 mirror (換句話說就是:一開始裝系統時沒錢買多餘硬碟,只好將就著用,等有經費時,可以買兩顆硬碟和新主機時,要怎麼比較無痛把舊機器舊硬碟上的資料整個放在新的系統上,並設定比較安全的儲存環境)因為網路上有許多是一開始就設定好 zfs mirror 或 raidz 取代壞掉的硬碟教學,所以本篇主要是著重在怎麼從無冗餘硬碟的狀況下,再增加 zfs mirror 裝置。

系統: FreeBSD 10.1
舊主機之硬碟: 代號假設為 A
新主機的兩顆硬碟: M0, M1

方法:

如果照原本 UFS / MBR 的方式,就是先將新的硬碟裝上去,分割好並格式化,掛載成 /mnt/root,用 dd 或 dump | restore 的方式將資料倒回去。等資料都倒完後再將舊硬碟取下,並設定成新硬碟開機,步驟不難但是很麻煩,所以這篇教學試著使用 zfs zpool resilvering(「銀鹽刻版複製」,方式類似 RAID 的重建[rebuild])的概念來置換舊硬碟資料,用新硬碟開機,並將原本無 mirror 的 zpool 增加磁碟鏡映群組,新增硬碟並重建資料。做法的概念圖如下:

實作:

  1. 先將新的硬碟裝上去,並用 gpart 分割磁區(partition),設定好 FreeBSD 開機磁區、SWAP等
    假設這顆新的硬碟 M1 的裝置節點是 /dev/ada1 ,以下指令請記得都用 sudo 或 root 身分執行
    # 建立 GPT 磁區
    
    gpart create -s gpt ada1
    # 新增 freebsd 開機磁區為,大小為 512 KB,標籤(-l)為 gptboot
    
    gpart add -t freebsd-boot -l gptboot  -s 512K ada1
    # 新增 swap 磁區,大小為 8192 MB
    
    gpart add -t freebsd-swap -l gptswap -s 8192M ada1
    # 剩下的全部分割給 freebsd zfs 磁區,標籤為 zfs1
    
    gpart add -t freebsd-zfs -l zfs1 ada1
    # 設定下次開機的硬碟為本顆硬碟的第一個分割區(ada1,參數 i)
    
    gpart bootcode -b /boot/pmbr -p /boot/gptzfsboot -i 1 ada1
    
    此時,可以到 /dev/gpt 目錄下確認是否有 zfs1 ,若有的話就可以繼續次步驟
  2. 將新硬碟 M1 的 zfs 磁區加入 zpool,並設定成 mirror

    zpool attach zroot gpt/zfs0 gpt/zfs1
    

    使用 zpool status 來確認,如下圖,此時 gpt/zfs1 顯示 resilvering,可能需要一些時間處理(端看資料量大小)

  3. 將舊硬碟 (A) 離線
    這個步驟將舊硬碟先離線,等待關機之後(不過理論上 SATA 硬碟可以熱拔插)換上另一顆新硬碟:

    zpool offline zroot gpt/zfs0
    

    zpool status 確認時,原本 gpt/zfs0 標籤會變成一串數字,STATE 則會顯示 OFFLINE

  4. 移除舊硬碟,安裝另外一顆新硬碟(M2),並重複步驟 1 的 gpart

    換硬碟時,記得不要拿錯 XD 下面的步驟中,在重開機後,原本的硬碟 M1 變成 ada0,而新的 M2 則是 ada1,所以在分割磁區設定標籤時,將 freebsd-boot 改成 gptboot0,而 M2 上的新 zfs 磁區標籤則為 zfs0

    # 建立 GPT 磁區
    
    gpart create -s gpt ada1
    # 新增 freebsd 開機磁區為,大小為 512 KB,標籤(-l)為 gptboot
    
    gpart add -t freebsd-boot -l gptboot0  -s 512K ada1
    # 新增 swap 磁區,大小為 8192 MB
    
    gpart add -t freebsd-swap -l gptswap -s 8192M ada1
    # 剩下的全部分割給 freebsd zfs 磁區,標籤為 zfs0
    
    gpart add -t freebsd-zfs -l zfs0 ada1
    
  5. 使用 replace 更新磁碟資料

    離線的磁碟在 zpool 中會顯示一串數字,更新磁碟時記得複製這串數字,如下圖

    zpool replace zroot 9450223813957032699 gpt/zfs0
    


    接下來就是等這顆新磁碟自動 resilvering 資料即可
    psilotum@biodiv ~ $ zpool status
    pool: zroot
    state: ONLINE
    scan: resilvered 98.4G in 0h20m with 0 errors on Thu Feb 5 19:01:57 2015
    config:
    NAME          STATE     READ WRITE CKSUM
    zroot         ONLINE       0     0     0
      mirror-0    ONLINE       0     0     0
        gpt/zfs0  ONLINE       0     0     0
        gpt/zfs1  ONLINE       0     0     0
    

    errors: No known data errors


    參考資料

    https://www.freebsd.org/doc/handbook/zfs-zpool.html
    http://www.freebsdwiki.net/index.php/ZFS,_booting_from

Comments

comments powered by Disqus