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 ) المدة التي يتم فيها تشغيل الحاوية وليس المدة التي يتم تشغيلها.
قبل تنفيذ مساحات أسماء CGROUP بواسطة Serge Hallyn LXCFS وفرت أيضًا شجرة cgroupfs المدركة للحاوية. استغرق الأمر أن تكون الحاوية تمكنت فقط من الوصول إلى مجموعات Cgroups أسفل مجموعاتها الخاصة ، وبالتالي توفر سلامة إضافية. بالنسبة للأنظمة التي لا تدعم مساحات أسماء CGROUP ، ستظل LXCFS توفر هذه الميزة ولكنها تعتبر في الغالب مستاءة.
LXCFS دون إعادة التشغيل يتم تقسيم LXCFS إلى مكتبة مشتركة (وحدة LIBTOOL ، لدقة) liblxcfs و lxcfs ثنائية بسيطة. عند الترقية إلى إصدار أحدث من LXCFS ، لن يتم إعادة تشغيل lxcfs الثنائية. بدلاً من ذلك ، سوف يكتشف أن إصدارًا جديدًا من المكتبة المشتركة متاح وسيقوم بإعادة تحميله باستخدام dlclose(3) و dlopen(3) . تم اختيار هذا التصميم بحيث لن تحتاج إلى إعادة تشغيل الحلقة الرئيسية Fuse التي تستخدمها LXCFS . إذا كانت جميع الحاويات التي تستخدم LXCFS تحتاج إلى إعادة تشغيلها نظرًا لأنها ستترك مع تركيبات الصمامات المكسورة.
لإجبار إعادة تحميل المكتبة المشتركة في الحالة الممكنة التالية ببساطة إرسال SIGUSR1 إلى PID لعملية LXCFS قيد التشغيل. يمكن أن يكون هذا بسيطًا مثل فعله:
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 (انظر قسم تفريغ المكتبات.). لذلك يُنصح مستخدمي LXCFS على musl بإعادة تشغيل LXCFS تمامًا وجميع الحاويات التي تستخدمها.
من أجل إنشاء LXCFS تثبيت FUSE ورؤوس تطوير FUSE وفقًا لتوزيعك. تفضل 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 ربط ملفات التبييض في الأماكن الصحيحة في بدء تشغيل الحاوية.
من أجل استخدام LXCFS مع الحاويات المستندة إلى النظام ، يمكنك إما استخدام LXC 1.1 في هذه الحالة يجب أن تعمل تلقائيًا ، أو غير ذلك ، نسخ ملفات lxc.mount.hook و lxc.reboot.hook (مرة واحدة مصممة) من هذه الشجرة إلى /usr/share/lxcfs ، تأكد من أن تكون قابلة للتنفيذ ، ثم إضافة الخطوط التالية إلى تكوين adquyer الخاص بك:
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" لتعيين جميع القيم في "Meminfo" التي تشير إلى المبادلة إلى 0.
sudo lxcfs -u/var/lib/lxcfs
إذا لاحظت أن LXCFS لا تعرض أي مبادلة في الحاوية الخاصة بك على الرغم من وجود مبادلة على نظامك ، فيرجى قراءة هذا القسم بعناية والبحث عن تعليمات حول كيفية تمكين المحاسبة لتوزيعك.
يعد Swap Cgroup Talling على Linux مربكًا للغاية ولا توجد طريقة مثالية لـ LXCFS للتعامل معها.
المصطلحات المستخدمة أدناه:
memory.usage_in_bytes و memory.limit_in_bytesmemory.memsw.usage_in_bytes و memory.memsw.limit_in_bytesالقضايا الرئيسية هي:
غالبًا ما تكون محاسبة المبادلة ، وتتطلب خيارًا خاصًا لوقت التمهيد kernel ( swapaccount=1 ) و/أو خيارات بناء kernel الخاصة ( CONFIG_MEMCG_SWAP ).
يمكن تعيين كلاً من حد ذاكرة الوصول العشوائي وذاكرة RAM+SWAP. ومع ذلك ، فإن دلتا ليست مساحة المبادلة المتاحة حيث لا تزال kernel مجانية في تبديل أكبر عدد ممكن من ذاكرة الوصول العشوائي. هذا يجعل من المستحيل عرض حجم جهاز المبادلة حيث أن استخدام الدلتا بين RAM و RAM+SWAP لذلك لن يفسر تبديل kernel المزيد من الصفحات ، مما يؤدي إلى استخدام المبادلة التي يتجاوز إجمالي المبادلة.
من المستحيل تعطيل المبادلة في حاوية معينة. الأقرب الذي يمكن القيام به هو ضبط swappiness إلى 0 مما يحد بشدة من خطر تبديل الصفحات ولكنه لا يلغيها.
نتيجة لذلك ، كان على LXCFS تقديم بعض التسوية التي تتبع على النحو التالي:
عندما لا يتم تمكين محاسبة المبادلة ، لا يتم الإبلاغ عن أي مساحة مبادلة على الإطلاق. هذا ببساطة لأنه لا توجد طريقة لمعرفة استهلاك المبادلة. قد تستخدم الحاوية إلى حد كبير بعض المبادلة ، فلا توجد طريقة لمعرفة مقدارها وإظهار جهاز التبادل الذي سيتطلب نوعًا من استخدام المبادلة. إن إظهار قيمة المضيف سيكون خاطئًا تمامًا ، مما يدل على أن القيمة 0 ستكون خاطئة.
نظرًا لأن استخدام المبادلة لحاوية معينة يمكن أن يتجاوز الدلتا بين RAM و RAM+SWAP ، يتم الإبلاغ عن حجم المبادلة دائمًا ليكون أصغر من حد تبديل RAM+أو جهاز تبادل المضيف نفسه. هذا يضمن أنه لن يُسمح لاستخدام المبادلة في أي وقت مضى بتجاوز حجم المبادلة.
إذا تم ضبط Swappiness على 0 ولم يكن هناك استخدام مبادلة ، فلا يتم الإبلاغ عن أي مبادلة. ومع ذلك ، إذا كان هناك استخدام مبادلة ، فسيتم الإبلاغ عن جهاز تبادل بحجم الاستخدام (كامل 100 ٪). يوفر هذا الإبلاغ الكافي لاستهلاك الذاكرة مع منع التطبيقات من افتراض المزيد من المبادلة.
في حالة تعطل LXCFS ، قد يكون من المفيد للغاية بالنسبة لنا أن يكون لدينا تفريغ أساسي لذاكرة عملية LXCFS.
/var/crash و coredumpctl list فقط في حالة وجود ملف تفريغ Core Core بالفعلعلى الجهاز حيث تقوم بتشغيل LXCFS ، تنفذ كجذر:
# 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