Externe schijf aansluiten in Linux voor automatische back-up

Daniel Dupré
1

Inhoudsopgave

Als je bij Linux bestanden naar een externe schijf wilt kopiëren, moet je vaak aan de slag met onoverzichtelijke udev-regels en inflexibele shell-scripts om een schijf te mounten. Met systemd-units heb je een eenvoudige, overzichtelijke en betrouwbare oplossing. Daarmee kun je de computer instellen voor snel een externe schijf aansluiten in Linux en een back-up maken.

Een back-up is soms het laatste redmiddel wanneer een thuisserver, laptop of pc de geest heeft gegeven. In dergelijke gevallen is het slim om de back-up van een systeem niet op het apparaat zelf op te slaan. In zo’n geval raden wij een offsite-back-up op een extern opslagmedium aan. Dat kan een server of een usb-schijf op een andere locatie zijn. Sowieso is alles is beter dan geen back-up.

externe schijf wordt niet herkend in Windows oplossing

Als je een Linux-server en een usb-medium voor het opslaan van gegevens gebruikt, kun je het zo instellen dat de back-up begint zodra het station wordt aangesloten. Met systemd mount-units krijg je dat elegant en flexibel voor elkaar, want systemd is altijd precies op de hoogte in welke toestand de services en apparaten zich bevinden.

Systemd en units

Voor we aan de praktijk beginnen is er echter een beetje theorie nodig. Systemd werkt ook wanneer je drives met units mount. In dat geval betreft het de mount-units. Die werken in principe net zoals de bekendere service-units, maar beschikken over andere parameters. Mogelijk heb je er bij het beheer van een Linux-systeem al indirect enkele gegenereerd.

Wanneer je in het bestand /etc/fstab entry’s voor het mounten van de drives invoert, leest de daemon of de kernel die namelijk niet direct in. Dat doet de tool systemd-fstab-generator. Systemd start hem om uit de tabel passende mount-units te genereren. Die slaat de units op in /run/systemd/generator. Je herkent ze aan de bestandsnaamsuffix .mount. Systemd verwerkt deze mount-units zelf pas en mount daarmee de drives.

Opbouw

Om een back-up automatisch te laten verlopen, zijn er drie units nodig: een mount-unit voor het koppelen, een automount-unit voor de automatisering en een service-unit die de daadwerkelijke back-up regelt. Een eenvoudige mount-unit voor de back-up-drive:

[Unit]
Description=Mount backup drive
[Mount]
Where=/mnt/backup
What=/dev/disk/by-partuuid/506f6352-01
[Install]
WantedBy=multi-user.target

Zoals alle systemd-units lijkt deze op een van de bekende INI-bestanden uit Windows. De blokken [unit] en [install] zijn typische systemd-units. De eerste bevat informatie over de unit. In dit geval is dat alleen een korte beschrijving. Met [install] leg je vast onder welke systeemtoestand (target) de unit moet vallen. Hier is dat wanneer de toestand multi-user wordt bereikt. De targets komen ongeveer overeen met sysvinit-­runlevels. multi-user is in bijna alle gevallen de juiste keuze. Beslissend voor de mount-unit is het blok [mount]. Hier definieert what welk blok-apparaat wordt gemount en definieert where het mountpoint.

Om het juiste apparaat te identificeren, voer je sudo blkid in. Dan krijg je een lijst te zien van alle aanwezige drives en hun ID’s. Aan de hand van die attributen, dus de UUID’s, partitie-­UUID’s of stationsbeschrijvingen (labels), kun je de apparaatnamen onder /dev/disk/by-* bepalen. De apparaatnamen die daar verschijnen zijn statisch zolang het attribuut van het apparaat niet verandert. Op die manier heb je geen problemen met veranderende apparaatnamen zoals /dev/sdi1.

externe schijf aansluiten Linux back-up blkid

Met het commando blkid zie je welke eenduidige attributen de aangesloten drives hebben en kun je die in de mount-units gebruiken. De back-updrive hebben we rood onderstreept.

Als je twee back-up-drives afwisselend gebruikt, moet je identieke stationsnamen instellen, want de UUID’s van elk apparaat zijn verschillend en kunnen ook niet hetzelfde zijn. Met de stationsnamen krijgen beide drives altijd dezelfde apparaatnaam onder /dev/disk/by-label. Als beide drives ‘mijnbackup’ heten, wordt de apparaatnaam /dev/disk/bylabel/mijnbackup. Indien beide apparaten tegelijk zijn aangesloten, krijgt het tweede apparaat de naam mijnbackup-1.

Systemd en juiste syntaxis

Om ervoor te zorgen dat systemd de mount-unit ook accepteert, heb je nog een geschikte naam nodig. Die moet een specifieke standaard voldoen. Alle padonderdelen moeten met ‘’ in plaats van een slash van elkaar gescheiden worden en speciale tekens worden gemaskeerd door \x met daarachter een hexadecimale code. Gelukkig hebben de ontwikkelaars van systemd een tool meegeleverd die je helpt om de juiste unit-naam te vinden. De tool heet systemd-escape:

systemd-escape –suffix=mount
–path /mnt/backup

Met de parameter –suffix leg je vast voor welk unit-­type je een naam nodig hebt, en –path verwacht het mountpoint. Het maakt daarbij niet uit of die al bestaat of niet. De enige output die het programma geeft, is de naam van de mount-unit. In het voorbeeld zou de output van mnt-backup dan .mount zijn. Om je een hoop gedoe met systemd-escape te besparen, is het in het algemeen een goed plan om geen speciale tekens in het mountpoint te gebruiken. De juiste plek voor een eigen systemd-unit is altijd in /etc/systemd/system. Als je echt niet zonder speciale tekens kunt leven, moet je de output van systemd-escape direct doorsturen naar touch door een leeg bestand met een bijpassende naam te genereren, bijvoorbeeld zo:

sudo touch $(systemd-escape
–suffix=mount –path /mnt/backup)

Nadat je de mount-units gegenereerd hebt, geef je de systemd-daemon via sudo systemctl daemon-reload de opdracht om alle configuraties en units opnieuw te laden. Via sudo systemctl start mnt-backup.mount of met systemctl start /mnt/backup kun je controleren of de mount-unit functioneert. Als er problemen zijn, kun je de status oproepen met systemctl status mnt-backup.mount.

externe schijf aansluiten Linux back-up status overzicht systemctl systemd

De opdracht systemctl geeft een overzicht van de status van alle deelnemende systemd-units.

Automount

Als je directory /run/systemd/generator kijkt, zie je daar ook bestanden waarvan de naam eindigt op .auto­mount. Deze automount-units geven systemd de opdracht om een mount-unit uit te voeren, dus om het gedefinieerde station te mounten op het moment dat het wordt aangesloten. Voor die units gelden dezelfde naamregels als voor de mount-units. Het auto­mount-bestand van het voorbeeld ziet er als volgt uit:

[Unit]
Description=Automount backup drive
[Automount]
Where=/mnt/backup
[Install]
WantedBy=multi-user.target

De verschillen met de mount-unit zijn minimaal. Daarbij heeft [automount] de plek ingenomen van het [mount]-blok en de beschrijving is anders. Bovendien is de regel die met what begint niet nodig. Om ervoor te zorgen dat beide units in de toekomst actief zijn, moet je sudo systemctl enable mnt-backup.mount en sudo systemctl mnt-backup.automount invoeren. Als je de externe drive dan aansluit, koppelt systemd de drive en vind je je bestanden onder /mnt/backup.

Service

Om ervoor te zorgen dat de back-up van start gaat op het moment dat de externe drive aangesloten en gemount wordt, heb je nog een service-unit nodig. Het eenvoudigste voorbeeld hiervan is:

[Unit]
Description=Backup Service
[Install]
WantedBy=mnt-backup.mount
[Service]
ExecStart=/usr/bin/backup

Sla de inhoud op in /etc/systemd/system/my-backup.service. Bij de service-unit moet je in het gedeelte onder [install] de parameter WantedBy instellen. Die definieert de back-upservice als afhankelijkheid van de mount-unit. De waarde daarvan moet overeenkomen met de naam van de mount-unit. Op die manier weet systemd dat die service met de mount-unit kan worden uitgevoerd. In het gedeelte onder service worden de attri­buten van de service vastgelegd. ExecStart bepaalt welk programma moet worden uitgevoerd.

Gebruik een back-uptool die zijn eigen systemd-unit heeft en die ook de back-up start. Kopieer de unit naar /etc/systemd/system en wijzig deze. Het zou voldoende moeten zijn om WantedBy aan te passen.

Het vernieuwen van sudo systemctl daemonreload is een vereiste om te zorgen dat systemd de nieuwe unit inleest. Met sudo systemctl enable mybackup activeer je de unit. Als je het back-upstation dan aansluit, zorgt systemd ervoor dat de drive wordt gemount en dat de back-upservice wordt gestart.

Aan het einde van het back-upproces ontkoppel je de drive weer met systemctl stop mnt-backup.mount. Verdere informatie over de mount- en automount-units vind je in de bijbehorende man-pages voor systemd.­mount en systemd.automount.

(Merlin Schumacher en Daniel Dupré, c’t magazine)

Meer uitgebreide info lees je op je gemak in c't 05/2024

Deel dit artikel

Daniel Dupré
Daniel DupréDaniel koestert een liefde voor het in elkaar zetten van zinnen en van computers, en heeft in c't een prachtige mogelijkheid gevonden om beide te combineren.

Lees ook

Raspberry Pi als hacking-tool: netwerk hacken met airgeddon & Kali Linux

Draadloze netwerken vormen nog steeds een geliefd doelwit voor cybercriminelen. Professionele apparatuur is niet langer noodzakelijk: met een Raspberr...

Zo kun je met een VPN Formule 1 (gratis) kijken

Met de stijgende kosten van zowel F1 TV als Viaplay kan het interessant zijn om met behulp van een VPN-dienst gratis naar Formule 1 te kijken. In dit ...

1 Praat mee
avatar
  Abonneer  
nieuwsteoudste
Laat het mij weten wanneer er
Paul
Lezer
Paul

Goed idee. Dank voor de heldere uitleg!