Installation Gentoo

Gentoo Linux auf dem ESPRESSObin installieren

Ziel

Im Folgenden wird die Grundinstallation von Gentoo Linux auf dem ESPRESSObin beschrieben.

Voraussetzungen

Die Installation wird mit Hilfe eines unter Linux (vorzugsweise Gentoo) laufenden PCs durchgeführt. Dieser benötigt einen USB-Port und muß an einem Netzwerk mit DHCP und Internet-Zugang angeschlossen sein. Das ESPRESSObin wird über den WAN-Port (rechte Ethernet-Schnittstelle bei Draufsicht, neben USB3-Port) ebenfalls mit diesem Netzwerk verbunden. Der Mini-USB-Port wird mit dem USB-Anschluß am PC verbunden und natürlich das Netzteil angeschlossen.

Die Installation erfolgt auf eine hinreichend große Micro-SD-Card (ab 16GB), diese kann gleich in den Slot vom ESPRESSObin gesteckt werden. Als Installationsmedium dient ein USB-Stick mit mindestens 1GB (ArchLinux muß darauf passen).

Auf dem PC wird ein Terminalprogramm gestartet, z.B. Minicom:

# minicom -D /dev/ttyUSB0 -b 115200

In den Minicom-Einstellungen für den seriellen Port muß evtl. noch das Hardware-Handshake deaktiviert werden.

Installationsumgebung

Die Installation erfolgt mittels ArchLinux, welches von einem USB-Stick gebootet wird. Das Vorgehen entspricht dem im ESPRESSObin-Wiki beschriebenen:

Boot from removable storage - ArchLinux

USB-Stick vorbereiten

Der zu nutzende USB-Stick wird an einen unter Linux (vorzugsweise Gentoo) laufenden PC angeschlossen. Im Folgenden wird davon ausgegangen, daß der Stick als /dev/sdb angesprochen wird. Vorher sollte aber unbedingt geprüft werden, ob das auch der Stick ist:

# lsblk
NAME                MAJ:MIN RM   SIZE RO TYPE  MOUNTPOINT
sda                   8:0    0 465,8G  0 disk  
├─sda1                8:1    0 125,5M  0 part  
└─sda2                8:2    0 465,7G  0 part  
sdb                   8:16   1   7,6G  0 disk  
└─sdb1                8:17   1   7,6G  0 part

Im Beispiel ist sdb also ein USB-Stick mit 8GB mit einer Partition (sdb1). Dieser wird nun erstmal gelöscht, partitioniert, formatiert und gemountet:

dd if=/dev/zero of=/dev/sdb bs=1M count=100
(echo n; echo p; echo 1; echo ''; echo ''; echo w) | sudo fdisk /dev/sdb
mkfs.ext4 -O ^metadata_csum,^64bit /dev/sdb1
mkdir -p /mnt/usbstick
mount /dev/sdb1 /mnt/usbstick

Anschließend wird das aktuelle ArchLinux-Image heruntergeladen und auf den USB-Stick entpackt:

cd /tmp
wget http://os.archlinuxarm.org/os/ArchLinuxARM-espressobin-latest.tar.gz
cd /mnt/usbstick
tar -xzf /tmp/ArchLinuxARM-espressobin-latest.tar.gz .

Auf dem Stick muß eine Datei erstellt werden:

nano -w /mnt/usbstick/boot/uEnv_usb.txt

mit folgendem Inhalt:

kernel_addr=0x2000000
ramdisk_addr=0x1100000
fdt_addr=0x1000000
fdt_high=0xffffffffffffffff
image_name=/boot/Image
ramdisk_name=/boot/initramfs-linux.uimg
fdt_name=/boot/dtbs/marvell/armada-3720-espressobin.dtb
get_env=if ext4load usb 0:1 $loadaddr /boot/uEnv_usb.txt; then env import -t $loadaddr $filesize; if test -n ${uenvcmd}; then run uenvcmd; fi; fi
get_images=ext4load usb 0:1 $kernel_addr $image_name && ext4load usb 0:1 $fdt_addr $fdt_name
get_ramdisk=ext4load usb 0:1 $ramdisk_addr $ramdisk_name
bootargs=console=ttyMV0,115200 earlycon=ar3700_uart,0xd0012000 root=/dev/sda1 rw rootwait
bootcmd=usb start; run get_env; if run get_images; then if run get_ramdisk; then booti $kernel_addr $ramdisk_addr $fdt_addr; else booti $kernel_addr - $fdt_addr; fi; fi

Zuletzt wird der USB-Stick unmounted und kann dann ans ESPRESSObin gesteckt werden.

Booten

Das ESPRESSObin wird neu gestartet und das Booten durch Drücken von ENTER im seriellen Terminal abgebrochen.

Hit any key to stop autoboot:  0
Marvell>>

Nun werden die USB-Ports aktiviert, Umgebungs-Variable gesetzt und vom Stick gebootet:

Marvell>> usb reset
(Re)start USB...
USB0:   Register 2000120 NbrPorts 2
Starting the controller
USB XHCI 1.00
scanning bus 0 for devices... 2 USB Device(s) found
       scanning usb for storage devices... 1 Storage Device(s) found
       scanning usb for ethernet devices... 0 Ethernet Device(s) found

Marvell>> ext4load usb 0:1 $loadaddr /boot/uEnv_usb.txt
766 bytes read in 171 ms (3.9 KiB/s)
Marvell>> env import -t $loadaddr $filesize

Marvell>> saveenv

Marvell>> boot

Anschließend kann man sich als Nutzer "alarm" mit dem Paßwort "alarm" anmelden (Root-Paßwort ist "root"). Der WAN-Port sollte per DHCP eine Adresse erhalten haben, Adressen im Internet sollten anpingbar sein. Über die IP-Adresse des WAN-Ports kann man sich nun auch per SSH mit dem ESPRESSObin verbinden und die weitere Installation darüber durchführen. Wer mag, kann vorher noch wget, Screen und den Midnight Commander installieren:

# pacman -S wget
# pacman -S screen
# pacman -S mc

Grundinstallation

Die Grundinstallation erfolgt im Wesentlichen nach dem Gentoo Handbuch. Für die arm64-Architektur existiert leider noch kein eigenes Handbuch, deswegen muß man sich z.B. ans AMD64-Handbuch halten und sinngemäß abwandeln.

Micro-SD-Card formatieren

U-Boot liest den Kernel standardmäßig von der ersten Partition und nutzt diese auch als Root, deswegen nutzen wir nur eine Root- und eine Swap-Partition. Im folgenden Beispiel ist /dev/mmcblk0 eine SD-Card mit 32GB, formatiert bleiben knapp 29GB. Zuerst wird die Partitiontable gelöscht, dann die Root-Partition mit 26GB. Der Rest wird die Swap-Partition:

# dd if=/dev/zero of=/dev/mmcblk0 bs=1M count=100
# (echo n; echo p; echo 1; echo ''; echo '+26G'; echo w) | fdisk /dev/mmcblk0
# (echo n; echo p; echo 2; echo ''; echo ''; echo w) | fdisk /dev/mmcblk0
# (echo t; echo 2; echo 82; echo w) | fdisk /dev/mmcblk0

Nun wird formatiert:

# mkfs.ext4 -L ROOT -O ^metadata_csum,^64bit -T news /dev/mmcblk0p1
# mkswap -L SWAP /dev/mmcblk0p2

Jetzt können die Partitionen noch gemountet werden:

# mkdir /mnt/gentoo
# mount /dev/mmcblk0p1 /mnt/gentoo
# swapon /dev/mmcblk0p2

Basis-System

Es wird ein experimentellen Stage3 verwendet, die stabilen Releases sind uralt. Das Stage3 wird heruntergeladen (das aktuellste findet man unter http://distfiles.gentoo.org/experimental/arm64/) und entpackt:

# cd /mnt/gentoo/
# wget http://ftp.uni-erlangen.de/gentoo/releases/arm/autobuilds/current-stage3-arm64/stage3-arm64-20161219.tar.bz2
#tar xpf stage3-*.tar.{bz2,xz} --xattrs-include='*.*' --numeric-owner

/mnt/gentoo/etc/portage/make.conf wird angepaßt:

CFLAGS="-O2 -pipe"
CHOST="aarch64-unknown-linux-gnu"

PORTDIR="/usr/portage"
DISTDIR="/usr/portage/distfiles"
PKGDIR="/usr/portage/packages"

MAKEOPTS="-j3"

LC_MESSAGES=C
LANG="de_DE@euro"
LANGUAGE="49"
LINGUAS="de"
L10N="de"

Nun kann ist Gentoo-chroot gewechselt werden:

# cp --dereference /etc/resolv.conf /mnt/gentoo/etc/
#mount --types proc /proc /mnt/gentoo/proc
#mount --rbind /sys /mnt/gentoo/sys
#mount --make-rslave /mnt/gentoo/sys
#mount --rbind /dev /mnt/gentoo/dev
#mount --make-rslave /mnt/gentoo/dev 
#chroot /mnt/gentoo /bin/bash
#source /etc/profile
#export PS1="(chroot) ${PS1}"

Portage wird heruntergeladen:

# emerge-webrsync

Setzen der Zeitzone:

# echo "Europe/Berlin" > /etc/timezone
# emerge --config sys-libs/timezone-data

Locale:

/etc/locale.gen editieren:

en_US ISO-8859-1
en_US.UTF-8 UTF-8
en_DK.UTF-8 UTF-8 
de_DE.UTF-8 UTF-8
de_DE@euro ISO-8859-15

Dann die Locales erstellen:

# locale-gen

...und die gewünschte Locale auswählen:

# eselect locale list
Available targets for the LANG variable:
  [1]   C
  [2]   POSIX
  [3]   de_DE.iso885915@euro
  [4]   de_DE.utf8
  [5]   de_DE@euro
  [6]   en_DK.utf8
  [7]   en_US
  [8]   en_US.iso88591
  [9]   en_US.utf8
  [ ]   (free form)


# eselect locale set 4
# env-update && source /etc/profile && export PS1="(chroot) $PS1"

Kernel

In aktuellen Mainline- und damit auch Gentoo-Kernels ist eigentlich bereits alles drin, was das ESPRESSObin benötigt. Es existiert aber im ARM-Repository ein Kernel-Ebuild speziell fürs ESPRESSObin. Da ist neben einigen Patches auch eine Default-Konfiguration enthalten. Da sich die Einbindung des kompletten Repositories nicht lohnt, laden wir nur das Ebuild unter https://github.com/gentoo/arm/tree/master/sys-kernel/armv8multi-sources mit allen anderen Files herunter und legen es in einem lokalen Overlay ab.

# emerge -av u-boot-tools genkernel-next armv8multi-sources
# cd /usr/src/linux
# make espressobin_defconfig

Tools installieren

Die folgenden grundlegenden Tools werden istalliert:

  • NTP
  • Sysklogs
  • Cronie
  • DHCPCD
  • Midnight Commander

Cron, Syslog und SSH-Daemon werden aktiviert:

# emerge -av ntp sysklogd cronie dhcpcd app-misc/mc
# rc-update add sysklogd default
# rc-update add cronie default
# rc-update add sshd default

Netzwerk

Für den Anfang wird nur das WAN-Interface mit DHCP-Client konfiguriert:

/etc/conf.d/net

dns_domain_lo="rbg.unitas-network.de"

config_eth0="null"

config_wan="dhcp"
rc_net_wan_need="net.eth0"

Zum Default-Runlevel hinzufügen:

# cd /etc/init.d
# ln -s net.lo net.eth0
# ln -s net.lo net.wan
# rc-update add net.eth0 default
# rc-update add net.wan default

Konfiguration anpassen:

/etc/fstab

LABEL=ROOT              /               ext4            noatime         0 1
LABEL=SWAP              none            swap            sw              0 0

/etc/conf.d/keymaps

keymap="de-latin1-nodeadkeys"
windowkeys="YES"
extended_keymaps=""
dumpkeys_charset=""
fix_euro="NO"

/etc/conf.d/hostname

hostname="espressobin"

Root-Paßwort setzen

# passwd

Uhr

Das ESPRESSObin enthält keine Hardware-Uhr. Deswegen muß zum Einstellen der Uhrzeit NTP verwendet werden. (bereits mit den anderen Tools installiert). hwclock wird durch swclock ersetzt, welches beim Booten die Zeit auf die Zeit beim letzten Shutdown setzt.

# rc-update del hwclock boot
# rc-update add swclock boot
# rc-update add ntp-client default

wird fortgesetzt...