提交 dc0f3cc3 编写于 作者: H Hypox64

update README.md

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