文章标题
2016-12-27 00:49
381 查看
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
复制这三个文件
源码文件复制完成
使用该脚本将fs/myext2文件夹下的所有文件的ext2和EXT2修改为myext2和MYEXT2
将这个脚本放在myext2文件夹下,先加上可执行权限,再删除*.o文件最后运行这个脚本
/sudo 是为了获取root权限/
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文件中添加:
在/lib/modules/$(uname -r)/build /arch/x86/include/asm/bitops.h文件中添加:
在/lib/modules/$(uname -r)/build /include/uapi/linux/magic.h 文件中添加:
至此我们的源码修改已经完成,接下来就要把myext2编译成内核模块。
首先需要一个makefile文件
编写完Makefile文件后make,并加载
之后再查看是否加载成功
cat是用来查看文件和创建文件的,在这里是结合grep(通过正则表达式进行筛选)找到myext2的记录,这里我们已经添加了myext2文件系统
然后再对添加的文件系统进行测试
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模块,将一些用不到的功能函数省去。
进入到文件系统
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模块,将一些用不到的功能函数省去。