来自《鸟哥的 Linux 私房菜》,重复只是加深自己的印象。
本篇结构:
磁盘的整体数据是在 superblock 区块中,但是每个各别文件的容量则在 inode
当中记载的。在命令行下面该如何叫出这几个数据呢?
df [-ahikHTm] [目录或文件名]
选项与参数:
所输出的结果信息:
范例一:将系统内的所有特殊文件格式及名称都列出来
范例二:将 /etc 下面的可用的磁盘容量以易读的容量格式显示
root@master:~# df -h /etc
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/ubuntu--vg-root 476G 148G 304G 33% /
范例三:将目前各个 partition 当中可用的 inode 数量列出
root@master:~# df -ih
Filesystem Inodes IUsed IFree IUse% Mounted on
udev 7.9M 419 7.9M 1% /dev
tmpfs 7.9M 861 7.9M 1% /run
/dev/mapper/ubuntu--vg-root 31M 402K 30M 2% /
tmpfs 7.9M 4 7.9M 1% /dev/shm
tmpfs 7.9M 4 7.9M 1% /run/lock
tmpfs 7.9M 16 7.9M 1% /sys/fs/cgroup
/dev/sda1 122K 310 122K 1% /boot
tmpfs 7.9M 4 7.9M 1% /run/user/0
tmpfs 7.9M 4 7.9M 1% /run/user/1000
由于 df 主要读取的数据几乎都是针对一整个文件系统,因此读取的范围主要是在 Superblock 内的信息, 所以这个指令显示结果的速度非常的快速!在显示的结果中需要特别留意的是根目录的剩余容量! 因为所有的数据都是由根目录衍生出来的,因此当根目录的剩余容量剩下 0 时,那 Linux 可能就问题很大了。
需要注意的是,如果使用 -a 这个参数时,系统会出现 /proc 这个挂载点,但是里面的东西都是 0 ,不要紧张! /proc 的东西都是 Linux 系统所需要载入的系统数据,而且是挂载在“内存当中”的, 所以当然没有占任何的磁盘空间。
/dev/shm/ 目录,其实是利用内存虚拟出来的磁盘空间,通常是总实体内存的一半!由于是通过内存仿真出来的磁盘,因此你在这个目录下面创建任何数据文件时,存取速度是非常快速的!(在内存内工作) 不过,也由于他是内存仿真出来的,因此这个文件系统的大小在每部主机上都不一样,而且创建的东西在下次开机时就消失了! 因为是在内存中!
du [-ahskm] 文件或目录名称
选项与参数:
直接输入 du 没有加任何选项时,则 du 会分析“目前所在目录”的文件与目录所占用的磁盘空间。但是,实际显示时,仅会显示目录容量(不含文件),因此 . 目录有很多文件没有被列出来,所以全部的目录相加不会等于 . 的容量。此外,输出的数值数据为 1K 大小的容量单位。加上参数 -a 则可以将文件容量也显示出来。
范例一:检查根目录下面每个目录所占用的容量
du -sm /*
16 /bin
108 /boot
... 省略 ...
du: cannot access '/proc/104399/fd/4': No such file or directory
du: cannot access '/proc/104399/fdinfo/4': No such file or directory
... 省略 ...
1692 /tmp
9607 /usr
41054 /var
这是个很常被使用的功能,利用万用字符 * 来代表每个目录,如果想要检查某个目录下,哪个次目录占用最大的容量,可以用这个方法找出来。至于 /proc 里头会列出一堆“No such file or directory” 的错误,因为是内存内的程序,程序执行结束就会消失,因此会有些目录找不到,是正确的!
与 df 不一样的是,du 这个指令其实会直接到文件系统内去搜寻所有的文件数据,所以指令的运行会执行一小段时间。此外,在默认的情况下,容量的输出是以 KB 来设计的, 如果想要知道目录占了多少 MB ,那么就使用 -m 这个参数即可,如果只想要知道该目录占了多少容量的话,使用 -s 就可以。
至于 -S 这个选项部分,由于 du 默认会将所有文件的大小均列出,因此假设在 /etc 下面使用 du 时, 所有的文件大小,包括 /etc 下面的次目录容量也会被计算一次。然后最终的容量(/etc) 也会加总一次, 因此很多朋友都会误会 du 分析的结果不太对劲。如果想要列出某目录下的全部数据, 或许也可以加上 -S 的选项,减少次目录的加总。
也就是说,其实文件名只与目录有关,但是文件内容则与 inode 有关。那么想一想, 有没有可能有多个文件名对应到同一个 inode 号码呢?有的!那就是 hard link 的由来。
简单说:hard link 只是在某个目录下新增一笔文件名链接到某 inode 号码的关连记录而已。
如图,有个 /root/crontab 是 /etc/crontab 的实体链接,这两个文件名链接到同一个 inode :
使用 hard link 设置链接文件时,磁盘的空间与 inode 的数目都不会改变, hard link 只是在某个目录下的 block 多写入一个关连数据而已,既不会增加 inode 也不会耗用 block 数量(其实还是可能会改变系统的 block 的,那就是当新增这笔数据却刚好将目录的 block 填满时,就可能会新加一个 block 来记录文件名关连性,而导致磁盘空间的变化)。
由图也可知,事实上 hard link 应该仅能在单一文件系统中进行的,应该是不能够跨文件系统,所以 hard link 是有限制的:
因为如果使用 hard link 链接到目录时, 链接的数据需要连同被链接目录下面的所有数据都创建链接。
相对于 hard link , Symbolic link 可就好理解多了,基本上, Symbolic link 就是在创建一个独立的文件,而这个文件会让数据的读取指向他 link 的那个文件的文件名!由于只是利用文件来做为指向的动作, 所以,当来源文件被删除之后,symbolic link 的文件会“开不了”, 会一直说“无法打开某文件!”。实际上就是找不到原始“文件名”而已。
如图:
由 1 号 inode 读取到链接文件的内容仅有文件名,根据文件名链接到正确的目录去取得目标文件的 inode , 最终就能够读取到正确的数据了。可以发现的是,如果目标文件(/etc/crontab)被删除了,那么整个环节就会无法继续进行下去, 所以就会发生无法通过链接文件读取的问题了!
这个 Symbolic Link 与 Windows 的捷径可以给他划上等号,由 Symbolic link 所创建的文件为一个独立的新的文件,所以会占用掉 inode 与 block 。
ln [-sf] 来源文件 目标文件
选项与参数:
关于目录的 link 数量:
一个“空目录”里面至少会存在 . 与 … 这两个目录。那么,当创建一个新目录名称为 /tmp/testing 时,基本上会有三个东西,那就是:
而其中 /tmp/testing 与 /tmp/testing/. 其实是一样的!都代表该目录,而 /tmp/testing/… 则代表 /tmp 这个目录。所以说,当创建一个新的目录时, “新的目录的 link 数为 2 ,而上层目录的 link 数则会增加 1。
想要在系统里面新增一颗磁盘时,应该有如下动作需要做:
目前磁盘分区主要有 MBR 以及 GPT 两种格式,这两种格式所使用的分区工具不太一样,因此分区前要去找一下目前系统有的磁盘有哪些, 这些磁盘是 MBR 还是 GPT 等等。
lsblk 可以看成“ list block device ”的缩写,就是列出所有储存设备的意思。
lsblk [-dfimpt] [device]
选项与参数:
范例一:列出本系统下的所有磁盘与磁盘内的分区信息
root@master:/dev# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 500G 0 disk
├─sda1 8:1 0 487M 0 part /boot
├─sda2 8:2 0 1K 0 part
└─sda5 8:5 0 499.5G 0 part
├─ubuntu--vg-root 252:0 0 483.5G 0 lvm /
└─ubuntu--vg-swap_1 252:1 0 16G 0 lvm [SWAP]
sr0 11:0 1 1024M 0 rom
系统主要有个 sr0 以及一个 sda 的设备,而 sda 的设备下面又有三个分区, 其中 sda5 甚至还有因为 LVM 产生的文件系统。
范例二:仅列出 /dev/sda 设备内的所有数据的完整文件名
root@master:/dev# lsblk -ip /dev/sda
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
/dev/sda 8:0 0 500G 0 disk
|-/dev/sda1 8:1 0 487M 0 part /boot
|-/dev/sda2 8:2 0 1K 0 part
`-/dev/sda5 8:5 0 499.5G 0 part
|-/dev/mapper/ubuntu--vg-root 252:0 0 483.5G 0 lvm /