{"id":18428,"date":"2026-03-20T20:07:36","date_gmt":"2026-03-20T18:07:36","guid":{"rendered":"https:\/\/sysadmin.courses\/2026\/03\/20\/linux-%d0%b8%d0%b7%d0%bd%d1%83%d1%82%d1%80%d0%b8-%d0%b0%d1%80%d1%85%d0%b8%d1%82%d0%b5%d0%ba%d1%82%d1%83%d1%80%d0%b0-%d0%ba%d0%be%d1%82%d0%be%d1%80%d1%83%d1%8e-%d0%bd%d0%b5-%d0%be%d0%b1%d1%8a%d1%8f\/"},"modified":"2026-04-26T15:36:22","modified_gmt":"2026-04-26T12:36:22","slug":"linux-is-vidaus-architektura-kurios-nemoko-pradedantiesiems","status":"publish","type":"post","link":"https:\/\/sysadmin.courses\/lt\/linux-is-vidaus-architektura-kurios-nemoko-pradedantiesiems\/","title":{"rendered":"Linux i\u0161 vidaus: architekt\u016bra, kurios nemoko pradedantiesiems."},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">Da\u017enai sakome \u201eLinux&#8221; tur\u0117dami omenyje Ubuntu, CentOS ar Debian. Ta\u010diau in\u017eineriniu po\u017ei\u016briu tai neteisinga. Linux yra <strong>branduolys<\/strong>. Kodo gabalas, valdantis aparatin\u0119 \u012frang\u0105. Viskas, k\u0105 matome ekrane, viskas, su kuo s\u0105veikaujame \u2014 tai tik program\u0173 rinkinys, veikiantis vir\u0161 \u0161io branduolio.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u0160iame straipsnyje i\u0161siai\u0161kinsime, kaip visa tai veikia. Prad\u0117sime nuo pat apa\u010dios.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">1 \u017eingsnis. Spaud\u017eiame maitinimo mygtuk\u0105<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Srov\u0117 pajud\u0117jo. Procesorius pabunda \u2014 ta\u010diau \u0161iuo momentu jis yra kvailas silicio gabalas. Jis ne\u017eino, kas yra Linux. Jis ne\u017eino, kas yra failai. Jis net ne\u017eino, kiek turi operatyvin\u0117s atminties. Jis papras\u010diausiai ie\u0161ko pirmos instrukcijos grie\u017etai u\u017ekoduotu adresu.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Pirmoji paleid\u017eiama <strong>pagrindin\u0117s plok\u0161t\u0117s programin\u0117 \u012franga<\/strong> \u2014 BIOS arba UEFI. Jos u\u017eduotis \u2014 pa\u017eadinti aparatin\u0119 \u012frang\u0105. Ji paleid\u017eia POST (Power-On Self-Test): tikrina, ar yra atmintis, ar veikia vaizdo plok\u0161t\u0117, ar inicializavosi procesorius. Tada apklausia \u012frenginius ir ie\u0161ko, i\u0161 ko galima paleisti sistem\u0105.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">2 \u017eingsnis. \u012ekroviklis \u2014 GRUB<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Tarkime, BIOS rado stand\u0173j\u012f disk\u0105. Bet \u0161tai problema \u2014 BIOS pats nemoka skaityti fail\u0173 sistem\u0173. Jis ne\u017eino, kas yra ext4 ar XFS. Jis negali tiesiog paimti ir atidaryti failo. Tod\u0117l jis nuskaito pirmutiniuosius 512 disko bait\u0173 (tai MBR) arba \u017evilgteli \u012f special\u0173 EFI skaidin\u012f. O ten gyvena <strong>\u012fkroviklis<\/strong>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Linux pasaulyje tai beveik visada yra <strong>GRUB 2<\/strong>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">GRUB \u2014 ma\u017ea, bet protinga programa. Jos vienintel\u0117 supergalia \u2014 ji moka skaityti fail\u0173 sistemas. Ji \u017evilgteli \u012f <strong>\/boot<\/strong> skaidin\u012f, kur guli du kriti\u0161kai svarb\u016bs failai, be kuri\u0173 nieko ne\u012fvyks.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>vmlinuz<\/strong> \u2014 tai ir yra pats Linux. Branduolys, suspaustas \u012f dvejetain\u012f fail\u0105. Raid\u0117 z pabaigoje rei\u0161kia zip \u2014 tai yra suspaustas.<br><strong>initramfs<\/strong> \u2014 ma\u017eas laikinas archyvas. Apie j\u012f \u2014 \u0161iek tiek v\u0117liau.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">GRUB paima branduol\u012f, i\u0161skleid\u017eia j\u012f tiesiai \u012f operatyvin\u0119 atmint\u012f ir perduoda jam valdym\u0105. Viskas. Nuo \u0161io momento BIOS i\u0161eina par\u016bkyti \u012f \u0161on\u0105, \u012fkroviklis mir\u0161ta. Dabar sistemoje t\u0117ra vienas vir\u0161ininkas \u2014 <strong>branduolys<\/strong>.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Maitinimo mygtukas\n      |\n      v\n  BIOS\/UEFI\n  (POST, \u012frengini\u0173 paie\u0161ka)\n      |\n      v\n   GRUB 2\n  (skaito \/boot, \u012fkelia branduol\u012f)\n      |\n      v\n  vmlinuz (branduolys)\n      |\n      v\n  initramfs\n  (laikinas diskas su tvarkykl\u0117mis)\n      |\n      v\n  switch_root\n  (perjungimas \u012f tikr\u0105j\u012f disk\u0105)\n      |\n      v\n  systemd (PID 1)\n      |\n      v\n  SSH, Nginx, Postgres...<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">3 \u017eingsnis. Vi\u0161tos ir kiau\u0161inio problema<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Ir \u010dia branduolys susiduria su klasikine in\u017einerine problema.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Branduolys \u012fkeltas \u012f atmint\u012f. Jo u\u017eduotis \u2014 prijungti pagrindin\u012f disk\u0105, kad paleist\u0173 sistem\u0105. Ta\u010diau norint prijungti disk\u0105, reikia <strong>tvarkykli\u0173<\/strong> \u2014 fail\u0173 sistemai ir disko valdikliui. O kur guli tvarkykl\u0117s? Teisingai \u2014 tame pa\u010diame diske, kurio dar negalime perskaityti, nes neturime tvarkykli\u0173.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">U\u017edaras ratas.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">B\u016btent tod\u0117l GRUB \u012fk\u0117l\u0117 antr\u0105 fail\u0105 \u2014 <strong>initramfs<\/strong>. Tai ma\u017eas laikinas archyvas, kuris i\u0161skleid\u017eiamas operatyvin\u0117je atmintyje kaip virtualus diskas. Viduje \u2014 mini Linux su minimaliu tvarkykli\u0173 rinkiniu. Branduolys prijungia initramfs kaip laikin\u0105 \u0161akn\u012f, i\u0161 jo \u012fkelia reikiamas tikrosios aparatin\u0117s \u012frangos tvarkykles (RAID valdikliai, NVMe, LVM), randa tikr\u0105j\u012f disk\u0105 \u2014 ir atlieka triuk\u0105 pavadinimu <strong>switch_root<\/strong>, tai yra \u0161aknies pakeitimas. Laikinas diskas i\u0161metamas i\u0161 atminties ir pakei\u010diamas tikruoju.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Pastaba:<\/strong> kartais galite sutikti termin\u0105 <strong>pivot_root<\/strong> \u2014 tai senesnis mechanizmas. \u0160iuolaikin\u0117s sistemos su initramfs naudoja b\u016btent <strong>switch_root<\/strong>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Svarbu praktikoje:<\/strong> jei serveris u\u017estringa paleidimo metu su klaida <strong>kernel panic<\/strong> \u2014 branduolys \u012fstrigo b\u016btent \u010dia. Jis arba nerado initramfs, arba jame nebuvo reikiamos disko tvarkykl\u0117s.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">4 \u017eingsnis. Branduolys \u2014 trys pagrindin\u0117s u\u017eduotys<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\u012ekroviklis atliko savo darb\u0105, tvarkykl\u0117s \u012fkeltos \u2014 patenkame \u012f <strong>kernel space<\/strong>. Procesoriaus architekt\u016bros po\u017ei\u016briu esame apsaugos \u017eiede Ring 0. \u010cia leid\u017eiama viskas: bet kokia procesoriaus instrukcija, bet koks atminties adresas.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Linux yra <strong>monolitinis branduolys<\/strong>, o ne atskir\u0173 paslaug\u0173 rinkinys. Vaizdo plok\u0161t\u0117s tvarkykl\u0117, TCP\/IP tinklo steka, ext4 fail\u0173 sistemos tvarkykl\u0117 \u2014 visa tai verda viename mil\u017eini\u0161kame katile, vienoje adres\u0173 erdv\u0117je. Tai suteikia beproti\u0161k\u0105 na\u0161um\u0105, nes n\u0117ra papildom\u0173 s\u0105naud\u0173 komponent\u0173 tarpusavio komunikacijai. Ta\u010diau yra rizika: jei suklydusi tvarkykl\u0117 sugrius \u2014 ji nusitemps vis\u0105 server\u012f \u012f kernel panic.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Branduolys turi tris pagrindines u\u017eduotis.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">1. Atminties valdymas<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Pagrindin\u0117 branduolio u\u017eduotis \u010dia \u2014 <strong>meluoti<\/strong>. Jis meluoja m\u016bs\u0173 programoms.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Kai Nginx ar Python pra\u0161o atminties, jis mano es\u0105s vienintelis sistemoje. Jam viskas atrodo kaip gra\u017ei nenutr\u016bkstama adres\u0173 juosta. Nors i\u0161 tikr\u0173j\u0173 fizin\u0117 atmintis yra fragmentuota ir duomen\u0173 gabalai i\u0161barstyti chaoti\u0161kai.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Branduolys tvarko mil\u017eini\u0161k\u0105 virtualiosios atminties lentel\u0119: \u201evirtualus adresas X Nginx procesui i\u0161 tikr\u0173j\u0173 yra fizin\u0117je l\u0105stel\u0117je Y&#8221;. Tai suteikia du dalykus: <strong>izoliacij\u0105<\/strong> (vienas procesas fizi\u0161kai negali pasiekti kito atminties) ir <strong>swap<\/strong> (jei atminties tr\u016bksta, branduolys tyliai i\u0161kelia dal\u012f duomen\u0173 \u012f disk\u0105).<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Ta\u010diau jei atmintis visi\u0161kai i\u0161seko ir swap taip pat pilnas \u2014 ateina <strong>OOM Killer<\/strong>. Ir jis ne veltui taip pavadintas. Tai tikras \u017eudikas, pasamdytas branduolio. Jis pabunda, nuskaito proces\u0173 lentel\u0119, suranda t\u0105, kuris ryja daugiausiai atminties esant \u017eemam prioritetui \u2014 ir pa\u0161auna jam \u012f kakt\u0105. Kubernetes aplinkoje tai nutinka nuolat, kai neteisingai sukonfig\u016bruoti pod\u0173 limitai.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">2. Proces\u0173 planuoklis<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Tarkime, m\u016bs\u0173 serveryje yra 4 branduoliai, bet veikia 500 proces\u0173. Kaip jie visi dirba vienu metu?<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Niekada. Tai iliuzija.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Branduolys naudoja preemptyvin\u0119 multitasking&#8217;\u0105. Jis leid\u017eia procesui veikti kelias milisekundes \u2014 vadinam\u0105j\u012f laiko kvant\u0105 \u2014 o paskui j\u012f priverstinai sustabdo. Tai vadinama konteksto perjungimu: branduolys i\u0161saugo dabartin\u0117s u\u017eduoties procesoriaus registro b\u016bsen\u0105, \u012fkelia kitos u\u017eduoties b\u016bsen\u0105 ir paleid\u017eia toliau. Tai vyksta t\u016bkstan\u010dius kart\u0173 per sekund\u0119.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Jei steb\u0117jimo \u012frankyje matote auk\u0161t\u0105 load average, bet CPU apkrova nesiekia 100% \u2014 problema grei\u010diausiai visai nesusijusi su procesoriumi. Load average skai\u010diuoja ne tik aktyviai dirban\u010dius procesus, bet ir tuos, kurie blokuoti laukdami I\/O \u2014 \u012fstrig\u0119, kol atsakys diskas ar tinklas. Tai b\u016bsena D komandos ps i\u0161vestyje (uninterruptible sleep). Tuo metu procesorius tu\u0161\u010di\u0105ja eiga, o serveris \u201estringa&#8221;. Diagnozuoti galima per iostat arba vmstat \u2014 jei wa (I\/O wait) reik\u0161m\u0117 didel\u0117, prie\u017eastis b\u016btent ten.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Konteksto perjungimas \u2014 atskira tema. Jis matomas vmstat kaip didel\u0117 cs reik\u0161m\u0117. Jei sistema i\u0161 tikr\u0173j\u0173 eikvoja resursus perjungin\u0117dama t\u016bkstan\u010dius proces\u0173 \u2014 CPU bus apkrautas, o cs reik\u0161m\u0117 \u0161oks \u012f vir\u0161\u0173.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">3. Aparatin\u0117s \u012frangos abstrakcija<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Branduolys atlieka <strong>vert\u0117jo<\/strong> vaidmen\u012f. Programos naudotojo erdv\u0117je ne\u017eino aparatin\u0117s \u012frangos. \u0160tai yra Python programa, kuri ra\u0161o \u017eod\u012f \u012f fail\u0105. Ta\u010diau Python ne\u017eino, kur ra\u0161o \u2014 \u012f Samsung SSD, sen\u0105 kiet\u0105j\u012f disk\u0105 ar tinklo katalog\u0105. Kiekvienas \u012frenginys turi savo protokol\u0105, savo \u012ftampas, savo valdiklio komandas.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Branduolys suteikia universali\u0105 s\u0105saj\u0105. Programa sako: \u201era\u0161yk \u012f \u0161\u012f fail\u0105&#8221;. O branduolio tvarkykl\u0117 ver\u010dia tai \u012f elektrinius signalus. D\u0117l to m\u016bs\u0173 kodas veikia vienodai ant bet kokios aparatin\u0117s \u012frangos.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">5 \u017eingsnis. Sisteminiai i\u0161kvietimai \u2014 vienintel\u0117s durys \u012f branduol\u012f<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Tarp naudotojo re\u017eimo, kur gyvena m\u016bs\u0173 programos, ir branduolio re\u017eimo stovi <strong>betonin\u0117 siena<\/strong>. Procesorius fizi\u0161kai draud\u017eia naudotojo erdv\u0117s kodui kreiptis \u012f aparatin\u0119 \u012frang\u0105. Jei programa bandys tiesiogiai pasiekti aparatin\u0119 \u012frang\u0105 \u2014 procesorius j\u0105 nedelsiant sustabdys. Jokios prieigos nebus.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Ta\u010diau \u0161ioje sienoje yra vienintel\u0117s \u0161arvuotos durys. Jos vadinamos <strong>sisteminiu i\u0161kvietimu (syscall)<\/strong>. Tai grie\u017etai reglamentuota API. Branduolys sako: \u201enepaleisiu tav\u0119s tiesiai prie disko, bet jei mandagiai papra\u0161ysi per speciali\u0105 funkcij\u0105 \u2014 padarysiu tai u\u017e tave&#8221;.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Pa\u017ei\u016br\u0117kime \u012f pavyzd\u012f. Ra\u0161ome<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>print(\"Hello World\")<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Python \u2014 ir prasideda visa \u012fvyki\u0173 grandin\u0117:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Python interpretatorius i\u0161kvie\u010dia standartin\u0119 C bibliotek\u0105 (glibc).<\/li>\n\n\n\n<li>Biblioteka suformuoja <strong>write<\/strong> sistemin\u012f i\u0161kvietim\u0105.<\/li>\n\n\n\n<li>Ji padeda argumentus \u012f procesoriaus registrus ir generuoja programin\u0119 pertrauk\u0105.<\/li>\n\n\n\n<li>Procesorius sustabdo program\u0105, perjungia re\u017eim\u0105 \u012f Ring 0 ir perduoda valdym\u0105 branduoliui.<\/li>\n\n\n\n<li>Branduolys patikrina teises ir atvaizduoja tekst\u0105 ekrane.<\/li>\n\n\n\n<li>Valdymas gr\u0105\u017einamas programai.<\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\">Linux turi apie 300\u2013400 sistemini\u0173 i\u0161kvietim\u0173. Pagrindiniai, ant kuri\u0173 laikosi viskas: <strong>fork<\/strong>, <strong>exec<\/strong>, <strong>open<\/strong>, <strong>close<\/strong>, <strong>read<\/strong>, <strong>write<\/strong>, <strong>socket<\/strong>, <strong>connect<\/strong>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Kod\u0117l tai svarbu \u017einoti? Nes programos da\u017enai meluoja. \u017durnalai gali b\u016bti tu\u0161ti, klaidos \u2014 neinformatyvios. Ta\u010diau programa negali meluoti branduoliui. Ji privalo daryti syscall&#8217;us, kad k\u0105 nors atlikt\u0173.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Ir \u010dia \u012f scen\u0105 \u017eengia <strong>strace<\/strong> \u2014 pagrindinis derinimo \u012frankis. Tai pasiklausymo priemon\u0117 syscall&#8217;ams. Paleid\u017eiate j\u012f ant proceso ir matote visk\u0105: k\u0105 jis band\u0117 padaryti, k\u0105 gavo, kur \u012fstrigo. strace \u2014 tai rentgenas. Jei mokate skaityti jo i\u0161vest\u012f, jums neegzistuoja nesuprantam\u0173 klaid\u0173.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">6 \u017eingsnis. Pirmasis procesas \u2014 systemd<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Branduolys \u012fkeltas, inicializuota atmintis ir tvarkykl\u0117s. Ta\u010diau serveris vis dar tu\u0161\u010dias \u2014 n\u0117ra nei SSH, nei konsol\u0117s, nei tinklo. Kad sistema atgyt\u0173, branduolys turi paleisti pirm\u0105j\u012f proces\u0105 naudotojo erdv\u0117je. Jis ie\u0161ko vykdomojo failo keliuose:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\/sbin\/init\n\/etc\/init\n\/bin\/init\n\/bin\/sh<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Ir paleid\u017eia pirm\u0105j\u012f rast\u0105j\u012f. \u0160is procesas gauna <strong>PID 1<\/strong> \u2014 savo unikal\u0173 identifikatori\u0173. Visi kiti sistemos procesai \u2014 PID 2, 3, 4, 10000 \u2014 bus \u0161io proceso palikuonys. Jei PID 1 mirs \u2014 branduolys nuspr\u0119s, kad sistema sugedusi, perkris \u012f kernel panic ir serveris sustos.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u0160iuolaikiniame Linux <strong>systemd<\/strong> atlieka PID 1 vaidmen\u012f.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Senais SysV init laikais procesai buvo paleid\u017eiami eil\u0117s tvarka: pirmiausia tinklas, tada diskas, tada duomen\u0173 baz\u0117. L\u0117tai. systemd veikia kaip priklausomybi\u0173 valdytojas \u2014 kuria krypting\u0105 graf\u0105 ir paleid\u017eia visk\u0105 <strong>lygiagre\u010diai<\/strong>, maksimaliai i\u0161naudodamas procesori\u0173 paleidimo metu. SSH nuo nieko nepriklauso? Paleid\u017eiame i\u0161 karto. Postgres priklauso nuo disko? Palauks.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Kai ra\u0161ome<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>systemctl start nginx<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\u2014 siun\u010diame komand\u0105 systemd per soket\u0105. systemd patikrina teises, \u017ei\u016bri \u012f priklausomybes ir vykdo <strong>fork<\/strong> sistemin\u012f i\u0161kvietim\u0105 (sukuria savo kopij\u0105) + <strong>exec<\/strong> (pakei\u010dia kopij\u0105 Nginx dvejetainiu failu). Taip gimsta \u017einiatinklio serverio procesas \u2014 systemd vaikas.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">7 \u017eingsnis. Fail\u0173 sistema \u2014 \u201eviskas yra failas&#8221;<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Procesai paleisti, ta\u010diau jiems reikia skaityti konfig\u016bracijas, ra\u0161yti \u017eurnalus, i\u0161saugoti duomenis. Kylame \u012f kit\u0105 abstrakcijos lyg\u012f \u2014 <strong>fail\u0173 sistem\u0105<\/strong>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Pagrindin\u0117 Unix filosofija: <strong>viskas yra failas<\/strong>. Ta\u010diau pa\u017ei\u016br\u0117kime \u012f tai ne kaip \u012f \u0161\u016bk\u012f, o kaip \u012f in\u017einerin\u012f sprendim\u0105.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Windows turi disk\u0173 raides C:, D:, E: \u2014 fizinis \u012frengini\u0173 atskyrimas. Linux po\u017ei\u016bris kitoks. \u010cia egzistuoja <strong>vienas katalog\u0173 medis<\/strong>, kuris visada prasideda nuo \u0161aknies \u2014 simbolio \/. Procesui nesvarbu, kiek disk\u0173 turime. Jis mato tik med\u012f.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Branduolio viduje yra sluoksnis <strong>VFS (Virtual File System)<\/strong> \u2014 universali s\u0105saja. Imame SSD ir prijungiame prie <strong>\/boot<\/strong>. Imame tinklo disk\u0105 ir prijungiame prie <strong>\/mnt\/share<\/strong>. Imame operatyvin\u0119 atmint\u012f ir prijungiame prie <strong>\/tmp<\/strong>. Programai viskas atrodo vienodai \u2014 ji tiesiog ra\u0161o pagal kelius, o VFS realiu laiku nusprend\u017eia, kur si\u0173sti baitus: SATA kabeliu ar tinklu \u012f kit\u0105 server\u012f.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\/                   \u2190 \u0161aknis\n\u251c\u2500\u2500 boot\/           \u2190 SSD su branduoliu\n\u251c\u2500\u2500 etc\/            \u2190 konfig\u016bracijos\n\u251c\u2500\u2500 home\/           \u2190 nam\u0173 katalogai\n\u2502   \u2514\u2500\u2500 user\/\n\u251c\u2500\u2500 proc\/           \u2190 virtualus (branduolio duomenys)\n\u251c\u2500\u2500 sys\/            \u2190 virtualus (branduolio nustatymai)\n\u251c\u2500\u2500 tmp\/            \u2190 operatyvin\u0117 atmintis\n\u251c\u2500\u2500 usr\/\n\u2502   \u251c\u2500\u2500 bin\/        \u2190 program\u0173 dvejetainiai failai\n\u2502   \u2514\u2500\u2500 lib\/        \u2190 bendros bibliotekos\n\u251c\u2500\u2500 var\/\n\u2502   \u2514\u2500\u2500 log\/        \u2190 \u017eurnalai\n\u2514\u2500\u2500 mnt\/\n    \u2514\u2500\u2500 share\/      \u2190 tinklo diskas<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Kas yra failas fizi\u0161kai?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Mums failas yra photo.jpg. Ta\u010diau branduoliui vardas \u2014 tu\u0161\u010dias garsas. Tiesiog bait\u0173 rinkinys \u017emogaus patogumui. Branduoliui failas yra <strong>inode<\/strong> (indekso mazgas). Kiekvienas sistemos failas \u2014 tai tiesiog skai\u010dius.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">inode saugo vis\u0105 metainformacij\u0105, i\u0161skyrus vard\u0105: savininkas, prieigos teis\u0117s, failo dydis, laiko \u017eymos ir svarbiausia \u2014 rodykl\u0117s \u012f disko sektorius, kur fizi\u0161kai guli duomenys.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">O kas tada yra failo vardas? Vardas gyvena <strong>kataloge<\/strong>. Techni\u0161kai katalogas yra taip pat failas, ta\u010diau jo viduje yra paprasta dviej\u0173 stulpeli\u0173 lentel\u0117: failo vardas \u2192 inode numeris. Kai atidarome fail\u0105, branduolys skaito katalog\u0105, randa inode numer\u012f, patikrina teises \u2014 ir tik po to pradeda skaityti duomenis.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Katalogas \/home\/user\/\n\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\n\u2502   Vardas    \u2502  inode # \u2502\n\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\n\u2502 photo.jpg   \u2502   42017  \u2502\n\u2502 notes.txt   \u2502   42031  \u2502\n\u2502 script.sh   \u2502   42089  \u2502\n\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\n                  \u2502\n                  \u25bc\n           inode #42017\n      \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\n      \u2502 savininkas: uid 1000\u2502\n      \u2502 teis\u0117s:    644      \u2502\n      \u2502 dydis:     3.2 MB   \u2502\n      \u2502 keistas: 2024-03-01 \u2502\n      \u2502 duomenys \u2192 &#91;sektoriai]\u2502\n      \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">\/proc ir \/sys \u2014 branduolys kaip failai<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Linux k\u016br\u0117jai pagalvojo: kod\u0117l ribotis diskais? Pavaizduokime pat\u012f branduol\u012f kaip failus.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Atsirado <strong>\/proc<\/strong> ir <strong>\/sys<\/strong>. Fail\u0173 dydis ten \u2014 0 bait\u0173. Diske nieko n\u0117ra. Tai iliuzija \u2014 ta\u010diau tiesiogin\u0117 s\u0105saja su branduolio duomen\u0173 strukt\u016bromis operatyvin\u0117je atmintyje. Skaitote <strong>\/proc\/cpuinfo<\/strong> \u2014 branduolys apklausia procesori\u0173 ir generuoja atsakymo tekst\u0105 realiu laiku.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Ir tai veikia abiem kryptimis. Norite \u012fjungti IP mar\u0161rutizavim\u0105 ir paversti server\u012f mar\u0161rutizatoriumi? Nereikia ie\u0161koti jokio \u017eymimojo langelio jokiame valdymo skydelyje. Tiesiog \u012fra\u0161ykite 1 \u012f reikiam\u0105 fail\u0105:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>echo 1 &gt; \/proc\/sys\/net\/ipv4\/ip_forward<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Branduolys perima \u0161\u012f \u012fra\u0161\u0105 ir pakei\u010dia kintam\u0105j\u012f savo kode. \u0160tai k\u0105 rei\u0161kia \u201eviskas yra failas&#8221; \u2014 universali sistemos valdymo API.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">8 \u017eingsnis. Procesai, stdin\/stdout ir vamzd\u017eiai<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Procesas \u2014 tai izoliuotas konteineris atmintyje su savo PID, kintamaisiais ir i\u0161tekliais. Ta\u010diau procesas vakuume yra nenaudingas. Jam reikia gauti duomenis ir gr\u0105\u017einti rezultat\u0105.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Kai branduolys paleid\u017eia bet kok\u012f proces\u0105, jis automati\u0161kai atidaro jam tris ry\u0161io kanalus \u2014 tris failus:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Deskriptorius  Pavadinimas                    Numatytasis priskyrimas\n0              stdin  (standartin\u0117 \u012fvestis)   klaviat\u016bra\n1              stdout (standartin\u0117 i\u0161vestis)  ekranas\/terminalas\n2              stderr (standartin\u0117s klaidos)  ekranas\/terminalas<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Kod\u0117l atskirti stdout ir stderr? Kad atskirtume naudingus duomenis nuo klaid\u0173. Galime pasakyti apvalkalui: naudingus duomenis (1 deskriptorius) ra\u0161yk \u012f fail\u0105, o klaidas (2 deskriptorius) meskite \u012f <strong>\/dev\/null<\/strong> \u2014 juod\u0105j\u0105 skyl\u0119:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>command &gt; data.txt 2&gt;\/dev\/null<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Vamzdis | \u2014 pagrindin\u0117 Linux magija<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Simbolis <strong>|<\/strong> \u2014 tai tarpprocesin\u0117s komunikacijos mechanizmas. Kai ra\u0161ome:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>cat access.log | grep \"ERROR\"<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Branduolys paleid\u017eia <strong>cat<\/strong> ir <strong>grep<\/strong> vienu metu. <strong>cat<\/strong> pakei\u010dia stdout: vietoje ekrano \u2014 specialus atminties buferis (vamzdis). <strong>grep<\/strong> pakei\u010dia stdin: vietoje klaviat\u016bros \u2014 tas pats buferis.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Genialumas tame: <strong>cat<\/strong> mano, kad ra\u0161o \u012f ekran\u0105. <strong>grep<\/strong> mano, kad skaito i\u0161 klaviat\u016bros. Jie ne\u017eino vienas kito egzistavimo. Branduolys tiesiog perki\u0161o laidus.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>  cat access.log          grep \"ERROR\"\n  \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510           \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\n  \u2502           \u2502  stdout   \u2502           \u2502\n  \u2502    cat    \u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u25ba\u2502   grep    \u2502\u2500\u2500\u25ba ekranas\n  \u2502           \u2502  vamzdis  \u2502           \u2502\n  \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518  (buferis) \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\n   mano, kad               mano, kad\n   ra\u0161o \u012f ekran\u0105           skaito i\u0161 klaviat\u016bros<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Tai leid\u017eia kurti bet kokio ilgio konvejerius. Penkios kvailos ma\u017eos programos, sujungtos vamzd\u017eiais, virsta galing\u0173 analiz\u0117s \u012frankiu. Tai ir yra Unix filosofija: ra\u0161yti programas, kurios daro vien\u0105 dalyk\u0105, bet gerai \u2014 ir i\u0161mokyti jas dirbti kartu per teksto srautus.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">9 \u017eingsnis. Signalai \u2014 kaip procesai gauna prane\u0161imus<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Procesai negyvena visoje izoliacijoje. Branduolys ir kiti procesai gali jiems si\u0173sti \u017einutes. Tai vadinami <strong>signalais<\/strong> \u2014 trumpi asinchroniniai prane\u0161imai: \u201eei, laikas mirti&#8221; arba \u201eperskaityk konfig\u016bracij\u0105 i\u0161 naujo&#8221;.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Kai paspaud\u017eiate <strong>Ctrl+C<\/strong> terminale \u2014 j\u016bs ne \u201eu\u017edarote&#8221; program\u0105. Siun\u010diate jai <strong>SIGINT<\/strong> signal\u0105. Programa gali j\u012f sugauti ir teisingai u\u017esibaigti. Arba ignoruoti.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Pagrindiniai signalai, kuriuos verta \u017einoti:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>SIGTERM<\/strong> \u2014 mandagus pra\u0161ymas u\u017esibaigti. Programa gali j\u012f sugauti, i\u0161saugoti b\u016bsen\u0105 ir i\u0161eiti.<br><strong>SIGKILL<\/strong> \u2014 \u012fsakymas, kurio negalima ignoruoti. Branduolys nedelsiant nu\u017eudo proces\u0105, nesuteikdamas galimyb\u0117s nieko i\u0161saugoti. B\u016btent \u0161\u012f signal\u0105 naudoja OOM Killer.<br><strong>SIGHUP<\/strong> \u2014 istori\u0161kai rei\u0161k\u0117 \u201eprarasta terminalo jungtis&#8221;. \u0160iandien demonai tai naudoja kaip signal\u0105 i\u0161 naujo perskaityti konfig\u016bracij\u0105 be paleidimo i\u0161 naujo.<br><strong>SIGINT<\/strong> \u2014 klaviat\u016bros pertraukimas (<strong>Ctrl+C<\/strong>).<br><strong>SIGSTOP<\/strong> \u2014 u\u017e\u0161aldyti proces\u0105. Taip pat negalima ignoruoti.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Signal\u0105 rankiniu b\u016bdu galima si\u0173sti komanda<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>kill<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\u2014 nepaisant pavadinimo, ji gali si\u0173sti bet kok\u012f signal\u0105:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>kill -SIGTERM 1234   # mandagiai papra\u0161yti proces\u0105 1234 u\u017esibaigti\nkill -SIGKILL 1234   # nu\u017eudyti be joki\u0173 diskusij\u0173\nkill -SIGHUP 1234    # papra\u0161yti i\u0161 naujo perskaityti konfig\u016bracij\u0105<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Svarbu suprasti: <strong>SIGKILL<\/strong> \u2014 tai kra\u0161tutin\u0117 priemon\u0117. Procesas nesp\u0117ja nieko i\u0161saugoti, u\u017edaryti jung\u010di\u0173, \u012fra\u0161yti duomen\u0173. Tod\u0117l visada pirmiausia <strong>SIGTERM<\/strong>, ir tik jei nepad\u0117jo \u2014 <strong>SIGKILL<\/strong>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">10 \u017eingsnis. Prieigos teis\u0117s<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Linux saugumas \u2014 tai ne antivirusin\u0117 magija. Tai <strong>bit\u0173 tikrinimas inode<\/strong>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Branduolys ne\u017eino \u017eod\u017ei\u0173. Jis \u017eino tik skai\u010dius. J\u016bs\u0173 naudotojo vardas ver\u010diamas \u012f <strong>UID (User ID)<\/strong>, grup\u0117 \u2014 \u012f <strong>GID (Group ID)<\/strong>. Atitikmen\u0173 duomen\u0173 baz\u0117 saugoma paprastuose tekstiniuose failuose <strong>\/etc\/passwd<\/strong> ir <strong>\/etc\/group<\/strong>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Kiekviename inode u\u017era\u0161yta: \u201e\u0161io failo savininkas yra UID X, grup\u0117 Y&#8221;. Ir ten pat trys teisi\u0173 rinkiniai: <strong>user<\/strong> (savininkas), <strong>group<\/strong> (grup\u0117), <strong>others<\/strong> (visi kiti). Kiekvienam rinkiniui \u2014 trys veiksmai:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>read (4)<\/strong> \u2014 skaityti<br><strong>write (2)<\/strong> \u2014 keisti<br><strong>execute (1)<\/strong> \u2014 paleisti kaip proces\u0105<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Tai ne atsitiktiniai skai\u010diai \u2014 tai bitin\u0117 kauk\u0117: <strong>read = 100<\/strong>, <strong>write = 010<\/strong>, <strong>execute = 001<\/strong>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Kai ra\u0161ome<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>chmod 755 file<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">:<br><strong>7<\/strong> = 4+2+1 \u2014 savininkas gali visk\u0105<br><strong>5<\/strong> = 4+0+1 \u2014 grup\u0117 gali skaityti ir vykdyti, bet ne ra\u0161yti<br><strong>5<\/strong> = 4+0+1 \u2014 visi kiti taip pat<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Svarbi detal\u0117: \u017eym\u0117 <strong>x<\/strong> ant <strong>katalogo<\/strong> nerei\u0161kia vykdymo \u2014 ji rei\u0161kia teis\u0119 \u012f j\u012f \u012feiti. Jei turite teis\u0119 skaityti katalog\u0105, bet neturite teis\u0117s \u012feiti \u2014 matysite fail\u0173 s\u0105ra\u0161\u0105, bet negal\u0117site skaityti j\u0173 turinio.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Root ir sudo<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Linux turi vien\u0105 naudotoj\u0105, kuriam branduolys <strong>i\u0161jungia<\/strong> teisi\u0173 tikrinim\u0105 \u2014 tai <strong>root (UID 0)<\/strong>. Kai procesas su UID 0 atidaro fail\u0105, branduolys netikrina inode \u2014 tiesiog atidaro. Root gali skaityti <strong>\/etc\/shadow<\/strong> su slapta\u017eod\u017ei\u0173 mai\u0161omis, nu\u017eudyti bet kok\u012f proces\u0105, formatuoti disk\u0105 gyvoje sistemoje.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Tod\u0117l dirbti kaip root \u2014 bloga praktika ir rizika. Administravimui naudojama <strong>sudo<\/strong> \u2014 programa su SUID bitu, kuri laikinai pakelia UID iki 0, \u012fvykdo vien\u0105 komand\u0105 ir, kas kriti\u0161kai svarbu, visk\u0105 \u012fra\u0161o \u012f audito \u017eurnal\u0105. Saugumas neprarandant kontrol\u0117s.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">11 \u017eingsnis. Paket\u0173 tvarkykl\u0117 ir bibliotekos<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Windows naudotojai \u012fprat\u0119: randi svetain\u0119, parsisiunti .exe, spaud\u017eiai Next, ir kiekviena programa atsitempi\u0105 savo bibliotekas. Linux naudoja kitok\u012f po\u017ei\u016br\u012f \u2014 <strong>centralizuotas saugyklas<\/strong>. Tai patikrinti dvejetaini\u0173 paket\u0173 sand\u0117liai, palaikomi j\u016bs\u0173 distribucijos k\u016br\u0117j\u0173.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Kai ra\u0161ome<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>apt install nginx<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\u2014 tai ne paprastas atsisiuntimas. Paket\u0173 tvarkykl\u0117 i\u0161pakuoja paket\u0105 pagal FHS standart\u0105: dvejetainiai failai dedami \u012f <strong>\/usr\/bin<\/strong> arba <strong>\/usr\/sbin<\/strong>, konfig\u016bracijos \u012f <strong>\/etc<\/strong>, paslaug\u0173 failas \u012f <strong>\/lib\/systemd\/system<\/strong>. Ir svarbiausia \u2014 tikrina priklausomybes.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Kod\u0117l tai taip svarbu? Nes Linux programos beveik visada yra <strong>dinami\u0161kai susietos<\/strong>. Nginx dvejetainis failas sveria centus \u2014 jame n\u0117ra \u0161ifravimo ar glaudinimo kodo. Paleidimo metu jis papras\u010diausiai sako branduoliui: \u201eman reikia tokios bibliotekos&#8221;. Tos bibliotekos yra <strong>bendros<\/strong> \u2014 sistemoje yra vienas egzempliorius. Branduolys \u012fkelia bibliotek\u0105 \u012f atmint\u012f vien\u0105 kart\u0105, o Nginx, SSH klientas ir Python scenarijus tiesiog gauna nuorod\u0105 \u012f t\u0105 pat\u012f atminties region\u0105. Tai kolosalio dyd\u017eio sutaupo operatyvin\u0119 atmint\u012f.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Ta\u010diau bibliotek\u0173 versijos turi sutapti. Kai \u0161is kort\u0173 namelis gri\u016bva \u2014 tai vadinama <strong>Dependency Hell<\/strong> (priklausomybi\u0173 pragaras). Tod\u0117l reikia paket\u0173 tvarkykl\u0117s, o ne rankinio fail\u0173 kopijavimo.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">12 \u017eingsnis. Namespaces ir cgroups \u2014 i\u0161 ko sudarytas Docker<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Pabaigoje pasakysime, kad \u201ejokio Docker n\u0117ra&#8221;. Ta\u010diau i\u0161siai\u0161kinkime, k\u0105 tai rei\u0161kia.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Linux branduolys suteikia du mechanizmus, kurie kartu ir suteikia mums konteinerius.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Namespaces \u2014 aplinkos izoliacija<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Namespace \u2014 tai mechanizmas, kuris procesui sako: \u201etu matai ne vis\u0105 pasaul\u012f \u2014 tik savo jo dal\u012f&#8221;.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Yra keletas namespace tip\u0173:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>PID namespace<\/strong> \u2014 procesas mano es\u0105s PID 1 sistemoje. Nemato proces\u0173 i\u0161or\u0117je.<br><strong>NET namespace<\/strong> \u2014 procesas turi savo tinklo s\u0105saj\u0105, savo IP, savo ugniasien\u0117s taisykles.<br><strong>MNT namespace<\/strong> \u2014 procesas mato savo fail\u0173 sistemos med\u012f.<br><strong>UTS namespace<\/strong> \u2014 procesas mano turintis savo kompiuterio vard\u0105.<br><strong>USER namespace<\/strong> \u2014 procesas mano es\u0105s root \u2014 ta\u010diau tik savo namespace ribose.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Kai Docker kuria konteiner\u012f \u2014 jis tiesiog sukuria namespace rinkin\u012f ir paleid\u017eia proces\u0105 j\u0173 viduje. Procesas mano es\u0105s vienas serveryje. I\u0161 tikr\u0173j\u0173 \u0161alia sukasi \u0161imtai toki\u0173 pat \u201evieni\u0161\u0173&#8221; proces\u0173.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>         \u0160eimininkas (Linux kernel)\n\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\n\u2502  \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510  \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510   \u2502\n\u2502  \u2502 Konteineris1\u2502  \u2502 Konteineris2\u2502   \u2502\n\u2502  \u2502 (namespaces)\u2502  \u2502 (namespaces)\u2502   \u2502\n\u2502  \u2502  PID: 1     \u2502  \u2502  PID: 1     \u2502   \u2502\n\u2502  \u2502  IP: 10.0.1 \u2502  \u2502  IP: 10.0.2 \u2502   \u2502\n\u2502  \u2502  cgroups:   \u2502  \u2502  cgroups:   \u2502   \u2502\n\u2502  \u2502  512MB RAM  \u2502  \u2502  1GB RAM    \u2502   \u2502\n\u2502  \u2502  1 CPU      \u2502  \u2502  2 CPU      \u2502   \u2502\n\u2502  \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518  \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518   \u2502\n\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Cgroups \u2014 i\u0161tekli\u0173 apribojimai<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Namespaces suteikia izoliacij\u0105. Ta\u010diau k\u0105 daryti, jei procesas savo namespace viduje nusprend\u017eia suryti vis\u0105 serverio atmint\u012f?<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Tam egzistuoja <strong>cgroups (control groups)<\/strong>. Tai branduolio mechanizmas, leid\u017eiantis apriboti, kiek i\u0161tekli\u0173 gali naudoti procesas ar proces\u0173 grup\u0117:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>memory.limit_in_bytes  \u2014 maksimali operatyvin\u0117 atmintis\ncpu.shares             \u2014 procesoriaus laiko dalis\nblkio.weight           \u2014 disko \u012fvesties\/i\u0161vesties prioritetas<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">B\u016btent cgroups yra tai, k\u0105 konfig\u016bruojate Kubernetes aplinkoje, kai ra\u0161ote <strong>resources.limits<\/strong> pod manifeste. Kubernetes sako branduoliui: \u201e\u0161is procesas gali naudoti ne daugiau kaip 512MB atminties&#8221;. Jei vir\u0161ijo \u2014 ateina OOM Killer.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Taigi Docker \u2014 tai tiesiog patogi apvalkalas vir\u0161 namespaces ir cgroups. Jokios magijos. Kiekvienas Linux procesas gali naudoti \u0161iuos mechanizmus \u2014 Docker tiesiog automatizuoja ir supakuoja tai \u012f patogi\u0105 s\u0105saj\u0105.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">I\u0161vada: \u017ei\u016br\u0117kite \u012f Linux kaip in\u017einierius<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Nukeliavome nuo \u0161alto silicio iki veikian\u010dio \u017einiatinklio serverio. Dabar galvoje tur\u0117t\u0173 b\u016bti ne komand\u0173 kratinys, o ai\u0161ki vertikali strukt\u016bra:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Aparatin\u0117 \u012franga<\/strong> \u2014 kvailas silicis, kur\u012f pa\u017eadino BIOS<\/li>\n\n\n\n<li><strong>GRUB<\/strong> \u2014 \u012fkroviklis rado ir i\u0161skleid\u0117 branduol\u012f<\/li>\n\n\n\n<li><strong>Branduolys<\/strong> \u2014 diktatorius, kuris meluoja programoms apie atmint\u012f, pjausto procesoriaus laik\u0105, valdo tvarkykles<\/li>\n\n\n\n<li><strong>Sisteminiai i\u0161kvietimai<\/strong> \u2014 vienintel\u0117s durys tarp program\u0173 ir branduolio<\/li>\n\n\n\n<li><strong>systemd (PID 1)<\/strong> \u2014 stato vis\u0105 naudotojo erdv\u0117s aplink\u0105<\/li>\n\n\n\n<li><strong>Fail\u0173 sistema<\/strong> \u2014 vienas medis, kur kiekvienas failas yra skai\u010dius su prieigos teis\u0117mis<\/li>\n\n\n\n<li><strong>Procesai ir vamzd\u017eiai<\/strong> \u2014 izoliuoti konteineriai, sujungti duomen\u0173 srautais<\/li>\n\n\n\n<li><strong>Signalai<\/strong> \u2014 kaip branduolys ir procesai bendrauja tarpusavyje<\/li>\n\n\n\n<li><strong>Prieigos teis\u0117s<\/strong> \u2014 bitai inode, kuriuos branduolys tikrina kiekvieno syscall metu<\/li>\n\n\n\n<li><strong>Paketai ir bibliotekos<\/strong> \u2014 valdoma priklausomybi\u0173 ekosistema<\/li>\n\n\n\n<li><strong>Namespaces ir cgroups<\/strong> \u2014 izoliacija ir i\u0161tekli\u0173 apribojimai, i\u0161 kuri\u0173 sudarytas bet koks konteineris<\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\">Laikykite \u0161\u012f vaizd\u0105 galvoje \u2014 ir magija i\u0161nyksta. Lieka \u0161vari, sausa logika.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Matote klaid\u0105 <strong>Permission Denied<\/strong>? Tai ne \u201eLinux pyksta&#8221;. Tai branduolys, i\u0161kviesdamas <strong>open()<\/strong>, palygino j\u016bs\u0173 UID su inode bitais ir gr\u0105\u017eino klaidos kod\u0105.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Serveris l\u0117t\u0117ja, auk\u0161tas <strong>load average<\/strong>? Tai ne \u201eprocesorius pavarg\u0119s&#8221;. Planuotojo eil\u0117 tapo per ilga ir sistema eikvoja i\u0161teklius konteksto perjungimui.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Klausia apie Docker? Jo pagrindas \u2014 <strong>namespaces<\/strong> ir <strong>cgroups<\/strong>, kuriuos branduolys suteikia bet kokiam procesui. Docker \u2014 tai patogi apvalkalas vir\u0161 \u0161i\u0173 mechanizm\u0173. Suprantate branduol\u012f \u2014 suprantate konteinerius.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Pradedantysis mokosi komandas mintinai. In\u017einierius supranta, kaip teka baitai. Komand\u0105 galima rasti per 5 sekundes. Architekt\u016bros supratim\u0105 galima tik u\u017esidirbti.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Da\u017enai sakome \u201eLinux&#8221; tur\u0117dami omenyje Ubuntu, CentOS ar Debian. Ta\u010diau in\u017eineriniu po\u017ei\u016briu tai neteisinga. Linux yra branduolys. Kodo gabalas, valdantis aparatin\u0119 \u012frang\u0105. Viskas, k\u0105 matome ekrane, viskas, su kuo s\u0105veikaujame \u2014 tai tik program\u0173 rinkinys, veikiantis vir\u0161 \u0161io branduolio. \u0160iame straipsnyje i\u0161siai\u0161kinsime, kaip visa tai veikia. Prad\u0117sime nuo pat apa\u010dios. 1 \u017eingsnis. Spaud\u017eiame maitinimo mygtuk\u0105 Srov\u0117 pajud\u0117jo. Procesorius pabunda \u2014 ta\u010diau \u0161iuo momentu jis yra kvailas silicio gabalas. Jis ne\u017eino, kas yra Linux. Jis ne\u017eino, kas yra failai. Jis net ne\u017eino, kiek turi operatyvin\u0117s atminties. Jis papras\u010diausiai ie\u0161ko pirmos instrukcijos grie\u017etai u\u017ekoduotu adresu. Pirmoji paleid\u017eiama pagrindin\u0117s plok\u0161t\u0117s programin\u0117 \u012franga \u2014 BIOS arba UEFI. Jos u\u017eduotis \u2014 pa\u017eadinti aparatin\u0119 \u012frang\u0105. Ji paleid\u017eia POST (Power-On Self-Test): tikrina, ar yra atmintis, ar veikia vaizdo plok\u0161t\u0117, ar inicializavosi procesorius. Tada apklausia \u012frenginius ir ie\u0161ko, i\u0161 ko galima paleisti sistem\u0105. 2 \u017eingsnis. \u012ekroviklis \u2014 GRUB Tarkime, BIOS rado stand\u0173j\u012f disk\u0105. Bet \u0161tai problema \u2014 BIOS pats nemoka skaityti fail\u0173 sistem\u0173. Jis ne\u017eino, kas yra ext4 ar XFS. Jis negali tiesiog paimti ir atidaryti failo. Tod\u0117l jis nuskaito pirmutiniuosius 512 disko bait\u0173 (tai MBR) arba \u017evilgteli \u012f special\u0173 EFI skaidin\u012f. O ten gyvena \u012fkroviklis. Linux pasaulyje tai beveik visada yra GRUB 2. GRUB \u2014 ma\u017ea, bet protinga programa. Jos vienintel\u0117 supergalia \u2014 ji moka skaityti fail\u0173 sistemas. Ji \u017evilgteli \u012f \/boot skaidin\u012f, kur guli du kriti\u0161kai svarb\u016bs failai, be kuri\u0173 nieko ne\u012fvyks. vmlinuz \u2014 tai ir yra pats Linux. Branduolys, suspaustas \u012f dvejetain\u012f fail\u0105. Raid\u0117 z pabaigoje rei\u0161kia zip \u2014 tai yra suspaustas.initramfs \u2014 ma\u017eas laikinas archyvas. Apie j\u012f \u2014 \u0161iek tiek v\u0117liau. GRUB paima branduol\u012f, i\u0161skleid\u017eia j\u012f tiesiai \u012f operatyvin\u0119 atmint\u012f ir perduoda jam valdym\u0105. Viskas. Nuo \u0161io momento BIOS i\u0161eina par\u016bkyti \u012f \u0161on\u0105, \u012fkroviklis mir\u0161ta. Dabar sistemoje t\u0117ra vienas vir\u0161ininkas \u2014 branduolys. 3 \u017eingsnis. Vi\u0161tos ir kiau\u0161inio problema Ir \u010dia branduolys susiduria su klasikine in\u017einerine problema. Branduolys \u012fkeltas \u012f atmint\u012f. Jo u\u017eduotis \u2014 prijungti pagrindin\u012f disk\u0105, kad paleist\u0173 sistem\u0105. Ta\u010diau norint prijungti disk\u0105, reikia tvarkykli\u0173 \u2014 fail\u0173 sistemai ir disko valdikliui. O kur guli tvarkykl\u0117s? Teisingai \u2014 tame pa\u010diame diske, kurio dar negalime perskaityti, nes neturime tvarkykli\u0173. U\u017edaras ratas. B\u016btent tod\u0117l GRUB \u012fk\u0117l\u0117 antr\u0105 fail\u0105 \u2014 initramfs. Tai ma\u017eas laikinas archyvas, kuris i\u0161skleid\u017eiamas operatyvin\u0117je atmintyje kaip virtualus diskas. Viduje \u2014 mini Linux su minimaliu tvarkykli\u0173 rinkiniu. Branduolys prijungia initramfs kaip laikin\u0105 \u0161akn\u012f, i\u0161 jo \u012fkelia reikiamas tikrosios aparatin\u0117s \u012frangos tvarkykles (RAID valdikliai, NVMe, LVM), randa tikr\u0105j\u012f disk\u0105 \u2014 ir atlieka triuk\u0105 pavadinimu switch_root, tai yra \u0161aknies pakeitimas. Laikinas diskas i\u0161metamas i\u0161 atminties ir pakei\u010diamas tikruoju. Pastaba: kartais galite sutikti termin\u0105 pivot_root \u2014 tai senesnis mechanizmas. \u0160iuolaikin\u0117s sistemos su initramfs naudoja b\u016btent switch_root. Svarbu praktikoje: jei serveris u\u017estringa paleidimo metu su klaida kernel panic \u2014 branduolys \u012fstrigo b\u016btent \u010dia. Jis arba nerado initramfs, arba jame nebuvo reikiamos disko tvarkykl\u0117s. 4 \u017eingsnis. Branduolys \u2014 trys pagrindin\u0117s u\u017eduotys \u012ekroviklis atliko savo darb\u0105, tvarkykl\u0117s \u012fkeltos \u2014 patenkame \u012f kernel space. Procesoriaus architekt\u016bros po\u017ei\u016briu esame apsaugos \u017eiede Ring 0. \u010cia leid\u017eiama viskas: bet kokia procesoriaus instrukcija, bet koks atminties adresas. Linux yra monolitinis branduolys, o ne atskir\u0173 paslaug\u0173 rinkinys. Vaizdo plok\u0161t\u0117s tvarkykl\u0117, TCP\/IP tinklo steka, ext4 fail\u0173 sistemos tvarkykl\u0117 \u2014 visa tai verda viename mil\u017eini\u0161kame katile, vienoje adres\u0173 erdv\u0117je. Tai suteikia beproti\u0161k\u0105 na\u0161um\u0105, nes n\u0117ra papildom\u0173 s\u0105naud\u0173 komponent\u0173 tarpusavio komunikacijai. Ta\u010diau yra rizika: jei suklydusi tvarkykl\u0117 sugrius \u2014 ji nusitemps vis\u0105 server\u012f \u012f kernel panic. Branduolys turi tris pagrindines u\u017eduotis. 1. Atminties valdymas Pagrindin\u0117 branduolio u\u017eduotis \u010dia \u2014 meluoti. Jis meluoja m\u016bs\u0173 programoms. Kai Nginx ar Python pra\u0161o atminties, jis mano es\u0105s vienintelis sistemoje. Jam viskas atrodo kaip gra\u017ei nenutr\u016bkstama adres\u0173 juosta. Nors i\u0161 tikr\u0173j\u0173 fizin\u0117 atmintis yra fragmentuota ir duomen\u0173 gabalai i\u0161barstyti chaoti\u0161kai. Branduolys tvarko mil\u017eini\u0161k\u0105 virtualiosios atminties lentel\u0119: \u201evirtualus adresas X Nginx procesui i\u0161 tikr\u0173j\u0173 yra fizin\u0117je l\u0105stel\u0117je Y&#8221;. Tai suteikia du dalykus: izoliacij\u0105 (vienas procesas fizi\u0161kai negali pasiekti kito atminties) ir swap (jei atminties tr\u016bksta, branduolys tyliai i\u0161kelia dal\u012f duomen\u0173 \u012f disk\u0105). Ta\u010diau jei atmintis visi\u0161kai i\u0161seko ir swap taip pat pilnas \u2014 ateina OOM Killer. Ir jis ne veltui taip pavadintas. Tai tikras \u017eudikas, pasamdytas branduolio. Jis pabunda, nuskaito proces\u0173 lentel\u0119, suranda t\u0105, kuris ryja daugiausiai atminties esant \u017eemam prioritetui \u2014 ir pa\u0161auna jam \u012f kakt\u0105. Kubernetes aplinkoje tai nutinka nuolat, kai neteisingai sukonfig\u016bruoti pod\u0173 limitai. 2. Proces\u0173 planuoklis Tarkime, m\u016bs\u0173 serveryje yra 4 branduoliai, bet veikia 500 proces\u0173. Kaip jie visi dirba vienu metu? Niekada. Tai iliuzija. Branduolys naudoja preemptyvin\u0119 multitasking&#8217;\u0105. Jis leid\u017eia procesui veikti kelias milisekundes \u2014 vadinam\u0105j\u012f laiko kvant\u0105 \u2014 o paskui j\u012f priverstinai sustabdo. Tai vadinama konteksto perjungimu: branduolys i\u0161saugo dabartin\u0117s u\u017eduoties procesoriaus registro b\u016bsen\u0105, \u012fkelia kitos u\u017eduoties b\u016bsen\u0105 ir paleid\u017eia toliau. Tai vyksta t\u016bkstan\u010dius kart\u0173 per sekund\u0119. Jei steb\u0117jimo \u012frankyje matote auk\u0161t\u0105 load average, bet CPU apkrova nesiekia 100% \u2014 problema grei\u010diausiai visai nesusijusi su procesoriumi. Load average skai\u010diuoja ne tik aktyviai dirban\u010dius procesus, bet ir tuos, kurie blokuoti laukdami I\/O \u2014 \u012fstrig\u0119, kol atsakys diskas ar tinklas. Tai b\u016bsena D komandos ps i\u0161vestyje (uninterruptible sleep). Tuo metu procesorius tu\u0161\u010di\u0105ja eiga, o serveris \u201estringa&#8221;. Diagnozuoti galima per iostat arba vmstat \u2014 jei wa (I\/O wait) reik\u0161m\u0117 didel\u0117, prie\u017eastis b\u016btent ten. Konteksto perjungimas \u2014 atskira tema. Jis matomas vmstat kaip didel\u0117 cs reik\u0161m\u0117. Jei sistema i\u0161 tikr\u0173j\u0173 eikvoja resursus perjungin\u0117dama t\u016bkstan\u010dius proces\u0173 \u2014 CPU bus apkrautas, o cs reik\u0161m\u0117 \u0161oks \u012f vir\u0161\u0173. 3. Aparatin\u0117s \u012frangos abstrakcija Branduolys atlieka vert\u0117jo vaidmen\u012f. Programos naudotojo erdv\u0117je ne\u017eino aparatin\u0117s \u012frangos. \u0160tai yra Python programa, kuri ra\u0161o \u017eod\u012f \u012f fail\u0105. Ta\u010diau Python ne\u017eino, kur ra\u0161o \u2014 \u012f Samsung SSD, sen\u0105 kiet\u0105j\u012f disk\u0105 ar tinklo katalog\u0105. Kiekvienas \u012frenginys turi savo protokol\u0105, savo \u012ftampas, savo valdiklio komandas. Branduolys suteikia universali\u0105 s\u0105saj\u0105. Programa sako: \u201era\u0161yk \u012f \u0161\u012f fail\u0105&#8221;. O branduolio tvarkykl\u0117 ver\u010dia tai \u012f elektrinius signalus. D\u0117l to m\u016bs\u0173 kodas veikia vienodai ant bet kokios aparatin\u0117s \u012frangos. 5 \u017eingsnis. Sisteminiai i\u0161kvietimai \u2014 vienintel\u0117s durys \u012f branduol\u012f Tarp naudotojo re\u017eimo, kur gyvena m\u016bs\u0173 programos, ir branduolio re\u017eimo stovi betonin\u0117 siena. Procesorius fizi\u0161kai draud\u017eia naudotojo erdv\u0117s kodui kreiptis \u012f aparatin\u0119 \u012frang\u0105. Jei programa bandys tiesiogiai pasiekti aparatin\u0119 \u012frang\u0105 \u2014 procesorius j\u0105 nedelsiant sustabdys. Jokios prieigos nebus. Ta\u010diau \u0161ioje sienoje yra vienintel\u0117s \u0161arvuotos durys. Jos vadinamos sisteminiu i\u0161kvietimu (syscall). Tai grie\u017etai [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":18425,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[144],"tags":[],"class_list":["post-18428","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-linux-ru"],"jetpack_featured_media_url":"https:\/\/sysadmin.courses\/wp-content\/uploads\/2026\/03\/linux_inside.png","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/sysadmin.courses\/lt\/wp-json\/wp\/v2\/posts\/18428","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/sysadmin.courses\/lt\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/sysadmin.courses\/lt\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/sysadmin.courses\/lt\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/sysadmin.courses\/lt\/wp-json\/wp\/v2\/comments?post=18428"}],"version-history":[{"count":4,"href":"https:\/\/sysadmin.courses\/lt\/wp-json\/wp\/v2\/posts\/18428\/revisions"}],"predecessor-version":[{"id":19669,"href":"https:\/\/sysadmin.courses\/lt\/wp-json\/wp\/v2\/posts\/18428\/revisions\/19669"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/sysadmin.courses\/lt\/wp-json\/wp\/v2\/media\/18425"}],"wp:attachment":[{"href":"https:\/\/sysadmin.courses\/lt\/wp-json\/wp\/v2\/media?parent=18428"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/sysadmin.courses\/lt\/wp-json\/wp\/v2\/categories?post=18428"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/sysadmin.courses\/lt\/wp-json\/wp\/v2\/tags?post=18428"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}