Линукс дахь виртуал файлын системүүд: яагаад хэрэгтэй вэ, тэд хэрхэн ажилладаг вэ? 2-р хэсэг

Сайн байцгаана уу, бид та бүхэнтэй "Линукс дахь виртуал файлын систем: яагаад хэрэгтэй вэ, тэд хэрхэн ажилладаг вэ?" нийтлэлийн хоёрдугаар хэсгийг хуваалцаж байна. Та эхний хэсгийг уншиж болно энд. Энэхүү цуврал нийтлэл нь курсын шинэ урсгалыг эхлүүлэхтэй давхцаж байгааг сануулъя "Linux администратор", энэ нь тун удахгүй эхэлнэ.

eBPF болон bcc хэрэгслийг ашиглан VFS-г хэрхэн хянах вэ

Цөм нь файлууд дээр хэрхэн ажилладагийг ойлгох хамгийн хялбар арга sysfs Үүнийг практик дээр үзэх бөгөөд ARM64 үзэх хамгийн хялбар арга бол eBPF ашиглах явдал юм. eBPF (Беркли Пакет шүүлтүүрийн товчлол) нь ажиллаж байгаа виртуал машинаас бүрдэнэ гол, ямар давуу эрхтэй хэрэглэгчид хүсэлт гаргах боломжтой (query) тушаалын мөрөөс. Цөмийн эх сурвалжууд уншигчдад цөм юу хийж чадахыг хэлдэг; eBPF хэрэгслийг ачаалагдсан систем дээр ажиллуулах нь цөм яг юу хийж байгааг харуулдаг.

Линукс дахь виртуал файлын системүүд: яагаад хэрэгтэй вэ, тэд хэрхэн ажилладаг вэ? 2-р хэсэг

Аз болоход, багаж хэрэгслийн тусламжтайгаар eBPF-г ашиглаж эхлэх нь маш хялбар юм б, тэдгээрийг ерөнхий түгээлтээс багц хэлбэрээр авах боломжтой Linux болон дэлгэрэнгүй баримтжуулсан болно Бернард Грегг. Багаж хэрэгсэл bcc Эдгээр нь C кодын жижиг оруулгатай Python скриптүүд бөгөөд энэ нь хоёр хэлийг мэддэг хэн ч үүнийг хялбархан өөрчлөх боломжтой гэсэн үг юм. IN bcc/tools 80 Python скрипт байдаг бөгөөд энэ нь хөгжүүлэгч эсвэл системийн администратор нь асуудлыг шийдвэрлэхэд тохиромжтой зүйлийг сонгох боломжтой гэсэн үг юм.
VFS ажиллаж байгаа систем дээр ямар ажил хийдэг талаар ядаж өнгөц ойлголттой болохын тулд оролдоод үзээрэй vfscount буюу vfsstat. Энэ нь олон арван дуудлага гэдгийг харуулах болно гэж хэлье vfs_open() мөн "түүний найзууд" секунд тутамд шууд утгаараа тохиолддог.

Линукс дахь виртуал файлын системүүд: яагаад хэрэгтэй вэ, тэд хэрхэн ажилладаг вэ? 2-р хэсэг

vfsstat.py нь VFS функцийн дуудлагыг тоолдог C код бүхий Python скрипт юм.

Илүү өчүүхэн жишээ өгье, бид USB флаш дискийг компьютерт оруулахад систем үүнийг илрүүлэхэд юу болохыг харцгаая.

Линукс дахь виртуал файлын системүүд: яагаад хэрэгтэй вэ, тэд хэрхэн ажилладаг вэ? 2-р хэсэг

eBPF ашиглан та юу болж байгааг харж болно /sysUSB флаш диск оруулах үед. Энгийн бөгөөд төвөгтэй жишээг энд үзүүлэв.

Дээр үзүүлсэн жишээнд, bcc арга хэрэгсэл trace.py командыг ажиллуулах үед мессеж хэвлэдэг sysfs_create_files(). Бид үүнийг харж байна sysfs_create_files() ашиглан эхлүүлсэн kworker флаш дискийг суулгасантай холбогдуулан урсгал, гэхдээ ямар файл үүсгэсэн бэ? Хоёр дахь жишээ нь eBPF-ийн хүчийг харуулж байна. Энд trace.py Цөмийн буцаалт (-K сонголт) болон үүсгэсэн файлын нэрийг хэвлэнэ sysfs_create_files(). Нэг мэдэгдэл оруулах нь LLVM-г ажиллуулдаг Python скриптээр хялбар танигдах форматын мөрийг агуулсан C код юм. яг цагтаа хөрвүүлэгч. Энэ мөрийг эмхэтгэж, цөм доторх виртуал машинд ажиллуулдаг. Бүрэн функцийн гарын үсэг sysfs_create_files () Форматын мөр нь параметрүүдийн аль нэгэнд хандах боломжтой байхын тулд хоёр дахь тушаалд хуулбарлах ёстой. Си кодын энэ хэсэг дэх алдаанууд нь C хөрвүүлэгчээс танигдах боломжтой алдаануудыг үүсгэдэг. Жишээлбэл, хэрэв -l параметрийг орхигдуулсан бол "BPF текстийг эмхэтгэж чадсангүй" гэж харах болно. C болон Python-ийг мэддэг хөгжүүлэгчид багаж хэрэгслийг олох болно bcc өргөжүүлэх, өөрчлөхөд хялбар.

USB драйвыг оруулах үед цөмийн буцаалт нь PID 7711 нь урсгал гэдгийг харуулах болно. kworkerфайлыг үүсгэсэн «events» в sysfs. Үүний дагуу дуудлага ирсэн sysfs_remove_files() Драйвыг устгаснаар файл устаж байгааг харуулах болно events, энэ нь лавлагаа тоолох ерөнхий ойлголттой нийцдэг. Үүний зэрэгцээ үзэх sysfs_create_link () USB драйвыг оруулах үед eBPF-ийг ашиглах нь дор хаяж 48 симбол холбоос үүсгэгдсэн болохыг харуулах болно.

Тэгвэл үйл явдлын файлын утга учир юу вэ? Хэрэглээ cscope Хайлтын хувьд __төхөөрөмжийн_нэмэх_диск(), юунаас болж байгааг харуулж байна disk_add_events (), аль аль нь "media_change", эсвэл "eject_request" үйл явдлын файлд бичиж болно. Энд цөмийн блокийн давхарга нь "диск" гарч ирснийг хэрэглэгчдийн орон зайд мэдээлдэг. Эдгээр судалгааны арга нь эх сурвалжаас хэрхэн ажилладагийг олж мэдэхийг оролдохтой харьцуулахад USB драйв суулгаснаар хэр мэдээлэл сайтай болохыг анхаарна уу.

Зөвхөн унших боломжтой root файлын системүүд суулгагдсан төхөөрөмжүүдийг идэвхжүүлдэг

Мэдээжийн хэрэг, хэн ч залгуураас залгуурыг сугалж сервер эсвэл компьютерээ унтраадаггүй. Гэхдээ яагаад? Учир нь физик санах ойн төхөөрөмж дээр суурилуулсан файлын системүүдийн бичих хугацаа хоцрогдсон байж болзошгүй бөгөөд тэдгээрийн төлөвийг бүртгэдэг өгөгдлийн бүтэц нь хадгалах сан руу бичихтэй синхрончлогдохгүй байж болно. Ийм зүйл тохиолдоход системийн эзэд програмыг эхлүүлэхийн тулд дараагийн ачаалах хүртэл хүлээх хэрэгтэй болно. fsck filesystem-recovery хамгийн муу тохиолдолд өгөгдөл алдагдах.

Гэсэн хэдий ч олон IoT төхөөрөмж, түүнчлэн чиглүүлэгч, термостат, машинууд одоо Линуксыг ажиллуулдаг гэдгийг бид бүгд мэднэ. Эдгээр төхөөрөмжүүдийн ихэнх нь хэрэглэгчийн интерфэйс багатай эсвэл огт байхгүй бөгөөд тэдгээрийг "цэвэрхэн" унтраах арга байхгүй. Удирдлагын нэгжийн тэжээл тасарсан үед батарей нь дуусчихсан машин асааж байна гэж төсөөлөөд үз дээ Linux байнга дээш доош үсрэх. Яаж систем удаан ачаалагдахгүй байна fsckхөдөлгүүр эцэст нь хэзээ ажиллаж эхлэх вэ? Мөн хариулт нь энгийн. Embedded төхөөрөмжүүд нь үндсэн файлын системд тулгуурладаг зөвхөн уншихад зориулагдсан (товчилсон ro-rootfs (зөвхөн уншигдах үндсэн файлын систем)).

ro-rootfs Жинхэнэ байдлаас арай бага зэрэг олон давуу талыг санал болгодог. Нэг давуу тал нь хортой програм бичих боломжгүй юм /usr буюу /lib, хэрэв ямар ч Линукс процесс тэнд бичиж чадахгүй бол. Өөр нэг зүйл бол үндсэндээ өөрчлөгддөггүй файлын систем нь алсын төхөөрөмжүүдийн талбарт дэмжлэг үзүүлэхэд чухал ач холбогдолтой, учир нь туслах ажилтнууд талбарын системтэй ижил төстэй орон нутгийн системд тулгуурладаг. Магадгүй хамгийн чухал (гэхдээ хамгийн нууцлаг) давуу тал нь ro-rootfs нь системийн дизайны үе шатанд ямар системийн объектууд өөрчлөгдөхгүй байхыг хөгжүүлэгчдэд хүчээр тулгадаг явдал юм. const хувьсагч нь ихэвчлэн програмчлалын хэл дээр байдаг тул ro-rootf-тэй ажиллах нь эвгүй бөгөөд өвдөлттэй байж болох ч тэдгээрийн ашиг тус нь нэмэлт зардлыг зөвтгөдөг.

бий болгох rootfs Зөвхөн унших боломжтой нь суулгагдсан хөгжүүлэгчдээс нэмэлт хүчин чармайлт шаарддаг бөгөөд VFS нь зураг дээр гарч ирдэг. Линукс нь файлуудыг оруулахыг шаарддаг /var бичих боломжтой байсан бөгөөд үүнээс гадна суулгагдсан системийг ажиллуулдаг олон алдартай програмууд тохиргоог үүсгэхийг оролдох болно dot-files в $HOME. Гэрийн лавлах дахь тохиргооны файлуудын нэг шийдэл нь ихэвчлэн тэдгээрийг урьдчилан үүсгэж, бүтээх явдал юм rootfs. нь /var Нэг боломжит арга бол үүнийг тусдаа бичих боломжтой хуваалт дээр холбох явдал юм / зөвхөн унших боломжтой. Өөр нэг алдартай хувилбар бол холбох эсвэл давхарласан бэхэлгээг ашиглах явдал юм.

Холбох ба овоолох бэхэлгээ, тэдгээрийг саванд ашиглах

Тушаалын гүйцэтгэл man mount Энэ нь хөгжүүлэгчид болон системийн администраторуудад файлын системийг нэг замаар үүсгэж, дараа нь өөр замд ашиглах боломжийг олгодог холбох боломжтой, давхарлаж болох холболтын талаар суралцах хамгийн сайн арга юм. Embedded системүүдийн хувьд энэ нь файлуудыг хадгалах чадвартай гэсэн үг юм /var зөвхөн уншигдах флаш диск дээр, гэхдээ давхардсан эсвэл холбох боломжтой холбох зам tmpfs в /var ачаалах үед энэ нь програмуудыг тэнд тэмдэглэл бичих боломжийг олгоно (скравл). Дараагийн удаа та өөрчлөлтийг асаахад /var алдагдах болно. Давхардсан бэхэлгээ нь хоорондоо нэгдэл үүсгэдэг tmpfs болон үндсэн файлын системтэй бөгөөд одоо байгаа файлуудад харагдахуйц өөрчлөлт хийх боломжийг танд олгоно ro-tootf харин холбох боломжтой бэхэлгээ нь шинийг хоосон болгож чадна tmpfs хавтаснууд бичигдэх боломжтой ro-rootfs арга замууд. байхад overlayfs энэ бол зөв (proper) файлын системийн төрөл, холбох боломжтой холболтыг хэрэгжүүлсэн VFS нэрийн орон зай.

Давхарга ба холбох боломжтой холболтын тайлбар дээр үндэслэн хэн ч гайхахгүй Линукс контейнерууд тэдгээрийг идэвхтэй ашиглаж байна. Ашиглах үед юу болохыг харцгаая systemd-npawn хэрэгслийг ашиглан савыг ажиллуулах mountsnoop нь bcc.

Сорилт system-nspawn ажиллаж байх үед савыг эхлүүлнэ mountsnoop.py.

Юу болсныг харцгаая:

Ажиллуулах mountsnoop Контейнер "ачаагдаж" байх үед уг савны ажиллах хугацаа нь холбосон холболтоос ихээхэн хамааралтай болохыг харуулж байна (Зөвхөн урт гаралтын эхлэлийг харуулсан).

энд systemd-nspawn доторх сонгосон файлуудыг өгдөг procfs и sysfs хост руу контейнер руу хүрэх зам болгон rootfs…. Түүнээс гадна MS_BIND холбох холболтыг тохируулдаг туг, холболт дээрх бусад зарим туг нь хост болон контейнерийн нэрийн орон зайн өөрчлөлтүүдийн хоорондын хамаарлыг тодорхойлдог. Жишээлбэл, холбосон холболт нь өөрчлөлтийг алгасаж болно /proc и /sys чингэлэгт оруулах, эсвэл дуудлагаас хамааран нуух.

дүгнэлт

Цөм нь өөрөө асар их хэмжээний код агуулдаг тул Линуксийн хэрэглэгчийн орон зайн хэрэглээний программууд болон системийн дуудлагын интерфэйсийг С номын санд үлдээдэг тул Линуксийн дотоод үйл ажиллагааг ойлгох нь боломжгүй ажил мэт санагдаж магадгүй юм. glibc. Ахиц дэвшил гаргах нэг арга бол нэг цөмийн дэд системийн эх кодыг унших бөгөөд системийн дуудлагууд болон хэрэглэгчийн орон зайн толгой хэсгийг ойлгох, түүнчлэн хүснэгт гэх мэт үндсэн дотоод цөмийн интерфэйсүүдийг ойлгоход анхаарах явдал юм. file_operations. Файлын үйлдлүүд нь "бүх зүйл бол файл" гэсэн зарчмыг баримталж, тэдгээрийг удирдахад онцгой таатай болгодог. Дээд түвшний лавлах дахь C цөмийн эх файлууд fs/ алдартай файлын системүүд болон хадгалах төхөөрөмжүүдийн хооронд өргөн бөгөөд харьцангуй энгийн нийцтэй байдлыг хангадаг боодол давхарга болох виртуал файлын системийн хэрэгжилтийг танилцуулж байна. Линукс нэрийн талбараар дамжуулан холбох, давхарлах нь зөвхөн уншигдах зориулалттай контейнер болон root файлын системийг бий болгох боломжийг олгодог VFS-ийн ид шид юм. Эх код, eBPF үндсэн хэрэгсэл болон түүний интерфейсийг шалгахтай хослуулсан bcc
үндсэн хайгуулыг урьд өмнөхөөсөө илүү хялбар болгож байна.

Найзууд аа, бичээрэй, энэ нийтлэл танд хэрэгтэй байсан уу? Магадгүй танд ямар нэгэн сэтгэгдэл, санал байна уу? Мөн Линукс администраторын сургалтыг сонирхож буй хүмүүсийг урьж байна Нээлттэй өдөр, 18-р сарын XNUMX-нд болно.

Эхний хэсэг.

Эх сурвалж: www.habr.com

сэтгэгдэл нэмэх