LFS分区(和FreeBSD一起Dualboot)
我组装 纳斯NASSE C246 ITX主板 的电脑,部署了 FreeBSD 系统来构建 FreeBSD机器学习 。但是,实践中遇到了一些挫折:
原本想 在bhyve中实现NVIDIA GPU passthrough ,但是NVIDIA显卡在 bhyve(BSD hypervisor) 中PCI passthru无法完成,这阻碍了我进一步的 Machine Learning 学习。由于我购买了2块 AMD Radeon Instinct MI50 ,所以准备继续尝试 在bhyve中实现AMD GPU passthrough 。
不过, NVIDIA GPU 是目前 Machine Learning 的主流硬件,我需要充分发挥所以的硬件来构建实验环境。所以,我考虑同时安装 LFS(Linux from scratch) ,构建一个 Dualboot 环境:
在 FreeBSD 和 Linux 之间无缝切换:
FreeBSD和LFS仅仅是底座,不影响上层的虚拟化:
磁盘
gpart show
输出显示:
=> 34 3907029101 diskid/DISK-54UA4072K7AS GPT (1.8T)
34 2014 - free - (1.0M)
2048 536870912 1 freebsd-ufs (256G)
536872960 3370156032 2 freebsd-zfs (1.6T)
3907028992 143 - free - (72K)
=> 40 3907029088 diskid/DISK-Y39B70RTK7AS GPT (1.8T)
40 532480 1 efi (260M)
532520 2008 - free - (1.0M)
534528 4194304 2 freebsd-swap (2.0G)
4728832 536870912 3 freebsd-zfs (256G)
541599744 3365429248 4 freebsd-zfs (1.6T)
3907028992 136 - free - (68K)
注意:
efi
分区将是 FreeBSD 和 Linux 共用的FAT32分区
1.6T
的分区4 (freebsd-zfs) 是之前 ZFS Stripe条带化 (FreeBSD环境实践) 中的一个分区,该分区上的zdata
zpool我已经销毁,所以这个分区将删除重建,分别用于 LFS(Linux from scratch) 以及重新构建一个 ZFS Stripe条带化 (FreeBSD环境实践)zdata
diskid/DISK-54UA4072K7AS
也是 ZFS Stripe条带化 (FreeBSD环境实践) 构建的分区,后续将清理掉重新构建 ZFS Stripe条带化 (FreeBSD环境实践)zdata
diskid/DISK-Y39B70RTK7AS
删除分区(系统磁盘):
gpart delete -i 4 /dev/diskid/DISK-Y39B70RTK7AS
删除系统磁盘的第 4 分区
diskid/DISK-54UA4072K7AS
删除分区(数据磁盘):
gpart delete -i 1 /dev/diskid/DISK-54UA4072K7AS
gpart delete -i 2 /dev/diskid/DISK-54UA4072K7AS
现在磁盘不需要的分区已经删除,检查:
gpart show
显示空闲空间:
=> 34 3907029101 diskid/DISK-54UA4072K7AS GPT (1.8T)
34 3907029101 - free - (1.8T)
=> 40 3907029088 diskid/DISK-Y39B70RTK7AS GPT (1.8T)
40 532480 1 efi (260M)
532520 2008 - free - (1.0M)
534528 4194304 2 freebsd-swap (2.0G)
4728832 536870912 3 freebsd-zfs (256G)
541599744 3365429384 - free - (1.6T)
在系统盘上创建一个
linux-data
类型的Linux分区256G,并将该系统盘剩余空间创建为zfs分区
linux-data
和 freebsd-zfs
分区# 添加linux分区(-t linux-data), 以1M大小进行对齐(-a 1M), 分区大小为256G(-s 256G)
gpart add -t linux-data -a 1M -s 256G /dev/diskid/DISK-Y39B70RTK7AS
# 添加ZFS分区(-t freebsd-zfs), 以1M大小进行对齐(-a 1M), 分区为剩余空间
gpart add -t freebsd-zfs -a 1M /dev/diskid/DISK-Y39B70RTK7AS
另一个数据磁盘则完整划分一个ZFS分区
gpart add -t freebsd-zfs -a 1M /dev/diskid/DISK-54UA4072K7AS
最终完成的分区:
gpart show
显示如下:
=> 34 3907029101 diskid/DISK-54UA4072K7AS GPT (1.8T)
34 2014 - free - (1.0M)
2048 3907026944 1 freebsd-zfs (1.8T)
3907028992 143 - free - (72K)
=> 40 3907029088 diskid/DISK-Y39B70RTK7AS GPT (1.8T)
40 532480 1 efi (260M)
532520 2008 - free - (1.0M)
534528 4194304 2 freebsd-swap (2.0G)
4728832 536870912 3 freebsd-zfs (256G)
541599744 536870912 4 linux-data (256G)
1078470656 2828558336 5 freebsd-zfs (1.3T)
3907028992 136 - free - (68K)
构建ZFS
上述2个NVMe磁盘的 1.3T
和 1.8T
分区,采用 ZFS Stripe条带化 (FreeBSD环境实践) 方式再次重建 zdata
:
stripe
模式的 zdata
zpool create -f -o ashift=12 zdata \
/dev/diskid/DISK-Y39B70RTK7ASp5 \
/dev/diskid/DISK-54UA4072K7ASp1
# 默认启用lz4压缩
zfs set compression=lz4 zdata
检查zpool:
zpool list -v
输出可以看到 zdata
跨了2块磁盘:
zdata
跨了2块磁盘NAME SIZE ALLOC FREE CKPOINT EXPANDSZ FRAG CAP DEDUP HEALTH ALTROOT
zdata 3.12T 396K 3.12T - - 0% 0% 1.00x ONLINE -
diskid/DISK-Y39B70RTK7ASp5 1.32T 204K 1.31T - - 0% 0.00% - ONLINE
diskid/DISK-54UA4072K7ASp1 1.82T 192K 1.81T - - 0% 0.00% - ONLINE
zroot 254G 13.5G 240G - - 1% 5% 1.00x ONLINE -
diskid/DISK-Y39B70RTK7ASp3 256G 13.5G 240G - - 1% 5.33% - ONLINE
构建ZFS的dataset
主要的ZFS dataset:
zdata/docs
日常操作数据(启用zstd
压缩)zdata/vms
bhyve(BSD hypervisor) 虚拟机zdata/jails
FreeBSD Jail 容器
我已经在 ZFS 复制(replication) 中完成了备份,所以现在将上述 zdata/vms
和 zdata/jails
恢复回来:
zdata
上数据集time=`date +%Y-%m-%d_%H:%M:%S`
from_zpool=zstore
to_zpool=zdata
zfs snapshot -r $from_zpool/jails@$time
zfs snapshot -r $from_zpool/vms@$time
zfs send -v -R $from_zpool/jails@$time | zfs receive $to_zpool/jails
zfs send -v -R $from_zpool/vms@$time | zfs receive $to_zpool/vms