LXCFSは、Linuxコンテナを仮想マシンのように感じることを目的として書かれた小さなヒューズファイルシステムです。 LXCのサイドプロジェクトとして始まりましたが、実行時には使用できます。
LXCFSは、次のようなprocfsで重要なファイルによって提供される情報が次のように注意してください。
/proc/cpuinfo
/proc/diskstats
/proc/meminfo
/proc/stat
/proc/swaps
/proc/uptime
/proc/slabinfo
/sys/devices/system/cpu/online
表示される値( /proc/uptimeなど)が実際にコンテナの稼働時間を実際に反映しており、ホストの稼働時間ではなく、コンテナが認識しています。
Serge Hallyn LXCFSによるCGROUPネームスペースの実装前に、コンテナ認識cgroupfsツリーも提供しました。コンテナが独自のcgroupsの下にあるcgroupにのみアクセスでき、したがって追加の安全性が提供されることに注意しました。 CGROUP NameSpacesのサポートのないシステムの場合、 LXCFS引き続きこの機能を提供しますが、ほとんどが非推奨と見なされます。
LXCFSをアップグレードしますLXCFSは、共有ライブラリ(Libtoolモジュール、正確には) liblxcfsおよび単純なバイナリlxcfsに分割されます。 LXCFSの新しいバージョンにアップグレードすると、 lxcfsバイナリは再起動されません。代わりに、共有ライブラリの新しいバージョンが利用可能であることを検出し、 dlclose(3)とdlopen(3)を使用してリロードします。この設計は、 LXCFSが使用するヒューズメインループを再起動する必要がないように選択されました。 LXCFSを使用しているすべてのコンテナが、それ以外の場合は壊れたヒューズマウントが残っているため、再起動する必要があります。
次の可能なインスタンスで共有ライブラリのリロードを強制するには、実行中のLXCFSプロセスのPIDにSIGUSR1送信します。これは、するのと同じくらい簡単です。
rm /usr/lib64/lxcfs/liblxcfs.so # MUST to delete the old library file first
cp liblxcfs.so /usr/lib64/lxcfs/liblxcfs.so # to place new library file
kill -s USR1 $(pidof lxcfs) # reload
共有ライブラリリロードを介してスムーズなアップグレードを実現するために、 LXCFS dlclose(3)共有ライブラリデストラクタへの最後の参照をドロップすると、 dlopen(3)が実行されると呼ばれるという事実にも依存しています。これはglibcには当てはまりますが、 muslには当てはまりません(ライブラリをアンロードするセクションを参照してください。)。したがって、 muslのLXCFSのユーザーは、 LXCFS完全に再起動し、それを利用してすべてのコンテナを再起動することをお勧めします。
LXCFSを構築するために、ディストリビューションに応じてヒューズとヒューズ開発ヘッダーをインストールします。 LXCFSはfuse3を好みますが、新しいfuse2バージョンで動作します。
git clone git://github.com/lxc/lxcfs
cd lxcfs
meson setup -Dinit-script=systemd --prefix=/usr build/
meson compile -C build/
sudo meson install -C build/
サニタイザーを使用して構築するには-Db_sanitize=... meson setupのオプションを指定する必要があります。たとえば、アサンとウブサンを有効にするには:
meson setup -Dinit-script=systemd --prefix=/usr build/ -Db_sanitize=address,undefined
meson compile -C build/
LXCFSを実行するための推奨コマンドは次のとおりです。
sudo mkdir -p /var/lib/lxcfs
sudo lxcfs /var/lib/lxcfs
LXCFSを使用するコンテナランタイムは、ApproRiateファイルをコンテナ起動の正しい場所にマウントする必要があります。
SystemDベースのコンテナでLXCFSを使用するために、LXC 1.1を使用するか、その場合はlxc.mount.hookファイル(1回構築された)( /usr/share/lxcfs lxc.reboot.hookをコピーすることができます。
lxc.mount.auto = cgroup:mixed
lxc.autodev = 1
lxc.kmsg = 0
lxc.include = /usr/share/lxc/config/common.conf.d/00-lxcfs.conf
docker run -it -m 256m --memory-swap 256m
-v /var/lib/lxcfs/proc/cpuinfo:/proc/cpuinfo:rw
-v /var/lib/lxcfs/proc/diskstats:/proc/diskstats:rw
-v /var/lib/lxcfs/proc/meminfo:/proc/meminfo:rw
-v /var/lib/lxcfs/proc/stat:/proc/stat:rw
-v /var/lib/lxcfs/proc/swaps:/proc/swaps:rw
-v /var/lib/lxcfs/proc/uptime:/proc/uptime:rw
-v /var/lib/lxcfs/proc/slabinfo:/proc/slabinfo:rw
-v /var/lib/lxcfs/sys/devices/system/cpu:/sys/devices/system/cpu:rw
ubuntu:18.04 /bin/bash
スワップを有効にしたシステムでは、パラメーター「-u」を使用して、スワップを0と呼ぶ「meminfo」にすべての値を設定できます。
sudo lxcfs -u/var/lib/lxcfs
システムをスワップしているにもかかわらず、LXCFSがコンテナにスワップを表示していないことに気付いた場合は、このセクションを注意深く読んで、配布のアカウンティングを有効にする方法についての指示を探してください。
LinuxでのCgroupの取り扱いを交換するのは非常に混乱しており、LXCFがそれを処理するのに最適な方法はありません。
以下で使用する用語:
memory.usage_in_bytesとmemory.limit_in_bytesを指しますmemory.memsw.usage_in_bytesとmemory.memsw.limit_in_bytesを指します主な問題は次のとおりです。
スワップアカウンティングは多くの場合オプトインであり、特別なカーネルブートタイムオプション( swapaccount=1 )および/または特別なカーネルビルドオプション( CONFIG_MEMCG_SWAP )が必要です。
RAM制限とRAM+スワップ制限の両方を設定できます。しかし、カーネルはまだ自由に交換できるので、デルタは利用可能なスワップスペースではありません。これにより、RAMとRAM+スワップの間にDeltaを使用してスワップデバイスのサイズをレンダリングすることは不可能になり、そのためにカーネルスワップを考慮しないため、スワップの合計を超えるスワップの使用が通過します。
特定のコンテナでスワップを無効にすることは不可能です。できることが最も近いのは、スワッピネスを0に設定することです。これは、ページを交換するリスクを厳しく制限しますが、それを排除しません。
その結果、LXCFSは次のように妥協する必要がありました。
スワップアカウンティングが有効になっていない場合、スワップスペースはまったく報告されません。これは、単にスワップ消費を知る方法がないからです。コンテナはいくつかのスワップを使用している可能性がありますが、どれだけの量を知る方法はありません。また、スワップデバイスを表示するには、何らかのスワップ使用量を報告する必要があります。ホスト値を表示することは完全に間違っています。0値が0を示すことは、等間の間違っています。
特定のコンテナのスワップ使用量は、RAMとRAM+スワップの間のデルタを超える可能性があるため、スワップサイズは常にRAM+スワップ制限の小さいか、ホストスワップデバイス自体が小さいと報告されます。これにより、ポイントでスワップの使用がスワップサイズを超えることができなくなります。
スワッピネスが0に設定されていて、スワップの使用がない場合、スワップは報告されません。ただし、スワップ使用量がある場合は、使用法のサイズ(100%満杯)のスワップデバイスが報告されます。これにより、メモリ消費の適切なレポートが提供され、アプリケーションがより多くのスワップが利用可能であると仮定しないようにします。
LXCFSクラッシュの場合、LXCFSプロセスメモリのコアダンプを使用することは非常に便利です。
/var/crashとcoredumpctl list確認してくださいLXCFSを実行するマシンで、rootとして実行します。
# save an old core_pattern setting value:
cat /proc/sys/kernel/core_pattern > /root/core_pattern.old_value.bak
# set a new one to collect all core dumps:
echo '|/bin/sh -c $@ -- eval exec gzip --fast > /var/crash/core-%e.%p.gz' > /proc/sys/kernel/core_pattern
# wait for the next LXCFS crash and check
ls -lah /var/crash
# there should be a file with a name like "core-lxcfs.80581.gz". Please, upload it somewhere and share with us.
# restore the old "core_pattern" value:
cat /root/core_pattern.old_value.bak > /proc/sys/kernel/core_pattern