]> rtime.felk.cvut.cz Git - edu/osp-wiki.git/commitdiff
Pridano 2. cviceni
authorMichal Sojka <sojkam1@fel.cvut.cz>
Wed, 24 Feb 2010 07:32:38 +0000 (08:32 +0100)
committerMichal Sojka <sojkam1@fel.cvut.cz>
Wed, 24 Feb 2010 07:32:38 +0000 (08:32 +0100)
cviceni.mdwn
cviceni/2.mdwn [new file with mode: 0644]
local.css

index a721058e338c2dd1c8eaea8efc93c2f0272e1855..7e07460681f448da7b94a623e0804a89b2488b16 100644 (file)
@@ -12,7 +12,7 @@ Osnova
 
 1. Seznámení se s předmětem a hodnocením, [[kontakt s reálným OSS
    projektem|cviceni/1]]
-2. Tvorba "produktu" z nezávislých OSS komponent (embedded Linux)
+2. [[Tvorba "produktu" z nezávislých OSS komponent|cviceni/2]] (embedded Linux)
 3. Specifikace individuálního zadání samostatná práce a jeho zařazení
    do existujících OS projektů (konzultace se cvičícími)
 4. Verzovací systém Git
diff --git a/cviceni/2.mdwn b/cviceni/2.mdwn
new file mode 100644 (file)
index 0000000..acbccb9
--- /dev/null
@@ -0,0 +1,266 @@
+[[!meta title="Embedded Linux"]]
+
+[[!toc]]
+
+Cíl cvičení
+===========
+
+Open source projekty se často nepoužívají osamoceně, ale v kombinaci s
+jinými OSS projekty, čímž vznikají tak tzv. OSS stacky. Asi
+nejznámějším stackem je LAMP – Linux, Apache, MySQL, PHP. Na dnešním
+cvičení se seznámíme s dalším, velmi často používaným, stackem
+[Linux][kenrel] + [BusyBox][bb] (+[Dropbear][dropbear] SSH server).
+
+[BusyBox][bb] je sada UNIXových uživatelských nástrojů (shell, editor,
+utility jako ls, mkdir, …) zkompilovaná do jedné binárky. V kombinaci
+s jádrem Linuxu tak dostáváme kompletní operační systém s poměrně
+malými nároky na paměť. Díky tomu se tato kombinace často používá ve
+vestavěných (embedded) aplikacích jako například
+[WiFi routery či ADSL modemy][owrt].
+
+V tomto cvičení si zkusíte vytvořit kompletní open source operační
+systém z Linuxového jádra a uživatelského prostředí tvořeného právě
+BusyBoxem. Dále si vyzkoušíte naprogramovat jednoduchý modul do jádra.
+
+[kenrel]: http://kernel.org/
+[bb]:http://busybox.net/
+[owrt]:http://www.openwrt.org/
+[dropbear]:http://matt.ucc.asn.au/dropbear/dropbear.html
+
+Postup
+======
+
+1. Stáhneme [zdrojové kódy][bbgit] projektu [BusyBox][bb]:
+
+        git clone git://busybox.net/busybox.git --reference /usr/src/busybox.git
+        cd busybox
+
+[bbgit]:http://git.busybox.net/busybox/
+
+2. Zkonfigurujeme jak chceme BusyBox přeložit. 
+
+        make menuconfig
+
+   Vystačíme s výchozí konfigurací, takže zvolit `Exit` a odpovědět
+   `Yes`, že chceme konfiguraci uložit.
+   
+3. Kompilaci provedeme tradičně příkazem
+
+        make
+
+4. Příkazem
+
+        make install
+
+    nainstalujeme busybox do adresáře `./_install`. Všimněte si, že se
+    tam nachází pouze jedna binárka `bin/busybox` a všechno ostatní
+    jsou pouze symbolické odkazy na tuto binárku.
+    
+    Protože neprovádíme tzv. *křížový překlad*, který je běžný pro v
+    případě vestavěných zařízení, můžeme výsledek hned otestovat
+    například spuštěním shellu: `./_install/bin/sh` (ukončíme ho např.
+    příkazem `exit`).
+    
+    V případě skutečného vestavěného systému bychom museli pokračovat
+    dál a bysybox otestovat až po nabootování na cílovém hardwaru.
+
+5. Pokud máte na vašem počítači práva superuživatele root, můžete
+   otestovat BusyBox v chroot prostředí, t.j. se stejným jádrem jako
+   právě běží na vašem počítači, ale se souborovým systémem tvořeným
+   pouze BusyBoxem:
+
+        # chroot _install /bin/sh
+
+   Fungovat to ale nebude, protože ke spuštění BusyBoxu jsou potřeba
+   knihovny, které v nejsou v adresáři `_install` dostupné.
+
+6. Chybějící knihovny zjistíte příkazem
+
+        ldd _install/bin/busybox
+       
+   Tyto knihovny musíte nakopírovat do adresáře `_install`
+
+        mkdir _install/lib
+        cp /lib/i686/cmov/libm.so.6 /lib/i686/cmov/libc.so.6 /lib/ld-linux.so.2 _install/lib
+
+   Nyní už můžete spustit BusyBox v chroot prostředí.
+
+5. Nejjednodušší možnost jak nabootovat do právě vytvořeného
+   uživatelského prostředí je uložit ho ve formátu pro Linuxový
+   startovací RAM-disk a nabootovat Linux s tímto RAM-diskem.
+   
+   Aby vše fungovalo jak má, kromě souborů v adresáři `_install` musí
+   RAM-disk obsahovat i někoik položek v adresáři `/dev` pro přístup k
+   virtuálním terminálům.
+
+   1. Pokud máte root práva, použijte ke tvorbě RAM-disku následující příkazy:
+
+            mkdir _install/{dev,etc,proc,sys}
+            sudo cp -a /dev/tty? _install/dev
+            ln -s bin/busybox _install/init
+            (cd _install; find . | cpio -o -H newc | gzip) > ramdisk
+
+   2. Bez rootovských práv můžete RAM-disk vytvořit pomocí nástoje
+      [gen_init_cpio][gic].
+
+            (
+            cat <<EOF
+            dir /dev 755 0 0
+            nod /dev/tty0 644 0 0 c 4 0
+            nod /dev/tty1 644 0 0 c 4 1
+            nod /dev/tty2 644 0 0 c 4 2
+            nod /dev/tty3 644 0 0 c 4 3
+            nod /dev/tty4 644 0 0 c 4 4
+            slink /init bin/busybox 700 0 0
+            dir /proc 755 0 0
+            dir /sys 755 0 0
+            EOF
+            
+            find _install -mindepth 1 -type d -printf "dir /%P %m 0 0\n"
+            find _install -type f -printf "file /%P %p %m 0 0\n"
+            find _install -type l -printf "slink /%P %l %m 0 0\n"
+            ) > filelist
+            
+            gen_init_cpio filelist > ramdisk
+
+[gic]:http://git.kernel.org/?p=linux/kernel/git/torvalds/linux-2.6.git;a=blob;f=usr/gen_init_cpio.c;hb=HEAD      
+
+5. **Jádro Linuxu**. Příprava jádra je téměř stejná jako u BusyBoxu:
+   stáhneme zdrojový kód, nakonfigurujeme a přeložíme. Vzhledem k
+   rozsáhlosti jádra (zkompilované zabere na disku cca 1 GB a překlad
+   trvá cca 20 minut) tyto kroky přeskočíme a použijeme již připravené
+   jádro z distribuce.
+   
+   Pokud byste si chtěli přeložit vlastní jádro, v následujícím
+   příkazu byste za parametrem *-kernel* uvedli cestu k vámi
+   zkompilovanému jádru.
+
+6. Bootování jádra s naším filesystémem (v emulátoru):
+
+        qemu -kernel /boot/vmlinuz-2.6.26-2-686 -initrd ramdisk
+
+7. Pokud vše proběhlo správně, zobrazila se hláška
+
+        Please press Enter to activate this console.
+    
+   Po stisku Enteru se spustí shell a můžete začít pracovat ve
+   vašem právě vytvořeném systému.
+   
+Možná vylepšení
+===============
+
+Dále můžete provést drobná vylepšení vašeho systému, která vám mohou
+zjednodušit další práci.
+
+1. Můžete připojit souborový systém `/proc`, aby fungovaly příkazy
+   jako např. `ps` (výpis běžících procesů). Příkaz spusťte v
+   emulátoru, ne na vaší pracovní stanici.
+
+        mount -t proc none /proc
+
+2. V RAM-disku můžete vytvořit soubor `/etc/init.d/rcS`, který bude
+   obsahovat příkazy, které budou spuštěny při bootu systému.
+
+        mkdir -p _install/etc/init.d
+        cat <<EOF > _install/etc/init.d/rcS
+        #!/bin/sh
+        mount -t proc none /proc
+        echo Nazdar!!!!
+        EOF
+        chmod +x _install/etc/init.d/rcS    # nastavení spustitelnosti
+
+   Nyní musíte znovu vytvořit RAM-disk a nabootovat.
+
+Jaderné moduly
+==============
+
+Jaderné moduly jsou přeložené kusy kódu, které lze za běhu nahrávat do
+Linuxvého jádra. Pokud bychom chtěli nalézt analogickou věc v
+uživatelském prostředí, pak by to byly *sdílené knihovny*. Jaderný
+modul může obsahovat kód ovladače zařízení, podporu určitého
+souborového systému, může přidávat do jádra nové funkce (např.
+firewall) či sloužit jako knihovna pomocných funkcí pro jiné moduly
+(např. libata).
+
+Zdrojový kód jednoduchého jaderného modulu vypadá následovně: 
+
+[[!format  c """
+#include <linux/init.h>
+#include <linux/module.h>
+MODULE_LICENSE("Dual BSD/GPL");
+
+static int hello_init(void)
+{
+       printk(KERN_ALERT "Hello, world\n");
+       return 0;
+}
+
+static void hello_exit(void)
+{
+       printk(KERN_ALERT "Goodbye, cruel world\n");
+}
+
+module_init(hello_init);
+module_exit(hello_exit);
+"""]]
+*Příklad převzat z [LDD3][LDD3].*
+
+Překlad modulu provedeme pomocí jednoduchého souboru Makefile, který
+bude obsahovat jedinou řádku (zde předpokládáme, že výše uvedený
+soubor se jmenuje khello.c):
+
+    obj-m = khello.o
+
+Nyní stačí zavolat `make` se správnými parametry:
+
+    make -C /lib/modules/$(uname -r)/build M=$(pwd) modules
+
+Tímto říkáme, že příkaz `make` načte `Makefile` z adresáře se
+zdrojovými kódy aktuálně běžícího jádra (o který adresář se jedná
+můžete zjistít pomocí `readlink -f /lib/modules/$(uname -r)/build`),
+pomocí proměnné `M` řeknete, že se váš modul nachází v aktuálním
+adresáři a slovo `modules` na konci znamená, že chcete, aby se
+zkompilovaly pouze moduly.
+
+Pokud vše dopadlo dobře, objevil se vám soubor `khello.ko`, což je
+modul, který můžete zavést do jádra příkazem
+
+    insmod khello.ko
+
+
+
+Zadání
+======
+
+Vytvořte jednoduchý jaderný modul, který po zavedení do jádra vypíše
+vaše jméno (objeví se ve výstupu `dmesg`). Jinak nemusí dělat nic.
+Předveďte činnost vašeho modulu ve vámi vytvořeném systému běžícím v
+emulátoru.
+
+Kdo se bude nudit, může zkusit rozšířit modul tak, aby se jeho jméno
+objevilo v souboru `/proc/myname` nebo vytvořit jednoduchý ovladač,
+který bude vracet vaše jméno při čtení z `/dev/myname`. Návod najdete
+v [tomto článku][henson_drivers] (strany 2 a 3).
+
+Tipy a triky
+============
+
+* Pro vyvolání určitého příkazu z historie můžete použít klávesu
+  `Ctrl-R` následovanou textem hledaného příkazu. Např:
+
+        <Ctrl-R>cpio<Enter>
+
+Reference
+=========
+
+* [ramfs, rootfs and initramfs](http://git.kernel.org/?p=linux/kernel/git/torvalds/linux-2.6.git;a=blob;f=Documentation/filesystems/ramfs-rootfs-initramfs.txt;hb=HEAD)
+* [Early userspace support](http://git.kernel.org/?p=linux/kernel/git/torvalds/linux-2.6.git;a=blob;f=Documentation/early-userspace/README;hb=HEAD)
+* [Inside the Linux boot process](http://www.ibm.com/developerworks/linux/library/l-linuxboot/)  
+* [The Linux Bootdisk HOWTO](http://www.tldp.org/HOWTO/Bootdisk-HOWTO/)  
+* [Linux Loadable Kernel Module HOWTO](http://tldp.org/HOWTO/Module-HOWTO/)
+* [Linux Device Drivers, Third Edition][LDD3]
+* [Kbuild & modules](http://git.kernel.org/?p=linux/kernel/git/torvalds/linux-2.6.git;a=blob;f=Documentation/kbuild/modules.txt;hb=HEAD)
+* [/dev/hello_world: A Simple Introduction to Device Drivers under Linux](henson_drivers)
+  
+[LDD3]:http://lwn.net/Kernel/LDD3/
+[henson_drivers]:http://linuxdevcenter.com/pub/a/linux/2007/07/05/devhelloworld-a-simple-introduction-to-device-drivers-under-linux.html
index dac87160d67c5e45f0d99d324a75b47f187d6e90..e1a6feb15aa589188071f4d9607b0c5ee378ffa8 100644 (file)
--- a/local.css
+++ b/local.css
@@ -14,7 +14,7 @@ hr {
   border-style:none;
 }
 
-code,pre {
+code,pre,pre.hl {
   background:#eee;
 }
 
@@ -323,3 +323,7 @@ table.borders th, table.borders td {
 ol.lower-alpha {
   list-style-type: lower-alpha;
 }
+
+ol ol {
+  list-style-type: lower-alpha;
+}