软硬链接与Linux文件系统
想要理解硬链接和软链接必须要了解一下什么是Linux的文件系统
文件分类
普通文件 (-)
这个不用说,常见的音频、视频、文本、可执行程序都是普通文件
目录文件 (d)
如果是要查看目录,需要读权限;如果要进入目录,需要该目录具有可执行权限;如果要在目录里修改或者增加文件,那么需要写权限
字符设备文件 (c)
提供连续的数据流,应用程序可以顺序读取,不支持随机存取。 键盘、调制解调器等等都是字符设备文件,在你按键的时候系统只能一个一个从键盘上读取字符,这样的设备就是字符设备
块设备文件 (b)
应用程序可以随机访问设备数据,程序可自行确定读取数据的位置。硬盘、软盘、CD-ROM驱动器和闪存都是典型的块设备,应用程序可以寻址磁盘上的任何位置,并由此读取数据。
套接字文件 (s)
这类文件通常用在网络数据连接。可以启动一个程序来监听客户端的要求,客户端就可以通过套接字来进行数据通信。第一个属性为 [s],最常在 /var/run目录中看到这种文件类型
链接文件 (l)
这个在本文后面将说到!
管道文件 (p)
管道文件可以用于进程间通信,至于什么是管道我会在Linux进程间通信的博客中说到!
文件应该是两部分构成
文件信息+文件内容 ,stat命令可以查看文件的具体信息
1[zcl@localhost ~]$ ll
2total 12
3drwxrwxr-x. 28 zcl zcl 4096 Oct 24 21:56 Code
4drwxr-xr-x. 3 zcl zcl 34 Oct 25 05:02 Desktop
5drwxr-xr-x. 2 zcl zcl 6 Oct 5 00:07 Documents
6drwxr-xr-x. 2 zcl zcl 6 Oct 5 00:07 Downloads
7-rw-rw-r--. 1 zcl zcl 827 Oct 5 00:12 install.sh
8-rw-rw-r--. 1 zcl zcl 60 Oct 11 06:46 makefile
9[zcl@localhost ~]$ stat Code
10 File: ‘Code’
11 Size: 4096 Blocks: 8 IO Block: 4096 directory
12Device: fd00h/64768d Inode: 3270049 Links: 28
13Access: (0775/drwxrwxr-x) Uid: ( 1000/ zcl) Gid: ( 1000/ zcl)
14Context: unconfined_u:object_r:user_home_t:s0
15Access: 2018-10-25 22:29:03.493269180 -0400
16Modify: 2018-10-24 21:56:01.089329792 -0400
17Change: 2018-10-24 21:56:01.089329792 -0400
18 Birth: -
Access:最后访问时间 Modif:文件内容最后修改时间 Change:属性最后修改时间
inode
所以,新建一个文件的主要操作是:
- 存储属性 内核首先找到一个空闲的inode,在这里是34192477,内核把文件信息记录到其中
- 存储数据 该文件存储在三个磁盘块,内核找到了三个空闲块,29,57,1228,将内核缓冲区数据复制到29,下一块复制到57,以此类推
- 记录分配情况 文件按顺序29,57,1228存放,内核在inode上的磁盘分布区记录了上述块列表
- 添加文件名到目录 新的文件名叫做myfile。内核将入口(34192477,myfile)添加到目录文件,文件名核inode之间的对应关系将文件名和文件的内容及属性连接起来
硬链接和软链接
上面我们了解了inode,是不是每个文件都有自己的独立的inode 呢?也不一定
硬链接
在Linux上可以将多个文件名对应同一个inode,那么这个就是硬链接
1[tim@xpu ~]$ touch myfile
2[tim@xpu ~]$ ln myfile mylink
3[tim@xpu ~]$ ls -li myfile mylink
41067027 -rw-rw-r-- 2 tim tim 0 Oct 26 17:38 myfile
51067027 -rw-rw-r-- 2 tim tim 0 Oct 26 17:38 mylink
6[tim@xpu ~]$ ll
7total 16
8drwxrwxr-x 2 tim tim 4096 Oct 16 18:32 11_code
9drwxrwxr-x 2 tim tim 4096 Oct 16 18:32 12_code
10drwxrwxr-x 2 tim tim 4096 Oct 1 22:09 lhl
11-rw-rw-r-- 2 tim tim 0 Oct 26 17:38 myfile
12-rw-rw-r-- 2 tim tim 0 Oct 26 17:38 mylink
13drwxrwxr-x 3 tim tim 4096 Oct 2 18:41 zcl
14[tim@xpu ~]$
我们可以看到myfile和mylink的inode号是一样的,那么这就属于硬链接,所以myfile与mylink共用一个inode,所以所对应的物理设备也是只有一份文件,同样的我们可以看出来myfile和mylink的硬链接数为2,接下来说说目录文件的硬链接数目,每个目录中的子目录都有 .
和 ..
,.
就表示当前目录, ..
就表示上一级目录,所以一个空目录都包含两个硬链接数,如果包含子目录的话那么硬链接数还应该加上子目录的个数,因为子目录中中的每个目录都含有一个 ..
与父目录硬链接,使用ln
命令实现文件之间的硬链接,使用方法在上述代码中已经包含!
软链接
使用ln -s
选项可以建立软链接,软链接有自己独立的inode,软链接保存了其代表的文件的绝对路径,是另外一种文件,在硬盘上有独立的区块,访问时替换自身路径。所以可以把软链接看成是Windows底下的快捷方式!
1[tim@xpu code]$ touch myfile
2[tim@xpu code]$ ln myfile mylink
3[tim@xpu code]$ ll
4total 0
5-rw-rw-r-- 2 tim tim 0 Oct 26 18:00 myfile
6-rw-rw-r-- 2 tim tim 0 Oct 26 18:00 mylink
7[tim@xpu code]$ ln -s myfile _mylink
8[tim@xpu code]$ ls -li
9total 0
101067046 -rw-rw-r-- 2 tim tim 0 Oct 26 18:00 myfile
111067046 -rw-rw-r-- 2 tim tim 0 Oct 26 18:00 mylink
121067047 lrwxrwxrwx 1 tim tim 6 Oct 26 18:01 _mylink -> myfile
接下来加入我们删除myfile,硬链接mylink是正常的,但是软链接却报警告:
不难理解, 对于硬链接只要还存在硬链接那么即使删除其中一个,那么inode也不会释放,那么磁盘数据也不会释放,对于软链接来说,软链接由于是一个独立的文件保存了其指向文件的路径,所以只要myfile被删除,那么路径也就没有意义了!