UFS文件系统
Table of Contents
UFS Unix File System 是 FreeBSD 的原生文件系统,基于伯克利 快速文件系统 FFS
由 Kirk McKusick 等人于 1983 年随 4.2BSD 引入,当前版本为 UFS2 本节介绍磁盘扩容、快照创建与挂载及配额管理三类操作
概述
须明确区分,本节所述的 UFS 文件系统与手机等设备中使用的 UFS 存储属于完全不同的技术范畴。后者全称为 Universal Flash Storage 通用闪存存储 ,是一种硬件存储标准,目前已发展至 4.1 版本
FreeBSD 在 10.4 版本中支持 eMMC,FreeBSD 15.0 已通过 ufshci 驱动支持 UFS 存储
作为文件系统的 UFS,其当前版本号为 2
基于 Linux 的 Android 系统不支持 UFS 文件系统 此类设备的根文件系统通常为 ext4,部分新设备采用 F2FS,而 Linux 对 UFS 的读写支持尚不完整
注意:UFS 文件系统只能扩大,不能缩小
UFS 文件系统磁盘扩容
此方案仅适用于向后扩展;如果 freebsd-ufs 分区前方存在空余空间,则无法使用此方法扩展
首先,使用 gpart show 命令查看系统中所有磁盘的分区布局:
$ gpart show
=> 3 41943035 da0 GPT (20G)
3 122 1 freebsd-boot (61K)
125 66584 2 efi (33M)
66709 2097152 3 freebsd-swap (1.0G)
2163861 10486633 4 freebsd-ufs (5.0G)
12650494 29292544 - free - (14G)
系统盘初始大小为 5 GB,输出显示 da0 磁盘仅含一个 UFS 分区
执行扩容命令序列
如果使用的是 GPT 分区表,此处的扩容操作在虚拟机或云服务器环境中可能会破坏 GPT 分区表 原因是虚拟机或云平台在调整磁盘大小时可能未正确更新 GPT 分区表的备份副本
因此需要首先恢复 da0 磁盘的分区表:
$ gpart recover da0
调整 da0 磁盘上编号为 4 的 freebsd-ufs 分区大小:
$ gpart resize -i 4 da0 da0p4 resized
选项 -i 用于指定待扩容的分区编号,此处用于扩展 freebsd-ufs 分区
扩展文件系统
使用 growfs 服务扩展文件系统,该操作仅需执行一次,完成后无需重复运行:
$ service growfs onestart Growing root partition to fill device da0 recovering is not needed da0p4 resized growfs: no room to allocate last cylinder group; leaving 7.7MB unused super-block backups (for fsck_ffs -b #) at: 11544384, 12827072, 14109760, 15392448, 16675136, 17957824, 19240512, 20523200, 21805888, 23088576, 24371264, 25653952, 26936640, 28219328, 29502016, 30784704, 32067392, 33350080, 34632768, 35915456, 37198144, 38480832
growfs 是 FreeBSD 用于扩展 UFS 文件系统的工具,通过调整柱面组和超级块来利用新增的分区空间
验证扩容结果
查看已挂载文件系统的磁盘使用情况:
$ df -hl Filesystem Size Used Avail Capacity Mounted on /dev/gpt/rootfs 18G 4.8G 12G 29% / devfs 1.0K 0B 1.0K 0% /dev /dev/gpt/efiesp 32M 651K 31M 2% /boot/efi tmpfs 20M 4.0K 20M 0% /tmp tmpfs 32M 156K 32M 0% /var
参数说明:
- -h:以人类可读格式显示,单位为 KB、MB、GB 等
- -l:仅显示本地文件系统。
上述输出表明,分区扩展操作已完成,文件系统已成功调整至新的大小
UFS 文件系统快照
FreeBSD 提供了一项与软更新(Soft Updates)结合使用的功能:文件系统快照
UFS 快照允许用户创建指定文件系统的镜像,并将其作为文件处理
- 快照文件必须创建在所快照的文件系统内
- 每个 UFS 文件系统最多可创建 20 个快照
- 活动快照会记录在超级块中,并在系统重启后仍然存在
当不再需要某个快照时,可使用 rm(1) 删除
尽管可以按任意顺序删除快照,但可能无法彻底回收所有已使用的空间,因为其他快照可能会占用部分已释放的块
可使用 mksnap_ffs(8) 创建 / 的快照,并存储至 /.snap/snap1 :
$ mksnap_ffs /.snap/snap1
mksnap_ffs 会自动快照指定目录所在的文件系统,不支持直接指定文件系统 以上示例基于 UFS 标准安装,因此将对完整的根分区进行快照
也可以通过 mount(8) 创建快照。如果要将 / 的快照存入文件 /home/ykla/snapshot/snap,可使用以下命令:
$ mkdir -p /home/ykla/snapshot/ $ mount -u -o snapshot /home/ykla/snapshot/snap /
UFS 快照文件的大小等于其来源文件系统的大小,但实际占用空间与 ZFS 类似:
$ ls -loh /home/ykla/snapshot/snap # 逻辑占用存储 -r-------- 1 root ykla snapshot 19G May 1 01:55 /home/ykla/snapshot/snap $ du -hl /home/ykla/snapshot/snap # 真实占用存储 6.1M /home/ykla/snapshot/snap
snapshot 文件标志(不可变标志)由 mksnap_ffs(8) 在快照文件初始创建时设置
可使用 find(1) 查找文件系统中的快照文件,例如 /:
$ find / -flags snapshot /.snap/snap1 /home/ykla/snapshot/snap
快照可作为文件系统的冻结镜像挂载。如果要以 只读 方式挂载快照 /home/ykla/snapshot/snap,可执行以下命令:
$ mdconfig -a -t vnode -o readonly -f /home/ykla/snapshot/snap -u 4 $ mount -r /dev/md4 /mnt $ ls /mnt/ .snap dev libexec rescue var .sujournal entropy media root COPYRIGHT etc mnt sbin bin home net tmp boot lib proc usr
| 参数 | 含义 |
| -a | 创建 md 设备 |
| -t vnode | 用文件作为磁盘 |
| -o readonly | 创建只读 vnode 磁盘设备 |
| -f file | 指定快照文件 |
| -u 4 | 指定至 md4,防止冲突 |
挂载后,冻结的 / 即可通过 /mnt 访问,所有内容均保持快照创建时的状态
唯一的例外是,任何更早的快照将显示为空文件
卸载快照可执行:
$ umount /mnt $ mdconfig -d -u 4
UFS 文件系统磁盘配额
磁盘配额可用于限制用户或用户组在每个 UFS 文件系统中可分配的磁盘空间或文件数量 从而防止某个用户或用户组消耗掉所有可用的磁盘空间
FreeBSD 默认内核提供了对磁盘配额的支持,可运行以下命令验证:
$ sysctl kern.features.ufs_quota kern.features.ufs_quota: 1
如果以上输出为 0,意味着当前可能正在使用自定义内核,不支持磁盘配额模块 应在内核配置文件中加入内核选项 options QUOTA,然后重新编译内核
设置开机启用磁盘配额:
$ service quota enable
立刻启用磁盘配额:
$ service quota start
系统在启动时会通过 quotacheck(8) 检查每个文件系统的配额完整性, 此程序确保配额数据库中的数据正确反映文件系统中的数据
此过程较为耗时,会显著影响系统的启动时间
要跳过此步骤,可在 /etc/rc.conf 中添加以下变量:
check_quotas="NO"
在 /etc/fstab 中加入配额选项,以启用每个用户或每个用户组的磁盘配额。如果要启用每个用户的配额,可在文件系统的 /etc/fstab 配置行的选项字段中添加 userquota 。例如:
/dev/nda0p2 / ufs rw,userquota 1 1
如果要启用组配额,可使用 groupquota 替代。若同时启用用户和组配额,可用逗号分隔选项:
/dev/nda0p2 / ufs rw,userquota,groupquota 1 1
配置完成后,重新启动系统,/etc/rc 将自动运行相应的命令,为 /etc/fstab 中启用的所有配额创建初始配额文件
在默认情况下,配额文件存储在文件系统的根目录中,名为 quota.user 和 quota.group
-rw-r----- 1 root operator - 64192 May 1 02:34 quota.group -rw-r----- 1 root operator - 64192 May 1 02:34 quota.user
设置配额限制
要验证配额是否已启用,可以运行以下命令:
$ quota -v Disk quotas for user ykla (uid 1001): Filesystem usage quota limit grace files quota limit grace / 32 0 0 9 0 0
系统至此已具备使用 edquota 设置配额限制的条件
配额限制可基于 磁盘空间 (块配额)、 文件数量 (inode 配额)或两者的组合设定。每种限制进一步细分为两个类别:硬限制和软限制。
硬限制不可超过。用户达到硬限制时,便无法再向该文件系统分配任何空间
例如,用户的文件系统硬限制为 500 KB,并且当前使用了 490 KB,则该用户只能分配额外的 10 KB 尝试分配额外的 11 KB 将失败
- 软限制可超出一定时间,该时间段称为宽限期,默认为一周。如果用户超出软限制且宽限期已过,软限制将转变为硬限制,不再允许进一步分配。用户降至软限制以下时,宽限期将重置
在以下示例中,编辑 ykla 账户的配额。调用 edquota 时,将打开由环境变量 EDITOR 指定的编辑器以编辑配额限制,默认编辑器为 nvi:
$ edquota -u ykla Quotas for user ykla: /: in use: 32k, limits (soft = 0k, hard = 0k) # 块配额限制 inodes in use: 9, limits (soft = 0, hard = 0) # inode 配额限制
可以更改块配额和 inode 配额来配置配额限制。例如,要将 / 的块限制提高到软限制 100 和硬限制 120,将该行的值更改为:
/: in use: 32k, limits (soft = 100k, hard = 120k)
退出编辑器后,新配额限制将生效。用户只能检查自己的配额和自己所属组的配额。只有超级用户才能查看所有用户和组的配额
$ quota -v ykla Disk quotas for user ykla (uid 1001): Filesystem usage quota limit grace files quota limit grace / 32 100 120 9 0 0
通常,用户未使用任何磁盘空间的文件系统不会出现在 quota(1) 的输出中,即使该用户对该文件系统拥有配额
某些场景下需要为一批用户设置相同的配额限制。可先为某个用户分配所需的配额限制,再使用 -p 选项将该配额复制给指定 UID 范围的用户。以下命令将配额限制复制给 UID 为 10000 至 19999 的用户:
$ edquota -p ykla 10000-19999
| Next: 自动挂载 | Home: 存储管理 |