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 ...
随机推荐
- ConcurrentHashMap 解读
初始化: 问题:如何当且仅只有一个线程初始化table private final Node<K,V>[] initTable() { Node<K,V>[] tab; int ...
- java如何获取一个double的小数位数
前言 看标题是不是觉得这是一个很简单的问题,我一开始也是这么认为的,但是实际情况下,在各种情况下我们都进行了测试,发现很多实际情况是无法不尽如人意的. 方法分析 当前能想到的比较容易有下面几种 1.直 ...
- web开发的跨域问题详解
本文由云+社区发表 做过 web 开发的同学,应该都遇到过跨域的问题,当我们从一个域名向另一个域名发送 Ajax 请求的时候,打开浏览器控制台就会看到跨域错误,今天我们就来聊聊跨域的问题. 1. 浏览 ...
- Gradle nexus配置
1.下载Gradle; 2.添加脚本init.gradle到gradle的init.d目录中: ext { nexus = 'http://192.168.184.6:8081/nexus' user ...
- spring-boot(二)
学习文章来自:http://www.ityouknow.com/spring-boot.html web开发 spring boot web开发非常的简单,其中包括常用的json输出.filters. ...
- netty源码解解析(4.0)-14 Channel NIO实现:读取数据
本章分析Nio Channel的数据读取功能的实现. Channel读取数据需要Channel和ChannelHandler配合使用,netty设计数据读取功能包括三个要素:Channel, Eve ...
- 给HTML页面指定元素添加属性,添加父元素
给HTML页面指定元素添加属性,添加父元素 下面拿一个给富文本中所有的图片增加layer弹窗效果. 思路: 给富文本父元素设置属性. 获取父元素里所有的img 此处用到querySelectorA ...
- Django 系列博客(六)
Django 系列博客(六) 前言 本篇博客介绍 Django 中的路由控制部分,一个网络请求首先到达的就是路由这部分,经过路由与视图层的映射关系再执行相应的代码逻辑并将结果返回给客户端. Djang ...
- JavaScript 系列博客(一)
JavaScript 系列博客(一) 前言 本系列博客为记录学习 JavaScript 的学习笔记,会从基础开始慢慢探索 js.今天的学习笔记主要为 js 引入.定义变量以及 JavaScript 中 ...
- 在go modules中使用replace替换无法直接获取的package(golang.org/x/...)
上一篇里我们介绍了使用go get进行包管理. 不过因为某些未知原因,并不是所有的包都能直接用go get获取到,这时我们就需要使用go modules的replace功能了.(当然大部分问题挂个梯子 ...