在 OpenSolaris 下刪除文件時設備上沒有空間
嘗試在客戶端機器上安裝 NFS 共享(從OpenIndiana伺服器導出)時,OI 伺服器崩潰。我得到了黑屏當機,看起來像日誌轉儲,然後系統重新啟動。它再也沒有恢復,我在停止啟動後收到以下錯誤消息:
svc.startd[9] Could not log for svc:/network/dns/mulitcast:default: write(30) failed with No space left on device?
除了作業系統,我在引導驅動器上沒有其他任何東西,所以……我不確定驅動器可能會被什麼東西填滿?也許是某種日誌文件?無論如何,我似乎無法刪除任何內容。當我嘗試刪除任何內容時,它給了我一個沒有空格的錯誤:
$ rm filename cannot remove 'filename' : No space left on device
我可以登錄“維護模式”,但不能登錄標準使用者提示。
的輸出
df
是:rpool/ROOT/openindiana-baseline 4133493 4133493 0 100% / swap 83097900 11028 830386872 1% /etc/svc/volatile /usr/lib/libc/libc_hwcap1.so.1 4133493 4133493 0 100% /lib/libc.so.1
的輸出
mount
是:/ on rpool/ROOT/openindiana-baseline read/write/setuid/devices/dev:2d9002 on Wed Dec 31 16:00:00 1969 /devices on /devices read/write/setuid/devices/dev:8b40000 on Fri Jul 8 14:56:54 2011 /dev on /dev read/write/setuid/devices/dev:8b80000 on Fri Jul 8 14:56:54 2011 /system/contract on ctfs read/write/setuid/devices/dev:8c40001 on Fri Jul 8 14:56:54 2011 /proc on proc read/write/setuid/devices/dev:8bc0000 on Fri Jul 8 14:56:54 2011 /etc/mnttab on mnttab read/write/setuid/devices/dev:8c80001 on Fri Jul 8 14:56:54 2011 /etc/svc/volatile on swap read/write/setuid/devices/xattr/dev:8cc0001 on Fri Ju8 14:56:54 2011 /system/object on objfs read/write/setuid/devices/dev:8d00001 on Fri Jul 8 14:6:54 2011 /etc/dfs/sharetab on sharefs read/write/setuid/devices/dev:8d40001 on Fri Jul 14:56:54 2011 /lib/libc.s0.1 on /usr/lib/libc/libc_hucap1.s0.1 read/write/setuid/devices/dev:d90002 on Fri Jul 8 14:57:06 2011
‘zfs list -t all’ 的輸出是:
rpool 36.4G 0 47.5K /rpool rpool/ROOT 4.23G 0 31K legacy rpool/ROOT/openindiana 57.5M 0 3.99G / rpool/ROOT/openindiana-baseline 61K 0 3.94G / rpoo1/ROOT/openindiana-system-edge 4.17G 0 3.98G / rpool/ROOT/openindiana-system-edge@install 19.9M - 3 38G - rpoo1/ROOT/openindiana-system-edge@2011-07-06-20:45:08 73.1M - 3.57G - rpoo1/ROOT/openindiana-system-edge@2011-07-06-20:48:53 75.9M - 3 82G - rpoo1/ROOT/openindiana-system-edge@2011-07-07-02:14:04 61K - 3.94G - rpoo1/ROOT/openindiana-system-edge@2011-07-07-02:15:14 61K - 3.94G - rpoo1/ROOT/openindiana-system-edge@2011-07-07-02:28:14 61K - 3.94G - rpool/ROOT/openindiana-system-stable 61K 0 3.94G / rpoo1/ROOT/pre_first_update_07.06 108K 0 3 82G / rpool/ROOT/pre_second_update_07.06 90K 0 3.57G / rpool/dump 9.07G 0 9.07G - rpool/export 3.85G 0 32K /export rpool/export/home 3.85G 0 32K /export/home rpool/export/home/admin 3.85G 0 3.85G /export/home/admin rpool/swap 19.3G 19.1G 126M -
好吧,這很奇怪……沒有足夠的空間來刪除文件!
事實證明,這在 ZFS 中是一個相對常見的問題,儘管它可能出現在任何具有 快照的文件系統上。
解釋是您嘗試刪除的文件仍然存在於快照上。因此,當您刪除它時,內容會保持存在(僅在快照中);並且系統必須另外寫入快照有文件但目前狀態沒有的資訊。沒有空間留給額外的一點點資訊。
短期修復是找到在最新快照之後創建的文件並將其刪除。另一種可能性是找到在最新快照之後附加到的文件,並將其截斷為最新快照時的大小。如果您的磁碟已滿,因為某些東西一直在向您的日誌發送垃圾郵件,請嘗試修剪最大的日誌文件。
更普遍適用的修復是刪除一些快照。您可以使用 列出快照
zfs list -t snapshot
。似乎沒有一種簡單的方法可以預測如果您銷毀特定快照將重新獲得多少空間,因為它儲存的數據可能會被其他快照需要,因此如果您銷毀該快照,它將繼續存在。因此,如有必要,請將您的數據備份到另一個磁碟,確定一個或多個不再需要的快照,然後執行zfs destroy name/of/snap@shot
.此 OpenSolaris 論壇主題中對此問題進行了擴展討論。