Optimalizace bootu u Fedory 17 (z 15 na 2,5 sekund)

Tento článek ukáže, jak zkrátit dobu bootu Fedory 17. Cílem je získat rychle bootující systém s běžícím NetworkManagerem a zobrazenou přihlašovací obrazovkou GDM.

Článek původně vydal Harald Hoyer na svém blogu jako Fedora 17 Boot Optimization (from 15 to 2.5 seconds).

Používal jsem počítač Lenovo T420s (2x2x Intel(R) Core(TM) i5-2540M CPU @ 2.60GHz) s pevným diskem INTEL SSDSA2BW160G3L.

Nejprve zvolíme ruční rozdělení disku, použijeme primární oddíly a naformátujeme je jako ext4. V mém případě vznikne:

sda1 ext4 /boot
sda2 swap
sda3 ext4 /

Po prvním bootu, nastavení uživatele atd. a 2 restartech (vždy restartujte dvakrát, než začnete měřit čas, protože se přednačítání [readahead] potřebuje přizpůsobit novému bootovacímu procesu) vše aktualizujeme, spustíme prelink a nainstalujeme systemd-analyze:

$ sudo yum update
$ sudo /etc/cron.daily/prelink
$ sudo yum install systemd-analyze

Po restartech dostanu:

# systemd-analyze
Startup finished in 1413ms (kernel) + 2911ms (initramfs) + 10593ms (userspace) = 14918ms

Dalším krokem je vypnout initramfs, protože jádro umí bootovat z ext4 oddílu i bez toho. Jelikož vím, jak případně obnovit svůj systém, mohu nastavit kořenové zařízení přímo sda3 a říct jádru, jaký souborový systém použít. Můj soubor /etc/grub2.cfg vypadá takto:

linux /vmlinuz-3.3.7-1.fc17.x86_64 root=/dev/sda3 rootfstype=ext4 quiet libahci.ignore_sss=1 raid=noautodetect
#       initrd /initramfs-3.3.7-1.fc17.x86_64.img

„raid=noautodetect“ a „libahci.ignore_sss=1″ ušetří trochu času při inicializaci jádra.

Startup finished in 1640ms (kernel) + 13043ms (userspace) = 14684ms

Protože nepoužívám žádné LVM, RAID nebo šifrované disky, můžu klidně vypnout skoro všechny služby fedora-*storage*. Kromě toho vypnu bootovací obrazovku plymouth, protože chci rychlost, ne omalovánky. K vypnutí těchto služeb použijeme příkaz „systemctl mask“. Jako bonus tohoto mechanismu můžeme brát, že žádný rpm %post skript služby znovu automaticky nezapne.

$ cd /lib/systemd/system
$ for i in fedora*storage* plymouth-*.* lvm2-monitor.* mdmonitor*.*; do sudo systemctl mask $i;done

Vypadá to, že stále zbývají nějaké SysV initskripty, takže je vypneme:

$ for i in livesys livesys-late spice-vdagentd ; do sudo chkconfig $i off;done

Ušetřili jsme polovinu času v uživatelském prostoru:

Startup finished in 1640ms (kernel) + 6556ms (userspace) = 8197ms

Od této chvíle už je potřeba vědět, co děláte a jak to vrátit zpět. Abychom mohli Fedoru 17 srovnat např. s Ubuntu, vypnu teď všechny služby kromě NetworkManageru. Výsledkem bude linuxový systém bez pošty, firewallu, tisku, nástrojů abrt, avahi, některých přípojných bodů, rsyslog, irqbalance a SELinuxu.

$ cd /lib/systemd/system
$ for i in abrt*.service auditd.service avahi-daemon.* bluetooth.* dev-hugepages.mount dev-mqueue.mount \
      fedora-configure.service fedora-loadmodules.service fedora-readonly.service ip6tables.service \
      iptables.service irqbalance.service mcelog.service rsyslog.service sendmail.service sm-client.service \
      sys-kernel-config.mount sys-kernel-debug.mount; do \
    sudo systemctl mask $i; \
  done

SELinux vypneme editací souboru /etc/selinux/config a přidáním „selinux=0″ do příkazové řádky jádra. Můj soubor /etc/grub2.cfg nyní vypadá takto:

linux /vmlinuz-3.3.7-1.fc17.x86_64 root=/dev/sda3 rootfstype=ext4 libahci.ignore_sss=1 raid=noautodetect selinux=0
#       initrd /initramfs-3.3.7-1.fc17.x86_64.img

Teď už jsme opravdu rychlí!

$ systemd-analyze
Startup finished in 1329ms (kernel) + 1596ms (userspace) = 2926ms

Mám rád automatické připojování zařízení [automount] (funkce automount v systemd byla můj nápad :-)), takže změním /boot na přípojný bod s připojením na vyžádání. Adresář /tmp nastavíme na tmpfs, což je jeden ze způsobů, jak omezit diskovou aktivitu (užitečné např. pro pomalý flashdisk). Výsledný soubor /etc/fstab vypadá takto:

/dev/sda3  /          ext4    defaults        1 1
/dev/sda1  /boot      ext4    noauto,comment=systemd.automount     1 2
/dev/sda2  swap       swap    defaults        0 0
tmpfs      /tmp       tmpfs   defaults        0 0

To ušetřilo jen trochu času, ale i tak:

$ systemd-analyze
Startup finished in 1342ms (kernel) + 1426ms (userspace) = 2769ms

Vzhledem k tomu, že je NetworkManager také spouštěn cílem „grafické přihlášení“, mohu ho odstranit z cíle „multi-user“ a spustí se souběžně s přihlašovací obrazovkou GDM.

$ sudo rm  /etc/systemd/system/multi-user.target.wants/NetworkManager.service

To ukrojí několik milisekund:

$ systemd-analyze
Startup finished in 1323ms (kernel) + 1279ms (userspace) = 2603ms

Aby bylo poznat, jak velký rozdíl způsobuje přednačítání, dočasně ho vypnu a restartuji:

$ cd /lib/systemd/system
$ for i in *readahead*; do sudo systemctl mask $i;done

Což nám dá:

$ systemd-analyze
Startup finished in 1336ms (kernel) + 1210ms (userspace) = 2547ms

Tento čas je trochu zavádějící. Ačkoliv se zdá rychlejší, skutečná doba před objevením přihlašovací obrazovky je delší. Takže k férovému srovnání bychom potřebovali stopky.

$ sudo dracut -f

A tady je doba se znovu zapnutým přednačítáním a initramfs (regenerované):

$ systemd-analyze
Startup finished in 803ms (kernel) + 2217ms (initramfs) + 1018ms (userspace) = 4039ms

I to lze samozřejmě optimalizovat – sestavením initramfs bez plymouth a v režimu host-only.

$ sudo dracut -f -H -o plymouth

Po restartu dostanu úžasný výsledek:

$ systemd-analyze
Startup finished in 612ms (kernel) + 499ms (initramfs) + 1330ms (userspace) = 2443ms

Na příkazu „systemctl mask“ je pěkné, že jej můžete vždy vrátit pomocí „systemctl unmask“ a povolit tak služby, které opravdu potřebujete.

Hodně zábavy a šťastné restarty!

A nezapomeňte restartovat dvakrát, aby začala působit optimalizace přednačítání!

Vydáno s licencí Creative Commons BY-SA 3.0.

15 komentářů u “Optimalizace bootu u Fedory 17 (z 15 na 2,5 sekund)

  1. Díky. Vzhledem k tomu, že mne na fóru zajímalo, kdo ho ma kratšího, tak tohle mi pomůže se přiblížit ostatním.

  2. Přepokládám že takhle rychle boot dostanu pouze s SSD, na kolik to pomůže s běžným HHD? Moje Fedora rawhide startuje asi minutu a půl (KDE) ale vyplatí se. Navíc je poodle mě stejně pohodlnější hibernovat.

  3. Hlavni problem pri bootu u fedory 16 je to, ze pro kazdy posbirany sitovy nastaveni (mozna jen wifi – nejsem si jistej) se z nejakeho duvodu ceka 20s. Bezne pouzivam 3, takze jsem na minute – a obcas se pripojuju jeste v hospode a to se mi pak prida dalsi, takze se to jeste prodluzuje.

    Vetsinou to resim tak, ze zapnu pocitac a jdu si uvarit nejakej dobrej caj.

  4. Clanok je popularne-nah**no.
    Nevysvetluje konsekvencie kazdeho prikazu (dokonca ich casto mergne do one-linera).
    Vypnut selinux nie je nieco co by malo byt brane nalahko. Vacsina userov to nechape ale vdaka pravidlam v fedore to useri ani chapat nemusia.
    Co takto napisat podobny clanok na widle v ktorom odporucis vypnut firefewall, antivir a pre istotu aj updaty pretoze ich nastartovanie trva 5 sek (ok, su to vidle takze 15)?

    • > Nevysvetluje konsekvencie kazdeho prikazu

      Autor předpokládá jistou úroveň znalostí čtenářů.

      > Co takto napisat podobny clanok na widle v ktorom odporucis vypnut firefewall, antivir

      Vypnutí antiviru a fw ve Windows by téměř jistě mělo výrazně horší následky než vypnutí SELinuxu ve Fedoře.

    • Skutecne je to trochu bez konsekvenci, ale neni to vetsinou nic fatalniho a irreversibilniho.
      Jako drobny problem postupu vidim napr. to, ze sestaveni initramfs bez pymouthu je jen pro aktualni kernel. Pri dalsi instalaci se opet sestavy kompletni a s plymouth…

  5. Můžete mi poradit, jsem začátečník?mám arch bang 2012.12 na vmware) Na zkoušku vypnutl jsem initrd (hraje roli, že v článku se zminuje initramfs). Pak se objevil kernel paňic „not syncing vfs -vfs: unable to mount root fs on unknown-block(0,0) \n… Pid 1 ,comm:swapper/0 not tainted 3.6.8-1 # \n call trace…“

    mám, syslinux, oddíly mbr: boot ext2, swap, root ext4.
    Bootovací příkaz archu:
    .linux vmlinuz root=UUID=abcd….123 ro initrd=initramfs-linux.img
    odstranil jsem initrd a za ro přidal rootfstype=ext4

    Nevíte, v čem je problém? Tuším, že systém nenajde root.

Napsat komentář

Vaše emailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *

Můžete používat následující HTML značky a atributy: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

Nápověda ke komentování

Při psaní komentáře můžete využít HTML značky <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> .