Linux磁盘管理命令df和du区别

时间:2022-05-30 17:11:57
磁盘是Linux系统中一项非常重要的资源,如何对其进行有效的管理直接关系到整个系统的性能问题。磁盘管理有df、du和fdisk三个常用命令:df用于检查文件系统磁盘占用情况,du检查磁盘空间占用情况,而fdisk用于磁盘分区。

1.df

df命令可以获取硬盘被占用了多少空间,目前还剩下多少空间等信息,它也可以显示所有文件系统对i节点和磁盘块的使用情况。

df命令各个选项的含义如下:

    -a:显示所有文件系统的磁盘使用情况,包括0块(block)的文件系统,如/proc文件系统。

-k:以k字节为单位显示。

-i:显示i节点信息,而不是磁盘块。

-t:显示各指定类型的文件系统的磁盘空间使用情况。

-x:列出不是某一指定类型文件系统的磁盘空间使用情况(与t选项相反)。

-T:显示文件系统类型。

我们先看看使用df命令的例子:

//列出各文件系统的磁盘空间使用情况
#df
Filesystem 1k-blocks Used Available Use% Mounted on
/dev/hda5 381139 332921 28540 93% /
/dev/hda1 46636 6871 37357 16% /boot
/dev/hda3 10041144 6632528 2898556 70% /home
none 127372 0 127372 0% /dev/shm
/dev/hda2 27474876 24130460 1948772 93% /usr
/dev/hda6 256667 232729 10686 96% /var

第1列是代表文件系统对应的设备文件的路径名(一般是硬盘上的分区);第2列给出分区包含的数据块(1024字节)的数目;第3,4列分别表示已用的和可用的数据块数目。

◆用户也许会感到奇怪,第3,4列块数之和不等于第2列中的块数。这是因为默认的每个分区都留了少量空间供系统管理员使用的缘故。即使遇到普通用户空间已满的情况,管理员仍能登录和留有解决问题所需的工作空间。清单中Use%列表示普通用户空间使用的百分比,若这一数字达到100%,分区仍然留有系统管理员使用的空间。

最后,Mounted on列表示文件系统的安装点。

//列出各文件系统的i节点使用情况。
#df -ia
Filesystem Inodes IUsed IFree IUse% Mounted on
/dev/hda5 98392 23919 74473 25% /
none 0 0 0 - /proc
/dev/hda1 12048 38 12010 1% /boot
none 0 0 0 - /dev/pts
/dev/hda3 1275456 355008 920448 28% /home
none 31843 1 31842 1% /dev/shm
/dev/hda2 3489792 133637 3356155 4% /usr
/dev/hda6 66264 9876 56388 15% /var

//列出文件系统的类型。
#df -T
Filesystem Type 1k-blocks Used Available Use% Mounted on
/dev/hda5 ext3 381139 332921 28540 93% /
/dev/hda1 ext3 46636 6871 37357 16% /boot
/dev/hda3 ext3 10041144 6632528 2898556 70% /home
none tmpfs 127372 0 127372 0% /dev/shm
/dev/hda2 ext3 27474876 24130460 1948772 93% /usr
/dev/hda6 ext3 256667 232729 10686 96% /var2

2. du详细使用方法及介绍

du的英文原义为“disk usage”,含义为显示磁盘空间的使用情况,统计目录(或文件)所占磁盘空间的大小。该命令的功能是逐级进入指定目录的每一个子目录并显示该目录占用文件系统数据块(1024字节)的情况。若没有给出指定目录,则对当前目录进行统计。

df命令的各个选项含义如下:

    -s:对每个Names参数只给出占用的数据块总数。

-a:递归地显示指定目录中各文件及子目录中各文件占用的数据块数。若既不指定-s,也不指定-a,则只显示Names中的每一个目录及其中的各子目录所占的磁盘块数。

-b:以字节为单位列出磁盘空间使用情况(系统默认以k字节为单位)。

-k:以1024字节为单位列出磁盘空间使用情况。

-c:最后再加上一个总计(系统默认设置)。

-l:计算所有的文件大小,对硬链接文件,则计算多次。

-x:跳过在不同文件系统上的目录不予统计。

下面举例说明du命令的使用:

//查看/mnt目录占用磁盘空间的情况
#du –abk /mnt
1 /mnt/cdrom
1 /mnt/floppy
3 /mnt

//列出各目录所占的磁盘空间,但不详细列出每个文件所占的空间
#du
3684 ./log
84 ./libnids-1.17/doc
720 ./libnids-1.17/src
32 ./libnids-1.17/samples
1064 ./libnids-1.17
4944 .

输出清单中的第1列是以块为单位计的磁盘空间容量,第2列列出目录中使用这些空间的目录名称。

◆这可能是一个很长的清单,有时只需要一个总数。这时可在du命令中加-s选项来取得总数:

#du –s /mnt 
3 /mnt

//列出所有文件和目录所占的空间(使用a选项),并以字节为单位(使用b选项)来计算大小
#du –ab /root/mail
6144 mail/sent-mail
1024 mail/saved-messages
8192 mail

df与du命令区别解析:

1、句柄相关的基础知识

句柄包含:文件、目录、socket等,一个进程能够打开的文件句柄总数是一定的,可以通过ulimit –n 进行查看,一般是1024个。此参数也可以修改,以root用户运行以下命令:ulimit -HSn 4096 以上命令中,H指定了硬性大小,S指定了软性大小,n表示设定单个进程最大的打开文件句柄数量。个人觉得最好不要超过4096,毕竟打开的文件句柄数越多响应时间肯定会越慢。设定句柄数量后,系统重启后,又会恢复默认值。如果想永久保存下来,可以修改.bash_profile文件,可以修改 /etc/profile ,把命令ulimit -HSn 4096 加到最后。

2、句柄泄漏的危害

出现句柄泄漏,进程会逐渐消耗完进程可打开的句柄,导致进程再也不能打开新的句柄,系统可能不能再正常工作。

3、句柄泄露,为什么会导致磁盘空间不足:

一个文件创建,就新生成了一个inode节点,且inode节点的引用计数为1。当文件被一个进程打开,则在内存中缓冲建立此inode节点缓存,且其引用计数加1。一个文件可以被多次打开,创建多个文件描述符,但对应的inode节点只有一个,对应的磁盘存储只有一个,只是引用计数每打开一次加1。

当文件被rm,在操作系统内部其实是调用了unlink操作,其目录项被删除,如果其对应的inode节点的引用计数为0,则删除对应的inode节点和清除inode节点位图中对应的位,其对应磁盘可被再申请但如果此文件被其他进程打开,则其对应的inode节点的引用计数不为0,则不会删除对应的inode节点和清除inode节点位图中对应的位,其对应磁盘不能被再申请也就是在lsof下可以看到deleted句柄当前文件被所有使用进程close后,系统删除对应的inode节点和清除inode节点位图中对应的位,其对应磁盘可被再申请。

4、du和df的区别::

du的英文原义为“disk usage”,含义为显示磁盘空间的使用情况。该命令逐级进入指定目录的每一个子目录并显示该目录占用文件系统数据块(1024字节)的情况。若没有给出Names,则对当前目录进行统计。

df命令参数功能:检查文件系统的磁盘空间占用情况,利用所有文件系统对i节点来获取硬盘被占用了多少空间,目前还剩下多少空间等信息。

这也是为什么:

一个被进程打开的文件被rm后,其目录项被删除了,在du命令下是不能被统计到,?而其inode没有被删除,在df命令下是可以被统计到的,这就是在du和df存在差别的原因。

1、正常情况下,df和du输出结果都会有差距。

du -sh命令通过将指定文件系统中所有的目录、符号链接和文件使用的块数累加得到该文件系统使用的总块数;

df命令通过查看文件系统磁盘块分配图得出总块数与剩余块数。

文件系统分配其中的一些磁盘块用来记录它自身的一些数据,如i节点,磁盘分布图,间接块,超级块等。这些数据对大多数用户级的程序来说是不可见的,通常称为Meta Data。

du命令是用户级的程序,它不考虑Meta Data,

df命令则查看文件系统的磁盘分配图并考虑Meta Data。

因此正常情况下,df计算的USED空间会比du计算的结果要稍大。

2、异常情况下,df计算的USED空间会比du大很多。

原因在于du是以文件名、目录名为依据计算空间使用的,而df是以硬盘块使用情况来计算空间使用的。

当一个应用程序正在写一个大文件的时候,我们RM或者MV了这个文件(UNIX是允许这么干的,WINDOWS在这一点上傻有傻福),应用程序会占有句柄,并根据句柄所指磁盘位置直接写磁盘,而不会检查该文件是否被删除。


FDISK

fdisk可以划分磁盘分区。下面给出使用Fdisk命令进行磁盘分区的操作步骤:

#fdisk /dev/had    //使用/dev/had作为默认的分区设备
Command (m for help): m //选择命令选项
Command action
a toggle a bootable flag
b edit bsd disklabel
c toggle the dos compatibility flag
d delete a partition
l list known partition types
m print this menu
n add a new partition
o create a new empty DOS partition table
p print the partition table
q quit without saving changes
s create a new empty Sun disklabel
t change a partition's system id
u change display/entry units
v verify the partition table
w write table to disk and exit
x extra functionality (experts only)

用户通过提示键入“m”,可以显示Fdisk命令各个参数的说明。

Fdisk有很多参数,可是经常使用的只有几个。

◆在Linux分区过程,一般是先通过p参数来显示硬盘分区表信息,然后根据信息确定将来的分区。如下所示:

Disk /dev/sda: 4294 MB, 4294967296 bytes
255 heads, 63 sectors/track, 522 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Device Boot Start End Blocks Id System
/dev/hda1 * 41 522 3871665 83 Linux
/dev/hda2 1 40 321268+ 82 Linux swap

Partition table entries are not in disk order
Command (m for help):

◆如果想完全改变硬盘的分区格式,就可以通过d参数一个一个地删除存在的硬盘分区。删除完毕,就可以通过n参数来增加新的分区。当按下“n”后,可以看到如下所示:

Command (m for help): n
Command action
e extended
p primary partition (1-4)
p
Partiton number(1-4):1
First cylinder(1-1023):1
Last cylinder or + size or +sizeK or + sizeM(1-1023):+258M

这里要选择新建的分区类型,是主分区还是扩展分区;并选择p或是e。然后就是设置分区的大小。

◆要提醒注意的是,如果硬盘上有扩展分区,就只能增加逻辑分区,不能增加扩展分区。

◆在增加分区的时候,其类型都是默认的Linux Native,如果要把其中的某些分区改变为其他类型,例如Linux Swap或FAT32等,可以通过命令t来改变,当按下“t”改变分区类型的时候,系统会提示要改变哪个分区、以及改变为什么类型(如果想知道系统所支持的分区类型,键入l),如下所示:

Command (m for help): t
Partition number (1-4): 1
Hex code (type L to list codes): 82
Changed system type of partition 1 to 82 (Linux swap)

改变完了分区类型,就可以按下“w”,保存并退出。如果不想保存,那么可以选择“q”直接退出,如下所示:

Command (m for help):w

通过如上的操作,就可以按照需要成功地划分磁盘分区了。