Сайн байцгаана уу, бид та бүхэнтэй "Линукс дахь виртуал файлын систем: яагаад хэрэгтэй вэ, тэд хэрхэн ажилладаг вэ?" нийтлэлийн хоёрдугаар хэсгийг хуваалцаж байна. Та эхний хэсгийг уншиж болно
eBPF болон bcc хэрэгслийг ашиглан VFS-г хэрхэн хянах вэ
Цөм нь файлууд дээр хэрхэн ажилладагийг ойлгох хамгийн хялбар арга sysfs
Үүнийг практик дээр үзэх бөгөөд ARM64 үзэх хамгийн хялбар арга бол eBPF ашиглах явдал юм. eBPF (Беркли Пакет шүүлтүүрийн товчлол) нь ажиллаж байгаа виртуал машинаас бүрдэнэ query
) тушаалын мөрөөс. Цөмийн эх сурвалжууд уншигчдад цөм юу хийж чадахыг хэлдэг; eBPF хэрэгслийг ачаалагдсан систем дээр ажиллуулах нь цөм яг юу хийж байгааг харуулдаг.
Аз болоход, багаж хэрэгслийн тусламжтайгаар eBPF-г ашиглаж эхлэх нь маш хялбар юм bcc
Эдгээр нь C кодын жижиг оруулгатай Python скриптүүд бөгөөд энэ нь хоёр хэлийг мэддэг хэн ч үүнийг хялбархан өөрчлөх боломжтой гэсэн үг юм. IN bcc/tools
80 Python скрипт байдаг бөгөөд энэ нь хөгжүүлэгч эсвэл системийн администратор нь асуудлыг шийдвэрлэхэд тохиромжтой зүйлийг сонгох боломжтой гэсэн үг юм.
VFS ажиллаж байгаа систем дээр ямар ажил хийдэг талаар ядаж өнгөц ойлголттой болохын тулд оролдоод үзээрэй vfscount
буюу vfsstat
. Энэ нь олон арван дуудлага гэдгийг харуулах болно гэж хэлье vfs_open()
мөн "түүний найзууд" секунд тутамд шууд утгаараа тохиолддог.
vfsstat.py
нь VFS функцийн дуудлагыг тоолдог C код бүхий Python скрипт юм.
Илүү өчүүхэн жишээ өгье, бид USB флаш дискийг компьютерт оруулахад систем үүнийг илрүүлэхэд юу болохыг харцгаая.
eBPF ашиглан та юу болж байгааг харж болно
/sys
USB флаш диск оруулах үед. Энгийн бөгөөд төвөгтэй жишээг энд үзүүлэв.
Дээр үзүүлсэн жишээнд, bcc
арга хэрэгсэл 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 симбол холбоос үүсгэгдсэн болохыг харуулах болно.
Тэгвэл үйл явдлын файлын утга учир юу вэ? Хэрэглээ disk_add_events ()
, аль аль нь "media_change"
, эсвэл "eject_request"
үйл явдлын файлд бичиж болно. Энд цөмийн блокийн давхарга нь "диск" гарч ирснийг хэрэглэгчдийн орон зайд мэдээлдэг. Эдгээр судалгааны арга нь эх сурвалжаас хэрхэн ажилладагийг олж мэдэхийг оролдохтой харьцуулахад USB драйв суулгаснаар хэр мэдээлэл сайтай болохыг анхаарна уу.
Зөвхөн унших боломжтой root файлын системүүд суулгагдсан төхөөрөмжүүдийг идэвхжүүлдэг
Мэдээжийн хэрэг, хэн ч залгуураас залгуурыг сугалж сервер эсвэл компьютерээ унтраадаггүй. Гэхдээ яагаад? Учир нь физик санах ойн төхөөрөмж дээр суурилуулсан файлын системүүдийн бичих хугацаа хоцрогдсон байж болзошгүй бөгөөд тэдгээрийн төлөвийг бүртгэдэг өгөгдлийн бүтэц нь хадгалах сан руу бичихтэй синхрончлогдохгүй байж болно. Ийм зүйл тохиолдоход системийн эзэд програмыг эхлүүлэхийн тулд дараагийн ачаалах хүртэл хүлээх хэрэгтэй болно. fsck filesystem-recovery
хамгийн муу тохиолдолд өгөгдөл алдагдах.
Гэсэн хэдий ч олон IoT төхөөрөмж, түүнчлэн чиглүүлэгч, термостат, машинууд одоо Линуксыг ажиллуулдаг гэдгийг бид бүгд мэднэ. Эдгээр төхөөрөмжүүдийн ихэнх нь хэрэглэгчийн интерфэйс багатай эсвэл огт байхгүй бөгөөд тэдгээрийг "цэвэрхэн" унтраах арга байхгүй. Удирдлагын нэгжийн тэжээл тасарсан үед батарей нь дуусчихсан машин асааж байна гэж төсөөлөөд үз дээ 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
) файлын системийн төрөл, холбох боломжтой холболтыг хэрэгжүүлсэн
Давхарга ба холбох боломжтой холболтын тайлбар дээр үндэслэн хэн ч гайхахгүй 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
үндсэн хайгуулыг урьд өмнөхөөсөө илүү хялбар болгож байна.
Найзууд аа, бичээрэй, энэ нийтлэл танд хэрэгтэй байсан уу? Магадгүй танд ямар нэгэн сэтгэгдэл, санал байна уу? Мөн Линукс администраторын сургалтыг сонирхож буй хүмүүсийг урьж байна
Эх сурвалж: www.habr.com