Linux--硬链接和软链接

2023-11-03

文件都有文件名与数据,这在 Linux 上被分成两个部分:用户数据 (user data) 与元数据 (metadata)。
用户数据,即文件数据块 (data block),数据块是记录文件真实内容的地方;而元数据则是文件的附加属性,如文件大小、创建时间、所有者等信息。
在 Linux 中,元数据中的 inode 号(inode 是文件元数据的一部分但其并不包含文件名,inode 号即索引节点号)才是文件的唯一标识而非文件名。文件名仅是为了方便人们的记忆和使用,系统或程序通过 inode 号寻找正确的文件数据块。如下展示了程序通过文件名获取文件内容的过程。
在这里插入图片描述
为解决文件的共享使用,Linux 系统引入了两种链接:硬链接 (hard link) 与软链接(又称符号链接,即 soft link 或 symbolic link)。链接为 Linux 系统解决了文件的共享使用,还带来了隐藏文件路径、增加权限安全及节省存储等好处。默认情况下,ln 命令产生硬链接,ln -s命令产生软链接。
由于硬链接是有着相同 inode 号仅文件名不同的文件,因此硬链接存在以下几点特性:

  1. 文件有相同的 inode 及 data block;
  2. 只能对已存在的文件进行创建;
  3. 不能交叉文件系统进行硬链接的创建;
  4. 不能对目录进行创建,只可对文件创建;
  5. 删除一个硬链接文件并不影响其他有相同 inode 号的文件。
    硬链接不能对目录创建是受限于文件系统的设计。现 Linux 文件系统中的目录均隐藏了两个个特殊的目录:当前目录(.)与父目录(…),查看这两个特殊目录的 inode 号可知其实这两目录就是两个硬链接。若系统允许对目录创建硬链接,则会产生目录环。

软链接与硬链接不同,若文件用户数据块中存放的内容是另一文件的路径名的指向,则该文件就是软连接。软链接就是一个普通文件,只是数据块内容有点特殊。软链接有着自己的 inode 号以及用户数据块。因此软链接的创建与使用没有类似硬链接的诸多限制:

  1. 软链接有自己的文件属性及权限等;
  2. 可对不存在的文件或目录创建软链接;
  3. 软链接可交叉文件系统;
  4. 软链接可对文件或目录创建;
  5. 创建软链接时,链接计数 i_nlink 不会增加;
  6. 删除软链接并不影响被指向的文件,但若被指向的原文件被删除,则相关软连接被称为死链接(danglinglink,若被指向路径文件被重新创建,死链接可恢复为正常的软链接)。

软链接访问
在这里插入图片描述

[root@hecs-x-large-2-linux-20200618180145 1]# ll -i
total 0
1841539 -rw-r--r-- 1 root root 0 Jul 14 21:26 1.file
[root@hecs-x-large-2-linux-20200618180145 1]# ln 1.file 2.file
[root@hecs-x-large-2-linux-20200618180145 1]# ll -i
total 0
1841539 -rw-r--r-- 2 root root 0 Jul 14 21:26 1.file
1841539 -rw-r--r-- 2 root root 0 Jul 14 21:26 2.file
[root@hecs-x-large-2-linux-20200618180145 1]# ln -s 1.file 3.file
[root@hecs-x-large-2-linux-20200618180145 1]# ll -i
total 0
1841539 -rw-r--r-- 2 root root 0 Jul 14 21:26 1.file
1841539 -rw-r--r-- 2 root root 0 Jul 14 21:26 2.file
1841540 lrwxrwxrwx 1 root root 6 Jul 14 21:26 3.file -> 1.file
#查找相同inode的文件(即硬链接)
[root@hecs-x-large-2-linux-20200618180145 1]# find ./ -inum 1841539
./1.file
./2.file
[root@hecs-x-large-2-linux-20200618180145 1]# rm -rf 1.file
[root@hecs-x-large-2-linux-20200618180145 1]# ll -i
total 4
1841539 -rw-r--r-- 1 root root 6 Jul 14 21:27 2.file
1841540 lrwxrwxrwx 1 root root 6 Jul 14 21:26 3.file -> 1.file

补充一下ll各个位置的表示属性

[root@hecs-x-large-2-linux-20200618180145 1]# ll
total 4
-rw-r--r-- 2 root root 0 Jul 14 21:33 1.file

第一个栏位,表示文件的属性。Linux的文件基本上分为三个属性:可读(r),可写(w),可执行(x)。
这里有十个格子可以添(具体程序实现时,实际上是十个bit位)。
第一个字母表示文件类型,
”-”,普通文件.
”d”目录,字母”d”,是dirtectory(目录)的缩写.
“l”符号链接。请注意,一个目录或者说一个文件夹是一个特殊文件,这个特殊文件存放的是其他文件和文件夹的相关信息.
“b”块设备文件。
“c”字符设备文件。
紧接着的3*3个字符分3组,各指示此文件的读、写、执行权限,对于owner、group、others而言。
因为Linux是多用户多任务系统,所以一个文件可能同时被许多人使用,所以我们一定要设好每个文件的权限,其文件的权限位置排列顺序是(以-rwxr-xr-x为例):  
rwx(Owner)r-x(Group)r-x(Other)  
这个例子表示的权限是:使用者自己可读,可写,可执行;同一组的用户可读,不可写,可执行;其它用户可读,不可写,可执行。
另外,有一些程序属性的执行部分不是X,而是S,这表示执行这个程序的使用者,临时可以有和拥有者一样权力的身份来执行该程序。一般出现在系统管理之类的指令或程序,让使用者执行时,拥有root身份。 
第二个栏位,表示文件个数。如果是文件的话,那这个数目自然是1了,如果是目录的话,那它的数目就是该目录中的文件个数了。
第三个栏位,表示该文件或目录的拥有者。若使用者目前处于自己的Home,那这一栏大概都是它的账号名称。
第四个栏位,表示所属的组(group)。每一个使用者都可以拥有一个以上的组,不过大部分的使用者应该都只属于一个组,只有当系统管理员希望给予某使用者特殊权限时,才可能会给他另一个组。
第五栏位,表示文件大小。文件大小用byte来表示,而空目录一般都是1024byte,当然可以用其它参数使文件显示的单位不同,如使用ls –k就是用kb莱显示一个文件的大小单位,不过一般我们还是以byte为主。  
第六个栏位,表示最后一次修改时间。以“月,日,时间”的格式表示,如Aug 15 5:46表示8月15日早上5:46分。
第七个栏位,表示文件名。我们可以用ls –a显示隐藏的文件名。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Linux--硬链接和软链接 的相关文章

  • rshd.c 源代码中缺少 pam_appl.h 和 pam_misc.h

    我正在研究一个CentOS 5 5 操作系统 它显示错误 security pam appl h 和 security misc h 文件丢失 实际上我的 rshd c 没有加载 PAM 模块 可能是通过放置这个库 它可以帮助我很好地工作我
  • Linux Bash - 日期格式

    我的日期格式是 yyyy mm dd hh mm ss 如何检查我的输入 它应该是这样的 bin bash read p Date format yy mm dd HH MM SS input check date Y m d H M S
  • Linux 内核中的 64 位 time_t

    我已经编译了内核 3 19 1 但仍然有问题time t 只是一个简单的程序cout lt lt sizeof time t 给出 4 个字节的大小 而不是我的意图的 8 个字节 我应该在 make menuconfig 期间打开特定选项吗
  • Linux - 查找特定文件之后和之前的文件

    我试图在我的计算机上查找特定文件创建前 1 小时和创建后 1 小时创建的文件 这是我尝试过的方法 find root newermt 2012 10 04 1800 and newermt 2012 10 04 2000 exec ls l
  • Bash:使用参数扩展查找和替换

    我想更换输入法 find string include 圆进度 38px 30px 4eb630 和输出 输出字符串 include 圆进度 38px 30px using find string pattern replacement s
  • 从哪个 Linux 内核/libc 版本开始,Java Runtime.exec() 在内存方面是安全的?

    在工作中 我们的目标平台之一是运行 Linux 的资源受限的迷你服务器 内核 2 6 13 基于旧 Fedora Core 的自定义发行版 该应用程序是用 Java Sun JDK 1 6 04 编写的 Linux OOM Killer 配
  • Symfony 权限被拒绝

    谁能帮我解决我收到的以下错误消息 我终于在虚拟机上安装了 Symfony 它似乎工作正常 除了我偶尔收到这样的消息 1 2 ContextErrorException Warning SessionHandler read open var
  • 如何从存储在 char* 指针中的 name 调用 c 函数?

    我想通过函数的名称动态调用函数 例如 假设有以下函数和字符串 void do fork printf Fork called n char pFunc do fork 现在我需要打电话do fork 就在 pFunc 那么这可能吗 欢迎 C
  • 如何使用终端打开“-”虚线文件名?

    我尝试了 gedit nano vi leafpad 和其他文本编辑器 它无法打开 我尝试了 cat 和其他文件查找命令 我向你保证这是一个文件而不是目录 这种方法有很多误解 因为使用 作为参数指的是标准输入 标准输出 i e 开发 标准输
  • 如何判断输入来自哪个键盘

    设想 我有一个 USB RFID 读取器 将其连接到笔记本电脑后 它可以用作新连接的 USB 键盘 例如无需安装任何驱动程序 当接触带有 RFID 标签的阅读器时 它进入我当前的窗口 例如终端 外壳 RFID 号码 例如0009339384
  • 为什么我不能将 Unix Nohup 与 Bash For 循环一起使用?

    例如 此行失败 nohup for i in mydir fasta do myscript sh i done gt output txt bash syntax error near unexpected token do 正确的做法是
  • 在linux中将数据“广播”到多个进程的规范方法?

    我有一个应用程序需要将数据流从一个进程发送到多个读取器 每个读取器都需要查看自己的流副本 这是相当高的速率 100MB s 并不罕见 因此我希望尽可能避免重复 在我的理想世界中 Linux 应该有支持多个读取器的命名管道 并为常见的单读取器
  • 何时调用setsockopt?在bind()和connect()之前?

    我继承了一些 TCP 代码 调用 bind tcpSocket struct sockaddr server addr sizeof server addr 在致电之前 setsockopt tcpSocket SOL SOCKET SO
  • 如何重新安装cudnn?

    安装Cudnn 4 0 4后 我发现如果我想运行我下载的代码 我需要更高版本的Cudnn 然后我下载 cudnn 7 0 linux x64 v4 0 prod tgz 并直接按以下顺序安装 sudo cp include cudnn h
  • 为什么不使用 sshrc 中设置的 $PATH?

    我正在尝试在 OS X 服务器上通过 ssh 设置 svn 为了做到这一点 我读到我需要一个包装器来设置 umask 并 在我的例子中 设置存储库根 一种快速而肮脏的方法是重命名 usr bin svnserve并将包装器脚本放置在该位置
  • C++向量数组运算符计算成本高?

    我一直都知道 C 的丰富抽象会带来一定的计算开销 但我的印象是 一旦应用了正确的编译器优化 这种开销几乎可以忽略不计 我很好奇这种开销到底有多大 所以我编写了一个简单的测试来确定这一点 该测试是一个模板化函数 它接受一个容器变量 为容器中的
  • Linux 是否允许从信号处理程序进行任何系统调用?

    我的理解是 一般来说 如果您从信号处理程序调用非异步信号安全函数 则行为是未定义的 但我听说 Linux 允许您安全地调用任何系统调用 这是真的 另外 SIGSEGV 处理程序的唯一可移植行为是中止或退出 但我知道如果返回 linux 实际
  • 如何在 Linux 上正确地将网络接口置于混杂模式

    那么如何正确地做到这一点呢 我知道如何通过创建套接字 然后使用 ioctl 设置 IFF PROMISC 标志来做到这一点 如 如何在C中检查网络设备状态 https stackoverflow com questions 3055622
  • 使用vim,如何快速刷新正在处理的网页?

    我已经使用 VIM 几个星期了 同时处理各种网络语言 我真的很喜欢它 我发现必须点击或单击浏览器并刷新页面才能看到代码更改的效果 这很麻烦 更烦人的是 因为我使用的是 Virtual Box 而且我倾向于在主机系统上处理 PDF 文件 因此
  • Zip 实用程序在 Linux 中每次都给我不同的 md5sum

    当我在 Linux 中压缩 Zip 2 31 同一个文件时 每次都会得到不同的校验和 如何保持上次的 md5sum 相同 我正在使用 yum 提供的最新 zip 更新 生成的存档不仅包含压缩文件数据 还包含 额外的文件属性 如参考zip 文

随机推荐

  • 准确率94%!Python 机器学习识别微博或推特机器人

    原文来自Python实用宝典 准确率94 Python 机器学习识别微博或推特机器人 推特或微博机器人的存在其实是比较危险的 他们可以制造虚假的流量 传播谣言 甚至执行一些令人汗颜的恶意操作 这里我们使用kaggle纽约大学2017年机器学
  • SpringCache

    目录 简介 整合SpringCache简化缓存开发 Cacheable使用 原理 自定义缓存配置 CacheEvict的使用 自定义key生成策略 SpringCache的不足 简介 给每一个需要缓存的业务加上缓存的使用逻辑 缓存的使用 就
  • window子系统 wsl2 ubuntu子系统配置代理

    原理 由于 ubuntu 子系统是一个虚拟机 虚拟机安装下载包缓慢 而我们需要虚拟机使用到外部window电脑的代理网络使子系统能快速安装搭建服务 方法 ubuntu 子系统需要获取到window的IPV4地址代理端口设置 http pro
  • C语言中#include<stdio.h>和#include“stdio.h“的区别

    在C语言中 include
  • ajax回调函数运用(由前端到后端代码全过程)

    ajax回调函数 function initActivityWorks var backFun function jsonObject if jsonObject success showSuccessOrErrorModel 获取信息错误
  • Qt动画效果展示

    在上一篇博文 Qt动画框架 原创翻译 中 我给大家原创翻译了Qt动画框架并且有文字和代码以及图片共同描述 今天在这篇博文中 主要实践Qt动画 做一个实例来讲解Qt动画使用 其界面如下图所示 由于没有录制为gif动画图片 所以请各位下载查看效
  • nginx php-fpm 输出php错误日志

    nginx是一个web服务器 因此nginx的access日志只有对访问页面的记录 不会有php 的 error log信息 nginx把对php的请求发给php fpm fastcgi进程来处理 默认的php fpm只会输出php fpm
  • 并发编程专题06-java锁的深度化

    Java锁的深度化 下一篇 Disruptor框架 悲观锁 乐观锁 排他锁 重入锁 悲观锁与乐观锁 悲观锁 悲观锁悲观的认为每一次操作都会造成更新丢失问题 在每次查询时加上排他锁 每次去拿数据的时候都认为别人会修改 所以每次在拿数据的时候都
  • 快手短视频广告投放是怎么收费的 快手信息流广告收费标准

    一 快手短视频广告是怎么收费的 1 按展示收费 按展示收费是大部分广告主比较希望的投放方式 这种投放方式称为千人展示成本 也叫CPM模式 即一个广告展示给一千个用户所需要的费用 这种广告投放方式的特点是覆盖面广 但不能精准投放给目标用户 因
  • XSS注入基础入门篇

    XSS注入基础入门篇 1 XSS基础概念 2 XSS的分类以及示例 2 1 反射型XSS 2 1 1 示例1 dvwa low 级别的反射型XSS 2 1 2 攻击流程 2 2 DOM型XSS 2 2 1 示例2 DOM型XSS注入 1 环
  • 详解numpy.random.choice函数

    文章目录 函数原型 参数解析 该函数的注意事项 例子 示例代码 示例结果 参考 numpy的random模块中的choice函数用于从给定一维 1 D 数组中生成随机样本 本博客详细节将该函数的API 并给出示例代码和结果 函数原型 num
  • SpringBoot2.0(mybatis-plus初始使用)

    目录 一 介绍 二 SpringBoot2 x整合MybatisPlus Lombok 2 1 添加依赖 pom 2 2 配置数据库信息 application properties 2 3 工程结构初始化 三 创建接口返回统一对象 四 创
  • Android 第三方 ROM

    LineageOS 原 CyanogenMod CM 因原小组中几位成员不满其后的商业化不开源之路 以 Chainfire 为代表的几位成员遂脱离 CM 小组创立了现在的 LineageOS 其沿袭了 CM 稳定的特点 虽尚存少许 Bug
  • 4 17 0 RSA 私钥和公钥的一些自己的理解

    分享一下我老师大神的人工智能教程 零基础 通俗易懂 风趣幽默 还带黄段子 希望你也加入到我们人工智能的队伍中来 https blog csdn net jiangjunshow RSA 是非对称加密算法对称的加密算法 加密和解密都是使用的一
  • pandas函数read_csv()参数及例子

    1 read csv函数的定义 pd read csv filepath or buffer FilePathOrBuffer sep
  • R语言—添加程序运行的进度条

    循环是在处理各种任务的最常用的结构 一般的少量数据循环过程可以在几秒之内完成 稍大一点的也就是分钟的事情 但是在处理大量数据的时候 这个循环就可能会运行小时甚至几天的时间 当然还是要看配置和代码质量的 在这种情况下 程序的运行就变成了一种毫
  • 谷歌验单接口报projectNotLinked错误

    最近公司的一款安卓应用 用户购买商品后 服务端在调用谷歌接口进行验单的时候 谷歌接口会报projectNotLinked的错误 错误如下 error errors domain androidpublisher reason project
  • 对Flink集群进行远程调试

    导读 在学习或者使用各个大数据框架的时候 往往想对runtime层次的代码进行调试或者跟踪阅读 但其往往部署在其他机器上 因此需要进行远程调试 本文以Flink为例 介绍如何通过IDEA进行Flink的runtime层次的远程调试 环境 F
  • Ant Design Vue select下拉列表设置默认值

    在项目中需要为Ant Design Vue 的 select 组件设置一个默认值 如下图所示的状态下拉选择框 默认选择全部 代码如下 1
  • Linux--硬链接和软链接

    文件都有文件名与数据 这在 Linux 上被分成两个部分 用户数据 user data 与元数据 metadata 用户数据 即文件数据块 data block 数据块是记录文件真实内容的地方 而元数据则是文件的附加属性 如文件大小 创建时