gpart实践(ufs分区)

FreeBSD Linux Jail 遇到一个疑似 Linuxulator 在FreeBSD 15 Alpha 2上对 ZFS metadata 翻译层支持的bug,想要验证一下是否在UFS(简单有效)文件系统上可以绕过这个问题,对比验证一下FreeBSD 15 Alpha 2是否确实存在bug。本文为一个简单的UFS文件系统实践记录。

  • 使用 geom 检查当前磁盘:

使用 geom 列出磁盘
geom disk list

系统中只安装了一块 铠侠KIOXIA EXCERIA G2 NVMe SSD存储 显示设备名为 nda0 :

单块NVMe存储分区
Geom name: nda0
Providers:
1. Name: nda0
   Mediasize: 2000398934016 (1.8T)
   Sectorsize: 512
   Mode: r2w2e4
   descr: KIOXIA-EXCERIA G2 SSD
   lunid: 00000000000000008ce38e030091c40e
   ident: Y39B70RTK7AS
   rotationrate: 0
   fwsectors: 0
   fwheads: 0
使用 gpart 检查磁盘分区
gpart show

显示当前分区有5恶,其中分区4是准备调整的分区:

使用 gpart 检查磁盘分区,分区4需要调整
=>        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)
  • 删除分区4:

删除分区4
#语法 gpart delete -i index [-f flags] geom
gpart delete -i 4 /dev/diskid/DISK-Y39B70RTK7AS
  • 这里有一个问题,一共5个分区,删掉中间的分区4,那么分区5的index会变化么?

使用 gpart 检查磁盘分区
gpart show

可以看到分区5的index依然是 5 :

使用 gpart 检查磁盘分区,删除分区4之后分区5的index依然是5
=>        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                            - free -  (256G)
  1078470656  2828558336                         5  freebsd-zfs  (1.3T)
  3907028992         136                            - free -  (68K)
  • 创建一个 UFS 分区:

创建一个UFS分区
gpart add -t freebsd-ufs -a 1M -s 56G /dev/diskid/DISK-Y39B70RTK7AS

可以看到新创建的UFS分区使用了分区4的index :

使用 gpart 检查磁盘分区,新创建的UFS分区使用了分区4的index
=>        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   117440512                         4  freebsd-ufs  (56G)
   659040256   419430400                            - free -  (200G)
  1078470656  2828558336                         5  freebsd-zfs  (1.3T)
  3907028992         136                            - free -  (68K)
  • 最后创建 Linux 分区将剩余空间用掉:

创建Linux分区
gpart add -t linux-data -a 1M /dev/diskid/DISK-Y39B70RTK7AS

可以看到每次新创建的分区都是使用可分配index的最小值,这次轮到了6:

使用 gpart 检查磁盘分区,新创建的Linux分区使用了可用index最小值6
=>        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   117440512                         4  freebsd-ufs  (56G)
   659040256   419430400                         6  linux-data  (200G)
  1078470656  2828558336                         5  freebsd-zfs  (1.3T)
  3907028992         136                            - free -  (68K)

UFS文件系统创建和挂载

  • 对第4分区创建UFS文件系统

创建UFS系统
#newfs /dev/diskid/DISK-Y39B70RTK7ASp4

# 参数
# -U 激活soft updates,可以提高性能以及crash快速恢复文件系统
# -t 激活SSD存储的TRIM支持
# -j 激活Soft Updates的Journaling功能
newfs -Utj /dev/diskid/DISK-Y39B70RTK7ASp4
  • 创建挂载目录 /udata :

创建目录
mkdir /udata
  • 配置 /etc/fstab 添加UFS挂载参数

/etc/fstab 添加UFS挂载参数
# Device          Mountpoint        FStype   Options    Dump   Pass#
/dev/gpt/swap0    none              swap     sw         0      0
/dev/diskid/DISK-Y39B70RTK7ASp4  /udata  ufs rw         1      2
  • 执行 mount /udata 命令挂载分区,然后执行 df -h 可以看到分区4已经挂好如下:

检查分区挂载
Filesystem                                     Size    Used   Avail Capacity  Mounted on
...
/dev/diskid/DISK-Y39B70RTK7ASp4                 54G    448M     49G     1%    /udata

一切就绪,开始实践 VNET + Thick(厚) Jail(UFS)