在这里插入图片描述

大家接触电脑最开始使用的无疑是windows系统,在windows系统中我们使用的软件可我们想要快速启动的软件都在桌面创建一个快捷方式,这样点击快捷方式就能够快速启动此软件啦。在linux系统中也有这样的功能,比如你想在一个目录下访问另一个目录下的文件或者运行另一个目录下的软件,那么你就可以使用linux中的连接文件的方式。

在linux中,有两种连接文件的方式,分别是硬连接和软连接。接下来将分别介绍一下两者使用的效果和区别。


连接文件的命令

linux中连接文件的命令是ln,一般来说我们会使用的参数较少,这里简介一下就过啦。

  • 使用方式:ln -参数 源文件 目标文件
  • -s 加s表示要创建的是符号连接
  • -f 如果目标文件已存在,那么现将目标文件删除后再创建新的目标文件

硬连接(hard link)

硬连接也叫实际连接,听了其名字可能大概猜到了其连接是实实在在的文件连接。没错,通过硬连接产生的文件实际上和原本的文件是实际地连接起来的,也就是说通过硬连接创建的文件和之前的文件的文件名不同,但是这两个文件名是指向同一个文件的。不论修改哪一个文件名下的文件内容,另一个文件名访问到的文件内容也会被修改。怎么判断两个文件名指向的是同一个文件呢?这就要引入inode的概念了,这里我想多讲一点。

首先,不论在哪个系统中,计算机需要正常运行所需的大部分软件都存储在硬盘上,除了软件外还有各种文件也一般存放于硬盘。硬盘作为储存工具,其最小的物理储存单位就是扇区(sector),每个扇区为512 bytes,通过扇区组成的一个圆被称为柱面(Cylinder),柱面理论上是分区的最小单位。可以看一下下图,大概理解一下扇区和柱面的意思。

在这里插入图片描述

在linux系统中,已经有了文件权限(rwx)和文件属性(所有者、时间参数等)等除文件本身外的额外属性,这些额外属性也需要被储存下来。linux中文件系统通常会将这两部分数据分别存放在不同的块中,即权限和属性放置到inode中,而文件本身(即实际数据)被存放在block中。因此inode用于记录文件的属性,一个文件只会占用一个inode(不管文件再大,一个文件就只会有一份权限和属性嘛,一个inode就足够记录权限和属性),这个inode除了记录文件属性外还会记录文件数据所在的block号。这种文件系统在最初创建时就先格式化出inode和block各自的块,block用于储存文件本身,在linux中一般有1k、2k和4k三种的block,文件的数据就是储存在这些block中的,并且由于连续的block号可能之前已经被其它文件占用,所以一个文件所包含的block号是分散的,而且可能分散程度还挺大的(比如一个4k的文件如果使用1k的block的话需要使用4个block才行!)。但是由于有inode的存在,其能够储存block号,所以找到文件数据还是不麻烦的,当然有的文件过大,inode本身不足以储存所有block号,其还会调用一些block来帮它储存多余的block号,这也就是inode结构的12个直接、一个间接、一个双间接与一个三间接记录区

现在应该差不多理解了inode和block的大致概念了吧,那现在应该确定每个文件都是有唯一的一个inode号了。接下来回到正题:硬连接,使用硬连接连接的文件的inode号是相同的哦,这样是为什么通过其中一个文件名访问文件所修改的内容通过另一个文件也能查看到,这就是因为它们就是一个文件嘛。删除其中一个”文件名”,另外一个文件还是存在的,也就是除非你把两个”文件名”都删掉后这个文件才会真的再也找不到

光说不练假把式,看一个例子就知道啦:

# 我先创建一个文件,再在另一个目录创建一个这个文件的硬连接
vim test.txt   # 目录1下创建text.txt,并在其中写下一些内容
# 切换目录后,使用ln命令创建硬连接,为便于区分命名我多加了一个1
ln ../test.txt test1.txt
# 之后使用ls命令查看两个文件名的信息
ls -il ../test.txt test1.txt

结果如下:
在这里插入图片描述

  • 第一列就是inode号,可以看到两个文件inode号一样,其中我省略了用户名的内容哈
  • 之后再对其中一个文件进行修改,查看另一个文件名访问的文件内容是否改变
  • 在test.txt中删除所有内容,发现从另一个目录中访问test1.txt的内容也全消失了,这个读者可以自己试一试哈。
  • 尝试删除test.txt,发现test1.txt文件还是原封不动地在那里哦

软连接(symbolic link)

软连接也是一种连接文件的形式,也叫符号连接,是比较好理解的。其类似于我们在windows中使用的快捷方式,因为其也只是创建一个快捷方式,使得我们在其它地方能快捷地访问到某文件或使用某个可执行文件。创建的软连接其实就是创建一个独立的文件,只不过这个独立的文件会最终指向你之前连接的源文件。也就是说如果源文件不见了,那么这个符号连接也就没作用了。

这个就简单举个简单的例子吧,比如你想在你当前的文件夹下使用python的最新版本,但是你还没有将其加入到环境变量中,你可以直接创建快捷方式到这个文件夹下就行啦。

ln -s /home/用户名/software/python/bin ./python
# 我这里就是将这个执行文件创建了快捷方式到当前目录下啦,这里如果相隔目录太远最好使用绝对路径哦,
# 要不然会有问题。使用ls命令就能看到python这个快捷方式啦
ls -l python

在这里插入图片描述

  • 因为这个快捷方式不在环境变量中,直接写python是识别不到的,要使用python直接./python才行
  • 同时这也避免了和linux默认携带的python名冲突

若是想要创建一般文件的快捷方式就更简单啦,这里就不再举例了。

希望你读有所得,但是如果有错误的话也希望能提醒一下呀,互相学习,哈哈!

参考:鸟哥的linux私房菜——鸟哥基础学习篇

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐