Da das Betriebssystem und der Bootloader die mit der SystemCD des Terasic DE10 Nano Boards mitgeliefert wurden ziemlich alt sind, habe ich mich damit beschäftigt die aktuellen Mainline Versionen zu nutzen.
Dazu gehört die aktuelle Version von u-boot (Bootloader), einem aktuellen Linux Kernel (v5.1) und einem Root Filesystem auf Debian Basis. Dabei habe ich mich an diesem Skript orientiert, da mir die Ordnerstruktur und das Skript zugesagt haben.
Bei Interesse findet man meine Ergebnisse unter https://github.com/svenpaass/de10nano_template. Dies soll für mich als Template für weitere Projekte dienen. Evtl. werde ich das Root-Filesystem in Zukunft durch busybox o.ä. ersetzen.
Um das Root Filesystem zu erstellen, habe ich testweise Debian Stretch verwendet. Das Paket qemu-user-static vereinfacht dabei den Prozess deutlich, da man sich nicht um das chroot für die zweite Phase des debootstrap-Prozesses kümmern muss.
# QEMU Paket installieren
sudo apt-get install qemu-user-static
Danach wird ein minimales System im Verzeichnis rootfs installiert:
sudo qemu-debootstrap --verbose --arch=armhf stretch rootfs http://ftp.debian.org/debian
Im Anschluss wird das rootfs-Verzeichnis noch etwas angepasst, damit einige Tools vorhanden sind.
sudo chroot rootfs <<EOFCHROOT
# Set the machine’s hostname.
echo "DE10-SoC" > "/etc/hostname"
tee "/etc/hosts" >"/dev/null" <<EOF
127.0.0.1 localhost
127.0.1.1 DE10-SoC
EOF
# Create the “/etc/network/interfaces” file that describes the network
# interfaces available on the board.
tee "/etc/network/interfaces" > "/dev/null" <<EOF
# interfaces(5) file used by ifup(8) and ifdown(8)
# The loopback network interface
auto lo
iface lo inet loopback
allow-hotplug eth0
# DHCP configuration
#iface eth0 inet dhcp
# Static IP
iface eth0 inet static
address 192.168.42.42
gateway 192.168.42.1
netmask 255.255.255.0
network 192.168.42.0
broadcast 192.168.42.255
EOF
# DNS configuration for name resolution. We use google's public DNS server here.
tee "/etc/resolv.conf" > "/dev/null" <<EOF
nameserver 8.8.8.8
EOF
tee "/etc/apt/sources.list" > "/dev/null" <<EOF
deb http://ftp.de.debian.org/debian stretch main contrib non-free
deb http://ftp.de.debian.org/debian stretch-updates main contrib non-free
deb http://security.debian.org/debian-security stretch/updates main contrib non-free
EOF
apt -y update
apt -y upgrade
apt -y --purge --autoremove
apt -y --no-install-recommends install locales
# Configure the locale to have proper language support.
localedef -i en_US -c -f UTF-8 en_US.UTF-8
localedef -i de_DE -c -f UTF-8 de_DE.UTF-8
echo 'LANG="en_US.UTF-8"'>/etc/default/locale
dpkg-reconfigure --frontend=noninteractive locales
# Configure the timezone.
echo "Europe/Berlin" > "/etc/timezone"
dpkg-reconfigure -f noninteractive tzdata
# Create a user and a password. In this example, we create a user called
# “svenpaass” with password "Start1234". Note that we compute an encrypted version of
# the password, because useradd does not allow plain text passwords to be used
# in non-interactive mode.
username="svenpaass"
password="Start1234"
encrypted_password="$(perl -e 'printf("%s\n", crypt($ARGV[0], "password"))' "${password}")"
useradd -m -p "${encrypted_password}" -s "/bin/bash" "${username}"
# Ubuntu requires the admin to be part of the "adm" and "sudo" groups, so add
# the previously-created user to the 2 groups.
addgroup ${username} adm
addgroup ${username} sudo
# Set root password to "Start1234" (same as previously-created user).
echo -e "${password}\n${password}\n" | passwd root
# cleanup image
apt-get clean
rm -rf /var/lib/apt/lists
rm -rf /var/cache/apt/*
EOFCHROOT
Am Ende wird der QEMU Befehl, der für das chroot in die ARM Umgebung notwendig war, aus dem rootfs-Verzeichnis entfernt.
sudo rm rootfs/usr/bin/qemu-arm-static
Jetzt kann man den Inhalt von rootfs auf die SD-Karte kopieren...