August 21, 2022

FreeBSD Transfer to new PC with NVME

這篇將提到如何把 FreeBSD 從舊 PC 轉移到新 PC,以及如何從 SATA 硬碟轉移到 NVME SSD。

轉移的目標是 ASUS PN41。 

另外也會提一下這幾年的使用心得。不想看的可以先跳過。

其實之前就想寫這篇。偷懶的結果就是昨天多花了不少時間搞。

原本我在各長居地都有架設個小 server,順便當對外防火牆。反正 loading 不會高到哪,找個普普機器就好,其實蠻方便的。

最早是自組的,通常就是淘汰的舊電腦,或是隨便買個便宜板子和便宜 CPU 上。後來經濟狀況好一點覺得這樣子太醜了,用久了便成一團灰,所以就改買便宜 PC。於是幾年前開始噵入ASUS VM60。最近覺得時間到了 (從 2014 用到今年吧?),追求成本更便宜又換成 ASUS PN41。

VM60一路上用來其實算是穩定,唯一也最常遇到的問題就是風扇不轉罷工。但是處理方式也很簡單,就是拆下滴針車油。後幾年大概就是大約一年左右要滴一次。其實本來是想換風扇,但是實在找不到便宜料就打消念頭了。

最近開始換成 ASUS PN41,有一方面也是覺得做這動作很累。但更大部分是 PN41 更適合我目前的使用情境。低工作瓦數 (Pentium N6005 TDP 10W),具備 NVME 和 SATA,可自行擴充的 RAM 插槽。

我用的版本是 Pentium N6005 CPU 的乞丐版。從中國買的,價錢大約都是折合台幣6,000出頭。不包含 RAM、硬碟甚至連無線網卡都沒有。畢竟這些我都有汰換的可以用。

前話聊完,再來講重點。

主機轉移的概念很簡單,就是

1. 把舊主機斷網

2. 舊主機裝上新 NVME SSD

3. 然後把資料都複製上 NVME SSD 後

4. 修改一下新 NVME SSD 上的/etc/fstab 讓他換主機能 mount 正確的 partitions。

5. 拿到新主機裝上,插網路線後開機。收工!

簡單幾個步驟。實際上有些魔鬼 (?) 細節。

步驟 0For PN41 ONLY! 先 pkg install realtek-re-kmod。為啥要先安裝 realtek-re-kmod 這個 package?這後面會講。另外這個步驟兩台主機都是 amd64 架構。如果是 x86 32 轉上來,我沒把握可以這樣搞。

步驟 1 是為了預防複製到一半又收到 mail 之類導致備份不完整。這個步驟的做法很簡單,就是直接拔掉網路線。

步驟 2 其實也還好。舊主機不支援 NVME,所以就是拿 NVME SSD + 外接盒接上。舊主機是 MBR,新主機我打算用 GPT。還有 PN41 只能用 EFI 方式開機,所以也不得不弄 GPT 搞 EFI

我原本用的分區方式是 / 跟 /usr 兩個分區。所以先在 NVME SSD (這邊變成USB 磁碟) 上建立 GPT。

因為我用的 NVME SSD 也是汰換的 (以前買筆電隨機的 256G NVME SSD),所以

#確定 NVME SSD 的 dev 名稱。在我的例子是 /dev/da0,操作上就用 da0
gpart show
# 先砍掉原本的
gpart destroy -F da0
# 建立新的
gpart create -s GPT da0
# boot partition
gpart add -b 40 -s 128 -t freebsd-boot da0
# EFI partition
gpart add -s 81752 -t efi da0
# UFS root, / 。這裡 -l 代表的是 label。-s 代表大小,沒設定會用光剩下的
gpart add -s 68G -t freebsd-ufs -l root da0
gpart add -t freebsd-ufs -l usr da0


#稍微檢視一下
gpart show -l da0


應該會看到
=>       40  500118112   da0  GPT     (238G)
         40        128     1  (null)  (64K)
        168      81752     2  (null)  (40M)
      81920  142606336     3  root    (68G)
  142688256  357429896     4  usr     (170G)

再來設定 EFI boot
gpart bootcode -b /boot/pmbr -p /boot/gptboot -i 1 da0
newfs_msdos -F 32 -c 1 /dev/da0p2
mount -t msdosfs /dev/da0p2 /mnt
mkdir -p /mnt/EFI/BOOT
cp /boot/loader.efi /mnt/EFI/BOOT/BOOTx64.efi
umount /mnt
# -i 3 代表 index 3。對應到前面 gpart show 顯示的。我們想弄的是 root
gpart set -a bootme -i 3 da0

弄好應該會看到
=>       40  500118112   da0  GPT     (238G)
         40        128     1  (null)  (64K)
        168      81752     2  (null)  (40M)
      81920  142606336     3  root [bootme] (68G)
  142688256  357429896     4  usr     (170G)

這樣就簡單搞好。再來就是把 UFS 弄成想要的形狀
# da0pX  X會對應到前面建立的 index。我們要弄全部的 UFS
newfs -njtEU /dev/da0p3
tunefs -a enable /dev/da0p3
newfs -njtEU /dev/da0p4
tunefs -a enable /dev/da0p4
#再來 mount
mount /dev/da0p3 /mnt
#建立 usr 掛載點
mkdir /mnt/usr
#建立下面三個目錄,因為之後不複製這三個
mkdir /mnt/proc
mkdir /mnt/dev
mkdir /mnt/mnt
#現學現賣 XD 用 /dev/da0p3 也可以
mount /dev/gpt/root /mnt
mount /dev/gpt/usr /mnt/usr

步驟 3 不難。我們利用 tar 就能完成。有些檔案特意避開 (例如各 partition 的 .sujournal)
tar -C / -cf - --exclude="./mnt" --exclude="./proc" --exclude="./dev" --exclude="./.sujournal" --exclude="./usr/.sujournal" .|tar -xf - -C /mnt

可能會有些錯誤。大部分就是檔案編碼問題。可以看看無大礙。沒有就不用特意管他。

步驟4 把原本的 partiton dev 名稱改掉。編輯 /mnt/etc/fstab
/ 改成用 /dev/gpt/root
/usr 改成用 /dev/gpt/usr

改好的 /mnt/etc/fstab 看起來應該會像這樣
# Device        Mountpoint      FStype  Options Dump    Pass#
/dev/gpt/root   /               ufs     rw      2       2
/dev/gpt/usr    /usr            ufs     rw      2       2
proc    /proc           procfs  rw      0       0

因為用的是 PN41,要順便編輯一下 /mnt/boot/loader.conf,加上
if_re_load="YES"
if_re_name="/boot/modules/if_re.ko"

弄好後 umount,再關機或是拔外接盒
umount /mnt/usr
umount /mnt

步驟5 真的把 NVME SSD 裝上 PN41 後就可以跑了。 PN41 需要 步驟0 是因為 PN41  用了新的 realtek 網卡,需要更新 driver。然後需要編輯 /boot/loader.conf 讓新 driver 替代自帶的。

大致上就這樣。留個筆記給自己。發文不附圖好像怪怪的,所以附上一張。