Linux学习笔记 软链接和硬链接

Linux 中,“everything is file”。接下来给大家介绍 linux 如何通过链接,达到节省磁盘空间、共享文件等目的。链接文件有两种方式,软链接(soft link)和硬链接(hard link)。
考虑这几个场景。
假如你在 Linux 系统中有一堆媒体文件,你想将他们分类,但一部电影或者一首歌往往能打上几个标签,比如说陈奕迅的《不良嗜好》,我想把这歌,放到 音乐/歌手/陈奕迅/U-87/ 的文件夹中,又想把它放到 音乐/作词/黄伟文/2005/ 文件夹中,更想把它放到 曲风/R&B 文件中。。。但我不想使用复制,因为一首无损都 30M 左右大小了,U-87 一专辑都几百M 了,我有数十个专辑的歌想要这样处理。如果要复制的话,磁盘容量很快就满了。
有一堆重要的日志要备份,不想被系统的定时任务删除(比如只保留30天的日志)。比如我想备份的 8月份的日志,比如 是 /var/log/nginx/access.log-201808 开头的所有文件。大概有几百G的。但不想复制黏贴占用过多的磁盘空间。同时系统备份,系统不停写日志文件(比如现在是 8月31号),我的备份文件也能同时修改。不用重复备份。
我用 golang 的两个版本。一个是用于开发的,和生产环境的一样。另外一个就比较新的,有很多的新特性。我想在开发的时候用生产环境的 sdk,而平时自己的小玩具用最新版本。要如何弄呢?
答曰: 1,2 场景可以用 硬链接(hard link)。3 可以用软连接(soft link 或者 symbolic link)。这是些什么东西? 简单地解释就是,硬链接相当于一个指针,指向同一个文件结点(node)。就是原文件删除,并不会真正地删除,当没有指针指向这个结点的时候,文件才会真正地被删除。而软连接就相当于 windows 的快捷方式,指向的是文件的路径。下面再详细解释吧
硬链接
Linux 中的文件的表示分成两部分,一部分是元数据(metadata),用于描述文件的名字、大小、更新时间、权限,Inode号之类的,另一部分才是文件的数据。Linux 中文件的唯一标识是 Inode 号,系统查找文件就是通过 Inode 的索引找到 Inode号从而找到文件。

接下来看一个例子,比如我现在创建一个文件 file1,里面的内容是Hello World
echo "Hello World" >> file1
查看该文件的 Inode 号
ls -il | grep "file1"
81940 -rw-rw-r-- 1 zgj zgj 24 Aug 30 21:10 file1
或者
stat file1
File: ‘file1’
Size: 24 Blocks: 8 IO Block: 4096 regular file
Device: fd01h/64769d Inode: 81940 Links: 1
Access: (0664/-rw-rw-r--) Uid: ( 1001/ zgj) Gid: ( 1001/ zgj)
Access: 2018-08-30 21:10:01.204598497 +0800
Modify: 2018-08-30 21:10:44.753614034 +0800
Change: 2018-08-30 21:10:44.753614034 +0800
可以看到file1的Inode号是: 81940
给文件创建一个硬链接
ln file1 file2
再来看看变化
ls -il | grep "file"
81940 -rw-rw-r-- 2 zgj zgj 24 Aug 30 21:10 file1
81940 -rw-rw-r-- 2 zgj zgj 24 Aug 30 21:10 file2
有什么变化呢?
- file1 和 file2 共享同一个 Inode,都是 81940
- 就是权限后面那个数字(那个数字是指向文件的链接数),1->2,+1s了。 不同与复制黏贴,硬链接相当于一个指向文件的指针,文件里面的内容改变了,硬链接的文件也会跟着改变。如果链接数是0,这个文件就相当于不存在了。
再操作一下
我将 file2 的内容再添加一条 ”Hello Linux“
echo "Hello Linux" >> file2
cat file1
Hello World
Hello Linux
为何如此,因为 file1 和 file2 就是同一个文件。 而查找系统中 file1 的所有硬链接可以这样
find ~ -inum 81940
#或者
find ~ -samefile file1
总结
使用硬链接的好处是
- 文件的内容可以同步修改(本来就是同一个文件)
- 文件不怕被删除了,只要还有一个硬链接在文件就会存在
- 节省空间
so,使用硬链接可以很好地满足 场景1 和 场景2 的问题了。 但 硬链接当然也有相对不太好的地方:
- 不能对目录进行创建,只可对文件创建
- 不能交叉文件系统进行硬链接的创建(不同文件系统,Inode 可能是一样的)
- 硬链接文件没有自己的权限
- 不存在的文件不能创建硬链接
而软链接就没有上述的这些问题了,接下来我们来看看软链接
软链接

软链接真的和 windows 的快捷链接差不多
- 它自己就是一个文件,有自己的 inode 号,有自己的数据块,有自己的文件权限(软链接的权限是没啥意义的,都是 777,改软链接的权限会变成改原文件的权限)
- 数据块的内容是文件路径
- 软链接可以在不同的文件系统中使用
- 可以对不存在的文件或目录创建软链接。如果原文件不在,它会找不到的
- 创建软链接时,链接计数 link 不会增加,当然删除软连接对原文件也没有影响
与之相关的命令如下
创建
ln -s file1 file3
ls -il | egrep "file[0-9]"
81940 -rw-rw-r-- 2 zgj zgj 36 Aug 30 21:31 file1
81940 -rw-rw-r-- 2 zgj zgj 36 Aug 30 21:31 file2
81941 lrwxrwxrwx 1 zgj zgj 5 Aug 30 22:43 file3 -> file1
查询
# 查找在主目录下的文件 file1 的软链接
find ~ -lname file1
# 查找在主目录下的文件的所有软链接
find ~ -type l -ls
修改
在原来的基础上再添加个 -f 参数强制修改
ln –sf file2 file3
如果是用来链接文件夹还要加个 -n 参数
总结
软链接可以在场景三中表现良好吧。而软链接相对来讲不太好的地方是,如果文件重命令或者移动路径不会跟着改,就会变成死链了。硬链接和软链接有好有坏吧,还得看场景。
参考文章
Linux学习笔记 软链接和硬链接的更多相关文章
- 深入解读键值产生原理,linux中的软链接和硬链接(转)
键值 = 文件标示符 + 项目ID 当用到进程间的通信时, 必须要注意到的是键值是怎么产生的,我们知道任何一个文件时通过文件名来访问的, 而内核在对应的给其一个值,也就是文件标示符. 系统建立IPC通 ...
- 2017-7-18-每日博客-关于Linux下的软链接和硬链接.doc
ln命令 该命令在文件之间创建链接.这种操作实际上是给系统中已有的某个文件指定另外一个可用于访问它的名称.对于这个新的文件名,我们可以为之指定不同的访问权限,以控制对信息的共享和安全性的问题. 如果链 ...
- Linux常用基本命令(软链接与硬链接 )
硬链接:相当于文件的多个入口,作用:备份文件,创建快照等 软链接:相当于windows的快捷方式 命令格式: ln option 源文件 目标文件 -s: 创建软链接 1,创建硬链接: ghostwu ...
- Linux文件的软链接和硬链接
1.Linux链接概念 Linux链接分两种,一种被称为硬链接(Hard Link).还有一种被称为符号链接(Symbolic Link).默认情况下.ln命令产生硬链接. 1.1索引节点 索引节点是 ...
- Linux中的软链接与硬链接
软链接相当于windows的快捷方式,当源文件不存在时,软链接失效. 链接是指向文件名,当指向的文件名字删除的时候,就找不到源文件了.硬链接是指向文件本身,删除一个文件名字,还是可以找到源文件的.ls ...
- linux下的软链接与硬链接
在 Linux 底下的连结档有两种,一种是类似 Windows 的快捷方式功能的文件,可以让你快速的链接到目标文件(或目录);这种链接称为软链接. 另一种则是透过文件系统的 inode 连结来产生新档 ...
- linux 创建软链接和硬链接
Linux 系统中有软链接和硬链接两种特殊的“文件”. 软链接可以看作是Windows中的快捷方式,可以让你快速链接到目标档案或目录. 硬链接则透过文件系统的inode来产生新档名,而不是产生新档案. ...
- deepin linux学习笔记
目录 deepin linux学习笔记 前言 linux常用命令 ls 显示文件夹内容 cd 切换当前目录 pwd 查看当前工作目录 mkdir 新建文件夹 rm 删除文件或文件夹 mv 移动文件 c ...
- Linux 软链接和硬链接的理解与学习
理解前提: 首先要知道 Linux任意一个文件包含2个信息:第一个信息就是文件本身存的内容,第二个信息是文件的控制信息(读写,路径,大小等等),这2个信息是分开存储的,明白这点非常重要 理解总结: L ...
随机推荐
- Struts框架(6)---action接收请求参数
action接收请求参数 在web开发中,去接收请求参数来获得表单信息非常的常见,自己也总结整理了有关Struts2通过action接收请求参数的几种方法. Struts2 提供三种数据封装的方式: ...
- pyinstaller安装配置
一.工具准备: 1).安装pyinstaller需要以这个包为基础.也就是基础软件包.pyWin32包.下载对应的pyWin32安装包>>地址: https://sourceforge.n ...
- Nginx 配置https 服务
一.HTTPS 服务 为什么需要HTTPS? 原因:HTTP不安全 1.传输数据被中间人盗用.信息泄露 2.数据内容劫持.篡改 HTTPS协议的实现 对传输内容进行加密以及身份验证 HTTPS加密校验 ...
- k8s之external-etcd集群管理
一.概述 kubernetes使用etcd作为数据中心,使用kubeadm部署kubernetes的时候默认会自己部署一个etcd,当然也可以将kubeadm部署的单点的etcd做成集群,但是比较麻烦 ...
- Go语言学习笔记(三) [控制结构、内建函数]
日期:2014年7月21日 一.控制结构 1.Go中,只有几个控制结构,它没有do或者while循环,有for,灵活的switch语句和if,在switch中可以接受像for那样可选的初始化语 ...
- Perl数组和hash相关函数
Perl数组和hash相关函数 内置的数组函数有: each, keys, pop, push, shift, splice, unshift, values 内置的hash函数有: delete, ...
- QT 应用程序测试
添加环境 export QTEDIR='/Qt5' export QTINC='/Qt5/include/' export QTLIB='/Qt5/lib' export QT_QPA_FB_TSLI ...
- [android] 表格布局和绝对布局
/*****************2016年4月28日 更新*************************************/ 知乎:为什么Android没有像iOS一样提供autolay ...
- js如何发送wss协议的请求,以及接受服务器返回的数据
今天遇到问题,以往都是请求http协议的url,现在请求变成了wss的,用以前那种ajax的方式不可以发送和接受.然后查阅相关资料解决了这个问题,在这记录一下解决办法,使用的是websocket. & ...
- js高级:event,事件冒泡,事件捕获
1.事件 浏览器客户端上客户触发的行为都称为事件 所有的事件都是天生自带的,不需要我们去绑定,只需要我们去触发. 通过 obj.事件名=function(){} 事件名:onmouseover 鼠标悬 ...