web-dev-qa-db-ja.com

ルートにディレクトリをマウント

特定のファイルを含むフォルダがあります。 /にマウントして、指定したディレクトリのコンテンツが/の対応する場所に表示されるようにする方法はありますか?

私の場合、ディレクトリにはアプリケーションに関連するファイルが含まれています-/dev/procなどのディレクトリはありません。

次の方法でバインドマウントを作成してみました。

mount --bind ~/applications/firefox /

ただし、これは何もしません。コメントで推測されたものとは異なり、それも悪影響を及ぼしません。


これの動機は、ミッションクリティカルなシステムにクリーンにインストールしたいカスタムアプリケーションがたくさんあることです。当然のことながら、関連する管理を最小限に抑えたいと思います。 nionfs-Fuse + chroot method を使用してアプリケーションインストールのファイルシステムレイアウトを取得しましたが、それでもアプリケーションのファイルがシステムのファイルと混じり合う問題に対処する必要があります。特定のディレクトリを/にマウントすると、ファイルシステムをクリーンに保つのに役立ちます。

ソフトウェアをインストールするこの方法はおかしいように見えるかもしれませんが、「Porteus」という名前のディストリビューションがあり、ソフトウェアをこの方法で(同じ理由で)インストールしますが、パッチを適用したカーネルとaufsを使用することが知られています。ただし、システムでカスタムカーネルを使用できません。

7
user2064000

あなたが求めていることは、一般的に構成されているほぼすべてのLinuxシステムで少なくとも1回は実行されます。ほとんどはbusyboxが提供する switch_root というツールを使用します。

switch_rootが行うことは、rootfs(メモリを解放するため)からすべてのファイルを削除し、次にchroot新しいファイルシステムと新しいファイルシステムから新しいinitプロセスを実行します。

これは、システムの初期化中に発生します。 Linuxシステムが起動すると、カーネルはシステムを段階的に起動します。最初、カーネルはブートローダーやファームウェアなどの他のシステムによってメモリ内で実行されます。この時点では、カーネルはそのままにしておくだけで、システムの実際の参照フレームはありません。それはちょうど実行されました。

これは、通常、メモリ空間に追加されるinitramfsイメージです(ただし、カーネルに直接コンパイルされる可能性もあります)が処理するように設計されています。 initramfsは、実際のLinuxルートです(完全なw//devおよび/procおよびwhat-have-you)ファイルシステムイメージ-最初のルートファイルシステムですLinuxカーネルによってマウントされます。カーネルを足元に置くために必要なすべて/すべてのシステム固有のモジュール/構成ファイルを含むルートファイルシステムアーカイブが含まれます-bootstrap it。

とにかく、カーネルはそのアーカイブをrootfs(基本的にはtmpfsとしてマウントしてから、検索に必要なことをすべて行います- some other /そして、その上にマウントします。これは、システムを起動するたびに行われます。 unionfsaufsのような不必要なハックに頼ることなく、再びそれを行うことができます-どちらもすべての種類を引き起こす可能性があります実装固有の複雑さと構成の詳細(不安定性は言うまでもありません)

上記の引用されたswitch_rootの説明では、おそらく、rootfsからすべてのファイルを削除するというフレーズに気付くでしょう。明らかに、これはディスクベースのrootfsから切り替えるときに望ましい動作ではありません。しかしswitch_rootを使用すると、RAMベースのファイルシステム用のメモリが解放されるだけであり、まったく不要です。これは、以前に引用した記事の一部です。

次のシェルスクリプトフラグメントは、switch_rootの使用方法を示しています。

   # First, find and mount the new filesystem.

   mkdir /newroot
   mount /dev/whatever /newroot

   # Unmount everything else you've attached to rootfs.  (Moving the filesystems
   # into newroot is something useful to do with them.)

   mount --move /sys /newroot/sys
   mount --move /proc /newroot/proc
   mount --move /dev /newroot/dev

   # Now switch to the new filesystem, and run /sbin/init out of it.  Don't
   # forget the "exec" here, because you want the new init program to inherit
   # PID 1.

   exec switch_root /newroot /sbin/init

上記のように、/dev/proc、および/sys関連の問題の処理は非常に簡単に実行できます。ところで、mount --movedマウントのいずれかをレイヤー化する場合は、mtabmountだけでなく、レイヤー化システムによって導入されるその他の複雑な問題にも対処する必要があります。質問で説明したように、より簡単です。どこかからルートをマウントします。

基本的に、典型的なinitramfs構成で発生するすべてのことを行う必要がありますが、それ以外はほとんど必要ありません-(これは、Debianまたはを含めることを意味していません) Redhatのinitramfsイメージ-どちらもway過剰に設計されています)。遭遇する可能性がある唯一の本当の問題は、PID1をどのように追跡するかです。孤立したrootfsでシステムのinitを取り残しておくと、非常に奇妙なことがすぐにシステムで発生する可能性があります。これを処理する明白な方法は、initramfsから準備することです。ルートを切り替えるときに、ハードディスクのinitプロセスが後で別のexecに準備できることを確認してください。 systemdinitを使用している場合、この複雑化はすでに処理されています。

systemctl --help
...
switch-root ROOT [INIT]         Change to a different root file system
...

systemdベースのinitを使用している場合は、/usr/lib/systemd/system/initrd*のユニットファイルを調べて、一般的にスクリプト化されているsystemdスタイルのスイッチの概要を把握する必要があります。ルート状況は似ています。

もう1つの方法は、initramfsでbusyboxswitch_rootを模倣することですが、初期ルートのすべてのファイルを削除する部分は省略します。 initramfsのsystemdで構成されたArch Linuxシステムはこれを行います。それらの場合、initramfsルートは、ルートの切り替えを行う前に/newroot/run/initramfsに自身をマウントし、シャットダウン時にシステムがフォールバックしてスリープ/サスペンドなどを正常に処理します。実際には、それがあなたの場合に最適な方法かもしれません-さまざまな個別にルート化されたアプリケーションのためにピンポンオフする、ほんの小さなRAM永続的なルートシステム。

3
mikeserv

/をマウントしないでください。自分を「新しい」(偽の、読み取り専用)ものにしてください:

私は似たようなことをしました。当時私はAUFSを使用していましたが、これはoverlayfsやunionfs-Fuseでも機能するはずです。

  • フォルダを作成(例)~/apps/_App1_FakeRoot
  • Unionfsマウント/(ルート)は、マウントポイント〜/ apps/_App1_FakeRootの~/apps/_App1読み取り/書き込みの下で読み取り専用です。
  • fakeRootにchrootし、アプリを実行します。

私の特定のケースでは、上記のようなものを使用して、(一時的な)書き込み用の(RAM)ディスクを含むいくつかのレイヤーを統合しました。

特定の構文は、ユニオン化の実装に依存しますFSあなたが使用できます)。アプリが必要とする場合もあります。ハードウェアレベルの処理を実行したい場合など、一部のタイプのプログラムはこのようなchrootで実行されない可能性もあります。

(特定のunionfs実装が/を読み取り専用のベースとして使用したくない場合は、まずアプリのベースとして使用する「ルートファイルシステム」を読み取り専用でバインドマウントすることで回避できます。)

2
Alex Stragies

mount --bind ~/applications/firefox /は、/dev/procなどを含むディレクトリツリー全体をシャドウします。影になっているものすべてにアクセスできなくなります。自分自身をシャドウするディレクトリをバインドマウントできないため、機能しません。

mixディレクトリツリーと別のディレクトリツリーにすでにあるものをミックスしたい。これは ユニオンマウント と呼ばれます。 Linuxで利用できるunionファイルシステムはいくつかあります。 aufs は非古代のカーネルに存在します。 nionfs-Fuse は、Fuseがどこにあっても使用できます。 Aufsはルートディレクトリをマウントポイントとしてサポートしますが、Unionfs-Fuseをサポートしています。ユースケースでは、/usrへのユニオンマウントで十分です。