文章目录
Node软链接和硬链接
一、inode
1、什么是inode
维基百科:**inode (index node)**是指在许多“类Unix文件系统”中的一种数据结构,用于描述文件系统对象(包括文件、目录、设备文件、socket、管道等)。每个inode保存了文件系统对象数据的属性和磁盘块(block)位置。文件系统对象属性包含了各种元数据(如:最后修改时间) ,也包含用户组(owner )和权限数据。
阮一峰:文件储存在硬盘上,硬盘的最小存储单位叫做"扇区"(Sector)。每个扇区储存512字节(相当于0.5KB)。操作系统读取硬盘的时候,不会一个个扇区地读取,这样效率太低,而是一次性连续读取多个扇区,即一次性读取一个"块"(block)。这种由多个扇区组成的"块",是文件存取的最小单位。"块"的大小,最常见的是4KB,即连续八个 sector组成一个 block。
每一个文件都有对应的inode
,里面包含了与该文件有关的一些信息。
我们打开一个一个文件时,系统首先找到文件名对应的 inode
号码,然后通过 inode
号码获取inode
信息,然后根据 inode
信息中的文件数据所在 block
读出数据。
2、inode包含信息
- 文件的字节数
- 文件拥有者的User ID
- 文件的Group ID
- 文件的读、写、执行权限
- 文件的时间戳,共有三个:ctime指inode上一次变动的时间,mtime指文件内容上一次变动的时间,atime指文件上一次打开的时间。
- 链接数,即有多少文件名指向这个inode
- 文件数据block的位置
可以通过stat [目标文件名]
命令查看文件的inode信息:
$ stat create_wise_env.sh
File: ‘create_wise_env.sh’
Size: 11824 Blocks: 24 IO Block: 4096 regular file
Device: fd10h/64784d Inode: 6034954 Links: 1
Access: (0775/-rwxrwxr-x) Uid: ( 1000/ work) Gid: ( 1000/ work)
Access: 2021-07-28 12:55:53.213820154 +0800
Modify: 2020-11-11 13:52:44.152682758 +0800
Change: 2020-12-10 20:58:29.672768533 +0800
Birth: -
二、软链接(soft link,也叫符号链接)
如图软链接部分:
通过软链接创建的B文件
会创建自己的inode
,并且他的inode
指向源文件的inode
(注意:不是直接指向磁盘数据);
特点:
- 1、访问:同一源文件通过软链接创建的不同文件指向
源文件的inode
,访问内容相同; - 2、修改:对源文件的修改会映射到所有软链接文件中;
- 3、删除:删除源文件会一并删除源文件的
inode
,访问软链接文件报错No such file or directory
;删除软链接文件不会影响到源文件;
命令:ln -s source target
创建软链接(target
“指向” source
);
三、硬链接
上图硬链接部分:
一般情况,一个文件名"唯一"对应一个 inode
。但是对于硬链接机制, linux
允许多个文件都指向同一个 inode
。
特点:
- 1、访问:可以使用不同对文件名访问同样的内容;
- 2、修改:对文件内容进行修改将映射到所有文件内容改变;
- 3、删除:删除一个文件不影响另一个文件对访问(此时可以认为每个文件都是源文件,删除文件只是删除文件名不会删除其指向的
inode
);
命令:ln source target
来创建硬链接;
四、软链接 vs 硬链接
- 使用
ln source target
建立硬链接;使用ln -s source target
建立软链接; - 硬链接不会创建额外
inode
,和源文件共用同一个inode
;软链接会创建额外一个文件和inode
,但是软链接文件inode
指向源文件的inode
; - 建立硬链接时,
source
必须存在且只能是文件;建立软链接时,source
可以不存在而且可以是目录; - 删除源文件不会影响硬链接文件的访问(因为
inode
还在);删除源文件会影响软链接文件的访问(因为指向的inode
已经不存在了); - 对于已经建立的同名链接,不能再次建立,除非删掉或者使用
-f
参数;
五、创建
ln -potions source target
options:
- -i 交互模式,文件存在则提示用户是否覆盖;
- -s 软链接(符号链接);
- -d 允许超级用户制作目录的硬链接;
- -b 删除,覆盖以前建立的链接;
- -f 强制执行;
- -n 把符号链接视为一般目录;
- -v 显示详细的处理过程;
六、–preserve-symlinks
主要介绍的是node
的软链接和硬链接,为什么要提及--preserve-symlinks
呢?从一个官方实例进行说明:
{appDir}
├── app
│ ├── index.js
│ └── node_modules
│ ├── moduleA -> {appDir}/moduleA
│ └── moduleB
│ ├── index.js
│ └── package.json
└── moduleA
├── index.js
└── package.json
前提条件:
/app/node_modules/moduleA
是/moduleA
的软链接文件;/moduleA
文件中引用/app/node_modules/moduleB
依赖:require('./moduleB')
;正常执行到
/app/node_modules/moduleA
:
- 1、
/app/node_modules/moduleA
会指到/moduleA
;- 2、
/moduleA
中无法找到/moduleB
,报错;添加
--preserve-symlinks
命令执行:
Node.js
使用模块的软链接路径而不是真实路径,是软链接连接的同行依赖能被找到。