您的位置:首页 > 其它

文章标题

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

复制这三个文件

源码文件复制完成

#!/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模块,将一些用不到的功能函数省去。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: