磁盤信息: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
