type
status
date
slug
summary
tags
category
icon
password
查询磁盘与目录的容量
磁盘的整体数据是在 superblock 区块中,但是每个各别文件的容量则在 inode 当中记载的。
df
usage : df [OPTION]... [FILE]...
【df(disk free空闲磁盘)】Show information about the file system on which each FILE resides,or all file systems by default.列出【文件系统】的【整体磁盘使用量】,默认列出所有文件系统的磁盘使用量。
常用选项:
- a :列出所有的文件系统,包括系统特有的 /proc 等文件系统;
- k :以 KBytes 的容量显示各文件系统;
- m :以 MBytes 的容量显示各文件系统;
- h :以人们较易阅读的 GBytes, MBytes, KBytes 等格式自行显示;
- H :以 M=1000K 取代 M=1024K 的进位方式;
- T :连同该 partition 的 filesystem 名称 (例如 xfs) 也列出;
- i :不用磁盘容量,而以 inode 的数量来显示
结果解读

- Filesystem : 代表该文件系统实在哪个partition,所以列出设备名称
- 1k-blocks:说明下面的数字单位是 1KB 呦!可利用 -h 或 -m 来改变容量;
- Used:顾名思义,就是使用掉的磁盘空间啦!
- Available:也就是剩下的磁盘空间大小;
- Use%:就是磁盘的使用率啦!如果使用率高达 90% 以上时, 最好需要注意一下了,免得容量不足造成系统问题喔!(例如最容易被灌爆的 /var/spool/mail 这个放置邮件的磁盘)
- Mounted on:就是磁盘挂载的目录所在啦!(挂载点啦!)
由于 df 主要读取的数据几乎都是针对一整个文件系统,因此读取的范围主要是在 Superblock 内的信息, 所以这个指令显示结果的速度非常的快速!在显示的结果中你需要特别留意的是那个根目录的剩余容量! 因为我们所有的数据都是由根目录衍生出来的,因此当根目录的剩余容量剩下 0 时,那你的 Linux可能就问题很大了。
du
usage : du [-ahskm] 文件或目录名称
【du(disk usage)】Summarize disk usage of each FILE, recursively for directories.对【目录】递归地【总结每个文件】的磁盘使用情况。
直接输入 du 没有加任何选项时,则 du 会分析“目前所在目录”的文件与目录所占用的磁盘空间。
常用选项
- a :列出所有的文件与目录容量,因为默认仅统计目录下面的文件量而已。
- h :以人们较易读的容量格式 (G/M) 显示;
- s :列出总量而已,而不列出每个各别的目录占用容量;
- S :不包括子目录下的总计,与 -s 有点差别。
- k :以 KBytes 列出容量显示;
- m :以 MBytes 列出容量显示;
与 df 不一样的是,du 这个指令其实会直接到文件系统内去搜寻所有的文件数据
实体链接与符号链接:ln
在 Linux 下面的链接文件有两种,一种是类似 Windows 的捷径功能的文件,可以让你快速的链接到目标文件(或目录); 另一种则是通过文件系统的 inode 链接来产生新文件名,而不是产生新文件!这种称为实体链接 (hard link)。 这两种玩意儿是完全不一样的东西呢!
Hard Link (实体链接, 硬式链接或实际链接)
要学习Hard Link首先我们要知道:
- 每个文件都会占用一个 inode ,文件内容由 inode 的记录来指向;
- 想要读取该文件,必须要经过目录记录的文件名来指向到正确的 inode 号码才能读取。
也就是说,其实文件名只与目录有关,但是文件内容则与 inode 有关。
Hard Link的由来
使多个文件【名】对应到同一个 inode 号码。简单的说:hard link 只是在某个目录下新增一笔文件名链接到某 inode 号码的关连记录而已。
举例说明
假设我系统有个 /root/crontab 他是 /etc/crontab 的实体链接,也就是说这两个文件名链接到同一个 inode , 自然这两个文件名的所有相关信息都会一模一样(除了文件名之外)。实际的情况可以如下所示:

你可以发现两个文件名都链接到 681084 这个 inode 号码,文件的权限/属性完全一样,因为这两个“文件名”其实是同一个“文件”啦!而且你也会发现第二个字段由原本的 1 变成 2 了! 那个字段称为“链接”,这个字段的意义为:“有多少个文件名链接到这个 inode 号码”的意思。 如果将读取到正确数据的方式画成示意图,就类似如下画面:

上图的意思是不管你用1还是2inode的目录来读取他们各自的block里的哪个文件名(/etc/crontab和/root/crontab),都指向real这个inode去读取最终的数据。
Hard Link有什么好处呢?
最大的好处就是“安全”!如同上图中, 如果你将任何一个“文件名”删除,其实 inode 与 block 都还是存在的! 此时你可以通过另一个“文件名”来读取到正确的文件数据喔!此外,不论你使用哪个“文件名”来编辑, 最终的结果都会写入到相同的 inode 与 block 中,因此均能进行数据的修改哩!
创建Hard Link一般磁盘的空间与 inode 的数目都不变
一般来说,使用 hard link 设置链接文件时,磁盘的空间与 inode 的数目都不会改变! 我们还是由图7.2.1 来看,由图中可以知道, hard link 只是在某个目录下的 block 多写入一个关连数据而已,既不会增加 inode 也不会耗用 block 数量哩!
其实还是可能会改变系统的 block 的,那就是当你新增这笔数据却刚好将目录的 block 填满时,就可能会新加一个 block 来记录文件名关连性,而导致磁盘空间的变化!不过,一般hard link 所用掉的关连数据量很小,所以通常不会改变 inode 与磁盘空间的大小喔!
Hard Link不能跨 Filesystem
由图 7.2.1 其实我们也能够知道,事实上 hard link 应该仅能在单一文件系统中进行的
Hard Link不能link目录(俺不懂)
这是因为如果使用 hard link 链接到目录时, 链接的数据需要连同被链接目录下面的所有数据都创建链接,举例来说,如果你要将 /etc使用实体链接创建一个 /etc_hd 的目录时,那么在 /etc_hd 下面的所有文件名同时都与 /etc 下面的文件名要创建 hard link 的,而不是仅链接到 /etc_hd 与 /etc 而已。 并且,未来如果需要在 /etc_hd 下面创建新文件时,连带的, /etc 下面的数据又得要创建一次 hard link ,因此造成环境相当大的复杂度。 所以啰,目前 hard link 对于目录暂时还是不支持的啊!
Symbolic Link (符号链接,即快捷方式)
与windows的快捷方式一样。Symbolic link 就是在创建一个独立的文件,而这个文件会让数据的读取指向他 link 的那个文件的文件名!由于只是利用文件来做为指向的动作,所以,当来源文件被删除之后,symbolic link 的文件会“开不了”, 会一直说“无法打开某文件!”。实际上就是找不到原始“文件名”而已啦!
这个机制类似于java的地址引用,如int[] a = {1,2}; int[] b = a; //其实ab数组都是指向内容{1,2}
举例说明
创建一个符号链接文件链接到 /etc/crontab。

可见两文件指向不同的inode号码,所以他们是各自独立的存在!
链接文件的内容会自动将目标文件的文件名。箭头(-->)右边的为文件名"/etc/crontab",内容一共十二个字母,这也是链接文件大小为12Bytes的来源。
链接文件不会改变目标目录的链接点数量呢?
关于上述的说明,我们以如下图示来解释:

由 1 号 inode 读取到链接文件的内容仅有文件名,根据文件名链接到正确的目录去取得目标文件的inode , 最终就能够读取到正确的数据了。你可以发现的是,如果目标文件名(/etc/crontab)被删除了,那么整个环节就会无法继续进行下去, 所以就会发生无法通过链接文件读取的问题了!俺解读:因为链接文件依赖着链接目录inode中的最终文件block号记录,这也是唯一能获取实际文件内容的入口,该记录没了,文件就无法获取了
Symbolic link 会占用inode 与 block
由 Symbolic link 所创建的文件为一个独立的新的文件,所以会占用掉 inode 与 block 喔
Symbolic link文件的改动其实是改动原始文件
Symbolic link比Hard link使用更广
不过由于 Hard Link 的限制太多了,包括无法做“目录”的 link , 所以在用途上面是比较受限的!反而是 Symbolic Link 的使用方面较广喔!
ln 创建链接文件
usage : ln [-sf] 来源文件 目标文件
Create hard links by default, symbolic links with --symbolic.
常用选项
- s : 如果不加任何参数就进行链接,那就是hard link,至于 -s 就是symbolic link
- f :如果【目标文件】存在时,就主动的将目标文件直接移除后再创建!
关于目录的Link数量
我们以 hard link 进行“文件的链接”时,可以发现,在 ls -l 所显示的第二字段会增加一。那么如果创建目录时,他默认的 link 数量会是多少? 也就是说一个“空目录”里面至少会存在些什么?
就是存在 . 与 .. 这两个目录啊! 那么,当我们创建一个新目录名称为 /tmp/testing 时,基本上会有三个东西,那就是:
- /tmp/testing
- /tmp/testing/.
- /tmp/testing/..
而其中 /tmp/testing 与 /tmp/testing/. 其实是一样的!都代表该目录啊~而 /tmp/testing/.. 则代表/tmp 这个目录,所以说,当我们创建一个新的目录时, “新的目录的 link 数为 2 ,而上层目录的 link数则会增加 1 ”
俺在这里不太懂,根据link数量这个字段的定义:有多少不同的文件名链接到相同的一个i-node号码去就是了。俺理解为:
- 上层目录link+1是因为:上层目录的inode指向多了一个由创建新文件产生的/tmp/testing/..,以至于上层目录link数+1。
- 新的目录link数为2是因为:本层目录的inode链接的有由创建目录产生的/tmp/testing与/tmp/testing/. 这两个链接文件。