Platz aus Android-Benutzerpartition für postmarketOS freigeben

Dies ist Artikel 2 der Serie zur Einrichtung eines SHIFT6mq mit postmarketOS. Um die hier beschriebenen Schritte ausführen zu können, muss postmarketOS am Telefon entsprechend des ersten Artikels1 lauffähig installiert sein. (Weitere Artikel der Serie sind in den Fußnoten verlinkt.3)

Ausgangssituation

Die Android “userdata”-Partition belegt standardmäßig den Großteil des Speicherplatzes. Beim SHIFT6mq sind das rund 107 GB welche postmarketOS vorenthalten bleiben.

Um das zu ändern, soll der Bereich verkleinert und Platz für eine Linux-kompatible Partition geschaffen werden.

Warnung: Etwaige bestehende Dateien gehen dabei verloren oder werden beschädigt.

Android-Benutzerpartition verkleinern

(Modus: postmarketOS)

Der Speicherplatz kann grundsätzlich frei auf die beiden Betriebssysteme verteilt werden. Möchte man Android nur im Notfall nutzen, sollten 2 GB für eigene Dateien ausreichen.

# Diese Konstante setzen
NEWSIZE_IN_GB=2

Unter Berücksichtigung der gewünschten neuen Größe ermitteln die folgenden Befehle die neue Konfiguration und ändern die bestehende Partition entsprechend ab.

# Vorgehen absichern
set -u

# "userdata"-Partition finden
userdata_entry=`echo print | doas parted /dev/sda | grep -w ' userdata$'`
userdata_number=`echo $userdata_entry | awk '{ print $1 }'`

# Anfangs- und neuen Endpunkt der Partition bestimmen
partition_start=`echo $userdata_entry | awk '{ print $2 }' | cut -dG -f1`
partition_end=`echo $partition_start + $NEWSIZE_IN_GB | bc`

printf '\n%s\n\nPartition %s wurde als userdata erkannt.\n' \
       "$userdata_entry" "$userdata_number"
printf '\nSie wird auf auf den Bereich %sGB - %sGB konfiguriert.\n' \
       "$partition_start" "$partition_end"

# Neue Größe setzen
doas parted /dev/sda resizepart $userdata_number ${partition_end}GB

An diesem Punkt sollte doas fdisk -l /dev/sda bereits die neue Größe für die Partition anzeigen.

Die Anleitung geht davon aus, dass man erst in einem späteren Schritt ein neues Android installiert. Möchte man ein bestehendes weiter nutzen, muss im Recovery-Modus ein Factory-Reset durchgeführt werden, damit es diese Änderung erkennt.

Zusätzliche Partition erstellen

(Modus: postmarketOS)

Unmittelbar auf die nun verkleinerte “userdata”-Partition soll die neue Partition für postmarketOS folgen.

Diese Schritte beziehen sich auf zuvor gesetzte Variablen. Es muss daher die bisher genutzte Kommandozeile weiter verwendet werden.

# Vorgehen absichern
set -u

# Anfangs- und neuen Endpunkt der Partition bestimmen
next_number=$((userdata_number + 1))
next_partition_start="$partition_end"
disk_end=`printf 'unit GB\nprint' | doas parted /dev/sda | sed -n "/^Disk/ s|^Disk .*: \(.*\)GB|\1|p"`

doas parted /dev/sda mkpart sda${next_number} ext4 ${next_partition_start}GB ${disk_end}GB

Dateisystem einrichten

Dem Ansatz “Grundsätzlich-Sicher” getreu, wird das Dateisystem mit Verschlüsselung konfiguriert:

# Vorgehen absichern
set -u

# Namen und Pfade bestimmen
disk=/dev/sda${next_number}
name=${disk##*/}
keyfile=/root/${name}.lukskey

# Verschlüsseltes Dateisystem erstellen
doas dd if=/dev/urandom of="$keyfile" bs=1024 count=2 && chmod 400 "$keyfile" 
doas cryptsetup luksFormat "$disk" "$keyfile"
doas cryptsetup luksOpen "$disk" "$name" --key-file="$keyfile"
doas mkfs.ext4 -m 2 "/dev/mapper/$name"

Dateisystem bei Systemstart automatisch einhängen

In postmarketOS bestimmt dmcrypt welche Geräte beim Systemstart entschlüsselt werden6.

printf "\n\ntarget=%s\nsource='%s'\nkey='%s'\n\n" "$name" "$disk" "$keyfile" | \
     doas tee -a /etc/conf.d/dmcrypt
echo "/dev/mapper/$name  /media/floppy   ext4 nofail,defaults      0 0" | \
     doas tee -a /etc/fstab
doas rc-update add dmcrypt boot

# Dateisystem sofort einhängen
doas mount /media/floppy

Gratulation! Ab hier kann die neue Partition unter /media/floppy genutzt werden.
(“floppy” bietet sich als Einhängepunkt an, da er in Alpine-Systemen bereits besteht und wohl nie anderwärtig gebraucht werden wird.)

[optional] Alternative Entschlüsselung ermöglichen

Der bisherige Ablauf hinterlegt einen Zufallsschlüssel (in /root/).
Geht dieser verloren, werden sämtliche Daten unbrauchbar.

Mit folgendem Kommando kann man zusätzlich ein Passwort setzen, das unabhängig vom generierten Schlüssel Zugriff zu den Daten ermöglicht:

doas cryptsetup luksAddKey $disk --key-file $keyfile

1 Artikel 1 der Serie: postmarketOS auf SHIFT6mq Smartphone installieren

2 Artikel 2 (dieser)

3 Artikel 3 der Serie: Bootloader-Firmware des SHIFT6mq Smartphones aktualisieren

6 wiki.alpinelinux.org/wiki/LVM_on_LUKS
Alpine-Wiki: “Mounting additional encrypted filesystems at boot”