linux 文件系统 - 软链接、硬链接

Inode

  • indoe 块存储了以下信息(文件索引)
    • 文件类型:文件是普通文件、目录、字符设备、块设备、管道、链接还是套接字。
    • 权限:文件的权限位,决定了哪些用户可以读取、写入或执行该文件。
    • 所有者和群组:文件的所有者ID(UID)和群组ID(GID)。
    • 文件大小:文件数据的大小,通常以字节为单位。
    • 时间戳:记录文件的最后访问时间、最后修改时间和状态更改时间。
    • 链接计数:指向该inode的硬链接数。当计数为0时,该文件会被删除。
    • 数据块指针:指向文件系统上存储文件内容的数据块位置的指针。这些指针包括直接指针、间接指针、二级间接指针和三级间接指针。
    • 属性标志:如附加的属性信息,包括是否允许执行备份操作等。
    • 文件系统特定的信息:这可能包括扩展属性、文件系统状态标志等
df -i 

在这里插入图片描述

Block

  • 真实存储文件内容的区块,4个字节一块
  • 当 Inode 或者 Block 满时,都无法再存储内容

符号链接(Symbolic Link,简称symlink)

  • 符号链接是 Unix 和 类Unix 操作系统中的一个功能。它允许你创建一个特殊类型的文件,这个文件实际上是一个指向系统中另一个文件或目录的引用

硬链接

  • 硬链接直接指向文件系统中的数据块(inode),在一个文件有多个硬链接时,是在文件系统中为同一个inode创建了另外的引用,只有当所有的硬链接都被删除后,文件的内容才会被实际删除。

  • 硬链接通常不能跨文件系统(只能在同一个分区),也不能链接目录。因为它指向文件的数据所在的磁盘上的物理位置

    • 如果尝试建立一个指向不同分区(上面的文件系统也不同)的硬链接,内核会拒绝这个操作,因为新分区的文件系统有自己的分区根目录,内核不允许一个文件系统包含指向另一个文件系统根的目录项
    • 防止父目录循环:允许硬链接到目录可能导致父目录关系的逻辑循环,比如 A 目录链接到 B 目录,B 目录又链接回 A 目录,造成无限循环。因为指向的是文件的物理数据块
  • 对硬链接的任何修改都会反映在所有的硬链接文件中,因为它们指向同一个inode。软链接则作为独立的文件存在

  • 删除原文件后,硬链接依然可以访问内容。

    • 在Unix和类Unix系统中,文件数据实际存储在磁盘的块(block)中,而inode则包含了指向这些块的指针。当你在文件系统中创建一个文件时,系统会分配一个inode来存储文件的元数据(如文件大小、权限、所有者等)和文件实际内容的位置信息。每个文件都有一个或多个指向其inode的文件名;这些文件名存储在不同的目录中。这种设计使得硬链接拥有高度的灵活性,并允许文件名与文件数据的半解耦
ln temp.txt temp_hard
  • ll 可以查看硬链接数

在这里插入图片描述

软链接

  • 软链接包含一个指向另一个文件名的文本路径。它是一个独立的文件。如果原始文件被删除或移动,软链接就会变成悬空(broken)的,并且访问它会导致错误
  • 软链接是独立的文件,具有自己的inode和存储空间
    • 它可以指向一个不同分区上的文件,因为它并没有建立一个对实际数据位置的直接引用,而是通过路径来定位原文件。由于文件路径可以在系统内自由引用,因此软链接可以跨分区工作
  • 可跨文件系统,可链接目录
ln -s temp2.txt temp2_link

在这里插入图片描述

node 检测软硬链接

const fs = require('fs');

// 异步版本
fs.lstat('path/to/file', (err, stats) => {
  if (err) throw err;
  if (stats.isSymbolicLink()) {
    console.log('这是一个软链接');
  } else {
    console.log('这是一个普通文件或硬链接');
  }
});


let inode1 = fs.statSync('path/to/file1').ino;
let inode2 = fs.statSync('path/to/file2').ino;

if (inode1 === inode2) {
  console.log('这两个文件是硬链接或者同一文件的不同路径。');
} else {
  console.log('这两个文件不是硬链接。');
}
  • 9
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值