软连接与硬链接的使用与区别
ln 命令用于给文件创建链接,根据 Linux 系统存储文件的特点,链接的方式分为以下 2 种:
-
软链接:类似于 Windows 系统中给文件创建快捷方式,即产生一个特殊的文件,该文件用来指向另一个文件,此链接方式同样适用于目录。
-
硬链接:我们知道,文件的基本信息都存储在 inode 中,而硬链接指的就是给一个文件的 inode 分配多个文件名,通过任何一个文件名,都可以找到此文件的 inode,从而读取该文件的数据信息。
ln 命令的基本格式如下:
-
ln [选项] 源文件 目标文件
-
ln 源文件 目标文件 硬链接
-
ln -s 源文件(写绝对路径) 目标文件 软连接
选项:
-
-s:建立软链接文件。如果不加 "-s" 选项,则建立硬链接文件;
-
-f:强制。如果目标文件已经存在,则删除目标文件后再建立链接文件;
例:
/home/user1/file
硬链接:ln /home/user1/filehard filehard_cs.txt 为/home/user1/filehard文件创建名为filehard_cs.txt的硬链接
软连接:ln -s /home/user1/filesoft filesoft_cs.txt 为/home/user1/filesoft文件创建名为filesoft_cs.txt的软连接
由图可见,硬链接和源文件的 inode号是相同的,硬链接filehard_cs.txt中存的信息是源文件的inode号(删除源文件,硬链接文件仍可查看)
软连接和源文件inode号是不相同的,软连接文件中存的是源文件路径,通过源文件路径找到源文件,再通过源文件inode信息找到存放源文件数据的inode块并读取。(删除源文件不能查看软连接文件)
inode和block
ext4 文件系统会把分区主要分为两大部分(暂时不提超级块):小部分用于保存文件的 inode (i 节点)信息;剩余的大部分用于保存 block 信息。
格式化分区就是向分区中写入inode信息
超级块:掌管全局,用来控制硬盘上总共有多少编号可以被分配,那些编号是 free 状态
在Unix/Liunx系统中,目录也是一种文件。目录文件的结构非常简单,即使一系列目录项的列表。每个目录项由所包含文件的文件名以及该文件名对应的inode号组成。
可以使用’ls -id [directory]’快速查看目录的inode号:
inode 的默认大小为 128 Byte,用来记录文件的权限(r、w、x)、文件的所有者和属组、文件的大小、文件的状态改变时间(ctime)、文件的最近一次读取时间(atime)、文件的最近一次修改时间(mtime)、文件的数据真正保存的 block 编号。每个文件需要占用一个 inode。大家如果仔细查看,就会发现 inode 中是不记录文件名的,那是因为文件名记录在文件所在目录的 block 中。
block 的大小可以是 1KB、2KB、4KB,默认为 4KB。block 用于实际的数据存储,如果一个 block 放不下数据,则可以占用多个 block。例如,有一个 10KB 的文件需要存储,则会占用 3 个 block,虽然最后一个 block 不能占满,但也不能再放入其他文件的数据。这 3 个 block 有可能是连续的,也有可能是分散的。
结论:
每个文件都单独占用一个inode,文件内容由inode的记录来指向(文件内容实际存储于block块)
如果想读取文件名,必须先读取目录中记录的文件名找到该文件的inode,再读取该文件的inode信息来获取文件数据存放在哪一个block块中
Linux中文件和目录都可以视为文件,占用单独的inode块,文件的block存储真实数据,目录的block块存储目录下文件的名称和inode号
例: dysk001 用户
cat /home/a.txt
首先 找到根目录的inode(根目录的inode号是系统已知的,为2) 然后判断dysk001用户是否有权限访问根目录的block块
若有权限访问,则到根目录下找到/home目录的inode号,进而找到/home的文件名和inode编号,
通过/home的inode编号获取/home的inode信息,判断dysk001是否有权限访问/home的block块,
若有读取权限,读取/home的block块找到其中a.txt的文件名和inode号,
然后根据/home/a.txt的inode号找到a.txt的inode信息,紧接着判断dysk001是否有权限访问a.txt的block块
有权限根据a.txt的inode信息指向找到真正存储a.txt数据的block块,完成读取操作。