我嘗試zerofree
在 Ubuntu 11.04 上運行,以便可以使用以下命令壓縮 VirtualBox vdi 映像:
VBoxManage modifyhd Ubuntu.vdi --compact
為了運行,zerofree
磁碟映像已安裝為唯讀。我正在跟進這些說明它表示使用它從復原模式重新掛載為唯讀(Drop to root shell 提示字元):
mount -n -o remount,ro -t ext2 /dev/sda1 /
但是當我這樣做時,我收到錯誤:
mount: / is busy
關於如何做到這一點有什麼想法嗎?
跟進:按照賈裡的回答和這個帖子透過運行這些命令可以解決該問題。
service rsyslog stop
service network-manager stop
killall dhclient
答案1
某些進程使檔案保持開啟以供寫入。例如,這些可以是寫入日誌的程序,例如rsyslogd
網路工具dhclient
或其他東西。將它們一一關閉並嘗試重新安裝可能會起作用。
您可以使用該程式來尋找使用某些檔案的進程fuser
。例如,fuser -v -m /
將傳回進程清單。但是,我不確定它是否是導致檔案系統繁忙的其中之一。
答案2
改進彼得的回答:
我無法終止使用我的安裝點的進程。所以,我這樣做了:
- 編輯
/etc/fstab
為下次啟動時以唯讀方式啟動。前任:/dev/sda1 / ext2 ro 0 1
- 重新啟動並開啟 shell(例如,主機鍵 + F2)
- 零運行
若要「恢復」您的系統:
- 使用讀寫選項掛載:
$ mount -o remount,rw /dev/sda1
- 再次編輯
/etc/fstab
,恢復原來的值
額外:如果需要打開恢復模式在任何步驟中:
- 重啟
- VM 載入時按住 Shift 鍵
- 進階選項 > 帶有恢復模式的核心選項 > 刪除到根 Shell 提示
答案3
只有當沒有進程開啟檔案進行寫入時,您才能以唯讀方式重新掛載檔案系統。運行lsof /
以查看哪些進程在根檔案系統上開啟了檔案。開啟用於寫入的檔案將在該列中指示FD
。您可以使用以下方法過濾這些內容
lsof / | awk '$4 ~ /[0-9].*w/'
若要自動過濾進程 ID,請解析下列輸出lsof -F pa
:
lsof -F pa /home | awk '/^p/ {pid = substr($0, 2)} /^a.*w/ {print pid}'
答案4
有時,有太多進程使掛載保持繁忙,因此以只讀掛載方式重新啟動可能會更容易。
更改 中根檔案系統的條目/etc/fstab
,例如:
/dev/sda1 / ext2 relatime,rw,errors=remount-ro 0 1
變成:
/dev/sda1 / ext2 noatime,ro 0 1
重新啟動時,檔案系統將以唯讀方式掛載,因此您可以zerofree
在其上運行。
完成後,再次以讀取/寫入方式重新掛載檔案系統 ( mount -o remount,rw /
) 並撤銷對 的變更/etc/fstab
。
靈感來自https://wiki.debian.org/ReadonlyRoot#Enable_readonly_root