![挂载源 ZFS 文件系统](https://linux22.com/image/205490/%E6%8C%82%E8%BD%BD%E6%BA%90%20ZFS%20%E6%96%87%E4%BB%B6%E7%B3%BB%E7%BB%9F.png)
我正在尝试将 FreeBSD 安装克隆到新硬盘上,需要安装它,然后找到安装点才能继续克隆过程。
我想要克隆到的内部驱动器当前安装有 Windows 10 和我想要克隆的不太优化的 FreeBSD 安装。
我很高兴为 FreeBSD 使用当前的 UFS 分区方案。
我将从实时 FreeBSD USB 记忆棒启动,以便运行适当的命令。我遇到的问题是,我想要克隆的磁盘是使用 ZFS 分区的,我无法理解如何安装它以及如何找到安装点。该磁盘使用 USB-SATA 适配器连接到我的计算机。
答案1
我假设您的“源”安装纯粹是在 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.
请注意,参数是可选的。您可能不需要它们。明智的做法是从 U 盘启动来完成这项工作。从 U 盘启动后,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 磁盘首次尝试无法启动时进行故障排除。