私の目標は、ルートディスクをアンマウントしてフォーマットすることです。そのために、ハードディスクのルートディレクトリを別のルートディレクトリに切り替えたいと思います。私は再び切り替えたいrootfsを生成するためにinitramfs(最小ルートファイルシステムを含む)のファイルを使用することにしました。
Ubuntu 16.04を新しくインストールしながらこれを行っています。
次のコマンドはRAMディスクを作成し、initramfsの内容をRAMディスクにコピーします。
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.
私は何が間違っていましたか?
答え1
この目的には使用しないことをお勧めしますswitch_root
。これは実際にはinitramfsで使用し、initramfsから実際のルートに切り替えるように設計されており、他の目的には使用されません。マンページの次の警告では、これらの特別な使用の証拠を見ることができます。
WARNING: switch_root removes recursively all files and directories on
the current root filesystem.
これは、initramfsが実際のルートに切り替えられた後にinitramfs(tmpfs)が使用するメモリを復元できるようにします。 (しかし、switch_root
initramfsシェルスクリプトの一部ではない組み込みの理由は、これがこれを行う唯一の機会であるためです。以前のルートが廃止され、バイナリがまだファイルにしばらくかかっている場合は、説明を参照してください。 )本当にswitch_root
古いルートファイルシステムが欲しいですかrm -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にコピーする必要があります。
最後に、そうする能力がある場合は、構造システムの下でこれを行う方が簡単で安全です。 initramfsで作業を完了するために上記のトリックを使用する良い理由を考えることができますbreak
(たとえば、リモートシリアルコンソールにアクセスできますが、回復システムにUSBキーを接続する機会がなく、ネットワークをサポートしていません)。救助システムを起動すること)、しかし間違えて危険であれば(とにかくアクセス権を失い、データセンターに行く必要があります)。