一、实验题目
下面的练习检查了 UNIX 或 Linux 系统上文件和 inode 之间的关系。在这些系统上,文件用 inode 表示。也就是说,一个 inode 是一个文件(反之亦然)。可以在随本文提供的Linux虚拟机上完成此练习。也可以在任何 Linux、UNIX 或 Mac OS X 系统上完成练习,但需要创建两个名为 file1.txt 和 file3.txt 的简单文本文件,其内容是唯一的句子。
二、相关原理与知识
将使用 UNIX 或 Linux 的文件系统,并且掌握一些基本的文件操作命令,如创建文件(touch)、查看文件内容(cat)等。需要Linux下文件系统以及C语言的相关知识。
在Linux文件系统中,每个文件都由一个inode和数据块组成。inode存储文件的元数据,如所有者、访问权限、创建和修改时间等,而数据块则存储文件的实际内容。
三、实验过程
实现代码的主要设计思路:
首先,创建两个名为file1.txt和file3.txt的简单文本文件,其内容是唯一的句子。使用echo命令来创建文件并写入内容。
echo "This is file 1." > file1.txt
- 打开file1.txt并且检查其内容,并且获取索引结点值
- 创建 file2.txt 与 file1.txt 的联系,查看索引、内容
- 修改 file2.txt,检查file1.txt是否被更改
- 删除file1.txt并且检查目录,file2.txt是否还在
- 执行 strace rm file2.txt
- 创建file3.txt,创建file3.txt和file4.txt软连接并查看索引
- 修改file4.txt的内容,并且检查发现file3.txt也被修改了
- 删除file3.txt检查发现file4.txt也被删除
四、实验结果与分析
1.先使用echo命令来创建文件并写入内容,并且查看file1.txt的内容和其inode的值。
2.创建 file2.txt 与 file1.txt 的联系,查看索引、内容
3.修改 file2.txt,检查file1.txt是否被更改
4.删除file1.txt并且检查目录发现file2.txt还在
5.执行 strace rm file2.txt
6.创建file3.txt,创建file3.txt和file4.txt软连接并查看索引
7.修改file4.txt的内容,并且检查发现file3.txt也被修改了
8.删除file3.txt检查发现file4.txt也被删除
五、问题总结
问题1:
先在文件file2里写了内容,再建立连接,报错。建立连接时会直接创建一个新的文件。
总结:
硬链接的修改操作:硬链接直接指向源文件的inode,因此对源文件的任何修改都会反映到硬链接上。这意味着,无论通过源文件还是其硬链接进行修改,所有链接到同一inode的文件内容都会同步更新。
硬链接的删除操作:硬链接不会因为源文件的删除而消失。实际上,只要至少有一个硬链接存在,即使源文件被删除,文件的内容依然可以通过其他硬链接访问。这是因为硬链接和源文件共享相同的inode,只有当所有指向该inode的硬链接都被删除后,系统才会释放该inode及其对应的磁盘空间。
软链接的修改操作:软链接或符号链接,并不直接指向源文件的inode,而是存储了源文件的路径名。因此,如果源文件被移动或重命名,软链接将无法找到目标文件。除非软链接被重新定向到新的路径,否则它会变得无效。
软链接的删除操作:软链接会因为源文件的删除而失效。这是因为软链接仅包含源文件的路径信息,一旦源文件被删除,操作系统无法通过该路径找到文件,导致软链接失效。
六、源代码
cat file1.txt # 查看file1.txt的内容
ls -i file1.txt # 获取file1.txt的inode值
ln file1.txt file2.txt # 创建硬链接
ls -i file1.txt file2.txt # 查看两个文件的inode值
cat file2.txt # 查看file2.txt的内容
echo "Modified content" >> file2.txt # 修改file2.txt
cat file1.txt # 查看file1.txt的内容是否被更改
rm file1.txt # 删除file1.txt
ls # 查看当前目录,file2.txt是否还在
strace rm file2.txt # 使用strace跟踪rm命令
echo "This is file3.txt" > file3.txt # 创建file3.txt
ln -s file3.txt file4.txt # 创建file3.txt的软链接file4.txt
ls -i file3.txt file4.txt # 查看两个文件的inode值
echo "Modified content for file4.txt" > file4.txt # 修改file4.txt
cat file3.txt # 查看file3.txt的内容是否被更改
rm file3.txt # 删除file3.txt
ls # 查看当前目录,file4.txt是否被删除