[Linux]常用命令之【du/fdisk/df/ls】#磁盘管理/文件管理#

本文的经典应用场景:
1.查找占用磁盘存储空间最大的目录/文件
2.关于【磁盘分区】的相关概念和实操,详见另一博文:[Linux]磁盘分区 - 博客园/千千寰宇

1 fdisk

fdisk := "Partition table manipulator(操纵器) for Linux" := Linux的磁盘分区工具
-l 【查看磁盘所有分区情况】;列出指定设备的分区表信息并退出。 如果没有给出设备,那么使用那些在 /proc/partitions (如果存在)提到的.
-b sector size (512, 1024, 2048 or 4096)
-c switch off DOS-compatible mode
-h print help
-u give sizes in sectors instead of cylinders;以扇区数而不是以柱面数的形式显示分区表中各分区的信息.
-v print version;打印 fdisk 的版本信息并退出
-C specify the number of cylinders
-H specify the number of heads
-S specify the number of sectors per track;分区 将分区的 大小 (单位为块)信息输出到标准输出

  • 选择分区磁盘:进入磁盘,分区操作(创建、删除)准备
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 *亦可

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

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 号码 与 操作系统通过文件名打开文件的过程:

表面上,用户通过文件名打开文件,实际上,系统内部将这个过程分为三步:

  1. 系统找到这个文件名对应的inode号码;
  2. 通过inode号码,获取inode信息;
  3. 根据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系统具备以下几种特有的现象。

  1. 文件名包含特殊字符,可能无法正常删除。这时直接删除inode,能够起到删除文件的作用。
find ./* -inum {节点号} -delete
  1. 移动文件或重命名文件,只是改变文件名,不影响inode号码。

  2. 打开一个文件以后,系统就以inode号码来识别这个文件,不再考虑文件名。

这种情况使得软件更新变得简单,可以在不关闭软件的情况下进行更新,不需要重启。
因为系统通过inode号码,识别运行中的文件,不通过文件名。
更新的时候,新版文件以同样的文件名,生成一个新的inode,不会影响到运行中的文件。
等到下一次运行这个软件的时候,文件名就自动指向新版文件,旧版文件的inode则被回收。

Y.9 inode 数量耗尽故障

  • 由于硬盘分区的inode总数在格式化后就已经固定,而每个文件必须有一个inode,因此就有可能发生inode节点用光,但硬盘空间还剩不少,却无法创建新文件。

  • 同时这也是一种攻击的方式,所以一些公用的文件系统就要做磁盘限额,以防止影响到系统的正常运行。

  • 修复方法:很简单,只要找出哪些大量占用i节点的文件删除就可以了。
    做个测试:

  1. 先准备一个比较小的硬盘分区/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
  1. 先测试可以正常创建文件
[root@localhost ~]# touch /data/test{1..5}.txt
[root@localhost ~]# ls /data/
test1.txt  test2.txt  test3.txt  test4.txt  test5.txt
  1. 查看i节点的使用情况
[root@localhost ~]# df -i /data/
Filesystem     Inodes IUsed IFree IUse% Mounted on
/dev/sdb1       16385     8 16377    1% /data
  1. 编写一个测试程序,创建大量空文件,用于耗尽此分区中的i节点数
[root@localhost ~]# vim killinode.sh
#!/bin/bash
i=1
while [ $i -le 16376 ]
do
touch /data/file$i
let i++
done
  1. 运行测试程序,结束后查看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
  1. 虽然还有很多剩余空间,但是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 推荐文献

posted @ 2020-10-17 13:31  千千寰宇  阅读(634)  评论(0编辑  收藏  举报