{"id":17,"date":"2006-03-20T13:20:48","date_gmt":"2006-03-20T12:20:48","guid":{"rendered":"http:\/\/my.stargazer.at\/?p=17"},"modified":"2007-06-19T15:45:26","modified_gmt":"2007-06-19T13:45:26","slug":"embedded-gentoo-tagebuch-eines-versuchs-teil-2","status":"publish","type":"post","link":"https:\/\/my.stargazer.at\/de\/2006\/03\/20\/embedded-gentoo-tagebuch-eines-versuchs-teil-2\/","title":{"rendered":"Embedded Gentoo &#8211; Tagebuch eines Versuchs (Teil 2)"},"content":{"rendered":"<p>Aufgrund der hohen Compile-Zeit von Gentoo setze ich dieses Howto bzw dieses Log der Installation heute fort. emerge -e system hatte 72 Pakete zu bauen und meine Kaffeekanne erreichte die kritische Mindestmenge &#8211; Zeit um ins Bett zu gehen. Dann graut Morgen &#8211; kein Brandgeruch in der Luft, kein Brennen am Tisch &#8211; der Laptop hat es \u00fcberlebt Gentoo-Embedded zu bauen; Hoffnungsvoll blicke ich auf den LCD und siehe da &#8211; es ist vollbracht.<!--more--><\/p>\n<p>Also auf zum n\u00e4chsten Schritt unserer Installation. Die bisherige Installation beinhaltet &#8211; wie bislang jede Gentoo-Installation alle Distfiles, den kompletten Portage und einen grossen Satz Tools und Libraries, welche sich in der Zwischenzeit schon auf 1,8 GB ausbreiten. Wie das wohl je auf eine CF Karte passen sollte? Es wird!<\/p>\n<p>Jedes System ben\u00f6tigt einen Kernel, also emergen wir diesen. Dann vervollst\u00e4ndigen wir die Bash-Umgebungsskripte des Default-Users und legen uns schliesslich ein Verzeichnis an, in welchem das endg\u00fcltige und vorallem Abgespeckte Embedded Gentoo liegen wird. Ein weiteres Problem welches sich uns stellt ist, dass das normale Baselayout welches Gentoo Linux ben\u00fctzt, nicht unbedingt embedded-tauglich ist. Aus diesem Grund verwenden wir das noch maskierte Baselayout-Lite, welches jedoch zuerst in die Keywords aufgenommen werden muss:<\/p>\n<blockquote><p><code>* sys-apps\/baselayout-lite<br \/>\n     Available versions:  *1.0_pre1<br \/>\n     Installed:           none<br \/>\n     Homepage:            http:\/\/www.gentoo.org\/proj\/en\/base\/embedded\/<br \/>\n     Description:         Baselayout for embedded systems<\/code><\/p><\/blockquote>\n<blockquote><p><code>emerge gentoo-sources<br \/>\ncp \/etc\/skel\/.bash_profile \/etc\/skel\/.bashrc \/root\/<br \/>\nmkdir \/tinygentoo<br \/>\nmkdir -p \/etc\/portage<br \/>\necho \"sys-apps\/baselayout-lite -*\" >> \/etc\/portage\/package.keywords<br \/>\n<\/code><\/p><\/blockquote>\n<p>Um unser kleines Gentoo nun endg\u00fcltig zu bauen setzen wir <em>ROOT=\/tinygentoo<\/em> vor die neuen emerge-Befehle, wenn das Paket nicht in der Entwicklungsumgebung, sondern am zuk\u00fcnftigen Echtsystem laufen soll &#8211; so bei unseren Grundbausteinen baselayout-lite, uclib und Busybox, womit wir ein minimales System schaffen:<\/p>\n<blockquote><p><code>ROOT=\/tinygentoo emerge -av baselayout-lite uclibc busybox<\/code><\/p><\/blockquote>\n<p>Nun ist es Zeit Benutzer anzulegen, wozu wir ein weiteres mal chrooten. Ich nenne den Benutzer einfach <em>operator<\/em>:<\/p>\n<blockquote><p><code><br \/>\nchroot \/tinygentoo \/bin\/ash<br \/>\npasswd<br \/>\naddgroup -g 100 users operator<br \/>\nadduser -h \/home\/operator -s \/bin\/bash -G users operator<br \/>\nexit<\/code><\/p><\/blockquote>\n<p>Der etwas delikatere Teil liegt nun in der Konfiguration des Systems, wobei das Anlegen der n\u00f6tigen Verzeichnisse nicht vergessen werden sollte:<\/p>\n<blockquote><p><code>echo \"eBrick\" > \/tinygentoo\/etc\/hostname<br \/>\nmkdir \/tinygentoo\/boot<br \/>\nmkdir \/tinygentoo\/mnt\/usbstick<br \/>\nmkdir \/tinygentoo\/proc<br \/>\nchmod 555 \/tinygentoo\/proc<\/code><\/p><\/blockquote>\n<p>Die <em>\/tinygentoo\/etc\/fstab<\/em> birgt ihre T\u00fccken:<\/p>\n<blockquote><p><code>\/dev\/ram0               \/               ext2            defaults        0 0<br \/>\nnone                    \/tmp            tmpfs           defaults        0 0<br \/>\nnone                    \/proc           proc            defaults        0 0<br \/>\nnone                    \/dev\/shm      tmpfs           defaults        0 0<\/p>\n<p>\/dev\/hda1             \/boot           ext2            noauto,ro       0 0<br \/>\n\/dev\/hda2             \/mnt\/usb      vfat            defaults        0 0<\/code><\/p><\/blockquote>\n<p>Die einfachste Art unser System sicher zu gestalten ist, alles in einen Initrd zu packen &#8211; was wir auch sp\u00e4ter machen werden. Dieser wird zu allererst unter \/dev\/initrd und sp\u00e4ter als \/dev\/ram0 verf\u00fcgbar sein, welches wir nach dem Booten als \/ mounten.<\/p>\n<p><em>Beachte: Flash Speicher mag es nicht, wenn man ihn permanent be- und \u00fcberschreibt &#8211; aus diesem Grund liegen jene Teile wie \/tmp auf einer Ramdisk.<\/em><\/p>\n<p>Nun wird es Zeit, Applikationen zu bauen, welche uns das Arbeiten mit dem kleinen System erm\u00f6glichen. Ich habe mich f\u00fcr die Net-Tools, einen DHCP-Clienten, einen Browser und einen SSHd entschieden. Nat\u00fcrlich darf &#8217;screen&#8216; auch nicht fehlen:<\/p>\n<blockquote><p><code>ROOT=\/tinygentoo emerge -av net-tools udhcp links dropbear screen<\/code><\/p><\/blockquote>\n<p>Den Kernel zu compilieren ist eine Prozedur, welche ich nicht extra beschreibe. Als Hinweis sei jedoch gesagt dass sich vieles als Modul compilen l\u00e4sst und alles was nicht gebraucht wird den Kernel nur unn\u00f6tig gross macht. Da wir einen Kernel der Version 2.6.x verwenden, wurde make dep obsolet:<\/p>\n<blockquote><p><code><br \/>\nmake clean bzImage modules modules_install<br \/>\ncp arch\/i386\/boot\/bzImage \/tmp\/kernel-2.6<br \/>\nmkdir -p \/tinygentoo\/lib\/modules<br \/>\ncp -vr \/lib\/modules\/* \/tinygentoo\/lib\/modules\/<br \/>\n<\/code><\/p><\/blockquote>\n<p>Die letzten beiden Befehle sind n\u00f6tig um die Kernel-Module in unser kleines System zu \u00fcbernehmen. Nun ist es Zeit aufzur\u00e4umen und das eben erstellte Verzeichnis zu einem Initrd zusammenzufassen, was wir wie folgt bewerkstelligen:<\/p>\n<blockquote><p><code>cp -r \/tinygentoo \/tmp\/<br \/>\nrm -r \/tmp\/tinygentoo\/var\/* \/tmp\/tinygentoo\/tmp\/*<br \/>\ndu -hs \/tmp\/tinygentoo<\/code><\/p><\/blockquote>\n<p>Es ist wichtig, die genaue Gr\u00f6sse des zuk\u00fcnftigen Initrds zu kennen! Mein Verzeichnis hat 21 MB. Da das Filesystem selbst auch Platz ben\u00f6tigt lege ich den initrd mit einer Gr\u00f6sse von 25 MB an.<\/p>\n<blockquote><p><code>dd if=\/dev\/zero of=\/tmp\/initrd.img bs=1MB count=25<br \/>\nmke2fs -F \/tmp\/initrd.img<br \/>\nmkdir \/mnt\/initrd<br \/>\nmount -o loop \/tmp\/initrd.img \/mnt\/initrd<br \/>\nrsync -avz \/tmp\/tinygentoo\/ \/mnt\/initrd<br \/>\numount \/mnt\/initrd<br \/>\ncd \/tmp<br \/>\ngzip -9 initrd.img<br \/>\ndu -hs initrd.img.gz<br \/>\n<\/code><\/p><\/blockquote>\n<p>Nach dem Komprimieren des Initrds bekomme ich ein File mit der Gr\u00f6sse von 6.2 MB, was man durchaus als &#8218;klein&#8216; bezeichnen kann. Auf meinem Notebook wird die CompactFlash Karte via USB angesprochen &#8211; Somit h\u00e4ngt sie als \/dev\/sda in meinem System. Ich partitioniere sie mit <em>fdisk \/dev\/sda<\/em>. Da diese Karte nur zum Booten dient ist es nicht n\u00f6tig auf ihr weitere Partitionen anzulegen. Man darf jedoch nicht vergessen, die Partition als Bootf\u00e4hig zu markieren!<\/p>\n<p>Das Anlegen des Dateisystems erledigt mke2fs f\u00fcr uns. Was dann folgt ist das Kopieren der GRUB Dateien, welche<\/p>\n<blockquote><p><code>mount \/dev\/sda1 \/media\/floppy<br \/>\nmkdir \/media\/floppy\/grub<br \/>\ncp \/boot\/grub\/stage? \/media\/floppy\/grub<br \/>\ncp \/boot\/grub\/e2fs_stage1_5 \/media\/floppy\/grub<br \/>\numount \/media\/floppy<br \/>\n<\/code><\/p><\/blockquote>\n<p>Es folgt der Kampf mit GRUB:<\/p>\n<blockquote><p><code><br \/>\ngrub> device (hd0) \/dev\/sda<br \/>\ngrub> root (hd0,0)<br \/>\ngrub> setup (hd0)<br \/>\ngrub> quit<br \/>\n<\/code><\/p><\/blockquote>\n<p>.. und schliesslich ein Entfernen einer \u00fcberfl\u00fcssigen Stage-Datei und kopieren alle Dateien zusammen auf die CF:<\/p>\n<blockquote><p><code>mount \/dev\/sda1 \/media\/floppy<br \/>\nrm \/media\/floppy\/grub\/e2fs_stage1_5<br \/>\ncp \/root\/gentoo_uclibc\/tmp\/kernel-2.6 \/media\/floppy\/<br \/>\ncp \/root\/gentoo_uclibc\/tmp\/initrd.img.gz \/media\/floppy\/<br \/>\n<\/code><\/p><\/blockquote>\n<p>Die Grub Config, menu.lst sieht wie folgt aus:<\/p>\n<blockquote><p><code>timeout 3<br \/>\ndefault 0<\/p>\n<p>title Embedded Gentoo<br \/>\nroot (hd0,0)<br \/>\nkernel \/kernel-2.6 root=\/dev\/ram0 vga=791 ramdisk_size=24000 init=\/sbin\/init<br \/>\ninitrd \/initrd.img.gz<br \/>\n<\/code><\/p><\/blockquote>\n<p>Nachdem alles gebaut und kopiert ist k\u00f6nnen wir die CF Karte unmounten und mit Zufriedenheit feststellen, dass wir ein System auf weniger als 8 MB untergebracht haben. Die Gr\u00f6sse variiert nat\u00fcrlich vin Build zu Build aufgrund der installierten Applikationen und den Kernelmodulen.<\/p>\n<p>Nur&#8230; Wozu der Aufwand? &#8211; Der Aufwand lohnt sich f\u00fcr spezielle Hardware wie Visualisierungs-PCs oder Appliance Ger\u00e4tschaften welche auf spezieller Hardware arbeiten wie zum Beispiel Industrie-PCs.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Aufgrund der hohen Compile-Zeit von Gentoo setze ich dieses Howto bzw dieses Log der Installation heute fort. emerge -e system hatte 72 Pakete zu bauen und meine Kaffeekanne erreichte die kritische Mindestmenge &#8211; Zeit um ins Bett zu gehen. Dann graut Morgen &#8211; kein Brandgeruch in der Luft, kein Brennen am Tisch &#8211; der Laptop hat es \u00fcberlebt [&hellip;]<\/p>\n","protected":false},"author":7,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[4],"tags":[109,39],"class_list":["post-17","post","type-post","status-publish","format-standard","hentry","category-it-related-stuff","tag-embedded","tag-gentoo"],"_links":{"self":[{"href":"https:\/\/my.stargazer.at\/de\/wp-json\/wp\/v2\/posts\/17","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/my.stargazer.at\/de\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/my.stargazer.at\/de\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/my.stargazer.at\/de\/wp-json\/wp\/v2\/users\/7"}],"replies":[{"embeddable":true,"href":"https:\/\/my.stargazer.at\/de\/wp-json\/wp\/v2\/comments?post=17"}],"version-history":[{"count":0,"href":"https:\/\/my.stargazer.at\/de\/wp-json\/wp\/v2\/posts\/17\/revisions"}],"wp:attachment":[{"href":"https:\/\/my.stargazer.at\/de\/wp-json\/wp\/v2\/media?parent=17"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/my.stargazer.at\/de\/wp-json\/wp\/v2\/categories?post=17"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/my.stargazer.at\/de\/wp-json\/wp\/v2\/tags?post=17"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}