Linux හි අතථ්‍ය ගොනු පද්ධති: ඒවා අවශ්‍ය වන්නේ ඇයි සහ ඒවා ක්‍රියා කරන්නේ කෙසේද? 2 කොටස

හැමෝටම ආයුබෝවන්, අපි ඔබ සමඟ බෙදාගන්නේ “ලිනක්ස් හි අතථ්‍ය ගොනු පද්ධති: ඒවා අවශ්‍ය වන්නේ ඇයි සහ ඒවා ක්‍රියා කරන්නේ කෙසේද?” යන ප්‍රකාශනයේ දෙවන කොටසයි. ඔබට පළමු කොටස කියවිය හැකිය මෙහි. මෙම ප්‍රකාශන මාලාව පාඨමාලාවේ නව ප්‍රවාහයක් දියත් කිරීමට සමපාත වන බව අපි ඔබට මතක් කරමු. "ලිනක්ස් පරිපාලක", ඉතා ඉක්මනින් ආරම්භ වන.

eBPF සහ bcc මෙවලම් භාවිතයෙන් VFS නිරීක්ෂණය කරන්නේ කෙසේද

ගොනු මත කර්නලය ක්‍රියාත්මක වන ආකාරය තේරුම් ගැනීමට ඇති පහසුම ක්‍රමය sysfs එය ප්‍රායෝගිකව දැකීම වන අතර ARM64 නැරඹීමට ඇති පහසුම ක්‍රමය eBPF භාවිතා කිරීමයි. eBPF (Berkeley Packet Filter සඳහා කෙටි) ක්‍රියාත්මක වන අතථ්‍ය යන්ත්‍රයකින් සමන්විත වේ. හරය, වරප්‍රසාද ලත් පරිශීලකයින්ට ඉල්ලා සිටිය හැකි (query) විධාන රේඛාවෙන්. කර්නල් මූලාශ්‍ර පාඨකයාට කර්නලයට කළ හැකි දේ කියයි; පැටවූ පද්ධතියක් මත eBPF මෙවලම් ධාවනය කිරීමෙන් කර්නලය ඇත්ත වශයෙන්ම කරන්නේ කුමක්දැයි පෙන්වයි.

Linux හි අතථ්‍ය ගොනු පද්ධති: ඒවා අවශ්‍ය වන්නේ ඇයි සහ ඒවා ක්‍රියා කරන්නේ කෙසේද? 2 කොටස

වාසනාවකට මෙන්, මෙවලම් ආධාරයෙන් eBPF භාවිතා කිරීම ආරම්භ කිරීම ඉතා පහසුය bcc, සාමාන්‍ය බෙදාහැරීමේ පැකේජ ලෙස ලබා ගත හැක ලිනක්ස් සහ විස්තරාත්මකව ලේඛනගත කර ඇත බර්නාඩ් ග්‍රෙග්. මෙවලම් bcc C කේතයේ කුඩා ඇතුළත් කිරීම් සහිත පයිතන් ස්ක්‍රිප්ට් වේ, එයින් අදහස් කරන්නේ භාෂා දෙකම දන්නා ඕනෑම කෙනෙකුට ඒවා පහසුවෙන් වෙනස් කළ හැකි බවයි. තුල bcc/tools පයිතන් ස්ක්‍රිප්ට් 80 ක් ඇත, එයින් අදහස් කරන්නේ බොහෝ විට සංවර්ධකයෙකුට හෝ පද්ධති පරිපාලකයෙකුට ගැටළුව විසඳීම සඳහා සුදුසු යමක් තෝරා ගැනීමට හැකි වනු ඇති බවයි.
ධාවනය වන පද්ධතියක VFS කරන කාර්යය පිළිබඳ අවම වශයෙන් මතුපිට අදහසක් ලබා ගැනීමට, උත්සාහ කරන්න vfscount හෝ vfsstat. මෙය පෙන්වනු ඇත, අපි කියමු, ඇමතුම් දුසිම් ගණනක් vfs_open() සහ "ඔහුගේ මිතුරන්" සෑම තත්පරයකම වචනාර්ථයෙන් සිදු වේ.

Linux හි අතථ්‍ය ගොනු පද්ධති: ඒවා අවශ්‍ය වන්නේ ඇයි සහ ඒවා ක්‍රියා කරන්නේ කෙසේද? 2 කොටස

vfsstat.py VFS ක්‍රියාකාරී ඇමතුම් ගණනය කරන C කේත ඇතුළු කිරීම් සහිත පයිතන් ස්ක්‍රිප්ට් එකකි.

අපි වඩාත් සුළු උදාහරණයක් ලබා දී අපි USB ෆ්ලෑෂ් ධාවකය පරිගණකයකට ඇතුළු කර පද්ධතිය එය හඳුනා ගන්නා විට කුමක් සිදුවේදැයි බලමු.

Linux හි අතථ්‍ය ගොනු පද්ධති: ඒවා අවශ්‍ය වන්නේ ඇයි සහ ඒවා ක්‍රියා කරන්නේ කෙසේද? 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 කේත කොටසෙහි දෝෂ හේතුවෙන් C සම්පාදකයෙන් හඳුනාගත හැකි දෝෂ ඇතිවේ. උදාහරණයක් ලෙස, -l පරාමිතිය මඟ හැර තිබේ නම්, ඔබට "BPF පෙළ සම්පාදනය කිරීමට අසමත් විය." C සහ Python ගැන හුරුපුරුදු සංවර්ධකයින් මෙවලම් සොයා ගනු ඇත bcc පුළුල් කිරීමට සහ වෙනස් කිරීමට පහසුය.

USB ධාවකය ඇතුල් කළ විට, කර්නල් පසු සටහන PID 7711 නූල් එකක් බව පෙන්වයි. kworkerගොනුව සෑදූ «events» в sysfs. ඒ අනුව ඇමතුම sysfs_remove_files() ධාවකය ඉවත් කිරීම ගොනුව මකා දැමීමට හේතු වූ බව පෙන්වයි events, යොමු ගණන් කිරීමේ පොදු සංකල්පයට අනුරූප වේ. ඒ සමඟම, බැලීම sysfs_create_link () eBPF සමඟ USB ධාවකය ඇතුළු කරන විට අවම වශයෙන් සංකේතාත්මක සබැඳි 48ක් සාදා ඇති බව පෙන්වයි.

ඉතින් සිද්ධි ගොනුවේ තේරුම කුමක්ද? භාවිතය cscope සෙවීම සඳහා __device_add_disk(), එය හේතු වන දේ පෙන්වයි disk_add_events (), සහ එක්කෝ "media_change", හෝ "eject_request" සිදුවීම් ගොනුවක සටහන් කළ හැක. මෙහිදී කර්නල් බ්ලොක් ස්තරය මඟින් පරිශීලක අවකාශයට "තැටියක්" දර්ශනය වී ඉවත් කර ඇති බව දන්වයි. මූලාශ්‍රයෙන් දේවල් ක්‍රියා කරන්නේ කෙසේදැයි සොයා බැලීමට උත්සාහ කිරීම හා සසඳන විට USB ධාවකයක් ඇතුළු කිරීමෙන් මෙම පර්යේෂණ ක්‍රමය කෙතරම් තොරතුරු සපයන්නේද යන්න සටහන් කරන්න.

කියවීමට පමණක් root ගොනු පද්ධති කාවැද්දූ උපාංග සබල කරයි

ඇත්ත වශයෙන්ම, කිසිවෙකු සොකට් එකෙන් ප්ලග් එක ඇදගෙන සේවාදායකය හෝ ඔවුන්ගේ පරිගණකය නිවා දමන්නේ නැත. නමුත් ඇයි? මක්නිසාද යත්, භෞතික ගබඩා උපාංගවල සවිකර ඇති ගොනු පද්ධතිවල පසුගාමී ලිවීම් තිබිය හැකි අතර, ඒවායේ තත්ත්වය වාර්තා කරන දත්ත ව්‍යුහයන් ගබඩාවට ලිවීම් සමඟ සමමුහුර්ත නොවිය හැක. මෙය සිදු වූ විට, උපයෝගිතා දියත් කිරීම සඳහා පද්ධති හිමිකරුවන්ට ඊළඟ ආරම්භය තෙක් රැඳී සිටීමට සිදු වේ. fsck filesystem-recovery සහ, නරකම අවස්ථාවක, දත්ත අහිමි වීම.

කෙසේ වෙතත්, බොහෝ IoT උපාංග මෙන්ම රවුටර, තාප ස්ථාය සහ කාර් දැන් ලිනක්ස් ධාවනය කරන බව අපි කවුරුත් දනිමු. මෙම උපාංග බොහොමයකට පරිශීලක අතුරුමුහුණතක් නොමැති අතර ඒවා "පිරිසිදු" ලෙස අක්‍රිය කිරීමට ක්‍රමයක් නොමැත. පාලක ඒකකයට බලය ලැබෙන විට බැටරිය මිය ගිය මෝටර් රථයක් ආරම්භ කිරීම ගැන සිතන්න ලිනක්ස් නොනවත්වා උඩ පනිනවා. කොහොමද සිස්ටම් එක ලොගක් නැතුව බූට් වෙන්නේ fsckඑන්ජිම අවසානයේ ධාවනය ආරම්භ කරන්නේ කවදාද? ඒ වගේම පිළිතුර සරලයි. Embedded උපාංග root ගොනු පද්ධතිය මත රඳා පවතී කියවීම සඳහා පමණි (කෙටියෙන් ro-rootfs (කියවීමට පමණක් root ගොනු පද්ධතිය)).

ro-rootfs සත්‍යතාවට වඩා අඩු පැහැදිලි ප්‍රතිලාභ රැසක් ලබා දෙයි. එක් වාසියක් වන්නේ අනිෂ්ට මෘදුකාංග වලට ලිවීමට නොහැකි වීමයි /usr හෝ /lib, ලිනක්ස් ක්‍රියාවලියකට එහි ලිවිය නොහැක. තවත් දෙයක් නම්, බොහෝ දුරට වෙනස් කළ නොහැකි ගොනු පද්ධතියක් දුරස්ථ උපාංග සඳහා ක්ෂේත්‍ර සහාය සඳහා ඉතා වැදගත් වේ, මන්ද සහායක පිරිස් ක්ෂේත්‍ර පද්ධතිවලට නාමිකව සමාන වන දේශීය පද්ධති මත රඳා පවතී. සමහර විට වඩාත්ම වැදගත් (නමුත් වඩාත්ම ද්‍රෝහී) ප්‍රතිලාභය වන්නේ පද්ධතියේ සැලසුම් අවධියේදී වෙනස් කළ නොහැකි පද්ධති වස්තූන් තීරණය කිරීමට ro-rootfs සංවර්ධකයින්ට බල කිරීමයි. const විචල්‍යයන් බොහෝ විට ක්‍රමලේඛන භාෂාවල පවතින බැවින් ro-rootfs සමඟ වැඩ කිරීම අපහසු සහ වේදනාකාරී විය හැක, නමුත් ඒවායේ ප්‍රතිලාභ පහසුවෙන් අමතර පොදු කාර්ය සාධාරණීකරණය කරයි.

නිර්මාණය rootfs කියවීමට පමණක් කාවැද්දූ සංවර්ධකයින් සඳහා අමතර වෑයමක් අවශ්‍ය වන අතර VFS පින්තූරයට පැමිණෙන්නේ මෙහිදීය. Linux සඳහා ගොනු තිබිය යුතුය /var ලිවිය හැකි වූ අතර, ඊට අමතරව, කාවැද්දූ පද්ධති ක්‍රියාත්මක කරන බොහෝ ජනප්‍රිය යෙදුම් වින්‍යාසය නිර්මාණය කිරීමට උත්සාහ කරනු ඇත. dot-files в $HOME. ගෘහ නාමාවලියෙහි වින්‍යාස ගොනු සඳහා එක් විසඳුමක් වන්නේ සාමාන්‍යයෙන් ඒවා පූර්ව උත්පාදනය කර ගොඩ නැගීමයි rootfs. සඳහා /var හැකි එක් ප්‍රවේශයක් වන්නේ එය වෙනම ලිවිය හැකි කොටසක සවි කිරීමයි / කියවීමට පමණක් සවි කර ඇත. තවත් ජනප්රිය විකල්පයක් වන්නේ බයින්ඩ් හෝ ඕවර්ලේ මවුන්ට් භාවිතා කිරීමයි.

සම්බන්ධ කළ හැකි සහ ගොඩගැසිය හැකි සවි කිරීම්, බහාලුම් මගින් ඒවා භාවිතා කිරීම

විධානයක් ක්රියාත්මක කිරීම man mount සංවර්ධකයින්ට සහ පද්ධති පරිපාලකයින්ට එක් මාර්ගයක ගොනු පද්ධතියක් නිර්මාණය කර තවත් මාර්ගයක යෙදුම් වෙත නිරාවරණය කිරීමේ හැකියාව ලබා දෙන, බැඳිය හැකි සහ උඩින් තැබිය හැකි සවි කිරීම් ගැන ඉගෙන ගැනීමට හොඳම ක්‍රමය වේ. කාවැද්දූ පද්ධති සඳහා, මෙයින් අදහස් කරන්නේ ගොනු ගබඩා කිරීමේ හැකියාවයි /var කියවීමට-පමණි ෆ්ලෑෂ් ධාවකය මත, නමුත් උඩින් හෝ සම්බන්ධ කළ හැකි සවි කිරීමේ මාර්ගයක් tmpfs в /var පූරණය වන විට, එය යෙදුම් වලට එහි සටහන් ලිවීමට ඉඩ සලසයි (scrawl). ඊළඟ වතාවේ ඔබ වෙනස්කම් ක්‍රියාත්මක කරන විට /var නැති වෙයි. උඩැතිරි සවිකිරීමක් අතර සමිතියක් නිර්මාණය කරයි tmpfs සහ යටින් පවතින ගොනු පද්ධතිය සහ දැනට පවතින ගොනු වලට දෘශ්‍යමාන වෙනස්කම් කිරීමට ඔබට ඉඩ සලසයි ro-tootf නමුත් බැඳිය හැකි මවුන්ට් එකකින් අලුත් ඒවා හිස් කළ හැක tmpfs ලිවිය හැකි ලෙස පෙනෙන ෆෝල්ඩර ro-rootfs ක්රම. අතර overlayfs මේක තමයි හරි (proper) ගොනු පද්ධති වර්ගය, බැඳිය හැකි සවි කිරීම ක්‍රියාත්මක වේ VFS නාම අවකාශය.

උඩින් සහ සම්බන්ධ කළ හැකි සවිකිරීමේ විස්තරය මත පදනම්ව, කිසිවෙකු පුදුම වන්නේ නැත ලිනක්ස් බහාලුම් ඒවා ක්රියාශීලීව භාවිතා වේ. අපි බලමු පාවිච්චි කරනකොට මොකද වෙන්නේ කියලා systemd-nspawn මෙවලම භාවිතයෙන් කන්ටේනරය ධාවනය කිරීමට mountsnoop от bcc.

අමතන්න system-nspawn ධාවනය වන විට කන්ටේනරය ආරම්භ කරයි mountsnoop.py.

අපි බලමු මොකද වුනේ කියලා:

දියත් කරන්න mountsnoop කන්ටේනරය "ආරම්භක" වන අතර, බහාලුම්වල ධාවන කාලය සම්බන්ධ වී ඇති සවි කිරීම මත බෙහෙවින් රඳා පවතින බව පෙන්වයි (දිගු ප්‍රතිදානයේ ආරම්භය පමණක් පෙන්වා ඇත).

එය systemd-nspawn තුළ තෝරාගත් ගොනු සපයයි procfs и sysfs එයට මාර්ග ලෙස කන්ටේනරයට සත්කාරක rootfs. ඇරත් MS_BIND බන්ධන සවිකිරීම සකසන ධජය, මවුන්ට් මත ඇති තවත් සමහර ධජ මගින් සත්කාරක සහ බහාලුම් නාම අවකාශයන්හි වෙනස්කම් අතර සම්බන්ධය නිර්වචනය කරයි. උදාහරණයක් ලෙස, සම්බන්ධිත සවි කිරීමකට වෙනස් කිරීම් මඟ හැරිය හැක /proc и /sys කන්ටේනරය තුළට, හෝ ඇමතුම අනුව ඒවා සඟවන්න.

නිගමනය

වැනි C පුස්තකාලවල Linux පරිශීලක අවකාශ යෙදුම් සහ පද්ධති ඇමතුම් අතුරුමුහුණත් පසෙක තබා, කර්නලය තුළම විශාල කේත ප්‍රමාණයක් අඩංගු වන බැවින්, Linux හි අභ්‍යන්තර ක්‍රියාකාරිත්වය අවබෝධ කර ගැනීම කළ නොහැකි කාර්යයක් සේ පෙනේ. glibc. ප්‍රගතියක් ලබා ගැනීමට එක් ක්‍රමයක් නම්, පද්ධති ඇමතුම් සහ පරිශීලක-අවකාශ ශීර්ෂයන් මෙන්ම වගුව වැනි ප්‍රධාන අභ්‍යන්තර කර්නල් අතුරුමුහුණත් අවබෝධ කර ගැනීම සඳහා අවධාරණය කරමින්, එක් කර්නල් උප පද්ධතියක ප්‍රභව කේතය කියවීමයි. file_operations. ගොනු මෙහෙයුම් "සියල්ල ගොනුවකි" මූලධර්මය සපයන අතර, ඒවා කළමනාකරණය කිරීමට විශේෂයෙන් සතුටු වේ. C kernel මූලාශ්‍ර ගොනු ඉහළ මට්ටමේ නාමාවලියෙහි fs/ ජනප්‍රිය ගොනු පද්ධති සහ ගබඩා උපාංග අතර පුළුල් සහ සාපේක්ෂ සරල ගැළපීමක් සපයන දවටන ස්ථරයක් වන අතථ්‍ය ගොනු පද්ධති ක්‍රියාත්මක කිරීමක් ඉදිරිපත් කරන්න. ලිනක්ස් නාම අවකාශයන් හරහා සම්බන්ධ කිරීම සහ උඩින් සවි කිරීම VFS හි මැජික් වන අතර එමඟින් කියවීමට පමණක් බහාලුම් සහ මූල ගොනු පද්ධති නිර්මාණය කළ හැකිය. මූල කේතය, eBPF මූලික මෙවලම සහ එහි අතුරු මුහුණත පරීක්ෂා කිරීම සමඟ ඒකාබද්ධව bcc
මූලික ගවේෂණය වෙන කවරදාටත් වඩා පහසු කිරීම.

මිත්රවරුනි, ලියන්න, මෙම ලිපිය ඔබට ප්රයෝජනවත් වූවාද? සමහර විට ඔබට කිසියම් අදහස් හෝ ප්‍රකාශයක් තිබේද? ඒ වගේම Linux Administrator පාඨමාලාවට කැමති අයට ආරාධනා කරනවා විවෘත දිනය, එය අප්‍රේල් 18 වෙනිදා පැවැත්වේ.

පළමු කොටස.

මූලාශ්රය: www.habr.com

අදහස් එක් කරන්න