Linux 磁盘占用空间分析

Linux 分析磁盘空间占用情况常规步骤

一、硬盘状况概览 (lsblk)

进入机器上,先看看硬盘是多大,硬盘分区情况,有个大概概念,命令:lsblk(List block devices)

1
2
3
4
5
6
7
8
9
[root@localhost /]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 120G 0 disk
├─sda1 8:1 0 1G 0 part /boot
└─sda2 8:2 0 119G 0 part
├─centos-root 253:0 0 99.2G 0 lvm /
├─centos-swap 253:1 0 9.8G 0 lvm [SWAP]
└─centos-home 253:2 0 10G 0 lvm /home
sr0 11:0 1 4.2G 0 rom /run/media/root/CentOS 7 x86_64

解释:

  • NAME:设备名称
  • MAJ:MIN:设备的主设备号和次设备号(设备唯一标识),在 Linux 中,每个设备都由一个主设备号和一个次设备号唯一标识。
  • RM:removable,设备是否可卸载,可卸载 1,不可卸载 0
  • SIZE:设备总大小,上面就是这块 sda 硬盘是,120 G 大小
  • RO:read only,是否是只读设备,1 只读,0 不是只读设备
  • TYPE:这是设备的类型。例如,disk 表示磁盘,part 表示分区,lvm 表示逻辑卷管理(LVM)设备,part 分区可以有自己的文件系统,会被 Linux 识别为一个独立的存储区域,如果想调整大小需要格式化整个分区;lvm 可以理解为逻辑分区,可以更灵活的调整大小;ROM type 就是 CD-ROM,表示是一个光驱设备
  • MOUNTPOINT:挂载点,表示设备挂载到哪个目录下了
    综合分析上述输出:上面机器是只有一个 sda 硬盘和一个 sr0 光驱,sda 硬盘呢是分了 sda1 和 sda2 两个区,sda1 是系统引导区,挂载到了 /boot 目录下面;sda2 分区,119 G,这个分区用作 lvm,逻辑卷管理,分了三个区,一个 centos-root 99 G,挂载到了根目录下,centos-swap 9.8 G,用来做 swap 分区了,内存不够用就会占用 swap 分区的地方,centos-home 10 G,是存储 Linux 上每个用户的个人文件和配置文件;sr0 光驱可卸载。

二、查看磁盘分区占用情况 (df)

命令 df 就是 disk free,查看硬盘空闲空间使用
使用 df -Th 命令可以展示出当前的文件系统和分区空间占用情况,看看是哪个分区满了
参数含义:

    • T:展示文件系统
  • -h:human-readable 以可读性较高的方式来显示信息
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    [ root@localhost /]# df -Th
    文件系统 类型 容量 已用 可用 已用% 挂载点
    /dev/mapper/centos-root xfs 100 G 43 G 57 G 43% /
    devtmpfs devtmpfs 9.8 G 0 9.8 G 0% /dev
    tmpfs tmpfs 9.8 G 0 9.8 G 0% /dev/shm
    tmpfs tmpfs 9.8 G 9.1 M 9.8 G 1% /run
    tmpfs tmpfs 9.8 G 0 9.8 G 0% /sys/fs/cgroup
    /dev/sda 1 xfs 1014 M 178 M 837 M 18% /boot
    /dev/mapper/centos-home xfs 10 G 42 M 10 G 1% /home
    tmpfs tmpfs 2.0 G 4.0 K 2.0 G 1% /run/user/42
    tmpfs tmpfs 2.0 G 32 K 2.0 G 1% /run/user/0
    /dev/sr 0 iso 9660 4.3 G 4.3 G 0 100% /run/media/root/CentOS 7 x 86_64
    这个里面只需要关注 centos-root 和 centos-home 这两个主要目录的占用率就行了,上面已经看到硬盘的 sda2 分区里面,分了三个逻辑分区,swap 是交换分区,给内存不够的时候用的,所以只需要关注另外两个逻辑分区,一个挂到了根目录下,一个挂到了 home 下。
    下面对于其他的文件系统及挂载点也做一下解释:
  • devtmpfs:这个文件系统挂在了 /dev 下,不占用硬盘的空间,这是设备文件的存储位置。这些文件代表了系统中的各种设备,如硬盘、终端等,通过这个目录可以方便的访问到外部设备
  • tmpfs:这个是临时文件系统,里面所有文件都会存储内存里面,它可以使用系统内存或者 swap 分区来存储文件,断电这个文件系统里面的内容就会消失
  • /dev/shm :共享内存的位置,允许不同进程共享内存空间,便于通信和数据交换
  • /run :运行时变量的存储位置,包含系统启动后创建的 pid 文件和锁文件
  • /sys/fs/cgroup :这是 cgroup 文件系统的挂载点。Cgroup(控制组)是 Linux 内核的一个特性,用于限制、记录和隔离进程组使用的物理资源(如 CPU、内存、磁盘 I/O 等)。
  • /run/user/42/run/user/0这些是为每个用户创建的私有tmpfs实例。数字代表了用户 ID,例如 0 通常代表 root 用户。

三、分析目录下文件占用情况 (du)

使用 du (disk usage) 命令,可以方便的查看文件占用情况,分析当前哪个文件或目录占用空间大
命令: du / -lh --max-depth=1 --exclude=proc
命令格式:du [dir] [params]
参数解释:列出根目录下各个目录的空间占用情况,并略过 proc 目录

  • -l:重复计算硬链接的文件, 因为文件硬链接是占用空间的
  • -h:human-readable 以可读性较高的方式来显示信息
  • –max-depth: 这个选项限制了du命令查看子目录的深度。在这里,它被设置为1,这意味着du只会显示根目录下一级的目录和文件的大小。
  • –exclude=proc:/proc目录包含了关于系统和正在运行的进程的信息,这些信息是由内核动态生成的,不占用磁盘空间,所以通常在查看磁盘使用情况时会被排除。
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    [ root@localhost /]# du / -lh --max-depth=1 --exclude=proc
    146 M /boot
    0 /dev
    9.6 M /home
    4.3 G /run
    0 /sys
    37 M /etc
    28 M /root
    2.8 G /var
    8.5 M /tmp
    5.4 G /usr
    0 /media
    0 /mnt
    35 G /opt
    0 /srv
    47 G /
    这个就展示了当前根目录下各个目录的大小占用情况,最后一行是根目录总占用空间大小,通过这里可以进一步分析是哪个目录占用空间过大,比如说可以进入到 opt 目录下进一步使用 du 命令( du . -lh --max-depth=1 )继续查看是哪个文件夹或文件占用空间大

参考:

  1. https://www.cnblogs.com/jing99/p/10487174.html
  2. https://plantegg.github.io/2017/10/31/%E7%A3%81%E7%9B%98%E7%88%86%E6%8E%89%E7%9A%84%E5%87%A0%E7%A7%8D%E6%83%85%E5%86%B5/