[[Vorlage(archiviert, "Im Artikel wird noch Upstart referenziert, Ubuntu 16.04 nutzt aber [:systemd:].")]] {{{#!vorlage Wissen [:sudo: Root-Rechte erlangen] [:Pakete installieren: Installation von Programmen] [:Terminal: Ein Terminal öffnen] [:Editor: Einen Editor öffnen] [:sources.list: Paketquellen Einrichten] [:chroot: Der Befehl chroot] [:fstab: Laufwerke in /etc/fstab statisch einbinden] [:Packprogramme: Archive entpacken] [:Partitionierung/Grundlagen: Grundlagen der Partitionierung] [:Kernelmodule: Umgang mit Kernelmodulen (Treibern)] [:GRUB_2: GRUB 2] }}} [[Inhaltsverzeichnis(2)]] Dieser Artikel erklärt detailliert, wie man eine Compact-Flash-Karte auf einem anderen Computer mit einem fertigen Betriebssystem für [:Archiv/Alix:Alix-Boards] vorbereitet. Die meisten Anleitungen, die sich im Internet finden lassen, erklären, wie eine Installation auf der Maschine selber funktioniert. Dies scheitert aber sehr oft daran, dass gerade, wo man es bräuchte, das Null-Modem-Kabel verschwunden ist, das neue Notebook oder der Computer ja gar keine serielle Schnittstelle mehr hat und zu einer ungünstigen Uhrzeit ein solches auch nicht mal eben schnell aufzutreiben ist. Die Herausforderung liegt also darin, die Installation vollkommen offline auf einer anderen Maschine vorzubereiten, die daraus resultierende CF-Karte ins Alix-Board einzulegen, den Strom und das Netzwerk anzuschließen und sich nach wenigen Sekunden per [:SSH:] einloggen zu können. = Voraussetzungen = Um mit der Installation zu beginnen, muss Folgendes vorhanden sein: * Ein funktionierendes Netzwerk, welches Zugriff auf das Internet erlaubt. * Ein Rechner, auf dem ein Ubuntu läuft. Die Version ist prinzipiell egal. * Ein funktionsfähiges Alix-Board. Mit Hilfe des Verfahrens, welches in dieser Anleitung beschrieben wird, wurden Systeme für verschiedene Alix-Boards der Serie 2D.. aufgesetzt. Prinzipiell sollte diese Anleitung für alle Alix-Boards mit nur einer serieller Schnittstelle geeignet sein (um funktionierende Betriebssystems-Images erzeugen zu können). * Eine möglichst schnelle Compact-Flash-Karte, die mindestens 1GB groß sein sollte. Die Gesamtkapazität ist allerdings vom späteren Verwendungszweck abhängig. * ein externer Kartenleser Sind alle diese Voraussetzungen erfüllt, kann mit der Installation begonnen werden. = Installation = {{{#!vorlage Hinweis Nahezu alle hier nachfolgend aufgeführten Befehle erfordern Root-Rechte [1]. Um nicht jedem dieser Befehle `sudo` voranstellen zu müssen, empfiehlt es sich, die Installation in einer Root-Shell auszuführen. Diese kann durch Eingabe des Befehls `sudo su` erreicht werden. }}} Im Laufe dieses Artikels werden des öfteren Pakete mit [:apt-get:] installiert und deinstalliert. Dieser Befehl stellt nicht die einzige Möglichkeit dar, dies zu erreichen. Es ist zum Beispiel möglich, alternativ den Befehl [:aptitude:] zu verwenden, bei dem allerdings unter Umständen dann andere Parameter angegeben werden müssen. == Partitionierung und Formatierung == Um die Compact-Flash-Karte benutzen zu können, muss diese zuerst partitioniert und formatiert werden. Nach dem Einlegen im Kartenleser muss zunächst der Gerätename, unter dem die Karte angesprochen werden kann, ermittelt werden. Dies erreicht man, in dem man die Ausgaben des System Log beobachtet. Folgender Befehl, vor dem Einlegen der Karte ausgeführt, zeigt die bisherigen Meldungen: {{{#!vorlage Befehl tail -f /var/log/messages }}} Nach dem Einlegen der CF-Karte sollten dann neue Meldungen wie diese hier erscheinen: {{{ Nov 25 06:36:10 transpoldo kernel: [58904.010195] sd 2:0:0:1: [sdc] 7847280 512-byte hardware sectors (4018 MB) Nov 25 06:36:10 transpoldo kernel: [58904.016240] sd 2:0:0:1: [sdc] Write Protect is off Nov 25 06:36:10 transpoldo kernel: [58904.026204] sd 2:0:0:1: [sdc] 7847280 512-byte hardware sectors (4018 MB) Nov 25 06:36:10 transpoldo kernel: [58904.032226] sd 2:0:0:1: [sdc] Write Protect is off Nov 25 06:36:10 transpoldo kernel: [58904.037168] sdc: sdc1 }}} Hieran kann man erkennen, dass die CF-Karte den Gerätenamen '''/dev/sdc''' bekommen hat und sich darauf eine Partition mit dem Gerätenamen '''/dev/sdc1''' befindet. An diesem Punkt kann das Partitionierungsprogramm aufgerufen werden [9]: {{{#!vorlage Befehl fdisk /dev/sdc }}} Im Partitionierungsprogramm sollten dann eventuell vorhandene Partitionen gelöscht werden, eine neue primäre Partition vom Typ 83 (Linux) die die ganze Karte umfasst erstellt werden und diese mit einem Boot-Flag versehen werden (Befehl 'a'). Das sieht bei einer 4 GB Karte ungefähr so aus: {{{ Disk /dev/sdc: 4017 MB, 4017807360 bytes 128 heads, 63 sectors/track, 973 cylinders Units = cylinders of 8064 * 512 = 4128768 bytes Disk identifier: 0x00000000 Device Boot Start End Blocks Id System /dev/sdc1 * 1 973 3923104+ 83 Linux }}} {{{#!vorlage Hinweis Ohne das Setzen des Boot-Flags (was man am Sternchen neben dem Gerätenamen der Partition erkennen kann), wird das System nicht von der Partition starten. }}} Nun kann die Partitionierung beendet werden, um mit der Erstellung des Dateisystems fortzufahren: {{{#!vorlage Befehl mke2fs -t ext2 -L root /dev/sdc1 }}} Wie man hier sehen kann, wurde dem Volumen der Name `root` gegeben (was das Einhängen nach Namen erlaubt), und als Dateisystem wurde '''ext2''' gewählt, was aufgrund der geringeren Anzahl Schreibzugriffe wegen der fehlenden Implementation des "Journaling", das Flash-RAM der CF-Karte schont. Da heutzutage moderne Flash-Controller über die Fähigkeit verfügen, die Schreibzugriffe gleichmäßig auf die Speicherzellen zu verteilen, wird die Wirksamkeit dieser Maßnahme zur Zeit kontrovers diskutiert. Die Benutzung des Dateisystems '''ext3''' oder gar eines anderen Dateisystems ist durchaus auch möglich. {{{#!vorlage Hinweis Mit Angabe des Parameters `-L root` wurde dem Volumen der Name `root` gegeben. Auf Systemen mit [:udev:] erlaubt dies, die Partition nicht nur durch ihren Gerätenamen '''/dev/sdc1''' sondern auch durch den Namen '''/dev/disk/by-label/root''' anzusprechen (bei gerade erst erstellten Volumen allerdings erst nach Eingabe des Befehls `udevtrigger`). Damit kann man das Problem mit ständig wechselnden Gerätenamen etwas entschärfen. Legt man z.B. ein USB-Stick ein, kann es beim nächsten Neustart durchaus passieren, dass die Reihenfolge der Gerätenamen sich geändert hat. Das Identifizieren nach Namen funktioniert allerdings nur, solange diese Namen auch eindeutig sind. Besser gelingt hier eine Identifizierung nach [:UUID:]. Diese pseudo-eindeutige Identifikationsnummer wird bei Erstellen des Dateisystems erzeugt und die Partition kann dann über '''/dev/disk/by-id/''' angesprochen werden. Allerdings ist auch hier die Eindeutigkeit nicht wirklich gewährleistet, da einige Formatierungsprogramme wie z.B. mkswap das Angeben einer UUID erlauben. Außerdem kann eine Partition auch geklont werden. }}} Nach erfolgreicher Erzeugung des Dateisystems kann die neue formatierte CF-Karte ins Dateisystem eingebunden werden, um mit der Installation fortzufahren. {{{#!vorlage Befehl mkdir /mnt/alix mount /dev/sdc1 /mnt/alix }}} == Installation des Basissystems == Zu Beginn wird auf der Karte ein minimales Basissystem installiert. Dafür wird das Paket * '''debootstrap''' verwendet. Ist dieses nicht bereits installiert, so muss man es zuerst installieren [2]. Die Installation des Basissystems erfolgt mittels Eingabe des Befehls (entsprechend anpassen!): * Ubuntu 14.04: {{{#!vorlage Befehl debootstrap --arch i386 xenial /mnt/alix http://de.archive.ubuntu.com/ubuntu }}} Dieser Vorgang dauert je nach Geschwindigkeit der Internetverbindung (falls noch Pakete heruntergeladen werden müssen) und je nach Schreibgeschwindigkeit der CF-Karte unterschiedlich lange. === Wechsel in das Zielsystem === Ist dieser Vorgang erfolgreich beendet, ist es Zeit, in das neue Dateisystem zu wechseln[6]: {{{#!vorlage Befehl mount -o bind /dev /mnt/alix/dev mount -o bind /sys /mnt/alix/sys mount -o bind /proc /mnt/alix/proc chroot /mnt/alix /bin/bash }}} == Konfiguration des Basissystems == {{{#!vorlage Warnung Ab hier ist man per [:chroot:] auf dem späteren Zielsystem unterwegs. Alle eingegebenen Befehle im momentanen Terminal wirken sich nur dort aus! }}} === Namensauflösung === Nicht jedes System braucht einen Namen, aber mit einem Namen lässt es sich besser leben: {{{#!vorlage Befehl echo alix-router > /etc/hostname }}} Und damit die ganze Namensauflösung zumindest rudimentär funktioniert, sollte die Datei '''/etc/hosts''' folgenden Inhalt haben: {{{ 127.0.0.1 localhost 127.0.1.1 alix-router.example.com alix-router # The following lines are desirable for IPv6 capable hosts ::1 ip6-localhost ip6-loopback fe00::0 ip6-localnet ff00::0 ip6-mcastprefix ff02::1 ip6-allnodes ff02::2 ip6-allrouters ff02::3 ip6-allhosts }}} Es lohnt sich auch, einen kurzen Blick in die Datei '''/etc/resolv.conf''' zu werfen. debootstrap kopiert hier üblicherweise die Datei des erzeugenden Systems hinein. Da das Alix-System zunächst im selben Netzwerk angeschlossen werden wird, stellt das kein Problem dar. Will man jedoch sicher stellen, dass auch nach einer Umkonfiguration die Namensauflösung höchstwahrscheinlich funktioniert, empfiehlt es sich hier, als Nameserver generell erreichbare wie z.B. die OpenDNS- und Google-Server einzutragen: {{{ nameserver 8.8.8.8 nameserver 208.67.222.222 nameserver 8.8.4.4 nameserver 208.67.220.220 }}} === Dateisystem === Folgende Dateisystem-Tabelle [:fstab:/etc/fstab] [7] stellt sicher, dass das System auch alle seine Dateisysteme korrekt einhängt: {{{ # /etc/fstab: static file system information. # # proc /proc proc defaults 0 0 # /dev/sda1 LABEL=root / ext2 noatime,errors=remount-ro 0 0 tmpfs /tmp tmpfs defaults,noatime 0 0 tmpfs /var/tmp tmpfs defaults,noatime 0 0 }}} Die Option `noatime` beim Root-Dateisystem verhindert, dass jeder Dateizugriff (also auch lesende Zugriffe) das sogenannte `atime`-Attribut (Zeitstempel des letzten Zugriffes) aktualisiert. Dies schont den Flash-Speicher der CF-Karte. Aus diesem Grunde werden hier auch die temporären Verzeichnisse als RAM-Disk ausgelegt. Um den Flash-Speicher noch weiter zu schonen, kann man die Zeit für zeitversetzte Schreibzugriffe verlängern. Dies erfolgt, indem man folgende Zeilen in die Datei '''/etc/sysctl.conf''' einfügt: {{{ vm.dirty_writeback_centisecs = 1500 }}} Der Standard-Wert liegt normalerweise bei `500` (5 Sekunden). Der neue Wert `1500` (15 Sekunden) dürfte die Anzahl der tatsächlich stattfindenden Schreibzugriffe im laufenden Betrieb relevant senken. === Netzwerk === Innerhalb dieses Artikels wird angenommen, dass das vorhandene Netzwerk den Adressraum `192.168.97.0/24` besitzt und `192.168.97.1` das Standard-Gateway ist. Diese entsprechenden Werte müssen an die lokalen Gegebenheiten angepasst werden. Die Konfiguration der Netzwerkadressen der Adapter erfolgt statisch in der Datei [:interfaces:/etc/network/interfaces]. Diese wird hier nun mit folgendem Inhalt angelegt: {{{ # Used by ifup(8) and ifdown(8). See the interfaces(5) manpage or # /usr/share/doc/ifupdown/examples for more information. # The loopback network interface auto lo iface lo inet loopback # The primary network interface auto eth0 iface eth0 inet static address 192.168.97.100 netmask 255.255.255.0 gateway 192.168.97.1 # emergency fallback addresses post-up ip addr add 169.254.19.65/16 dev eth0 pre-down ip addr del 169.254.19.65/16 dev eth0 }}} {{{#!vorlage Hinweis Unter 16.04 werden ggf. andere Namen für die Geräte verwendet, da [https://www.freedesktop.org/wiki/Software/systemd/PredictableNetworkInterfaceNames/ Predictable Network Interface Names] {en} verwendet werden. Daher müssen in der Datei '''/etc/network/interfaces''' statt `eth0` durchgängig Einträge in der Form `enp0sX` verwendet werden. Hinweise zu dem verwendeten Namen findet man ggf. in '''/var/log/syslog''' oder '''/var/log/kern.log''' beispielsweise mit dem Befehl {{{#!vorlage Befehl grep eth0 LOGDATEI\}}} Weitere Hinweise zu ggf. anderen Namen finden sich auch im [post:8953088:Forum]. }}} Da das Alix-System blind (ohne Bildschirm) gestartet wird, ist es sehr sinnvoll, eine feste IP-Adresse zu vergeben, da es sonst eher schwierig sein dürfte, die der Netzwerkkarte zugewiesene Adresse zu ermitteln. Die Angabe des Default-Gateways ist zwingend, da später auf dem System noch zusätzliche Pakete installiert werden müssen. Es ist übrigens extrem ratsam, noch zusätzlich eine bekannte [wikipedia:APIPA:]-Adresse zu vergeben (wie z.B.: `169.254.19.65`), da man so die Sicherheit hat, jederzeit mit dem Gerät Kontakt aufnehmen zu können, auch wenn die primäre Adresse vergessen wurde oder unbekannt ist. Die APIPA-Adresse sollte auch in Form eines Etiketts am Gerät befestigt werden. === Paketquellen eintragen === Die Paketquellen werden - entsprechend der gewünschten Ubuntu-Version - in [:sources.list:] eingetragen[5]. Für Ubuntu 16.04 (xenial): {{{ # See http://help.ubuntu.com/community/UpgradeNotes for how to upgrade to # newer versions of the distribution. ## Primary distribution source deb http://de.archive.ubuntu.com/ubuntu/ xenial main universe #deb-src http://de.archive.ubuntu.com/ubuntu/ xenial main universe ## Major bug fix updates produced after the final release of the ## distribution. deb http://de.archive.ubuntu.com/ubuntu/ xenial-updates main universe #deb-src http://de.archive.ubuntu.com/ubuntu/ xenial-updates main universe ## Security updates deb http://security.ubuntu.com/ubuntu xenial-security main universe #deb-src http://security.ubuntu.com/ubuntu xenial-security main universe }}} === Paketabhängigkeitsmodus optimieren === Seit Ubuntu 8.10 ist auch der Paketmanager apt so konfiguriert, dass nicht nur Pakete mit direkter Abhängigkeit mitinstalliert werden, sondern auch Pakete, die sich in der Liste der empfohlenen Zusatzpakete (''"Recommends"'') befinden. Dieses Verhalten ist in diesem spezifischen Falle aus verschiedenen Gründen unerwünscht, da zum einen beabsichtigt wird, ein möglichst schlankes System zu erzeugen, zum anderen aber auch vermieden werden soll, daß einer der vorgeschlagenen Bootmanager (in diesem Fall GRUB 2) automatisch mitinstalliert wird, da dieser in einem derartigen System nicht nur überdimensioniert sondern sogar schädlich sein kann, was im entsprechenden Abschnitt dieses Artikel näher erläutert wird. Um also den Paketmanager dazu zu bringen, nur die notwendigen Abhängigkeiten zu installieren, wird die Datei '''/etc/apt/apt.conf.d/00onlydepends''' mit folgenden Inhalt angelegt: {{{ APT::Install-Recommends "0"; APT::Install-Suggests "0"; }}} Diese Änderung wirkt sich sowohl auf den Paketmanager [:apt/apt:apt] als auch auf dem Paketmanager [:aptitude:] aus. === Regionale Einstellungen === Regionale Einstellungen und das Konsolensystem installieren [1]: {{{#!vorlage Befehl echo en_US.UTF-8 UTF-8 > /var/lib/locales/supported.d/local locale-gen apt-get update }}} oder alternativ {{{#!vorlage Befehl dpkg-reconfigure locales }}} === Kernel und Bootloader === Nun kann ein geeigneter Kernel installiert werden. Der Kernel für Ubuntu 14.04 benötigt die Unterstützung der CPU von PAE, welches der AMD-Geode-Prozessor nicht bietet. [https://wiki.ubuntu.com/phillw/non-pae Phill Whiteside] {en} hat für 14.04 Kernel ohne PAE erstellt. Für Ubuntu 14.04 erfolgt die Installation des Non-PAE-Kernel mittels Eingabe der Befehle: {{{#!vorlage Befehl apt-get -y install wget wget http://phillw.net/isos/non-pae/14.04/alternate-14.04/linux-firmware-image-3.13.0-non-pae_124_i386.deb wget http://phillw.net/isos/non-pae/14.04/alternate-14.04/linux-headers-3.13.0-non-pae_124_i386.deb wget http://phillw.net/isos/non-pae/14.04/alternate-14.04/linux-image-3.13.0-non-pae_124_i386.deb wget http://phillw.net/isos/non-pae/14.04/alternate-14.04/linux-libc-dev_124_i386.deb dpkg -i *.deb rm *non-pae*.deb }}} Für Ubuntu 16.04: {{{#!vorlage Befehl apt-get -y install wget wget http://phillw.net/isos/non-pae/16.04/linux-firmware-image-4.4.0-non-pae_4.4.0-non-pae-1_i386.deb wget http://phillw.net/isos/non-pae/16.04/linux-headers-4.4.0-non-pae_4.4.0-non-pae-1_i386.deb wget http://phillw.net/isos/non-pae/16.04/linux-image-4.4.0-non-pae_4.4.0-non-pae-1_i386.deb wget http://phillw.net/isos/non-pae/16.04/linux-libc-dev_4.4.0-non-pae-1_i386.deb dpkg -i *.deb rm *non-pae*.deb }}} === Bootmanager installieren === Damit das System starten kann, benötigt es noch einen Bootmanager. In üblichen Ubuntu-Installationen wird der Bootmanager GRUB eingesetzt, der in diesem spezifischen Fall derart konfiguriert wird, dass er seine Ein- und Ausgaben über die serielle Schnittstelle erledigt. Bedauerlicherweise wurde aber auf verschiedenen Alix-Boards beobachtet, daß dies dazu führen kann, daß nach dem Einschalten des Systems, dieses nicht automatisch bootet, sondern im GRUB Menü verweilt. Dies ist vermutlich darauf zurückzuführen, daß anscheinend der Einschaltimpuls nach zufälligem Muster Zeichen im Seriellen Puffer erscheinen lässt, was die automatische Boot-Sequenz unterbricht. Um den Benutzer die Wahl zwischen den verschiedenen Boot-Managern zu überlassen, folgen nun die Anleitungen für die Installationen sowohl von SYSLINUX als auch von GRUB. {{{#!vorlage Warnung Bitte bei allen nachfolgenden Aktionen darauf achten, dass der angesprochene Gerätename auch __tatsächlich__ der ist, unter dem die CF-Karte im System angesprochen wird. Blindes Ausführen der Befehle kann ansonsten zu unerwünschten Resultaten führen! }}} ==== Booten mit SYSLINUX ==== Das SYSLINUX-Projekt stellt kompakte Boot-Loader für das Starten von MS-DOS-FAT-Dateisysteme (SYSLINUX), für das Starten über das Netzwerk (PXELINUX), für das Starten von bootbaren "El Torito" CD-ROMs (ISOLINUX) und für das Starten von ext2/ext3 Dateisystemen (EXTLINUX) zur Verfügung. ==== Installation von SYSLINUX unter Ubuntu 14.04 ==== Mit folgenden Befehlen wird SYSLINUX installiert und die CF-Karte bootbar gemacht: {{{#!vorlage Befehl apt-get -y install extlinux mkdir -f /boot/extlinux extlinux --install /boot/extlinux dd if=/usr/lib/extlinux/mbr.bin of=/dev/sdc }}} Als nächstes wird die Konfiguration des SYSLINUX Bootmanagers angepasst. Dafür muss die Datei '''/etc/default/extlinux''' editiert werden: {{{ EXTLINUX_UPDATE="true" EXTLINUX_ALTERNATIVES="default recovery" EXTLINUX_DEFAULT="l0" EXTLINUX_ENTRIES="all" EXTLINUX_MENU_LABEL="Ubuntu GNU/Linux, kernel" EXTLINUX_PARAMETERS="ro reboot=bios console=ttyS0,38400n8" EXTLINUX_ROOT="root=/dev/sda1" EXTLINUX_THEME="none" EXTLINUX_TIMEOUT="50" }}} Zum Schluss noch ein mal {{{#!vorlage Befehl extlinux-update }}} aufrufen. Hiermit ist die Installation des Bootmanagers abgeschlossen. ==== Booten mit GRUB 2 ==== Seit Version 9.10 benutzt Ubuntu [:GRUB_2:]. Die Installation erfolgt mittels folgenden Befehls: {{{#!vorlage Befehl apt-get -y install grub-pc }}} Während der Installation werden verschiedene Fragen gestellt, die alle mit der Eingabetaste bestätigt werden können. Wichtig ist hier lediglich, in der Liste der vorhandenen Geräte nur die CF-Karte (in diesem Fall '''/dev/sdc''') auszuwählen. Weiteren Anpassungen erfolgen mittels Eingabe diverser Werte in einigen Konfigurationsdateien. Als nächstes wird die Konfiguration des GRUB 2[11] angepasst. Dafür muss die Datei '''/etc/default/grub''' folgenden Inhalt vorweisen: {{{ # If you change this file, run 'update-grub' afterwards to update # /boot/grub/grub.cfg. GRUB_DEFAULT=0 GRUB_HIDDEN_TIMEOUT=0 GRUB_HIDDEN_TIMEOUT_QUIET=true GRUB_TIMEOUT="3" GRUB_DISTRIBUTOR=`lsb_release -i -s 2> /dev/null || echo Debian` GRUB_CMDLINE_LINUX_DEFAULT="verbose console=ttyS0,38400n8 reboot=bios" GRUB_CMDLINE_LINUX="" # Konfiguration der seriellen Schnittstelle der Alix-Boards: GRUB_SERIAL_COMMAND="serial --unit=0 --speed=38400" GRUB_TERMINAL=serial # Uncomment to disable graphical terminal (grub-pc only) #GRUB_TERMINAL=console # The resolution used on graphical terminal # note that you can use only modes which your graphic card supports via VBE # you can see them in real GRUB with the command `vbeinfo' #GRUB_GFXMODE=640x480 # Uncomment if you don't want GRUB to pass "root=UUID=xxx" parameter to Linux #GRUB_DISABLE_LINUX_UUID=true # Uncomment to disable generation of recovery mode menu entrys #GRUB_DISABLE_LINUX_RECOVERY="true" }}} Die eingebenen Änderungen bewirken, dass GRUB 2 seine Ein- und Ausgaben über die serielle Schnittstelle entgegen nimmt und ansonsten alle Pausen recht kurz ausfallen. In nachfolgenden Schritt wird GRUB 2 nun in die CF-Karte installiert. Da diese sich allerdings noch nicht im Zielsystem befindet, gibt es einen Unterschied zwischen den Parametern, wie sie im Boot-Sektor eingetragen werden müssen (z.B. dass sich das Betriebsystem auf dem ersten Datenträger befindet), und der momentanen Realität (und zwar die, dass das künftige Boot-Medium sich als zusätzliches Laufwerk in einem anderen System befindet). Zu diesem Zwecke wird die Zuweisung zwischen dem internen Gerätenamen und dem effektiven Gerätenamen in der Namens-Abgleichstabelle '''/boot/grub/devices.map''' von GRUB 2 folgendenmaßen getätigt: {{{ (hd0) /dev/sdc }}} Hierbei ist es existentiell wichtig, dass der Gerätename der CF-Karte eingegeben wird. Dieser wird sich später im laufenden System verändern. Hier soll jetzt erst mal der Name aus Sicht des installierenden Systems stehen. An diesem Punkt kann GRUB2 anhand der neuen Werte auf die CF-Karte mit folgenden Befehlen installiert und konfiguriert werden: {{{#!vorlage Befehl grub-install /dev/sdc update-grub }}} Nach der Installation kann nun die Namens-Abgleichstabelle '''/boot/grub/devices.map''' mit dem endgültigen Eintrag versehen werden: {{{ (hd0) /dev/sda }}} Damit auch bei künftigen Kernel-Aktualisierungen GRUB 2 seine Konfiguration anpassen kann, müssen noch folgende Zeilen der Datei '''/etc/kernel-img.conf''' hinzugefügt werden: {{{ postinst_hook = update-grub postrm_hook = update-grub }}} === Root-Passwort === Damit ein Login über SSH funktioniert, muss noch das Password für den Benutzer `root` festgelegt werden: {{{#!vorlage Befehl passwd root }}} === Serielle Konsole === Eine Standardinstallation konfiguriert eine Bildschirm-Konsolensystem mit sechs Konsolen. Diese werden nicht benötigt und daher entfernt. Dafür ist es lediglich erforderlich, die Event-Handler-Konfigurationsdateien der sechs Bildschirmkonsolen aus dem Event-Handler-Verzeichnis von [:Archiv/Upstart:] zu entfernen: {{{#!vorlage Befehl rm /etc/init/tty?.conf }}} Stattdessen wird nun eine Konfigurationsdatei benötigt, die dafür zuständig ist, eine serielle Konsole einzurichten. Dies erfolgt durch Erstellen der Datei '''/etc/init/ttyS0.conf''' mit folgendem Inhalt: {{{ # ttyS0 - getty # # This service maintains a getty on tty1 from the point the system is # started until it is shut down again. start on stopped rc RUNLEVEL=[2345] stop on runlevel [!2345] respawn exec /sbin/getty -8 38400 -L ttyS0 }}} === Zeitzone === Die Zeitzone des Systems wird mit folgendem Befehl festgelegt: {{{#!vorlage Befehl dpkg-reconfigure tzdata }}} === Zugang über SSH === Um auf das laufende System zugreifen zu können, muss ein [:SSH:]-Server installiert werden [2]: * '''openssh-server''' Ab hier ist das System über das Netz erreichbar. {{{#!vorlage Warnung Der SSH-Server akzeptiert standardmäßig die Authentifiziereung mittels Passwort. Sobald das System in den Regelbetrieb gehen wird, wird empfohlen, diese Möglichkeit abzuschalten, da sie ein erhebliches Sicherheitsrisiko darstellt. Bei abgeschalteter Passwort-Authentifizierung ist es nur noch möglich, sich mittels privatem Schlüssel anzumelden. Zu diesem Zwecke ist dafür Sorge zu tragen, den eigenen öffentlichen Schlüssel in die Datei '''~/.ssh/authorized_keys''' des entsprechenden Benutzers einzutragen. Die Passwort-Authentifizierung kann bei OpenSSH abgeschaltet werden, indem man die Option `PasswordAuthentication` in der Datei '''/etc/ssh/sshd_config''' auf `no` setzt. }}} === Zusätzlich geladene Module === Damit das System beim Start auch die [:Kernelmodule:] ("Treiber") für spezielle Hardware-Komponenten der Alix-Boards lädt, werden diese in der Datei '''/etc/modules''' eingetragen[10]: {{{ # /etc/modules: kernel modules to load at boot time. # # This file contains the names of kernel modules that should be loaded # at boot time, one per line. Lines beginning with "#" are ignored. # Alix Specific: natsemi lm90 scx200_acb base=0x810,0x820 leds-alix ledtrig-default-on ledtrig-heartbeat ledtrig-gpio ledtrig-timer }}} === Installation abschließen und CF-Karte aushängen === An diesem Punkt ist die eigentliche Installation abgeschlossen. Vor dem Entfernen der CF-Karte aus dem Kartenleser müssen aber noch folgende Befehle ausgeführt werden: {{{#!vorlage Befehl exit umount /mnt/alix/proc umount /mnt/alix/sys umount /mnt/alix/dev umount /mnt/alix }}} Sollte der letzte Befehl eine Fehlermeldung ausgeben, ist zu prüfen, ob noch ein Prozess auf das Verzeichnis '''/mnt/alix''' oder dessen Unterverzeichnisse zugreift. Erst wenn das Dateisystem ohne Fehlermeldung ausgehängt wurde, kann die Karte entnommen werden. {{{#!vorlage Warnung Nach der Eingabe des Befehls `exit` wird [:chroot:] beendet und man ist nicht mehr auf dem späteren Zielsystem unterwegs. Alle eingebenen Befehle im momentanen Terminal wirken sich wieder auf das reale System aus! }}} == Erster Start === Nach dem Einlegen der CF-Karte ins Alix-Board kann nun ein erster Start gewagt werden. Vor dem Einschalten muss das System aber noch ans Netzwerk angeschlossen werden. Bei Alix-Boards mit mehreren Netzwerkkarten ist die erste Netzwerkkarte erfahrungsgemäß jene, die sich direkt neben der Stromversorgungsbuchse befindet. Will man auf Nummer sicher gehen, so kann man alle Netzwerkstecker mit dem Netzwerk verbinden. An diesem Punkt kann das System eingeschaltet werden. Um festzustellen, wann das System hochgefahren ist und im Netzwerk erscheint, kann man vor dem Einschalten auf dem eigenen Rechner schon mal folgenden Befehl eingeben: {{{#!vorlage Befehl ping 192.168.97.100 }}} Nach ca. 10-15 Sekunden sollte sichtbare Aktivität auf beiden LEDs des aktiven Netzwerk-Anschlusses zu sehen sein. Der Erfolg ist dadurch zu erkennen, dass das Alix-System auf die Pings antwortet: {{{#!vorlage Befehl ping 192.168.97.100 }}} {{{ PING 192.168.97.100 (192.168.97.100) 56(84) bytes of data. From 192.168.97.249 icmp_seq=1 Destination Host Unreachable [...] From 192.168.97.249 icmp_seq=6 Destination Host Unreachable 64 bytes from 192.168.97.100: icmp_seq=7 ttl=64 time=2001 ms 64 bytes from 192.168.97.100: icmp_seq=8 ttl=64 time=992 ms --- 192.168.97.100 ping statistics --- 11 packets transmitted, 5 received, +6 errors, 54% packet loss, time 10026ms rtt min/avg/max/mdev = 0.389/599.057/2001.498/799.607 ms, pipe 3 }}} Tritt dieser Fall nicht ein, so ist davon auszugehen, dass das System nicht gestartet ist, die Netzwerk-Konfiguration nicht mit dem Netzwerk kompatibel ist oder bei der Ausführung der oben genannten Schritte etwas schiefgegangen ist. Eine genaue Analyse des Inhalts der CF-Karte erlaubt es in der Regel, den Fehler schnell zu finden. Allerdings sollte man auch in Erwägung ziehen, sich mit der passenden Hardware an die serielle Schnittstelle anzuschließen und den Startvorgang des Systems genau zu verfolgen. Ist hingegen erwartungsgemäß alles gut gegangen, kann man sich nun mit dem System mittels SSH verbinden: {{{#!vorlage Befehl ssh -l root 192.168.97.100 }}} {{{ The authenticity of host '192.168.97.100 (192.168.97.100)' can't be established. RSA key fingerprint is ec:38:36:0b:42:9c:c2:ae:17:6d:8f:d5:27:24:9d:f0. Are you sure you want to continue connecting (yes/no)? yes Warning: Permanently added '192.168.97.100' (RSA) to the list of known hosts. root@192.168.97.100's password: Linux alix-router 2.6.31-15-386 #50-Ubuntu SMP Tue Nov 10 17:30:14 UTC 2009 i586 To access official Ubuntu documentation, please visit: http://help.ubuntu.com/ root@alix-router:~# }}} Das System ist nun lauffähig und bereit für den letzten Feinschliff. {{{#!vorlage Hinweis Standardmäßig ist der [:SSH:]-Remote-Shell-Zugriff für den Benutzer `root` gesperrt. Jeglicher Versuch, sich per `root` auf die Maschine zu schalten, resultiert deshalb in eine Fehlermeldung: {{{ Permission denied, please try again. \}}} Um die entsprechende Berechtigung zu erteilen, muss in '''/etc/ssh/sshd_config''' in einem Editor mit Root-Rechten folgende Anpassung vorgenommen werden: {{{ PermitRootLogin prohibit-password \}}} wird in {{{ PermitRootLogin yes \}}} geändert. Anschließend muss mittels {{{#!vorlage Befehl sudo systemctl restart sshd \}}} der SSH-Daemon neu gestartet werden. Danach kann mit dem Root-User per SSH eine Remote Shell geöffnet werden. Im tatsächlichen Einsatz ist es allerdings ratsam, einen zweiten User mit eingeschränkten Privilegien anzulegen. Gute Gründe dafür werden auf [https://unix.stackexchange.com/a/82639 unix.stackexchange.com] {en} genannt. }}} = Finale Konfiguration und Optimierung = == Aktualisierung und Softwareinstallation == Zunächst das ganze System aktualisieren und die Standard-Systemkomponenten installieren: {{{#!vorlage Befehl apt-get update apt-get upgrade apt-get -y install ubuntu-standard screen }}} Damit [:Screen:] auch angenehm benutzbar wird, sollte die entsprechende Konfigurationsdatei '''/etc/screenrc''' noch etwas verbessert werden. Hier die vollständige geänderte Fassung mit Änderungsvermerken: {{{ # $Id: screenrc,v 1.15 2003/10/08 11:39:03 zal Exp $ # # /etc/screenrc # # This is the system wide screenrc. # # You can use this file to change the default behavior of screen system wide # or copy it to ~/.screenrc and use it as a starting point for your own # settings. # # Commands in this file are used to set options, bind screen functions to # keys, redefine terminal capabilities, and to automatically establish one or # more windows at the beginning of your screen session. # # This is not a comprehensive list of options, look at the screen manual for # details on everything that you can put in this file. # # ------------------------------------------------------------------------------ # SCREEN SETTINGS # ------------------------------------------------------------------------------ startup_message off #nethack on #defflow on # will force screen to process ^S/^Q deflogin on #autodetach off # turn visual bell on # vbell on # vbell_msg " Wuff ---- Wuff!! " # define a bigger scrollback, default is 100 lines defscrollback 10240 # ------------------------------------------------------------------------------ # SCREEN KEYBINDINGS # ------------------------------------------------------------------------------ # Remove some stupid / dangerous key bindings bind ^k #bind L bind ^\ # Make them better bind \\ quit bind K kill bind I login on bind O login off bind } history # An example of a "screen scraper" which will launch urlview on the current # screen window # #bind ^B eval "hardcopy_append off" "hardcopy -h $HOME/.screen-urlview" "screen urlview $HOME/.screen-urlview" # ------------------------------------------------------------------------------ # TERMINAL SETTINGS # ------------------------------------------------------------------------------ # The vt100 description does not mention "dl". *sigh* termcapinfo vt100 dl=5\E[M # turn sending of screen messages to hardstatus off hardstatus off # Set the hardstatus prop on gui terms to set the titlebar/icon title termcapinfo xterm*|rxvt*|kterm*|Eterm* hs:ts=\E]0;:fs=\007:ds=\E]0;\007 # use this for the hard status string hardstatus string "%h%? users: %u%?" # An alternative hardstatus to display a bar at the bottom listing the # windownames and highlighting the current windowname in blue. (This is only # enabled if there is no hardstatus setting for your terminal) # #hardstatus lastline "%-Lw%{= BW}%50>%n%f* %t%{-}%+Lw%<" # set these terminals up to be 'optimal' instead of vt100 termcapinfo xterm*|linux*|rxvt*|Eterm* OP # Change the xterm initialization string from is2=\E[!p\E[?3;4l\E[4l\E> # (This fixes the "Aborted because of window size change" konsole symptoms found # in bug #134198) termcapinfo xterm 'is=\E[r\E[m\E[2J\E[H\E[?7h\E[?1;4;6l' # To get screen to add lines to xterm's scrollback buffer, uncomment the # following termcapinfo line which tells xterm to use the normal screen buffer # (which has scrollback), not the alternate screen buffer. # #termcapinfo xterm|xterms|xs|rxvt ti@:te@ # Enable non-blocking mode to better cope with flaky ssh connections. defnonblock 5 # ------------------------------------------------------------------------------ # STARTUP SCREENS # ------------------------------------------------------------------------------ # Example of automatically running some programs in windows on screen startup. # # The following will open top in the first window, an ssh session to monkey # in the next window, and then open mutt and tail in windows 8 and 9 # respectively. # # screen top # screen -t monkey ssh monkey # screen -t mail 8 mutt # screen -t daemon 9 tail -f /var/log/daemon.log hardstatus alwayslastline "%{kw} %{b}%H%{K} < %-w%{Wb} %n %t %{-}%+w >" # This lets work all functions keys in midnight commander termcapinfo xterm 'k1=\E[11~:k2=\E[12~:k3=\E[13~:k4=\E[14~' }}} == Ansteuerung der LEDs == Zur Ansteuerung der LEDs müß das entsprechende Modul kompiliert und geladen werden. Eine detaillierte Beschreibung dazu findet sich in [:Archiv/Alix#LEDs-ansteuern:LEDs ansteuern]. Damit die erste LED nicht einfach nur stur vor sich hin leuchtet, sondern ein wenig Rückmeldung über den Systemstatus und Run Level gibt, hier ein Event-Handler in Form der Datei '''/etc/init/watchdog-led.conf''': {{{ # WatchDog LED Configuration for Alix-Boards # # This task configures the watchdog led to resemble the status # of the system description "Configuration of the first alix led (Watchdog led)" author "Leo Moll " start on runlevel [0123456] stop on runlevel [!$RUNLEVEL] export RUNLEVEL export PREVLEVEL task script case $RUNLEVEL in 1|6) echo timer > /sys/class/leds/alix\:1/trigger echo 100 > /sys/class/leds/alix\:1/delay_on echo 100 > /sys/class/leds/alix\:1/delay_off ;; 0) echo 0 > /sys/class/leds/alix\:1/brightness echo none > /sys/class/leds/alix\:1/trigger ;; 2|3|4|5) echo heartbeat > /sys/class/leds/alix\:1/trigger ;; *) echo timer > /sys/class/leds/alix\:1/trigger echo 100 > /sys/class/leds/alix\:1/delay_on echo 300 > /sys/class/leds/alix\:1/delay_off ;; esac end script }}} Basierend auf dem entsprechenden Run Level verhält sich nun die erste LED folgendermaßen: * Normaler Betrieb: Herzschlag (Heartbeat) * Reboot: Schnelles blinken * System heruntergefahren: LED aus * Beim Starten: LED an * System gestartet in Run Level 1: schnelles blinken * Anderer Runlevel: Kurzes blinken == Fazit == Das System befindet sich nun im Zustand eines gut funktionierenden Basissystems. Dies ist ein hervorragender Startpunkt, um beliebige Spezial-Applikationen wie z.B. Spezialrouter, kleine Netzwerkserver oder Telefonanlagen daraus zu fabrizieren. {{{#!vorlage Hinweis Möchte man das System auf weitere CF-Karten klonen bzw. die CF-Karte in ein anderes Alix-System einsetzen, so darf nicht vergessen werden, die Datei '''/etc/udev/rules.d/70-persistent-net.rules''' zu löschen. Tut man dies nicht, werden die Netzwerkadapter neue Namen erhalten (z.B. `eth3`, `eth4` und `eth5`) und werden nicht initialisiert (da diese ja nicht in der '''/etc/network/interfaces''' stehen). }}} = Links = * [https://lwn.net/Articles/169919/ LED Class, Triggers and Drivers] {en} * [https://ichbinroot.de/alix/leds.html LEDs] {de} - Blogbeitrag 05/2008 * [https://syslinux.zytor.com The Syslinux Project] {en} Homepage des SYSLINUX Projektes * [:Archiv/Alix:] - Hauptartikel #tag: Netzwerk, Hardware, Server