- 浏览: 600165 次
- 性别:
- 来自: 厦门
文章分类
- 全部博客 (669)
- oracle (36)
- java (98)
- spring (48)
- UML (2)
- hibernate (10)
- tomcat (7)
- 高性能 (11)
- mysql (25)
- sql (19)
- web (42)
- 数据库设计 (4)
- Nio (6)
- Netty (8)
- Excel (3)
- File (4)
- AOP (1)
- Jetty (1)
- Log4J (4)
- 链表 (1)
- Spring Junit4 (3)
- Autowired Resource (0)
- Jackson (1)
- Javascript (58)
- Spring Cache (2)
- Spring - CXF (2)
- Spring Inject (2)
- 汉字拼音 (3)
- 代理模式 (3)
- Spring事务 (4)
- ActiveMQ (6)
- XML (3)
- Cglib (2)
- Activiti (15)
- 附件问题 (1)
- javaMail (1)
- Thread (19)
- 算法 (6)
- 正则表达式 (3)
- 国际化 (2)
- Json (3)
- EJB (3)
- Struts2 (1)
- Maven (7)
- Mybatis (7)
- Redis (8)
- DWR (1)
- Lucene (2)
- Linux (73)
- 杂谈 (2)
- CSS (13)
- Linux服务篇 (3)
- Kettle (9)
- android (81)
- protocol (2)
- EasyUI (6)
- nginx (2)
- zookeeper (6)
- Hadoop (41)
- cache (7)
- shiro (3)
- HBase (12)
- Hive (8)
- Spark (15)
- Scala (16)
- YARN (3)
- Kafka (5)
- Sqoop (2)
- Pig (3)
- Vue (6)
- sprint boot (19)
- dubbo (2)
- mongodb (2)
最新评论
稍微了解了文件系统后,再来我们得要知道如何查询整体文件系统的总容量与每个目录所占用的容量啰! 此外,前两章谈到的文件类型中尚未讲的很清楚的连结档 (Link file) 也会在这一小节当中介绍的。
磁盘与目录的容量:
现在我们知道磁盘的整体数据是在 superblock 区块中,但是每个各别文件的容量则在 inode 当中记载的。 那在文字接口底下该如何叫出这几个数据呢?底下就让我们来谈一谈这两个命令:
A df:列出文件系统的整体磁盘使用量;
B du:评估文件系统的磁盘使用量(常用在推估目录所占容量)
df
先来说明一下范例一所输出的结果信息为:
A Filesystem:代表该文件系统是在哪个 partition ,所以列出装置名称;
B 1k-blocks:说明底下的数字单位是 1KB 呦!可利用 -h 或 -m 来改变容量;
C Used:顾名思义,就是使用掉的硬盘空间啦!
D Available:也就是剩下的磁盘空间大小;
E Use%:就是磁盘的使用率啦!如果使用率高达 90% 以上时, 最好需要注意一下了,免得容量不足造成系统问题喔!(例如最容易被灌爆的 /var/spool/mail 这个放置邮件的磁盘)
F Mounted on:就是磁盘挂载的目录所在啦!(挂载点啦!)
由于 df 主要读取的数据几乎都是针对一整个文件系统,因此读取的范围主要是在 Superblock 内的信息, 所以这个命令显示结果的速度非常的快速!在显示的结果中你需要特别留意的是那个根目录的剩余容量! 因为我们所有的数据都是由根目录衍生出来的,因此当根目录的剩余容量剩下 0 时,那你的 Linux 可能就问题很大了。
另外需要注意的是,如果使用 -a 这个参数时,系统会出现 /proc 这个挂载点,但是里面的东西都是 0 ,不要紧张! /proc 的东西都是 Linux 系统所需要加载的系统数据,而且是挂载在『内存当中』的, 所以当然没有占任何的硬盘空间啰!
至于那个 /dev/shm/ 目录,其实是利用内存虚拟出来的磁盘空间! 由于是透过内存仿真出来的磁盘,因此你在这个目录底下创建任何数据文件时,访问速度是非常快速的!(在内存内工作) 不过,也由于他是内存仿真出来的,因此这个文件系统的大小在每部主机上都不一样,而且创建的东西在下次启动时就消失了! 因为是在内存中嘛!
du
与 df 不一样的是,du 这个命令其实会直接到文件系统内去搜寻所有的文件数据, 所以上述第三个范例命令的运行会运行一小段时间!此外,在默认的情况下,容量的输出是以 KB 来设计的, 如果你想要知道目录占了多少 MB ,那么就使用 -m 这个参数即可啰!而, 如果你只想要知道该目录占了多少容量的话,使用 -s 就可以啦!
至于 -S 这个选项部分,由于 du 默认会将所有文件的大小均列出,因此假设你在 /etc 底下使用 du 时, 所有的文件大小,包括 /etc 底下的次目录容量也会被计算一次。然后最终的容量 (/etc) 也会加总一次, 因此很多朋友都会误会 du 分析的结果不太对劲。所以啰,如果想要列出某目录下的全部数据, 或许也可以加上 -S 的选项,减少次目录的加总喔!
实体链接与符号链接: ln
关于链接(link)数据我们第六章的Linux文件属性及Linux文件种类与扩展名当中提过一些信息, 不过当时由于尚未讲到文件系统,因此无法较完整的介绍连结档啦。不过在上一小节谈完了文件系统后, 我们可以来了解一下连结档这玩意儿了。
在 Linux 底下的连结档有两种,一种是类似 Windows 的快捷方式功能的文件,可以让你快速的链接到目标文件(或目录); 另一种则是透过文件系统的 inode 连结来产生新档名,而不是产生新文件!这种称为实体链接 (hard link)。 这两种玩意儿是完全不一样的东西呢!现在就分别来谈谈。
Hard Link (实体链接, 硬式连结或实际连结)
在前一小节当中,我们知道几件重要的信息,包括:
A 每个文件都会占用一个 inode ,文件内容由 inode 的记录来指向;
B 想要读取该文件,必须要经过目录记录的文件名来指向到正确的 inode 号码才能读取。
也就是说,其实文件名只与目录有关,但是文件内容则与 inode 有关。那么想一想, 有没有可能有多个档名对应到同一个 inode 号码呢?有的!那就是 hard link 的由来。 所以简单的说:hard link 只是在某个目录下新增一笔档名链接到某 inode 号码的关连记录而已。
举个例子来说,假设我系统有个 /root/crontab 他是 /etc/crontab 的实体链接,也就是说这两个档名连结到同一个 inode , 自然这两个文件名的所有相关信息都会一模一样(除了文件名之外)。实际的情况可以如下所示:
你可以发现两个档名都连结到 1912701 这个 inode 号码,所以您瞧瞧,是否文件的权限/属性完全一样呢? 因为这两个『档名』其实是一模一样的『文件』啦!而且你也会发现第二个字段由原本的 1 变成 2 了! 那个字段称为『连结』,这个字段的意义为:『有多少个档名链接到这个 inode 号码』的意思。 如果将读取到正确数据的方式画成示意图,就类似如下画面:
上图的意思是,你可以透过 1 或 2 的目录之 inode 指定的 block 找到两个不同的档名,而不管使用哪个档名均可以指到 real 那个 inode 去读取到最终数据!那这样有什么好处呢?最大的好处就是『安全』!如同上图中, 如果你将任何一个『档名』删除,其实 inode 与 block 都还是存在的! 此时你可以透过另一个『档名』来读取到正确的文件数据喔!此外,不论你使用哪个『档名』来编辑, 最终的结果都会写入到相同的 inode 与 block 中,因此均能进行数据的修改哩!
一般来说,使用 hard link 配置链接文件时,磁盘的空间与 inode 的数目都不会改变! 我们还是由图 2.2.1 来看,由图中可以知道, hard link 只是在某个目录下的 block 多写入一个关连数据而已,既不会添加 inode 也不会耗用 block 数量哩!
由图 2.2.1 其实我们也能够知道,事实上 hard link 应该仅能在单一文件系统中进行的,应该是不能够跨文件系统才对! 因为图 2.2.1 就是在同一个 filesystem 上嘛!所以 hard link 是有限制的:
A 不能跨 Filesystem;
B 不能 link 目录。
不能跨 Filesystem 还好理解,那不能 hard link 到目录又是怎么回事呢?这是因为如果使用 hard link 链接到目录时, 链接的数据需要连同被链接目录底下的所有数据都创建链接,举例来说,如果你要将 /etc 使用实体链接创建一个 /etc_hd 的目录时,那么在 /etc_hd 底下的所有档名同时都与 /etc 底下的檔名要创建 hard link 的,而不是仅连结到 /etc_hd 与 /etc 而已。 并且,未来如果需要在 /etc_hd 底下创建新文件时,连带的, /etc 底下的数据又得要创建一次 hard link ,因此造成环境相当大的复杂度。 所以啰,目前 hard link 对于目录暂时还是不支持的啊!
Symbolic Link (符号链接,亦即是快捷方式)
相对于 hard link , Symbolic link 可就好理解多了,基本上, Symbolic link 就是在创建一个独立的文件,而这个文件会让数据的读取指向他 link 的那个文件的档名!由于只是利用文件来做为指向的动作, 所以,当来源档被删除之后,symbolic link 的文件会『开不了』, 会一直说『无法开启某文件!』。实际上就是找不到原始『档名』而已啦!
举例来说,我们先创建一个符号链接文件链接到 /etc/crontab 去看看:
由上表的结果我们可以知道两个文件指向不同的 inode 号码,当然就是两个独立的文件存在! 而且连结档的重要内容就是他会写上目标文件的『文件名』, 你可以发现为什么上表中连结档的大小为 12 bytes 呢? 因为箭头(-->)右边的档名『/etc/crontab』总共有 12 个英文,每个英文占用 1 个 byes ,所以文件大小就是 12bytes了!
关于上述的说明,我们以如下图示来解释:
由 1 号 inode 读取到连结档的内容仅有档名,根据档名链接到正确的目录去取得目标文件的 inode , 最终就能够读取到正确的数据了。你可以发现的是,如果目标文件(/etc/crontab)被删除了,那么整个环节就会无法继续进行下去, 所以就会发生无法透过连结档读取的问题了!
这里还是得特别留意,这个 Symbolic Link 与 Windows 的快捷方式可以给他划上等号,由 Symbolic link 所创建的文件为一个独立的新的文件,所以会占用掉 inode 与 block 喔!
由上面的说明来看,似乎 hard link 比较安全,因为即使某一个目录下的关连数据被杀掉了, 也没有关系,只要有任何一个目录下存在着关连数据,那么该文件就不会不见!举上面的例子来说,我的 /etc/crontab 与 /root/crontab 指向同一个文件,如果我删除了 /etc/crontab 这个文件,该删除的动作其实只是将 /etc 目录下关于 crontab 的关连数据拿掉而已, crontab 所在的 inode 与 block 其实都没有被变动喔!
不过由于 Hard Link 的限制太多了,包括无法做『目录』的 link , 所以在用途上面是比较受限的!反而是 Symbolic Link 的使用方面较广喔!好了, 说的天花乱坠,看你也差不多快要昏倒了!没关系,实作一下就知道怎么回事了!要制作连结档就必须要使用 ln 这个命令呢!
要注意啰!使用 ln 如果不加任何参数的话,那么就是 Hard Link 啰!如同范例二的情况,添加了 hard link 之后,可以发现使用 ls -l 时,显示的 link 那一栏属性添加了!而如果这个时候砍掉 passwd 会发生什么事情呢?passwd-hd 的内容还是会跟原来 passwd 相同,但是 passwd-so 就会找不到该文件啦!
而如果 ln 使用 -s 的参数时,就做成差不多是 Windows 底下的『快捷方式』的意思。当你修改 Linux 下的 symbolic link 文件时,则更动的其实是『原始档』, 所以不论你的这个原始档被连结到哪里去,只要你修改了连结档,原始档就跟着变啰! 以上面为例,由于你使用 -s 的参数创建一个名为 passwd-so 的文件,则你修改 passwd-so 时,其内容与 passwd 完全相同,并且,当你按下储存之后,被改变的将是 passwd 这个文件!
此外,如果你做了底下这样的连结:
ln -s /bin /root/bin
那么如果你进入 /root/bin 这个目录下,『请注意呦!该目录其实是 /bin 这个目录,因为你做了连结档了!』所以,如果你进入 /root/bin 这个刚刚创建的链接目录, 并且将其中的数据杀掉时,嗯! /bin 里面的数据就通通不见了!这点请千万注意!所以赶紧利用『rm /root/bin 』 将这个连结档删除吧!
基本上, Symbolic link 的用途比较广,所以您要特别留意 symbolic link 的用法呢!未来一定还会常常用到的啦!
关于目录的 link 数量:
或许您已经发现了,那就是,当我们以 hard link 进行『文件的连结』时,可以发现,在 ls -l 所显示的第二字段会添加一才对,那么请教,如果创建目录时,他默认的 link 数量会是多少? 让我们来想一想,一个『空目录』里面至少会存在些什么?呵呵!就是存在 . 与 .. 这两个目录啊! 那么,当我们创建一个新目录名称为 /tmp/testing 时,基本上会有三个东西,那就是:
A /tmp/testing
B /tmp/testing/.
C /tmp/testing/..
而其中 /tmp/testing 与 /tmp/testing/. 其实是一样的!都代表该目录啊~而 /tmp/testing/.. 则代表 /tmp 这个目录,所以说,当我们创建一个新的目录时, 『新的目录的 link 数为 2 ,而上一级目录的 link 数则会添加 1 』 不信的话,我们来作个测试看看:
瞧!原本的所谓上一级目录 /tmp 的 link 数量由 5 添加为 6 ,至于新目录 /tmp/testing 则为 2 ,这样可以理解目录的 link 数量的意义了吗? ^_^
转自:http://vbird.dic.ksu.edu.tw/linux_basic/0230filesystem_2.php
磁盘与目录的容量:
现在我们知道磁盘的整体数据是在 superblock 区块中,但是每个各别文件的容量则在 inode 当中记载的。 那在文字接口底下该如何叫出这几个数据呢?底下就让我们来谈一谈这两个命令:
A df:列出文件系统的整体磁盘使用量;
B du:评估文件系统的磁盘使用量(常用在推估目录所占容量)
df
[root@www ~]# df [-ahikHTm] [目录或文件名] 选项与参数: -a :列出所有的文件系统,包括系统特有的 /proc 等文件系统; -k :以 KBytes 的容量显示各文件系统; -m :以 MBytes 的容量显示各文件系统; -h :以人们较易阅读的 GBytes, MBytes, KBytes 等格式自行显示; -H :以 M=1000K 取代 M=1024K 的进位方式; -T :连同该 partition 的 filesystem 名称 (例如 ext3) 也列出; -i :不用硬盘容量,而以 inode 的数量来显示 范例一:将系统内所有的 filesystem 列出来! [root@www ~]# df Filesystem 1K-blocks Used Available Use% Mounted on /dev/hdc2 9920624 3823112 5585444 41% / /dev/hdc3 4956316 141376 4559108 4% /home /dev/hdc1 101086 11126 84741 12% /boot tmpfs 371332 0 371332 0% /dev/shm # 在 Linux 底下如果 df 没有加任何选项,那么默认会将系统内所有的 # (不含特殊内存内的文件系统与 swap) 都以 1 Kbytes 的容量来列出来! # 至于那个 /dev/shm 是与内存有关的挂载,先不要理他! 范例二:将容量结果以易读的容量格式显示出来 [root@www ~]# df -h Filesystem Size Used Avail Use% Mounted on /dev/hdc2 9.5G 3.7G 5.4G 41% / /dev/hdc3 4.8G 139M 4.4G 4% /home /dev/hdc1 99M 11M 83M 12% /boot tmpfs 363M 0 363M 0% /dev/shm # 不同于范例一,这里会以 G/M 等容量格式显示出来,比较容易看啦! 范例三:将系统内的所有特殊文件格式及名称都列出来 [root@www ~]# df -aT Filesystem Type 1K-blocks Used Available Use% Mounted on /dev/hdc2 ext3 9920624 3823112 5585444 41% / proc proc 0 0 0 - /proc sysfs sysfs 0 0 0 - /sys devpts devpts 0 0 0 - /dev/pts /dev/hdc3 ext3 4956316 141376 4559108 4% /home /dev/hdc1 ext3 101086 11126 84741 12% /boot tmpfs tmpfs 371332 0 371332 0% /dev/shm none binfmt_misc 0 0 0 - /proc/sys/fs/binfmt_misc sunrpc rpc_pipefs 0 0 0 - /var/lib/nfs/rpc_pipefs # 系统里面其实还有很多特殊的文件系统存在的。那些比较特殊的文件系统几乎 # 都是在内存当中,例如 /proc 这个挂载点。因此,这些特殊的文件系统 # 都不会占据硬盘空间喔! ^_^ 范例四:将 /etc 底下的可用的磁盘容量以易读的容量格式显示 [root@www ~]# df -h /etc Filesystem Size Used Avail Use% Mounted on /dev/hdc2 9.5G 3.7G 5.4G 41% / # 这个范例比较有趣一点啦,在 df 后面加上目录或者是文件时, df # 会自动的分析该目录或文件所在的 partition ,并将该 partition 的容量显示出来, # 所以,您就可以知道某个目录底下还有多少容量可以使用了! ^_^ 范例五:将目前各个 partition 当中可用的 inode 数量列出 [root@www ~]# df -ih Filesystem Inodes IUsed IFree IUse% Mounted on /dev/hdc2 2.5M 147K 2.3M 6% / /dev/hdc3 1.3M 46 1.3M 1% /home /dev/hdc1 26K 34 26K 1% /boot tmpfs 91K 1 91K 1% /dev/shm # 这个范例则主要列出可用的 inode 剩余量与总容量。分析一下与范例一的关系, # 你可以清楚的发现到,通常 inode 的数量剩余都比 block 还要多呢
先来说明一下范例一所输出的结果信息为:
A Filesystem:代表该文件系统是在哪个 partition ,所以列出装置名称;
B 1k-blocks:说明底下的数字单位是 1KB 呦!可利用 -h 或 -m 来改变容量;
C Used:顾名思义,就是使用掉的硬盘空间啦!
D Available:也就是剩下的磁盘空间大小;
E Use%:就是磁盘的使用率啦!如果使用率高达 90% 以上时, 最好需要注意一下了,免得容量不足造成系统问题喔!(例如最容易被灌爆的 /var/spool/mail 这个放置邮件的磁盘)
F Mounted on:就是磁盘挂载的目录所在啦!(挂载点啦!)
由于 df 主要读取的数据几乎都是针对一整个文件系统,因此读取的范围主要是在 Superblock 内的信息, 所以这个命令显示结果的速度非常的快速!在显示的结果中你需要特别留意的是那个根目录的剩余容量! 因为我们所有的数据都是由根目录衍生出来的,因此当根目录的剩余容量剩下 0 时,那你的 Linux 可能就问题很大了。
另外需要注意的是,如果使用 -a 这个参数时,系统会出现 /proc 这个挂载点,但是里面的东西都是 0 ,不要紧张! /proc 的东西都是 Linux 系统所需要加载的系统数据,而且是挂载在『内存当中』的, 所以当然没有占任何的硬盘空间啰!
至于那个 /dev/shm/ 目录,其实是利用内存虚拟出来的磁盘空间! 由于是透过内存仿真出来的磁盘,因此你在这个目录底下创建任何数据文件时,访问速度是非常快速的!(在内存内工作) 不过,也由于他是内存仿真出来的,因此这个文件系统的大小在每部主机上都不一样,而且创建的东西在下次启动时就消失了! 因为是在内存中嘛!
du
[root@www ~]# du [-ahskm] 文件或目录名称 选项与参数: -a :列出所有的文件与目录容量,因为默认仅统计目录底下的文件量而已。 -h :以人们较易读的容量格式 (G/M) 显示; -s :列出总量而已,而不列出每个各别的目录占用容量; -S :不包括子目录下的总计,与 -s 有点差别。 -k :以 KBytes 列出容量显示; -m :以 MBytes 列出容量显示; 范例一:列出目前目录下的所有文件容量 [root@www ~]# du 8 ./test4 <==每个目录都会列出来 8 ./test2 ....中间省略.... 12 ./.gconfd <==包括隐藏文件的目录 220 . <==这个目录(.)所占用的总量 # 直接输入 du 没有加任何选项时,则 du 会分析『目前所在目录』 # 的文件与目录所占用的硬盘空间。但是,实际显示时,仅会显示目录容量(不含文件), # 因此 . 目录有很多文件没有被列出来,所以全部的目录相加不会等于 . 的容量喔! # 此外,输出的数值数据为 1K 大小的容量单位。 范例二:同范例一,但是将文件的容量也列出来 [root@www ~]# du -a 12 ./install.log.syslog <==有文件的列表了 8 ./.bash_logout 8 ./test4 8 ./test2 ....中间省略.... 12 ./.gconfd 220 . 范例三:检查根目录底下每个目录所占用的容量 [root@www ~]# du -sm /* 7 /bin 6 /boot .....中间省略.... 0 /proc .....中间省略.... 1 /tmp 3859 /usr <==系统初期最大就是他了啦! 77 /var # 这是个很常被使用的功能~利用通配符 * 来代表每个目录, # 如果想要检查某个目录下,哪个次目录占用最大的容量,可以用这个方法找出来 # 值得注意的是,如果刚刚安装好 Linux 时,那么整个系统容量最大的应该是 /usr # 而 /proc 虽然有列出容量,但是那个容量是在内存中,不占硬盘空间。
与 df 不一样的是,du 这个命令其实会直接到文件系统内去搜寻所有的文件数据, 所以上述第三个范例命令的运行会运行一小段时间!此外,在默认的情况下,容量的输出是以 KB 来设计的, 如果你想要知道目录占了多少 MB ,那么就使用 -m 这个参数即可啰!而, 如果你只想要知道该目录占了多少容量的话,使用 -s 就可以啦!
至于 -S 这个选项部分,由于 du 默认会将所有文件的大小均列出,因此假设你在 /etc 底下使用 du 时, 所有的文件大小,包括 /etc 底下的次目录容量也会被计算一次。然后最终的容量 (/etc) 也会加总一次, 因此很多朋友都会误会 du 分析的结果不太对劲。所以啰,如果想要列出某目录下的全部数据, 或许也可以加上 -S 的选项,减少次目录的加总喔!
实体链接与符号链接: ln
关于链接(link)数据我们第六章的Linux文件属性及Linux文件种类与扩展名当中提过一些信息, 不过当时由于尚未讲到文件系统,因此无法较完整的介绍连结档啦。不过在上一小节谈完了文件系统后, 我们可以来了解一下连结档这玩意儿了。
在 Linux 底下的连结档有两种,一种是类似 Windows 的快捷方式功能的文件,可以让你快速的链接到目标文件(或目录); 另一种则是透过文件系统的 inode 连结来产生新档名,而不是产生新文件!这种称为实体链接 (hard link)。 这两种玩意儿是完全不一样的东西呢!现在就分别来谈谈。
Hard Link (实体链接, 硬式连结或实际连结)
在前一小节当中,我们知道几件重要的信息,包括:
A 每个文件都会占用一个 inode ,文件内容由 inode 的记录来指向;
B 想要读取该文件,必须要经过目录记录的文件名来指向到正确的 inode 号码才能读取。
也就是说,其实文件名只与目录有关,但是文件内容则与 inode 有关。那么想一想, 有没有可能有多个档名对应到同一个 inode 号码呢?有的!那就是 hard link 的由来。 所以简单的说:hard link 只是在某个目录下新增一笔档名链接到某 inode 号码的关连记录而已。
举个例子来说,假设我系统有个 /root/crontab 他是 /etc/crontab 的实体链接,也就是说这两个档名连结到同一个 inode , 自然这两个文件名的所有相关信息都会一模一样(除了文件名之外)。实际的情况可以如下所示:
[root@www ~]# ln /etc/crontab . <==创建实体链接的命令 [root@www ~]# ll -i /etc/crontab /root/crontab 1912701 -rw-r--r-- 2 root root 255 Jan 6 2007 /etc/crontab 1912701 -rw-r--r-- 2 root root 255 Jan 6 2007 /root/crontab
你可以发现两个档名都连结到 1912701 这个 inode 号码,所以您瞧瞧,是否文件的权限/属性完全一样呢? 因为这两个『档名』其实是一模一样的『文件』啦!而且你也会发现第二个字段由原本的 1 变成 2 了! 那个字段称为『连结』,这个字段的意义为:『有多少个档名链接到这个 inode 号码』的意思。 如果将读取到正确数据的方式画成示意图,就类似如下画面:
上图的意思是,你可以透过 1 或 2 的目录之 inode 指定的 block 找到两个不同的档名,而不管使用哪个档名均可以指到 real 那个 inode 去读取到最终数据!那这样有什么好处呢?最大的好处就是『安全』!如同上图中, 如果你将任何一个『档名』删除,其实 inode 与 block 都还是存在的! 此时你可以透过另一个『档名』来读取到正确的文件数据喔!此外,不论你使用哪个『档名』来编辑, 最终的结果都会写入到相同的 inode 与 block 中,因此均能进行数据的修改哩!
一般来说,使用 hard link 配置链接文件时,磁盘的空间与 inode 的数目都不会改变! 我们还是由图 2.2.1 来看,由图中可以知道, hard link 只是在某个目录下的 block 多写入一个关连数据而已,既不会添加 inode 也不会耗用 block 数量哩!
由图 2.2.1 其实我们也能够知道,事实上 hard link 应该仅能在单一文件系统中进行的,应该是不能够跨文件系统才对! 因为图 2.2.1 就是在同一个 filesystem 上嘛!所以 hard link 是有限制的:
A 不能跨 Filesystem;
B 不能 link 目录。
不能跨 Filesystem 还好理解,那不能 hard link 到目录又是怎么回事呢?这是因为如果使用 hard link 链接到目录时, 链接的数据需要连同被链接目录底下的所有数据都创建链接,举例来说,如果你要将 /etc 使用实体链接创建一个 /etc_hd 的目录时,那么在 /etc_hd 底下的所有档名同时都与 /etc 底下的檔名要创建 hard link 的,而不是仅连结到 /etc_hd 与 /etc 而已。 并且,未来如果需要在 /etc_hd 底下创建新文件时,连带的, /etc 底下的数据又得要创建一次 hard link ,因此造成环境相当大的复杂度。 所以啰,目前 hard link 对于目录暂时还是不支持的啊!
Symbolic Link (符号链接,亦即是快捷方式)
相对于 hard link , Symbolic link 可就好理解多了,基本上, Symbolic link 就是在创建一个独立的文件,而这个文件会让数据的读取指向他 link 的那个文件的档名!由于只是利用文件来做为指向的动作, 所以,当来源档被删除之后,symbolic link 的文件会『开不了』, 会一直说『无法开启某文件!』。实际上就是找不到原始『档名』而已啦!
举例来说,我们先创建一个符号链接文件链接到 /etc/crontab 去看看:
[root@www ~]# ln -s /etc/crontab crontab2 [root@www ~]# ll -i /etc/crontab /root/crontab2 1912701 -rw-r--r-- 2 root root 255 Jan 6 2007 /etc/crontab 654687 lrwxrwxrwx 1 root root 12 Oct 22 13:58 /root/crontab2 -> /etc/crontab
由上表的结果我们可以知道两个文件指向不同的 inode 号码,当然就是两个独立的文件存在! 而且连结档的重要内容就是他会写上目标文件的『文件名』, 你可以发现为什么上表中连结档的大小为 12 bytes 呢? 因为箭头(-->)右边的档名『/etc/crontab』总共有 12 个英文,每个英文占用 1 个 byes ,所以文件大小就是 12bytes了!
关于上述的说明,我们以如下图示来解释:
由 1 号 inode 读取到连结档的内容仅有档名,根据档名链接到正确的目录去取得目标文件的 inode , 最终就能够读取到正确的数据了。你可以发现的是,如果目标文件(/etc/crontab)被删除了,那么整个环节就会无法继续进行下去, 所以就会发生无法透过连结档读取的问题了!
这里还是得特别留意,这个 Symbolic Link 与 Windows 的快捷方式可以给他划上等号,由 Symbolic link 所创建的文件为一个独立的新的文件,所以会占用掉 inode 与 block 喔!
由上面的说明来看,似乎 hard link 比较安全,因为即使某一个目录下的关连数据被杀掉了, 也没有关系,只要有任何一个目录下存在着关连数据,那么该文件就不会不见!举上面的例子来说,我的 /etc/crontab 与 /root/crontab 指向同一个文件,如果我删除了 /etc/crontab 这个文件,该删除的动作其实只是将 /etc 目录下关于 crontab 的关连数据拿掉而已, crontab 所在的 inode 与 block 其实都没有被变动喔!
不过由于 Hard Link 的限制太多了,包括无法做『目录』的 link , 所以在用途上面是比较受限的!反而是 Symbolic Link 的使用方面较广喔!好了, 说的天花乱坠,看你也差不多快要昏倒了!没关系,实作一下就知道怎么回事了!要制作连结档就必须要使用 ln 这个命令呢!
[root@www ~]# ln [-sf] 来源文件 目标文件 选项与参数: -s :如果不加任何参数就进行连结,那就是hard link,至于 -s 就是symbolic link -f :如果 目标文件 存在时,就主动的将目标文件直接移除后再创建! 范例一:将 /etc/passwd 复制到 /tmp 底下,并且观察 inode 与 block [root@www ~]# cd /tmp [root@www tmp]# cp -a /etc/passwd . [root@www tmp]# du -sb ; df -i . 18340 . <==先注意一下这里的容量是多少! Filesystem Inodes IUsed IFree IUse% Mounted on /dev/hdc2 2560864 149738 2411126 6% / # 利用 du 与 df 来检查一下目前的参数~那个 du -sb # 是计算整个 /tmp 底下有多少 bytes 的容量啦! 范例二:将 /tmp/passwd 制作 hard link 成为 passwd-hd 文件,并观察文件与容量 [root@www tmp]# ln passwd passwd-hd [root@www tmp]# du -sb ; df -i . 18340 . Filesystem Inodes IUsed IFree IUse% Mounted on /dev/hdc2 2560864 149738 2411126 6% / # 仔细看,即使多了一个文件在 /tmp 底下,整个 inode 与 block 的容量并没有改变! [root@www tmp]# ls -il passwd* 586361 -rw-r--r-- 2 root root 1945 Sep 29 02:21 passwd 586361 -rw-r--r-- 2 root root 1945 Sep 29 02:21 passwd-hd # 原来是指向同一个 inode 啊!这是个重点啊!另外,那个第二栏的连结数也会添加! 范例三:将 /tmp/passwd 创建一个符号链接 [root@www tmp]# ln -s passwd passwd-so [root@www tmp]# ls -li passwd* 586361 -rw-r--r-- 2 root root 1945 Sep 29 02:21 passwd 586361 -rw-r--r-- 2 root root 1945 Sep 29 02:21 passwd-hd 586401 lrwxrwxrwx 1 root root 6 Oct 22 14:18 passwd-so -> passwd # passwd-so 指向的 inode number 不同了!这是一个新的文件~这个文件的内容是指向 # passwd 的。passwd-so 的大小是 6bytes ,因为 passwd 共有六个字符之故 [root@www tmp]# du -sb ; df -i . 18346 . Filesystem Inodes IUsed IFree IUse% Mounted on /dev/hdc2 2560864 149739 2411125 6% / # 呼呼!整个容量与 inode 使用数都改变啰~确实如此啊! 范例四:删除源文件 passwd ,其他两个文件是否能够开启? [root@www tmp]# rm passwd [root@www tmp]# cat passwd-hd ......正常显示完毕! [root@www tmp]# cat passwd-so cat: passwd-so: No such file or directory [root@www tmp]# ll passwd* -rw-r--r-- 1 root root 1945 Sep 29 02:21 passwd-hd lrwxrwxrwx 1 root root 6 Oct 22 14:18 passwd-so -> passwd # 怕了吧!符号链接果然无法开启!另外,如果符号链接的目标文件不存在, # 其实档名的部分就会有特殊的颜色显示喔!
要注意啰!使用 ln 如果不加任何参数的话,那么就是 Hard Link 啰!如同范例二的情况,添加了 hard link 之后,可以发现使用 ls -l 时,显示的 link 那一栏属性添加了!而如果这个时候砍掉 passwd 会发生什么事情呢?passwd-hd 的内容还是会跟原来 passwd 相同,但是 passwd-so 就会找不到该文件啦!
而如果 ln 使用 -s 的参数时,就做成差不多是 Windows 底下的『快捷方式』的意思。当你修改 Linux 下的 symbolic link 文件时,则更动的其实是『原始档』, 所以不论你的这个原始档被连结到哪里去,只要你修改了连结档,原始档就跟着变啰! 以上面为例,由于你使用 -s 的参数创建一个名为 passwd-so 的文件,则你修改 passwd-so 时,其内容与 passwd 完全相同,并且,当你按下储存之后,被改变的将是 passwd 这个文件!
此外,如果你做了底下这样的连结:
ln -s /bin /root/bin
那么如果你进入 /root/bin 这个目录下,『请注意呦!该目录其实是 /bin 这个目录,因为你做了连结档了!』所以,如果你进入 /root/bin 这个刚刚创建的链接目录, 并且将其中的数据杀掉时,嗯! /bin 里面的数据就通通不见了!这点请千万注意!所以赶紧利用『rm /root/bin 』 将这个连结档删除吧!
基本上, Symbolic link 的用途比较广,所以您要特别留意 symbolic link 的用法呢!未来一定还会常常用到的啦!
关于目录的 link 数量:
或许您已经发现了,那就是,当我们以 hard link 进行『文件的连结』时,可以发现,在 ls -l 所显示的第二字段会添加一才对,那么请教,如果创建目录时,他默认的 link 数量会是多少? 让我们来想一想,一个『空目录』里面至少会存在些什么?呵呵!就是存在 . 与 .. 这两个目录啊! 那么,当我们创建一个新目录名称为 /tmp/testing 时,基本上会有三个东西,那就是:
A /tmp/testing
B /tmp/testing/.
C /tmp/testing/..
而其中 /tmp/testing 与 /tmp/testing/. 其实是一样的!都代表该目录啊~而 /tmp/testing/.. 则代表 /tmp 这个目录,所以说,当我们创建一个新的目录时, 『新的目录的 link 数为 2 ,而上一级目录的 link 数则会添加 1 』 不信的话,我们来作个测试看看:
[root@www ~]# ls -ld /tmp drwxrwxrwt 5 root root 4096 Oct 22 14:22 /tmp [root@www ~]# mkdir /tmp/testing1 [root@www ~]# ls -ld /tmp drwxrwxrwt 6 root root 4096 Oct 22 14:37 /tmp [root@www ~]# ls -ld /tmp/testing1 drwxr-xr-x 2 root root 4096 Oct 22 14:37 /tmp/testing1
瞧!原本的所谓上一级目录 /tmp 的 link 数量由 5 添加为 6 ,至于新目录 /tmp/testing 则为 2 ,这样可以理解目录的 link 数量的意义了吗? ^_^
转自:http://vbird.dic.ksu.edu.tw/linux_basic/0230filesystem_2.php
发表评论
文章已被作者锁定,不允许评论。
-
Linux ubuntu配置SSH免密登陆
2017-05-05 16:15 4651、安装 Ubuntu14.04默认安装了ssh-client ... -
Linux ubuntu虚拟机连接上网总结
2017-05-05 13:37 5121.首先查看主机的ip信息 ipconfig /all ... -
Linux七个运行级别
2015-03-03 09:20 552运行级别就是操作系统当前正在运行的功能级别。级别是从0到6,具 ... -
第二十四章 CentOS 系统配置工具: setup
2014-10-30 20:05 677系统配置除了使用手动 ... -
第二十二章 启动过程的问题解决
2014-10-28 19:34 426很多时候,我们可能因 ... -
第二十二章 Boot Loader: Grub
2014-10-27 19:44 576在看完了前面的整个启 ... -
第二十二章 核心与核心模块
2014-10-23 19:28 348谈完了整个启动的流程 ... -
第二十二章 Linux 的启动流程分析
2014-10-22 20:08 394启动不是只要按一下电 ... -
第二十一章 管理的抉择:RPM 还是 Tarball
2014-10-20 19:24 502这一直是个有趣的问题 ... -
第二十一章 YUM 线上升级机制
2014-10-15 19:33 529我们在本章一开始的地方谈到过 yum 这玩意儿,这个 yum ... -
第二十一章 SRPM 的使用 : rpmbuild
2014-10-14 19:44 966谈完了 RPM 类型的软件之后,再来我们谈一谈包含了 Sour ... -
第二十一章 RPM 软件管理程序: rpm
2014-10-13 20:10 459RPM 的使用其实不难,只要使用 rpm 这个命令即可!鸟哥最 ... -
第二十章 函式库管理
2014-10-13 19:25 479在我们的 Linux 操作系统 ... -
第二十章 Tarball 的管理与建议
2014-10-10 19:54 497在我们知道了原始码的 ... -
第二十章 用 make 进行巨集编译
2014-10-09 20:04 534在本章一开始我们提到过 make 的功能是可以简化编译过程里面 ... -
第二十章 开放源码的软件安装与升级简介
2014-10-09 19:47 441如果鸟哥想要在我的 Lin ... -
第十九章 分析登录文件
2014-10-08 19:34 408登录文件的分析是很重要的!你可以自行以 vi 进入登录文 ... -
第十九章 登录文件的轮替(logrotate)
2014-10-08 19:28 514假设我们已经将登 ... -
第十九章 syslogd :记录登录文件的服务
2014-09-28 20:11 681刚刚提到说 Linux 的登录文件主要是由 syslogd 在 ... -
第十八章 系统开启的服务
2014-09-25 19:33 718好了,现在假设你已经知道了 daemons 的启动文件放置的目 ...
相关推荐
8. `ln`:创建文件链接,包括硬链接和软链接。 **二、EXT2 文件系统** EXT2是Linux早期的文件系统,EXT3在此基础上增加了日志功能,保证了系统的稳定性。EXT2/EXT3文件系统的关键组成部分是Inode(索引节点),它...
通过实验,学生可以学习 Linux 中文件系统的使用,理解文件链接的概念,并掌握文件硬链接和软连接的实现方法。 一、实验目的 本实验的目的是学习 Linux 中文件系统的使用,理解文件链接的概念,掌握文件硬链接和软...
符号链接(软链接)则类似于Windows的快捷方式,它创建了一个指向目标文件的新文件,即使原始文件移动或删除,符号链接依然有效。使用ln命令可以创建这两种类型的链接,如"ln -s target_file link_name"创建符号链接...
5. `ln`创建链接文件,硬链接和软链接都可通过该命令创建。 目录操作同样重要: 1. `ls`列出目录内容,`-l`显示详细信息,`-a`显示隐藏文件。 2. `cd`改变当前工作目录。 3. `mkdir`创建新目录,`-p`可以创建多级...
6. **复制 BusyBox**:将编译后的BusyBox可执行文件复制到/bin目录下,并将其软链接为多个系统命令,如`ln -s busybox init`。 7. **添加其他必要文件**:根据需求,将其他系统脚本、配置文件和库文件复制到相应...
硬链接(`ln file link`)指向原始文件的inode,软链接(`ln -s file link`)则创建一个包含路径信息的特殊文件。 9. **`shutdown`**:关机或重启计算机。例如,`shutdown -h now`立即关机,`shutdown -r +5`会在5...
Linux 操作系统基础教程 清华大学信息学院计算机系 目 录 前言..........................................................................................................................................
- 创建软链接和硬链接:`ln -s source target`创建软链接,`ln source target`创建硬链接。 7. 命令行别名和历史 - 别名:通过在`.bashrc`文件中设置别名,可以简化常用命令,如`alias ll='ls -l'`。 - 命令历史...
同时,也会了解软链接(符号链接,`ln -s`)和硬链接(`ln`)的区别及其使用场景,这在处理大型文件或目录时特别有用。 第十四章:文件压缩与归档 在这一章,主要讨论了如何使用`gzip`、`bzip2`和`tar`等命令进行...
【Linux实验报告_第二章.doc】是一份针对河南科技大学学生的Linux操作系统实验报告,主要涵盖了Linux命令的基本使用,包括登录与退出、文件与目录操作、进程查看以及使用man命令查询帮助等核心内容。以下是对这些...
常见的命令如`ls`(列出目录内容)、`cd`(切换目录)、`pwd`(显示当前...ln`(创建软链接或硬链接)、`chmod`(修改文件或目录权限)、`chown`(更改所有者)、`chgrp`(更改组)、`more`和`less`(查看文件内容)、...
6. **符号链接**:符号链接(也称软链接)是HP-UX中的一个重要概念,它创建了一个指向其他文件或目录的指针。`ln -s`命令用于创建符号链接,这允许快捷地访问文件或替代文件名。 7. **文件系统管理**:HP-UX支持...
3. **创建硬链接**:使用 `ln` 命令可以为指定文件创建硬链接,选项 `-s` 用于创建软链接。 4. **获取命令帮助**:要查看命令 `logname` 的用法,可以使用 `logname --help` 或 `man logname`。 5. **指定进程...
**创建硬链接和软链接文件**:分别用`ln /root/a /root/b`和`ln -s /root/a /root/c`命令来创建硬链接和软链接文件。 #### 实验三:vi编辑器使用、文件显示和处理命令 - **实验目的**: - 掌握vi编辑器的基本...
14. **链接文件**:`ln`命令用于创建软链接(symbolic link)和硬链接(hard link)。软链接类似Windows的快捷方式,而硬链接指向文件的inode,两个硬链接文件实际上指向同一个物理文件。 通过以上操作,我们可以...
硬链接`ln source destination`创建的是一个指向原始文件的物理连接,而符号链接`ln -s source destination`创建的是一个指向文件的路径的软链接。硬链接不允许对目录操作,而软链接则可以。 `cat`命令用于查看文件...
在Linux中,链接分为硬链接和符号链接(软链接)。硬链接指向文件实体,而符号链接则是指向另一个文件名。ln命令的基本语法如下: ``` ln [选项] 源文件 目标文件 ``` 常用选项包括: - -s, --symbolic:创建符号...
`ln -s source link_name`创建符号链接,`-s`表示软链接。`ls -l`显示链接的状态,`abs`是链接名。 12. **查看进程**:`vi`编辑器的退出需要按下`:q!`或`:wq`。`ps -ef`显示所有进程的详细信息,`kill +PID`结束...