Freebsd

如何在 FreeBSD 中掛載 ZFS 卷以進行複製

  • May 5, 2022

我正在嘗試將 FreeBSD 安裝複製到新硬碟驅動器上,需要掛載它,然後找到掛載點才能繼續進行複製過程。

我要複製到的內部驅動器目前具有 Windows 10 安裝和我想要複製的不太優化的 FreeBSD 安裝。

我很高興為 FreeBSD 使用目前的 UFS 分區方案。

我將從一個實時的 FreeBSD USB 記憶棒啟動,以便執行適當的命令。我遇到的問題是我要從中複製的磁碟是使用 ZFS 分區的,我無法弄清楚如何掛載它以及如何找到掛載點。該磁碟使用 USB-SATA 適配器連接到我的電腦。

我將假設您的“源”安裝完全在 ZFS 上,並且直接從 ZFS 池引導。

由於您要在兩種不同的文件系統類型之間進行複製,因此您可能需要使用類似的工具rsync來完成此操作。您將在一個掛載點掛載源層次結構(您的 ZFS 池),並在不同的掛載點掛載目標層次結構(一個或多個 UFS 文件系統)。最後,您將使用rsync將源層次結構複製到目標。

從閱讀zpool手冊頁開始。 zpool有許多子命令,每個子命令都有自己的手冊頁。對於初學者,請注意以下zpool import命令:

zpool-import(8)
        Make disks containing ZFS storage pools available for use on the
        system.

並參考man zpool-import

zpool import [-D] [-d dir|device]…
        Lists pools available to import.

請注意,參數是可選的。您可能不需要它們。明智的做法是從 USB 記憶棒啟動來完成這項工作。從 USB 記憶棒啟動後,zpool import將顯示可供您使用的池。首先驗證您的源 ZFS 池,我將tank在本範例中引用它。

# zpool import
  pool: tank
    id: 11588110742206048524
 state: ONLINE
action: The pool can be imported using its name or numeric identifier.
config:

       tank                    ONLINE
         gpt/zfs-57SCK7S0FVLC  ONLINE
         gpt/zfs-57SCK7S1FVLC  ONLINE

掛載“外部”ZFS 池時要小心——與掛載它們的系統的操作沒有直接關係的池。很容易無意中將外部 ZFS 池或文件系統掛載到正在執行的系統文件系統的頂部,如果不重新啟動,該操作可能不可逆。

一旦您確定您的源 ZFS 池可供您使用,您就可以掛載源 (ZFS) 和目標 (UFS) 文件系統並開始了。

掛載源 ZFS 文件系統

再次來自man zpool-import

        -R root
                Sets the cachefile property to none and the altroot
                property to root.

zpool import -R /mnt tank允許您將池的整個 ZFS 層次結構tank掛載在不同的掛載點下,在本例中為/mnt. 將源池也保持為只讀可能是個好主意。命令

# zpool import -o readonly=on -R /mnt tank
# zfs list -r tank
# zfs mount

將以只讀模式掛載您的源池,/mnt然後列出存在的各個 ZFS 文件系統以及已掛載的文件系統。您可能會看到以下消息:

cannot import 'tank': pool was previously in use from another system.
Last accessed by <unknown> (hostid=0) at Tue Apr 19 03:29:13 2022
The pool can be imported, use 'zpool import -f' to import the pool.

如果發生這種情況,那麼正如它所說,只需將-f選項添加到您的zpool import命令中:

# zpool import -f -o readonly=on -R /mnt tank

這就是你的原始碼樹。

掛載目標文件系統

我將/mnt.new用作您的目標文件系統的掛載點,您說它可能是 UFS。請注意,如果您將使用非 ZFS 文件系統作為/mnt.new結構,則需要在您將使用的每個磁碟分區( 、 等)上執行“newfs /dev/ada0p1/dev/ada0p2。與往常一樣,請確保您知道哪個設備是哪個設備,並且確保它們是正確的。

使用 使文件系統保持原始狀態後newfs,掛載將成為您的/文件系統的分區,/mnt.new並創建任何目錄,作為您的 UFS 層次結構的下一級掛載點。然後掛載下一級磁碟分區,每個分區都掛載在正確的位置。例如,如果您的新 UFS 文件系統根目錄是 /dev/ada0p1,/usr在 /dev/ada0p2上,/usr/home在 /dev/ada0p3 上,那麼您需要:

mkdir /mnt.new
mount /dev/ada0p1 /mnt.new
mkdir /mnt.new/usr
mount /dev/ada0p2 /mnt.new/usr
mkdir /mnt.new/usr/home
mount /dev/ada0p3 /mnt.new/usr/home

請注意,在完成對/mnt.new掛載點的複製後,您同樣需要編輯/mnt.new/etc/fstab並確保它正確掛載包含文件系統的磁碟分區。

這是基本的 UFS 文件系統管理,所以我不會更詳細地介紹。

將您的源層次結構 Rsync 到目標

一旦您將源 ZFS 樹安裝在/mnt並安裝在目標 UFS 樹下,/mnt.new您就可以簡單地將文件從一個複製到另一個。 rsync是一個很好的工具。

# rsync -HAXav /mnt/ /mnt.new/

尾部的斜線/mnt/很重要,包含在/mnt.new/“團結一致”中。給定的命令將在複製時列出每個文件名。如果您不想看到該詳細資訊,請v從命令中省略 。

複製文件後,您仍然需要進行一些手動更改。如前所述,您需要檢查/mnt.new/etc/fstab並進行任何必要的更改,以確保您的 UFS 文件系統在新系統啟動時正確掛載。您還應該查看/mnt.new/etc/rc.conf以註釋掉類似的行zfs_enable='yes'以及類似的條目/mnt.new/boot/loader.conf

解除安裝源和目標層次結構並重新啟動

當您認為新系統已準備好嘗試時,請導出您的源 ZFS 池:

zpool export tank

並從以下位置解除安裝您的 UFS 設備/mnt.new

umount /mnt.new/usr/home
umount /mnt.new/usr
umount /mnt.new

現在您可以交叉手指並重新啟動到 UFS 驅動器。將 USB 記憶棒放在手邊,以便在您的 UFS 磁碟在第一次嘗試時無法啟動時進行故障排除。

引用自:https://unix.stackexchange.com/questions/701517