====== 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_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_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. # : 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 ===== The **postfix** program upgraded from version **3.7.11** to **3.10.5**, some configuration options are obsolete. postconf smtpd_use_tls smtpd_use_tls = yes postconf: warning: /etc/postfix/main.cf: support for parameter "smtpd_use_tls" will be removed; instead, specify "smtpd_tls_security_level" In **/etc/postfix/main.cf** replace the line: smtpd_use_tls=yes with: # Option smtpd_use_tls is obsolete in Postfix 3.10.5. #smtpd_use_tls=yes # STARTTLS is advertised on port 25. smtpd_tls_security_level = may È opportuno anche verificare il file **/etc/postfix/master.cf**: nella sezione **submission** è corretto richiedere obbligatoriamente la crittografia con ''smtpd_tls_security_level=encrypt'', quindi l'opzione ''smtpd_tls_auth_only=yes'' (che nasconde l'autenticazione su connessioni non cifrate) diventa superflua: submission inet n - y - - smtpd -o syslog_name=postfix/submission -o smtpd_tls_security_level=encrypt -o smtpd_sasl_auth_enable=yes -o smtpd_reject_unlisted_recipient=no -o smtpd_relay_restrictions=permit_sasl_authenticated,reject ===== 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ù: **[[https://www.debian.org/releases/trixie/release-notes/issues.html#the-last-lastb-and-lastlog-commands-have-been-replaced|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 Il file che contiene gli accessi è **/var/log/wtmp.db** che in Debian 13 viene ruotato una volta all'anno con ritenzione degli ultimi 4. Per consultare una vecchia versione del file si aggiunge il parametro **%%--file%%**. ===== 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 ===== Winbind PAM messaggio password non corretta ===== Quando si accede ad una macchina Debian 13 Trixie via **ssh** e si immette una **password sbagliata**, al successivo login andato a buon fine si ottiene il messaggio di errore: **//When trying to update a password, this return status indicates that the value provided as the current password is not correct//**. Questo è dovuto al **modulo PAM** installato dal pacchetto **winbind**, che ad ogni login verifica se le credenziali sono valide su un eventuale dominio o Active Directory. Per disabilitare questo //hook// di Winbind al sistema PAM, l'utente root esegue **pam-auth-update** e dalla schermata interattiva disattiva il modulo **Winbind NT/Active Directory authentication**. ===== PostgreSQL ===== :!: **ATTENZIONE**: Durante l'aggiornamento è opportuno declinare l'aggiornamento automatico del cluster dalla versione 15 alla 17, piuttosto lo si esegue manualmente dopo che tutto è andato a buon fine. Per eseguire l'upgrade si lancia da root il comando: pg_upgradecluster -v 17 15 main 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 (sempre da utente root): 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**. ===== php-mdb2 ===== Il pacchetto **php-mdb2** (libreria PHP di astrazione database) non è più presente in Debian 13, così come i driver specifici **php-mdb2-driver-pgsql** ecc. Il consiglio è di migrare verso il **PHP Data Objects (PDO)**, che è il rimpiazzo ufficiale incluso in PHP. La vecchia sintassi del tipo: $db = MDB2::connect($dsn); $result = $db->query("SELECT * FROM users"); viene sostituita con qualcosa del tipo: $pdo = new PDO($dsn, $user, $pass); $stmt = $pdo->query("SELECT * FROM users"); $rows = $stmt->fetchAll(PDO::FETCH_ASSOC); ===== 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 "$@"; } * **[[https://unix.stackexchange.com/questions/781758/split-longopt-command-not-found-when-trying-tab-completion|"_split_longopt: command not found" when trying tab-completion]]** ===== OpenVPN ===== Come per l'aggiornamento **[[debian_upgrade_11_12#openvpn_bf-cbc_not_supported|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 FIXME. ===== 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.