Profbunny hat geschrieben:wie würdest du denn so eine unit anlegen um systemd da auf die sprünge zu helfen?
Das ist gar nicht soooo kompliziert. Wobei ich das jetzt nur für meine verschlüsselten externen USB-Platten und einen Container gelöst habe. Für den Container sieht das so aus:
Code: Alles auswählen
[Unit]
Description=thlu:luks-container.service: Open local Luks-Container
DefaultDependencies=no
After=local-fs.target remote-fs.target
ConditionPathExists=/home/toml/.CryptCredentials
[Service]
Type=forking
RemainAfterExit=yes
ExecStartPre=/sbin/losetup /dev/loop0 /home/toml/MyContainer.vol
ExecStartPre=/sbin/cryptsetup luksOpen /dev/loop0 MyContainer --key-file "/home/toml/.CryptCredentials"
ExecStart=/bin/mount /dev/mapper/MyContainer /mnt -t ext4 -o rw
ExecStop=/bin/umount /dev/mapper/MyContainer -f
ExecStopPost=/sbin/cryptsetup luksClose MyContainer
ExecStopPost=/sbin/losetup -d /dev/loop0
[Install]
WantedBy=multi-user.target
Hier ist nur das loop-device "0" als konstante zu beachten. Hat man mehrere Container und dann noch alle gleichzeitig auf, muss man das anders lösen, z.B. fest durchnummerieren oder mit "-f" laut man-page. Ich brauche das aber nicht und komme mit konstant "0" prima klar. Das zweite sind die .CryptCredentials. Bei mir liegt der Container auf ner Netzplatte und die CryptCredentials auf meinem Rechner. Das kann aber genauso gut ein USB-Srick sein. Wenn die Datei .CryptCredentials aber nicht "präsent" ist (siehe ConditionPathExists) wird der Container halt nicht geöffnet.
Und hier anschließend die Service-Unit für eine externe USB-Platte. Hier gilt das gleiche hinsichtlich .CryptCredentials.... nicht da=kein Device.
Code: Alles auswählen
[Unit]
Description=thlu:luks-device.service: Open local Luks-Device
DefaultDependencies=no
After=local-fs.target
ConditionPathExists=/home/toml/.CryptCredentials
[Service]
Type=forking
RemainAfterExit=yes
#ExecStartPre=/sbin/cryptsetup luksOpen /dev/sdb1 Crypt_HD --key-file "/home/toml/.CryptCredentials"
ExecStartPre=/sbin/cryptsetup luksOpen "/dev/disk/by-uuid/aaaaa-bbbb-cccc-dddd-eeeeeeee" Crypt_HD --key-file "/home/toml/.CryptCredentials"
ExecStart=/bin/mount /dev/mapper/Crypt_HD /mnt -t ext4 -o rw
ExecStop=/bin/umount /dev/mapper/Crypt_HD -f
ExecStopPost=/sbin/cryptsetup luksClose /dev/mapper/Crypt_HD
[Install]
WantedBy=multi-user.target
Hier sind die beiden Execstart-Varianten zu beachten... einmal mit "zufälligen" Device-Symlink, einmal mit UUID. Hat man mehrere USB-Platten würde ich versuchen, diese Unit mit "@" zu instanziieren und die UUID als Parameter übergeben... ggf. ist dann auch noch ein Support-Wrapper für die Mount-Points erforderlich. Oder man erstellt einfach für jede Platte 'ne eigene Unit mit festem Mount-Point und generiert einen konstanten Device-Symlink über UDEV. Dann gibts auch keine Kollisionen.
Wenn die .CryptCredentials auf nem externen Stick liegen, kann man die Devices auch prima von Hand öffnen und wieder schließen, oder via UDEV-Regel automatisch beim Einstecken des Sticks.... auch das ist ne einfache Geschichte....
Code: Alles auswählen
systemctl start luks-device.service
systemctl status luks-device.service
systemctl stop luks-device.service
Für den Systemstart aktivieren:
Ach so...fast vergessen... noch zwei Anmerkungen... der "thlu"-Identifier in allen meinen Services ist nur ne Suchhilfe für journalctl. Die /etc/crypttab nutze ich nicht, ich halte die für meine Anforderungen für entbehrlich.... ich parametrisiere stattdessen direkt. Die After-Statements in den Services sollten sicherstellen, dass die Luks-Devices IMMER vor den lokalen und remoten-Platten geschlossen werden. Ein "
Stop-Job-Hänger" sollte also nicht passieren.
Also.... es gibt viele viele Möglichkeiten.... ich kann leider hier nur 'ne Startlinie markieren.