[[oktatas:linux|< Linux]] ====== Boot ====== * **Szerző:** Sallai András * Copyright (c) 2011, Sallai András * Szerkesztve: 2011, 2013, 2017 * Licenc: [[https://creativecommons.org/licenses/by-sa/4.0/|CC BY-SA 4.0]] * Web: https://szit.hu ===== Bevezetés ===== A hibaelhárításhoz fontos ismerni a rendszerindítási folyamatot. Az alábbi leírásban megnézzük pontról-pontra mi történik a rendszer indulásakor. A leírás egy része a https://wiki.debian.org/systemd oldal egy részének a fordítása. ===== Boot folyamatok ===== A következő felsorolásban, megtekinthetjük milyen rendszerek vesznek részt a rendszer elindulásában, sorrendben: * BIOS -- a BIOS futtatja a MBR-ben található kódot * MBR -- az MBR futtatja a GRUB-ot * GRUB -- A GRUB futtatja kernelt * kernel -- futtatja az /sbin/init folyamatot * init -- futtatja a futási szintű programokat * futási szinteken induló programok A gép bekapcsolása után a memória üres, a processzor alapállapotba kerül. A végrehajtást a gép BIOS-a számára adja át, amelynek címe: 0xFFFF FFF0 A BIOS a hardver tesztelése és előkészítése után, betölti az indítható eszköz fő betöltőszektorát, az MBR-t. Az MBR átadja a vezérlést az indítani kívánt eszköz betöltő szektorára (boot szektor). A betöltő szektor elindítja a kernelt, ha kell paraméterezve. A kernel betöltése után szükségünk van egy rendszerpartícióra. Ha fájlrendszer meghajtója modulként van fordítva, akkor ez a rendszerpartíció közvetlenül nem csatolható. A megoldás egy initrd nevű képfájl és a linuxrc script vagy bináris használata jelenti. Ezek segítségével felcsatolható a valódi rendszerpartíció, ahol elindul a systemd. A Debian 9 rendszeren ez valójában még mindig egy init folyamat, de már a systemd része. A CentOS 7-en már konkrétan a systemd nevű démon indul. A systemd a beállításoknak megfelelően elindítja a rendszer szolgáltatásait. A rendszer a SysVinit korában úgynevezett futási szinteket tartalmazott. Minden futási szinten más-más szolgáltatás, indult, állt le. A Systemd rendszerben a számokat nevek váltják le, amelyeket nem szinteknek, hanem céloknak (target) nevezünk. ===== A systemd ===== A systemd a linuxos rendszer és szolgáltatásainak menedzsere. A DebianJessie változata óta a Debian rendszerekben alapértelmezés a SysV után. A systemd kompatibilis a SysV-al és az LSB init scriptekkel. A systemd tulajdonságai: * agresszív párhuzamosságot biztosít * socket és D-Bus aktiválást használ a szolgáltatások indításához * a démonok igény szerint variálva indíthatók * tranzakciós függőségkezelési logikát alkalmaz * a linuxos cgroupok segítségével követi a folyamatokat * támogatja a pillanatfelvételt és a helyreállítást * támogatja a mount és automount pontokat Az induló rendszeren a systemd kapja a 1-es PID-et. A Debian ps ax kimenete megtéveszthet minket, mert létezik a /sbin/init, ami valójában egy szimbolikus link a /lib/sysmtemd/systemd állományra. A systemd feladatai unitokba vannak szervezve. A legáltalánosabb unitok a szolgáltatás (.service), csatolási pont (.mount), eszközök (.device), socketek (.socket) vagy az időzítők (.timer). A példa kedvééért a a secure shell démon unitja ssh.service. Minden unit egy önálló konfigurációs fájlban van definiálva. A unit fájlok kiterjesztése mutatja annak típusát. A unitok a /lib/systemd/system könyvtárban találhatók. Ha egy azonos nevű fájl létezik a /etc/systemd/system könyvtárban, akkor a systemd figyelmen kívül hagyja a /lib/systemd/system könyvtárban lévőt. A rendszergazda a /etc/systemd/system könyvtárban elhelyezett fájlokkal szabja testre a rendszert. Egyes unitokat a systemd úgy állít elő, hogy a fájlrendszerben nem tartozik hozzá állomány. A systemd minden szolgáltatást egy erre a célra kijelölt vezérlőcsoportba (cgroup) helyez. A modern kernelek támogatják az erőforrások csoportok alapján történő elosztását. ===== Függelék ===== ==== A SysVinit futási szintjei ==== Nyolcféle futási szinttel van dolgunk. | 0 | A rendszer leállásakor végrehajtódó műveletek. | | 6 | Újraindításkor végrehajtandó műveletek. | | S | A rendszer indulásának egy fázisában egyfelhasználós mód. | | 1 | Alaprendszert indító egyfelhasználós mód | | 2 | Általános több felhasználós mód (Debian GNU/Linuxon alapértelmezés). | | 3 | Általános több felhasználós mód. | | 4 | Általános több felhasználós mód. | | 5 | Általános több felhasználós mód. | Az aktuális futási szint a következő paranccsal kérdezhető le: runlevel Az eredmény például: N 2 Az eredményben az előző futási szint is megjelenik. Ha az előző "N", akkor nem volt még más futási szint. Minden futási szintnek van egy könyvtára, ahova scripteket linkelünk be szimbolikusan. Ezek a scriptek lefutnak az adott futási szintre lépéskor. Az egyes futási szinteknek megfelelő könyvtárak Debian GNU/Linuxon: /etc/rc0.d /etc/rc1.d /etc/rc2.d /etc/rc3.d /etc/rc4.d /etc/rc5.d /etc/rc6.d /etc/rcS.d Mint azt fentebb említettük ide nem szokás állományokat másolni, ide csak linkelünk. Az egyes szolgáltatások scriptjei a következő könyvtárban szokás elhelyezni: /etc/init.d/ Ebből a könyvtárból linkelünk az egyes futási szintekre. Ha belenézünk rc0.d, stb, könyvtárba, azt látjuk, hogy minden link egy S vagy K betűvel kezdődik, majd egy kétjegyű szám követi. Az S karaktert akkor használjuk, ha azt szeretnék, hogy az adott futási szintre lépre az adott szolgáltatás elinduljon. A K betűt pedig akkor használjuk, ha leakarjuk állítani a szolgáltatást. A számok prioritást határoznak meg. Amely linknek kisebb a száma, az a szolgáltatás előbb indul. Minden többfelhasználós futási szint végén a következő script lefut: /etc/rc.local ==== Scriptek, démonok indítása, leállítása ==== Ha szeretnénk egy scriptet induláskor lefuttatni, akkor két lehetőségünk van. A legegyszerűbb ha /etc/rc.local fájlban felveszem, útvonalastul, mindenestül, mivel ez minden többfelhasználós futási szinten (2, 3, 4, 5) lefut. A másik lehetőség, hogy beteszem egy futás szintre. Másoljuk a scriptet a következő könyvtárba: /etc/init.d Állítsuk be például a sajat.sh nevű scriptet, amelynek útvonala a következő: /root/bin/sajat.sh cp /root/bin/sajat.sh update-rc.d sajat.sh defaults Most töröljük a futásiszintekről: update-rc.d sajat.sh remove Ha precízebbek szeretnénk lenni a scriptet a következő minta alapján készítsük el: /etc/init.d/skeleton Ezen fájl alapján készítsük el a script fejlécét a BEGIN INIT INFO és END INIT INFO közötti rész scriptünkbe másolásával, átírásával. Olvasni valók: man update-rc.d man insserv ===== Linkek ===== * https://wiki.debian.org/systemd * http://www.thegeekstuff.com/2011/02/linux-boot-process/ * http://unixlinux.tmit.bme.hu/A_bootfolyamat * http://oldfield.wattle.id.au/luv/boot.html * http://milindchoudhary.wordpress.com/2009/03/30/linux-boot-process/ * http://en.wikipedia.org/wiki/Linux_startup_process * http://lateral.netmanagers.com.ar/stories/23.html * http://ubuntu.hu/node/13573 Kapcsolódó: * http://hu.wikipedia.org/wiki/Boot * http://wiki.hup.hu/index.php/Pc_boot_folyamat * http://en.wikipedia.org/wiki/NTLDR Élet systemd nélkül: * [[http://without-systemd.org/wiki/index.php/How_to_remove_systemd_from_a_Debian_jessie/sid_installation|http://without-systemd.org/]] * http://without-systemd.org/wiki/index.php/Debian_Stretch