# 编译
make
# 安装
make install
# 查看注册的新文件系统
cat /proc/filesystem
# 卸载
make uninstall
# 支持挂载文件系统,查看状态
# 生成测试文件并格式化
make mkimg
# 挂载文件系统
make mount
# 可用以下命令查看挂载的文件系统
mount
stat -f /mnt
stat /mnt
# 卸载文件系统
make umount
- 创建
super_block
,填充数据并写到设备文件上。计算数据块开始的 block,nr_dstore_blocks
- 写
inode_bitmap
,第一个 64bit 设置为0x0000000000000001
,其余的都是0x0000000000000000
。1 表示占用,0 表示空闲 - 写
inode_table
。创建root_inode
并填充数据,写到 inode block。此时还没有分配数据块给这个 inode - 写
datablock_bitmap
,第一个 64bit 设置为0x0000000000000001
,等会要给root_inode
分配一个目录块填充目录项,其余的也是0x0000000000000000
。1 表示占用,0 表示空闲 - 写
first_block
,往里面添加 "." 和 ".."目录项
,设置root_inode->i_blocks
索引数组
借助 vfs 提供的 mount_bdev
方法挂载块设备上的文件系统,只需要传入自定义的 babyfs_fill_super
方法,该方法主要执行步骤为:
- 设置逻辑块大小
- 读取磁盘上的超级块,以初始化 vfs 超级块实例
- 读取磁盘上的 inode,以初始化根目录的 inode 实例
- 最后新建根目录的 dentry 实例,并与 inode 实例相关联
《Linux 内核设计与实现》第 13、14、16 和 17 章
《深入理解 Linux 内核》
当挂在的文件系统为 50M 时,分布如下
64行/块,
/*
* babyfs partition layout
* +---------------+
* | superblock | 1 block,0,2-65
* +---------------+
* | inode bitmap | 1 block,1,66-129
* +---------------+
* | inode table | 1024 block,2-1025,130-65665
* +---------------+
* | block bitmap | 6 block,1026-1031,65666-66049
* +---------------+
* | data |
* | blocks | 1032- ,rest of the blocks
* +---------------+
*/
安装 F2FS 格式化工具
sudo apt-get install -y f2fs-tools
# 使用
mkfs.f2fs -l f2fs /dev/sda
# 示例
dd if=/dev/zero of=device bs=4K count=128000 (创建500M)
losetup /dev/loop0 device
mkfs.f2fs -l f2fs /dev/loop0
mount -t f2fs /dev/loop0 /mnt/f2fs
# 拷贝内核文件
cp -r linux-4.17.12/fs/f2fs .
# 修改 Makefile 添加内容
KDIR:=/lib/modules/$(shell uname -r)/build
all:
make -C $(KDIR) M=$(PWD) modules
# 安装模块
make && sudo insmod f2fs.ko
API
https://www.debugger.wiki/article/html/1558843231417175
https://linux-kernel-labs.github.io/refs/heads/master/labs/filesystems_part1.html#fillsupersection
mount 系统调用过程
https://zhuanlan.zhihu.com/p/67686817
open 系统调用过程
https://juejin.cn/post/6844903937036779533
buffer_head 结构体
https://www.huliujia.com/blog/b332e9cef68c8d3efe84778931ffb98a6173812d/
ext2文件系统
https://wenku.baidu.com/view/946bb6c48bd63186bcebbcb5.html
网上已经实现的简单文件系统参考