首页IT科技linux怎么打开链接文件(Linux下的链接文件详解)

linux怎么打开链接文件(Linux下的链接文件详解)

时间2025-08-04 19:20:03分类IT科技浏览4549
导读:几个基本概念...

几个基本概念

Linux下的链接文件可以分为硬链接(hard link)与软链接(soft link)             。要理解它们                ,必须先要理解几个基本概念                       。

inode

文件除了纯数据本身之外                     ,还必须包含有对这些纯数据的管理信息       ,如文件名             、访问权限                       、文件的属主以及该文件的数据所对应的磁盘块等等            ,这些管理信息称之为元数据(mata data)                      ,保存在文件的inode节点之中        。我们可以通过stat命令查看一个文件的inode信息:

这里我们查看了/etc/passwd文件的元数据信息          。ls -l命令也会列出一些文件的元数据信息(由左至右分别为:权限        、硬链接数          、属主                      、属组            、文件大小       、最近更改时间                     、文件名)          ,但相比之下        ,stat命令输出的信息更加完整                      。我们注意到                       ,stat输出的信息中             ,文件有三个时间戳:最近访问                、最近更改和最近改动    ,对应于英文分别为Access    、Modify和Change            。 Access time比较好理解                        ,当每次访问这个文件的数据(注意                 ,不是元数据),这个时间就会更新       。比如用cat或者more命令读取文件内容时                    ,会更新access time                     ,而用ls或者stat命令    ,由于只是访问了文件的inode                ,所以不会更新access time值                     。Modify time是文件数据最后一次被修改时间                     ,比如用vim编辑文件后保存文件       ,此时就会更新该文件modify time                。Change time是文件元数据(即inode)最后一次被修改的时间            ,比如用chown命令修改文件的属主                      ,此时就会更新文件的change time    。

其实最初当我们创建分区并用mkfs.ext4等命令创建文系统的时候          ,就已经在文件系统的固定区域保留了inode节点区                     。我们可以通过df -i命令查看某文件系统inode节点区域的大小及使用情况:

# df -ih /dev/mapper/pdc_bcfaffjfaj2 文件系统 Inode 已用(I) 可用(I) 已用(I)% 挂载点 /dev/mapper/pdc_bcfaffjfaj2 18M 127K 18M 1% /home

可以看到        ,在笔者的Linux Mint17.3系统中                       ,分区/dev/mapper/pdc_bcfaffjfaj2共保留了18M的inode区域             ,这个区域目前已经使用了127K                    。有没有可能出现某分区尚有空间而inode区域已用完的情况呢?有的。当小文件特别多的时候就会出现这种情况!这个时候即使文件系统还有空间可用    ,但我们仍然无法继续在这个文件系统内创建新的文件了                 。那假如在我的应用环境中真的小文件非常多该怎么办?其实我们在建立ext4文件系统时候是可以手动指定inode区域所占的比例大小的                        ,可以man mkfs.ext4查看相关的参数和选项                 ,这里不再详述                        。

刚才用stat查看文件的inode信息时,我们看到输出的信息中有一行Inode: 137143                    ,这个是/etc/passwd文件的inode号    。每个inode都有一个全文件系统唯一的inode号                     ,操作系统内核正是通过inode号而非文件名来识别不同的文件             。文件名仅仅是为了方便用户使用而已    ,内核是通过文件名找到inode                ,然后通过inode访问实际文件数据的                       。有没有可能有多个文件名对应于同一个inode呢?有的                     ,这样就产生了所谓硬链接文件        。

dentry

虽然每个文件对应了唯一的inode号       ,但inode号是杂乱而毫无意义的            ,不方面用户记忆和使用                      ,我们希望对每个文件取一个有意义的文件名          。现代文件系统提供的一个基本功能是按名存取          ,所以我们还需要建立文件名到inode号的对应        ,这就引出了目录项(directory entry即dentry)的概念                      。在Linux文件系统中有一类特殊的文件称为“目录             ”                       ,目录就保存了该目录下所有文件的文件名到inode号的对应关系             ,这里的每个对应关系就称为一个dentry            。而Linux把所有的文件和目录构建成了一个倒立的树状结构    ,这样                        ,我们只要确定了根目录的inode号                 ,就可以对整个文件系统进行按名存取了       。

hard link

硬链接的实质是现有文件在目录树中的另一个入口                     。也就是说,硬链接与原文件是分居于不同或相同目录下的的dentry而已                    ,它们指向同一个inode                     ,对应于相同的磁盘数据块(data block)    ,具有相同的访问权限                     、属性等                。简而言之                ,硬链接其实就是给现有的文件起了一个别名    。如果把文件系统比喻成一本书的话                     ,硬链接就是在书本的目录中       ,有两个目录项指向了同一页码的同一章节                     。

硬链接的优点是几乎不占磁盘空间(因为仅仅是增加了一个目录项而已)            ,但是这一优点相对于软链接其实并不明显(因为软链接占用的磁盘空间也很少)                    。另外                      ,硬链接有以下一些局限:1                    、不能跨文件系统创建硬链接。原因很简单          ,inode号只有在一个文件系统内才能保证是唯一的        ,如果跨越文件系统则inode号就可能重复                 。2、不能对目录创建硬链接                        。原因我在稍后解释    。正因为硬链接的这些局限                       ,加之软链接更加易于管理             ,所以软链接更加常用             。这一点在本文中举的例子也可以看出    ,几乎都是软链接的例子                       。

soft link

软链接又称为符号链接(symbolic link)                        ,简写为“symlink                       ”        。与硬链接仅仅是一个目录项不同                 ,软连接本身也是文件,不过这个文件的内容是另一个文件名的指针          。当Linux访问软链接时                    ,它会循着指针找出含有实际数据的目标文件                      。我们还以书本来打比方                     ,软链接是书本里的某一章节    ,不过这一章节什么内容都没有                ,只有一行字“转某某章某某页        ”            。

软链接可以跨越文件系统指向另一个分区的文件                     ,甚至可以跨越主机指向远程主机的一个文件       ,也可以指向目录       。在ls -l输出的文件列表中            ,第一个字段有“l          ”字样者表示该文件是符号链接                     。

$ ls -l total 0 lrwxrwxrwx 1 wjm wjm 11 Aug 10 00:51 hh -> /etc/passwd

我们看到                      ,软链接的权限为777          ,即所有权限都是开放的        ,实际上你也无法使用chmod命令修改其权限                       ,但是实际文件的保护权限仍然起作用                。

另外             ,符号链接可以指向不存在的文件(可能是原来指向的文件被删除了    ,或者指向的文件系统尚未挂载                        ,或者最初建立该符号链接的时候就指向了一个不存在的文件等等)                 ,我们称这种状态为“断裂                      ”(broken)    。与之相对的是,硬链接是不能指向一个不存在的文件的                     。

使用链接有何好处?

我们在此总结使用链接文件的以下几个的好处:

保持软件的兼容性

例如                    ,在RHEL6中我们看下面这条命令的输出:
$ ls -l /bin/sh lrwxrwxrwx. 1 root root 4 Jul 15 11:41 /bin/sh -> bash

我们看到                     ,/bin/sh文件其实是一个指向/bin/bash的符号链接                    。为什么要这样设计?因为几乎所有的shell script的第一行都是下面这样:

#!/bin/sh

“#!            ”符号表示该行指定该脚本所用的解释器。#!/bin/sh表示使用Bourne Shell作为解释器    ,这是一个早期的Shell                 。在现代的Linux发行版中通常采用Bourne Again Shell即bash                ,bash是对sh的改进和增强                     ,而早期的Bourne Shell在系统的中根本不存在                        。为了能够顺利的运行脚本而不必修改shell script       ,我们只需要创建一个软链接/bin/sh让其指向/bin/bash    。如此一来            ,就可以让bash来解释原本针对Bourne Shell编写的脚本了             。

方便软件的使用

比如我们安装了一个大型软件Matlab                      ,它可能默认安装在/usr/opt/Matlab目录下          ,它的可执行文件位置在/usr/opt/Matlab/bin目录下        ,除非你在这个路径加入到PATH环境变量里                       ,否则每次运行这个软件你都需要输入一长串的路径很不方便                       。你还可以这样做:
$ ln -s /usr/opt/Matlab/bin/matlab ~/bin/matlab

通过在你的~/bin下创建一个符号链接(~/bin系统默认已经包含在PATH环境变量里的)             ,今后在命令行下无需输入完整路径    ,只需输入matlab即可        。

维持旧的操作习惯

比如在SuSE中                        ,启动脚本的位置是放在/etc/init.d目录下                 ,而在RedHat的发行版中,是放在/etc/init.d/rc.d目录下          。为了避免因为从SuSE转换到RedHat系统而导致管理员找不到位置的情况                    ,我们可以创建一个符号链接/etc/init.d使其指向/etc/init.d/rc.d即可                      。事实上                     ,RedHat发行版也正是这样做的:
$ ls -ld /etc/init.d/ lrwxrwxrwx. 1 root root 11 Jul 15 11:41 init.d -> rc.d/init.d

方便系统管理

最让人印象深刻的一个例子应该是/etc/rc.d/rcX.d目录下的符号链接了(X为0~7数字)            。
$ ls -l /etc/rc.d/ total 60 drwxr-xr-x. 2 root root 4096 Jul 15 16:36 init.d -rwxr-xr-x. 1 root root 2617 Nov 23 2013 rc drwxr-xr-x. 2 root root 4096 Jul 15 16:36 rc0.d drwxr-xr-x. 2 root root 4096 Jul 15 16:36 rc1.d drwxr-xr-x. 2 root root 4096 Jul 15 16:36 rc2.d drwxr-xr-x. 2 root root 4096 Jul 15 16:36 rc3.d drwxr-xr-x. 2 root root 4096 Jul 15 16:36 rc4.d drwxr-xr-x. 2 root root 4096 Jul 15 16:36 rc5.d drwxr-xr-x. 2 root root 4096 Jul 15 16:36 rc6.d -rwxr-xr-x. 1 root root 220 Nov 23 2013 rc.local -rwxr-xr-x. 1 root root 19688 Nov 23 2013 rc.sysinit

在init.d/目录下有许多用于启动                 、停止系统服务的脚本    ,如sshd                        、crond等       。这些脚本可以接受一个参数                ,代表要启动(start)或停止(stop)服务                     。为了决定在某个运行级别运行哪些脚本及传递给这些脚本哪些参数                     ,RedHat设计了一个额外的目录机制       ,即rc0.d到rc6.d的7个目录            ,每个目录对应一个运行级别                。如果在某运行级别下需要启动某服务或者需要停止某服务                      ,就在对应的rcX.d目录下建立一个符号链接          ,指向init.d/目录下的脚本    。如:

$ ls -l /etc/rc.d/rc3.d total 0 lrwxrwxrwx. 1 root root 19 Jul 15 11:42 K10saslauthd -> ../init.d/saslauthd lrwxrwxrwx. 1 root root 20 Jul 15 11:42 K50netconsole -> ../init.d/netconsole lrwxrwxrwx. 1 root root 21 Jul 15 11:42 K87restorecond -> ../init.d/restorecond lrwxrwxrwx. 1 root root 15 Jul 15 11:42 K89rdisc -> ../init.d/rdisc lrwxrwxrwx. 1 root root 22 Jul 15 11:44 S02lvm2-monitor -> ../init.d/lvm2-monitor lrwxrwxrwx. 1 root root 19 Jul 15 11:42 S08ip6tables -> ../init.d/ip6tables lrwxrwxrwx. 1 root root 18 Jul 15 11:42 S08iptables -> ../init.d/iptables lrwxrwxrwx. 1 root root 17 Jul 15 11:42 S10network -> ../init.d/network lrwxrwxrwx. 1 root root 16 Jul 15 11:44 S11auditd -> ../init.d/auditd lrwxrwxrwx. 1 root root 17 Jul 15 11:42 S12rsyslog -> ../init.d/rsyslog ... ....

这里列出了在运行级3下需要运行的服务脚本及对应的参数        ,其中符号链接的第一个字母S和K分别表示传递参数start和stop                       ,后面跟着的两位数字表示脚本运行的先后顺序                     。这样一来             ,只要在rcX.d目录下新增或者移除链接    ,就可以控制各个runlevel需要运行哪些服务脚本;而如果需要修改某个服务脚本                        ,只需要编辑init.d/目录下的文件(“本尊       ”)                 ,而它可以影响所有rcX.d目录下的软链接(“分身                     ”)                    。这是多么简洁而巧妙的设计!

上一页12 下一页 阅读全文
声明:本站所有文章,如无特殊说明或标注                    ,均为本站原创发布。任何个人或组织                     ,在未征得本站同意时    ,禁止复制    、盗用             、采集                       、发布本站内容到任何网站        、书籍等各类媒体平台                 。如若本站内容侵犯了原著者的合法权益                ,可联系我们进行处理                        。

创心域SEO版权声明:以上内容作者已申请原创保护,未经允许不得转载,侵权必究!授权事宜、对本内容有异议或投诉,敬请联系网站管理员,我们将尽快回复您,谢谢合作!

展开全文READ MORE
eltamd官网查真伪教程(el-table 选中行与复选框相互联动的实现步骤)