目录

linux软连接和硬连接

inode

文件还有元数据部分,例如名字、权限等,这就需要一个结构inode来存放。

什么是 inode 呢?inode 的“i”是 index 的意思,其实就是“索引”,类似图书馆的索引区域。既然如此,我们每个文件都会对应一个 inode;一个文件夹就是一个文件,也对应一个 inode。

struct ext4_inode {
	__le16	i_mode;		/* File mode */
	__le16	i_uid;		/* Low 16 bits of Owner Uid */
	__le32	i_size_lo;	/* Size in bytes */
	__le32	i_atime;	/* Access time */
	__le32	i_ctime;	/* Inode Change time */
	__le32	i_mtime;	/* Modification time */
	__le32	i_dtime;	/* Deletion Time */
	__le16	i_gid;		/* Low 16 bits of Group Id */
	__le16	i_links_count;	/* Links count */
	__le32	i_blocks_lo;	/* Blocks count */
	__le32	i_flags;	/* File flags */
......
	__le32	i_block[EXT4_N_BLOCKS];/* Pointers to blocks */
	__le32	i_generation;	/* File version (for NFS) */
	__le32	i_file_acl_lo;	/* File ACL */
	__le32	i_size_high;
......
};

从这个数据结构中,我们可以看出,inode 里面有文件的读写权限 i_mode,属于哪个用户 i_uid,哪个组 i_gid,大小是多少 i_size_io,占用多少个块 i_blocks_io。咱们讲 ls 命令行的时候,列出来的权限、用户、大小这些信息,就是从这里面取出来的。

另外,这里面还有几个与文件相关的时间。i_atime 是 access time,是最近一次访问文件的时间;i_ctime 是 change time,是最近一次更改 inode 的时间;i_mtime 是 modify time,是最近一次更改文件的时间。

这里你需要注意区分几个地方。首先,访问了,不代表修改了,也可能只是打开看看,就会改变 access time。其次,修改 inode,有可能修改的是用户和权限,没有修改数据部分,就会改变 change time。只有数据也修改了,才改变 modify time。

我们平时使用的ls -l里面的数据其实就是取自inode。

硬连接和软连接

一种特殊的文件格式,硬链接(Hard Link)和软链接(Symbolic Link)。

 ln [参数][源文件或目录][目标文件或目录]
#为a生成一个软连接a1
ln -s a a1 

#为a生成一个硬连接a2
ln a a2

硬连接时,a2和a共用一个inode,ls时,a2文件和a信息是一样的。但是 inode 是不跨文件系统的,每个文件系统都有自己的 inode 列表,因而硬链接是没有办法跨文件系统的。

但是软连接就不一样了,a1是单独的inode节点。

-rw-rw-r-- 2 xingliuhua xingliuhua        0 Aug 27 17:21 a
lrwxrwxrwx 1 xingliuhua xingliuhua        1 Aug 27 17:22 a1 -> a
-rw-rw-r-- 2 xingliuhua xingliuhua        0 Aug 27 17:21 a2

还要注意,硬连接的开头并不是l,而软连接开头是l。

硬链接特点 具有相同inode节点号的多个文件互为硬链接文件; 删除硬链接文件或者删除源文件任意之一,文件实体并未被删除; 只有删除了源文件和所有对应的硬链接文件,文件实体才会被删除; 硬链接文件是文件的另一个入口; 可以通过给文件设置硬链接文件来防止重要文件被误删; 创建硬链接命令 ln 源文件 硬链接文件; 硬链接文件是普通文件,可以用rm删除; 对于静态文件(没有进程正在调用),当硬链接数为0时文件就被删除。注意:如果有进程正在调用,则无法删除或者即使文件名被删除但空间不会释放。

软链接特点 软链接类似windows系统的快捷方式; 软链接里面存放的是源文件的路径,指向源文件; 删除源文件,软链接依然存在,但无法访问源文件内容; 软链接失效时一般是白字红底闪烁; 创建软链接命令 ln -s 源文件 软链接文件; 软链接和源文件是不同的文件,文件类型也不同,inode号也不同; 软链接的文件类型是“l”,可以用rm删除。

硬链接和软链接的区别

  • 原理上,硬链接和源文件的inode节点号相同,两者互为硬链接。

  • 软连接和源文件的inode节点号不同,进而指向的block也不同,软连接block中存放了源文件的路径名。所以才能打开时看到是源文件的内容。

  • 使用限制上,不能对目录创建硬链接,不能对不同文件系统创建硬链接,不能对不存在的文件创建硬链接;可以对目录创建软连接,可以跨文件系统创建软连接,可以对不存在的文件创建软连接。