web-dev-qa-db-ja.com

switch_rootは無効な引数を与えます

私の目標は、ルートディスクをアンマウントして、フォーマットできるようにすることです。これを行うには、ルートをハードディスクから他のルートに切り替えます。 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.

私は何が間違っているのですか?

2
Duke Dougal

この目的で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_rootrm -rfしたいですか?とにかく後でファイルシステムを作り直すつもりなので気にしないかもしれませんが、それは最適ではありません。

また、switch_rootの使用法は正しくありません。/ramrootの後の引数は、ディレクトリの名前ではなく、(新しいルートで)実行するコマンドである必要があります。しかし、それはあなたの問題の原因ではありません。

Mount(2)のマンページから、EINVALエラーの原因が正確に何であるかは明らかではありませんが、失敗しても驚くことではありません。ユースケースはswitch_rootで予期されたものではないため、おそらく十分にテストおよびサポートされていません。古いファイルシステムがまだ使用されている(参照が開いている)ために、MS_MOVEマウントが機能しなくなる可能性があると思います。

次のことを試して、機能するかどうかを確認できますが、どれも機能しない可能性が高いと思います。

  • 古いルートファイルシステムへの参照を保持しているシステムで何も実行されていないことを特に確認してください(マシンへの接続用のsshdもありません)。 SSHサーバーインフラストラクチャをすべて新しいルートファイルシステムにコピーした後、さまざまなchrootトリックを使用して、古いルートファイルシステムに依存しないマシンへのSSHセッションを調整できますが、それは体操になります。
  • execを使用してswitch_rootを呼び出します。そのように呼び出されるように設計されています。
  • Ext2ファイルシステムの代わりにtmpfsファイルシステムを使用してください。あなたがやろうとしていることのために、RAMディスクの上でext2ファイルシステムを使用する理由はありません。 (initramfsのように)tmpfsを使用する方がよいでしょう。

実行しようとしていることを実行するためのより良い方法は、マシンのコンソールを使用し、実際のinitramfsを使用して作業を実行することです。もちろん、これには、マシンへの作業コンソールアクセスが必要です。カーネルコマンドラインでbreak=bottomのようなもので起動すると、initramfsは、ramfsの下で実行しているときに必要なことを実行する機会を与えてくれます。必要なツールを実行する前に、initramfsにコピーすることをお勧めします。

結局、あなたがそれをする余裕があれば、救助システムの下でこれらのことをすることははるかに簡単で安全です。前述のbreakトリックを使用してinitramfsの下で作業を行う正当な理由を考えることができます(たとえば、リモートシリアルコンソールアクセスはあるが、レスキューシステムでUSBキーを挿入する機会がなく、ネットのサポートがない-レスキューシステムを起動します)が、間違えると危険です(アクセスできなくなり、とにかくデータセンターにアクセスする必要があります)。

2
Celada