[Linux]常用命令之【du/fdisk/df/ls】#磁盘管理/文件管理#
本文的经典应用场景:
1.查找占用磁盘存储空间最大的目录/文件
2.关于【磁盘分区】的相关概念和实操,详见另一博文:[Linux]磁盘分区 - 博客园/千千寰宇
1 fdisk
fdisk := "Partition table manipulator(操纵器) for Linux" := Linux的磁盘分区工具
-l 【查看磁盘所有分区情况】;列出指定设备的分区表信息并退出。 如果没有给出设备,那么使用那些在 /proc/partitions (如果存在)提到的.
-b
-c switch off DOS-compatible mode
-h print help
-u
-v print version;打印 fdisk 的版本信息并退出
-C
-H
-S
- 选择分区磁盘:进入磁盘,分区操作(创建、删除)准备
fdisk /dev/sda
- 在当前磁盘上建立扩展分区
fdisk /ext
- 查看磁盘所有分区情况
[root@test ~]# fdisk -l
Disk /dev/vda: 34.4 GB, 34359738368 bytes, 67108864 sectors 【硬盘vda的总存储空间: 34.4GB】
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 label type: dos 【硬盘标签类型: dos:= 硬盘采用MBR分区表; gpt := 硬盘采用GPT分区表】
Disk identifier: 0x0009e5d4
Device Boot Start End Blocks Id System
/dev/vda1 * 2048 67108830 33553391+ 83 Linux
/////////////////////////////////////////////////////////////////
[root@test1 ~]# fdisk -l
Disk /dev/loop0: 3916 MB, 3916431360 bytes
64 heads, 32 sectors/track, 3735 cylinders
Units = cylinders of 2048 * 512 = 1048576 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x47840dcd
Device Boot Start End Blocks Id System
/dev/loop0p1 * 1 3735 3824640 17 Hidden HPFS/NTFS
Disk /dev/sda: 536.9 GB, 536870912000 bytes 【注: 硬盘sda总空间: 536.9GB】
255 heads, 63 sectors/track, 65270 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x000a3902
Device Boot Start End Blocks Id System
/dev/sda1 * 1 64 512000 83 Linux
Partition 1 does not end on cylinder boundary.
/dev/sda2 64 65271 523774976 8e Linux LVM
Disk /dev/mapper/VolGroup-LogVol01: 519.2 GB, 519162560512 bytes
255 heads, 63 sectors/track, 63117 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00000000
Disk /dev/mapper/VolGroup-LogVol00: 17.2 GB, 17179869184 bytes
255 heads, 63 sectors/track, 2088 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00000000
2 du
du := disk usage
- 查看 目标目录下 占用空间的大小
方法1
du -h --max-depth=1 <targetDir>
方法2
step1 切换到目标路径
cd <目标目录路径>
step2 执行du
命令
[root@govern /]# du -sh *
(或者 du -sh * <targetDir>)
5.9M bin
25M boot
260M data
8.0K dedia
160K dev
30M etc
435G home
176M lib
38M lib64
16K lost+found
3.7G media
4.0K mnt
4.2G opt
du: 无法访问"proc/209022/task/209022/fd/4": 没有那个文件或目录
du: 无法访问"proc/209022/task/209022/fdinfo/4": 没有那个文件或目录
du: 无法访问"proc/209022/fd/4": 没有那个文件或目录
du: 无法访问"proc/209022/fdinfo/4": 没有那个文件或目录
du: 无法访问"proc/967628/task/969740/fd/69": 没有那个文件或目录
0 proc
2.8G root
16M sbin
137M sefon
4.0K selinux
4.0K srv
0 sys
1.2M tmp
1.7G usr
7.0G var
du: 无法访问"/proc/209022/task/209022/fd/4": 没有那个文件或目录
du: 无法访问"/proc/209022/task/209022/fdinfo/4": 没有那个文件或目录
du: 无法访问"/proc/209022/fd/4": 没有那个文件或目录
du: 无法访问"/proc/209022/fdinfo/4": 没有那个文件或目录
451G /
3 ls
- 查找占用存储空间超过阈值的文件(及其路径)
[root@xxx ~]# find /home/sdc -type f -size +800M
/home/myTomcat/logs/catalina.out
补充: 此命令(切换到目标路径下) / du -sh *
亦可
- 查看指定文件的大小
[root@xxx ~]#ls -l --block-size='G' /home/myTomcat/logs/catalina.out
-rw-r----- 1 sdc sdc 431G 10月 17 12:03 /home/myTomcat/logs/catalina.out
[root@xxx ~]#ls -l --block-size='M' /home/myTomcat/logs/catalina.out
-rw-r----- 1 sdc sdc 440590M 10月 17 12:03 /home/myTomcat/logs/catalina.out
[root@xxx ~]#ls -l --block-size='K' /home/myTomcat/logs/catalina.out
-rw-r----- 1 sdc sdc 451163616K 10月 17 12:03 /home/myTomcat/logs/catalina.out
[root@xxx ~]# ls -lh
total 565M
-rwxr-xr-x 1 billing_dx BILLING 1.1M Mar 10 18:56 AcctMgrService
-rw-r--r-- 1 billing_dx BILLING 364 Mar 10 18:59 AcctMgrService.conf
-rw------- 1 billing_dx BILLING 11G Mar 13 18:37 core.22836
-rw-r--r-- 1 billing_dx BILLING 410 Mar 13 17:38 dll_info.conf
-rwxr-xr-x 1 billing_dx BILLING 39 Mar 10 18:57 go
补充: 此命令(切换到目标路径下) / du -sh *
亦可
ls -l
/ls -la
ls -l
:查看文件详细信息,不包括隐藏文件ls -la
:包括隐藏文件
# ls -la /logs
total 16
drwxr-xr-x 4 root root 4096 Sep 6 17:46 .
dr-xr-xr-x. 21 root root 4096 Sep 10 07:00 ..
drwxr-xr-x 3 root root 4096 Sep 6 17:45 my-xxl-job-executor
drwxr-xr-x 3 root root 4096 Sep 6 17:46 xxl-job
4 df
df -h
df -h /iso/CentOS7-1804.iso # 【IMPORTANT】查看指定文件(or目录)的挂载路径 / 查看指定的文件目录属于磁盘分区(挂载点)
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/cl-root 15T 38G 15T 1% /
df –h # 查看已挂载设备的信息
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/cl-root 15T 14G 15T 1% /
devtmpfs 32G 0 32G 0% /dev
tmpfs 32G 0 32G 0% /dev/shm
tmpfs 32G 9.4M 32G 1% /run
tmpfs 32G 0 32G 0% /sys/fs/cgroup
/dev/sda2 1016M 131M 886M 13% /boot
/dev/sda1 200M 9.5M 191M 5% /boot/efi
tmpfs 6.3G 0 6.3G 0% /run/user/0
/dev/loop0 4.1G 4.1G 0 100% /var/www/html/repo
ll /var/www/html/repo # 查看挂载的目录中是否有内容
total 654
-rw-r--r--. 1 root root 14 Dec 5 2016 CentOS_BuildTag
drwxr-xr-x. 3 root root 2048 Dec 5 2016 EFI
-rw-r--r--. 1 root root 215 Dec 10 2015 EULA
-rw-r--r--. 1 root root 18009 Dec 10 2015 GPL
drwxr-xr-x. 3 root root 2048 Dec 5 2016 images
drwxr-xr-x. 2 root root 2048 Dec 5 2016 isolinux
drwxr-xr-x. 2 root root 2048 Dec 5 2016 LiveOS
drwxrwxr-x. 2 root root 630784 Dec 5 2016 Packages
drwxrwxr-x. 2 root root 4096 Dec 5 2016 repodata
-rw-r--r--. 1 root root 1690 Dec 10 2015 RPM-GPG-KEY-CentOS-7
-rw-r--r--. 1 root root 1690 Dec 10 2015 RPM-GPG-KEY-CentOS-Testing-7
-r--r--r--. 1 root root 2883 Dec 5 2016 TRANS.TBL
df -hT
[root@localhost opt]# df -hT
文件系统 类型 容量 已用 可用 已用% 挂载点
/dev/vda2 xfs 1.0T 26G 999G 3% /
devtmpfs devtmpfs 32G 0 32G 0% /dev
tmpfs tmpfs 32G 0 32G 0% /dev/shm
tmpfs tmpfs 32G 18M 32G 1% /run
tmpfs tmpfs 32G 0 32G 0% /sys/fs/cgroup
/dev/vda3 xfs 200G 11G 190G 6% /home
/dev/vda6 xfs 300G 33M 300G 1% /ruanjian
/dev/vda1 xfs 197M 133M 65M 68% /boot
tmpfs tmpfs 6.3G 12K 6.3G 1% /run/user/42
tmpfs tmpfs 6.3G 0 6.3G 0% /run/user/1000
df -iH
df -TH
: 查看磁盘大小,解决:删除比较大无用的文件df -ih
: 查看inode,文件系统、文件的字节数,拥有者id,组id,权限,改动时间,链接数,数据block的位置,解决:删除数量过多的小文件
bdp-gateway-service-parent-backend-service-5f488cbfb9-smstf:/# df -iH
Filesystem Inodes Used Available Use% Mounted on
overlay 5.6M 5.6M 1.7K 100% /
tmpfs 3.9M 17 3.9M 0% /dev
tmpfs 3.9M 18 3.9M 0% /sys/fs/cgroup
/dev/mapper/vgpaas-kubernetes 640.0K 2.7K 637.3K 0% /tools
/dev/mapper/vgpaas-kubernetes 640.0K 2.7K 637.3K 0% /etc/hosts
/dev/mapper/vgpaas-kubernetes 640.0K 2.7K 637.3K 0% /dev/termination-log
/dev/mapper/vgpaas-dockersys 5.6M 5.6M 1.7K 100% /etc/hostname
/dev/mapper/vgpaas-dockersys 5.6M 5.6M 1.7K 100% /etc/resolv.conf
shm 3.9M 1 3.9M 0% /dev/shm
tmpfs 3.9M 9 3.9M 0% /run/secrets/kubernetes.io/serviceaccount
tmpfs 3.9M 1 3.9M 0% /proc/acpi
tmpfs 3.9M 17 3.9M 0% /proc/kcore
tmpfs 3.9M 17 3.9M 0% /proc/keys
tmpfs 3.9M 17 3.9M 0% /proc/timer_list
tmpfs 3.9M 17 3.9M 0% /proc/sched_debug
tmpfs 3.9M 1 3.9M 0% /proc/scsi
tmpfs 3.9M 1 3.9M 0% /sys/firmware
应用场景
CASE : 查看指定目录属于哪个磁盘?
[root@prod-ecs-opengmini-0003 ~]# df -h /usr/local/opengemini/wal
Filesystem Size Used Avail Use% Mounted on
/dev/sda1 197G 4.1G 185G 3% /
CASE : 挂载磁盘的对比
- 挂盘前
系统盘 100GB
# df -hT
Filesystem Type Size Used Avail Use% Mounted on
devtmpfs devtmpfs 16G 0 16G 0% /dev
tmpfs tmpfs 16G 0 16G 0% /dev/shm
tmpfs tmpfs 16G 8.6M 16G 1% /run
tmpfs tmpfs 16G 0 16G 0% /sys/fs/cgroup
/dev/sda1 ext4 99G 65G 31G 69% /
tmpfs tmpfs 3.1G 0 3.1G 0% /run/user/0
# df -hT /data
Filesystem Type Size Used Avail Use% Mounted on
/dev/sda1 ext4 99G 65G 31G 69% /
- 挂盘后
数据盘(被新增挂载的盘): 400GB
# df -hT
Filesystem Type Size Used Avail Use% Mounted on
devtmpfs devtmpfs 16G 0 16G 0% /dev
tmpfs tmpfs 16G 0 16G 0% /dev/shm
tmpfs tmpfs 16G 8.8M 16G 1% /run
tmpfs tmpfs 16G 0 16G 0% /sys/fs/cgroup
/dev/sda1 ext4 99G 65G 31G 69% /
tmpfs tmpfs 3.1G 0 3.1G 0% /run/user/0
/dev/sdb ext4 394G 14G 360G 4% /data
# df -hT /data
Filesystem Type Size Used Avail Use% Mounted on
/dev/sdb ext4 394G 16G 359G 5% /data
# df -i
Filesystem Inodes IUsed IFree IUse% Mounted on
devtmpfs 3973503 352 3973151 1% /dev
tmpfs 3976110 1 3976109 1% /dev/shm
tmpfs 3976110 527 3975583 1% /run
tmpfs 3976110 16 3976094 1% /sys/fs/cgroup
/dev/sda1 6553600 6553600 0 100% /
tmpfs 3976110 1 3976109 1% /run/user/0
/dev/sdb 26214400 4090756 22123644 16% /data
Y Linux 文件存储: sector & block & inode & file
Y.1 扇区(sector,硬盘的最小存储单位, default = 512Byte) & 块(block,文件存取的最小单位, default=4KB = 8 sector)
-
文件是存储在硬盘上的,硬盘的最小存储单位叫
扇区/sector
,每个扇区存储512字节。 -
操作系统读取硬盘的时候,不会一个个扇区地读取,这样效率太低;而是一次性连续读取多个扇区,即一次性读取一个块block。
-
这种由多个扇区组成的块,是文件存取的最小单位。
块
的大小,最常见的是4KB
,即**连续8个sector组成1个
block`。
Y.2 索引节点(inode,文件的元信息的存储区) & 文件(file)
- 文件数据存储在
块/block
中,那么还必须找到一个地方存储文件的元信息。
- 如:文件的创建者、文件的创建日期、文件的大小等等。
- 这种存储文件元信息的区域就叫做
inode
,中文译名为索引节点(index node),也叫i节点。
因此:一个文件(
file
)必须占用一个inode
,但至少占用一个block
。
-
inode内容: inode包含很多的文件元信息,但不包含文件名,例如:字节数、属主UserID、属组GroupID、读写执行权限、时间戳等。
-
而文件名存放在目录当中,但Linux系统内部不使用文件名,而是使用
inode
号识别文件。对于操作系统来说,文件名只是inode号码便于识别的别称。 -
inode 号码 与 操作系统通过文件名打开文件的过程:
表面上,用户通过文件名打开文件,实际上,系统内部将这个过程分为三步:
- 系统找到这个文件名对应的inode号码;
- 通过inode号码,获取inode信息;
- 根据inode信息,找到文件数据所在的block,并读出数据。
其实,操作系统还要根据inode信息,看用户是否具有访问的权限,有就指向对应的数据block,没有就返回权限拒绝。
Y.3 stat : 查看 inode 信息
stat
- 查看inode信息
[root@localhost ~]# mkdir test
[root@localhost ~]# echo "this is test file" > test.txt
[root@localhost ~]# stat test.txt
File: ‘test.txt’
Size: 18 Blocks: 8 IO Block: 4096 regular file
Device: fd00h/64768d Inode: 33574994 Links: 1
Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root)
Context: unconfined_u:object_r:admin_home_t:s0
Access: 2021-08-15 19:55:05.920240744 +0800
Modify: 2021-08-15 19:55:05.920240744 +0800
Change: 2021-08-15 19:55:05.920240744 +0800
Birth: -
三个主要的时间属性:
ctime
:change time是最后一次改变文件或目录(属性)的时间,例如执行chmod,chown等命令。atime
:access time是最后一次访问文件或目录的时间。mtime
:modify time是最后一次修改文件或目录(内容)的时间。
Y.4 file : 查看文件类型
[root@localhost ~]# file test
test: directory
[root@localhost ~]# file test.txt
test.txt: ASCII text
Y.5 ls -i : 直接查看文件i节点号
当然,也可以通过stat查看文件inode信息查看i节点号。
[root@localhost ~]# ls -i
33574991 anaconda-ks.cfg 2086 test 33574994 test.txt
Y.6 inode 存储大小
- inode也会消耗硬盘空间,所以格式化的时候,操作系统自动将硬盘分成两个区域:
- 一个是
数据区
,存放文件数据;- 一个是
inode区
,存放inode所包含的信息。
- 每个inode的大小,一般是128字节或256字节。
通常情况下,不需要关注单个inode的大小,而是需要重点关注inode总数。
- inode总数在格式化的时候就确定了。
Y.7 df -i : 查看硬盘分区的inode总数和已使用情况
[root@localhost ~]# df -i
Filesystem Inodes IUsed IFree IUse% Mounted on
/dev/mapper/centos-root 8910848 26029 8884819 1% /
devtmpfs 230602 384 230218 1% /dev
tmpfs 233378 1 233377 1% /dev/shm
tmpfs 233378 487 232891 1% /run
tmpfs 233378 16 233362 1% /sys/fs/cgroup
/dev/sda1 524288 328 523960 1% /boot
tmpfs 233378 1 233377 1% /run/user/0
Y.8 特有现象 : 基于 inode 号 与 文件名分离
由于inode号码与文件名分离,导致一些Unix/Linux系统具备以下几种特有的现象。
- 文件名包含特殊字符,可能无法正常删除。这时直接删除inode,能够起到删除文件的作用。
find ./* -inum {节点号} -delete
-
移动文件或重命名文件,只是改变文件名,不影响inode号码。
-
打开一个文件以后,系统就以inode号码来识别这个文件,不再考虑文件名。
这种情况使得软件更新变得简单,可以在不关闭软件的情况下进行更新,不需要重启。
因为系统通过inode号码,识别运行中的文件,不通过文件名。
更新的时候,新版文件以同样的文件名,生成一个新的inode,不会影响到运行中的文件。
等到下一次运行这个软件的时候,文件名就自动指向新版文件,旧版文件的inode则被回收。
Y.9 inode 数量耗尽故障 (No space left on device
/磁盘空间不足的根因之一)
简述
- 由于硬盘分区的
inode总数
在格式化后就已经固定,而每个文件必须有一个inode,因此就有可能发生inode节点
用光,但硬盘空间还剩不少,却无法创建新文件。 - 同时这也是一种攻击的方式,所以一些公用的文件系统就要做
磁盘限额
,以防止影响到系统的正常运行。
分析方法
- 分析方法:查询指定目录的inode节点使用情况
# df -i /data
Filesystem Inodes IUsed IFree IUse% Mounted on
/dev/sda1 6553600 6553600 0 100% /
- 分析方法:统计各个目录占用的inode节点数 (以便找出最大的目录)
# for i in /*; do echo $i; find $i | wc -l; done
/bin
1
/boot
332
/CloudrResetPwdAgent
198
/data
6447362
/dev
353
/etc
2572
/home
1
/lib
1
/lib64
1
/logs
40
/lost+found
1
/media
1
/mnt
1
/opt
40300
/proc
6700509
/root
405
/run
55541
/sbin
1
/srv
1
/sys
72743
/tmp
10
/usr
79297
/var
5904
修复方法
- 修复方法:很简单,只要找出哪些大量占用i节点的文件删除就可以了。
测试/试验:inode 节点耗尽故障
做个测试:
- 先准备一个比较小的硬盘分区
/dev/sdb1
,并格式化挂载,这里挂载到了/data目录下
[root@localhost ~]# df -hT /data/
Filesystem Type Size Used Avail Use% Mounted on
/dev/sdb1 xfs 29M 1.8M 27M 6% /data
- 先测试可以正常创建文件
[root@localhost ~]# touch /data/test{1..5}.txt
[root@localhost ~]# ls /data/
test1.txt test2.txt test3.txt test4.txt test5.txt
- 查看i节点的使用情况
[root@localhost ~]# df -i /data/
Filesystem Inodes IUsed IFree IUse% Mounted on
/dev/sdb1 16385 8 16377 1% /data
- 编写一个测试程序,创建大量空文件,用于耗尽此分区中的i节点数
[root@localhost ~]# vim killinode.sh
#!/bin/bash
i=1
while [ $i -le 16376 ]
do
touch /data/file$i
let i++
done
- 运行测试程序,结束后查看i节点占用情况,磁盘分区空间使用情况
[root@localhost ~]# sh killinode.sh
[root@localhost ~]# df -i /data/
Filesystem Inodes IUsed IFree IUse% Mounted on
/dev/sdb1 16385 16385 0 100% /data
[root@localhost ~]# df -hT /data/
Filesystem Type Size Used Avail Use% Mounted on
/dev/sdb1 xfs 29M 11M 19M 36% /data
- 虽然还有很多剩余空间,但是i节点耗尽了,也无法创建创建新文件,这就是i节点耗尽故障
[root@localhost ~]# touch /data/newfile.txt
touch: cannot touch ‘/data/newfile.txt’: No space left on device
Y.10 硬链接与软链接
Y.10.1 硬链接
通过文件系统的inode链接来产生的新的文件名,而不是产生新的文件,称为硬链接。
一般情况下,每个inode号码对应一个文件名,但是Linux允许多个文件名指向同一个inode号码。意味着可以使用不同的文件名访问相同的内容。
ln 源文件 目标
运行该命令以后,源文件与目标文件的inode号码相同,都指向同一个inode。inode信息中的链接数这时就会增加1。
当一个文件拥有多个硬链接时,对1份文件名的内容修改,会影响到所有文件名;
但是删除一个文件名,不影响另一个文件名的访问;删除一个文件名,只会使得inode中的链接数减1。
需要注意的是:不能对目录做硬链接。
通过
mkdir
命令创建一个新目录,其硬链接数应该有2个,因为常见的目录本身为1个硬链接,而目录下面的隐藏目录.
(点号)是该目录的又一个硬链接,也算是1个连接数。
Y.10.2 软链接
类似于Windows的快捷方式功能的文件,可以快速连接到目标文件或目录,称为软链接。
ln -s 源文件或目录 目标文件或目录
- 软链接就是再创建一个独立的文件,而这个文件会让数据的读取指向他连接的那个文件的文件名。
例如,文件A和文件B的inode号码虽然不一样,但是文件A的内容是文件B的路径。
- 读取文件A时,系统会自动将访问者导向文件B。
这时,文件A就称为文件B的软链接soft link或者符号链接symbolic link。
这意味着,文件A依赖于文件B而存在,如果删除了文件B,打开文件A就会报错。
- 这是软链接与硬链接的【最大区别】:文件A指向文件B的文件名,而不是文件B的inode号码,文件B的inode链接数不会因此发生变化。
因此,在日常应用监控中,还是要注意这种指标的监控,避免因为一些异常的场景,导致系统不可用。
X 推荐文献
本文链接: https://www.cnblogs.com/johnnyzen
关于博文:评论和私信会在第一时间回复,或直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
日常交流:大数据与软件开发-QQ交流群: 774386015 【入群二维码】参见左下角。您的支持、鼓励是博主技术写作的重要动力!