Difference between revisions of "Arch boot process (Česky)"
Kynikos.bot (talk | contribs) (wikify some external links, use https for archlinux.org) |
m (→Example: update path.) |
||
Line 198: | Line 198: | ||
Adding the following file will disable the write-back cache on a hard drive <i>before</i> any daemons are started (useful for drives containing MySQL InnoDB files). | Adding the following file will disable the write-back cache on a hard drive <i>before</i> any daemons are started (useful for drives containing MySQL InnoDB files). | ||
{{hc|/etc/rc.d/functions.d/hd_settings|hd_settings() { | {{hc|/etc/rc.d/functions.d/hd_settings|hd_settings() { | ||
− | / | + | /usr/bin/hdparm -W0 /dev/sdb |
} | } | ||
add_hook sysinit_udevsettled hd_settings | add_hook sysinit_udevsettled hd_settings |
Revision as of 12:49, 25 May 2013
Template:Article summary start Template:Article summary text Template:Article summary heading Template:Article summary text Template:Article summary heading Template:Article summary wiki Template:Article summary wiki Template:Article summary end
Tento článek má za úkol podat chronologický přehled průběhu bootování v distribuci Arch a také výčet s tím souvisejících systémových souborů a procesů s odkazy na relevantní wiki články, kde to je zapotřebí. Jak je známo, Arch následuje BSD init konvenci na rozdíl od častěji používané SysV metody. To znamená, že nejsou velké rozdíly mezi runlevely, neboť systém je standardně nastaven tak, že používá stejné moduly a procesy ve všech runlevelech.Výhodou je, že uživatelé mohou jednoduše nastavit průběh startu systému (viz. rc.conf); nevýhodou ale je ztráta možnosti některých jemných nastavení, které nabízí SysV. V článku Adding Runlevels (Česky) je popsán způsob, jak nahackovat některé jakoby SysV schopnosti do Archu. V článkuWikipedia:init jsou popsány další rozdíly mezi SysV a BSD metodou.
Contents
Before init
Poté, co je sytém zapnut a POST dokončen, nalezne BIOS preferované bootovací médium a předá kontrolu programu v Master Boot Record (Česky) na tomto médiu. Na GNU/Linux počítači se často v MBR nalézá bootloader jako je např. GRUB (Česky) nebo LILO (Česky). Bootloader pak uživateli nabídne možné operační systémy pro bootování, např. Arch Linux a Windows v tzv.dual-boot sestavě. Jakmile je Arch zvolen, dekomprimuje se a naloaduje do paměti obraz jádra (momentálně kernel26.img
) ze složky /boot
v souborovém systému na médiu.
Jádro je základ operačního systému. Operuje v nízké úrovni systému (kernelspace) a zprostředkovává interakce mezi hardwarem a programy. K dosažení efektivního využití CPU používá jádro plánovač, který určuje, jaký program bude mít v daném okamžiku prioritu, čímž docílí iluze, že je více programů prováděno zároveň.
Poté, co se jádro naloaduje, načte informace z initframs (initial RAM filesystem). Účel initramfs je zavést systém do stavu, kdy už má přístup ke kořenovému souborovému systému (viz. FHS ). To znamená, že moduly potřebné k přístupu k zařízením jako jsou např. IDE, SCSI, or SATA disky (nebo USB/FW, v případě bootování z USB/FW disku) musí být naloadovány. Jakmile se z initramfs naloadují správné moduly, buď manuálně, nebo prostřednictvím udev, předá se kontrola zpět jádru a bootování pokračuje. Díky tomu musí v initramfs být pouze moduly potřebné k přístupu ke kořenovému souborovému systému, tudíž nemusí obsahovat všechny ostatní moduly, které by mohly být kdy použity, protože většina modulů bude naloadována později během init procesu.
Pak jádro vyhledá init
program, který se nachází v /sbin/init
. init
závisí na glibc
, GNU C knihovně. Knihovny jsou sbírky často používaných programových rutin a jsou snadno identifikovatelné rdíky jejich souborové příponě *.so
. Jsou nezbytné pro základní funkčnost systému. Tato část bootování se nazývá early userspace.
init: Arch bootovací skripty
Hlavní spouštěcí proces v Archu je inicializován programem init
, který zavolá všechny ostatní procesy. Účelem init
je dovést systém do použitelného stavu využitím bootovacích skriptů. Jak už bylo řečeno, Arch používá BSD-style boot skripty. init
načte soubor /etc/inittab
; standardní inittab
začíná tímto:
/etc/inittab
... # Boot to console id:3:initdefault: # Boot to X11 #id:5:initdefault: rc::sysinit:/etc/rc.sysinit rs:S1:wait:/etc/rc.single rm:2345:wait:/etc/rc.multi rh:06:wait:/etc/rc.shutdown su:S:wait:/sbin/sulogin ...
První nezakomentovaný řádek definuje implicitní systémový runlevel (3). Když jádro zavolá init:
- Nejdřív se spustí inicializační skript
/etc/rc.sysinit
(což je Bash skript). - Jestliže je definován single user mode (runlevel 1 nebo S), spustí se skript
/etc/rc.single
. - Pro jakýkoli jiný runlevel (2-5) se spustí skript
/etc/rc.multi
. - Poslední spuštěný skript je
/etc/rc.local
(prostřednictvím/etc/rc.multi
), který je standardně prázdný.
/etc/rc.sysinit
rc.sysinit
je obsáhlý skript, který v se podstatě postará o všechno nastavení hardwaru a další obecné inicializační úlohy. Jeho spuštění lze poznat díky jeho prvním úkonům - vypsání těchto řádků:
Arch Linux https://www.archlinux.org Copyright 2002-2007 Judd Vinet Copyright 2007-2010 Aaron Griffin Distributed under the GNU General Public License (GPL)
Hrubý přehled úloh:
- Zavolá (prostřednictvím programu source)
/etc/rc.conf
skript - Zavolá
/etc/rc.d/functions
skript - Zobrazí uvítací zprávu
- Namountuje různé virtuální souborové systémy
- Vytvoří soubory reprezentující formální zařízení
- Spustí minilogd
- Zobrazí output programu dmesg
- Nastaví hardwarové hodiny
- Vyprázdní soubor
/proc/sys/kernel/hotplug
- Spustí udev zkontroluje udev události
- Spustí loopback rozhraní
- Naloaduje moduly definované v
MODULES
poli,které je definováno vrc.conf - Nastaví RAID a mapování zašifrovaných souborových systémů
- Provede vynucenou kontrolu oddílů (fsck) v případě, že se v souboru /etc/fstab nacházejí potřebné instrukce
- Namountuje lokální oddíly a swap oblasti (síťové disky nejsou namountovány, dokud není aktivován síťový profil)
- Aktivuje swap oblasti
- Nastaví hostname, lokální a systémové hodiny na základě definic v
rc.conf
- Odstraní různé zbylé/dočasné soubory, např.
/tmp/*
- Nastaví lokalizaci, mapování konzole a klávesnice
- Nastaví font pro konzole
- Vypíše výstup dmesg do
/var/log/dmesg.log
/etc/rc.sysinit
je skript a není určen pro deklarace různých nastavení, protože zavolá (programem source - načte a zdědí proměnné a funkce) rc.conf kvůli nastavením /etc/rc.d/functions
kvůli funkcím, které vytváří grafický výstup (hezké barvy, zarovnání, přepínání 'busy' na 'done', atd.). Tudíž neexistuje žádný zvláštní důvod pro editaci tohoto souboru, kromě případu, kdy záměr je urychlit bootování.
/etc/rc.single
Single-user mód nabootuje přímo do root účtu a měl by tedy být použit pouze v případě, že nelze nabootovat normálním způsobem. Tento skript zaručí, že budou spušteni pouze tito démoni: syslog-ng a udev. Tento mód je vhodný pro opravu sytému v případě, že je potřeba zamezit přístupu ostatních uživatelů, kteří by mohli způsobit ztrátu dat apod. Z toho módu lze pokračovat do multi-user módu zadáním příkazu 'exit'.
/etc/rc.multi
/etc/rc.multi
is run on any multi-user runlevel (i.e. 2, 3. 4 and 5) which basically means any ordinary boot. Typically, users will not notice the transition from rc.sysinit
to rc.multi
as rc.multi
also uses the functions file to produce output. This script has three tasks:
- First, it runs sysctl (to modify kernel parameters at runtime) which applies the settings in
/etc/sysctl.conf
. Arch has very few of these by default; mainly networking settings. - Secondly, and most importantly, it starts daemons, as per the
DAEMONS
array inrc.conf
. - Finally, it will run
/etc/rc.local
.
/etc/rc.local
rc.local
is the local multi-user startup script. Empty by default, it is a good place to put any last-minute commands the system should run at the very end of the boot process. Most common system configuration tasks (like loading modules, changing
the console font, or setting up devices) usually have a dedicated place where they belong. To avoid confusion, ensure that whatever one intends to add to rc.local
is not already residing in /etc/profile.d
, or any other existing configuration location instead.
When editing this file, keep in mind that it is run after the basic setup (modules/daemons), as the root user, and whether or not X starts. Here is an example which just un-mutes the ALSA sound settings:
/etc/rc.local
#!/bin/bash # /etc/rc.local: Local multi-user startup script. amixer sset 'Master Mono' 50% unmute &> /dev/null amixer sset 'Master' 50% unmute &> /dev/null amixer sset 'PCM' 75% unmute &> /dev/null
Another common usage for rc.local
is to apply various hacks when one cannot make the ordinary initialization work correctly.
Custom hooks
Hooks can be used to include custom code in various places in the rc.* scripts.
Hook Name | When hook is executed |
---|---|
sysinit_start | At the beginning of rc.sysinit |
sysinit_udevlaunched | After udev has been launched in rc.sysinit |
sysinit_udevsettled | After uevents have settled in rc.sysinit |
sysinit_prefsck | Before fsck is run in rc.sysinit |
sysinit_postfsck | After fsck is run in rc.sysinit |
sysinit_premount | Before local filesystems are mounted, but after root is mounted read-write in rc.sysinit |
sysinit_end | At the end of rc.sysinit |
multi_start | At the beginning of rc.multi |
multi_end | At the end of rc.multi |
single_start | At the beginning of rc.single |
single_prekillall | Before all processes are being killed in rc.single |
single_postkillall | After all processes have been killed in rc.single |
single_udevlaunched | After udev has been launched in rc.single |
single_udevsettled | After uevents have settled in rc.single |
single_end | At the end of rc.single |
shutdown_start | At the beginning of rc.shutdown |
shutdown_prekillall | Before all processes are being killed in rc.shutdown |
shutdown_postkillall | After all processes have been killed in rc.shutdown |
shutdown_poweroff | Directly before powering off in rc.shutdown |
To define a hook function, create a file in /etc/rc.d/functions.d using:
function_name() { ... } add_hook hook_name function_name
Files in /etc/rc.d/functions.d are sourced from /etc/rc.d/functions
.
You can register multiple hook functions for the same hook, as well as registering the same hook function for multiple hooks. Don't define functions named add_hook or run_hook in these files, as they are defined in /etc/rc.d/functions
.
Example
Adding the following file will disable the write-back cache on a hard drive before any daemons are started (useful for drives containing MySQL InnoDB files).
/etc/rc.d/functions.d/hd_settings
hd_settings() { /usr/bin/hdparm -W0 /dev/sdb } add_hook sysinit_udevsettled hd_settings add_hook single_udevsettled hd_settings
First it defines the function hd_settings, and then registers it for the single_udevsettled and sysinit_udevsettled hooks. The function will then be called immediately after uvents have settled in /etc/rc.d/rc.sysinit
or /etc/rc.d/rc.single
.
init: Login
By default, after the Arch boot scripts are completed, the /sbin/agetty
program prompts users for a login name. After a login name is received, /sbin/agetty
calls /bin/login
to prompt for the login password.
Finally, with a successful login, the /bin/login
program starts the user's default shell. The default shell and environment variables may be globally defined within /etc/profile
. All variables within a user's home directory shall take precedence over those globally defined under /etc
. For instance, if two conflicting variables are specified within /etc/profile
and ~/.bashrc
, the one dictated by ~/.bashrc
shall prevail.
Other options include mingetty which allows for auto-login and rungetty which allows for auto-login and automatically running commands and programs, e.g. the always useful htop.
The majority of users wishing to start an X server during the boot process will want to install a display manager, and see Display Manager for details. Alternatively, Start X at Boot outlines methods that do not involve a display manager.