HTML

Bagoj úr blogja

Kíváncsi Bagoj befigyel a Linux belsejébe, illetve különféle Linux terjesztéseket próbál ki. Ha jó napja van, scriptet ír Neked.

Friss topikok

Arch Linux: öt perc munkával öt másodperc a boot időből

2012.08.26. 19:20 bagoj ur

Boot chart on Goldfish, Arch Linux, Core2 T6500 4Gb RAM 677Mhz, SATA

Ma nagyon ráértem, ezért úgy gondoltam, megnézem, mit tudok gyorsítani a boot folyamaton. Két fronton támadtam, az egyik az initrd-ből a felesleges dolgok kigyomlálása, a másik pedig a boot folyamán nekem szükségtelen dolgok kikommentezése. Nézzük sorrendben:

1. Initrd

Még az Ubuntu kapcsán beszéltem az initrd-ről, de akkor még egyszer, nagyon dióhéjban: Az initrd egy picike (nálam 3 Mb-os) fájlrendszer egy fájlban, amely igen fontos feladatot végez. A boot idején ugyanis a kernelnek már tudnia kell kezelnie minden hardvert és sok egyebet, amely a bootoláshoz szükséges. Hogy miről is beszélek?

A Linux kernel általában egy fő részből és betölthető modulokból áll. Van kismillió hardver, amit támogatnia kell, ugye elfut az Androidos telefontól az IBM óriás szerveréig bezárólag mindenen. Ezen felül vannak kernel modulok videokártyákhoz, fájlrendszerekhez, perifériákhoz stb. Ha a kernel fordításkor az összes lehetséges drivert belefordítanánk a fő részbe, akkor lenne egy sokszor tíz megabájtos, sok memóriát foglaló kernel fájl és ez nem jó. Kitalálták tehát, hogy a fő részbe csak a legfontosabbakat teszik, minden mást modulokba szerveznek ki. Fogadjuk el, hogy ez alapvetően jó gondolat.

A probléma ott jön tehát, hogy boot esetén elindul a kernel, amiben nincs belefordítva a merevlemez és a fájlrendszer támogatás - hogy a jó életbe olvassa tehát fel a merevlemezről a modulokat, hogy betölthesse azokat? Ennek a feloldására használatos az initrd, amely, ahogy mondtam, egy kis fájlrendszer, amelynek a támogatása benne van a kernelben. Ebbe a fájlrendszerbe lerakhatjuk az összes drivert, ami a boothoz kell (és igen, ha azt gondolod, hogy ezt a telepítő megcsinálja (vagy a legújabb Archie esetén mi magunk), akkor jól gondolod! Tehát a gépeden már testre van szabva).

Fontos megjegyzés: Ide csak a boot-hoz szükséges dolgok kellenek, hiszen ha már felcsatolta a / partíciót, onnan már bármit fel tud olvasni. Azaz nem kell pl. a hangkártya és az usb-s egér meghajtójával foglalkoznunk!

Tehát összefoglalva, ebben a lépésben meghatározzuk a /etc/mkinitcpio.conf fájlban, hogy mi legyen ebben a mágikus initrd-ben. Minél kisebb az initrd, annál gyorsabban elindul majd a gépünk.

Két módszer lehetséges:

  1. Az Arch koncepcióban "hooks"-nak hívják a modulok csoportjait és a hozzájuk tartozó szkript gyűjteményt. Állíthatjuk ezeket a hook-okat, ezzel egy nagyvonalúbb, általánosabb beállítást végzünk
  2. Konkrétan meghatározhatjuk, hogy milyen modulokat tegyen bele az initrd-be, és akkor a hook-okból elég csak egyet, a "base"-t belerakni

Induljunk az egyszerűbbtől, nézzük ezt a sort:

HOOKS="base udev autodetect pata scsi sata filesystems usbinput fsck"

A "base" mindig kell. Az "udev" fog kelleni a modulok automatikus betöltéséhez. Az "autodetect" valami mágia, amely végigolvassa a /sysfs virtuálsi fájlrendszeren a betöltött moduljainkat, és az alapján készít egy whitelist-et, így nem az összes modul fordul bele az initrd-be egy kategórián belül (értsd: pl. a "filesystems" esetén nem fordul bele a hfs, reiserfs, afs stb. ha mi éppen ext4-et használunk), így kisebb lesz végül az initrd. Értelemszerűen bent hagytam emiatt.

A "pata" és "scsi" nekem nem kell, mivel a root fájlrendszerem SATA-s diszken van (ahogy szerintem legtöbbünknek). Ismét elmondom: Csak azzal kell most foglalkozni, hogy honnan bootolunk! Maradt tehát a sata, és az autodetect miatt ezen belül is csak a nekem szükséges sata_sis kernelmodul fog majd bekerülni az initrd-be. Ugyanígy a "filesystems" is kell, hiszen van fájlrendszerem, de csak az ext4 fog bekerülni majd az image-be. Remélem, érthetően írtam le, tehát nekem marad ez:

HOOKS="base udev autodetect sata filesystems fsck"

Ja, az "fsck"-ról nem írtam, én nem mertem kivenni, hiszen ha le kell ellenőrizni a fájlrendszert, akkor ez kell.

A második módszer, hogy HOOKS-nak csak a "base"-t adjuk meg, és ugyanebben a fájlban a MODULES változóba beírjuk mindazokat a modulokat, amelyek szükségesek a boot-hoz. Ezzel rendesen el lehet molyolni, és újabb tizedmásodperceket nyerni, de ragaszkodtam ahhoz, hogy nem töltök sok időt a boot optimalizálással.

Ha készen vagyunk, ne felejtsük el lefuttatni az initrd-t létrehozó parancsot:

# mkinitrd -p linux

2. /etc/rc.sysinit

Ez a szkript fut a boot elején, sokféle ellenőrzést és beállítást elvégezve. Én kikommenteztem belőle a RAID-del és LVM-mel kapcsolatos részeket; nem tudom, sokat segített-e, mivel önmagában nem teszteltem ezt a lépést.

# mv /etc/rc.sysinit /etc/rc.sysinit.orig
# sed '/print_welcome/s/^/#/' /etc/rc.sysinit.orig | sed '/FakeRAID/,/Check filesystems/s/^/#/' | sed '/monitoring of LVM2 groups/,/vgchange/s/^/#/' > /etc/rc.sysinit

A sed-es sorral kapcsolatban ajánlom melegen sed kezdőknek tanfolyamunkat.

Figyelem: természetesen ellenőrizzük le, hogy a sorok kommentezése jól sikerült-e, nem került-e hiba a szkriptbe, különben vehetjük elő a boot médiát, és nevezhetjük vissza a /etc/rc.sysinit.orig-ot az eredeti nevére!

Utóhang

Mivel érdekelt, hogy mégis milyen modulok kerültek be az initrd-be, megnéztem. Ehhez a cpio nevű programot fel kellett raknom, majd a home könyvtáramban:

mkdir Initrd
cp /boot/initramfs-linux.img Initrd/initramfs-linux.img.gz
cd Initrd
gunzip initramfs-linux.img.gz
cpio -i < initramfs-linux.img

...és máris ott volt az egész fájlrendszer előttem, kicsontozva. Betekintve a lib/modules/3.4.9-1-ARCH/ könyvtárba, ezt láttam:

crc16.ko  ext4.ko  jbd2.ko  libata.ko  mbcache.ko  pata_sis.ko  sata_sis.ko  scsi_mod.ko  sd_mod.ko

Ezek tehát azok a modulok, amik nekem a boot-hoz feltétlenül szükségesek. Érdekes látni, hogy az autodetect szépen visszarakta a pata_sis és scsi_mod modulokat... :-D

A 22 másodperces bootnak örülök, bár szerintem tudna ez még lejjebb is menni...

Még egy apró utó-utóhang: A bootchart ugye úgy megy, hogy pacman -S bootchart, majd amikor újraindítjuk a gépet, akkor a Grub menuben nyomunk egy "e" betűt, és a vmlinuz-os sor mögé odaírjuk szóközt követően, hogy init=/usr/bin/bootchartd és ezek után a /var/log alá elkészül a boot chart svg formátumban.

Szólj hozzá!

Címkék: linux hogyan arch initrd bootchart

A bejegyzés trackback címe:

https://bagojur.blog.hu/api/trackback/id/tr944733305

Kommentek:

A hozzászólások a vonatkozó jogszabályok  értelmében felhasználói tartalomnak minősülnek, értük a szolgáltatás technikai  üzemeltetője semmilyen felelősséget nem vállal, azokat nem ellenőrzi. Kifogás esetén forduljon a blog szerkesztőjéhez. Részletek a  Felhasználási feltételekben és az adatvédelmi tájékoztatóban.

Nincsenek hozzászólások.