Linux那点事-文件系统(详解软加载和硬加载)

理解 Linux 的硬链接与软链接

1. Linux文件和目录

现代操作系统为解决信息能独立于进程之外被长期存储引入了文件,文件作为进程创建信息的逻辑单元可被多个进程并发使用。

在UNIX系统中,操作系统为磁盘上的文本与图像、鼠标与键盘等输入设备及网络交互等IO操作设计了一组通用API,使他们被处理时均可统一使用字节流方式。换言之,UNIX系统除进程之外一切均是文件,而Linux保持了这一特性。为了便于文件管理,Linux引入了目录这一概念。

Linux与其他类似UNIX系统一样并不区分文件和目录:目录是记录其他文件名的文件。

2. 硬链接与软连接的联系和区别

我们知道文件都有文件名与数据,这在Linux被分为两个部分:用户数据(user data)与元数据(metadata)

  • 用户数据:即文件数据块(data block),数据块是记录文件真实内容的地方。

  • 元数据:是文件的附加属性,如文件大小、创建时间、所有者等信息。

在Linux中,元数据的inode号(inode是文件元数据的一部分但是不包含文件名,inode号即索引节点号)才是文件的唯一标识而非文件名。文件名仅是便于方便人们的记忆和使用,系统或程序通过inode号寻找正确的文件数据块。

Linux那点事-文件系统(详解软加载和硬加载)_第1张图片
通过文件名打开文件

在Linux系统中查看inode号可使用命令statls -i

为解决文件的共享使用,Linux系统引入了两种链接:硬链接(hard link)与软链接(又称符号链接,即soft link或symbolic link)。链接为Linux系统解决文件的共享使用,还带来了隐藏文件路径、增加权限安全、节省存储等好处。

2.1 硬链接

若一个inode号对应多个文件名,则称这些文件为硬链接,换言之: 硬链接就是同一个文件使用了多个别名。

硬链接的特点:
由于硬链接是有着相同的inode号仅文件名不同的文件,所以硬链接存在以下几个特点:

  1. 文件有相同的inode及data block;
  2. 只能对已存在的文件进行创建;
  3. 不能交叉文件系统进行硬链接的创建;(不同的文件系统文件的inode不同);
  4. 不能对目录进行创建,只可以对文件创建;
  5. 删除一个硬链接文件并不影响其他有着相同inode号的文件。

2.2 软连接

若用户数据块存放的内容是另一文件的路径名指向,则改文件就是软连接。软连接是一个普通的文件,只是数据块的内容有点特殊。软连接有着自己的inode号以及用户数据块。因此软连接的创建和使用没有类似硬链接的诸多限制。

Linux那点事-文件系统(详解软加载和硬加载)_第2张图片
软连接的访问
  • 软连接有着自己的文件属性及权限;
  • 可对不存在的文件或目录创建软连接;
  • 软连接可交叉文件系统;
  • 软连接可对文件或目录创建;
  • 创建软连接时,连接计数i_nlink不会增加;
  • 删除软连接并不影响被指向的文件,若被指向的原文件被删除,则相关软连接被称为死链接(即dangling link,若被指向路径被重新出创建,死链接可恢复成正常的链接)。

当然软连接的用户数据也可以是另外一个软连接的路径,其解析过程是递归的。但需注意:软链接创建时原文件的路径使用绝对路径比较好。使用相对路径创建的软连接被移动后该软链接文件将成为一个死链接。因为链接数据块中记录的亦是相对路径指向。

3. 链接相关的命令

1. 创建软/硬链接的命令

ln命令用于给文件创建链接,根据Linux系统存储文件的特点,链接的方式一般分为两种。

  • 软连接:类似windows系统给文件创建的快捷方式,即产生一个特殊的文件(数据块),该文件用来指向另一个文件,此链接方式同样适用于目录。

  • 硬链接:相当于文件的别名,他们拥有着相同的inode号。

格式:ln [选项] [源目标] [目标文件]

选项:

  • -s:建立软连接文件,如果不加“-s”选项,则建立硬链接。
  • -f:强制。如果目标文件已存在,则删除目标文件后再建立软连接。

2. 删除软连接

ln -s软链接删除方式及注意事项

1. 正确的删除方式:
rm -rf ./test_chk_ln

Linux那点事-文件系统(详解软加载和硬加载)_第3张图片
正确删除软连接的方式

2. 错误的删除方式

rm -rf ./test_chk_ln/ (这样就会把原来test_chk下的内容删除比正确删除的方式多了一个/)

Linux那点事-文件系统(详解软加载和硬加载)_第4张图片
错误的删除方式

这样会将源文件删除!

3. 查看软/硬链接

  1. df -i使用命令df查看当前系统中挂载的文件系统类型、各文件系统inode使用情况以及文件系统的挂载点。值得一提的是:Linux系统存在inode号已经用完但是磁盘空间还有剩余的情况。
pf查看文件系统的Inode
  1. 在Linux中查看当前系统已挂载的文件系统类型,还可以使用mount命令或查看文件/proc/mounts
Linux那点事-文件系统(详解软加载和硬加载)_第5张图片
mount查看挂载的文件系统
  1. ls -i获取stat可以区分软连接与其他文件并查看文件的inode号。

  2. find命令查找软链接和硬链接

    • 查看路径 /home 有相同 inode 的所有硬链接find ./test -samefile 文件名
    • 查询所有的硬链接也可以使用find ./test -inum Inode
    • 列出某个目录下的所有软连接文件find ./test -type l -ls
find命令
  1. 系统根据磁盘的大小默认设定了inode的值,如若必要,可以在格式化文件系统前对该值进行修改。mkfs -t ext4 -I 512/dev/sda4,将使磁盘设备 /dev/sda4 格式成 inode 大小是 512 字节的 ext4 文件系统。

2. Linux VFS

Linux有着极其丰富的文件系统,大体可分为如下几类:

  1. 网络文件系统,如nfs、cifs;
  2. 磁盘文件系统,如ext4、ext3;
  3. 特殊文件系统,如proc、sysfs、ramfs等;

实现以上这些文件系统并在Linux下共存的基础就是Linux VFS即虚拟文件系统。VFS是一个通用的文件系统,抽象了文件系统的四个基本概念:文件(file)、目录项(dentry)、索引节点(inode)及挂载点。其在内核中为用户空间层的文件系统提供了相关的接口。VFS实现了open()read()等系统调用并使得cp等用户空间程序可跨文件系统。

Linux那点事-文件系统(详解软加载和硬加载)_第6张图片
VFS在系统中的架构

Linux VFS存在的四个基本对象:超级块对象(superblock object)、目录项对象(dentry object)、索引节点对象(inode object)、文件对象(file object)。他们之间的关系:

Linux那点事-文件系统(详解软加载和硬加载)_第7张图片
VFS的对象之间的处理

·

你可能感兴趣的:(Linux那点事-文件系统(详解软加载和硬加载))