Graph-IT

Erstellen eines ControlPi-Images

Voraussetzungen

Die Pakete binfmt-qemu-static und qemu-user-static werden für das chroot in das Raspberry-Pi-System benötigt.

Installation des Grundsystems

Image-Datei einrichten und mounten:

$ cd /tmp/
$ fallocate -l 4G 20YY-MM-DD-controlpi-generic.img
$ sudo losetup --find --show 20YY-MM-DD-controlpi-generic.img
$ sudo parted --script /dev/loop0 mklabel msdos
$ sudo parted --script /dev/loop0 mkpart primary fat32 0% 100M
$ sudo parted --script /dev/loop0 mkpart primary ext4 100M 100%
$ sudo mkfs.vfat -F32 /dev/loop0p1
$ sudo mkfs.ext4 -F /dev/loop0p2
$ sudo mount /dev/loop0p2 /mnt/
$ sudo mkdir /mnt/boot
$ sudo mount /dev/loop0p1 /mnt/boot/

Arch Linux ARM herunterladen und entpacken:

$ wget http://archlinuxarm.org/os/ArchLinuxARM-rpi-armv7-latest.tar.gz
$ sudo tar xpf ArchLinuxARM-rpi-armv7-latest.tar.gz -C /mnt/

In chroot wechseln und Paket-Schlüssel einrichten:

$ TERM=xterm sudo arch-chroot /mnt/
# pacman-key --init
# pacman-key --populate archlinuxarm

Pakete entfernen und hinzufügen bis folgendes Minimalsystem erreicht ist:

# pacman -Q --deps --unrequired --unrequired
# pacman -Q --explicit
base
ccid
ethtool
fakeroot
gcc
git
i2c-tools
inetutils
jq
linux-rpi
make
openssh
pacman-contrib
parted
pcsclite
python
raspberrypi-bootloader
raspberrypi-firmware
rsync
sudo
swig
vim
# pacman -Syu

Das Journal soll nicht auf der SD-Karte gespeichert werden:

# rm -r /var/log/journal /var/log/lastlog

Standard-Benutzer von alarm zu pi umbenennen und Passwörter vergeben:

# mv /home/alarm /home/pi
# sed -i 's/alarm/pi/g' /etc/passwd /etc/shadow /etc/group /etc/gshadow
# passwd
# passwd pi

Installation von pigpio

Bauen und Installieren des Paketes:

# su - pi
$ git clone https://aur.archlinux.org/pigpio.git
$ cd pigpio/
$ makepkg -s
$ mv pigpio-XX-Y-armv7h.pkg.tar.xz ~/
$ cd ~/
$ rm -r pigpio/
$ exit
# pacman -U /home/pi/pigpio-XX-Y-armv7h.pkg.tar.xz

Paket-Cache leeren:

# paccache -rk0

Installation des ControlPi-Systems:

Python-Virtual-Environment unter pi-Benutzer einrichten:

# su - pi
$ python -m venv controlpi-venv
$ source controlpi-venv/bin/activate
$ pip install -U pip setuptools wheel

ControlPi-Pakete installieren:

$ pip install git+git://git.graph-it.com/graphit/controlpi.git
$ pip install git+git://git.graph-it.com/graphit/controlpi-statemachine.git
$ pip install git+git://git.graph-it.com/graphit/controlpi-wsclient.git
$ pip install git+git://git.graph-it.com/graphit/controlpi-wsserver.git
$ pip install git+git://git.graph-it.com/graphit/controlpi-pinio.git
$ pip install git+git://git.graph-it.com/graphit/controlpi-modbus.git
$ pip install git+git://git.graph-it.com/graphit/controlpi-nfc.git
$ exit

Konfiguration aus git-Repository aufspielen

Von außerhalb des chroot:

$ sudo rsync -rlp etc /mnt/
$ sudo rsync -rlp boot /mnt/
$ rsync -rlp home/pi /mnt/home/

Dies installiert die folgenden Konfigurations-Dateien:

etc/
├── hostname
├── localtime -> /usr/share/zoneinfo/Europe/Berlin
├── modules-load.d
│   └── i2c.conf
├── resolv.conf -> /run/systemd/resolve/stub-resolv.conf
├── ssh
│   └── sshd_config.d
│       └── NoRootNoPassword.conf
├── sudoers.d
│   └── wheel
└── systemd
    ├── resolved.conf.d
    │   └── NoNegCache.conf
    └── system
        ├── controlpi.service
        ├── multi-user.target.wants
        │   ├── controlpi.service -> /etc/systemd/system/controlpi.service
        │   ├── pcscd.service -> /usr/lib/systemd/system/pcscd.service
        │   └── pigpiod.service -> /usr/lib/systemd/system/pigpiod.service
        └── pigpiod.service.d
            └── override.conf
boot/
└── config.txt
home/
└── pi
    ├── conf.json
    └── resize-fs.sh

Innerhalb des chroot eventuell Berechtigungen und Eigentürmer reparieren:

# chmod o-r /etc/sudoers.d/wheel
$ chmod -R go-rx .ssh/

In /home/pi/.ssh/authorized_keys sollten die Public-Keys derjenigen hinterlegt sein, die initial Zugriff per SSH haben sollen, da die Konfiguration das Einloggen mit Passwort komplett unterbindet.

Image schließen und aufspielen

Von außerhalb des chroot:

$ sudo umount /mnt/boot/
$ sudo umount /mnt/
$ sudo losetup --detach /dev/loop0
$ xz 20YY-MM-DD-controlpi-generic.img
$ xz --decompress --stdout 20YY-MM-DD-controlpi-generic.img.xz | sudo dd of=/dev/sdx bs=1M oflag=sync status=progress

Spezialisierte Images