# Linux磁盘disk和分区分析

# mount | column -t              # 查看挂接的分区状态
# fdisk -l                      # 查看所有分区
# swapon -s                    # 查看所有交换分区
# hdparm -i /dev/hda            # 查看磁盘参数(仅适用于IDE设备)
# dmesg | grep IDE              # 查看启动时IDE设备检测状况
# df -h                         # 查看各分区使用情况
1
2
3
4
5
6

# 2.1.磁盘-du和df的区别

Linux df(英文全拼:disk free) 命令用于显示目前在 Linux 系统上的文件系统磁盘使用情况统计

  • df 命令的全称是Disk Free ,显而易见它是统计磁盘中空闲的空间,也即空闲的磁盘块数。
    • 它是通过文件系统磁盘块分配图进行计算出的。
  • du 命令的全称是 Disk Used ,统计磁盘有已经使用的空间。
    • 它是直接统计各文件各目录的大小,而不是从硬盘获得信息的。
  • du和df不一致情况模拟,两者还是有很大区别的,有时候其输出结果甚至非常悬殊

2.1 du的工作原理

du命令会对待统计文件逐个调用fstat这个系统调用,获取文件大小。 它的数据是基于文件获取的,所以有很大的灵活性,不一定非要针对一个分区,可以跨越多个分区操作。 如果针对的目录中文件很多,du速度就会很慢了。

2.2 df的工作原理

df命令使用的事statfs这个系统调用,直接读取分区的超级块信息获取分区使用情况。 它的数据是基于分区元数据的,所以只能针对整个分区。由于df直接读取超级块,所以运行速度不受文件多少影响。

3 du和df不一致情况模拟

常见的df和du不一致情况就是文件删除的问题。当一个文件被删除后,在文件系统目录中已经不可见了,所以du就不会再统计它了。然而如果此时还有运行的进程持有这个已经被删除了的文件的句柄,那么这个文件就不会真正在磁盘中被删除,分区超级块中的信息也就不会更改。这样df仍旧会统计这个被删除了的文件。

# 2.2.llvm在80G的硬盘上-几乎满了的一次诊断

df -h

root@ubuntu:~# df -h
Filesystem                   Size  Used Avail Use% Mounted on
udev                          16G     0   16G   0% /dev
tmpfs                        3.2G  636K  3.2G   1% /run
/dev/mapper/ubuntu--vg-root   77G   64G⭐  9.3G  88% /
tmpfs                         16G   24K   16G   1% /dev/shm
tmpfs                        5.0M     0  5.0M   0% /run/lock
tmpfs                         16G     0   16G   0% /sys/fs/cgroup
/dev/sda1                    512M  328K  512M   1% /boot/efi
tmpfs                        3.2G     0  3.2G   0% /run/user/0
1
2
3
4
5
6
7
8
9
10

# 查看当前目录下-文件夹大小情况

使用du -h --max-depth=1

root@ubuntu:~# du -h --max-depth=1
44K	./work
20K	./.local
44K	./beifen
4.0K	./.cache
354M	./.vscode-server
104K	./exp
61G	./huawei ⭐
16K	./.ssh
8.0K	./.gnupg
8.0K	./.ansible
8.0K	./.vim
61G	.
1
2
3
4
5
6
7
8
9
10
11
12
13

# 查看指定目录的大小

  • # du -sh <目录名>
root@ubuntu:~# du -sh huawei/
59G	huawei/
1
2
root@ubuntu:~# fdisk -l   # 查看所有分区
Disk /dev/sda: 80 GiB⭐, 85899345920 bytes, 167772160 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: gpt
Disk identifier: 162A1967-DB00-4554-B407-ECD56031888D

Device       Start       End   Sectors  Size Type
/dev/sda1     2048   1050623   1048576  512M EFI System
/dev/sda2  1050624 167770111 166719488 79.5G Linux LVM ⭐


Disk /dev/mapper/ubuntu--vg-root: 78.6 GiB, 84330676224 bytes, 164708352 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes


Disk /dev/mapper/ubuntu--vg-swap_1: 980 MiB, 1027604480 bytes, 2007040 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23

# 什么是磁盘阵列技术