特定のファイルを含むフォルダがあります。 /
にマウントして、指定したディレクトリのコンテンツが/
の対応する場所に表示されるようにする方法はありますか?
私の場合、ディレクトリにはアプリケーションに関連するファイルが含まれています-/dev
や/proc
などのディレクトリはありません。
次の方法でバインドマウントを作成してみました。
mount --bind ~/applications/firefox /
ただし、これは何もしません。コメントで推測されたものとは異なり、それも悪影響を及ぼしません。
これの動機は、ミッションクリティカルなシステムにクリーンにインストールしたいカスタムアプリケーションがたくさんあることです。当然のことながら、関連する管理を最小限に抑えたいと思います。 nionfs-Fuse + chroot method を使用してアプリケーションインストールのファイルシステムレイアウトを取得しましたが、それでもアプリケーションのファイルがシステムのファイルと混じり合う問題に対処する必要があります。特定のディレクトリを/
にマウントすると、ファイルシステムをクリーンに保つのに役立ちます。
ソフトウェアをインストールするこの方法はおかしいように見えるかもしれませんが、「Porteus」という名前のディストリビューションがあり、ソフトウェアをこの方法で(同じ理由で)インストールしますが、パッチを適用したカーネルとaufsを使用することが知られています。ただし、システムでカスタムカーネルを使用できません。
あなたが求めていることは、一般的に構成されているほぼすべての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 /
そして、その上にマウントします。これは、システムを起動するたびに行われます。 unionfsやaufsのような不必要なハックに頼ることなく、再びそれを行うことができます-どちらもすべての種類を引き起こす可能性があります実装固有の複雑さと構成の詳細(不安定性は言うまでもありません)。
上記の引用された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 --move
dマウントのいずれかをレイヤー化する場合は、mtab
とmount
だけでなく、レイヤー化システムによって導入されるその他の複雑な問題にも対処する必要があります。質問で説明したように、より簡単です。どこかからルートをマウントします。
基本的に、典型的なinitramfs構成で発生するすべてのことを行う必要がありますが、それ以外はほとんど必要ありません-(これは、Debianまたはを含めることを意味していません) Redhatのinitramfsイメージ-どちらもway過剰に設計されています)。遭遇する可能性がある唯一の本当の問題は、PID1をどのように追跡するかです。孤立したrootfsでシステムのinitを取り残しておくと、非常に奇妙なことがすぐにシステムで発生する可能性があります。これを処理する明白な方法は、initramfsから準備することです。ルートを切り替えるときに、ハードディスクのinit
プロセスが後で別のexec
に準備できることを確認してください。 systemd
init
を使用している場合、この複雑化はすでに処理されています。
systemctl --help
...
switch-root ROOT [INIT] Change to a different root file system
...
systemd
ベースのinit
を使用している場合は、/usr/lib/systemd/system/initrd*
のユニットファイルを調べて、一般的にスクリプト化されているsystemd
スタイルのスイッチの概要を把握する必要があります。ルート状況は似ています。
もう1つの方法は、initramfsでbusybox
のswitch_root
を模倣することですが、初期ルートのすべてのファイルを削除する部分は省略します。 initramfsのsystemd
で構成されたArch Linuxシステムはこれを行います。それらの場合、initramfsルートは、ルートの切り替えを行う前に/newroot
の/run/initramfs
に自身をマウントし、シャットダウン時にシステムがフォールバックしてスリープ/サスペンドなどを正常に処理します。実際には、それがあなたの場合に最適な方法かもしれません-さまざまな個別にルート化されたアプリケーションのためにピンポンオフする、ほんの小さなRAM永続的なルートシステム。
/
をマウントしないでください。自分を「新しい」(偽の、読み取り専用)ものにしてください:私は似たようなことをしました。当時私はAUFSを使用していましたが、これはoverlayfsやunionfs-Fuseでも機能するはずです。
~/apps/_App1_FakeRoot
/
(ルート)は、マウントポイント〜/ apps/_App1_FakeRootの~/apps/_App1
読み取り/書き込みの下で読み取り専用です。私の特定のケースでは、上記のようなものを使用して、(一時的な)書き込み用の(RAM)ディスクを含むいくつかのレイヤーを統合しました。
特定の構文は、ユニオン化の実装に依存しますFSあなたが使用できます)。アプリが必要とする場合もあります。ハードウェアレベルの処理を実行したい場合など、一部のタイプのプログラムはこのようなchrootで実行されない可能性もあります。
(特定のunionfs実装が/を読み取り専用のベースとして使用したくない場合は、まずアプリのベースとして使用する「ルートファイルシステム」を読み取り専用でバインドマウントすることで回避できます。)
mount --bind ~/applications/firefox /
は、/dev
、/proc
などを含むディレクトリツリー全体をシャドウします。影になっているものすべてにアクセスできなくなります。自分自身をシャドウするディレクトリをバインドマウントできないため、機能しません。
mixディレクトリツリーと別のディレクトリツリーにすでにあるものをミックスしたい。これは ユニオンマウント と呼ばれます。 Linuxで利用できるunionファイルシステムはいくつかあります。 aufs は非古代のカーネルに存在します。 nionfs-Fuse は、Fuseがどこにあっても使用できます。 Aufsはルートディレクトリをマウントポイントとしてサポートしますが、Unionfs-Fuseをサポートしています。ユースケースでは、/usr
へのユニオンマウントで十分です。