硬链接与软连接

写在前面



Linux系统中存在两种链接文件,硬链接(hard link)和符号链接(symbolic link)。符号链接也称为软连接。想了解清楚这两种链接文件的区别并不容易,首先要清楚Linux文件系统的相关知识。

我们知道文件有文件名和数据。而Linux的文件系统在存储文件时分为两个部分,用户数据(userdata)和元数据(metadata)。用户数据是文件的真实数据存储文件系统的data block中,元数据存储在一个iNode的节点块中,包括文件的iNode号,权限,大小,时间属性(atime,ctime,mtime),所属者/组等属性信息(但并不包括文件名)。

iNode



对于文件系统来讲,iNode(index node)才是文件的唯一标识,并非文件名,文件名只是符合人类记忆习惯而实现的一种方式。这样就可用下图来说明计算机是如何通过文件名来访问的文件的了。

在Linux操作系统中,可以使用stat或者ls -i命令查看文件的iNode号,使用df  –i 命令查看整个文件系统的iNode节点使用情况。笔者说过,iNode号相对于文件系统来具有唯一性,对于不使用raid或者lvm技术的传统文件系统的来说就是在“分区”内iNode是文件访问的唯一标识。

为了解决文件共享的问题(笔者自认为),Linux在文件系统设计上支持链接文件。分为硬链接和符号链接。

硬链接



当iNode号具有多个文件名的时候,称这种文件为硬链接文件,硬链接文件和源文件在系统下具有相同的“地位”。为了更直观的理解,我引用了鸟哥私房菜书中的插图。

由于硬链接的元数据与源文件的完全一致(就是同一条元数据),所以有了它的一系列特性。

1,不能跨文件系统;

2,有相同的iNode和data block;

3,硬链接只能对已经存在的文件进行创建;

4,不能针对目录文件进行创建,Linux文件系统在设计时对目录默认创建了两个硬链接, . ..  如果再支持目录创建硬链接的话会生成目录环可能会造成死锁(笔者一家之言);

5,删除文件时,必须删除所有的硬链接才能真正释放data block.

软连接



与硬链接不同,软连接是一个独立的文件,与源文件的元数据和用户数据都不同。软连接的的数据块中存储的只是指向源文件的路径。当然这里也这里也引用鸟哥图来让读者直观的理解。

相比于硬链接来说,我认为软连接打破了他的诸多限制。

  1. 软连接有自己的元数据,所以可以对其进行权限控制(作用于原文件)
  2. 可跨越文件系统(包括网络)创建软连接
  3. 可对不存在的文件和目录创建(打破不能链接目录的限制)
  4. 创建软连接,源文件链接数不增加
  5. 删除软连接时不影响源文件

小实验



验证文件访问是通过iNode节点而非目录。验证方法很简单,对文件进行移动,重命名后查看iNode节点号是否变化。当然还有一点很重要,对于Linux来讲目录也是文件,所以在同一个目录下不能建立同名的文件和目录。


[[email protected] workspace]$ touch test

[[email protected] workspace]$ ls -i test  #查看test文件的iNode号为1704277

1704277 test

[[email protected] workspace]$ mkdir dir1

[[email protected] workspace]$ mv test dir1/

[[email protected] workspace]$ ls -i dir1/test #移动test文件到不同的目录下iNode节点不变

1704277 dir1/test

[[email protected] workspace]$ mv dir1/test  test.txt    #对test文件进行重命名,iNode节点号依旧不变,反映出iNode号是文件访问的唯一标识

[[email protected] workspace]$ ls -i test.txt

1704277 test.txt

[[email protected] workspace]$ ls

dir1   test.txt

[[email protected] workspace]$ mkdir test.txt

mkdir: cannot create directory `test.txt‘: File  exists

验证硬链接的相关特性

ln source hardlink命令建立硬链接


[[email protected] app]# df -T #查看文件系统信息,笔者在/app分区下做实验

Filesystem      Type  1K-blocks    Used Available Use% Mounted on

/dev/sda2       ext4   51475068 4751996  44101632   10% /

tmpfs           tmpfs   1019172      76    1019096   1% /dev/shm

/dev/sda3       ext4   40185208    49016  38088192   1% /app

/dev/sda1       ext4     999320   40008     906884   5% /boot

[[email protected] app]# touch test;ll -i test   #创建并查看test文件的iNode号,以及第三字段的链接数

11 -rw-r--r--. 1 root root 14 Jul 20 13:17 test

[[email protected] app]# ln test  /boot/test_hardlink  #在boot分区创建硬链接,提示错误,创建硬链接不能跨越文件系统

ln: creating hard link `/boot/test_hardlink‘ =>  `test‘: Invalid cross-device link

[[email protected] app]# ln test test_hardlink   #创建硬链接成功

[[email protected] app]# ll –i

# 查看源文件和链接文件的属性信息,完全一致,链接数增加1,硬链接文件显示是普通文件,与源文件具有相同的‘地位‘

total 0

11 -rw-r--r--. 2 root root 0 Jul 20 13:15 test

11 -rw-r--r--. 2 root root 0 Jul 20 13:15  test_hardlink

[[email protected] app]# echo "I love linux."  >test_hardlink

[[email protected] app]# cat test   #对硬链接文件进行修改,源文件同步修改,

I love linux.

[[email protected] app]# ln test1 test1_hardlink #不能对未存在的文件创建链接

ln: accessing `test1‘: No such file or directory

[[email protected] app]# ln /app app_link   #不能对目录进行创建链接

ln: `/app‘: hard link not allowed for directory

[[email protected] app]# rm -f test  #删除源文件后,数据依旧存在,只有把所有的硬链接文件都删除掉,磁盘空间才会被释放

[[email protected] app]# cat test_hardlink

I love linux.

验证软连接特性

ln -s source  symlink 命令建立软连接


[[email protected] app]# touch test

[[email protected] app]# ll -i     #关注iNode号与链接数

total 0

11 -rw-r--r--. 1 root root 0 Jul 20 13:31 test

[[email protected] app]# ln -s test test_symlink  #创建软连接

[[email protected] app]# ll -i  #软连接和源文件有不同的元数据,不是同一个文件

total 0

11 -rw-r--r--. 1 root root 0 Jul 20 13:31 test

12 lrwxrwxrwx. 1 root root 4 Jul 20 13:31 test_symlink  -> test

[[email protected] app]# chmod 600 test_symlink   #对软连接进行权限更改后,效果作用于源文件

[[email protected] app]# ll -i

total 0

11 -rw-------. 1 root root 0 Jul 20 13:31 test

12 lrwxrwxrwx. 1 root root 4 Jul 20 13:31  test_symlink -> test

[[email protected] app]# ln -s /app/test  /boot/test_symlink  #可以跨越文件系统进行创建软连接

[[email protected] app]# ll -i  /boot/test_symlink

23 lrwxrwxrwx. 1 root root 9 Jul 20 13:38  /boot/test_symlink -> /app/test

[[email protected] app]# echo "I love linux."  >test_symlink #对软连接的写操作也是写入到原文件

[[email protected] app]# cat test

I love linux.

[[email protected] app]# rm -f test_symlink  #删除软连接后不对源文件有影响

[[email protected] app]# cat test

I love linux.

软连接创建过程中遇到的那些坑

在软连接的创建过程牵扯到一个使用相对路径和绝对路径的问题,在使用相对路径链接到源文件时的参考点是以软连接所在的目录为基准,而非当前工作目录,所以,在使用相对路径创建软连接时,一定要尤为注意。这里笔者有一个小经验,对于ln -s source  symlink     这个命令来说,就是为了创建软连接,所以可以在敲命令时先敲入软连接的路径,这就无所谓相对路径和绝对路径了(建议使用绝对路径,可以以链接文件所在路径推出原文件相对于链接文件的路径)。

读者可能会想既然使用相对路径会出现这么多的麻烦,为什么还有人使用呢?因为有时需要对文件以及他的软连接进行‘同步‘迁移(相对路径不变),这时软连接还是能够连接到原文件,使用绝对路径就没有这种方便。我用下面代码展示一下。


[[email protected] app]# touch test

[[email protected] app]# mkdir dir

[[email protected] app]# cd dir/

[[email protected] dir]# ln -s ../test test_link1  #用相对路径进行创建软连接

[[email protected] dir]# ln -s /app/test test_link2#用绝对路径进行创建软连接

[[email protected] dir]# tree /app/

/app/

├── dir

│   ├── test_link1 -> ../test

│   └── test_link2 -> /app/test

└── test

1 directory, 3 files

如上图所示,使用绝对路径在迁移时软连接会失效。因此,使用绝对路径和相对路径建立软连接需要根据具体环境而言,而有优缺点。

时间: 2024-10-05 09:16:09

硬链接与软连接的相关文章

硬链接和软连接文件

硬链接和软连接文件的区别

linux命令4 find、三个时间属性、硬链接和软连接、用户名和密码文件、增加和删除用户组、usermod、su、sudo

find搜索命令 其他搜索命令如下: [[email protected] 333]# which ls alias ls='ls --color=auto' /bin/ls [[email protected] 333]# echo $PATH /usr/lib/qt-3.3/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/mysql/bin:/usr/local/jdk1.6.0_23/b

Linux 的硬链接与软连接

首先我们需要了解linux下硬链接以及软连接的基本概念. 硬链接:新建的文件是已经存在的文件的一个别名,当原文件删除时,新建的文件仍然可以使用. 软链接:也称为符号链接,新建的文件以"路径"的形式来表示另一个文件,和Windows的快捷方式十分相似,新建的软链接可以指向不存在的文件. 下面详细介绍一下硬链接和软连接之间的区别. 1.硬链接和原来的文件没有什么区别,而且共享一个 inode 号(文件在文件系统上的唯一标识):而软链接不共享 inode,也可以说是个特殊的 inode,所以

Linux硬链接和软连接的区别与总结

图示软硬链接的区别 有关硬链接的总结 具有相同inode节点号的多个文件互为硬链接文件: 删除硬链接文件或者删除源文件任意之一,文件实体并未被删除: 只有删除了源文件和所有对应的硬链接文件,文件实体才会被删除: 硬链接文件是文件的另一个入口: 可以通过给文件设置硬链接文件来防止重要文件被误删: 创建硬链接命令 ln 源文件 硬链接文件: 硬链接文件是普通文件,可以用rm删除: 对于静态文件(没有进程正在调用),当硬链接数为0时文件就被删除.注意:如果有进程正在调用,则无法删除或者即使文件名被删除

硬链接与软连接的区别_(转)

首先我们需要了解linux下硬链接以及软连接的基本概念. 硬链接:新建的文件是已经存在的文件的一个别名,当原文件删除时,新建的文件仍然可以使用. 软链接:也称为符号链接,新建的文件以“路径”的形式来表示另一个文件,和Windows的快捷方式十分相似,新建的软链接可以指向不存在的文件. 下面详细介绍一下硬链接和软连接之间的区别. 1.硬链接和原来的文件没有什么区别,而且共享一个 inode 号(文件在文件系统上的唯一标识):而软链接不共享 inode,也可以说是个特殊的 inode,所以和原来的

关于硬链接与软连接占用磁盘空间问题的分析研究

在学习过硬链接和软连接的知识后,我们在做实验的过程中会发现,创建的硬链接会占用磁盘的空间,而我们学习过成中了解到,硬链接只是创建一个文件与源文件相同的inode号,那怎么还会占用磁盘空间呢?带着疑问,跟随夹克来进行一些实验进行验证并得出结论: 首先我们再来回顾一下关于 硬链接与软连接的知识: 硬链接的特点: l  创建硬链接会增加额外的记录项以引用文件 l  对应用于同一文件系统上的一个物理文件 l  每个目录引用相同的inode 号 l  创建时链接数递增 l  删除文件时,递减链接数,当链接

【文件管理(硬链接与软连接 ,ls, cp, ....)和标准Io】

文件管理:(1):文件系统文件系统从根目录下开始,用"/"表示文件名是区分大小写的以.开头的文件为隐藏文件文件有两类数据元数据:metadata数据:data(2):文件名规则文件名最长225个字节蓝色----目录 绿色----可执行文件红色----压缩文件浅蓝色----链接文件灰色------其他文件(3):文件系统结构/boot:引导文件存放目录/bin:供所有用户使用的基本命令/sbin :管理类基本命令/etc :配置文件目录/home :普通用户家目录/root :管理员夹目

硬链接和软连接的区别以及 ln -s 和mv的区别

linux链接分两种,一种是硬链接(hand link) 一种是软链接 (symbolic link)ln命令是创建链接,默认是创建硬链接ln -s 是创建软连接 ??什么是硬链接硬链接是通过索引节点来进行连接,在linux的文件系统中,保存在磁盘分区中的文件不管是什么类型都会分配一个节点编号,或者称之为索引节点. 多个文件名称指向一个节点编号,一般这种连接是硬链接一个文件有硬链接的时候,想要真正删除.需要吧所有的连接全部删除,文件的数据库和目录的链接才会被释放.??? 什么是软连接软连接类似

linux文件和目录的属性及硬链接与软连接

1.文件属性概述 linux系统中的文件或目录的属性主要包括:索引节点(inode).文件类型.权限属性.链接数.所归属的用户和用户组.最近修改的时间等内容. 我们用ls –lhi命令查看一下结果,也可以用stat详细查看文件属性. [[email protected] ~]# ls -lhi total 92K 400420 -rw-------. 1 root root 1.1K Jun 14 05:02 anaconda-ks.cfg 400431 -rw-r--r--. 1 root r

目录本质,硬链接与软连接,常用的一些小命令

目录本质 bin目录:binary,里面是可执行的二进制文件,即一些工具和程序放的是普通用户执行工具的 sbin目录:放的是管理员执行一些工具 boot目录:放的都是引导数据 dev 目录:放的都是设备,字符设备,块设备和网络设备.硬件设备 /dev/null可以吧命令执行的信息放到里面不让别人看见输出的信息 etc 目录:存放配置文件 home目录:存放家目录 root目录:root的家目录 run 目录:生成的运行信息文件 tmp 目录:存放临时文件 usr 目录:存放操作系统的大部分程序和