zeromountを実行できるように読み取り専用としてマウントしようとすると、「mount:/ is busy」
Ubuntu 11.04でzerofree
を実行して、VirtualBox vdiイメージを次のように圧縮できるようにしています。
VBoxManage modifyhd Ubuntu.vdi --compact
zerofree
を実行するには、ディスクイメージを読み取り専用としてマウントする必要があります。私はフォローしています これらの手順 これは、これを使用して、回復モードから読み取り専用として再マウントすることを示しています(ルートシェルプロンプトにドロップ):
mount -n -o remount,ro -t ext2 /dev/sda1 /
しかし、これを行うとエラーが発生します。
mount: / is busy
これを行う方法に関するアイデアはありますか?
フォローアップ:これらのコマンドを実行して、Jariの回答と この投稿 に従って問題を解決します。
service rsyslog stop
service network-manager stop
killall dhclient
一部のプロセスは、書き込み用にファイルを開いたままにしています。これらは、たとえば、rsyslogd
のようなログを書き込むプログラム、dhclient
のようなネットワークツール、またはその他のものです。これらを1つずつシャットダウンして再マウントを試みると、うまくいく場合があります。
プログラムfuser
を使用すると、特定のファイルを使用するプロセスを見つけることができます。例えば、 fuser -v -m /
はプロセスのリストを返します。ただし、ファイルシステムをビジー状態に保つのがこれらの1つであるかどうかはわかりません。
ファイルシステムを読み取り専用で再マウントできるのは、書き込み用にファイルを開いているプロセスがない場合だけです。 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}'
ピーターの答えを改善する:
マウントポイントを使用するプロセスを強制終了できませんでした。だから、私はこれをしました:
- 編集
/etc/fstab
は、次回の起動時に読み取り専用で起動します。例:/dev/sda1 / ext2 ro 0 1
- 再起動してシェルを開きます(ホストキー+ F2など)
- Zerofreeを実行する
システムを「回復」するには:
- 読み書きオプションでマウント:
$ mount -o remount,rw /dev/sda1
- 編集
/etc/fstab
再び、元の値に戻します
Extra:必要に応じて、任意のステップでリカバリモードを開きます。
- リブート
- VMの読み込み中にシフトを保持
- 詳細オプション>リカバリモードのカーネルオプション>ルートシェルプロンプトにドロップ
マウントをビジー状態に保つプロセスが非常に多い場合があるため、マウントを読み取り専用で再起動する方が簡単な場合があります。
/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 に触発されました
ファイルを開いたまますべてのサービスとプロセスを停止した後もデバイスをアンマウントまたは再マウントできない場合は、デバイスをビジー状態に保つスワップファイルまたはスワップパーティションがある可能性があります。これはfuser
またはlsof
には表示されません。以下とのスワッピングをオフにします。
Sudo swapoff -a
事前にチェックして、次のコマンドでスワップパーティションまたはスワップファイルの概要を表示できます。
swapon -s
または:
cat /proc/swaps
コマンドSudo swapoff -a
を使用する代わりに、サービスまたはsystemdユニットを停止してスワップを無効にすることもできます。例えば:
Sudo systemctl stop dphys-swapfile
または:
Sudo systemctl stop var-swap.swap
私の場合、ファイルを書き込み用に開いた状態でサービスとプロセスを停止することに加えて、スワップをオフにする必要がありました。これにより、ルートパーティションでfsck
を実行せずにルートパーティションを読み取り専用として再マウントできました。再起動します。これは、Raspbian Jessieを実行しているRaspberry Piで必要でした。
Systemdを使用する場合、systemd-journaldを停止することにより、ディスクの書き込みが停止します。
# systemctl stop systemd-journald.socket
# systemctl stop systemd-journald.service
# mount -o ro,remount /
はい、私がやったことがあります
最初に、私の目的はreduce my /
(ROOT
)パーティションをディスクに追加することでした。
すべてをクリーンアップしてバックアップした後のセッションの実行から:
init 1
デスクトップが消えて、今はLinux console ...
... Give root password for maintenance or press CTRL+D to continue TheRootPassword_SomethingLike1234
次に、
/
を読み取り専用モードでマウントしようとしています:mount -o remount,ro / mount: / is busy
さて、今から理論的にはシングルユーザーモードにいますが、
ps ax
は他の多くのプロセスを表示します!!それらをすべて殺すことは実際には不可能であるか、危険です...(
kill 1
は禁止されています...私にはプレイする時間がありません psdoom :-)私ができる唯一のことは、
System Request
です。これについて、私は2つの方法を知っています:(-Documentation/sysrq.txt
カーネルドキュメント内のファイル):最初に
magic SysRq key
キーボードカーネルトラップを使用します。- 押し続ける AltGr、それから押し続け、
- ヒット PrtScn 一度だけですが、解放しないでください AltGr、
- ヒット s 一度だけ、これは
Emergency sync
リクエストをカーネルに送信し、 - ヒット u、これは
Umount all
リクエストを送信し、すべてのマウントされたファイルシステムを読み取り専用で再マウントします、 - その後解放します AltGr
またはコマンドラインで:
echo s >/proc/sysrq-trigger echo u >/proc/sysrq-trigger
そして今、私はできました
fsck -fC0 /dev/mapper/MyDisk-ROOT
....
...
vdiファイルを追加の非システムボリュームとして別のVirtualBoxにアタッチします。そこで、必要に応じて(再)マウントし、zerofreeを実行できます。
VM1(仮想マシン1)のVDIディスクを圧縮するとします。次に、2番目のVM2が必要です。あれは、 :
- VM1もVM2も実行していないことを確認してください。
VirtualBox Managerから:
- VM2を選択し、
圧縮するVM1のvdiファイルを選択します。ヒント:VM2に追加されたばかりのハードディスクが、VM2の元のディスクの後にブート順で2番目になることを確認します。
- vM2を起動します。VM2ではVM1のボリュームを使用しているプロセスがないため、VM2の追加ディスクとしてVM1のボリュームを(再)マウントできます。ヒント:最初に、ボリュームを自動的にマウントするLinuxのフォロブラウザでボリュームを開きます。次に、
mount -l
は_Device_
コマンド内Sudo mount -o remount,ro _Device_
。私の場合、これは/ dev/sdb1でした。したがって、コマンドは(1)Sudo mount -o ro,remount /dev/sdb1
、次に(2)Sudo zerofree /dev/sdb1
。
VM2の代わりに、。iso imageのようなインストールディスクから起動して、同じことを実現できるはずですが、私は試していません。
端末に貼り付ける簡単な修正を探している他の人のために...
(以下のコマンドを実行する前に、telinit 1
などの他の手順が完了していることを確認してください。)
fuser -mv /dev/sda1 > /tmp/sda1.pids
kill `cat /tmp/sda1.pids`
コマンドによってセッションが強制終了される場合がありますが、戻ってきたら、パーティションを再マウントする準備ができています。
VMでmount
コマンドを実行しようとしていると思います。とにかく、あなたはおそらくフォーラムの投稿者とは異なるルートパーティションを持っているでしょう。
試してください:
mount -o ro,remount /
これは、fsオプションまたはマウントオプションに依存しません。これが機能しない場合は、grep " / " /proc/mounts
またはcat /proc/cmdline
を使用してルートファイルを特定することもできます。ルートファイルシステムがたとえば/ dev/mapper/system-rootfsの場合、次のように使用できます。
mount -o ro,remount /dev/mapper/system-rootfs /
この問題が発生したため、マシンを読み取り専用モードにすることができませんでした。問題を解決するには、認めるほどidよりも時間がかかりました...私の問題は、Apache-Zeppelinを実行したままにして、それを忘れていたことにあると思います。別のホスティングタイプサービスで同じことを行っていないことを確認してください。問題を解決するために私はfuser -kill /
を使用すると、問題の原因となっている可能性のあるすべてのプロセスが終了し、roモードに戻ることができます。
私にとっての解決策は、OSを再起動し、GRUBのブートメニューから「回復モード」を選択することでした。 「リカバリーモード」からは、実行中のプロセスが少なくなり、読み取り専用の再マウントは正常に機能します。
システムが(スワップパーティションではなく)ルートファイルシステムにスワップファイルを持っている場合は、swapoff -a
でスワップファイルを一時的にオフにすることも必要です。