cd ~/linux-4.4.39/fs
进入到文件系统cp -R ext2 myext2
复制ext2文件系统(包括子文件夹),不加-r只复制文件夹cd /lib/modules/$(uname -r)/build /include/linux
cp ext2_fs.h myext2_fs.h
cd /lib/modules/(uname -r)/build /include/asm-generic/bitops
cp ext2-atomic.h myext2-atomic.h
cp ext2-atomic-setbit.h myext2-atomic-setbit.h
复制这三个文件
源码文件复制完成
#!/bin/bash
SCRIPT=substitute.sh
for f in *
do
if [ $f = $SCRIPT ]
then
echo "skip $f"
continue
fi
echo -n "substitute ext2 to myext2 in $f..."
cat $f | sed 's/ext2/myext2/g' > ${f}_tmp
mv ${f}_tmp $f
echo "done"
echo -n "substitute EXT2 to MYEXT2 in $f..."
cat $f | sed 's/EXT2/MYEXT2/g' > ${f}_tmp
mv ${f}_tmp $f
echo "done"
done
使用该脚本将fs/myext2文件夹下的所有文件的ext2和EXT2修改为myext2和MYEXT2
将这个脚本放在myext2文件夹下,先加上可执行权限,再删除*.o文件最后运行这个脚本
/sudo 是为了获取root权限/
sudo chmod +x substitue.sh
sudo rm *.o
sudo bash substitute.sh
chmod +x somfile是给某个文件执行权限, chmode有多种形式:chmode u+x chmode a +x, chmode g+x, chmode o + x.分别代表给user, all, guest, others
然后用gedit把刚刚复制的三个文件中的ext2(EXT2)改成myext2(MYEXT2)
完成修改后,我们还要在其他文件中添加上我们修改后的.h文件。
在以下三个文件中添加
在/lib/modules/$(uname -r)/build /include/asm-generic/bitops.h文件中添加:
#include <asm-generic/bitops/myext2-atomic.h>
在/lib/modules/$(uname -r)/build /arch/x86/include/asm/bitops.h文件中添加:
#include <asm-generic/bitops/myext2-atomic-setbit.h>
在/lib/modules/$(uname -r)/build /include/uapi/linux/magic.h 文件中添加:
#define MYEXT2_SUPER_MAGIC 0xEF53
至此我们的源码修改已经完成,接下来就要把myext2编译成内核模块。
首先需要一个makefile文件
#
# Makefile for the linux myext2-filesystem routines.
#
obj-m := myext2.o
myext2-y := balloc.o dir.o file.o ialloc.o inode.o \
ioctl.o namei.o super.o symlink.o
KDIR := /lib/modules/$(shell uname -r)/build
PWD := $(shell pwd)
default:
make -C $(KDIR) M=$(PWD) modules
编写完Makefile文件后make,并加载
sudo make
insmod myext2.ko
之后再查看是否加载成功
cat /proc/filesystems | grep myext2
cat是用来查看文件和创建文件的,在这里是结合grep(通过正则表达式进行筛选)找到myext2的记录,这里我们已经添加了myext2文件系统
然后再对添加的文件系统进行测试
#dd if=/dev/zero of=myfs bs=1M count=1
#/sbin/mkfs.ext2 myfs
#mount -t myext2 -o loop ./myfs /mnt
dd命令: if=file输入文件名
of=file输出文件名
bs=bytes同时设置读写块的大小count=blocks仅拷贝blocks块
mkfs.ext2
mkfs.ext2 myfs建立一个文件系统
mount挂载命令,挂载:给磁盘分区分配一个盘符,我们要访问存储设备中的文件,必须将文件所在的分区挂载到一个存在的目录
-t 指定文件系统的类型,这里自然就是我们的新建的myext2
-o 用来描述挂载的方式有loop:用来把一个文件当成硬盘分区挂载上系统,ro:只读,rw:读写
这里的意思是将./myfs上的文件系统挂载到/mnt中去
修改文件系统的magic number
位置在:/lib/modules/$(uname -r)/build/include/uapi/linux/magic.h
将MYEXT2_SUPER_MAGIC修改为0x6666
重新make并加载myext2模块
编写一个changeMN.c文件用来修改magicnumber,然后挂载myext2,再运行changeMN进行修改,此时再挂载ext2会失败
精简myext2模块,将一些用不到的功能函数省去。