[ Dejan Lozanovic @ 02.10.2001. 19:07 ] @
E moze li neko da mi kaze kako ide ceo tok dizanja linuxa, mislim sta se sve i kojim redom ucitava kada nakon Lilo-a na odaberem linux. mislim odakle sve to pocinje i koji se fajlovi ucitavaju i kojim redom.

[Ovu poruku je menjao maksvel dana 02.12.2011. u 14:07 GMT+1]
[ Dragoslav Krunić @ 02.10.2001. 19:41 ] @
Jednostavnom pretragom "linux boot process" na Google-u, dosao sam i do
ovog zanimljivog linka:
Sta se desava kada se starta Linux?
gde je sve savim lepo objasnjeno.
[ leka @ 02.10.2001. 22:45 ] @
Nije sve onako kako NIHAD kaze u svom (zanimljivom) tekstu... Odmah da sasecem neke moguce komentare - ja koristim RedHat, ali ono sto sam hteo da kazem je: verovatno ste primetili da covek objasnjava sve sa osvrtom na RedHat Linux distribution... Pa... skoro da sve Linux distribucije tako funkcionisu kako je on napisao, ali nije tako... Normalno, neke "lowlevel" stvari su iste za sve Linux-e, jer kad bi se te stvari promenile onda to ne bi bio Linux, ali mnoooge stvari koje covek pominje u svom tekstu NISU iste u drugim distribucijama!
Recimo, kuci koristim pored RedHat-a i SlackWare, Stampede i Debian, i, verujte svaka od pomenutih distribucija ima neke svoje "bubice"...

Ukratko:
1) LILO (u tekstu pise da se nalazi u MBR, na prvom disku i tako dalje sto takodje NE MORA DA BUDE TACNO!) startuje boot proces
2) bootuje se kernel
3) kernel montira svoj fajlsistem
i to je to, nakon toga razne Linux distribucije rade po svome. Tacno, sve je to slicno, ali postoje i razlike!

Moj predlog je da ako niste RedHat korisnici ne citate ovaj tekst. Jer ce samo vise (verovatno) da vas zbuni...

Ovde svracaju ljudi koji koriste neke druge distribucije vise, i mozda bi bilo bolje da nam oni objasne malo vise kako (recimo Alex koristi Debian-a koliko se secam...) njihova distribucija "funka"

Pozdrav
[ Riste Pejov @ 03.10.2001. 03:45 ] @
Da init scripte su razlicite za svih ... mislim ako jedino sporegjujes RH sa Mandrakom ...
u svakom slucaju ... najbolje init skripte ima Slack ...
svigja mi se to sto su linearno ( isto kao kod FreeBSD-a )
i najlakse za sredzivanje ...

a i to je najmarkantnije nesto u cemu se razlikuju distroa u boot procesu

[ random @ 03.10.2001. 14:05 ] @
Ma tekst je prilično loš — samo jedan pasus je potrošio na sve što se dešava otkako se upali računar do trenutka kad se podigne init, pa je onda naširoko prepričavao RH init skriptove, koje možeš i sam da pročitaš. Mnogo je zanimljivije reći, npr. da LILO nije jedini način da se podigne kernel (tu su loadlin loadlin, grub). A čak i ako se koristi LILO, i tu ima mnogo šta da se kaže.

1) Računar se upali, x86 procesor inicijalizuje sve svoje registre, bafere i cache na neke default vrednosti i ulazi u realni mod. IP (instruction pointer) registar se postavlja na 0xFFF0, CS (segmentni registar) dpokazuje na baznu adresu 0xFFFF0000 — i izvršavanje instrukcija znači počinje na adresi 0xFFFFFFF0, a to je početna adresa dela memorije gde je čipset mapirao EPROM. Kôd u EPROMu uglavnom setuje IDT (deskriptor tabelu prekidnih rutina) i zatim startuje BIOS. BIOS uradi POST, zatim na osnovu informacija pohranjenih u CMOS-u bira disk sa koga će se bootovati sistem. Čita prvi sektor 512 bajtova sa tog diska (koristeći interapt 19h) — u slučaju hdd-a to je tzv. Master Boot Record — oni se mapiraju u memoriju na adresu 0x7C00 i izvršava ih kao čist real-mode asm. Zapravo pre no što počne da ih izvršava proveri da li su dva zadnja bajta u sektoru AA55h, što je neka gruba provera da li je u pitanju butabilan disk ili ne. Zadatak ovih 512 bajtova je, recimo ako je u slučaju LILO, da prvo učitaju ostatak kôda za bootloader (jer ne može ceo onaj meni i kôd za parsiranje opcija da stanu u 512B, probajte da napravite LILO sa 20 kernela), koji se nalazi u /boot pri instalaciji LILO-a, pri čemu LILO pamti fizičke adrese tih fajlova, kao i kernel image-a, jer, opet, u 512B ne može da se smesti drajver za ext2fs.

2) Kad je LILO učitan, radi parsiranje opcija i njihovo predavanje kernelu (samo o ovome postoji čitav jedan HOWTO!). Najvažnija od ovih opcija je navođenje particije koja će biti privremeno mountovana kao / i sa koje će se učitati init, kao i informacije o zahtevanom video modu.

3) Lilo startuje kernel. Kernel je zapravo jedan (ne)običan program, možete ga gledati kao jednu vrstu izvršnog fajla. Prvi deo Linux kernela je napisan u asm-u (arch/i386/boot/bootsect.S). Ovaj kôd učita prvo sebe na adresu 0x90000, i ostatak kernela na 0x10000. Prikazuje se poruka „Loading....”. Zatim se izvršava kôd iz boot/Setup.S. Ovaj kôd identifikuje neke najosnovnije podatke o sistemu, kao i tip grafičke karte. Ako mu je predata odgovarajuća opcija on traži od korisnika da izabere VGA mod za konzolu. Zatim kopira ceo sistem sa 0x10000 na 0x1000, prebacuje sistem u protected mode, zatim postavlja EIP na 0x1000 i tu se nastavlja podizanje sistema.

4) Eto nas u protected modu! Kôd na adresi 0x1000 je onaj iz boot/head.S, služi da inicijalizuje registre i raspakuje kernel (decompress_kernel() funkcija koja koristi kôd iz inflate.c, unzip.c i misc.c). Raspakovani kernel ide na adresu 0x100000.

5) Inicijalizuju se tabele prekidnih rutina, paging, identifikuju se procesor i koprocesor, i startuje se start_kernel() funkcija (i iz nje se više nikad ne izađe). Tu se radi inicijalizacija memorije, IRQ kanala, schedulera, svih drajvera, kao i parsiranje opcija komandne linije (koje je kernelu predao LILO), i još neke stvari. Tu se negde pri kraju i mountuje inicijalno root particija kao read-only.

6. Kernel "ručno" kreira proces sa rednim brojem 0 (idle process). Prelazi u user mode, gde idle process fork()-uje init (koji dobija PID 1). Tradicionalno na UNIX sistemima proces 0 (koji je jedini proces na bilo kom UNIXu koji se ne kreira pomoću fork() sistemskog poziva), kada fork()-uje init, postaje proces po imenu swapper i kontroliše rad sa virtuelnom memorijom.

7. init proces pokušava da exec()-uje program koji mu je zadat parametrom init=<nešto>, ili /sbin/init ako ovaj parametar nije prosleđen. Ako ne nađe init program eventualno će pokušati da fork()-uje interaktivni shell.

8. Ako ga nađe, init se startuje (poruka INIT: version x.xx booting) i izvršava prvi rc skript — od ove tačke nadalje već sve zavisi od distribucije.

9. Dalje neću da pišem, pročitajte init skriptove.

Eto, ovo je samo pogled iz aviona na ono što se dešava pri bootovanju Linuxa, a ipak je u poređenju sa tim onaj tekst pogled iz svemirskog broda u orbiti oko Plutona. E, da, ako ima grešaka, konsultovao sam ovde Kernel Hacker's Guide (potražiti na linuxdoc.org), pa je moguće da se nešto sitno promenilo do verzije 2.4, ali u principu je to to.


[Ovu poruku je menjao random dana 09.01.2003. u 21:08 GMT]
[ anon315 @ 06.10.2001. 02:44 ] @
CLAP CLAP CLAP ! :)
[ some1else @ 12.01.2003. 14:22 ] @
random. vrlo dobar detaljan opis.
thank you. respect
[ pera detlich @ 15.07.2005. 13:23 ] @
Citat:
random: Ma tekst je prilično loš — samo jedan pasus je potrošio na sve što se dešava otkako se upali računar do trenutka kad se podigne init, pa je onda naširoko prepričavao RH init skriptove, koje možeš i sam da pročitaš. Mnogo je zanimljivije reći, npr. da LILO nije jedini način da se podigne kernel (tu su loadlin loadlin, grub). A čak i ako se koristi LILO, i tu ima mnogo šta da se kaže.

...[snap]...

4) Eto nas u protected modu! Kôd na adresi 0x1000 je onaj iz boot/head.S, služi da inicijalizuje registre i raspakuje kernel (decompress_kernel() funkcija koja koristi kôd iz inflate.c, unzip.c i misc.c). Raspakovani kernel ide na adresu 0x100000.


...hteo bih da pokusam da osvetlim jednu celu oblast koja je ispustena iza tacke 4, a ispred tacke 5... i da time upotpunim sliku podizanja sistema u linuxu... ne dekompresuje se samo kernel, nego se dekompresuje i inicijalni ram disk, u daljem tekstu naveden primer -> initrd-2.6.8-24-default... ovo je primer inicijalnog ramdiska koji se nalazi u SUSE 9.2 distribuciji, u /boot direktorijumu:

# ls -al
total 8980
drwxr-xr-x 3 root root 4096 2005-01-19 11:10 .
drwxr-xr-x 20 root root 4096 2005-07-15 07:02 ..
-rw-r--r-- 1 root root 512 2005-01-19 11:10 backup_mbr
lrwxrwxrwx 1 root root 1 2005-01-19 10:30 boot -> .
-rw-r--r-- 1 root root 57527 2004-10-06 14:30 config-2.6.8-24-default
-rw-r--r-- 1 root root 18071 2004-10-06 13:31 config-2.6.8-24-um
drwxr-xr-x 2 root root 4096 2005-01-19 11:10 grub
lrwxrwxrwx 1 root root 23 2005-01-19 11:10 initrd -> initrd-2.6.8-24-default
-rw-r--r-- 1 root root 1208589 2005-01-19 11:10 initrd-2.6.8-24-default

-rwxr-xr-x 1 root root 2954844 2004-10-06 13:31 linux-2.6.8-24-um
-rw-r--r-- 1 root root 67648 2004-10-02 03:20 memtest.bin
-rw-r--r-- 1 root root 94720 2005-01-19 11:10 message
-rw-r--r-- 1 root root 79149 2004-10-06 14:31 symvers-2.6.8-24-i386-default.gz
-rw-r--r-- 1 root root 20 2004-10-06 13:31 symvers-2.6.8-24-um-um.gz
-rw-r--r-- 1 root root 739535 2004-10-06 14:17 System.map-2.6.8-24-default
-rw-r--r-- 1 root root 472390 2004-10-06 13:29 System.map-2.6.8-24-um
-rw-r--r-- 1 root root 1855692 2004-10-06 14:30 vmlinux-2.6.8-24-default.gz
lrwxrwxrwx 1 root root 24 2005-01-19 10:42 vmlinuz -> vmlinuz-2.6.8-24-default
-rw-r--r-- 1 root root 1556001 2004-10-06 14:17 vmlinuz-2.6.8-24-default

...dakle, ja sam u Linuxovom Command Line Interface-u raspakovao file initrd-2.6.8-24-default umesto, predpostavljam, decompress_initrd() funkcije, koja se izvrsava NEPOSREDNO nakon decompress_kernel() funkcije... obicno se to radi na adresi 0x200000, ukoliko je velicina kernela manja od jednog megabajta...

...osnovna funkcija inicijalnog ramdiska je da kernelu omoguci inicijalni File System... jer kernel NE moze da u sebi sadrzi sve moguce drivere za pristup device-ovima... recimo SCSI ili IDE diskovima na kojima se nalazi ReadWrite FileSystem... zato kernel i koristi inicijalni ram disk koji se nalazi u memoriji, i koji "glumi" FS, mountuje / na isti, kao ReadOnly...

...raspakovani initrd-2.6.8-24-default izgleda ovako:

# ls -al
total 23
drwxr-xr-x 9 root root 1024 2005-01-19 11:10 .
drwxrwxrwx 5 root root 4096 2005-07-15 13:14 ..
drwxr-xr-x 2 root root 1024 2005-01-19 11:10 bin
drwxr-xr-x 3 root root 1024 2005-01-19 11:10 dev
drwxr-xr-x 3 root root 1024 2005-01-19 11:10 etc
drwxr-xr-x 4 root root 1024 2005-01-19 11:01 lib
-rwxr-xr-x 1 root root 5171 2005-01-19 11:10 linuxrc
drwxr-xr-x 2 root root 1024 2005-01-19 11:10 proc
-rwxr-xr-x 1 root root 4400 2004-10-02 02:52 run_init
drwxr-xr-x 2 root root 1024 2005-01-19 11:10 sbin
drwxr-xr-x 2 root root 1024 2005-01-19 11:10 sys

# ls -al bin
total 222
drwxr-xr-x 2 root root 1024 2005-01-19 11:10 .
drwxr-xr-x 9 root root 1024 2005-01-19 11:10 ..
lrwxrwxrwx 1 root root 27 2005-01-19 11:10 ata_identify -> /lib/klibc/bin/ata_identify
lrwxrwxrwx 1 root root 18 2005-01-19 11:10 cat -> /lib/klibc/bin/cat
-rwxr-xr-x 1 root root 38564 2004-10-02 15:16 chmod
lrwxrwxrwx 1 root root 24 2005-01-19 11:10 devnumber -> /lib/klibc/bin/devnumber
lrwxrwxrwx 1 root root 17 2005-01-19 11:10 ln -> /lib/klibc/bin/ln
-rwxr-xr-x 1 root root 27836 2004-10-02 15:16 mkdir
-rwxr-xr-x 1 root root 25528 2004-10-02 15:16 mknod
-rwsr-xr-x 1 root root 87704 2004-10-02 03:50 mount
-rwxr-xr-x 1 root root 38573 2004-10-02 15:16 rm
lrwxrwxrwx 1 root root 22 2005-01-19 11:10 scsi_id -> /lib/klibc/bin/scsi_id
lrwxrwxrwx 1 root root 18 2005-01-19 11:10 sed -> /lib/klibc/bin/sed
lrwxrwxrwx 1 root root 17 2005-01-19 11:10 sh -> /lib/klibc/bin/sh
lrwxrwxrwx 1 root root 20 2005-01-19 11:10 sleep -> /lib/klibc/bin/sleep
lrwxrwxrwx 1 root root 21 2005-01-19 11:10 umount -> /lib/klibc/bin/umount

# ls -al dev
total 3
drwxr-xr-x 3 root root 1024 2005-01-19 11:10 .
drwxr-xr-x 9 root root 1024 2005-01-19 11:10 ..
crw------- 1 root root 5, 1 2005-01-19 11:10 console
crw-rw---- 1 root root 29, 0 2005-01-19 11:10 fb0
brw-rw---- 1 root root 9, 0 2005-01-19 11:10 md0
crw-rw-rw- 1 root root 1, 3 2005-01-19 11:10 null
lrwxrwxrwx 1 root root 4 2005-01-19 11:10 ram -> ram0
brw-rw---- 1 root root 1, 0 2005-01-19 11:10 ram0
brw-rw---- 1 root root 1, 1 2005-01-19 11:10 ram1
brw-rw---- 1 root root 1, 2 2005-01-19 11:10 ram2
lrwxrwxrwx 1 root root 4 2005-01-19 11:10 ramdisk -> ram0
drwxr-xr-x 2 root root 1024 2005-01-19 11:10 shm
crw--w---- 1 root root 4, 1 2005-01-19 11:10 tty1
crw--w---- 1 root root 4, 2 2005-01-19 11:10 tty2
crw-r--r-- 1 root root 1, 5 2005-01-19 11:10 zero

...dalje da listam sadrzaj ne bih... koga interesuje detaljan mehanizam moze da mi postavi pitanja, a ja se nadam da cu umeti da odgovorim na pitanja... :b

...uocite da je zadatak inicijalnog ram diska da podigne HDD driver:

# pwd
/home/default_user/root_mntpoint/rootfs/lib/modules/2.6.8-24-default/kernel/drivers/scsi
# ls -al
total 223
drwxr-xr-x 2 root root 1024 2005-01-19 11:10 .
drwxr-xr-x 3 root root 1024 2005-01-19 10:42 ..
-rw-r--r-- 1 root root 50083 2004-10-06 14:30 libata.ko
-rw-r--r-- 1 root root 10996 2004-10-06 14:30 sata_nv.ko
-rw-r--r-- 1 root root 140188 2004-10-06 14:30 scsi_mod.ko
-rw-r--r-- 1 root root 20785 2004-10-06 14:30 sd_mod.ko

...ovo sto vidite su driveri za Serial ATA HDD, i za SCSI mod rada... ekstenzija @.ko se cita kao kernel object...

...kada se odradi ovaj korak, onda kernel unmountuje / sa ovoga privremenog File Sistema, i mountuje / na HDD File System, kao ReadWrite...

...toliko zasada od mene, a ja se nadam da sam uspeo [u pokusaju] da vam svima osvetlim jednu od oblasti koja je i nakon svega ostala u dubokom mraku... :)

...vas odani pera detlich, 3905! :))