Aggiunta di systemd

This commit is contained in:
andrea 2024-03-22 09:01:11 +01:00
parent dbd04fbb29
commit 991697797e
3 changed files with 506 additions and 13 deletions

View file

@ -2,7 +2,7 @@ PDFDIR=pdf
MDS=$(wildcard *.md)
PDFS=$(patsubst %.md,$(PDFDIR)/%.pdf, $(MDS))
TEMPLATE_ARGS=-V titlepage=true -V titlepage-text-color=000000 -V titlepage-color=B2DFEE -V titlepage-background=./background.pdf
PANDOC_ARGS=-N -V lang=it --template default.latex -s
PANDOC_ARGS=-N -V lang=it --template default.latex -s --toc
.PHONY : all

View file

@ -207,10 +207,10 @@ separato, ad esempio in `~/.config/tmux/split.conf`.
new -s splitted_session # crea una nuova sessione
selectp -t 0 # seleziona il primo pannello
splitw -h -p 50 # divide il pannello corrente orizzontalmente in due parti
splitw -h # divide il pannello corrente orizzontalmente in due parti
selectp -t 1 # seleziona il nuovo secondo pannello
splitw -v -p 50 # divide il pannello corrente verticalmente in due parti
splitw -v # divide il pannello corrente verticalmente in due parti
selectp -t 0 # torna al primo pannello
```
@ -233,6 +233,7 @@ simile a quello riportato sotto.
| | |
-----------
| |
| |
-----------
```
# Secure Shell
@ -366,16 +367,16 @@ mosh utente@host -- tmux
## Riferimenti
[1] https://www.ssh.com/academy/ssh/copy-id
[2] https://www.techtarget.com/searchsecurity/tutorial/Use-ssh-keygen-to-create-SSH-key-pairs-and-more
[3] https://alexhost.com/faq/using-ssh-copy-id-ssh-keygen-commands-in-linux/
[4] https://www.ssh.com/academy/ssh/keygen
[5] https://www.digitalocean.com/community/tutorials/ssh-essentials-working-with-ssh-servers-clients-and-keys
[6] https://docs.oracle.com/en/operating-systems/oracle-linux/openssh/openssh-WorkingwithSSHKeyPairs.html
[7] https://www.redhat.com/sysadmin/configure-ssh-keygen
[8] https://www.digitalocean.com/community/tutorials/how-to-configure-ssh-key-based-authentication-on-a-linux-server
[9] https://www.thegeekstuff.com/2008/11/3-steps-to-perform-ssh-login-without-password-using-ssh-keygen-ssh-copy-id/
[10] https://mosh.org/
- [1] https://www.ssh.com/academy/ssh/copy-id
- [2] https://www.techtarget.com/searchsecurity/tutorial/Use-ssh-keygen-to-create-SSH-key-pairs-and-more
- [3] https://alexhost.com/faq/using-ssh-copy-id-ssh-keygen-commands-in-linux/
- [4] https://www.ssh.com/academy/ssh/keygen
- [5] https://www.digitalocean.com/community/tutorials/ssh-essentials-working-with-ssh-servers-clients-and-keys
- [6] https://docs.oracle.com/en/operating-systems/oracle-linux/openssh/openssh-WorkingwithSSHKeyPairs.html
- [7] https://www.redhat.com/sysadmin/configure-ssh-keygen
- [8] https://www.digitalocean.com/community/tutorials/how-to-configure-ssh-key-based-authentication-on-a-linux-server
- [9] https://www.thegeekstuff.com/2008/11/3-steps-to-perform-ssh-login-without-password-using-ssh-keygen-ssh-copy-id/
- [10] https://mosh.org/
### Esercizio
@ -391,3 +392,495 @@ suddivisione della finestra. L'accesso via ssh dev'essere senza password.
Effettuando un ssh da locale verso locale, una volta effettuato
l'acccesso, la sessione tmux dev'essere automaticamente avviata.
# Introduzione a `systemd`
Systemd è un sistema di inizializzazione e gestione dei servizi per
Linux, che sostituisce il tradizionale SysVinit. È progettato per
essere il punto di partenza per il sistema operativo, gestendo l'avvio
dei servizi, la gestione delle sessioni utente, la configurazione di
rete e molto altro. In Arch Linux, systemd è l'impostazione
predefinita e viene utilizzato per gestire l'avvio del sistema e i
servizi.
Systemd utilizza i "target" per raggruppare le unità insieme tramite
dipendenze e come punti di sincronizzazione standardizzati. Questi
servono uno scopo simile ai runlevel di SysVinit ma agiscono
leggermente diversamente. Ogni target è nominato invece di essere
numerato e serve uno scopo specifico con la possibilità di avere più
attivi allo stesso tempo.
## Riferimenti
- [1] https://wiki.archlinux.org/title/systemd
- [2] https://bbs.archlinux.org/viewtopic.php?id=214188
- [3] https://www.reddit.com/r/archlinux/comments/4lzxs3/why_did_archlinux_embrace_systemd/
- [4] https://stackoverflow.com/questions/10297969/systemd-on-arch-linux
- [5] https://wiki.archlinux.org/title/Systemd/User
- [6] https://superuser.com/questions/1025091/start-a-systemd-user-service-at-boot
- [7] https://halestrom.net/darksleep/blog/005_distrohop_p1/
- [8] https://www.youtube.com/watch?v=M51mbTRyL6U
## Gestione di `systemd`
`systemctl` è il comando principale utilizzato per esaminare e
controllare lo stato di `systemd` in un sistema Arch Linux. Questo
strumento è fondamentale per la gestione dei servizi e delle unità del
sistema. Ecco alcuni esempi di utilizzo di `systemctl`:
### Avvio e Arresto di Servizi
Per avviare un servizio, ad esempio `sshd`, si utilizza:
```bash
sudo systemctl start sshd
```
Per fermare lo stesso servizio:
```bash
sudo systemctl stop sshd
```
### Abilitazione e Disabilitazione di Servizi all'Avvio
Per abilitare un servizio all'avvio del sistema:
```bash
sudo systemctl enable sshd
```
Per disabilitare l'avvio automatico del servizio:
```bash
sudo systemctl disable sshd
```
### Controllo dello Stato dei Servizi
Per controllare lo stato corrente di un servizio:
```bash
systemctl status sshd
```
### Gestione dei Target
I target in systemd rappresentano stati di sistema o configurazioni
specifiche. Per vedere il target corrente:
```bash
systemctl get-default
```
Per cambiare il target di default al prossimo avvio:
```bash
sudo systemctl set-default multi-user.target
```
### Utilizzo di systemctl su una macchina remota
È possibile utilizzare `systemctl` per controllare un'istanza di
`systemd` su una macchina remota tramite SSH:
```bash
systemctl -H user@host status sshd
```
### Diagnostica dei servizi
Per visualizzare i servizi che hanno manifestato problemi alla partenza:
```bash
systemctl --state=failed
```
### Riferimenti
- [1] https://wiki.archlinux.org/title/systemd
- [2] https://man.archlinux.org/man/systemctl.1.en
- [3] https://wiki.archlinux.org/title/Systemd/User
- [4] https://bbs.archlinux.org/viewtopic.php?id=260255
- [5] https://gist.github.com/bugyt/c149de4ba5b1ea79a077
- [6] https://superuser.com/questions/1025091/start-a-systemd-user-service-at-boot
- [7] https://wiki.archlinux.org/title/systemd/Timers
- [8] https://www.reddit.com/r/linux4noobs/comments/18fklyi/using_systemd_to_automatically_run_commands_on/
- [9] https://stackoverflow.com/questions/10297969/systemd-on-arch-linux
- [10] https://man.archlinux.org/man/systemd.unit.5.en
## Utilizzo di `journalctl`
`journalctl` è uno strumento potente per la gestione dei log in
sistemi che utilizzano `systemd`, come Arch Linux. Questo strumento
consente di visualizzare, filtrare e analizzare i messaggi di log
generati dal sistema e dai servizi. Ecco alcuni esempi notevoli di
utilizzo di `journalctl`:
### Visualizzazione dei Log
Per visualizzare tutti i messaggi di log:
```bash
journalctl
```
### Filtraggio dei Messaggi di Log
- Per visualizzare tutti i messaggi che corrispondono a un pattern specifico:
```bash
journalctl --grep=PATTERN
```
- Per visualizzare tutti i messaggi dal boot corrente:
```bash
journalctl -b
```
- Per visualizzare i messaggi dal boot precedente:
```bash
journalctl -b -1
```
- Per visualizzare i messaggi da una data specifica:
```bash
journalctl --since="2022-01-01"
```
- Per visualizzare i messaggi degli ultimi 20 minuti:
```bash
journalctl --since "20 min ago"
```
### Seguire i nuovi messaggi
Per seguire i nuovi messaggi di log in tempo reale:
```bash
journalctl -f
```
### Visualizzazione per Unità di Servizio
- Per visualizzare tutti i messaggi per un servizio specifico, ad esempio `httpd`:
```bash
journalctl -u httpd.service
```
- Per visualizzare i messaggi di log per un'unità utente specifica, ad esempio `dbus`:
```bash
journalctl --user -u dbus
```
### Visualizzazione dei Messaggi di Errore
Per visualizzare solo i messaggi di errore, critico e allarme:
```bash
journalctl -p err..alert
```
### Visualizzazione del Buffer del Kernel
Per visualizzare i messaggi del buffer del kernel:
```bash
journalctl -k
```
### Visualizzazione dei Log in un File Specifico
Se il directory dei log contiene una grande quantità di dati di log,
`journalctl` può richiedere diversi minuti per filtrare l'output. Può
essere significativamente velocizzato utilizzando l'opzione `--file`
per forzare `journalctl` a cercare solo nel journal più recente:
```bash
journalctl --file /var/log/journal/*/system.journal -f
```
### Esercizio
Utilizzando il terminal multiplexer `tmux` suddividi il terminale in
due pannelli. Nel pannello di sinistra esegui `journalctl` in modo da
visualizzare i log del servizio `sshd`. Nel pannello di destra
connettiti al server ssh in esecuzione sulla tua macchina. Qualora il
servizio non fosse in esecuzione, fallo partire utilizzando
`systemctl`. Salva una porzione dei log in un file di testo come prova
di aver svolto l'esercizio.
### Riferimenti
- [1] https://wiki.archlinux.org/title/Systemd/Journal
- [2] https://man.archlinux.org/man/journalctl.1.en
- [3] https://www.debugpoint.com/systemd-journalctl/
- [4] https://serverfault.com/questions/721963/how-do-you-use-systemds-journalctl-patterns
- [5] https://www.loggly.com/ultimate-guide/using-journalctl/
- [6] https://bbs.archlinux.org/viewtopic.php?id=208480
- [7] https://unix.stackexchange.com/questions/199988/how-to-inspect-systemd-journal-files-directly
- [8] https://kb.adamsdesk.com/operating_system/arch_linux_quick_reference_commands/
- [9] https://www.reddit.com/r/archlinux/comments/lskkdt/always_check_your_journalctl_when_weird_problems/
- [10] https://wiki.archlinux.org/title/systemd
## Timer di `systemd`
`systemd/Timers` in Arch Linux sono unità di sistema che permettono di
pianificare l'esecuzione di servizi o eventi in base a specifici
intervalli di tempo o eventi di sistema. Questi timer possono essere
utilizzati come alternativa a `cron` per la pianificazione di
attività. I timer di `systemd` supportano eventi di tempo calendario e
monotonici, e possono essere eseguiti in modo asincrono.
### Tipi di Timer
- **Timer Realtime (o Wallclock Timers)**: Attivano un evento in base
a un calendario, similmente a come funzionano i cronjobs. Utilizzano
l'opzione `OnCalendar=` per definire l'evento.
- **Timer Monotonici**: Attivano dopo un intervallo di tempo relativo
a un punto di partenza variabile. Si fermano se il computer viene
sospeso temporaneamente o spento. Esempi comuni includono
`OnBootSec` e `OnUnitActiveSec` [1].
### Creazione di un Timer
Per creare un timer, è necessario creare un file di unità con
estensione `.timer` che descriva quando e come il timer deve attivare
un'unità di servizio corrispondente. Ad esempio, per creare un timer
che esegue un servizio ogni giorno alle 12:00, il file del timer
potrebbe essere simile a questo:
```ini
[Unit]
Description=Esegui il mio servizio giornaliero
[Timer]
OnCalendar=daily
Persistent=true
[Install]
WantedBy=timers.target
```
E il file del servizio corrispondente potrebbe essere:
```ini
[Unit]
Description=Il mio servizio giornaliero
[Service]
ExecStart=/path/to/my-service
```
La sintassi `OnCalendar` in `systemd` è utilizzata per specificare
quando un timer deve essere attivato, offrendo una maggiore
flessibilità rispetto al formato cron tradizionale. La sintassi
`OnCalendar` segue il formato `DOW YYYY-MM-DD HH:MM:SS`, dove `DOW` è
il giorno della settimana (opzionale), e gli altri campi possono
utilizzare un asterisco (`*`) per corrispondere a qualsiasi valore per
quella posizione. Se l'ora non è specificata, viene assunta come
`00:00:00`. Se la data non è specificata ma l'ora è, il prossimo match
potrebbe essere oggi o domani, a seconda dell'ora corrente [5].
Ecco alcuni esempi di come utilizzare `OnCalendar`:
- Per eseguire un evento ogni giorno alle 10:00, puoi usare:
```ini
OnCalendar=*-*-* 10:00:00
```
- Per eseguire un evento ogni anno il 15 ottobre alle 17:48:00, puoi usare:
```ini
OnCalendar=*-10-15 17:48:00
```
- Per eseguire un evento ogni anno il 1 gennaio alle 00:00:00, puoi usare:
```ini
OnCalendar=*-01-01 00:00:00
```
- Puoi anche combinare questi campi per specificare eventi più precisi. Ad esempio, per eseguire un evento ogni mercoledì alle 17:48:00, puoi usare:
```ini
OnCalendar=Wed *-*-* 17:48:00
```
Questo può anche essere scritto come:
```ini
OnCalendar=3Wed, 17:48
```
Sì, `OnCalendar` in `systemd` ammette alias come "daily" per
specificare intervalli di tempo più comuni. Questo alias può essere
utilizzato per semplificare la pianificazione di eventi ricorrenti. Ad
esempio, per eseguire un evento ogni giorno, puoi semplicemente
utilizzare:
```ini
OnCalendar=daily
```
Questo è equivalente a specificare l'evento per ogni giorno alle
00:00:00. Altri alias comuni includono "weekly", "monthly", "yearly",
e specifici giorni della settimana come "Mon", "Tue", "Wed", ecc.
Per esempio, per eseguire un evento ogni lunedì alle 10:00, potresti
usare:
```ini
OnCalendar=Mon 10:00:00
```
O per eseguire un evento ogni settimana, potresti usare:
```ini
OnCalendar=weekly
```
Questi alias rendono più semplice e leggibile la configurazione dei
timer in `systemd`, specialmente per intervalli di tempo ricorrenti
comuni [4].
`systemd` offre strumenti come `systemd-analyze calendar` per validare
e esaminare gli eventi del calendario utilizzati in
un'espressione. Questo strumento analizza un'espressione di evento del
calendario e fornisce la forma normalizzata e altre informazioni, come
la data e l'ora del prossimo "elapso" (cioè, corrispondenza) e la
quantità approssimativa di tempo prima che raggiunga il tempo di
attivazione [5].
### Gestione dei Timer
Per abilitare e avviare un timer, utilizza i comandi `systemctl
enable` e `systemctl start`, ricordando di aggiungere il suffisso
`.timer` al nome dell'unità. Per visualizzare tutti i timer attivi,
esegui:
```bash
systemctl list-timers
```
Per elencare tutti i timer (inclusi quelli inattivi), usa:
```bash
systemctl list-timers --all
```
Se un timer si sincronizza, potrebbe essere utile eliminare il suo
file `stamp-*` in `/var/lib/systemd/timers` (o
`~/.local/share/systemd/` nel caso dei timer utente). Questi file di
lunghezza zero contrassegnano l'ultima volta in cui ogni timer è stato
eseguito. Se vengono eliminati, verranno ricostruiti al prossimo avvio
del loro timer [1].
### Esempi di Utilizzo
Per impostare un timer che effettui il backup della cartella home ogni
mattina alle 10:00, e che si assicuri che il backup venga effettuato
anche se il PC è spento, segui questi passaggi. Questo esempio
utilizza un timer e un servizio di `systemd` per eseguire il backup.
#### Creazione del Servizio
Prima di tutto, crea un file di servizio che eseguirà il backup. Puoi
chiamarlo `home-backup.service` e metterlo in `/etc/systemd/system/`
per un backup a livello di sistema, o in `~/.config/systemd/user/` per
un backup a livello utente.
```ini
[Unit]
Description=Backup della cartella home
[Service]
Type=oneshot
ExecStart=/path/to/your/backup-script.sh
```
Assicurati che lo script di backup (`/path/to/your/backup-script.sh`)
sia eseguibile e che contenga i comandi necessari per il backup.
#### Creazione del Timer
Successivamente, crea un file di timer che attiverà il servizio sopra
ogni mattina alle 10:00. Anche questo file va in
`/etc/systemd/system/` per un backup a livello di sistema, o in
`~/.config/systemd/user/` per un backup a livello utente. Chiamalo
`home-backup.timer`.
```ini
[Unit]
Description=Timer per il backup della cartella home
[Timer]
OnCalendar=*-*-* 10:00:00
Persistent=true
[Install]
WantedBy=timers.target
```
L'opzione `Persistent=true` assicura che il timer si attivi non appena
il sistema è avviato, anche se il tempo previsto per l'esecuzione è
passato.
#### Abilitazione e Avvio del Timer
Per abilitare il timer, esegui:
```bash
sudo systemctl enable home-backup.timer
```
E per avviare il timer immediatamente, senza doverlo abilitare:
```bash
sudo systemctl start home-backup.timer
```
Se stai creando un timer a livello utente, sostituisci `sudo` con
`--user` nei comandi sopra.
#### Verifica
Per verificare che il timer sia attivo e pianificato correttamente,
puoi usare:
```bash
systemctl list-timers
```
Questo mostrerà tutti i timer attivi, inclusi quelli pianificati per
il futuro.
#### Considerazioni
- Assicurati che lo script di backup sia configurato correttamente e
che abbia i permessi necessari per eseguire il backup.
- Se il tuo sistema è spento quando il timer dovrebbe attivarsi, il
timer si attiverà al prossimo avvio del sistema, grazie all'opzione
`Persistent=true`.
- Ricorda che i timer a livello utente richiedono che l'utente sia
loggato per funzionare, a meno che non sia configurato per "linger"
con `loginctl enable-linger $USER`.
Questo metodo ti permette di pianificare il backup della cartella home
ogni mattina alle 10:00, garantendo che il backup venga effettuato
anche se il PC è spento al momento previsto per il backup [1].
### Riferimenti
- [1] https://wiki.archlinux.org/title/Systemd/Timers
- [2] https://linuxconfig.org/how-to-schedule-tasks-with-systemd-timers-in-linux
- [3] https://www.airplane.dev/blog/systemd-timer-how-to-schedule-tasks-with-systemd
- [4] https://man.archlinux.org/man/systemd.timer.5
- [5] https://opensource.com/article/20/7/systemd-timers
- [6] https://wiki.archlinux.org/title/Systemd
- [7] https://lloydrochester.com/post/unix/systemd-timer-example/
- [8] https://unix.stackexchange.com/questions/704109/configure-systemd-timer-to-run-every-hour-after-first-run
- [9] https://linuxman.co/linux-desktop/easily-automate-maintenance-in-arch-linux-with-the-power-of-systemd-timers/
- [10] https://www.fosslinux.com/48317/scheduling-tasks-systemd-timers-linux.htm
- [11] https://www.binaryte.com/blog/systemd-timers-tutorial-for-scheduling-tasks
- [12] https://www.learnlinux.tv/automate-your-tasks-with-systemd-timers-a-step-by-step-guide/
- [13] https://blog.devgenius.io/devops-in-linux-systemd-timer-4e95f57b6d71
- [14] https://dashdash.io/5/systemd.timer
- [15] https://techviewleo.com/configuring-cron-jobs-in-linux-using-systemd-timers/

Binary file not shown.