Loading...
20-09-2021

Nadat de spanning van een bepaalde machine per ongeluk uitgevallen was, starte een aantal Docker services op deze machine niet meer op. Het gaat hier om een Ubuntu server, met Docker en Docker services, die op een ZFS pool geïnstalleerd zijn. Het blijkt al snel dat Docker niet gestart is, oftewel niet heeft kunnen opstarten. Bij een poging om docker met de hand te starten trad de volgende melding op:

# systemctl start docker
Job for docker.service failed because the control process exited with error code.
See "systemctl status docker.service" and "journalctl -xe" for details.

# docker ps
Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?

for details.
root@gitlab:~# journalctl -xe
...
Sep 20 12:55:28 gitlab dockerd[2582]: time="2021-09-20T12:55:28.711755440Z" level=error msg="No zfs dataset found for root" backingFS=extfs root=/mnt/pool/docker storage-driver=zfs
Sep 20 12:55:28 gitlab dockerd[2582]: failed to start daemon: error initializing graphdriver: prerequisites for driver not satisfied (wrong filesystem?)
...

De melding "No zfs dataset found for root" geeft een hint in de richting waar het fout loopt. In een gevonden blog wordt voorgesteld om Docker handmatig te starten, om zo extra informatie te krijgen over de foutmelding:

# dockerd -D
INFO[2021-09-20T17:21:01.568981520Z] Starting up                                  
WARN[2021-09-20T17:21:01.569091174Z] Running experimental build                   
DEBU[2021-09-20T17:21:01.569723852Z] Listener created for HTTP on unix (/var/run/docker.sock) 
DEBU[2021-09-20T17:21:01.569776503Z] Containerd not running, starting daemon managed containerd 
...
ERRO[2021-09-20T17:21:01.761962993Z] No zfs dataset found for root                 backingFS=extfs root=/mnt/pool/docker storage-driver=zfs
...
failed to start daemon: error initializing graphdriver: prerequisites for driver not satisfied (wrong filesystem?)

Dit laat dezelfde foutmelding zien. Na een kleine zoektocht via Google, vond ik het volgende: zfs datasets won't get mounted after reboot #2256. Ondanks dat de oorzaak duidelijk anders is, kwamen er wel een paar goede tips naar voren. Zo stelt één schrijver dat het mounten niet gelukt:

# zfs list -o name,mountpoint,mounted
NAME                                                                               MOUNTPOINT        MOUNTED
pool                                                                               /mnt/pool              no
pool/docker                                                                        /mnt/pool/docker       no
...
pool/docker/1050d0e34ff06a3d93bc4da64f7ce7aa8c89b381d4f98068537860d196e1f52f       legacy                 no
pool/docker/10fbd64a618bcbb8ae254047ee2d05a1523d9a8213003e36a38105a56faab6ae       legacy                 no
...
pool/docker/ca07de0a801bb595c8bda47307bef9c56b76bf78a22b33fca0a433580c195303       legacy                 no
pool/docker/f74a870580cb88cb86851909d22c5482aa6a98294fe830302eca53670eb90379       legacy                 no
...

En dit blijkt in ons geval ook zo te zijn. O.a. "pool" en "pool/docker" geven "no" bij mounted. Let wel, dat een ls /mnt/pool of ls /mnt/pool/docker wel werkt. Het is alleen wel onduidelijk of het compleet is wat getoond wordt. De aanbevolen vervolg stap is het opnieuw mounten van deze 2 mount points:

# zfs mount -a
cannot mount '/mnt/pool': directory is not empty
cannot mount '/mnt/pool/docker': directory is not empty

Ook hierbij treed dezelfde melding op als bij de schrijver. Hierna ruimt de schrijver met een rm -rf ... de directory op, om vervolgens deze opnieuw te laten mounten. Dit is in ons geval niet verstandig. /mnt/pool/ is niet leeg, en mogelijk verwijderen we daarmee data die nog van belang is. Als alternatief probeer ik de directory te hernoemen om vervolgens dezelfde stappen te nemen:

# mv /mnt/pool /mnt/pool-old
# zfs mount -a
# zfs list -o name,mountpoint,mounted
NAME                                                                               MOUNTPOINT        MOUNTED
pool                                                                               /mnt/pool             yes
pool/docker                                                                        /mnt/pool/docker      yes
...

De pool's zijn weer terug! Vervolgens moet docker nog gestart worden. Dit doe ik door de machine te herstarten, om te kijken of alles weer netjes start.