私の目標は、ルートディスクをアンマウントして、フォーマットできるようにすることです。これを行うには、ルートをハードディスクから他のルートに切り替えます。 initramfs(最小限のルートファイルシステムを含む)のファイルを使用して、元に戻すrootfsを作成することを選択しました。
私はUbuntu16.04のクリーンインストールでこれを行っています。
次のコマンドはramdiskを作成し、initramfsの内容をramdiskにコピーします。
dd if=/dev/zero of=/dev/ram bs=1k count=209715
mke2fs -vm0 /dev/ram 209715
mount -t ext2 /dev/ram /ramroot/
cd /ramroot/
zcat /boot/initrd.img-4.4.0-47-generic | cpio -idmv
mkdir old-root
ただし、switch_rootコマンドを実行すると、「無効な引数」が表示されます。
root@ubuntu-512mb-nyc3-01:/ramroot# switch_root /ramroot /ramroot/old-root
switch_root: failed to mount moving /run to /ramroot/run: Invalid argument
switch_root: forcing unmount of /run
switch_root: failed to mount moving /ramroot to /: Invalid argument
switch_root: failed. Sorry.
私は何が間違っているのですか?
この目的でswitch_root
を使用しないことをお勧めします。これは実際には、initramfsがinitramfsから実際のルートに切り替えるためにのみ使用するように設計されており、他の目的には使用されません。その特殊な目的の証拠は、そのマンページにある次の警告で確認できます。
WARNING: switch_root removes recursively all files and directories on
the current root filesystem.
これは、initramfsが実際のルートに切り替えた後にinitramfs(tmpfs)によって使用されたメモリを回復できるようにするためです。 (ちなみに、initramfsシェルスクリプトの一部ではなくswitch_root
に組み込まれている理由は、それを実行する唯一の機会であるためです。古いルートが使用されなくなった後、バイナリがまだ一時的にそれを参照するファイル記述子。)本当に古いルートファイルシステムにswitch_root
をrm -rf
したいですか?とにかく後でファイルシステムを作り直すつもりなので気にしないかもしれませんが、それは最適ではありません。
また、switch_root
の使用法は正しくありません。/ramroot
の後の引数は、ディレクトリの名前ではなく、(新しいルートで)実行するコマンドである必要があります。しかし、それはあなたの問題の原因ではありません。
Mount(2)のマンページから、EINVAL
エラーの原因が正確に何であるかは明らかではありませんが、失敗しても驚くことではありません。ユースケースはswitch_root
で予期されたものではないため、おそらく十分にテストおよびサポートされていません。古いファイルシステムがまだ使用されている(参照が開いている)ために、MS_MOVE
マウントが機能しなくなる可能性があると思います。
次のことを試して、機能するかどうかを確認できますが、どれも機能しない可能性が高いと思います。
sshd
もありません)。 SSHサーバーインフラストラクチャをすべて新しいルートファイルシステムにコピーした後、さまざまなchroot
トリックを使用して、古いルートファイルシステムに依存しないマシンへのSSHセッションを調整できますが、それは体操になります。exec
を使用してswitch_root
を呼び出します。そのように呼び出されるように設計されています。実行しようとしていることを実行するためのより良い方法は、マシンのコンソールを使用し、実際のinitramfsを使用して作業を実行することです。もちろん、これには、マシンへの作業コンソールアクセスが必要です。カーネルコマンドラインでbreak=bottom
のようなもので起動すると、initramfsは、ramfsの下で実行しているときに必要なことを実行する機会を与えてくれます。必要なツールを実行する前に、initramfsにコピーすることをお勧めします。
結局、あなたがそれをする余裕があれば、救助システムの下でこれらのことをすることははるかに簡単で安全です。前述のbreak
トリックを使用してinitramfsの下で作業を行う正当な理由を考えることができます(たとえば、リモートシリアルコンソールアクセスはあるが、レスキューシステムでUSBキーを挿入する機会がなく、ネットのサポートがない-レスキューシステムを起動します)が、間違えると危険です(アクセスできなくなり、とにかくデータセンターにアクセスする必要があります)。