磁碟上沒有更多空間

磁碟上沒有更多空間

我使用的是 Ubuntu 14.04。一段時間以來,我無法同時運行更多程式。這df -h給出了:

Filesystem      Size  Used Avail Use% Mounted on
/dev/sda1        29G   25G  3.4G  88% /
none            4.0K     0  4.0K   0% /sys/fs/cgroup
udev             16G  4.0K   16G   1% /dev
tmpfs           3.2G  724K  3.2G   1% /run
none            5.0M     0  5.0M   0% /run/lock
none             16G   59M   16G   1% /run/shm
none            100M   40K  100M   1% /run/user
/dev/sda2       438G  138M  416G   1% /scratch
AFS             8.6G     0  8.6G   0% /afs

df -i

Filesystem       Inodes   IUsed    IFree IUse% Mounted on
/dev/sda1       1875968 1875968        0  100% /
none            4106915      11  4106904    1% /sys/fs/cgroup
udev            4103190     499  4102691    1% /dev
tmpfs           4106915     524  4106391    1% /run
none            4106915       3  4106912    1% /run/lock
none            4106915     122  4106793    1% /run/shm
none            4106915      27  4106888    1% /run/user
/dev/sda2      29138944     709 29138235    1% /scratch
AFS             9000000       0  9000000    0% /afs

我也嘗試過這裡的建議:bash: echo: 寫入錯誤: 裝置上沒有剩餘空間,沒有幫助,實際上它會使情況變得更糟。現在,如果我進入終端並部分寫入資料夾的名稱,我按下Tab 並得到:

cd Pybash: cannot create temp file for here-document: No space left on device

我只想寫的地方

cd Python

編輯: 的輸出sudo du -hxd1 /是:

1.5G    /var
22G /usr
18M /etc
16K /lost+found
36K /home
349M    /opt
68K /tmp
9.7M    /bin
4.2M    /libx32
12K /.config
2.5M    /root
4.0K    /mnt
4.0K    /lib64
13M /sbin
81M /boot
505M    /lib
3.5M    /lib32
12K /media
4.0K    /srv
25G /

答案1

空間不是這裡的問題。您的目錄中有很多空(或接近空)檔案。它們每個都需要一個 inode,並且您已經使用了它們。找到該目錄:

for i in /* ; do echo "$i" ; find "$i" | wc -l ; done

(您應該以 root 身分執行此操作)。這可能會列出一個包含大量文件的目錄。向下鑽取,直到找到耗盡索引節點的檔案。刪除所有這些檔案。那你暫時沒事了。當然,這些文件的來源是另一個故事。

答案2

從 中可以看出df -h,根分區上仍有剩餘空間。但是,df -i顯示您已用完索引節點。在我的電腦上,我的根分區使用了 7.3G,但只使用了 320,000 個索引節點,因此您可能有很多非常小的檔案堵塞了某個地方。

有關何處的討論,請參見,例如Stack Exchange - 尋找索引節點的使用位置。我會從該頁面嘗試以下操作:

sudo find / -xdev -printf '%h\0' | sort -z | uniq -cz | sort -nrzk 1 | tr '\0' '\n' | head -n 50

如果您使用的是更新版本的 Ubuntu(例如 15.10),那麼這個較短的命令也可能會更快:

sudo du / --inodes -xS | sort -rh | head -n 50

兩者都會為您提供一個目錄列表,按它們使用的索引節點數量排序。您可能會發現一個數字非常高(可能在/var某個地方)。這應該讓您了解可以刪除哪些文件,但如果您有任何疑問,請先回到此處詢問。

作為可能正常情況的參考,在我的計算機(運行 Ubuntu 15.10)上,我從該命令得到以下輸出:

3297    /usr/share/app-install/desktop
3022    /usr/share/man/man3
2325    /usr/bin
2149    /usr/share/man/man1
2104    /usr/share/app-install/icons
1816    /usr/lib/x86_64-linux-gnu
1089    /usr/src/linux-headers-4.2.0-19/include/linux
1089    /usr/src/linux-headers-4.2.0-18/include/linux
1089    /usr/src/linux-headers-4.2.0-16/include/linux
...

這是對更簡單命令的解釋。 sudo需要以 root 身分執行 du 命令,因此我們可以在普通用戶可能無法讀取的資料夾中找到檔案。 du /給出根目錄的磁碟使用情況/--inodes告訴它列出 inode 使用情況,-S僅列出目錄本身中的文件而不是子目錄中的文件,並且-x不要跨越文件系統邊界(因為您的問題肯定是 on/和 not on,例如,/scratch)。然後我們透過管道輸出該命令來sort尋找最嚴重的違規者;-r反轉排序,使最大的位於頂部,並按-h數字而不是按字母順序排序。最後,head -n 50僅輸出前 50 行(即最嚴重的 50 條違規者)。


這是更複雜命令的解釋。 sudo需要以 root 身分執行 find 命令,這樣我們就可以在普通使用者可能無法讀取的資料夾中尋找檔案。 find /給出根目錄上所有檔案的列表/-xdev告訴find不要跨越檔案系統邊界(因為你的問題肯定是 on/和 not on,例如/scratch);-printf '%h\0'列印以零位元組結尾的目錄名稱。然後我們將該命令的輸出透過管道傳輸到sort -z,然後uniq -cz計算每個目錄被列印的次數(即每個目錄中有多少個檔案);sort這裡需要,因為uniq需要一個排序列表。然後我們找出最嚴重的違規者;-r反轉排序,使最大的位於頂部,並按-n數字而不是按字母順序排序。 tr '\0' '\n'用新行取代零位元組。最後,head -n 50僅輸出前 50 行(即最嚴重的 50 條違規者)。

相關內容