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 ...
随机推荐
- Redis主从同步原理-PSYNC【转】
Reids复制数据主要有2种场景: 1. 从服务器从来第一次和当前主服务器连接,即初次复制 2. 从服务器断线后重新和之前连接的主服务器恢复连接,即断线后重复制 对于初次复制来说使用SYNC命令进 ...
- css的direction属性
在项目中有遇到一个问题,select元素中的文字需要右对齐.text-align是无效的,想了很久都没有想到办法.经过一翻搜索之后发现了https://stackoverflow.com/questi ...
- JwtBearer认证
ASP.NET Core 认证与授权[4]:JwtBearer认证 在现代Web应用程序中,通常会使用Web, WebApp, NativeApp等多种呈现方式,而后端也由以前的Razor渲染HT ...
- 01 Windows安装Tensorflow
1.安装Python. 点击此处下载Python3.5.2.安装Python时一定要选择安装pip. 2.配置Python环境变量. 将%安装路径%\Scripts添加到Path下面. 3.修改Pip ...
- Tomcat8源码笔记(九)组件StandardContext启动流程--未完待续
StandardContext代表的是webapps下项目,一个项目就是一个StandardContext,作为Tomcat组件的一部分,就会实现Lifecycle接口,被Tomcat管理着生命周期, ...
- man rpcbind(rpcbind中文手册)
本人译作集合:http://www.cnblogs.com/f-ck-need-u/p/7048359.html RPCBIND() BSD System Manager's Manual RPCBI ...
- μC/OS-II 任务的同步与通信 --- 信号量
任务间通信 系统中的多个任务在运行时,经常需要互相无冲突地访问同一个共享资源,或者需要互相支持和依赖,甚至有时还要互相加以必要的限制和制约,才保证任务的顺利运行.因此,操作系统必须具有对任务的运行进行 ...
- python安装Jieba中文分词组件并测试
python安装Jieba中文分词组件 1.下载http://pypi.python.org/pypi/jieba/ 2.解压到解压到python目录下: 3.“win+R”进入cmd:依次输入如下代 ...
- 如何将各种低版本的discuz版本升级到discuz x3.0
最近在做discuz改版的项目,遇到了很多问题,相信很多拥有discuz论坛的版主,站长和程序猿在升级或改版discuz的过程中遇到过和我一样的问题,所以我开了一个discuz专栏,为大家讲解一下di ...
- Dapper批量更新
本次示例项目使用Dappe1.50.5和Dapper.Contrib1.50.5 数据库执行的脚本检测工具是SQL Server Prifiler 1.使用Where In 实现批量更新 1.1代码如 ...