磁盘信息:df、du
df命令
–功能:检查文件系统的磁盘空间占用情况
–语法:df [选项]
–选项:
-a 显示所有文件系统的磁盘使用情况,包括0块(block)的文件系统,如/proc文件系统。
-k 以k字节为单位显示。
-h 以可读性较好的方式显示。
-T 显示文件系统类型。
范例:
df -h
du -h -s
du -h -s /* | sort
查看/ 目录下 所有文件夹大小命令
1.0K /lu1 1.1G /lu2 11M /lu3 2.2G /lu5 6.0M /lu56 6.9M /lu567 80M /lu5678
查看目录的大小 du -sh dirname -s 仅显示总计 -h 以k、m、g为单位,提高信息的可读性。kb、mb、gb是以1024为换算单 位, -h以1000为换算单位
以下是刚装好的RH9.0(全部) Linux目录大小参考: /usr 4.5G /usr/share 2.2G
/usr/src 189M
/usr/games 3.9M
/usr/X11R6 173M
/usr/lib 1.5G
/usr/include 91M
/usr/bin 258M
/var 250M
du:
du (disk usage)命令
–功能:统计目录(或文件)所占磁盘空间的大小
–说明:该命令逐级进入指定目录的每一个子目录并显示该目录占用文件系统数据块(1024字节)的情况。若没有给出Names,则对当前目录进行统计。
–选项:
-s 对每个Names参数只给出占用的数据块总数
-a 递归地显示指定目录中各文件及子孙目录中各文件占用的数据块数。若既不指定-s,也不指定-a,则只显示Names中的每一个目录及其中的各子目录所占的磁盘块数。
-b 以字节为单位列出磁盘空间使用情况(系统缺省以k字节为单位)。
-k 以1024字节为单位列出磁盘空间使用情况。
-c 最后再加上一个总计(系统缺省设置)。
-l 计算所有的文件大小,对硬链接文件,则计算多次
磁盘加载:mount、umount
磁盘
–mount /dev/floppy /media/floppy
–umount /dev/floppy
•
光盘
–mount /dev/cdrom /media/cdrom
–umount /dev/cdrom
•
USB
–fdisk -l /dev/sda (USB设备名,不同机器上显示可能不一样)
–mkdir /mnt/usb
–mount -t vfat /dev/sda2 /mnt/usb
–ls /mnt/usb
–umount /dev/sda2
磁盘分区:fdisk
df 和 du命令比较:
df命令用来查看磁盘的使用情况。常用df -ah 或者 df -h;可以查看一级文件夹大小、使用比例、档案系统及其挂入点,但对文件却无能为力
du可以查看文件及文件夹的大小,统计文件大小相加。du命令用来查询档案或目录的磁盘使用空间,常用:du -sh 目录 或者 du -h 目录
df 统计数据块使用情况
如果有一个进程在打开一个大文件的时候,这个大文件直接被rm 或者mv掉,则du会更新统计数值,df不会更新统计数值,还是认为空间没有释放。直到这个打开大文件的进程被Kill掉。
如此一来在定期删除 /var/spool/clientmqueue下面的文件时,如果没有杀掉其进程,那么空间一直没有释放。
使用下面的命令杀掉进程之后,系统恢复。
两者配合使用,非常有效。比如用df查看哪个一级目录过大,然后用du查看文件夹或文件的大小,如此便可迅速确定症结。
下面分别简要介绍
df命令参数:
- -a:显示全部的档案系统和各分割区的磁盘使用情形
- -i:显示i -nodes的使用量
- -k:大小用k来表示 (默认值)
- -t:显示某一个档案系统的所有分割区磁盘使用量
- -x:显示不是某一个档案系统的所有分割区磁盘使用量
- -T:显示每个分割区所属的档案系统名称
- -h :以 MB、GB为单位显示档案系统大小,使用易读的格式,但是计算式,1K=1000,而不是1K=1024
常用命令:df -ah
使用实例:
# df -h
Filesystem Size Used Avail Capacity Mounted on
/dev/ad0s1a 1.9G 389M 1.4G 21% /
devfs 1.0K 1.0K 0B 100% /dev
/dev/ad0s1d 989M 54K 910M 0% /tmp
/dev/ad0s1f 4.8G 3.8G 657M 86% /usr
/dev/ad0s1e 1.9G 149M 1.6G 8% /var
/dev/ad0s1g 26G 890K 24G 0% /volume2
/dev/da0s1d 325G 261G 38G 87% /volume1
我们加了。
上面的指令输出的第一个字段及最后一个字段分别是档案系统及其挂入点。
我们可以看到 /dev/ad0s1a 这个分割区被挂在根目录下。我们在上一小节提到过 ad 所代表的是 IDE 的硬盘,而 s1 表示第一个主要扇区。我另外有一个 SCSI 硬盘,它的代号是 da,它的容量很大,主要用来存放数据。devfs 是一个特别的档案系统,该档案系统并非真的磁盘,而是 FreeBSD 用来管理系统硬件装置的虚拟档案系统。
接下来的四个字段 Size、Used、Avail、及 Capacity 分别是该分割区的容量、已使用的大小、剩下的大小、及使用的百分比。当硬盘容量已满时,您可能会看到已使用的百分比超过 100%,因为 FreeBSD 会留一些空间给 root,让 root 在档案系统满时,还是可以写东西到该档案系统中,以进行管理。
另外,我们还可以使用参数 -i 来查看目前档案系统 inode 的使用情形。有的时候虽然档案系统还有空间,但若没有足够的 inode 来存放档案的信息,一样会不能增加新的档案。
# df -ih
Filesystem Size Used Avail Capacity iused ifree %iused Mounted on
/dev/ad0s1a 1.9G 389M 1.4G 21% 20495 262127 7% /
devfs 1.0K 1.0K 0B 100% 0 0 100% /dev
/dev/ad0s1d 989M 62K 910M 0% 24 141286 0% /tmp
/dev/ad0s1f 4.8G 3.8G 657M 86% 311439 348015 47% /usr
/dev/ad0s1e 1.9G 149M 1.6G 8% 1758 280864 1% /var
/dev/ad0s1g 26G 890K 24G 0% 12 3532786 0% /volume2
/dev/da0s1d 325G 261G 38G 87% 707277 43311409 2% /volume1
我们可以看到根目录的已经用掉的 inode 数量为 20495,还有 262127 的可用 inode。
所谓的 inode 是用来存放档案及目录的基本信息 (metadata),包含时间、档名、使用者及群组等。在分割扇区时,系统会先做出一堆 inode 以供以后使用,inode 的数量关系着系统中可以建立的档案及目录总数。如果要存的档案大部分都很小,则同样大小的硬盘中会有较多的档案,也就是说需要较多的 inode 来挂档案及目录。
du:查询档案或目录的磁盘使用空间 (定位哪个文件占用的空间多,消耗磁盘空间)
- -a:显示全部目录和其次目录下的每个档案所占的磁盘空间
- -b:显示目录或文件大小时,以byte为单位
- -c:最后再加上总计 (默认值) ,除了显示每个目录或文件的大小外,同时也显示所有目录或文件的总和。
- -s:只显示各档案大小的总合 (summarize),仅显示总计,只列出最后加总的值
- -x:只计算同属同一个档案系统的档案
- -L:计算所有的档案大小
- -h :以K,M,G为单位显示档案系统大小,提高信息的可读性。
- -k :以KB(1024bytes)为单位输出
- -m: 以MB为单位输出
- -X:-X<文件>或--exclude-from=<文件> 在<文件>指定目录或文件。
- --exclude=<目录或文件> 略过指定的目录或文件。
- -H:-H与-h参数相同,但是K,M,G是以1000为换算单位。
常用命令:du -a
实例使用
引用 指令 du 能以指定的目录下的子目录为单位,显示每个目录内所有档案所占用的磁盘空间大小。例如:
# du -h /etc
104K /etc/defaults
6.0K /etc/X11
8.0K /etc/bluetooth
4.0K /etc/gnats
52K /etc/isdn
388K /etc/mail
68K /etc/mtree
2.0K /etc/ntp
38K /etc/pam.d
44K /etc/periodic/daily
6.0K /etc/periodic/monthly
42K /etc/periodic/security
16K /etc/periodic/weekly
110K /etc/periodic
6.0K /etc/ppp
318K /etc/rc.d
2.0K /etc/skel
130K /etc/ssh
10K /etc/ssl
1.7M /etc
在应用时,我们可以使用 du 这个指令来查看哪个目录占用最多的空间。不过,du 的输出结果通常很长,我们可以加上 -s 参数来省略指定目录下的子目录,而只显示该目录的总合即可:
# du -sh /etc
1.7M /etc
在查看目录的使用情形时,我们可以将输出结果导到 sort 指令进行排序,以了解哪个档案用了最多的空间:
# du /etc | sort -nr | more
1746 /etc
388 /etc/mail
318 /etc/rc.d
130 /etc/ssh
110 /etc/periodic
104 /etc/defaults
68 /etc/mtree
52 /etc/isdn
44 /etc/periodic/daily
42 /etc/periodic/security
38 /etc/pam.d
16 /etc/periodic/weekly
10 /etc/ssl
8 /etc/bluetooth
6 /etc/ppp
6 /etc/periodic/monthly
6 /etc/X11
4 /etc/gnats
2 /etc/skel
2 /etc/ntp
sort 的参数 -nr 表示要以数字排序法进行反向排序,因为我们要对目录大小做排序,所以不可以使用 human-readable 的大小输出,不然目录大小中会有 K、M 等字样,会造成排序不正确。
1> 要显示一个目录树及其每个子树的磁盘使用情况
#du /home
这在/home目录及其每个子目录中显示了磁盘块数。只显示目录,不显示文件
2> 要通过以1024字节为单位显示一个目录树及其每个子树的磁盘使用情况
#du -k /home/
这在/home目录及其每个子目录中显示了 1024 字节磁盘块数。
3> 以MB为单位显示一个目录树及其每个子树的磁盘使用情况
#du -m /home/
这在/home/linux目录及其每个子目录中显示了 MB 磁盘块数。
4>查看当前目录下所有目录以及子目录的大小:
#du -h /home //常用
“.”代表当前目录下。
也可以换成一个明确的路径 -h表示用K、M、G的人性化形式显示
5>查看当前目录下user目录的大小,并不想看其他目录以及其子目录:
#du -sh /home 常用到的方式
-s表示总结的意思,即只列出一个总结的值,
6>查看当前目录下每个目录/文件的大小,不显示子目录中的文件的大小
如果当前目录下文件和文件夹很多,使用不带参数du的命令,可以循环列出所有文件和文件夹所使用的空间。这对查看究竟是那个地方过大是不利的,所以得指定 深入目录的层数,参数:--max-depth=,这是个极为有用的参数!如下,注意使用“*”,可以得到文件的使用空间大小.
#du -h –-max-depth=1 . //--max-depth=n表示只深入到第n层目录,此处设置为1,即表示不深入到子目录。输出当前目录下各个子目录所使用的空间
#du -h –-max-depth=0 /home //表示统计home文件夹的大小
7>列出user目录及其子目录下所有目录和文件的大小:
#du -ah /home -a表示包括目录和文件
8>列出当前目录中的目录名不包括xyz字符串的目录的大小:
du -h --exclude=’*xyz*’
[root@bsso yayu]# du -h --max-depth=1 work/testing
27M work/testing/logs
35M work/testing
[root@bsso yayu]# du -h --max-depth=1 work/testing/*
8.0K work/testing/func.php
27M work/testing/logs
8.1M work/testing/nohup.out
8.0K work/testing/testing_c.php
12K work/testing/testing_func_reg.php
8.0K work/testing/testing_get.php
8.0K work/testing/testing_g.php
8.0K work/testing/var.php
[root@bsso yayu]# du -h --max-depth=1 work/testing/logs/
27M work/testing/logs/
[root@bsso yayu]# du -h --max-depth=1 work/testing/logs/*
24K work/testing/logs/errdate.log_show.log
8.0K work/testing/logs/pertime_show.log
27M work/testing/logs/show.log
完
以上面的意思为:HD硬盘接口的第二个硬盘(b),第二个分区(2),容量是75G,用了75G,可用是0,因此利用率是100%, 被挂载到根分区目录上(/)。
下面是相关命令的解释:
df -hl 查看磁盘剩余空间
df -h 查看每个根路径的分区大小
du -sh [目录名] 返回该目录的大小
du -sm [文件夹] 返回该文件夹总M数
查看linux文件目录的大小和文件夹包含的文件数
统计总数大小
du -sh xmldb/
du -sm * | sort -n //统计当前目录大小 并安大小 排序
du -sk * | sort -n
du -sk * | grep guojf //看一个人的大小
du -m | cut -d "/" -f 2 //看第二个/ 字符前的文字
查看此文件夹有多少文件 /*/*/* 有多少文件
du xmldb/
40752
解释:
wc [-lmw]
参数说明:
-l :多少行
-m:多少字符
-w:多少字
下面说下两者结果不同的原因,主要是由于两者计算结果的方式不同。
先来看看两者是如何计算的
df命令:
df是从文件系统考虑,通过文件系统中未分配的空间来确定文件系统中已分配空间的大小。例如:如果一个文件系统中有8192个512-byte 块,并且4096个块没有被分配出去,那么已分配的空间就是4096个512-byte 的块。
已分配空间=空间总数-未分配空间
df中的used还包含了程序申请的、被程序占用的空间等等。因为基于文件系统总体来计算,所以df命令是报告文件系统空间使用情况最可靠的命令。
du命令
du是面向文件的命令,它计算分配给指定文件或者目录的空间。du命令必须跟着目的参数,而且不能隔离文件系统。
例如:运行 #du /命令将计算所有在/文件系统下所有文件的空间分配信息。其中包括/文件系统所有的文件和安装在/下面的,例如/tmp, /var和/usr下面的其他文件系统的文件。可以用du命令带-x参数来限制仅在文件系统内进行操作。但是有时候会导致输出结果不完全。
du命令只计算被文件占用的空间。不计算文件系统metadata 占用的空间,如inodes, inode maps, 或者disk maps。
du命令只计算那些可以访问的文件所占用的存储空间。
下面两种情况du命令不会计算已经分配给文件的空间。
Case1:
文件被隐藏了。
例如:如果一个文件存放在/bobby 目录下, 接着有文件系统安装(mount)在/bobby目录下, 那么du 命令将不会计算 /bobby 目录下的文件所占用的存储空间。
Case2:
文件被其他的应用的打开了,接着文件被删除了(rm命令删除)。 在这种情况下,文件所占用的存储空间将维持着被分配的状态直到所有对这个文件的访问都被关闭。由于目录中没有这个文件的相关纪录,du命令将不会计算这个文件的被分配空间,但df命令将计算这部分已分配的空间。
除rm外,有些不明显的操作也会产生类似的问题。
例如gzip命令,其对某个文件xxx.log进行压缩时,会产生一个新的xxx.log.gz文件,完成后,会把原来的xxx.log删除。这时,若仍有进程在使用xxx.log文件。那么,实际上该文件还是只会标记为deleted,其空间也不会释放,问题与上面提到的情况是相同的。所以,在编写脚本时,可先判断是否仍有进程正在使用该文件,然后再进行gzip操作。
通俗点讲,du就是遍历某个目录,把所有文件的大小加起来,都是那看得见的东西的和
简单的模拟测试实验(以下实验属引用,未测试。看了下输出,结果应该没问题。呵呵!)
实验情况
1、创建并删除文件
创建文件前的磁盘容量情况:
1 2 3 4 |
# df -h 文件系统 容量 已用 可用 已用% 挂载点 /dev/sda1 12G 5.7G 5.5G 51% / tmpfs 506M 0 506M 0% /dev/shm |
创建文件:
1 2 3 4 |
# dd if=/dev/zero of=test.iso bs=1024k count=1000
1000+0 records in
1000+0 records out
1048576000 bytes (1.0 GB) copied, 14.3055 seconds, 73.3 MB/s |
现在的磁盘情况:
1 2 3 4 |
# df -h 文件系统 容量 已用 可用 已用% 挂载点 /dev/sda1 12G 6.7G 4.6G 60% / tmpfs 506M 0 506M 0% /dev/shm |
模拟某个进程正在使用该文件:
1 |
# tail -f /tmp/test.iso |
2、删除该文件
打开另一个终端,登陆到系统中。查看是否有进程正在使用上面创建的文件:
1 2 |
# lsof |grep test.iso tail 2175 root 3r REG 8,1 1048576000 752972 /tmp/test.iso |
把该文件删掉,并确认:
1 2 3 4 |
# rm /tmp/test.iso rm:是否删除 一般文件 “/tmp/test.iso”? y # ls /tmp/test.iso ls: /tmp/test.iso: 没有那个文件或目录 |
查看是否还有进程在使用(注意结尾的标记):
1 2 |
# lsof |grep test.iso tail 2175 root 3r REG 8,1 1048576000 752972 /tmp/test.iso (deleted) |
查看磁盘使用情况:
1 2 3 4 5 6 7 |
# df -h 文件系统 容量 已用 可用 已用% 挂载点 /dev/sda1 12G 6.7G 4.6G 60% / tmpfs 506M 0 506M 0% /dev/shm # cat /proc/diskstats |grep sda1 8 1 sda1 54385 5184 1626626 130090 20434 635997 5251448 5345733 0 111685 5475829 |
可见,虽然从ls已经无法找到该文件,但因为tail进程仍在使用该文件,故实际上内核并没有把这文件所占用的空间释放出来(df的结果)。
3、停止相关进程
回到第一终端,用Ctrl+C 终止tail 进程,查看结果:
1 2 3 4 5 6 7 |
# df -h 文件系统 容量 已用 可用 已用% 挂载点 /dev/sda1 12G 5.7G 5.5G 51% / tmpfs 506M 0 506M 0% /dev/shm # cat /proc/diskstats |grep sda1 8 1 sda1 54473 5184 1627402 130617 20453 636042 5251960 5345756 0 112226 5476379 |
至此,文件所占用的空间已完全释放。
从上面的实验,可得出一些情况:
1、若有进程在占用某个文件,而其他进程把这文件删掉,只会删除其在磁盘中的标记,而不会释放其占用的磁盘空间;直到所有访问该文件的进程退出为止; 2、df是从内核中获取磁盘占用情况数据的,而du是统计当前磁盘文件大小的结果,由于磁盘标记已被删掉,因此du 不会计算上述被删除文件的空间,导致df 与 du的结果不一致。
解决问题
通常的解决方法有两个
1、把占用文件的相关进程关闭
这可通过下面的命令得到这些已被删除,但未释放空间的文件和进程信息:
1 |
# lsof |grep deleted |
找到这些进程后,在安全的情况下把其关闭,空间自会马上释放。
2、以清空的方式替代删除
归根到底,产生问题的原因是,访问该文件的文件指针(句柄),在rm动作后,因为进程仍在访问,因此,仍处在文件里面(中间或结尾处)。所以,如果用清空的方式,把文件指针重置,该文件所占用的空间也会马上释放出来。
1 2 3 4 5 6 7 8 9 |
# echo > /tmp/test.iso # df -h 文件系统 容量 已用 可用 已用% 挂载点 /dev/sda1 12G 5.7G 5.5G 51% / tmpfs 506M 0 506M 0% /dev/shm # tail -f /tmp/test.iso tail: /tmp/test.iso: file truncated |
所以,对于常发生类似问题的文件,如:日志记录文件等。以改名、清空、删除的顺序操作可避免问题。
fdisk