Table of Contents
Aggiornamento da Debian 12 Bookworm a 13 Trixie
Update e upgrade
Aggiornamento corrente
apt update apt upgrade apt --purge autoremove
Cambio dei repository
deb http://deb.debian.org/debian/ trixie main contrib non-free non-free-firmware deb-src http://deb.debian.org/debian/ trixie main contrib non-free non-free-firmware deb http://security.debian.org/debian-security trixie-security main contrib non-free non-free-firmware deb-src http://security.debian.org/debian-security trixie-security main contrib non-free non-free-firmware deb http://deb.debian.org/debian/ trixie-updates main contrib non-free non-free-firmware deb-src http://deb.debian.org/debian/ trixie-updates main contrib non-free non-free-firmware
Upgrade
apt update apt upgrade --without-new-pkgs apt full-upgrade
GRUB corrotto
Un upgrade su un Mini PC Intel Alder Lake N95 non è andato a buon fine (errori durante l'installazione dei pacchetti). Una conseguenza è stata che anche GRUB non si è installato correttamente: durante l'avvio veniva visualizzato il messaggio Welcome to GRUB! ma poi - invece del menu di bootstrap - la macchina si riavviava e quindi entrava nel BIOS di sistema.
Per risolvere è stato necessario avviare da una chiavetta USB (es. con GRML 2025), assemblare i dischi RAID, montare tutte le partizioni sotto /mnt/, montare con l'opzione bind gli pseudo filesystem e quindi effettuare il chroot:
chroot /mnt /bin/bash
A quel punto si è provveduto a rimuovere tutti i file di GRUB e a reinstallare il pacchetto:
rm -rf /boot/grub /boot/efi/EFI/debian /boot/efi/EFI/BOOT
apt install --reinstall \
grub-efi-amd64 \
grub-efi-amd64-bin \
grub-efi-amd64-signed \
shim-signed
Infine i comandi standard di installazione:
grub-install /dev/sda update-grub update-initramfs -k all -u
Dovecot
ATTENZIONE: Nella pagina Postfix, SpamAssassin, ClamAV and Dovecot è illustrata una configurazione di Dovecot abbastanza articolata che si riferisce a una Debian 9 Stretch che installa Dovecot 2.2.27. Tale configurazione resta valida fino a Debian 12 che installa Dovecot 2.3.19. Debian 13 Trixie installa invece Dovecot 2.4.1, che richiede diverse modifiche.
Dalla versione 2.3.19 alla versione 2.4.1 di Dovecot cambia in modo importante la sintassi dei file di configurazione. In particolare ci siamo trovati con i seguenti file nella directory /etc/dovecot/conf.d/ non più compatibili:
- 10-mail.conf
- 10-ssl.conf
- 15-lda.conf (non causava errori nell'avvio del servizio, ma il delivery locale non funzionava)
- 90-sieve-extprograms.conf
- 90-sieve.conf
Il servizio non partiva con il seguente errore in syslog:
systemd[1]: Failed to start dovecot.service - Dovecot IMAP/POP3 email server.
Anche i seguenti file che erano stati personalizzati hanno una nuova versione, ma le personalizzazioni non inficiavano la validità della configurazione:
- 10-auth.conf
- 10-master.conf
Qui di seguito sono riportate le personalizzazioni con la nuova sintassi equivalenti alla configurazione presentata nella pagina Postfix, SpamAssassin, ClamAV and Dovecot.
/etc/dovecot/conf.d/10-mail.conf
Abilitare l'uso delle Maildir:
mail_driver = maildir
#mail_home = /home/%{user | username}
mail_path = ~/Maildir
mail_inbox_path = .
/etc/dovecot/conf.d/10-ssl.conf
Abilitare l'uso del certificato SSL:
ssl_server_cert_file = /etc/letsencrypt/live/www.rigacci.org/fullchain.pem ssl_server_key_file = /etc/letsencrypt/live/www.rigacci.org/privkey.pem
/etc/dovecot/conf.d/15-lda.conf
Attivare il plugin Sieve per il Local Delivery Agent:
protocol lda {
mail_plugins {
sieve = yes
}
}
90-sieve-extprograms.conf
Le impostazioni per l'esecuzione dei filtri Sieve sono sempre le stesse, ma prima erano inserite in una sezione plugin {}, adesso sono impostazioni top-level:
sieve_filter_socket_dir = sieve-filter sieve_execute_socket_dir = sieve-execute sieve_filter_bin_dir = /usr/local/lib/dovecot/sieve-filter sieve_execute_bin_dir = /usr/local/lib/dovecot/sieve-execute # Change the default timeout (10 seconds) for the filter extension. sieve_filter_exec_timeout = 60s # Change the default timeout (10 seconds) for the execute extension. sieve_execute_exec_timeout = 60s
90-sieve.conf
Anche in questo caso la sezione plugin {} non esiste più e le impostazioni sono state promosse top-level. L'opzione sieve_extensions è diventata una sezione di valori booleani
sieve_extensions {
vnd.dovecot.filter = yes
vnd.dovecot.execute = yes
editheader = yes
}
#sieve_plugins = sieve_imapsieve sieve_extprograms
sieve_plugins = sieve_extprograms
# Header fields must not exceed four kilobytes.
sieve_editheader_max_header_size = 4k
# Specifies what envelope sender address is used for redirected messages.
# sender: The sender address is used (default)
# recipient: The final recipient address is used
# orig_recipient: The original recipient is used
# user_email: The sieve_user_email setting.
# postmaster: The postmaster_address configured for LDA/LMTP.
# <user@domain>: From user@domain, the angle brackets are mandatory.
sieve_redirect_envelope_from = orig_recipient
In sieve_plugins si è abilitato solo sieve_extprograms per poter eseguire degli script esterni definendo dell regole Sieve. Il plugin sieve_imapsieve consente invece di definire delle azioni in base ad eventi IMAP, ad esempio se l'utente muove un messaggio da una cartella IMAP ad un altra.
Postfix
postconf smtpd_sasl_type smtpd_sasl_path
smtpd_sasl_type = dovecot
smtpd_sasl_path = private/auth
postconf: warning: /etc/postfix/main.cf: support for parameter "smtpd_use_tls"
will be removed; instead, specify "smtpd_tls_security_level"
In the file /etc/postfix/main.cf replace the line
smtpd_use_tls=yes
with
Syslog
Il sistema di logging predefinito è di systemd-journald installato dal pacchetto systemd. Non viene più installato il pacchetto rsyslog pertanto non vengono più creati i consueti file:
- /var/log/syslog
- /var/log/kern.log
I log di sistema vengono creati secondo i criteri stabiliti in /etc/systemd/journald.conf, generalmente nella directory /var/log/journal/.
Anzitutto è possibile decidere se i log di sistema debbano essere conservati in memoria permanente (opzione predefinita) oppure in memoria volatile. Per utilizzare memoria volatile è sufficiente impostare nel file di configurazione:
[Journal] Storage=volatile
Al restart del servizio systemd-journald viene creato la directory /run/log/journal/ in tmpfs.
Per limitare lo spazio utilizzato su memoria permanente (filesystem su disco) si possono usare diverse opzioni System*, per gestire lo spazio in memoria volatile si usano le omologhe Runtime*:
| For persistent file system | |
|---|---|
| SystemMaxUse | How much disk space the journal may use up at most. Default to 10% of the partition where /var/log/journal/ resides. |
| SystemKeepFree | How much disk space systemd-journald shall leave free for other uses. |
| SystemMaxFileSize | How large individual journal files may grow at most before rotating. |
| SystemMaxFiles | How many individual journal files to keep at most in rotation. |
| For volatile in-memory file system | |
| RuntimeMaxUse | In Debian, the default /run/log/journal/, resides into the /run tempfs. |
| RuntimeKeepFree | |
| RuntimeMaxFileSize | |
| RuntimeMaxFiles | |
| Rotation | |
| MaxFileSec | The maximum time to store entries in a single journal file before rotating to the next one. Use it to ensure that not too much data is lost at once when old journal files are deleted. |
| MaxRetentionSec | The maximum time to store journal entries. If you need a retention shorter than the one imposed by SystemMaxUse. |
This is an example on how to limit the disk space used and to determine rotaton policy (rotate once a day, keep 366 files i.e. one year):
[Journal] SystemMaxUse=7G SystemKeepFree=2G SystemMaxFileSize=256M SystemMaxFiles=366 MaxFileSec=1day
Cambiamenti nei comandi
ifconfig
Il comando ifconfig non viene installato per default, un sostituto moderno potrebbe essere:
ip address show
Per chi volesse avere il comando legacy compatibile, si installa il pacchetto net-tools, che installa l'eseguibile in /usr/sbin/ e /sbin/.
sniffit
Il pacchetto sniffit era presente in Debian 12 Bookworm con la versione 0.5, ma non è entrato in Debain 13 Trixie.
Per fortuna il vecchio pacchetto sniffit_0.5-3_amd64.deb di Debian 12 si installa senza problemi nella nuova release e funziona correttamente.
Pare che anche il pacchetto sniffit_0.6-1_amd64.deb di testing/forky si installi e funzioni senza problemi. Invece il pacchetto sniffit_0.7-1_amd64.deb non funziona (non produce i file con il dump della session).
mitmproxy
Il pacchetto mitmproxy era presente con la versione 8.1.1 in Debian 12 Bookworm, ma non è entrato in Trixie. Per fortuna in testing/forky esiste il pacchetto mitmproxy_8.1.1-4_all.deb che si installa in Trixie, con la semplice aggiunta di un apt install --fix-broken.
ntp
Già in Debian 12 alcuni pacchetti relativi a ntp erano transitional packages utilizzati per passare ai pacchetti ntpsec, questo l'elenco completo delle transizioni:
- ntp ⇒ ntpsec
- ntpdate ⇒ ntpsec-ntpdate
- sntp ⇒ ntpsec-ntpdig
In generale sarà sufficiente aver installato i pacchetti
- ntpsec - Contiene il demone principale ntpd e diverse utility come ntptime, ntptrace, ecc.
- ntpsec-ntpdig - Contiene l'utility ntpdig.
Se ci si accontenta di un servizio minimalista per la sincronizzazione dell'ora è sufficiente installare il singolo pacchetto (alternativo a ntpsec):
- systemd-timesyncd
last
Il comando last dal pacchetto util-linux non c'è più: The last, lastb and lastlog commands have been replaced.
Il comando alternativo è:
wtmpdb last
Una installazione ex-novo del pacchetto wtmpdb crea il link simbolico che riproduce il vecchio comportamento:
lrwxrwxrwx 1 root root 6 Oct 20 20:32 /usr/bin/last -> wtmpdb
Problema ping
Dopo l'aggiornamento l'utente non privilegiato non riesce a fare un ping:
:~$ ping 8.8.8.8 ping: socktype: SOCK_RAW ping: socket: Operation not permitted ping: => missing cap_net_raw+p capability or setuid?
Questo ha diverse conseguenze nefaste, ad esempio Icinga2 fallisce tutti i test sugli host attivi, con il messaggio di errore:
/bin/ping -6 -n -U -w 30 -c 5 samos.rigacci.org CRITICAL - Could not interpret output from ping command
In Debian 13 i permessi di ping non dipendono più dalla capability CAP_NET_RAW di Linux, ma utilizza un socket ICMP_PROTO il cui accesso viene controllato dal GID e da sysctl net.ipv4.ping_group_range. In una installazione normale il pacchetto linux-sysctl-defaults imposta questo valore in modo tale che il ping funzioni come ci si aspetta.
Può essere necessario reinstallare il pacchetto per sistemare i permessi:
apt install linux-sysctl-defaults
PostgreSQL
La procedura di aggiornamento lascia due cluster PostgreSQL in funzione, la versione 15 e la versione 17. Per verificare anzitutto si cambia utente in postgres:
su - postgres
quindi si verifica i cluster esistenti:
pg_lsclusters Ver Cluster Port Status Owner Data directory Log file 15 main 5433 online postgres /var/lib/postgresql/15/main /var/log/postgresql/postgresql-15-main.log 17 main 5432 online postgres /var/lib/postgresql/17/main /var/log/postgresql/postgresql-17-main.log
Come si vede il nuovo cluster è già stato spostato sulla porta predefinita 5432 e i database sono stati copiati automaticamente nel cluster nuovo. Verificare con:
psql --cluster 17/main postgres=# \l
In pratica la procedura di aggiornamento ha provveduto ad eseguire il comando pg_upgradecluster.
Dopo aver verificato che il nuovo cluster stia funzionando correttamente è possibile rimuovere del tutto il vecchio:
pg_dropcluster --stop 15 main pg_dropcluster 15 main
Infine si possono disinstallare i vecchi pacchetti:
dpkg --purge postgresql-15 postgresql-client-15
PostgreSQL: creazione del cluster 17/main fallita
Durante l'upgrade qualcosa può andare storto e il nuovo cluster non viene creato. Verificare da utente postgres:
su - postgres
probabilmente esite solo il vecchio cluster 15/main e manca il nuovo 17/main:
pg_lsclusters Ver Cluster Port Status Owner Data directory Log file 15 main 5432 online postgres /var/lib/postgresql/15/main /var/log/postgresql/postgresql-15-main.log
Mancano anche le rispettive directory:
- /etc/postgresql/17/
- /var/lib/postgresql/17/
Probabilmente la procedura automatica di aggiornamento è fallita per l'ordine di installazione dei pacchetti PostGIS. Manualmente si è verificato che siano installati i pacchetti necessari che installano l'ultima versione per dipendenza:
- postgresql-postgis ⇒ postgresql-17-postgis-3
- postgresql-postgis-scripts ⇒ postgresql-17-postgis-3-scripts
Quindi si è lanciato manualmente la procedura di upgrade da utente root:
pg_upgradecluster -v 17 15 main
Alcuni comandi utili per la diagnosi
Comandi da eseguire come utente postgres. Elenco dei database esistenti:
psql -p 5432 -d postgres -c "SELECT datname FROM pg_database WHERE datistemplate = false;" -t
Estensioni abilitate (es. postgis) in un database:
psql -p 5432 -d [DBNAME] -c "\dx"
PHP 8.2 => 8.4
Si passa dalla versione 8.2 alla versione 8.4. Verificare se ci sono delle impostazioni da riportare ad esempio da /etc/php/8.2/apache2/php.ini a /etc/php/8.4/apache2/php.ini.
gamin
gamin and libgamin0
SSH key exchange
Alcuni client non troppo aggiornati potrebbero avere problemi a collegarsi via SSH alla nuova Debian 13 Trixie, journalctl potrebbe indicare un messaggio di errore del tipo:
sshd-session[98743]: Unable to negotiate with 14.156.24.17 port 60053:
no matching key exchange method found. Their offer:
diffie-hellman-group-exchange-sha256,diffie-hellman-group-exchange-sha1,
diffie-hellman-group14-sha1,diffie-hellman-group1-sha1 [preauth]
Per vedere i key exchange methods abilitati:
sshd -T | grep kexalgorithms
Per aggiungerne uno si può aggiungere una riga a /etc/ssh/sshd_config.d/90-local.conf:
KexAlgorithms +diffie-hellman-group-exchange-sha256
Python
La nuova versione di Python è più stringente su alcune sintassi, ad esempio quando si usano espressioni regolari contenenti caratteri escape si potrebbe incappare in warning del tipo:
SyntaxWarning: invalid escape sequence '\s'
Tutte le stringhe utilizzate in espressioni del tipo:
re.compile('\regex-string\')
devono usare stringhe raw, quindi con la sintassi:
re.compile('r\regex-string\')
Python timezone
Alcune timezone sono state rimosse dal modulo pytz, ad esempio CET Central Europe Time:
import pytz print(pytz.timezone("CET"))
La timezone va sostituita con quella geografica, ad esmepio Europe/Rome. La soluzione moderna tuttavia è quella di usare il modulo zoneinfo:
from zoneinfo import ZoneInfo tz = ZoneInfo("Europe/Rome")
Errore in Bash completion
Quando si esegue il completamento-tab di un comando Bash si ottiene in alcuni casi l'errore _split_longopt: command not found.
Pare che il problema derivi dal fatto che la funzione _split_longopt() è stata tolta dal file /usr/share/bash-completion/bash_completion, ma diversi file in /usr/share/bash-completion/completions/* fanno riferimento ancora ad essa.
Il workaround più veloce è definire la funzione mancante in $HOME/.bashr:
# Workaround for bug "bash: _split_longopt: command not found"
_split_longopt() { _comp__split_longopt "$@"; }
OpenVPN
Come per l'aggiornamento da Debian 11 a Debian 12 una connessione OpenVPN potrebbe non partire con questo messaggio d'errore:
Cipher BF-CBC not supported
Nel corrispondente file .conf è possibile aggiungere la seguente opzione, che ovviemente deve essere supportata anche dall'altra estremità:
cipher AES-256-CBC
OpenLDAP server (slapd)
Nel passaggio dalla versione 2.5.13 di slapd alla 2.6.10 è stato necessario aggiornare il file /etc/ldap/slapd.d/cn=config.ldif. In particolare la directory con i certificati non esiste più:
olcTLSCACertificatePath: /etc/ssl/cert
La directory con i certificati è diventata /etc/ssl/certs/, ma l'impostazione suggerita da Debian è quella di indicare piuttosto il file “boundle”, cioè il file che contiene i certificati di tutte le autorità trusted:
olcTLSCACertificateFile: /etc/ssl/certs/ca-certificates.crt
iproute2
Sono scomparsi i file di configurazione /etc/iproute2/*. ad esempio il file /etc/iproute2/rt_tables usato per configurare il source routing con un host dual-homed.
udisks2.service
Il servizio udisks2.service viene attivato di default e monta automaticamente .
Pager e ANSI color escape sequences
Alcuni comandi - ad esmepio apt search oppure git - mostrano il loro output su terminale testuale utilizzando i colori tramite codici escape ANSI. Quando tale output viene visualizzato una pagina per volta tramite un ridirezione pipe su pager (programma che è normalmente linkato a less su Debian) il programma se ne accorge e non produce i codici colore ANSI.
In Debian 13 Trixie alcuni comandi - come appunto apt search - hanno attivato la funzione di pager per default e l'output viene automaticamente dato in pasto a pager. Se per caso l'utente ha configurato la variabile d'ambiente $LESS (nel caso mio era impostata a -i per ignorare la capitalizzazione nelle ricerche) il pager non interpreta i codici colore ANSI e produce un risultato del tipo:
apt search kodi ESC[32mkodiESC[0m/testing,now 3:21.2+dfsg-4+rpt1 arm64 [installed] Open Source Home Theatre (executable binaries) ESC[32mkodi-addons-devESC[0m/testing 3:21.2+dfsg-4+rpt1 arm64 Open Source Home Theatre (addon development package)
La soluzione è aggiungere il parametro -R alla variabile $LESS:
export LESS='-iR'
Impostazioni locale LANG
Nelle versioni precedenti di Debian era possibile impostare una singola variabile LC_ con il comando localectl. Ad esempio avendo impostato LANG=en_US.UTF-8 (che prevede l'ora nel formato AM/PM) era comunque possibile impostare il formato a 24 ore con il comando:
localectl set-locale LC_TIME=C.UTF-8
Tale comando aggiungeva la variabile di ambiente al file /etc/default/locale. Con Debian Trixie lo stesso comando produce un errore:
localectl set-locale LC_TIME=C.UTF-8 Failed to issue method call: Access denied
Si tratta di una scelta intenzionale perché Debian ha il tool update-locale, che può essere usato ad esempio in questo modo:
update-locale LANG=en_US.UTF-8 LC_TIME=C.UTF-8
Le impostazioni vengono salvate in /etc/locale.conf e il vecchio /etc/default/locale è diventato un link simbolico ad esso.
