zl程序教程

您现在的位置是:首页 >  系统

当前栏目

Linux 硬盘设备以及df du命令

Linux设备命令 以及 硬盘 DF du
2023-09-14 09:01:46 时间

Linux 系统初始化时,会根据 MBR 来识别硬盘设备

MBR,全称 Master Boot Record,可译为硬盘主引导记录,占据硬盘 0 磁道的第一个扇区。MBR 中,包括用来载入操作系统的可执行代码,实际上,此可执行代码就是 MBR 中前 446 个字节的 boot loader 程序(引导加载程序),而在 boot loader 程序之后的 64 个(16×4)字节的空间,就是存储的分区表(Partition table)相关信息。如图 所示:

MBR结构示意图

在分区表(Partition table)中,主要存储的值息包括分区号(Partition id)、分区的起始磁柱和分区的磁柱数量。所以 Linux 操作系统在初始化时就可以根据分区表中以上 3 种信息来识别硬盘设备。其中,常见的分区号如下:

  • 0x5(或 0xf):可扩展分区(Extended partition)。
  • 0x82:Linux 交换区(Swap partition)。
  • 0x83:普通 Linux 分区(Linux partition)。
  • 0x8e:Linux 逻辑卷管理分区(Linux LVM partition)。
  • 0xfd:Linux 的 RAID 分区(Linux RAID auto partition)。


由于 MBR 留给分区表的磁盘空间只有 64 个字节,而每个分区表的大小为 16 个字节,所以在一个硬盘上最多可以划分出 4 个主分区。如果想要在一个硬盘上划分出 4 个以上的分区时,可以通过在硬盘上先划分出一个可扩展分区的方法来增加额外的分区。 

不过,在 Linux 的 Kernel 中所支持的分区数量有如下限制:

  • 一个 IDE 的硬盘最多可以使用 63 个分区;
  • 一个 SCSI 的硬盘最多可以使用 15 个分区。

接下来的问题,就是为什么要将一个硬盘划分成多个分区,而不是直接使用整个硬盘呢?其主要有如下原因:

  1. 方便管理和控制
    首先,可以将系统中的数据(也包括程序)按不同的应用分成几类,之后将这些不同类型的数据分别存放在不同的磁盘分区中。由于在每个分区上存放的都是类似的数据或程序,这样管理和维护就简单多了。
  2. 提高系统的效率
    给硬盘分区,可以直接缩短系统读写磁盘时磁头移动的距离,也就是说,缩小了磁头搜寻的范围;反之,如果不使用分区,每次在硬盘上搜寻信息时可能要搜寻整个硬盘,所以速度会很慢。另外,硬盘分区也可以减轻碎片(文件不连续存放)所造成的系统效率下降的问题。
  3. 使用磁盘配额的功能限制用户使用的磁盘量
    由于限制用户使用磁盘配额的功能,只能在分区一级上使用,所以,为了限制用户使用磁盘的总量,防止用户浪费磁盘空间(甚至将磁盘空间耗光),最好将磁盘先分区,然后在分配给一般用户。
  4. 便于备份和恢复
    硬盘分区后,就可以只对所需的分区进行备份和恢复操作,这样的话,备份和恢复的数据量会大大地下降,而且也更简单和方便。

 

 df查看文件系统硬盘使用情况


df 命令,用于显示 Linux 系统中各文件系统的硬盘使用情况,包括文件系统所在硬盘分区的总容量、已使用的容量、剩余容量等。

前面讲过,与整个文件系统有关的数据,都保存在 Super block(超级块)中,而 df 命令主要读取的数据几乎都针对的是整个文件系统,所以 df 命令主要是从各文件系统的 Super block 中读取数据。

df 命令的基本格式为: 

[root@localhost ~]# df [选项] [目录或文件名]

表列出了 df 命令几个常用的选项,以及它们各自的作用。
 

表df命令常用选项及作用
选项作用
-a显示所有文件系统信息,包括系统特有的 /proc、/sysfs 等文件系统;
-m以 MB 为单位显示容量;
-k以 KB 为单位显示容量,默认以 KB 为单位;
-h使用人们习惯的 KB、MB 或 GB 等单位自行显示容量;
-T显示该分区的文件系统名称;
-i不用硬盘容量显示,而是以含有 inode 的数量来显示。

【例 】

[root@localhost ~]# 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

 不使用任何选项的 df 命令,默认会将系统内所有的文件系统信息,以 KB 为单位显示出来。
本例中,由 df 命令显示出的各列信息的含义分别是:

  • Filesystem:表示该文件系统位于哪个分区,因此该列显示的是设备名称;
  • 1K-blocks:此列表示文件系统的总大小,默认以 KB 为单位;
  • Used:表示用掉的硬盘空间大小;
  • Available:表示剩余的硬盘空间大小;
  • Use%:硬盘空间使用率。如果使用率高达 90% 以上,就需要额外注意,因为容量不足,会严重影响系统的正常运行;
  • Mounted on:文件系统的挂载点,也就是硬盘挂载的目录位置。

 

du命令:统计目录或文件所占磁盘空间大小


du 是统计目录或文件所占磁盘空间大小的命令。

我们在统计目录时,想看父目录下的子目录和子文件的总磁盘占用量大小,这时就需要使用 du 命令才能统计目录的真正磁盘占用量大小。

du 命令的格式如下:

[root@localhost ~]# du [选项] [目录或文件名]

 

选项:

  • -a:显示每个子文件的磁盘占用量。默认只统计子目录的磁盘占用量
  • -h:使用习惯单位显示磁盘占用量,如 KB、MB 或 GB 等;
  • -s:统计总磁盘占用量,而不列出子目录和子文件的磁盘占用量 
[root@localhost ~]# du -ah /etc | head -n 4
4.0K	/etc/fstab
0	/etc/crypttab
0	/etc/mtab
4.0K	/etc/resolv.conf
[root@localhost ~]# du -sh /etc 
31M	/etc

 

du命令和df命令的区别


有时我们会发现,使用 du 命令和 df 命令去统计分区的使用情况时,得到的数据是不一样的。那是因为df命令是从文件系统的角度考虑的,通过文件系统中未分配的空间来确定文件系统中已经分配的空间大小。也就是说,在使用 df 命令统计分区时,不仅要考虑文件占用的空间,还要统计被命令或程序占用的空间(最常见的就是文件已经删除,但是程序并没有释放空间)。而 du 命令是面向文件的,只会计算文件或目录占用的磁盘空间。也就是说,df 命令统计的分区更准确,是真正的空闲空间。