Linuxの階層型または仮想ファイルシステム

Linuxの階層型または仮想ファイルシステム

私は基本的に次のことをしたいと思います。というユーティリティを想像してみましょうlayer

# sudo layer somefile apt install gcc

layeraptは一種のコンテナから始まります。 Aptは実際のファイルシステムにgccがインストールされていると思いますが、実際にはファイルシステム全体に引き続きアクセスできますsomefileaptだからドッカーとは異なります。

これにより、次のことができます。

# sudo layer somefile bash
bash# gcc -c foo.c

bash実際にはシステムにインストールされていませんが、一種のgccコンテナ/刑務所ですが、ファイルシステムの残りの部分にアクセスできます。私の目的は、ファイルシステムを汚染することなく仮想開発環境を作成することです。aptgccsomefile

これを行う方法はありますか?

答え1

一部のカスタムスクリプトが気に入らない場合は、次のものを使用できます。ファイルシステムの上書き(2014年からLinuxカーネルに含まれる)

OverlayFSは、2つのファイルシステムの場所を互いに重ね合わせて表示します。lowerつまり、マウントポイントの任意の項目によって変更または非表示にされていない限り、マウントポイントの表示のすべての内容が上書きされますupper。上書きするマウントポイントに対するすべての変更は記録されませupperlower
また、OverlayFSにはwork明示的に文書化されていませんが、修正がありますupper

これにより、探しているコンテナの種類を作成できます(下記の可能な極端な場合を参照)。

mkdir -p /var/tmp/myoverlay/{upper,work,mount}
mount -t overlay -o lowerdir=/,upperdir=/var/tmp/myoverlay/upper,workdir=/var/tmp/myoverlay/work overlayfs /var/tmp/myoverlay/mount

コンテナを侵入するにはchroot(「change root」)コマンドを使用して、新しく作成されたコンテナからコマンド(シェルまたはその他)を実行できます/var/tmp/myoverlay/mount

chroot /var/tmp/myoverlay/mount
# or
chroot /var/tmp/myoverlay/mount /usr/bin/apt moo # paths are relative to the new root directory

ハードウェアデバイス、擬似端末、プロセス、またはシステム機能にアクセスしようとするプログラムの場合、これは十分ではない可能性があります。これらの機能は、カーネルで特別にインストール可能なファイルシステムとして提供されます。以下の出力を参照してくださいmount

proc on /proc type proc
sysfs on /sys type sysfs
udev on /dev type devtmpfs
devpts on /dev/pts type devpts

マウントポイントを上書きするためにインストールできます(入力する前に)。

mount -t proc proc /var/tmp/myoverlay/mount/proc
mount -t sysfs sys /var/tmp/myoverlay/mount/sys
mount -t devtmpfs dev /var/tmp/myoverlay/mount/dev
mount -t devpts devpts /var/tmp/myoverlay/mount/dev/pts

これにより、コンテナが必要なものよりもシステムにさらにアクセスを許可できます。最終的に、オーバーレイファイルシステムが特定のユースケースに対して通常のシステムと十分に分離されていることを確認するには、正しいユースケースを知る必要があります。


ファイルシステムのレイアウトによっては、さらに困難がある可能性があります。ディレクトリは、lowerその下にマウントされた他のファイルシステムを考慮していないまま使用されます。たとえば、/home別のファイルシステムがある場合、OverlayFSはにある空のマウントポイントのみを表示します/home

そのような場合は、マウントポイントごとに別々のオーバーレイを作成し、別のオーバーレイをルートオーバーレイにインストールする必要があります。
この時点では、適切な仮想化がより賢明な選択であることがよくあります。

答え2

overlayファイルシステムを使用できます。

modprobe overlay
mkdir -p /path/data /path/work /path/mount
mount -t overlay overlay -o lowerdir=/,upperdir=/path/data,workdir=/path/work /path/mount

これで、ルートディレクトリのすべてのエントリにchrootアクセスし/path/mountて表示できますが、変更は記録されます。後で同じオプションを使用して削除して再インストール/path/dataできます。/path/mount

関連情報