Node.js 如何创建软连接,与硬链接区别是什么?

发表于 3年以前  | 总阅读数:494 次

前言

写这篇文章的原因

  1. 最近在做一些工程化相关的内容,有使用到 fs.symlink(target,path), 查看 Node.js 文档发现讲的一般!所以这里详细整理下,并且记得之前在 Linux 下直接使用命令创建软链通过 ls -s source_file target_file 在想这两个参数位置有些怎么不一致呢?
  2. 本文是我上一篇工程化系列文章中的一个小插曲,上篇文章 [ 现代前端工程化-彻底搞懂基于 Monorepo 的 lerna 模块(从原理到实战)] 有提到软链接,那篇没有对软硬链接没有进行详细讲解,只是简单介绍了 fs.symlink 中软链接创建的基本使用,本文进行详细展开下。
  3. 软连接的创建应用场景还是比较广泛,比如 npm link 调试, leran 内部模块互相引用等等。

inode

在讲解软/硬链接之前,先了解一个 linux 系统中重要的概念 inode 。众所周知,文件存储在硬盘上,硬盘的最小存储单位叫做 "扇区"( Sector,每个扇区存储 512 字节).操作系统读取硬盘的时候,不会一个个扇区地读取,因为这样效率太低,而是一次性连续读取多个扇区,这种一次性读取的连续多个扇区就是"块"( block )。这种由多个扇区组成的"块",是文件存取的最小单位。"块"的大小,最常见的是 4KB,即连续八个 sector 组成一个 block

文件数据都储存在 "块" 中,那么很显然,我们还必须找到一个地方储存文件的元信息,比如文件的创建者、文件的创建日期、文件的大小等等。这种储存文件元信息的区域就叫做 inode ,中文译名为 "索引节点"

注意:我们打开一个一个文件时,系统首先找到文件名对应的 inode 号码,然后通过 inode 号码获取inode 信息,然后根据 inode 信息中的文件数据所在 block 读出数据。

上述概念的文章内容比较多,不太容易记忆,看图!

image.png

inode 中包括了哪些内容 ?

inode包含文件的元信息,具体来说有以下内容:

  1. 文件的字节数
  2. 文件拥有者的User ID
  3. 文件的 Group ID
  4. 文件的读、写、执行权限
  5. 文件的时间戳,共有三个:ctimeinode上一次变动的时间,mtime 指文件内容上一次变动的时间,atime 指文件上一次打开的时间。
  6. 链接数,即有多少文件名指向这个 inode
  7. 文件数据 block 的位置

linux 命令如何获取一个文件的 inode 信息

可以直接使用 linux 命令 stat 查看某个文件的 inode 信息

stat example.js

输出信息

xiaohun node % stat example.js
16777223 11904170 -rw-r--r-- 1 xiaohun staff 0 0 "Mar 24 13:46:08 2021" "Mar 24 13:46:08 2021" "Mar 24 13:46:26 2021" "Mar 24 13:46:08 2021" 4096 0 0x40 example.js

Node.js 中如何获取一个文件的 inode 信息

Node.js 中,fs 提供了 stat 函数查看相关信息

fs.statSync('./example.js');

输出信息

文件信息 Stats {
  dev: 16777223,
  mode: 33188,
  nlink: 1,
  uid: 501,
  gid: 20,
  rdev: 0,
  blksize: 4096,
  ino: 11904170,
  size: 0,
  blocks: 0,
  atimeMs: 1616564768255.48,
  mtimeMs: 1616564768255.48,
  ctimeMs: 1616564786778.5532,
  birthtimeMs: 1616564768255.48,
  atime: 2021-03-24T05:46:08.255Z,
  mtime: 2021-03-24T05:46:08.255Z,
  ctime: 2021-03-24T05:46:26.779Z,
  birthtime: 2021-03-24T05:46:08.255Z
}

每一个 inode 都有一个唯一的标识码 ,上面的输出信息中 ino 就是 inode 的唯一标识码,在 linux 系统内部使用 inode 的标识码来识别文件,并不使用文件名。之前系的

linux 系统中,目录也是一种文件。目录文件包含一系列目录项,每一个目录项由两部分组成:所包含文件的文件名,以及文件名对应的 inode 标识码。我们可以使用 ls -i 来列出目录中的文件以及所有的 inde 标识码。这里也可以解释可能小伙伴们觉得说不通的问题,仅修改目录的读权限,并不能实现读取目录下所有文件内容的原因,最后需要通过递归目录下的文件来进行修改

软链接与硬链接

什么是软链接(soft link,也叫符号链接)

image.png 软链接类似于 Window 中的 “快捷方式” 。创建软链接会创建一个新的 inode,比如为文件 a 创建了软链接文件b,文件 b 内部会指向 ainode。当我们读取文件b的时候,系统会自动导向文件 a ,文件 b 就是文件 a 软连接(或者叫符号链接)。

  • 访问:创建了软链接后我们就可以使用不同的文件名访问相同的内容,
  • 修改:修改文件 a 的内容,文件 b 的内容也会发生改变,对文件内容的修改向放映到所有文件。
  • 删除:当我们删除源文件 a 时,在访问软连接文件b是,会报错 "No such file or directory"

可以直接使用 linux 命令 ln -s source target 来创建软链接(注意:表示 target "指向" source

ln -s ./target/a.js b.js

执行 shell 命令后,会出现 b.js 文件,软链接创建成功。

image.png

Node.js 中创建软链接

基础用法

Node.js 官方文档提供了 symlinkSync 函数创建软链接。

fs.symlinkSync(target,path,type)

target <string> | <Buffer> | <URL>   // 目标文件
path <string> | <Buffer> | <URL>  // 创建软链对应的地址
type <string>

它会创建名为 path 的链接,该链接指向 targettype 参数仅在 Windows 上可用,在其他平台上则会被忽略。它可以被设置为 'dir''file''junction'。如果未设置 type 参数,则 Node.js 将会自动检测 target 的类型并使用 'file''dir'。如果 target 不存在,则将会使用 'file'Windows 上的连接点要求目标路径是绝对路径。当使用 'junction' 时, target 参数将会自动地标准化为绝对路径。

  • 使用示例
const res = fs.symlinkSync('./target/a.js','./b.js');

image.png

这段代码的意思是为 创建一个软链接 b.js 指向了文件 ./targert/a.js,当 a.js 中的内容发生变化时,b.js 文件也会发生相同的改变。

⚠️注意:如果对目录创建软链接,方法中第三个参数需要传'dir'(虽然第三个参数只在windows下生效,这样传递可以确保跨平台不会出现问题): fs.symlink(target,path,'dir')

上面讲解了 linuxNode.js 创建软链接的两种方式,认真看的小伙伴可能发现问题,为什么 Node.jsfs.symlink(target,path)shell 命令中的 ln -s source target 两个参数好像是反的呢,是不是会有这样的疑问?

其实如果前面的小例子你都尝试了,会发现后面传递的两个参数顺序实际是一致的,都是让后面新建的的"指向=>"前面的哦!

什么是硬链接(hard link)

一般情况,一个文件名"唯一"对应一个 inode。但是 linux 允许多个文件名都指向同一个 inode。表示我们可以使用不同对文件名访问同样的内容;对文件内容进行修改将放映到所有文件;删除一个文件不影响另一个文件对访问。这种机制就被称为"硬链接"

硬链接的创建

可以直接使用 linux 命令 ln source target 来创建硬链接(注意:source 已存在的文件,target 是将要建立的链接)

ln ./target/a.js c.js

执行 shell 命令后,会出现 c.js 文件,硬链接创建成功。

image.png

与软连接不同,只能给文件建立硬链接,不能给目录建立硬链接。并且source文件必须存在,否则创建硬链接时会报错。

删除一个文件不会影响另一个文件的访问。原因是什么?实际上,文件 inode 中还有一个链接数的信息,每多一个文件指向这个 inode,该数字就会加 1,每少一个文件指向这个 inode,该数字就会减 1,当值减到 0,系统就自动回收 inode 及其对应的 block 区域。很像是一种引用计数的垃圾回收机制。

当我们对某个文件建立了硬链接后,对应的 inode 的链接数会是`2(原文件本身已经有一个指向),当删除一个文件时,链接数变成1,并没达到回收的条件,所以我们还是可以访问文件。

软链接与硬链接对比分析总结

  1. 使用 ln source target 建立硬链接;使用 ln -s source target 建立软链接
  2. 硬链接不会创建额外 inode,和源文件共用同一个 inode;软链接会创建额外一个文件(额外 inode),指向源文件的 inode
  3. 建立硬链接时,source 必须存在且只能是文件;建立软链接时,source 可以不存在而且可以是目录
  4. 删除源文件不会影响硬链接文件的访问(因为 inode 还在);删除源文件会影响软链接文件的访问(因为指向的 inode 已经不存在了)
  5. 对于已经建立的同名链接,不能再次建立,除非删掉或者使用 -f 参数

应用场景

npm link

npm link 的原理也是通过软链来实现的。当我们想要调试本地开发的 npm 模块包(还没有发布或者修改了一些内容)时,需要使用 npm link 来进行调试 举个例子:

image.png有两个项目 create-mono-repocreate-mono-repo-testClicreate-mono-repo 项目节点下执行 npm link成功后 ,在 create-mono-repo-testCli 项目目录下执行 npm link create-mono-repo 这样就可以完成调试了

lerna

lerna 创建的项目, packages 目录下各模块互相依赖也是基于 fs.symlinkSync 创建软链接实现的。

具体实现代码和地址如下:

源码对应地址 https://github.com/lerna/lerna/tree/main/utils/create-symlink

function createSymbolicLink(src, dest, type) {
  log.silly("createSymbolicLink", [src, dest, type]);

  return fs
    .lstat(dest)
    .then(() => fs.unlink(dest))
    .catch(() => {
      /* nothing exists at destination */
    })
    .then(() => fs.symlink(src, dest, type));
}

参考文章

1 . 关于inode的讲解 https://www.ruanyifeng.com/blog/2011/12/inode.html

2 . lerna 源码 https://github.com/lerna/lerna

本文由哈喽比特于3年以前收录,如有侵权请联系我们。
文章来源:https://mp.weixin.qq.com/s/J7puCsMv_Rci_TE0KUbWZA

 相关推荐

刘强东夫妇:“移民美国”传言被驳斥

京东创始人刘强东和其妻子章泽天最近成为了互联网舆论关注的焦点。有关他们“移民美国”和在美国购买豪宅的传言在互联网上广泛传播。然而,京东官方通过微博发言人发布的消息澄清了这些传言,称这些言论纯属虚假信息和蓄意捏造。

发布于:1年以前  |  808次阅读  |  详细内容 »

博主曝三大运营商,将集体采购百万台华为Mate60系列

日前,据博主“@超能数码君老周”爆料,国内三大运营商中国移动、中国电信和中国联通预计将集体采购百万台规模的华为Mate60系列手机。

发布于:1年以前  |  770次阅读  |  详细内容 »

ASML CEO警告:出口管制不是可行做法,不要“逼迫中国大陆创新”

据报道,荷兰半导体设备公司ASML正看到美国对华遏制政策的负面影响。阿斯麦(ASML)CEO彼得·温宁克在一档电视节目中分享了他对中国大陆问题以及该公司面临的出口管制和保护主义的看法。彼得曾在多个场合表达了他对出口管制以及中荷经济关系的担忧。

发布于:1年以前  |  756次阅读  |  详细内容 »

抖音中长视频App青桃更名抖音精选,字节再发力对抗B站

今年早些时候,抖音悄然上线了一款名为“青桃”的 App,Slogan 为“看见你的热爱”,根据应用介绍可知,“青桃”是一个属于年轻人的兴趣知识视频平台,由抖音官方出品的中长视频关联版本,整体风格有些类似B站。

发布于:1年以前  |  648次阅读  |  详细内容 »

威马CDO:中国每百户家庭仅17户有车

日前,威马汽车首席数据官梅松林转发了一份“世界各国地区拥车率排行榜”,同时,他发文表示:中国汽车普及率低于非洲国家尼日利亚,每百户家庭仅17户有车。意大利世界排名第一,每十户中九户有车。

发布于:1年以前  |  589次阅读  |  详细内容 »

研究发现维生素 C 等抗氧化剂会刺激癌症生长和转移

近日,一项新的研究发现,维生素 C 和 E 等抗氧化剂会激活一种机制,刺激癌症肿瘤中新血管的生长,帮助它们生长和扩散。

发布于:1年以前  |  449次阅读  |  详细内容 »

苹果据称正引入3D打印技术,用以生产智能手表的钢质底盘

据媒体援引消息人士报道,苹果公司正在测试使用3D打印技术来生产其智能手表的钢质底盘。消息传出后,3D系统一度大涨超10%,不过截至周三收盘,该股涨幅回落至2%以内。

发布于:1年以前  |  446次阅读  |  详细内容 »

千万级抖音网红秀才账号被封禁

9月2日,坐拥千万粉丝的网红主播“秀才”账号被封禁,在社交媒体平台上引发热议。平台相关负责人表示,“秀才”账号违反平台相关规定,已封禁。据知情人士透露,秀才近期被举报存在违法行为,这可能是他被封禁的部分原因。据悉,“秀才”年龄39岁,是安徽省亳州市蒙城县人,抖音网红,粉丝数量超1200万。他曾被称为“中老年...

发布于:1年以前  |  445次阅读  |  详细内容 »

亚马逊股东起诉公司和贝索斯,称其在购买卫星发射服务时忽视了 SpaceX

9月3日消息,亚马逊的一些股东,包括持有该公司股票的一家养老基金,日前对亚马逊、其创始人贝索斯和其董事会提起诉讼,指控他们在为 Project Kuiper 卫星星座项目购买发射服务时“违反了信义义务”。

发布于:1年以前  |  444次阅读  |  详细内容 »

苹果上线AppsbyApple网站,以推广自家应用程序

据消息,为推广自家应用,苹果现推出了一个名为“Apps by Apple”的网站,展示了苹果为旗下产品(如 iPhone、iPad、Apple Watch、Mac 和 Apple TV)开发的各种应用程序。

发布于:1年以前  |  442次阅读  |  详细内容 »

特斯拉美国降价引发投资者不满:“这是短期麻醉剂”

特斯拉本周在美国大幅下调Model S和X售价,引发了该公司一些最坚定支持者的不满。知名特斯拉多头、未来基金(Future Fund)管理合伙人加里·布莱克发帖称,降价是一种“短期麻醉剂”,会让潜在客户等待进一步降价。

发布于:1年以前  |  441次阅读  |  详细内容 »

光刻机巨头阿斯麦:拿到许可,继续对华出口

据外媒9月2日报道,荷兰半导体设备制造商阿斯麦称,尽管荷兰政府颁布的半导体设备出口管制新规9月正式生效,但该公司已获得在2023年底以前向中国运送受限制芯片制造机器的许可。

发布于:1年以前  |  437次阅读  |  详细内容 »

马斯克与库克首次隔空合作:为苹果提供卫星服务

近日,根据美国证券交易委员会的文件显示,苹果卫星服务提供商 Globalstar 近期向马斯克旗下的 SpaceX 支付 6400 万美元(约 4.65 亿元人民币)。用于在 2023-2025 年期间,发射卫星,进一步扩展苹果 iPhone 系列的 SOS 卫星服务。

发布于:1年以前  |  430次阅读  |  详细内容 »

𝕏(推特)调整隐私政策,可拿用户发布的信息训练 AI 模型

据报道,马斯克旗下社交平台𝕏(推特)日前调整了隐私政策,允许 𝕏 使用用户发布的信息来训练其人工智能(AI)模型。新的隐私政策将于 9 月 29 日生效。新政策规定,𝕏可能会使用所收集到的平台信息和公开可用的信息,来帮助训练 𝕏 的机器学习或人工智能模型。

发布于:1年以前  |  428次阅读  |  详细内容 »

荣耀CEO谈华为手机回归:替老同事们高兴,对行业也是好事

9月2日,荣耀CEO赵明在采访中谈及华为手机回归时表示,替老同事们高兴,觉得手机行业,由于华为的回归,让竞争充满了更多的可能性和更多的魅力,对行业来说也是件好事。

发布于:1年以前  |  423次阅读  |  详细内容 »

AI操控无人机能力超越人类冠军

《自然》30日发表的一篇论文报道了一个名为Swift的人工智能(AI)系统,该系统驾驶无人机的能力可在真实世界中一对一冠军赛里战胜人类对手。

发布于:1年以前  |  423次阅读  |  详细内容 »

AI生成的蘑菇科普书存在可致命错误

近日,非营利组织纽约真菌学会(NYMS)发出警告,表示亚马逊为代表的电商平台上,充斥着各种AI生成的蘑菇觅食科普书籍,其中存在诸多错误。

发布于:1年以前  |  420次阅读  |  详细内容 »

社交媒体平台𝕏计划收集用户生物识别数据与工作教育经历

社交媒体平台𝕏(原推特)新隐私政策提到:“在您同意的情况下,我们可能出于安全、安保和身份识别目的收集和使用您的生物识别信息。”

发布于:1年以前  |  411次阅读  |  详细内容 »

国产扫地机器人热销欧洲,国产割草机器人抢占欧洲草坪

2023年德国柏林消费电子展上,各大企业都带来了最新的理念和产品,而高端化、本土化的中国产品正在不断吸引欧洲等国际市场的目光。

发布于:1年以前  |  406次阅读  |  详细内容 »

罗永浩吐槽iPhone15和14不会有区别,除了序列号变了

罗永浩日前在直播中吐槽苹果即将推出的 iPhone 新品,具体内容为:“以我对我‘子公司’的了解,我认为 iPhone 15 跟 iPhone 14 不会有什么区别的,除了序(列)号变了,这个‘不要脸’的东西,这个‘臭厨子’。

发布于:1年以前  |  398次阅读  |  详细内容 »
 相关文章
Android插件化方案 5年以前  |  237231次阅读
vscode超好用的代码书签插件Bookmarks 2年以前  |  8065次阅读
 目录