NILFS2
NILFS2 (New Implementation of a Log-structured File System,一种新型日志结构文件系统) 是一个支持整个文件系统版本控制和连续快照功能的日志结构文件系统,允许用户恢复几秒钟前被错误覆盖或删除的文件。
它由日本电信电话公司 (NTT) 网络空间实验室和全球社区共同开发。NILFS 在 GNU 通用公共许可证 (GPL) 条款下发布。
NILFS2 会持续进行快照,因此可以将其视为版本控制文件系统,文件系统会自动保留每个文件的过去版本。
- 由于其日志结构设计会导致碎片化,NILFS2 可能不是机械硬盘的最佳选择。
- 截至 2025-04-22,NILFS2 尚未实现 atime (访问时间)、扩展属性和 Posix ACLs (Posix 访问控制列表)。如果您的工作流程依赖于这些功能,请勿使用 NILFS2。它目前也缺乏完善的 fsck 工具,因此在发生严重错误时可能无法恢复。
- 请参阅 Current status (当前状态) 以了解已实现和未实现的功能。
创建 NILFS2 文件系统
本文假设设备已 设置分区。请 安装 nilfs-utils。使用 mkfs.nilfs2 命令格式化目标分区,其中 /dev/sdxY 代表目标分区。
# mkfs.nilfs2 -L mylabel /dev/sdxY
有关所有可用选项,请参阅 mkfs.nilfs2(8)。
更改标签
nilfs-tune 命令应仅用于未挂载的文件系统。
# nilfs-tune -L newlabel /dev/sdxY
挂载
然后,可以通过手动或其他机制挂载文件系统。
# mount /dev/sdxY /mnt/foo
挂载选项
错误处理
errors=continue / remount-ro / panic 指定 NILFS2 在发生文件系统错误时应执行的操作。continue (继续) 忽略错误;remount-ro (重新挂载为只读) 将文件系统重新挂载为只读;panic (恐慌) 会使系统崩溃。
Discard (丢弃)
discard / nodiscard 启用/禁用 TRIM。
有关所有可用选项,请参阅 mount.nilfs2(8)。
快照
NILFS2 具有两种类型的快照:检查点 (checkpoints) 和快照 (snapshots)。它们通常分别缩写为 cp 和 ss。
NILFS2 会在每次写入时自动创建检查点。检查点是一种快照,当文件系统空间不足或用户手动触发清理时,NILFS2 的垃圾回收器可以自动删除它以释放空间。
快照必须手动从检查点转换而来,并且永远不会被自动删除。它们可以被挂载以从中恢复数据。
列出快照
可以使用以下命令列出检查点和快照:
lscp /dev/sdxY
CNO DATE TIME MODE FLG BLKCNT ICNT
1 2025-04-14 21:35:06 cp - 10181423 554012
2 2025-04-14 22:17:38 cp - 10181423 554012
3 2025-04-14 22:18:22 cp - 10181423 554012
4 2025-04-14 22:28:56 cp - 10181423 554012
5 2025-04-14 22:39:59 cp - 10181423 554012
...
要仅列出快照 (ss),请使用 lscp 命令的 -s 标志。有关所有可用选项,请参阅 lscp(1)。
将检查点转换为快照
为了从检查点恢复数据,它必须首先被转换为快照。为此,请使用 chcp 工具。
# chcp ss /dev/sdxY checkpoint-number
checkpoint-number 是在 lscp 命令的 CNO 列中列出的检查点编号。
lscp 现在将显示类似以下的行:
4 2025-04-14 22:28:56 ss - 10181423 554012
要将快照转换回检查点,请使用:
# chcp cp /dev/sdxY checkpoint-number
创建快照
使用以下命令创建检查点:
# mkcp /dev/sdxY
或者直接创建快照:
# mkcp --snapshot /dev/sdxY
挂载快照
以下命令会将快照 checkpoint-number 以只读方式挂载到 /mnt/snapshot:
# mount -t nilfs2 -r -o cp=checkpoint-number /dev/sdxY /mnt/snapshot
删除快照
要删除单个检查点,请使用:
# rmcp /dev/sdxY checkpoint-number
要删除一系列检查点,您可以使用:
# rmcp /dev/sdxY start..end
其中 start 是起始检查点的编号,end 是结束检查点的编号。
要删除早于某个检查点的所有检查点,请使用:
# rmcp /dev/sdxY ..checkpoint-number
要删除晚于某个检查点的所有检查点,请使用:
# rmcp /dev/sdxY checkpoint-number..
rmcp 命令添加 -i 标志以进行交互式使用,从而双重检查输入的值。有关更多详细信息,请参阅 rmcp(8)。
清理文件系统
要清除已挂载的 NILFS2 文件系统中的过时检查点,请运行:
# nilfs-clean /dev/sdxY
有关垃圾回收器的详细信息,请参阅 nilfs-clean(8) 和 nilfs_cleanerd(8)。
调整文件系统大小
nilfs-resize 工具用于调整在线 NILFS2 文件系统的大小。
可以使用以下命令调整已挂载的 NILFS2 文件系统的大小:
# nilfs-resize /dev/sdxY desired-size
其中 desired-size 可以附加单位字母 s、K、M、G 或 T,分别表示 512 字节扇区、千字节、兆字节、千兆字节或太字节。如果未指定 desired-size,则默认为分区的大小。
nilfs-resize 不会更改分区本身的大小,在缩小文件系统时需要稍后缩小分区,或者在扩大文件系统时需要提前扩大分区。例如,可以使用 fdisk 来完成此操作。
有关更多详细信息,请参阅 nilfs-resize(8)。