Linux 软链接和硬链接的理解与学习

要想弄明白Linux的软链接和硬链接的概念,首先要明白linux是怎么管理文件的。

以下笔记部分内容来自互联网搜索,个人理解加以整合所得。

1. 文件系统 (作者:Vamei 出处:http://www.cnblogs.com/vamei/archive/2012/09/09/2676792.html)

文件被组织到文件系统(file system)中,通常会成为一个树状(tree)结构。Linux有一个根目录/, 也就是树状结构的最顶端。这个树的分叉的最末端都代表一个文件,而这个树的分叉处则是一个目录(directory, 相当于我们在windows界面中看到的文件夹)。在图1中看到的是整个的一个文件树。如果我们从该树中截取一部分,比如说从目录vamei开始往下,实际上也构成一个文件系统。

要找到一个文件,除了要知道该文件的文件名,还需要知道从树根到该文件的所有目录名。从根目录开始的所有途径的目录名和文件名构成一个路径(path)。比如说,我们在Linux中寻找一个文件file.txt,不仅要知道文件名(file.txt),还要知道完整路径,也就是绝对路径(/home/vamei/doc/file.txt)。从根目录录/, 也就是树状结构的最顶端出发,经过目录home, vamei, doc,最终才看到文件file.txt。整个文件系统层层分级(hierarchy),vamei是home的子目录,而home是vamei的父目录。

在Linux中,我们用ls命令来显示目录下的所有文件,比如 $ls /home/vamei/doc

2. 文件的管理 (作者:阮一峰  出处:http://www.ruanyifeng.com/blog/2011/12/inode.html)

文件储存在硬盘上,硬盘的最小存储单位叫做"扇区"(Sector)。每个扇区储存512字节(相当于0.5KB)。

操作系统读取硬盘的时候,不会一个个扇区地读取,这样效率太低,而是一次性连续读取多个扇区,即一次性读取一个"块"(block)。这种由多个扇区组成的"块",是文件存取的最小单位。"块"的大小,最常见的是4KB,即连续八个 sector组成一个 block。

文件数据都储存在"块"中,那么很显然,我们还必须找到一个地方储存文件的元信息,比如文件的创建者、文件的创建日期、文件的大小等等。这种储存文件元信息的区域就叫做inode,中文译名为"索引节点"。

每一个文件都有对应的inode,里面包含了与该文件有关的一些信息。

2.1 inode的内容

inode包含文件的元信息,具体来说有以下内容:

  * 文件的字节数

  * 文件拥有者的User ID

  * 文件的Group ID

  * 文件的读、写、执行权限

  * 文件的时间戳,共有三个:ctime指inode上一次变动的时间,mtime指文件内容上一次变动的时间,atime指文件上一次打开的时间。

  * 链接数,即有多少文件名指向这个inode

  * 文件数据block的位置

inode也会消耗硬盘空间,所以硬盘格式化的时候,操作系统自动将硬盘分成两个区域。一个是数据区,存放文件数据;另一个是inode区(inode table),存放inode所包含的信息。

每个inode节点的大小,一般是128字节或256字节。inode节点的总数,在格式化时就给定,一般是每1KB或每2KB就设置一个inode。假定在一块1GB的硬盘中,每个inode节点的大小为128字节,每1KB就设置一个inode,那么inode table的大小就会达到128MB,占整块硬盘的12.8%。

每个inode都有一个号码,操作系统用inode号码来识别不同的文件。

这里值得重复一遍,Unix/Linux系统内部不使用文件名,而使用inode号码来识别文件。对于系统来说,文件名只是inode号码便于识别的别称或者绰号。

表面上,用户通过文件名,打开文件。实际上,系统内部这个过程分成三步:首先,系统找到这个文件名对应的inode号码;其次,通过inode号码,获取inode信息;最后,根据inode信息,找到文件数据所在的block,读出数据。

使用ls -i命令,可以看到文件名对应的inode号码:

inode的特殊作用

由于inode号码与文件名分离,这种机制导致了一些Unix/Linux系统特有的现象。

  1. 有时,文件名包含特殊字符,无法正常删除。这时,直接删除inode节点,就能起到删除文件的作用。

  2. 移动文件或重命名文件,只是改变文件名,不影响inode号码。

  3. 打开一个文件以后,系统就以inode号码来识别这个文件,不再考虑文件名。因此,通常来说,系统无法从inode号码得知文件名。

第3点使得软件更新变得简单,可以在不关闭软件的情况下进行更新,不需要重启。因为系统通过inode号码,识别运行中的文件,不通过文件名。更新的时候,新版文件以同样的文件名,生成一个新的inode,不会影响到运行中的文件。等到下一次运行这个软件的时候,文件名就自动指向新版文件,旧版文件的inode则被回收。

硬链接

一般情况下,文件名和inode号码是"一一对应"关系,每个inode号码对应一个文件名。但是,Unix/Linux系统允许,多个文件名指向同一个inode号码。

这意味着,可以用不同的文件名访问同样的内容;对文件内容进行修改,会影响到所有文件名;但是,删除一个文件名,不影响另一个文件名的访问。这种情况就被称为"硬链接"(hard link)。

运行上面这条命令以后,源文件与目标文件的inode号码相同,都指向同一个inode。inode信息中有一项叫做"链接数",记录指向该inode的文件名总数,这时就会增加1。

反过来,删除一个文件名,就会使得inode节点中的"链接数"减1。当这个值减到0,表明没有文件名指向这个inode,系统就会回收这个inode号码,以及其所对应block区域。

由于linux下的文件是通过索引节点(inode)来识别文件,硬链接可以认为是一个指针,指向原文件inode的指针,系统并不为它重新分配inode和创建文件;即硬链接文件和原文件其实是同一个文件,只是名字不同。每添加一个硬链接,文件inode的链接数就加1;删除一个硬链接,inode的链接数减1,文件内容依然存在,直到inode的链接数为0,才删除inode对应的文件。

这里顺便说一下目录文件的"链接数"。创建目录时,默认会生成两个目录项:"."和".."。前者的inode号码就是当前目录的inode号码,等同于当前目录的"硬链接";后者的inode号码就是当前目录的父目录的inode号码,等同于父目录的"硬链接"。所以,任何一个目录的"硬链接"总数,总是等于2加上它的子目录总数(含隐藏目录)。

不可以在不同文件系统的文件间建立链接

不可以跨分区建立硬链接(因为不同的分区是使用不同的超级块 来存储inode信息)

软链接

除了硬链接以外,还有一种特殊情况。

文件A和文件B的inode号码虽然不一样,但是文件A的内容是文件B的路径。读取文件A时,系统会自动将访问者导向文件B。因此,无论打开哪一个文件,最终读取的都是文件B。这时,文件A就称为文件B的"软链接"(soft link)或者"符号链接(symbolic link)。

这意味着,文件A依赖于文件B而存在,如果删除了文件B,打开文件A就会报错:"No such file or directory"。这是软链接与硬链接最大的不同:文件A指向文件B的文件名,而不是文件B的inode号码,文件B的inode"链接数"不会因此发生变化。

ln -s命令可以创建软链接。

作者:晴枫   出处:http://witmax.cn/linux-links.html

区别总结

软链接与硬链接的区别不仅仅是在概念上,在实现上也是不同的,整理如下:

  • 对于硬链接,原文件和硬链接文件公用一个inode号,这说明他们是同一个文件,而对于软链接,原文件和软链接文件拥有不同的inode号,表明他们是两个不同的文件;
  • 在文件属性上软链接明确写出了是链接文件,而硬链接没有写出来,因为在本质上硬链接文件和原文件是完全平等关系;
  • 链接数目是不一样的,软链接的链接数目不会增加;
  • 文件大小是不一样的,硬链接文件显示的大小是跟原文件是一样的,因为是等同的嘛,而这里软链接显示的大小与原文件就不同了,file1大小是48B,而file1soft是5B,这里面的5实际上就是“file1”的大小。
  • 在同一文件系统下,可以创建软链接或硬链接(同文件系统不同目录下也可以)。
时间: 2024-10-14 15:56:08

Linux 软链接和硬链接的理解与学习的相关文章

第三章 Linux 软链接与硬链接

Linux 软链接与硬链接 通过实验加深理解 [[email protected]]$ touch f1          #创建一个测试文件f1 [[email protected]]$ ln f1 f2          #创建f1的一个 硬连接   文件f2 [[email protected]]$ ln -s f1 f3       #创建f1的一个 符号连接 文件f3  即软链接 [[email protected]]$ ls -li            # -i参数显示文件的ino

linux软链接和硬链接

1.Linux链接概念Linux链接分两种,一种被称为硬链接(Hard Link),另一种被称为符号链接(Symbolic Link).默认情况下,ln命令产生硬链接. 在Linux系统中,内核为每一个新创建的文件分配一个Inode(索引结点),每个文件都有一个惟一的inode号.文件属性保存在索引结点里,在访问文件时,索引结点被复制到内存在,从而实现文件的快速访问. QUOTE: ln [options] existingfile newfileln[options] existingfile

LINUX “软链接”和“硬链接”的区别

今天在知乎上看到一篇十分有趣的问题: 如何评价微软高级工程师痴迷于soft link这一linux常见概念? 虽然又是知名撕逼王曾某的撕逼帖,但是我还是想就题目中链接的问题简单地讲讲. 什么是链接? 链接简单说实际上是一种文件共享的方式,是 POSIX 中的概念,主流文件系统都支持链接文件. 它是用来干什么的? 你可以将链接简单地理解为 Windows 中常见的快捷方式(或是 OS X 中的替身),Linux 中常用它来解决一些库版本的问题,通常也会将一些目录层次较深的文件链接到一个更易访问的目

linux软链接与硬链接的区别

Linux 文件系统最重要的特点之一是它的文件链接.链接是对文件的引用,这样可以让文件在文件系统中多处被看到.不过,在 Linux 中,链接可以如同原始文件一样来对待.链接可以与普通的文件一样被执行.编辑和访问.对系统中的其他应用程序而言,链接就是它所对应的原始文件.当您通过链接对文件进行编辑时,您编辑的实际上是原始文件.链接不是副本,linux有两种类型的链接:硬链接和符号链接(软链接). 硬链接(hard link)只能引用同一文件系统中的文件.它引用的是文件在文件系统中的物理索引(也称为

Linux软链接和硬链接文件

下面是Linux系统软件底层的存储结构,我们将从底层上来去解释Linux系统下的软硬连接文件 <一>: 解释(底层) 硬链接,其实从底层数据上来看, 硬链接其实就是增加了一个目录项.底层对应的inode table.数据区中的值是不变的, 也不会重新创建. 软链接, 其实从底层接上看, 软链接其实就是相当于重新创建了一个文件,, 无论是目录项,inode table,以及数据区都是重新重建的,而这个文件功能比较特殊, 它是用来指向另外一个文件的. <二>:命令的使用 硬链接命令:

FILE 结构体的定义,inode ,软链接和硬链接的理解

一.FILE结构体: C将每个文件简单地作为顺序字节流.每个文件用文件结束符结束,或者在特定字节数的地方结束,这个特定的字节数可以存储在系统维护的管理数据结构中.当打开文件时,就建立了和文件的关系. 在开始执行程序的时候,将自动打开3个文件和相关的流:标准输入流.标准输出流和标准错误.流提供了文件和程序的通信通道.例如,标准输入流使得程序可以从键盘读取数据,而标准输出流使得程序可以在屏幕上输出数据.打开一个文件将返回指向FILE结构(在stdio.h中定义)的指针,它包含用于处理文件的信息,也就

12、Linux软链接和硬链接详解

软连接和硬链接图解 硬链接 符号链接 软链接和硬链接详解 软链接和硬链接详解 Linux下的链接文件有点类似于Windows的快捷方式,但又不完全一样.链接文件有两种:一种是硬链接,另一种是符号链接(又称软链接). UNIX文件系统提供了一种将不同文件链接至同一个文件的机制,我们称这种机制为链接.它可以使得单个程序对同一文件使用不同的名字.这样的好处是文件系统只存在一个文件的副本,系统简单地通过在目录中建立一个新的登记项来实现这种连接. 软连接和硬链接图解 硬链接 硬链接是通过索引节点进行的链接

详解软链接和硬链接

区分软链接和硬链接前先来学习下i节点和block数据块 一块分区要想使用需要做2步操作: ?1.将分区分成等大小的block块,一般为4k,用来记录文件的数据 ?2.在分区起始位置建一个i节点表,里面包含文件元数据(-rw-r--r--. 1 root root 0 May 19 14:53 f1 文件类型.权限.所属着.创建时间等)和inode节点号,在同一个分区中i节点是唯一的,每一个文件都有不同的i节点. 访问一个文件需要先查找i节点表,然后寻找数据块.假设有一个dir文件夹,下面有fil

linux 下的使用 ln 创建 软链接 和 硬链接

linux 下的一个指令 ln 作用: 创建软链接或者硬链接 Linux 系统下每创建一个文件,系统都会为此文件生成一个 index node 简称(inode) ,而每一个文件都包含用户数据(user data) 与 元数据(metadata) 用户数据里记录了文件的真正内容. 元数据里记录的是文件的附加属性,如 文件大小,创建时间,所有者等,其中 上面提到的 index node 就保存在元数据中.在linux 中文件名并不是文件的唯一标识,index onde 才是唯一标示,系统查找文件也