GNU/Linux >> Linux Esercitazione >  >> Linux

Come gestire le unità systemd all'avvio

Systemd è un sistema init e un gestore di sistema nei sistemi Linux ed è compatibile con LSB e SysV. È possibile utilizzare la suite systemd per gestire e ottimizzare i servizi e le risorse di avvio del sistema in un sistema Linux. È uno strumento pratico per gli amministratori di sistema per far funzionare il proprio sistema, ottimizzare i processi, eseguire il debug e risolvere i problemi dei servizi di sistema.

Questo articolo si baserà sulla nostra guida alla serie systemd e illustrerà come gestire le unità di sistema, i montaggi dei file system, la risoluzione dei problemi e fornisce suggerimenti e trucchi quando si lavora con i sistemi.

La nostra prima guida a systemd ha evidenziato perché systemd è uno strumento pratico per gli amministratori di sistema Linux. Il secondo illustra come pianificare le attività di sistema con i timer di sistema e automatizzare le noiose attività di avvio del sistema.

Avvio Linux

Come utente Linux retrò, sono sempre esistito (lo faccio ancora) quando il sistema Fedora si avvia e le pagine su pagine di messaggi diagnostici scorrono prima del prompt di accesso. Queste pagine contengono informazioni sui processi di avvio, sui montaggi dei file system e molto altro. Per capire come gestire e ottimizzare i servizi di avvio, diamo una rapida occhiata a ciò che accade tra quando si preme il pulsante di accensione e la richiesta di accesso.

Un processo di avvio inizia con l'avvio hardware che inizializza l'hardware del sistema, l'avvio del sistema operativo che carica il kernel, quindi systemd e l'avvio di Linux, in cui systemd prepara i processi del sistema. Il processo di avvio inizia quando il kernel trasferisce il controllo dell'host a systemd. A questo punto, un amministratore di sistema può gestire servizi, unità, socket, attivazione D-Bus, tracce di processi, demoni e punti di montaggio del file system.

Componenti di sistema

Di seguito sono riportati alcuni elementi costitutivi della suite software systemd che puoi utilizzare per gestire l'avvio di Linux.

  • systemd-boot:un boot manager UEFI.
  • systemd-firstboot – gestisce l'inizializzazione delle impostazioni di sistema di base prima del primo avvio.
  • systemd-logind:uno strumento di gestione delle sessioni.
  • systemd-networkd:gestisci le configurazioni di rete.
  • systemd-sysusers :uno strumento per creare gruppi di utenti di sistema e aggiungere utenti ai gruppi all'avvio.
  • systemd/Journal:gestisce la registrazione del sistema.
  • systemd/Timers — timer per il controllo di file o eventi .service.

Controllo di sistema

Per gestire systemd, utilizzare il comando systemctl, che utilizza sia la funzionalità del servizio di SysVinit che chkconfig. Puoi usarlo per gestire le unità di sistema che sono rappresentazioni di servizi e risorse di sistema.

# systemctl daemon-reload

Gestione unità di sistema

Le unità in systemd possono essere servizi (.service), punti di montaggio (.mount), dispositivi (.device) o socket (.socket). Systemctl fornisce diversi comandi per gestire le unità.

Utilizzare il comando seguente per analizzare lo stato del sistema:

$ systemctl status #Show system status 
$ systemctl or #List running units
$ systemctl list-units #List running units
$ systemctl --failed #List failed units
$ systemctl list-unit-files #List installed unit files1
$ systemctl status pid #Show process status for a PID

Utilizzare i seguenti comandi per controllare lo stato dell'unità:

$ systemctl help unit #Show a manual page associated with a unit
$ systemctl status unit #Status of a unit
$ systemctl is-enabled unit #Check whether a Unit is enabled

Utilizzare i seguenti comandi per avviare e ricaricare un'unità:

systemctl start unit  #start a unit immediately
systemctl stop unit   #stop a unit immediately
systemctl restart unit   #restart a unit
systemctl reload unit  #reload a unit and configurations
systemctl daemon-reload   #reload systemd manager configuration

Utilizzare i seguenti comandi per mascherare un'Unità:

systemctl mask unit     #mask a Unit to make it impossible to start
systemctl unmask unit     #Unmask a unit

Utilizzare i seguenti comandi per abilitare un'unità:

systemctl enable Unit   #enable a Unit to start automatically at boot
systemctl enable --now unit   #enable a Unit to start automatically and immediately at boot
systemctl disable unit   #disable a Unit to no longer start at boot
systemctl reenable unit     #disable and enable anew

Modifica dei file di unità

Linux carica i file Unit da più posizioni nel tuo sistema. Puoi eseguire il comando [systemctl show –property=UnitPath] per vedere l'elenco completo.

  •  /usr/lib/systemd/system/:unità fornite dai pacchetti installati.
  •  /etc/systemd/system/:unità installate dall'amministratore di sistema.

Esempio di file di unità:

/etc/systemd/system/unit.d/example_unit.conf
[Unit]
Requires=new dependency
After=new dependency

Gestione delle dipendenze

È possibile risolvere le dipendenze delle unità progettando correttamente i file delle unità.
Ad esempio, se l'unità A richiede che l'unità B sia in esecuzione prima dell'avvio di A. Quindi, aggiungi Requires=B e After=B alla sezione [Unità] di A.

# /etc/systemd/system/unit.d/example_unit.conf
[Unit]
Requires=B
After=B

Se la dipendenza è facoltativa, aggiungi Wants=B e After=B.

/etc/systemd/system/unit.d/example_unit.conf
[Unit]
Requires=B
After=B
Wants=B

Nota:le dipendenze sono poste sui servizi e non sugli obiettivi.

Tipi di servizio

Puoi impostare diversi tipi di servizio di avvio in un file di servizio personalizzato con il parametro Type=nella sezione [Servizio]:

/etc/systemd/system/unit.d/example_unit.conf
[Unit]
Requires=B
After=B
Wants=B
[Service]
Type=simple
  • Tipo=semplice (predefinito):systemd considera l'avvio immediato del servizio.
  • Type=forking:systemd considera il servizio avviato una volta che il processo si biforca e il genitore è terminato.
  • Type=oneshot:puoi usarlo per gli script che eseguono un singolo lavoro e poi escono. Puoi impostare RemainAfterExit=yes in modo che systemd possa ancora considerare il servizio attivo dopo che il processo è terminato.
  • Type=idle:systemd ritarderà l'esecuzione del servizio binario fino a quando tutti i lavori non saranno stati inviati.
  • Type=notify:puoi usarlo come Type=simple, ma il demone segnalerà al systemd quando è pronto.
  • Type=dbus:il servizio è considerato pronto quando sul bus di sistema di DBus compare il BusName specificato.

File unità sostitutive

Puoi sostituire un file di unità in [/usr/lib/systemd/system/] creando un nuovo file di unità con un nome simile e riabilitando l'unità per aggiornare i collegamenti simbolici.

# systemctl reenable Unit

In alternativa, puoi eseguire il comando [# systemctl edit –full Unit] che apre il file dell'unità nel tuo editor e lo ricarica automaticamente al termine della modifica.

# systemctl edit --full Unit

File drop-in

Puoi creare un file unit drop-in creando la directory /etc/systemd/system/unit.d/ e posizionando il tuo nuovo file .conf. Il file sovrascriverà o aggiungerà nuove opzioni di configurazione. systemd analizzerà e applicherà questi file sopra il file Unit originale.

In alternativa, eseguire il comando seguente [# systemctl edit unit] per aprire il file /etc/systemd/system/unit.d/new_override.conf in un editor di testo e ricaricare automaticamente il file Unit.

Ripristina le modifiche di un file di unità

Utilizzare il comando seguente per ripristinare le modifiche apportate a un'unità utilizzando il comando systemctl edit.

# systemctl revert unit

Aggiungi ulteriore dipendenza a un'unità

/etc/systemd/system/unit.d/newcustomdependency.conf
[Unit]
Requires=new customdependency
After=new customdependency

Gestione dell'alimentazione

Systemd fornisce diversi comandi per riavviare o spegnere il sistema.

systemctl reboot     #shut down and reboot the system
systemctl poweroff   #shut down and power-off the system
systemctl suspend     #suspend the system
systemctl hibernate    #put the system into hibernation
systemctl hybrid-sleep   #put the system into hybrid-sleep state

Monta file system e partizioni

systemd è responsabile del montaggio delle partizioni e dei filesystem specificati in /etc/fstab. È possibile gestire o montare un file system definendo tutti i parametri richiesti in un file unit. Includere i dettagli del filesystem e del punto di montaggio. Systemd ti offre maggiore flessibilità mentre lavori con le unità di montaggio. Utilizza il file /etc/fstab per la configurazione e il montaggio del filesystem. Il processo prevede l'utilizzo dello strumento systemd-fstab-generator per creare unità di montaggio dai dati nel file fstab.

Crea un'unità di montaggio systemd

L'illustrazione è su Fedora 33 che esegue un filesystem btrfs.
Verifica di avere spazio libero sul gruppo di volumi.

# lsblk

Elenca i file dell'unità di montaggio disponibili:

[root@foss]# systemctl list-unit-files -t mount
OR
[root@foss]# systemctl status *mount

Crea un file dell'unità systemd .mount:

Controlla l'UUID del filesystem usando il comando blkid.

[root@foss]# blkid /dev/sda2
/dev/sda2: LABEL="fedoraworkstation33" UUID="688a6af2-xxx-4da4-xxx-878c5b0f063b" UUID_SUB="690a86e7-yyyy-9a92-4bc6-49cca4yyyy8df" BLOCK_SIZE="4096" TYPE="btrfs" PARTUUID="0byyyb88-02"

Crea un nuovo file [var-lib-docker.mount] nella directory etc/systemd/system. Aggiungi i dati di configurazione di seguito. Si noti che il nome del file dell'unità e il punto di montaggio devono essere identici.

# vi /etc/systemd/system/var-lib-docker.mount
[Unit]
Description=docker mount
[Mount]
What=/dev/disk/by-uuid/688a6af2-77e1-4da4-bc63-878c5b0f063b
Where=/var/lib/docker
Type=btrfs
Options=defaults
[Install]
WantedBy=multi-user.target

Nota che l'argomento "cosa" può prendere UUID, LABEL e il percorso del disco.

La descrizione nella sezione [Unità] fornisce il nome del montaggio, visualizzato con systemctl -t mount. I dati di configurazione nella sezione [Mount] contengono gli stessi dati nel file fstab.

Abilita l'avvio dell'unità di montaggio dopo l'avvio:

[root@foss]# systemctl enable var-lib-docker.mount
Created symlink /etc/systemd/system/multi-user.target.wants/var-lib-docker.mount → /etc/systemd/system/var-lib-docker.mount.

Il comando crea un collegamento simbolico nella directory /etc/systemd/system, consentendo il montaggio dell'unità di montaggio su tutti gli avvii successivi.

Avvia e monta il filesystem:

# systemctl start var-lib-docker.mount

Verifica che il filesystem sia stato montato:

# systemctl status var-lib-docker.mount
● var-lib-docker.mount - Docker mount
Loaded: loaded (/etc/systemd/system/var-lib-docker.mount; enabled; vendor preset: disabled)
Active: inactive (dead)
Where: /var/lib/docker
What: /dev/disk/by-uuid/688a6af2-77e1-4da4-bc63-878c5b0f063b

Puoi anche modificare il file dell'unità di servizio Docker per assicurarti che il servizio venga avviato solo dopo la chiamata del servizio di montaggio.

# cat /usr/lib/systemd/system/docker.service
[Unit]
Description=docker service unit file
After=network.target var-lib-docker.mount # Added mount unit for docker service to wait
Requires=docker.socket

Riavvia e controlla lo stato dell'unità di servizio di montaggio.

# systemctl reboot
# systemctl status var-lib-docker.mount

Verifica il punto di montaggio [var-lib-docker]:

# mount | grep var-lib-docker

Suggerimenti e trucchi

Esegui un servizio dopo che la rete è attiva

Puoi ritardare l'avvio di un servizio fino a quando la rete non è in funzione aggiungendo le seguenti dipendenze al tuo file .service.

/etc/systemd/system/test_foo.service
[Unit]
Wants=network-online.target
After=network-online.target

Inoltre, puoi aggiungere nss-lookup.target se un servizio deve eseguire query DNS.

/etc/systemd/system/test_foo.service
[Unit]
Wants=network-online.target
After=network-online.target nss-lookup.target
...

Usa il comando seguente per verificare quale servizio sta inserendo nss-lookup.target.

# systemctl list-dependencies --reverse nss-lookup.target

Installa gli strumenti di configurazione della GUI di sistema

Puoi anche lavorare con systemd usando i seguenti strumenti GUI.

  • SystemdGenie – è uno strumento di gestione dei sistemi basato su KDE.
  • Systemadm – è un browser grafico per unità systemd.

ottimizzazioni del sistema

Systemd offre tempi di avvio rapidi di <2s per ambienti desktop aggiornati. Tuttavia, potremmo ottimizzarlo ulteriormente senza dover scrivere alcun codice con i seguenti passaggi:

  •  Prima di tutto, considera la possibilità di bypassare initrd se ne usi uno nel tuo sistema.
  • Considera la disabilitazione di SELinux e l'auditing aggiungendo selinux=0 sulla riga di comando del kernel. Tuttavia, tieni presente che gli amministratori di sistema consigliano di lasciare SElinux attivo per motivi di sicurezza.
  • Considera la disinstallazione di Syslog e usa invece journal. Journal è lo strumento di registrazione predefinito nei sistemi systemd più recenti.
  • Se l'output della tua console è lento, utilizza il flag di silenzio sulla riga di comando e disabilita la registrazione del debug del sistema.
  • Considera la rimozione di cron e usa invece i timer di sistema.
  • Utilizza un ambiente desktop moderno come GNOME 40 che non utilizza ConsoleKit.
  • Controlla e disabilita eventuali processi o servizi di avvio non necessari. Un avvio del sistema diventa più veloce se avvii meno processi all'avvio.
  • Elimina i servizi basati su shell come gli script di inizializzazione SysV e sostituiscili con file unit.
  • Evita di usare Type=forking e ordinare le dipendenze. Invece, sostituiscili con l'attivazione del socket e Type=semplice quando possibile. Consentirà un avvio più parallelo per i servizi.

Risoluzione dei problemi

Indaga sui servizi non riusciti

Utilizzare il comando seguente per trovare i servizi systemd che non sono stati avviati:

# systemctl --state=failed

Diagnostica di un servizio

È inoltre possibile ottenere ulteriori informazioni sulla risoluzione dei problemi di un servizio impostando la variabile di ambiente SYSTEMD_LOG_LEVEL per il debug.
Ad esempio, per eseguire il daemon systemd-networkd in modalità di debug, aggiungere un file drop-in per il servizio e il seguente configurazioni.

[Service]
Environment=SYSTEMD_LOG_LEVEL=debug

In alternativa, puoi impostare manualmente la variabile di ambiente con il seguente comando:

# SYSTEMD_LOG_LEVEL=debug /lib/systemd/systemd-networkd

Dopo aver completato l'impostazione, riavvia il servizio e monitora il diario del servizio con l'opzione -f/–follow per visualizzare tutti i registri.

Registri di sistema

I registri di sistema memorizzano una cronologia delle attività di sistema come il tempo di avvio, l'avvio dei servizi, i lavori di sistema, i servizi in background, le attività non riuscite e molto altro. Systemd mantiene un “catalogo” di errori, messaggi, possibili soluzioni ed evidenzia nei log i contesti critici che potrebbero passare inosservati. Puoi rivedere i log di sistema con il comando journalctl.

$ journalctl --pager-end

Il flag –pager-end avvia la revisione del registro alla fine dell'output journalctl.

Risorse aggiuntive

  1. Pagina manuale di Systemd.unit.
  2. Guida ai sistemi del progetto Fedora.
  3. Descrizione di systemd da Freedesktop.org.
  4. ArchWiki di sistema.

Conclusione

systemd fornisce un modo affidabile per gestire l'avvio di Linux con le unità systemd. L'articolo ha evidenziato diversi modi per utilizzare il comando systemctl per modificare i file delle unità, gestire le unità systemd. Ha evidenziato come creare una nuova unità di montaggio systemd per montare un nuovo filesystem e consentirne l'avvio durante l'avvio. Infine, ho condiviso alcuni suggerimenti per l'ottimizzazione del sistema e come risolvere i problemi relativi ai servizi non riusciti.


Linux
  1. Utilizzo del comando systemctl per gestire le unità systemd

  2. Come gestire le capacità dei file Linux

  3. Come gestire i servizi Systemd con Systemctl su Linux

  4. Come utilizzare il comando Systemctl per gestire i servizi Systemd

  5. Come gestire una partizione di scambio in Linux

Comandi Systemctl per gestire il servizio Systemd

Come eseguire uno script all'avvio in Debian 11

Come cancellare i registri del diario di Systemd

Come gestire i database in MariaDB su Ubuntu 18.04

CentOS / RHEL 7:Guida per principianti alle unità di servizio systemd

Come abilitare systemd su WSL2:Ubuntu 20 e CentOS 8