提交 dc0f3cc3 编写于 作者: H Hypox64

update README.md

上级 8bb25e48
[toc] [toc]
### 1 题目描述 ## 1 题目描述
选择的题目为第三题: 选择的题目为第三题:
以现有文件系统的代码为基础,增加数据加密存储的功能。 以现有文件系统的代码为基础,增加数据加密存储的功能。
1.在某种内存文件系统(例如ramfs)上实现;90分 1.在某种内存文件系统(例如ramfs)上实现;90分
2.在某种磁盘文件系统(例如ext2fs)上实现:100分 2.在某种磁盘文件系统(例如ext2fs)上实现:100分
在本文中实现的是在ext2上实现的数据加密存储的功能。 在本文中实现的是在ext2上实现的数据加密存储的功能。
### 2 设计方案 ## 2 设计方案
#### 2.1 linux文件系统分析 ### 2.1 linux文件系统分析
  关于虚拟文件系统vfs的部分,本文将不在赘述,本文将侧重于分析当用户态read发起时整个文件系统的工作流程。分析以read为例,write与read相类似。   关于虚拟文件系统vfs的部分,本文将不在赘述,本文将侧重于分析当用户态read发起时整个文件系统的工作流程。分析以read为例,write与read相类似。
  值得一提的是在linux中读写数据均分为Direct读写和缓存读写两种形式。为了简化流程,且不分析底层的代码片段,本文的分析将会默认缓存命中。   值得一提的是在linux中读写数据均分为Direct读写和缓存读写两种形式。为了简化流程,且不分析底层的代码片段,本文的分析将会默认缓存命中。
...@@ -55,8 +55,8 @@ const struct file_operations ext2_file_operations = { ...@@ -55,8 +55,8 @@ const struct file_operations ext2_file_operations = {
  ```do_generic_file_read()```会分为两步,首先获取缓存页find_get_page()然后判断页缓存的标记满足条件,如果满足就```copy_page_to_iter()```,至此用户态```read()```结束。如果缓存不命中将继续进行下一步操作,本文将不再具体分析。整个详细的读写流程如下图所示:   ```do_generic_file_read()```会分为两步,首先获取缓存页find_get_page()然后判断页缓存的标记满足条件,如果满足就```copy_page_to_iter()```,至此用户态```read()```结束。如果缓存不命中将继续进行下一步操作,本文将不再具体分析。整个详细的读写流程如下图所示:
![image](images/ext2文件读写详细流程.png) ![image](images/ext2文件读写详细流程.png)
#### 2.2 设计思路 ### 2.2 设计思路
##### 2.2.1 整体思路 #### 2.2.1 整体思路
  从对文件系统的分析可以看出无论是哪一种子文件系统(ext2/ext4/fat)对会由经过虚拟文件系统vfs的传递最终指向```.read_iter```以及```.write_iter```, 而对于不同子文件系统,都单独对这个两个指向进行了定义。一般而言,他们会分别指向```generic_file_read_iter()```以及```generic_file_write_iter()```,所以我们只需要将ext2的```.read_iter```以及```.write_iter```指向我们修改过的函数即可:   从对文件系统的分析可以看出无论是哪一种子文件系统(ext2/ext4/fat)对会由经过虚拟文件系统vfs的传递最终指向```.read_iter```以及```.write_iter```, 而对于不同子文件系统,都单独对这个两个指向进行了定义。一般而言,他们会分别指向```generic_file_read_iter()```以及```generic_file_write_iter()```,所以我们只需要将ext2的```.read_iter```以及```.write_iter```指向我们修改过的函数即可:
```c ```c
// my_modules/ext2/file.c // my_modules/ext2/file.c
...@@ -89,7 +89,7 @@ ssize_t generic_file_read_iter_my(struct kiocb *iocb, struct iov_iter *iter) ...@@ -89,7 +89,7 @@ ssize_t generic_file_read_iter_my(struct kiocb *iocb, struct iov_iter *iter)
} }
``` ```
##### 2.2.2 读写数据截获 #### 2.2.2 读写数据截获
  为了构建新的函数截获读写数据,需要分析```generic_file_read_iter()/generic_file_write_iter()```源码,这时会发现```struct kiocb *```以及```struct iov_iter *```两个结构体。   为了构建新的函数截获读写数据,需要分析```generic_file_read_iter()/generic_file_write_iter()```源码,这时会发现```struct kiocb *```以及```struct iov_iter *```两个结构体。
  其中```struct kiocb *```的描述为: kernel I/O control block即内核I/O控制块。其主要包括当前文件的描述信息```struct file ```以及一些控制信息。其定义如下:   其中```struct kiocb *```的描述为: kernel I/O control block即内核I/O控制块。其主要包括当前文件的描述信息```struct file ```以及一些控制信息。其定义如下:
```c ```c
...@@ -132,13 +132,13 @@ struct iovec ...@@ -132,13 +132,13 @@ struct iovec
}; };
``` ```
  所以,为了截获数据只需对```struct iov_iter *```遍历就可以得到每个用于储存读写缓存数据的用户空间缓存区地址iov_base,然后对地址按照iov_len读出就可以获得读写缓存数据。   所以,为了截获数据只需对```struct iov_iter *```遍历就可以得到每个用于储存读写缓存数据的用户空间缓存区地址iov_base,然后对地址按照iov_len读出就可以获得读写缓存数据。
##### 2.2.3 加密以及解密 #### 2.2.3 加密以及解密
  加密以及解密部分就用了最简单的与1异或的操作,这不仅同时适用于加密与解密,而且还不会改变数据长度。具体实现步骤及代码见调试与验证过程。   加密以及解密部分就用了最简单的与1异或的操作,这不仅同时适用于加密与解密,而且还不会改变数据长度。具体实现步骤及代码见调试与验证过程。
### 3 调试与验证过程 ## 3 调试与验证过程
#### 3.1 准备工作 ### 3.1 准备工作
##### 3.1.1 将ext2修改为系统模块 #### 3.1.1 将ext2修改为系统模块
  将ext2文件系统编译成模块化,当我们需要对ext2进行修改的时候,就不需要重新编译内核。这样可以大大加快调试速度。   将ext2文件系统编译成模块化,当我们需要对ext2进行修改的时候,就不需要重新编译内核。这样可以大大加快调试速度。
* 1.修改.config文件,将File system里的ext2标注为模块[M] * 1.修改.config文件,将File system里的ext2标注为模块[M]
```bash ```bash
...@@ -178,7 +178,7 @@ depends: mbcache ...@@ -178,7 +178,7 @@ depends: mbcache
[root@localhost ext2]# modprobe mbcache [root@localhost ext2]# modprobe mbcache
[root@localhost ext2]# insmod ext2.ko [root@localhost ext2]# insmod ext2.ko
``` ```
##### 3.1.2 创建环回设备用于测试ext2文件系统 #### 3.1.2 创建环回设备用于测试ext2文件系统
  在磁盘中创建并挂载用于测试的ext2文件系统   在磁盘中创建并挂载用于测试的ext2文件系统
```bash ```bash
#创建文件 #创建文件
...@@ -217,7 +217,7 @@ Writing superblocks and filesystem accounting information: done ...@@ -217,7 +217,7 @@ Writing superblocks and filesystem accounting information: done
/dev/loop0 on /mnt/bean type ext2 (rw,relatime,seclabel,errors=continue,user_xattr,acl) /dev/loop0 on /mnt/bean type ext2 (rw,relatime,seclabel,errors=continue,user_xattr,acl)
``` ```
##### 3.1.3 ext2.ko模块加载测试 #### 3.1.3 ext2.ko模块加载测试
  创建文件data并复制到 /mnt/bean   创建文件data并复制到 /mnt/bean
```bash ```bash
[root@localhost ext2]# cat /home/hypo/Desktop/data [root@localhost ext2]# cat /home/hypo/Desktop/data
...@@ -233,8 +233,8 @@ aaaaaaa ...@@ -233,8 +233,8 @@ aaaaaaa
  可以发现复制文件时所修改的ext2模块已经生效,截图如下:   可以发现复制文件时所修改的ext2模块已经生效,截图如下:
![image](./images/ext2模块挂载验证.png) ![image](./images/ext2模块挂载验证.png)
#### 3.2 编写代码并调试 ### 3.2 编写代码并调试
##### 3.2.1 调试流程 #### 3.2.1 调试流程
  每次修改代码后都将使用以下流程进行调试   每次修改代码后都将使用以下流程进行调试
```bash ```bash
umount /mnt/bean #取消挂载设备 umount /mnt/bean #取消挂载设备
...@@ -247,7 +247,7 @@ echo "aaaaaaa" > /mnt/bean/data #写入测试 ...@@ -247,7 +247,7 @@ echo "aaaaaaa" > /mnt/bean/data #写入测试
dmesg | tail -5 #获取printk输出 dmesg | tail -5 #获取printk输出
cat /mnt/bean/data cat /mnt/bean/data
``` ```
##### 3.2.2 写入加密测试 #### 3.2.2 写入加密测试
  在这一部分中,将编写函数```generic_file_write_iter_my```用于截取传入```generic_file_write_iter``````iov_iter```,对其所指向的内存的内容对1异或操作进行加密。由于并没有修改ext2的文件读取方法,这种测试环境下可以模拟储存介质丢失的情况。   在这一部分中,将编写函数```generic_file_write_iter_my```用于截取传入```generic_file_write_iter``````iov_iter```,对其所指向的内存的内容对1异或操作进行加密。由于并没有修改ext2的文件读取方法,这种测试环境下可以模拟储存介质丢失的情况。
```c ```c
ssize_t generic_file_write_iter_my(struct kiocb *iocb, struct iov_iter *from) ssize_t generic_file_write_iter_my(struct kiocb *iocb, struct iov_iter *from)
...@@ -298,7 +298,7 @@ b->114(ascii)->111 0010 ...@@ -298,7 +298,7 @@ b->114(ascii)->111 0010
111 0010 xor 000 0001 = 111 0011 ->115 ->'c' 111 0010 xor 000 0001 = 111 0011 ->115 ->'c'
![image](./images/写入加密测试.png) ![image](./images/写入加密测试.png)
##### 3.2.3 读取解密测试 #### 3.2.3 读取解密测试
  在这一部分中,将编写函数```generic_file_read_my```用于截取传出```generic_file_read_iter``````iov_iter```,对其所指向的内存的内容对1异或操作进行解密。为了验证解密工作,在测试时会注释掉加密的部分。   在这一部分中,将编写函数```generic_file_read_my```用于截取传出```generic_file_read_iter``````iov_iter```,对其所指向的内存的内容对1异或操作进行解密。为了验证解密工作,在测试时会注释掉加密的部分。
  用于读取解密部分的代码如下:   用于读取解密部分的代码如下:
...@@ -340,7 +340,7 @@ ccccccc ...@@ -340,7 +340,7 @@ ccccccc
![image](./images/读取解密测试.png) ![image](./images/读取解密测试.png)
  可以发现对明文不加密写入的情况下进行读取并解密,也将获得密文。   可以发现对明文不加密写入的情况下进行读取并解密,也将获得密文。
##### 3.2.4 加密-解密联合测试 #### 3.2.4 加密-解密联合测试
  写入加密与读取解密结合在一起后,形成加密-解密回路后在安装了该ext2模块的电脑上可以对/mnt/bean文件夹内的文件进行正常读写。   写入加密与读取解密结合在一起后,形成加密-解密回路后在安装了该ext2模块的电脑上可以对/mnt/bean文件夹内的文件进行正常读写。
  结果如下:   结果如下:
```bash ```bash
...@@ -360,7 +360,7 @@ bbbbbbb ...@@ -360,7 +360,7 @@ bbbbbbb
![image](./images/加密-解密测试.png) ![image](./images/加密-解密测试.png)
  当加密解密形成回路,就可以正常的读写文件   当加密解密形成回路,就可以正常的读写文件
#### 3.3 加密验证(模拟储存介质丢失的情况) ### 3.3 加密验证(模拟储存介质丢失的情况)
  存储加密最重要的作用就是防止存储设备丢失后数据会被窃取   存储加密最重要的作用就是防止存储设备丢失后数据会被窃取
  这里将模拟将加密的文件在另外一台电脑中打开的情况。   这里将模拟将加密的文件在另外一台电脑中打开的情况。
...@@ -380,12 +380,12 @@ const struct file_operations ext2_file_operations = { ...@@ -380,12 +380,12 @@ const struct file_operations ext2_file_operations = {
![image](./images/储存设备丢失测试_2.jpg) ![image](./images/储存设备丢失测试_2.jpg)
乱码一篇,加密成功! 乱码一篇,加密成功!
### 4 心得体会 ## 4 心得体会
完成这项作业花了将近1周时间,从编译内核开始一步步过来,感触良多。下面的VMware快照就是见证者。最开始想在vfs里截获数据进行加密,但是每次修改一点代码就要编译大半天,而且经常即使编译通过了也开不了机。最后问了同学发现可以把ext2文件系统模块化编译,这才恍然大悟,走上正轨。总得来说还是学到了很多东西的。 完成这项作业花了将近1周时间,从编译内核开始一步步过来,感触良多。下面的VMware快照就是见证者。最开始想在vfs里截获数据进行加密,但是每次修改一点代码就要编译大半天,而且经常即使编译通过了也开不了机。最后问了同学发现可以把ext2文件系统模块化编译,这才恍然大悟,走上正轨。总得来说还是学到了很多东西的。
![image](./images/VMware快照.png) ![image](./images/VMware快照.png)
最后强调一下VMware 害人不浅,同样的代码在VMware下一加载模块就会死机(键盘灯会闪,怀疑是有内核保护机制,不给改),换成VirtualBox就可以了。 最后强调一下VMware 害人不浅,同样的代码在VMware下一加载模块就会死机(键盘灯会闪,怀疑是VMware 有内核保护机制,不给注入数据),换成VirtualBox就可以了。
### 5 参考资料 ## 5 参考资料
[1] SunnyZhang的IT世界.Ext2文件系统读数据流程分析.https://www.jianshu.com/p/acdadea07fd8. [1] SunnyZhang的IT世界.Ext2文件系统读数据流程分析.https://www.jianshu.com/p/acdadea07fd8.
[2] DenzilXu.Ext2文件系统—文件读写.https://blog.csdn.net/DenzilXu/article/details/8579130. [2] DenzilXu.Ext2文件系统—文件读写.https://blog.csdn.net/DenzilXu/article/details/8579130.
[3] OnePunch-Man.linux内核分析:read过程分析.https://blog.csdn.net/u013837209/article/details/54923508. [3] OnePunch-Man.linux内核分析:read过程分析.https://blog.csdn.net/u013837209/article/details/54923508.
......
## Linux-homework of SZU ## Linux-homework of SZU
* 这是深圳大学罗秋明老师开设的linux操作系统课程的作业, 配套书籍《操作系统之编程观察》罗秋明 著。 * 这是深圳大学罗秋明老师开设的linux操作系统课程的作业, 配套书籍《操作系统之编程观察》罗秋明 著。
* 包含实验过程记录以及课后思考的截图图像以及代码。 * 包含实验过程记录以及课后思考的截图图像以及代码。
### [Example](./2.进程控制/note.md) ### [Example](./7.大作业_在ext2上实现的数据加密存储/README.md)
![image](./example.png)<br> ![image](./example.png)<br>
![image](./example_2.png) ![image](./example_2.png)
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册