Configure el servicio systemd para que se ejecute después del montaje fstab

33

Estoy trabajando en una systemd .servicesecuencia de comandos que se supone que comienza después de que se monte una ubicación de red CIFS /etc/fstaben /mnt/el arranque.

El script espera que se inicie primero un script de dependencia de OpenVPN, pero también quiero que espere a que se complete el montaje.

/etc/systemd/system/my-daemon.service :

[Unit]
Description=Launch My Daemon
After=network.target vpn-launch.service
Requires=vpn-launch.service

Traté de agregar systemd.mounta la línea: After=network.target vpn-launch.service systemd.mountpero no dio los resultados que esperaba.

Banderas de invierno
fuente
¿Funciona si agregas systemd-remount-fsa tu Afterlista?
Eric Renouf

Respuestas:

40

una ubicación de red CIFS se monta a través /etc/fstabde /mnt/en el arranque.

No, no es. Haga esto bien, y el resto se acomoda naturalmente.

El montaje es manejado por una unidad de montaje systemd (generada) que se llamará algo así mnt-wibble.mount. Puede ver su nombre real en la salida del systemctl list-units --type=mountcomando. Puede verlo en detalle como cualquier otra unidad con systemctl status.

Muy simple, entonces: debe ordenar que su unidad se inicie después de que se inicie esa unidad de montaje.

Después = network.target vpn-launch.service mnt-wibble.mount

Otras lecturas

JdeBP
fuente
10
Lista de montajes con "systemctl list-units --type = mount"
nijave
Para los seguidores, "wibble" es solo un nombre falso, como "foobar"
rogerdpack
17

Lo siento pero no puedo comentar todavía.

Como dijo JdeBP, debe ordenar en el montaje del sistema de archivos. Puede predecir el nombre de la unidad de montaje o, alternativamente, puede usar (en la sección de la unidad):

RequiereMountsFor = / absolute / path / of / mount

Esta opción crea las dependencias a las unidades * .mount apropiadas para hacer que la ruta sea accesible antes de iniciar el servicio. Puede que no esté en todas las versiones de systemd, pero lo he estado usando en una máquina CentOS 7 durante los últimos 6 meses más o menos.

miguelbernadi
fuente
(Y sus diferencias con el sistema de vainilla están aquí .) RequiresMountsFor=Viene con su propio conjunto de advertencias. Con el error RedHat # 1088057 y Chris Siebenmann en la mano, debería poder responder a superuser.com/questions/988734 . También es una montura CIFS en esta pregunta. Pero la implicación es que auto, afortunadamente, lo es .
JdeBP
@JdeBP Gracias por el comentario. No estaba al tanto de las advertencias y problemas en esa función.
miguelbernadi
14

Aunque ambas respuestas son correctas, quiero agregar mis dos centavos a la discusión, porque cuando la busqué me faltaban algunas instrucciones y ejemplos de cómo proceder.

  1. Agregue el sistema de archivos a /etc/fstab
  2. Tipo mount -aque monta todos los sistemas de archivos mencionados en fstab
  3. Busque la unidad systemd que se ha generado con:

    systemctl list-units | grep '/path/to/mount' | awk '{ print $1 }'

    (debería devolver algo que termine con .mount)
  4. Agregue la unidad de montaje encontrada a la After=declaración en el *.servicearchivo

Aquí hay un ejemplo de cómo iniciar el my-daemonservicio en el arranque, pero una vez que la red está lista, se monta un recurso compartido CIFS /mnt/cifsy vpn-launchse inicia el servicio:

/ etc / fstab

//servername/sharename /mnt/cifs cifs defaults,some,other,options 0 0

Nota: es posible que desee agregar nofail a sus opciones de fstab (por ejemplo, cuando usa una unidad externa). De lo contrario, su máquina no arrancará si el dispositivo no está conectado. Ver el artículo fstab de ArchWiki


/etc/systemd/system/my-daemon.service

[Unit]
Description=Launch My Daemon
Requires=vpn-launch.service mnt-cifs.mount
After=network.target vpn-launch.service mnt-cifs.mount

[Service]
ExecStart=/path/to/my-daemon

[Install]
WantedBy=multi-user.target

No olvide habilitar el servicio de modo que se inicie en el arranque: systemctl enable my-daemon

Tenga en cuenta que esto también funciona para otros sistemas de archivos (NFS, HDD, etc.).

Como ya se mencionó, ambas respuestas son correctas y animo a todos a leerlas, pero para mí un par de ejemplos me habrían ahorrado algo de tiempo.

Actualización (2019-06-25):

  • Se agregó una nota sobre las opciones de fstab para evitar el bloqueo de arranque cuando se utilizan unidades externas
  • agregado mnt-cifs.mounta la Requires=lista, lo que hace que my-daemon.serviceno se inicie cuando el montaje cifs no se montó correctamente
bm-bergmotte
fuente
Para ser claros, "mnt-cifs.mount" es el nombre de la unidad de montaje para su punto de montaje específico systemctl list-units --type=mount.
smdvlpr
1

@ bm-bergmotte: gracias por tu instrucción que me ayudó mucho. Para mí solo funciona, si pongo

After=network.target vpn-launch.service mnt-cifs.mount
Requires=vpn-launch.service mnt-cifs.mount

Si no pongo "mnt-cifs.mount" dentro de "Requiere" (y en este orden) funciona para reiniciar / iniciar, pero el servicio se inicia de todos modos, si el dispositivo no está montado. Después de colocarlo adicionalmente dentro de "" Requiere ", el servicio monta el dispositivo antes de iniciarlo, si el dispositivo no estaba montado.

tmade
fuente
Tienes razón. Si el montaje falla, el servicio my-daemon.service se inicia de todos modos. After=solo dicta la orden. Requires=hace obligatorio que el montaje cifs deba estar presente (vea la respuesta de Sufiyan Ghori en ese sentido). Actualizaré mi respuesta.
bm-bergmotte