zoukankan      html  css  js  c++  java
  • linux包之coreutils之du和df命令

    [root@localhost ~]# rpm -qf /usr/bin/du
    coreutils-8.4-31.el6.x86_64
    [root@localhost ~]# rpm -qf /bin/df
    coreutils-8.4-31.el6.x86_64

    [root@CentOS5 samba]# dumpe2fs  /dev/sda3|grep "Block size"    4096字节
    du 内容实际大小,以字节为单位,统计文件大小相加
    df 占用空间大小,以块为单位,统计数据块使用情况

    du -s命令通过将指定文件系统中所有的目录、符号链接和文件使用的块数累加得到该文件系统使用的总块数;而df命令通过查看文件系统磁盘块分配图得出总块数与剩余块数。文件系统分配其中的一些磁盘块用来记录它自身的一些数据,如i节点,磁盘分布图,间接块,超级块等。这些数据对大多数用户级的程序来说是不可见的,通常称为Meta Data。
    du命令是用户级的程序,它不考虑Meta Data,而df命令则查看文件系统的磁盘分配图并考虑Meta Data。df命令获得真正的文件系统数据,而du命令只查看文件系统的部分情况。
    所以我们不需要查看du 与 df返回的值的匹配关系,而只需要了解du -s命令返回的值反映了分配给文件及目录的磁盘块数,而df命令则反映了文件系统的实际分配情况。df命令反映的实际情况包含了用户数据(文件及目录)和Meta Data。

    常见的df和du不一致情况就是文件删除的问题。当一个文件被删除后,在文件系统 目录中已经不可见了,所以du就不会再统计它了。然而如果此时还有运行的进程持有这个已经被删除了的文件的句柄,那么这个文件就不会真正在磁盘中被删除, 分区超级块中的信息也就不会更改。这样df仍旧会统计这个被删除了的文件。
    如果有一个进程在打开一个大文件的时候,这个大文件直接被rm 或者mv掉,则du会更新统计数值,df不会更新统计数值,还是认为空间没有释放。直到这个打开大文件的进程被Kill掉。
    如此一来在定期删除 /var/spool/clientmqueue下面的文件时,如果没有杀掉其进程,那么空间一直没有释放。

    df -h /dev/sda1
    dd if=/dev/zero of=myfile.iso bs=1024k count=1000
    对比du与df的结果
    df -h /dev/sda1    分别查看    挂载到/var目录下
    du -sh /var/    分别查看    此时两者结果基本相同
    模拟一个进程打开这个大文件,然后删除这个大文件
    tail -f myfile.iso &
    rm -f myfile.iso
    此时,再对比du和df的结果
    首先确认有进程持有myfile.iso句柄。
    lsof | grep myfile.iso;du -sh /var/;df -h /dev/sda1
    可以看出,df结果没有变化,而du则不再统计被删除了的文件myfile.iso。
    停止模拟进程,再对比du和df结果
    lsof | grep myfile.iso;du -sh /var/;df -h /dev/sda1

    工作中需要注意的地方
    (1)当出现du和df差距很大的情况时,考虑是否是有删除文件未完成造成的,方法是lsof命令,然后停止相关进程即可。
    (2)可以使用清空文件的方式来代替删除文件,方式是:echo > myfile.iso。
    (3)对于经常发生删除问题的日志文件,以改名、清空、删除的顺序操作。
    (4)除了rm外,有些命令会间接的删除文件,如gzip命令完成后会删除原来的文件,为了避免删除问题,压缩前先确认没有进程打开该文件。

    du的工作原理
    du命令会对待统计文件逐个调用fstat这个系统调用,获取文件大小。它的数据是基于文件获取的,所以有很大的灵活性,不一定非要针对一个分区,可以跨越多个分区操作。如果针对的目录中文件很多,du速度就会很慢了。
    df的工作原理
    df命令使用的是statfs这个系统调用,直接读取分区的超级块信息获取分区使用情况。它的数据是基于分区元数据的,所以只能针对整个分区。由于df直接读取超级块,所以运行速度不受文件多少影响。

    du - 报告磁盘空间使用情况

    -a, --all
        显示对所有文件的统计,而不只是包含子目录。
    -b, --bytes
        输出以字节为单位的大小,替代缺省时1024字节的计数单位。
    --block-size=size
        输出以块为单位的大小,块的大小为 size 字节。( file- utils-4.0 的新选项)
    -c, --total
        在处理完所有参数后给出所有这些参数的总计。这个选项被 用给出指定的一组文件或目录使用的空间的总和。
    -D, --dereference-args
        引用命令行参数的符号连接。但不影响其他的符号连接。 这对找出象 /usr/tmp 这样的目录的磁盘使用量有用, /usr/tmp 等通常是符号连接。 译住:例如在 /var/tmp 下建立一个目录test, 而/usr/tmp 是指向 /var/tmp 的符号连接。du /usr/tmp 返回一项 /usr/tmp , 而 du - D /usr/tmp 返回两项 /usr/tmp,/usr/tmp/test。
    --exclude=pattern
        在递归时,忽略与指定模式相匹配的文件或子目录。模式 可以是任何 Bourne shell 的文件 glob 模式。( file- utils-4.0 的新选项)
    -h, --human-readable
        为每个数附加一个表示大小单位的字母,象用M表示二进制 的兆字节。
    -H, --si
        与 -h 参数起同样的作用,只是使用法定的 SI 单位( 用 1000的幂而不是 1024 的幂,这样 M 代表的就是1000000 而不是 1048576)。(fileutils-4.0 的新选项)
    -k, --kilobytes
        输出以1024字节为计数单位的大小。
    -l, --count-links
        统计所有文件的大小,包括已经被统计过的(作为一个硬连接)。
    -L, --dereference
        引用符号连接(不是显示连接点本身而是连接指向的文件或 目录所使用的磁盘空间)。
    -m, --megabytes
        输出以兆字节的块为计数单位的大小(就是 1,048,576 字节)。等价于–block-size=1M。
    --max-depth=n
        只输出命令行参数的小于等于第 n 层的目录的总计。 --max-depth=0的作用同于-s选项。(fileutils-4.0的新选项)
    -s, --summarize
        对每个参数只显示总和。
    -S, --separate-dirs
        单独报告每一个目录的大小,不包括子目录的大小。
    -x, --one-file-system
        忽略与被处理的参数不在同一个文件系统的目录。
    -X file, --exclude-from=file
        除了从指定的文件中得到模式之外与 --exclude 一样。 模式以行的形式列出。如果指定的文件是'-',那么从标准输 入中读出模式。(fileutils-4.0 的新选项) GNU 标准选项
    --help
        在标准输出上输出帮助信息后正常退出。
    --version
        在标准输出上输出版本信息后正常退出。

    [root@CentOS5 ~]# du
    默认只显示目录
    [root@CentOS5 ~]# du -a
    显示当前目录下所有文件与目录大小
    [root@CentOS5 ~]# du  ipband-0.8.1-1.i386.rpm
    显示指定文件所占空间

    du -b -k -m -g  以不同单位来显示

    一个目录的大小,有内容与无内容
    无内容,就显示4k
    目录本身是4k
    有内容
    再加上目录下的文件才是du显示的大小
    [root@CentOS5 auth]# du -h
    4.0K ./svn.simple
    4.0K ./svn.username
    4.0K ./svn.ssl.server
    16K .
    [root@CentOS5 lvs]# du 以系统默认的块大小显示
    12 ./lvs
    12 ./tmp
    32 .
    [root@CentOS5 lvs]# du -b 以实际字节显示
    4551 ./lvs
    4943 ./tmp
    13950 .
    [root@CentOS5 lvs]# du --block-size=2048 以设定的块大小显示
    6 ./lvs
    6 ./tmp
    16 .
    [root@CentOS5 ~]# du -sb
    99735796 .
    [root@CentOS5 ~]# du -sh
    96M .

    [root@CentOS5 home]# du -ab --max-depth=1|sort -n 以字节从小到大排序查询当前目录下的子目录与文件


    df - 报告文件系统磁盘空间的使用情况

    -a, --all
        列出包括BLOCK为0的文件系统
    --block-size=SIZE use SIZE-byte blocks
        指定块的大小
    -h,--huma-readable
        用常见的格式显示出大小(例如:1K 234M 2G)
    -H,--si
        同上,但是这里的1k等于1000字节而不是1024字节
    -i, --inodes
        用信息索引点代替块表示使用状况
    -k, --kilobytes
        指定块大小等于1024字节来显示使用状况
    -l, --local
        只显示本地文件系统使用状况
    -m, --megabytes
        以指定块大小等于1048576字节(1M)来显示使用状况
    --no-sync
        在取得使用信息前禁止调用同步 (default)
    -P, --portability
        使用POSIX格式输出
    --sync
        在取得使用信息前调用同步
    -t, --type=TYPE
        只显示指定类型(TYPE)的文件系统
    -T, --print-type
        输出每个文件系统的类型
    -x, --exclude-type=TYPE
        只显示指定类型(TYPE)之外的文件系统.
    -v (忽略)
    --help
        输出该命令的帮助信息并退出
    --version
        输出版本信息并退出

    df -ia        #列出各文件系统的i节点使用情况
    df -T        #列出文件系统的类型

    mount与df -a显示的是一样的
    fdisk -l显示的是分区
    有的时候虽然档案系统还有空间,但若没有足够的 inode 来存放档案的信息,一样会不能增加新的档案。
    所谓的 inode 是用来存放档案及目录的基本信息 (metadata),包含时间、档名、使用者及群组等。在分割扇区时,系统会先做出一堆 inode 以供以后使用,inode 的数量关系着系统中可以建立的档案及目录总数。如果要存的档案大部分都很小,则同样大小的硬盘中会有较多的档案,也就是说需要较多的 inode 来挂档案及目录。

  • 相关阅读:
    智能推荐算法演变及学习笔记(三):CTR预估模型综述
    从中国农业银行“雅典娜杯”数据挖掘大赛看金融行业数据分析与建模方法
    智能推荐算法演变及学习笔记(二):基于图模型的智能推荐(含知识图谱/图神经网络)
    (设计模式专题3)模板方法模式
    (设计模式专题2)策略模式
    (设计模式专题1)为什么要使用设计模式?
    关于macOS上常用操作命令(持续更新)
    记录下关于RabbitMQ常用知识点(持续更新)
    EMERGENCY! EUREKA MAY BE INCORRECTLY CLAIMING INSTANCES ARE UP WHEN THEY'RE NOT. RENEWALS ARE LESSER THAN THRESHOLD AND HENCE THE INSTANCES ARE NOT BEING EXPIRED JUST TO BE SAFE.
    SpringCloud教程二:Ribbon(Finchley版)
  • 原文地址:https://www.cnblogs.com/createyuan/p/3794612.html
Copyright © 2011-2022 走看看