Hər kəsə salam, biz sizinlə “Linux-da virtual fayl sistemləri: onlar nə üçün lazımdır və necə işləyirlər?” nəşrinin ikinci hissəsini sizinlə paylaşırıq. Birinci hissəni oxuya bilərsiniz
eBPF və bcc alətlərindən istifadə edərək VFS-yə necə nəzarət etmək olar
Kernelin fayllar üzərində necə işlədiyini başa düşməyin ən asan yolu sysfs
bunu praktikada görməkdir və ARM64-ə baxmaq üçün ən asan yol eBPF-dən istifadə etməkdir. eBPF (Berkeley Paket Filtrinin qısaltması) virtual maşından ibarətdir query
) komanda xəttindən. Kernel mənbələri oxucuya nüvənin nə edə biləcəyini söyləyir; eBPF alətlərinin yüklənmiş sistemdə işlədilməsi nüvənin əslində nə etdiyini göstərir.
Xoşbəxtlikdən, eBPF-dən istifadə etməyə başlamaq alətlərin köməyi ilə olduqca asandır bcc
C kodunun kiçik əlavələri olan Python skriptləridir, yəni hər iki dillə tanış olan hər kəs onları asanlıqla dəyişdirə bilər. IN bcc/tools
80 Python skripti var, bu o deməkdir ki, çox güman ki, bir tərtibatçı və ya sistem administratoru problemin həlli üçün uyğun olanı seçə biləcək.
VFS-lərin işləyən sistemdə hansı işi gördüyü barədə ən azı səthi fikir əldə etmək üçün cəhd edin vfscount
və ya vfsstat
. Bu, tutaq ki, onlarla çağırış göstərəcək vfs_open()
və "onun dostları" hər saniyə baş verir.
vfsstat.py
sadəcə VFS funksiya zənglərini sayan C kodu əlavələri olan Python skriptidir.
Gəlin daha mənasız bir misal verək və görək USB flash sürücüsünü kompüterə daxil etdikdə və sistem onu aşkar etdikdə nə baş verir.
eBPF-dən istifadə edərək nə baş verdiyini görə bilərsiniz
/sys
USB flash sürücü daxil edildikdə. Burada sadə və mürəkkəb bir nümunə göstərilir.
Yuxarıda göstərilən nümunədə, bcc
alət sysfs_create_files()
. Biz bunu görürük sysfs_create_files()
istifadə edərək istifadəyə verilmişdir kworker
flash sürücünün daxil olmasına cavab olaraq axın, lakin hansı fayl yaradıldı? İkinci nümunə eBPF gücünü göstərir. Burada trace.py
Kernel backtrace (-K seçimi) və yaradılmış faylın adını çap edir sysfs_create_files()
. Tək bəyanatın daxil edilməsi LLVM ilə işləyən Python skripti tərəfindən təmin edilən asanlıqla tanınan format sətrini ehtiva edən C kodudur. tam vaxtında tərtibçi. Bu xətti tərtib edir və nüvənin içərisindəki virtual maşında icra edir. Tam funksiya imzası sysfs_create_files ()
ikinci komandada təkrarlanmalıdır ki, format sətri parametrlərdən birinə istinad edə bilsin. Bu C kodundakı səhvlər C tərtibçisindən tanınan səhvlərlə nəticələnir. Məsələn, -l parametri buraxılıbsa, siz "BPF mətnini tərtib etmək uğursuz oldu"nu görəcəksiniz. C və Python ilə tanış olan tərtibatçılar alətləri tapacaqlar bcc
genişləndirmək və dəyişmək asandır.
USB sürücüsü daxil edildikdə, nüvənin geri izi PID 7711-in bir ip olduğunu göstərəcək. kworker
faylı yaradan «events»
в sysfs
. Buna uyğun olaraq, zəng sysfs_remove_files()
sürücünün çıxarılmasının faylın silinməsi ilə nəticələndiyini göstərəcək events
, istinadların sayılmasının ümumi konsepsiyasına uyğundur. Eyni zamanda baxış sysfs_create_link ()
eBPF ilə USB sürücüsünü daxil edərkən ən azı 48 simvolik əlaqə yaradıldığını göstərəcək.
Beləliklə, hadisələr faylının mənası nədir? İstifadəsi disk_add_events ()
, və ya "media_change"
Və ya "eject_request"
hadisə faylına yazıla bilər. Burada kernel blok təbəqəsi istifadəçi sahəsinə "disk"in göründüyü və çıxarıldığı barədə məlumat verir. İşlərin sırf mənbədən necə işlədiyini anlamaqla müqayisədə bu tədqiqat metodunun USB sürücüsünü daxil etməklə nə qədər informativ olduğuna diqqət yetirin.
Yalnız oxunan kök fayl sistemləri quraşdırılmış cihazları işə salır
Təbii ki, heç kim rozetkadan fişini çəkərək serveri və ya kompüterini söndürmür. Bəs niyə? Bunun səbəbi, fiziki saxlama cihazlarında quraşdırılmış fayl sistemlərində gecikmiş yazmalar ola bilər və onların vəziyyətini qeyd edən məlumat strukturları yaddaşa yazma ilə sinxronlaşdırılmaya bilər. Bu baş verdikdə, sistem sahibləri yardım proqramını işə salmaq üçün növbəti yükləməyə qədər gözləməli olurlar. fsck filesystem-recovery
və ən pis halda məlumatların itirilməsi.
Bununla belə, hamımız bilirik ki, bir çox IoT cihazları, o cümlədən marşrutlaşdırıcılar, termostatlar və avtomobillər indi Linux ilə işləyir. Bu cihazların bir çoxunun istifadəçi interfeysi azdır və ya heç yoxdur və onları "təmiz" şəkildə söndürmək mümkün deyil. Təsəvvür edin ki, idarəetmə blokuna enerji verildikdə, batareyası bitmiş avtomobili işə salırsınız fsck
mühərrik nəhayət nə vaxt işə başlayır? Və cavab sadədir. Quraşdırılmış qurğular kök fayl sisteminə əsaslanır ro-rootfs
(yalnız oxumaq üçün kök fayl sistemi)).
ro-rootfs
orijinallıqdan daha az aşkar olan bir çox üstünlüklər təklif edir. Üstünlüklərdən biri zərərli proqramın yaza bilməməsidir /usr
və ya /lib
, heç bir Linux prosesi ora yaza bilmirsə. Başqa bir cəhət ondan ibarətdir ki, böyük ölçüdə dəyişməz fayl sistemi uzaq cihazların sahə dəstəyi üçün vacibdir, çünki dəstək işçiləri sahə sistemləri ilə nominal olaraq eyni olan yerli sistemlərə etibar edirlər. Bəlkə də ən vacib (lakin həm də ən məkrli) fayda ondan ibarətdir ki, ro-rootfs tərtibatçıları sistemin dizayn mərhələsində hansı sistem obyektlərinin dəyişməz olacağına qərar verməyə məcbur edir. Ro-rootflarla işləmək yöndəmsiz və ağrılı ola bilər, çünki const dəyişənləri çox vaxt proqramlaşdırma dillərində olur, lakin onların faydaları əlavə yükü asanlıqla əsaslandırır.
yaradıcılıq rootfs
Yalnız oxumaq üçün daxili tərtibatçılar üçün bəzi əlavə səylər tələb olunur və VFS mənzərəyə məhz burada daxil olur. Linux faylların daxil olmasını tələb edir /var
yazıla bilən idi və əlavə olaraq, quraşdırılmış sistemləri işlədən bir çox məşhur proqramlar konfiqurasiya yaratmağa çalışacaq dot-files
в $HOME
. Ev kataloqunda konfiqurasiya faylları üçün bir həll adətən onları əvvəlcədən yaratmaq və qurmaqdır rootfs
. Qədər /var
Mümkün bir yanaşma onu ayrıca yazıla bilən bölməyə quraşdırmaqdır /
quraşdırılmış yalnız oxumaq üçün. Başqa bir məşhur alternativ bağlama və ya üst-üstə düşmə montajlarından istifadə etməkdir.
Bağlana bilən və yığıla bilən qurğular, onların konteynerlərdə istifadəsi
Bir əmrin icrası man mount
tərtibatçılara və sistem administratorlarına bir yolda fayl sistemi yaratmaq və sonra onu başqa bir yolda tətbiqlərə təqdim etmək imkanı verən bağlana bilən və üst-üstə düşə bilən qurğular haqqında məlumat əldə etməyin ən yaxşı yoludur. Daxili sistemlər üçün bu, faylları saxlamaq imkanı deməkdir /var
yalnız oxunan bir flash sürücüdə, lakin üst-üstə düşmə və ya birləşdirilə bilən montaj yolu tmpfs
в /var
yükləyərkən, proqramlara orada qeydlər yazmağa imkan verəcəkdir (scrawl). Dəyişiklikləri növbəti dəfə yandırdığınız zaman /var
itiriləcək. Bindirmə montajı arasında birlik yaradır tmpfs
və əsas fayl sistemi və mövcud fayllarda görünən dəyişikliklər etməyə imkan verir ro-tootf
halbuki bağlana bilən montaj yenilərini boş edə bilər tmpfs
qovluqlar yazıla bilən kimi görünür ro-rootfs
yollar. ikən overlayfs
bu doğrudur (proper
) fayl sistemi növü, bağlana bilən montaj həyata keçirilir
Bindirmə və bağlana bilən montajın təsvirinə əsasən, heç kim buna təəccüblənmir mountsnoop
etibarən bcc
.
Çağırış system-nspawn
işləyərkən konteyneri işə salır mountsnoop.py
.
Nə baş verdiyinə baxaq:
Başlanğıc mountsnoop
konteyner "yüklənərkən" konteynerin işləmə müddətinin bağlanan montajdan çox asılı olduğunu göstərir (Yalnız uzun çıxışın başlanğıcı göstərilir).
Burada systemd-nspawn
seçilmiş faylları təqdim edir procfs
и sysfs
konteynerə aparan yollar kimi rootfs
. İstisna olmaqla MS_BIND
bağlayıcı montajı təyin edən bayraq, montajdakı bəzi digər bayraqlar host və konteyner ad boşluqlarına edilən dəyişikliklər arasında əlaqəni müəyyənləşdirir. Məsələn, əlaqəli montaj ya dəyişiklikləri atlaya bilər /proc
и /sys
konteynerə daxil edin və ya zəngdən asılı olaraq onları gizləyin.
Nəticə
Linux-un daxili işini başa düşmək qeyri-mümkün bir iş kimi görünə bilər, çünki nüvənin özündə Linux istifadəçi sahəsi proqramlarını və C kitabxanalarında sistem çağırış interfeyslərini bir kənara qoyan çoxlu kod var. glibc
. Tərəqqiyə nail olmağın yollarından biri sistem zəngləri və istifadəçi sahəsi başlıqlarını, həmçinin cədvəl kimi əsas daxili nüvə interfeyslərini başa düşmək üçün bir nüvə alt sisteminin mənbə kodunu oxumaqdır. file_operations
. Fayl əməliyyatları "hər şey bir fayldır" prinsipini təmin edərək onları idarə etməyi xüsusilə xoş edir. Üst səviyyəli qovluqdakı C nüvəsi mənbə faylları fs/
məşhur fayl sistemləri və saxlama cihazları arasında geniş və nisbətən sadə uyğunluğu təmin edən sarğı təbəqəsi olan virtual fayl sistemlərinin tətbiqini təqdim edir. Linux ad məkanları vasitəsilə əlaqələndirmə və üst-üstə düşmə VFS-in sehridir ki, bu da yalnız oxumaq üçün konteynerlər və kök fayl sistemlərinin yaradılmasını mümkün edir. Mənbə kodunun, eBPF əsas alətinin və onun interfeysinin araşdırılması ilə birlikdə bcc
nüvə kəşfiyyatını həmişəkindən daha asan edir.
Dostlar, yazın, bu məqalə sizə faydalı oldu? Bəlkə hər hansı bir şərhiniz və ya qeydiniz var? Linux Administrator kursu ilə maraqlananlar dəvətlidir
Mənbə: www.habr.com