Systemd - Boot Order - rc.local

Ho sempre avuto la non proprio geniale idea di scrivere le regole di iptables (su un pc client) nel file rc.local, che viene eseguito storicamente per ultimo a ogni boot. Fin dall' introduzione di systemd in fedora ho avuto qualche problema nel far si che questo script LSB/sysV venisse effettivamente eseguito.
Memore delle passate esperienze ho ri-eseguito i passi che mi ero scritto.

Brevemente
- /etc/rc.d/rc.local deve essere eseguibile e correttamente interpretato da bash (#!/bin/bash in capo al file).
- Creo (o verifico che ci sia) un bel link simbolico da /etc/rc.local a /etc/rc.d/rc.local
- Mi copio lo unit file

in modo da editare la copia in /etc, che ha sempre la precedenza su quela in /usr/lib

- Vado ad aggiungere la sezione [Install] in questo modo

Ovvero specificando che rc.local deve venir eseguito nel target multi-user.

- Abilito il servizio col comando

 

Ora però sorge il problema del quando viene eseguito rc.local in quanto non è per nulla scontato che sia davvero l'ultimo, anzi systemd cerca sempre di parallelizzare l'avvio dei servizi.

A questo link si parla in modo approfondito di come avviare un servizio avendo la "certezza" che la rete sia avviata. In breve si può aggiungere nel file dell'unità, nella sezione [Unit]  (probabilmente sarà già così).

In realtà però questo potrebbe non bastare.

Ho quindi scavato un po' per scoprire come systemd fa partire quei servizi "legacy" che ancora hanno degli script di avvio di tipo LSB/sysV. In particolare guardo il servizio denyhosts.

Quindi, si nel runlevel3 che nel 5 denyhosts parte per ultimo: cerco quindi di far partire rc-local.service dopo denyhosts.

Vado a cercare la corrispondente unità di systemd

L'unità c'è e si chiama denyhosts.service, il file di unità però

non si trova.

Il servizio è attivo e parte in fase di boot

ed è anche correttamente presente sia nel target multi-user che nel grahical (runlevel3 e 5)

Immagino quindi che systemd in automatico vada a leggere gli script legacy e si crei in automatico delle unità virtuali.

Vado a vedere come è composta questa unità (di cui, di default, non ho il file)

In After noto che ci sono tutti i servizi presenti come script legacy in /etc/rc5.d/.

Torno quindi alla mia unità rc-local.service e vado ad aggiungere

Al successivo reboot controllo /var/log/boot.log

ed effettivamente parte per ultimo (anche se non c'è traccia di denyhosts).

Ora provo ad utilizzare gli strumenti che mi mette a disposizione systemd per vedere graficamente quando parte rc-local.service.
Il comando systemd-analyze --blame non mi torna molto utile in quanto si limita a mostrarmi il tempo che ciascun servizio impiega a partire

Installo graphviz (che fornisce il comando dot)

 

rc-local-order rc-local-req

Le 2 immagini, sebbene non di facilissima lettura, mi mostrano l'ordine di avvio di rc-local e i suoi requisiti.

 

Un po' di link utili:

faq
http://www.freedesktop.org/wiki/Software/systemd/FrequentlyAskedQuestions/

file_system_mount
http://www.freedesktop.org/wiki/Software/systemd/APIFileSystems/

disable_mask
http://0pointer.de/blog/projects/three-levels-of-off.html

unità speciali
http://www.freedesktop.org/software/systemd/man/systemd.special.html

analisi grafica
http://www.freedesktop.org/software/systemd/man/systemd-analyze.html

Print Friendly, PDF & Email