细讲Node软链接和硬链接

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 硬链接

  1. 使用ln source target 建立硬链接;使用ln -s source target建立软链接;
  2. 硬链接不会创建额外inode,和源文件共用同一个 inode;软链接会创建额外一个文件和inode,但是软链接文件inode指向源文件的inode
  3. 建立硬链接时,source必须存在且只能是文件;建立软链接时,source 可以不存在而且可以是目录;
  4. 删除源文件不会影响硬链接文件的访问(因为inode还在);删除源文件会影响软链接文件的访问(因为指向的inode已经不存在了);
  5. 对于已经建立的同名链接,不能再次建立,除非删掉或者使用-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使用模块的软链接路径而不是真实路径,是软链接连接的同行依赖能被找到。

参考

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值