いくつかのファイルを含むフォルダがあります。/
特定のディレクトリの内容がその場所に表示されるようにマウントする方法はありますか/
?
私の場合、ディレクトリにはアプリケーション関連のファイルが含まれていましたが、/dev
と/proc
。
次のようにしてバインドマウントを作成してみました。
mount --bind ~/applications/firefox /
しかし、これはまったく効果がありません。コメントの推測とは異なり、副作用はありません。
これに対する動機は、ミッションクリティカルなシステムにきれいにインストールしたいカスタムアプリケーションが多いからです。当然、管理への介入を最小限にしたいと思います。次のコマンドを使用して、アプリケーションインストールのファイルシステムレイアウトを取得します。Unionfs-fuse + chrootメソッドしかし、まだシステムファイルと混在するアプリケーションファイルを処理する必要があります。特定のディレクトリをマウントすると、/
ファイルシステムをきれいに保つのに役立ちます。
このソフトウェアのインストール方法は直感的ではないように見えるかもしれませんが、まさにこの方法で(同じ理由で)ソフトウェアをインストールする「Porteus」というディストリビューションがありますが、aufsパッチカーネルで動作することが知られています。しかし、私のシステムではカスタムカーネルは使用できません。
答え1
あなたが要求する作業は、一般的に構成されたほぼすべてのLinuxシステムで少なくとも1回行われました。ほとんどの人はいわゆるbusybox
話すことを使用します。switch_root
:
switch_root
すべてのファイルの削除とは何ですか?ルートファイルシステム (メモリー解除)次に、chroot
新しいファイルシステムを入力し、新しいファイルシステムで新しいinitプロセスを実行します。
これはシステムの初期化中に発生します。 Linux システムが起動すると、カーネルはシステムを段階的に起動します。最初に、カーネルは他のシステム(ブートローダやファームウェアなど)によってメモリ上で実行され、この時点でカーネルは自分自身を保護するために残されます。実行したばかりのシステムの実際の参照フレームはありません。
これはinitramfs
画像が通常メモリ空間に添付されていることです。(しかしカーネルに直接コンパイルすることもできます)処理できるように設計されています。 initramfsは実際のLinuxルートです(完全に含まれており、/dev
何/proc
を持っていますか)ファイルシステムイメージ - Linuxカーネルによってマウントされた最初のルートファイルシステム。これには、カーネルの起動に必要なすべてのシステム固有のモジュール/構成ファイルを含むルートファイルシステムアーカイブが含まれています。
とにかく、カーネルは次のようにアーカイブをインストールします。ルートファイルシステム (基本的に一時ファイルシステム)次に、検索に必要なすべての操作を実行します。その他/
そしてその上にインストールしてください。システムが起動するたびにこれを行います。次の不要なハッキングに頼らずにこれをやり直すことができます。同盟またはオブ- どちらも実装ごとにさまざまな複雑さと構成の詳細が発生する可能性があります。(不安定なことは言うまでもなく)。
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
問題を処理することは非常に簡単に行うことができます。ちなみに、Dマウントをレイヤリングしたい場合は、mount --move
レイヤリングシステムによって引き起こされる他の複雑さに対処する必要はありません。質問で説明したように、これを行う方が簡単です。他の場所からルートをマウントしてください。mtab
mount
デフォルトでは、一般的なinitramfs構成で発生するすべての操作を実行する必要があり、他の作業はほとんど行われません。(これを含むという意味ではありません。ダーバンまたは赤い帽子initramfs イメージ - 両方方法過度のエンジニアリング)。あなたが経験できる唯一の実際の問題は、PID1に従うことです。システムのinitがいくつかの孤立したrootfsで輻輳するように放置すると、非常に奇妙なことがシステムで非常に速く起こり始めます。この問題を処理するための確実な方法は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
busybox
もう一つのアプローチは、initramfsの'を模倣することですswitch_root
。ただし、すべての初期ルートファイルを削除する部分は省略します。systemd
initramfsで構成されたArch Linuxシステムはこれを実行できます。ここで initramfs ルートディレクトリは、switch-root を実行する前に/newroot
's' にマウントされ、/run/initramfs
システムがシャットダウン時にスリープ/サスペンドなどをきちんと処理するために置き換えられるディレクトリです。実際、これはおそらく状況に最も適したアプローチです。さまざまな個々のルートアプリケーションに対してピンポンを実行できる、コンパクトでメモリ永続的なルートシステムにすぎません。
答え2
mount を試みないで、/
自分を「新しい」(偽、読み取り専用)にしてください。
私も同様のことをしました。当時はAUFSを使用していましたが、これはoverlayfsおよび/またはUnionfs-fuseでも機能するはずです。
- フォルダの作成(例:)
~/apps/_App1_FakeRoot
/
Unionfs は ~/apps/_App1_FakeRoot (root) 読み取り専用マウントポイントに読み書きでマウントされます。~/apps/_App1
- FakeRootでルートを変更してアプリケーションを実行します。
私の特別なケースでは、(一時)書き込み用の(RAM)ディスクを含む複数のレイヤーを統合するために上記のものを使用しました。
正確な構文は、使用可能な連合FSの実装によって異なります。アプリケーションのニーズに応じて、chrootに別の/proc /sys /dev/ptsをマウントする必要があります。ハードウェアレベルのタスクを実行したい場合は、特定の種類のプログラムがそのようなchrootで実行されない可能性があります。
(特定のUnionfs実装が/を読み取り専用ベースとして使用したくない場合は、最初にアプリケーションのベースとして使用するために「ルートファイルシステム」で独自の読み取り専用バインドマウントを実行してそれをバイパスできます。)
答え3
mount --bind ~/applications/firefox /
などを含むディレクトリツリー全体を非表示にします/dev
。/proc
これにより、隠されたすべてにアクセスできなくなります。独自のディレクトリを隠すバインドマウントができないため、機能しません。
欲しいミックスあなたのディレクトリツリーとは異なるディレクトリツリーにはすでに何がありますか?これは…共同設置。 Linux には複数の統合ファイルシステムがあります。オブ非旧式コアに存在します。UnionFS ヒューズFUSEはどこにでも使用できます。 Aufsはルートディレクトリをマウントポイントとしてサポートしますが、Unionfs-fuse。あなたのユースケースでは、連合のインストールで/usr
十分です。