Piper TTS a Deepin

Comanda per dir bon dia amb la veu d’Ona:

echo "hola bon dia" | /home/Miquel/piper/piper -m /home/Miquel/piper_linux_x86_64/ca_ES-upc_ona-medium.onnx --output-raw | aplay -r 22050 -f S16_LE -t raw -

1. Extreure el fitxer correctament:

tar -xvf piper_linux_x86_64.tar.gz

2. Descarregar la veu en català (dins de la carpeta que acabes de crear):

wget -P piper_linux_x86_64 https://huggingface.co/rhasspy/piper-voices/resolve/main/ca/ca_ES/upc_ona/x_low/ca_ES-upc_ona-x_low.onnx
wget -P piper_linux_x86_64 https://huggingface.co/rhasspy/piper-voices/resolve/main/ca/ca_ES/upc_ona/x_low/ca_ES-upc_ona-x_low.onnx.json

3. Fer que l’ordinador parli:

echo "hola bon dia" | ./piper_linux_x86_64/piper -m ./piper_linux_x86_64/ca_ES-upc_ona-x_low.onnx --output-raw | aplay -r 22050 -f S16_LE -t raw -

📋 Xuleta d’Ús: Piper TTS (Català) a Deepin

1. COM usar-la des de la Terminal (Deepin)

Si vas afegir la funció al teu ~/.bashrc, tens dues eines ràpides:

  • Escoltar directament:parla "Hola Miquel, el sistema funciona perfectament."
  • Generar un fitxer d’àudio (sense reproduir-lo):cd ~/piper-tts/piper export LD_LIBRARY_PATH=. echo "Text a guardar" | ./piper --model ca_ES-upc_ona-medium.onnx --output_file /ruta/del/meu/fitxer.wav

2. COM usar-la des de PHP (Integració Web)

Com que treballes amb aplicacions PHP, pots generar àudio dinàmicament al servidor. Aquí tens un exemple segur i net:

<?php
$text = "Hola, això és una prova de veu generada des de PHP.";
$output_file = "/tmp/tts_" . uniqid() . ".wav";

// 1. Netejar el text per evitar injecció de comandes a la terminal
$text_net = escapeshellarg($text);

// 2. Construir la comanda (ajusta la ruta si el teu usuari no és 'Miquel')
$comanda = "cd /home/Miquel/piper-tts/piper && " .
           "export LD_LIBRARY_PATH=. && " .
           "echo $text_net | ./piper --model ca_ES-upc_ona-medium.onnx --output_file $output_file 2>/dev/null";

// 3. Executar
shell_exec($comanda);

// 4. Comprovar si s'ha creat i servir-lo (o retornar la ruta)
if (file_exists($output_file)) {
    header('Content-Type: audio/wav');
    header('Content-Disposition: attachment; filename="veu.wav"');
    readfile($output_file);
    unlink($output_file); // Neteja el fitxer temporal després d'enviar-lo
} else {
    echo "Error generant l'àudio.";
}
?>

Nota: Assegura’t que l’usuari que executa PHP (ex: www-data o el teu usuari en entorn de desenvolupament) tingui permisos d’execució a la carpeta /home/Miquel/piper-tts/piper.

3. ON i QUAN usar-la (Casos d’ús pràctics)

  • 🎓 Projectes d’aprenentatge d’idiomes: Com que t’interessa el suport multilingüe, pots canviar el model .onnx (ex: a en_US-amy-medium.onnx) per generar àudio d’exemple per a estudiants de català, anglès o basc.
  • ♿ Accessibilitat: Afegir un botó «Escoltar resposta» a les teves aplicacions web per a usuaris amb discapacitat visual o dificultats de lectura.
  • 🔔 Notificacions d’escriptori: Combinar-ho amb les notificacions de Deepin perquè l’ordinador et llegeixi alertes:parla "Atenció: la còpia de seguretat al servidor Synology ha finalitzat."
  • 🛠️ Depuració (Debugging): Fer que el servidor «parli» quan un script PHP llarg acaba d’executar-se, així no has d’estar mirant la pantalla constantment.

4. COM personalitzar la veu (Trucs avançats)

Piper permet ajustar paràmetres afegint-los a la comanda:

  • Fer-la parlar més ràpid: Afegeix --length_scale 0.8 (valors més baixos = més ràpid).
  • Fer-la parlar més a poc a poc: Afegeix --length_scale 1.2.
  • Més expressiva/aleatòria: Afegeix --noise_scale 0.8 (el valor per defecte és 0.66).

Exemple:

echo "Vaig molt ràpid!" | ./piper --model ca_ES-upc_ona-medium.onnx --length_scale 0.8 --output_file rapid.wav

5. RESOLUCIÓ RÀPIDA DE PROBLEMES

ProblemaSolució
Error: libpiper_phonemize.so.1: cannot openEstàs executant l’ordre fora de la carpeta o sense la variable d’entorn. Fes: cd ~/piper-tts/piper && export LD_LIBRARY_PATH=.
No se sent cap so amb paplayProva a reproduir el fitxer .wav directament amb el reproductor d’àudio del Deepin (doble clic). Si se sent, el problema és de configuració de PulseAudio/PipeWire, no de Piper.
La veu sona molt robòticaAssegura’t que estàs fent servir el model medium o high. Els models x_low són molt ràpids però sonen més artificials.

💡 Proper pas opcional

Si en el futur vols afegir una veu en anglès o basca al mateix sistema, només has de:

  1. Descarregar el .onnx i .json de la nova llengua des del repositori de veus de Piper.
  2. Posar-los a la carpeta ~/piper-tts/piper.
  3. Canviar --model ca_ES-upc_ona-medium.onnx pel nom del nou fitxer a les teves comandes o scripts PHP.

T’ha quedat clar amb aquest format? Si vols que adaptem la funció de bash o l’script de PHP per a algun cas concret dels teus projectes, digue-m’ho!

Backup sda4 → restauració a sda6

Sí. Et preparo una nota-resum tipus xuleta, centrada en què és backup_amd0_sda4_roota.img, quin és l’objectiu i els dos fluxos possibles: comprovar/recuperar i restaurar a sda6.

Backup sda4 → restauració a sda6

1. Punt de partida

Backup original:

/media/Miquel/backup_principal/backup_amd0_sda4_roota.img

Aquest fitxer NO és una imatge ext4 muntable directament.

És una imatge Partclone creada a partir de la partició:

/dev/sda4

La seva capçalera confirma:

partclone-image
0.3.27
EXTFS

Informació de la imatge:

Device size:   70,2 GB
Space in use:  23,0 GB
Free Space:    47,2 GB
Block size:    4096 bytes

Per tant:

sda4 (EXT4)
   │
   │ backup amb Partclone
   ▼
backup_amd0_sda4_roota.img

2. Objectiu

L’objectiu final és recuperar el sistema que hi havia a sda4 i posar-lo a sda6, sense tocar el backup original.

Abans de tocar sda6, volem comprovar que el backup és correcte.

Per això fem servir una imatge temporal.


3. Imatge temporal

Hem creat al mateix USB:

/media/Miquel/backup_principal/roota_temporal.img

Inicialment:

72 GiB

La vam preparar amb ext4, però això no és essencial, perquè Partclone substitueix el contingut durant la restauració.

El fitxer està associat actualment a:

/dev/loop0

És a dir:

/dev/loop0
      │
      ▼
roota_temporal.img

4. Flux de treball actual

Ara mateix està en curs:

                    LECTURA
                       │
                       ▼
backup_amd0_sda4_roota.img
       (Partclone EXTFS)
                       │
                       │ partclone.restore
                       ▼
                  /dev/loop0
                       │
                       ▼
              roota_temporal.img
                 (ext4 real)

La comanda utilitzada és:

sudo partclone.restore \
-s /media/Miquel/backup_principal/backup_amd0_sda4_roota.img \
-o /dev/loop0

Important

-s = source / origen

Per tant:

-s backup_amd0_sda4_roota.img

→ només llegeix el backup.

-o = output / destinació

-o /dev/loop0

→ escriu a roota_temporal.img.

No està escrivint ni a sda4 ni a sda6.


5. Quan Partclone arribi al 100 %

Primer comprovarem que la restauració ha acabat correctament.

Després muntarem:

roota_temporal.img
       │
       ▼
/mnt/backup_root

I podrem comprovar:

ls -lah /mnt/backup_root

i explorar el sistema recuperat.

També podrem comprovar que hi són directoris importants com:

/etc
/boot
/usr
/var
/home

segons l’estructura que tingués aquella instal·lació.


6. Flux final: restaurar a sda6

Si la còpia temporal és correcta, l’objectiu final serà:

backup original
       │
       ▼
roota_temporal.img
       │
       │ comprovat
       ▼
     /dev/sda6

És a dir:

           BACKUP
              │
              ▼
backup_amd0_sda4_roota.img
              │
              ▼
     roota_temporal.img
              │
              │ comprovació
              ▼
           /dev/sda6

sda4 no és la destinació final.


7. Regla de seguretat

Durant tot el procés:

backup_amd0_sda4_roota.img
        ↓
     ORIGINAL
        ↓
     NO TOCAR

No s’ha de fer mai:

partclone.restore ... -o /dev/sda4

ni:

partclone.restore ... -o /dev/sda6

fins que hàgim decidit definitivament que volem sobreescriure sda6.

Primer:

backup → temporal → comprovar → sda6


8. Estat actual

USB:

/dev/sdb1
227 GB total
87 GB utilitzats
129 GB lliures

Fitxers:

backup_amd0_sda4_roota.img    ← BACKUP ORIGINAL
roota_temporal.img             ← DESTINACIÓ TEMPORAL

Actualment:

Partclone → 11% ... en procés

Quan arribi al 100 %, no fem encara la restauració a sda6.

Primer comprovem la còpia temporal.

Així tenim el procediment ben documentat i, sobretot, queda clar el punt crític: sda4 és l’origen històric del backup, però sda6 serà la destinació final; roota_temporal.img és el pas intermedi de verificació.



La imatge backup_amd0_sda4_roota.img està en el format natiu de Partclone (no és una imatge dd en brut ni un fitxer comprimit). Et detallo:

Format de la imatge

  • Tipus: imatge de bloc de Partclone (partclone-image).
  • Contingut: només copia els blocs ocupats de la partició sda4 (la partició root), no tot l’espai en brut. Per això la imatge (≈23 GB) és més petita que la mida total de la partició.
  • Estructura interna: el fitxer .img conté una capçalera de Partclone + les dades de la partició, amb informació del sistema de fitxers (normalment ext4 en una arrel de sistema).

Com ho pots verificar

Per confirmar-ho al 100%, pots executar a la terminal:

file /media/Miquel/backup_principal/backup_amd0_sda4_roota.img

Hauries de veure una sortida similar a:

Clonezilla image (partclone), version 2.x

També pots obtenir informació detallada amb:

partclone.info -s /media/Miquel/backup_principal/backup_amd0_sda4_roota.img

Com restaurar-la

Com que és format Partclone (ext4), per recuperar-la hauries de fer:

sudo partclone.ext4 -r -s /media/Miquel/backup_principal/backup_amd0_sda4_roota.img -o /dev/sda4

Punt important

Aquesta imatge no es pot muntar directament (no és una imatge en brut tipus dd). Si el que vols és extreure un fitxer concret sense restaurar tota la partició, caldria primer convertir-la a una imatge en brut (per exemple amb partclone.restore -s ... -o image.raw) i després muntar-la amb mount -o loop.

Vols que t’ajudi amb algun d’aquests passos (verificar el format, restaurar-la o extreure un fitxer)?


Backup amb partclone

Backup amb partclone

Miquel@Miquel-PC:~$ lsblk

NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS

sda 8:0 0 476,9G 0 disk

├─sda1 8:1 0 100M 0 part /efi

├─sda2 8:2 0 16M 0 part

├─sda3 8:3 0 296,4G 0 part /media/Miquel/Windows

├─sda4 8:4 0 1,2G 0 part

├─sda5 8:5 0 129,3G 0 part /media/Miquel/Roota1

└─sda6 8:6 0 50G 0 part /var

/persistent/ostree

/ostree

/sysroot/ostree

/sysroot

/

sdb 8:16 1 231G 0 disk

└─sdb1 8:17 1 230,9G 0 part /media/Miquel/backup_principal1

Miquel@Miquel-PC:~$

se’n a sda6 vull ececutar aquesta comanda:

sudo partclone.ext4 -c -s /dev/sda5 -o /media/Miquel/

/media/Miquel/backup_principal1

1º desmuntar sda5

sudo umount /dev/sda5

─sda5 8:5 0 129,3G 0 part

abans ├─sda5 8:5 0 129,3G 0 part /media/Miquel/Roota1

2º Instal·lar partclone (si encara no està instal·lat)

sudo apt update && sudo apt install partclone

3º executem comanda de backup

sudo partclone.ext4 -c -s /dev/sda5 -o /media/Miquel/backup_principal1/backup_amd1_sda5.img

4º Restauració

La partició no s’ha de dir igual — pot ser sda6, sdb1, sdc3… el nom depèn de com estigui organitzat el disc de l’altre ordinador. El que importa és que compleixi les condicions:

Condicions per a la partició de destinació (sigui la que sigui):

  1. Tamany ≥ al de la imatge (mai més petita).
  2. Format ext4 (igual que la imatge).
  3. Que no estigui muntada (o desmuntar-la abans).

Comanda de restaurauració adaptada per a l’exemple amb sda6:

sudo partclone.ext4 -r -s /media/Miquel/backup_principal/backup_amd1_sda5.img -o /dev/sda6

L’única diferència és el nom de la partició de destinació al final (/dev/sda6 en comptes de /dev/sda5). La imatge es restaura igual.

Passos recomanats a l’altre ordinador:

  1. Connecta el USB amb la imatge.
  2. Executa lsblk per veure quines particions hi ha i quina és la que vols (amb espai suficient i ext4).
  3. Assegura’t que no estigui muntada: sudo umount /dev/sda6 (si ho està).
  4. Llança la comanda amb la partició correcta.

I ja està! La imatge es restaura perfectament a qualsevol partició que compleixi els requisits. 😉

⭐⭐Imatge de disc amb ‘dd’ vs ‘partclone’


📌 Què fa la comanda dd i com s’usa per fer una imatge de disc

dd és una eina clàssica de Linux que copia dades bit a bit (a nivell brut, sense interpretar el sistema de fitxers). És ideal per fer imatges exactes d’una partició o d’un disc sencer.

Exemple que vam utilitzar:

sudo dd if=/dev/sda4 of=/media/Miquel/backup/sda4_amd0.img bs=4M status=progress

Desglossament dels paràmetres:

ParàmetreSignificat
sudoExecuta amb permisos d’administrador (imprescindible per llegir el disc).
if=Input File → l’origen. Aquí /dev/sda4 (la partició que volem copiar).
of=Output File → la destinació. /media/Miquel/backup/sda4_amd0.img (el fitxer imatge al USB).
bs=4MBlock Size → mida de cada bloc de lectura/escriptura (4 MB). Aconsegueix un bon equilibri entre velocitat i memòria.
status=progressMostra en temps real el progrés, la velocitat i el temps transcorregut.

Què fa realment?

  • Llegeix la partició /dev/sda4 bloc a bloc i ho escriu tot al fitxer .img.
  • La imatge resultant és una còpia exacta de la partició (incloent-hi espai buit, sistema de fitxers, metadades…).
  • Es pot restaurar més endavant amb la mateixa comanda però invertint els paràmetres:sudo dd if=fitxer.img of=/dev/sda4 bs=4M status=progress

Aquí tens la comanda exacta de restauració:

sudo dd if=/media/Miquel/backup/sda4_amd0.img of=/dev/sda4 bs=4M status=progress

Recorda: executa-la des d’un USB en viu, amb sda4 desmuntada i verificant amb lsblk que of=/dev/sda4 és la partició correcta. 😉


⚠️ Avís important per al blog:

  • dd no comprova si la partició està muntada → fer-ho amb una partició en ús pot donar una imatge inconsistent o corrompre dades.
  • Molt perillós: si et confons en of=, pots sobrescriure un disc sencer. Sempre comprova els discs amb lsblk abans.
  • La imatge ocupa tota la mida de la partició, no només l’espai usat (en el nostre cas, 58G).

Aquí tens un resum clar i directe per al teu blog:


📌 partclone: copiar només l’espai usat (l’alternativa intel·ligent a dd)

Què és i què fa?

partclone és una eina de clonatge que només copia els blocs en ús d’una partició, ignorant l’espai buit. Això fa que les imatges siguin molt més petites i ràpides de crear que amb dd (que ho copia tot, fins i tot el buit).

  • Imatge dd: 58G (la partició sencera).
  • Imatge partclone: ~38G (només el que s’usa realment).

Com s’usa?

sudo partclone.ext4 -c -s /dev/sda4 -o /media/Miquel/backup/imatge.img
ParàmetreSignificat
partclone.ext4La variant per al sistema de fitxers ext4 (hi ha .xfs, .ntfs, .btrfs…).
-cClone → crear una imatge.
-sSource → partició d’origen (/dev/sda4).
-oOutput → fitxer de destinació.

Opcions útils:

  • -z → comprimeix la imatge (més petita, més lenta).
  • -N → interfície gràfica (ncurses) amb progrés visual.

Restauració:

sudo partclone.ext4 -r -s imatge.img -o /dev/sda4

⚠️ Per què NO ha estat possible en aquest cas?

Quan vam intentar fer la imatge de sda4, partclone va donar aquest error:

device (/dev/sda4) is mounted at /var
error exit

El motiu: partclone es nega a treballar amb particions muntades i en ús, perquè si hi ha escriptures mentre copia, la imatge quedaria inconsistent. Com que sda4 és la partició arrel (muntada a /, /var, /ostree…), i estàvem treballant des del mateix sistema, era impossible desmuntar-la.

En canvi, dd sí que ho va permetre perquè no comprova si la partició està muntada (tot i que ho fa amb cert risc d’inconsistència).

Solució per a partclone: cal fer-ho des d’un USB en viu (live), on sda4 no està muntada. Llavors partclone funciona sense problemes i amb la imatge més petita.


Si ho vols, et preparo també la part de comparació final dd vs partclone per tancar l’article. Vols?

⭐⭐GRUB a Deepin: configurar el temps del menú d’arrencada

És clar. Et deixo una versió pensada directament per publicar al blog, amb les comandes i explicacions ordenades, incloent el problema que vam trobar amb Deepin, 11_dde.cfg, 40_custom i update-grub.

GRUB a Deepin: configurar el temps del menú d’arrencada

Quan tenim més d’un sistema operatiu o més d’una instal·lació de Deepin al mateix disc, és molt útil que GRUB mostri el menú d’arrencada durant uns segons abans de seleccionar automàticament l’opció per defecte.

En aquest cas tenia tres possibilitats principals:

  • Deepin 25 de 50 GB, instal·lat a /dev/sda6
  • Deepin 25 de 130 GB, instal·lat a /dev/sda5
  • Windows, instal·lat a /dev/sda3

La configuració de GRUB permet decidir quant temps es mostra el menú i quin sistema s’arrenca automàticament.


1. El fitxer principal de configuració

El fitxer habitual és:

/etc/default/grub

Es pot editar amb:

sudo nano /etc/default/grub

Les línies importants són:

GRUB_DEFAULT=0
GRUB_TIMEOUT=7
GRUB_TIMEOUT_STYLE=menu
GRUB_RECORDFAIL_TIMEOUT=7

Què significa cada opció?

GRUB_DEFAULT

GRUB_DEFAULT=0

Indica quina entrada del menú s’utilitza per defecte.

0 significa la primera entrada.

Per exemple, si la primera entrada és el Deepin de /dev/sda6, aquest serà el sistema que s’arrencarà automàticament si no seleccionem cap altra opció.


2. GRUB_TIMEOUT: temps normal del menú

GRUB_TIMEOUT=7

Indica quants segons espera GRUB abans d’arrencar l’opció per defecte.

Exemples:

GRUB_TIMEOUT=3

→ 3 segons


sudo nano /etc/grub.d/40_custom
sudo update-grub
per veure les linies de set timeout a grub.cng:
grep "set timeout" /boot/grub/grub.cfg

GRUB_TIMEOUT=7

→ 7 segons

GRUB_TIMEOUT=10

→ 10 segons

GRUB_TIMEOUT=0

→ no espera i arrenca immediatament

GRUB_TIMEOUT=-1

→ espera indefinidament fins que l’usuari esculli una opció

Per tenir temps de triar entre diferents sistemes, un valor de 7 o 10 segons sol ser còmode.


3. GRUB_TIMEOUT_STYLE: fer visible el menú

Perquè el menú aparegui directament:

GRUB_TIMEOUT_STYLE=menu

Això és especialment important quan tenim diversos sistemes operatius.

Amb:

GRUB_TIMEOUT_STYLE=menu

GRUB mostra el menú i comença el compte enrere.


4. El temps especial GRUB_RECORDFAIL_TIMEOUT

Hi ha un altre temps que pot intervenir:

GRUB_RECORDFAIL_TIMEOUT=7

Aquest valor s’utilitza quan GRUB detecta que l’arrencada anterior havia quedat marcada com a fallida.

Per exemple:

GRUB_TIMEOUT=7
GRUB_RECORDFAIL_TIMEOUT=8

pot generar al grub.cfg:

if [ "${recordfail}" = 1 ] ; then
    set timeout=8
else
    set timeout=7
fi

Això significa:

arrencada normal       → 7 segons
arrencada amb recordfail → 8 segons

Si volem que el comportament sigui uniforme:

GRUB_TIMEOUT=7
GRUB_RECORDFAIL_TIMEOUT=7

5. Un problema particular de Deepin

En una instal·lació normal de GRUB, sovint n’hi ha prou amb modificar:

/etc/default/grub

Però Deepin pot tenir configuracions addicionals dins:

/etc/default/grub.d/

En el meu cas vaig trobar:

/etc/default/grub.d/11_dde.cfg

El seu contingut era:

# Written by org.deepin.dde.Grub2
DEEPIN_GFXMODE_ADJUSTED=1
DEEPIN_GFXMODE_DETECT=
GRUB_BACKGROUND="/boot/grub/themes/deepin/background.jpg"
GRUB_DEFAULT=0
GRUB_GFXMODE=1920x1080
GRUB_THEME="/boot/grub/themes/deepin/theme.txt"
GRUB_TIMEOUT=1

Aquí estava el problema.

Al fitxer principal tenia:

GRUB_TIMEOUT=7

però Deepin tenia:

GRUB_TIMEOUT=1

Per tant, hi havia dues configuracions diferents.

Per comprovar-ho:

sudo cat /etc/default/grub

i:

sudo cat /etc/default/grub.d/11_dde.cfg

Si Deepin ha posat un altre valor a 11_dde.cfg, aquest fitxer s’ha de tenir en compte.

En el meu cas vaig canviar:

GRUB_TIMEOUT=1

per:

GRUB_TIMEOUT=7

El fitxer va quedar:

# Written by org.deepin.dde.Grub2
DEEPIN_GFXMODE_ADJUSTED=1
DEEPIN_GFXMODE_DETECT=
GRUB_BACKGROUND="/boot/grub/themes/deepin/background.jpg"
GRUB_DEFAULT=0
GRUB_GFXMODE=1920x1080
GRUB_THEME="/boot/grub/themes/deepin/theme.txt"
GRUB_TIMEOUT=7

6. Fer una còpia de seguretat abans de modificar 11_dde.cfg

És recomanable guardar una còpia:

sudo cp /etc/default/grub.d/11_dde.cfg \
/etc/default/grub.d/11_dde.cfg.backup

Així sempre podem tornar enrere.

Per restaurar-la:

sudo cp /etc/default/grub.d/11_dde.cfg.backup \
/etc/default/grub.d/11_dde.cfg

7. Com comprovar d’on surt un GRUB_TIMEOUT

Si no sabem quin fitxer està modificant el temps, podem buscar-ho:

sudo grep -RniE 'timeout|GRUB_TIMEOUT' \
/etc/grub.d /etc/default/grub.d 2>/dev/null

Això permet descobrir configuracions ocultes o addicionals.

En el meu cas va trobar:

/etc/grub.d/00_header
/etc/grub.d/30_os-prober
/etc/grub.d/40_custom
/etc/default/grub.d/11_dde.cfg

8. Compte amb /etc/grub.d/40_custom

També vaig trobar:

/etc/grub.d/40_custom

que contenia:

set timeout=3

El fitxer era:

#!/bin/sh
exec tail -n +3 $0
# This file provides an easy way to add custom menu entries.
# ...
set timeout=3

Aquesta línia no era necessària i podia provocar confusió.

La vaig eliminar:

sudo sed -i '/^set timeout=3$/d' /etc/grub.d/40_custom

Després 40_custom va quedar sense cap ordre set timeout.

És millor no utilitzar 40_custom per controlar el temps general de GRUB. Aquest fitxer està pensat principalment per afegir entrades personalitzades al menú.


9. grub.cfg és el fitxer que GRUB acaba utilitzant

Un error habitual és modificar directament:

/boot/grub/grub.cfg

No és recomanable.

Aquest fitxer es genera a partir de les configuracions anteriors.

El procediment correcte és:

/etc/default/grub
        +
/etc/default/grub.d/
        +
/etc/grub.d/
        ↓
sudo update-grub
        ↓
/boot/grub/grub.cfg

Per tant, després de modificar la configuració cal executar:

sudo update-grub

10. Com comprovar el timeout real generat

Després de:

sudo update-grub

podem comprovar què ha generat GRUB:

sudo grep -n -B4 -A4 \
-E 'set timeout=8|set timeout=7|set timeout=3' \
/boot/grub/grub.cfg

També podem fer una comprovació més senzilla:

sudo grep -E 'set timeout=|set timeout_style=' \
/boot/grub/grub.cfg

Per exemple, una configuració normal de 7 segons pot mostrar:

set timeout_style=menu
set timeout=7

11. Un detall important: timeout=8 no sempre és un error

Si trobem:

if [ "${recordfail}" = 1 ] ; then
    set timeout=8
else
    set timeout=7
fi

no significa necessàriament que la configuració estigui malament.

Simplement significa que:

recordfail=1 → 8 segons
recordfail=0 → 7 segons

En el meu cas, inicialment tenia:

GRUB_RECORDFAIL_TIMEOUT=8

i per això GRUB generava el 8.

Si volem sempre 7 segons:

GRUB_RECORDFAIL_TIMEOUT=7

12. Configuració final recomanada

Per al meu cas, amb dos Deepin i Windows, una configuració clara és:

/etc/default/grub

GRUB_DEFAULT=0
GRUB_TIMEOUT=7
GRUB_TIMEOUT_STYLE=menu
GRUB_RECORDFAIL_TIMEOUT=7

/etc/default/grub.d/11_dde.cfg

Mantenir les configuracions gràfiques de Deepin i:

GRUB_DEFAULT=0
GRUB_TIMEOUT=7

Per exemple:

# Written by org.deepin.dde.Grub2
DEEPIN_GFXMODE_ADJUSTED=1
DEEPIN_GFXMODE_DETECT=
GRUB_BACKGROUND="/boot/grub/themes/deepin/background.jpg"
GRUB_DEFAULT=0
GRUB_GFXMODE=1920x1080
GRUB_THEME="/boot/grub/themes/deepin/theme.txt"
GRUB_TIMEOUT=7

/etc/grub.d/40_custom

No posar-hi:

set timeout=...

si no tenim un motiu específic per fer-ho.


13. Procediment ràpid per canviar el temps

Si volem canviar el temps a 10 segons, per exemple:

sudo nano /etc/default/grub

Canviar:

GRUB_TIMEOUT=7

per:

GRUB_TIMEOUT=10

I, si existeix el mateix paràmetre a Deepin:

sudo nano /etc/default/grub.d/11_dde.cfg

posar també:

GRUB_TIMEOUT=10

Finalment:

sudo update-grub

I comprovar:

sudo grep -E 'set timeout=|set timeout_style=' \
/boot/grub/grub.cfg

14. Resum de la meva incidència

El problema que tenia era una combinació de configuracions.

Jo havia posat:

/etc/default/grub

GRUB_TIMEOUT=7

però Deepin tenia:

/etc/default/grub.d/11_dde.cfg

GRUB_TIMEOUT=1

A més, havia quedat una ordre:

/etc/grub.d/40_custom

set timeout=3

I també existia:

GRUB_RECORDFAIL_TIMEOUT=8

que explicava el set timeout=8 que apareixia al grub.cfg quan GRUB detectava recordfail.

La solució va ser:

  1. Posar GRUB_TIMEOUT=7 també a 11_dde.cfg.
  2. Eliminar el set timeout=3 de 40_custom.
  3. Posar GRUB_RECORDFAIL_TIMEOUT=7.
  4. Executar sudo update-grub.
  5. Comprovar el resultat a /boot/grub/grub.cfg.

El resultat és una configuració coherent amb:

MENÚ GRUB VISIBLE
       ↓
7 segons
       ↓
┌───────────────────────────────┐
│ Deepin 25 Community  (sda6)  │ ← per defecte
│ Deepin 25          (sda5)    │
│ Windows             (sda3)   │
└───────────────────────────────┘

Això permet tenir diversos sistemes instal·lats i escollir fàcilment quin volem arrencar.

Si vols, també et puc preparar una segona versió molt més curta, tipus “xuleta de butxaca”, amb només les comandes imprescindibles per tenir-la al costat del PC.

⭐Temps del menú GRUB a Deepin


🧾 XULETA — Temps del menú GRUB a Deepin

1️⃣ Obre el fitxer de configuració

sudo nano /etc/default/grub

GRUB a /etc/default/grub

Miquel@Miquel-PC:~$ sudo cat /etc/default/grub
# Generated by deepin-installer
GRUB_BACKGROUND="/boot/grub/themes/deepin/background.jpg"
GRUB_DEFAULT=0

GRUB_TIMEOUT=6 <- aquí tries el temps que vols visualitzar el menú
GRUB_TIMEOUT_STYLE=menu
#treu "splash" (així desapareix el cercle blau)
GRUB_CMDLINE_LINUX_DEFAULT="quiet"

GRUB_DISTRIBUTOR="`/usr/bin/lsb_release -d -s 2>/dev/null`"
GRUB_THEME="/boot/grub/themes/deepin/theme.txt"
DEEPIN_GFXMODE_DETECT=1


GRUB_TIMEOUT=15
GRUB_TIMEOUT_STYLE=menu


2️⃣ Modifica aquestes 3 línies

Per a 6 segons:

GRUB_TIMEOUT=6
GRUB_TIMEOUT_STYLE=menu
GRUB_CMDLINE_LINUX_DEFAULT="quiet"
ParàmetreQuè faExemple a 6s
GRUB_TIMEOUTEl temps que el menú espera6
GRUB_TIMEOUT_STYLE=menuForça que el menú es mostri (no amagat)menu
GRUB_CMDLINE_LINUX_DEFAULTTreu splash (el cercle blau de Plymouth) perquè el menú sigui visible"quiet"

⚠️ Si veus GRUB_TIMEOUT_STYLE=hidden o la paraula splash, canvia-les com a dalt. Si no hi ha cap GRUB_TIMEOUT_STYLE, afegeix-la.

3️⃣ Desa els canvis

  • A nano: Ctrl + O → Enter (desa) → Ctrl + X (surt)

4️⃣ Regenera la configuració (EL PAS CLAU! 🧠)

sudo update-grub

Sense aquest pas, els canvis no s’apliquen. Cal fer-ho sempre.

5️⃣ Reinicia i comprova

sudo reboot

💡 Altres valors ràpids

  • 3 segons: GRUB_TIMEOUT=3
  • 10 segons: GRUB_TIMEOUT=10
  • Espera infinita (que no marxi sol): GRUB_TIMEOUT=-1
  • Sense espera (menú instantani): GRUB_TIMEOUT=0

🔁 Si tornes a tenir la pantalla blava o el menú no apareix:

  1. Verifica que has tret splash de GRUB_CMDLINE_LINUX_DEFAULT.
  2. Torna a executar sudo update-grub.
  3. Reinicia.

Si et cal canviar-ho a un altre temps o tens dubtes amb la teva configuració concreta, digues-m’ho! 😊


iquel@Miquel-PC:~$ sudo grep "set timeout" /boot/grub/grub.cfg
Contraseña:
Verificación exitosa
  set timeout=3
    set timeout_style=menu
    set timeout=1
    set timeout=1
set timeout=3
Miquel@Miquel-PC:~$ 

Linux vs Deepin

Correcte, ho has entès perfectament. 🎯

Aquí tens la distinció tècnica:

  • Linux és només el nucli (kernel) del sistema: la part que gestiona el maquinari, la memòria, els processos, els drivers, etc. No és, per si sol, un sistema operatiu complet, perquè no inclou eines d’usuari, interfície gràfica, aplicacions de base, etc.
  • Deepin és un sistema operatiu complet (una distribució GNU/Linux) que utilitza el nucli Linux com a base, però hi afegeix tota la resta:
    • Les eines GNU (ordre bàsiques, gestió de fitxers…)
    • L’entorn d’escriptori DDE (Deepin Desktop Environment) amb tota la interfície gràfica
    • Aplicacions pròpies (Deepin Mail, Deepin Music, gestor de fitxers, centre de control…)
    • Gestor de paquets, instal·lador, configuració del sistema…

Per tant, la relació és:

Linux (nucli)  +  GNU + DDE + aplicacions  =  Deepin (SO complet)

Exemples per aclarir-ho

  • Quan diem «Android es basa en Linux», volem dir que Android utilitza el nucli Linux com a base, però Android com a tal és un sistema operatiu diferent de Deepin.
  • Ubuntu, Fedora, Arch o Debian també són sistemes operatius (distribucions) que comparteixen el mateix nucli Linux.

Frase exacta per resumir-ho

«Linux és el motor (nucli); Deepin és el cotxe complet (sistema operatiu) que fa servir aquest motor.»

Així que sí: Deepin és un sistema operatiu, i Linux és el nucli sobre el qual Deepin i moltes altres distribucions estan construïdes.


No. Apple no es basa en Linux. Aquesta és una confusió molt habitual. 👇

Què utilitza Apple realment?

  • macOS (ordinadors Mac) i iOS (iPhone/iPad) es basen en el nucli Darwin, que prové d’una combinació de:
    • Mach (un nucli microkernel desenvolupat a la universitat de Carnegie Mellon)
    • BSD (Berkeley Software Distribution), un altre sistema Unix
  • Per tant, Apple és un sistema Unix, però no derivat de Linux. Són dues famílies diferents que comparteixen estàndards semblants.

Famílies de sistemes operatius (resum)

FamíliaExemplesNucli
GNU/LinuxDeepin, Ubuntu, Debian, Fedora, AndroidLinux
BSD / UnixmacOS, iOS, FreeBSDDarwin (Mach + BSD)
WindowsWindows 11NT
Propi (propietari)Haiku, etc.El seu propi

Punt clau

  • Linux i BSD/Unix comparteixen filosofia i moltes eines (totes dues són «sistemes semblants a Unix»), però el nucli és diferent i els programes no són 100% intercanviables.
  • Apple sí que utilitza codi obert en alguns components (com WebKit del navegador Safari, o parts de BSD), però el nucli del sistema no és Linux.

Frase per recordar-ho

«Linux i macOS són cosins (tots dos d’estil Unix), però no germans: un usa el nucli Linux i l’altre el nucli Darwin (Mach + BSD).»

En resum: Apple = Darwin (Mach + BSD), Deepin/Ubuntu/etc. = Linux. Són dues famílies diferents. 😊

On es guarden els correus de Deepin Mail?

Aquí tens tota la informació resumida en un únic post, llest per copiar i enganyar al teu blog:


📧 On es guarden els correus de Deepin Mail? Guia completa

Deepin Mail és el client de correu d’escriptori del sistema operatiu Deepin. Una de les preguntes més freqüents és: on es desen els correus i què passa si em quedo sense internet? Aquí t’ho explico tot.

📁 Ubicació de les dades

Els correus descarregats es guarden dins del directori personal de l’usuari:

~/.local/share/deepin/deepin-mail/

Dins d’aquesta carpeta hi trobarem:

~/.local/share/deepin/deepin-mail/
├── mail/                    ← contingut real dels missatges
│   ├── <compte_gmail>/      ← una subcarpeta per cada compte
│   │   ├── INBOX/
│   │   ├── Sent/
│   │   ├── Drafts/
│   │   └── ...
│   └── ...
├── config/                  ← configuració dels comptes
└── cache/                   ← dades auxiliars
  • El cos dels missatges i els adjunts es desen com a fitxers .eml (format estàndard de correu) dins de mail/, organitzats per compte i per carpeta.
  • Els logs (registres d’activitat) van a un altre lloc: ~/.cache/deepin/deepin-mail/deepin-mail.log.

⚠️ Important: el fitxer de log no conté el contingut dels correus. És només un fitxer de text petit amb errors i esdeveniments (ocuparà kilobytes, mai gigabytes).

💾 En quina partició es desa?

Com que tot es troba dins del directori personal (~ = /home/usuari), es desa a la partició on estigui muntat el directori /home:

  • Si tens una partició /home separada → es guarda en aquella partició.
  • Si no tens partició /home separada → es guarda a la partició arrel / (la partició on està instal·lat Deepin).

Per comprovar-ho fàcilment:

df -h ~/.local/share/deepin/deepin-mail/

🌐 Puc llegir el correu sense internet?

Sí, en general. Si els correus ja s’han descarregat abans, queden emmagatzemats localment al disc, de manera que pots llegir-los sense connexió.

✅ Què pots fer sense internet:

  • Llegir tots els correus ja descarregats (text i adjunts).

❌ Què NO pots fer sense internet:

  • Rebre correus nous (fins que et tornis a connectar).
  • Enviar correus (quedaran a la safata de sortida i s’enviaran en reconnectar).
  • Veure correus que mai s’han descarregat prèviament.

💡 Consell: si el client només està configurat per mostrar capçaleres i descarregar el contingut sota demanda, sense internet veuràs la llista de missatges però no el cos complet. Amb la descàrrega completa (com en el cas de 7 GB locals), els podràs llegir sencer.

🔍 Comandes útils per inspeccionar-ho

# Quant ocupa el correu real
du -sh ~/.local/share/deepin/deepin-mail/

# Quant ocupen els logs i la caché
du -sh ~/.cache/deepin/deepin-mail/

# Veure l'estructura de carpetes
find ~/.local/share/deepin/deepin-mail/ -maxdepth 2 -type d

# En quina partició es troba
df -h ~/.local/share/deepin/deepin-mail/

🧾 Resum

QuèOn es desa
Contingut dels correus (.eml)~/.local/share/deepin/deepin-mail/mail/
Configuració dels comptes~/.local/share/deepin/deepin-mail/config/
Logs / registres~/.cache/deepin/deepin-mail/
ParticcióOn està muntat /home (o / si no hi ha partició separada)

Idea clau: la teva còpia local de correu és independent d’Internet un cop descarregada. El correu viu al teu disc, no només al núvol.


Espero que et sigui útil per al blog! Si vols, puc adaptar-lo a un altre format (més curt, més tècnic, amb imatges de lloc, etc.). 📝

Formatar Disk Deepin

Sí. Si ho has esborrat tot i comencem de zero, ho podem fer net i ordenat. 👍

Per a un ordinador amb arrencada UEFI, jo faria dues particions petites d’arrencada i després la del sistema:

Estructura que et recomano

ParticióMidaFormatPunt de muntatge
1512 MBFAT32/boot/efi
21 GBext4/boot
3resta del discext4/

No necessitem una partició /home separada.

Ara, a la pantalla que tens

Per crear la primera:

  1. Selecciona l’espai lliure.
  2. Prem crear partició.
  3. Mida: 512 MB.
  4. Sistema de fitxers: ext4 no → selecciona FAT32.
  5. Punt de muntatge: /boot/efi.
  6. Formatar: sí, perquè estem començant de zero.
  7. Confirma.

Després crearem:

1 GB   ext4   /boot

I finalment:

resta   ext4   /

⚠️ Important

A la captura anterior veia que l’instal·lador et mostrava «Cree una partición /boot/». Per això vull que creem també /boot, no només /boot/efi.

No premis encara «Siguiente». Crea primer la partició de 512 MB FAT32 /boot/efi i, quan la tinguis creada, fes-me una foto de la pantalla. Et dic el següent pas abans de continuar.

Flux d’arrancada quan es Deepin

Sí, la teva interpretació és gairebé perfecta. Et detallo el flux complet perquè sàpigues exactament on apunta cada cosa:

Flux d’arrancada quan tries Deepin

1. BIOS/UEFI → Boot Menu (F12/F8/Esc)
   └─ Veus dues entrades UEFI:
      • Windows Boot Manager
      • deepin (o similar)

2. Tries "deepin" → UEFI carrega el carregador EFI
   └─ Des de sda1 (FAT32 "SYSTEM"):
      \EFI\deepin\grubx64.efi   ← aquí viu GRUB

3. GRUB s'executa i mostra el seu menú (o arrenca directe)
   └─ GRUB busca el kernel a:
      sda5:/boot/vmlinuz-xxx
      sda5:/boot/initrd.img-xxx
      (com que no tens /boot separat, està dins l'arrel)

4. GRUB carrega el kernel + initramfs
   └─ Li diu: "la partició arrel és la que té UUID
       121cc95c-280d-40e4-9f4c-af6bbd862f8d" (és sda5, "Roota")

5. Initramfs monta sda5 a /sysroot, ostree fa pivot-root
   └─ Arrenca el deployment ostree actiu
   └─ Es munten /ostree, /persistent, /var, /home, etc.

On viu cada cosa

ComponentParticióRuta
UEFI firmwarexip de la placa
Bootloaders EFI (Windows + GRUB)sda1 (FAT32 «SYSTEM»)/boot/efi/EFI/Microsoft/… i /boot/efi/EFI/deepin/…
Kernel + initramfssda5/boot/ (dins l’arrel ext4)
GRUB configsda5/boot/grub/grub.cfg
Sistema base (només lectura)sda5/usr, /bin, /lib (via ostree)
Dades persistentssda5/home, /var, /persistent

Punts importants que sovint es confonen

1. sda1 és COMPARTIDA. És la partició EFI estàndard que va crear Windows quan es va instal·lar. Deepin hi va afegir el seu propi carregador (\EFI\deepin\grubx64.efi) sense tocar el de Windows. Per això al Boot Menu de la BIOS veus dues entrades i no cal que GRUB gestioni Windows.

2. GRUB utilitza UUID, no noms de dispositiu. Si mires /boot/grub/grub.cfg veuràs que apunta a:

linux /boot/vmlinuz-... root=UUID=121cc95c-280d-40e4-9f4c-af6bbd862f8d

Això vol dir que GRUB busca la partició amb aquest UUID concret, que és sda5 («Roota»). Tant és si Linux la veu com sda5, sdb5 o el que sigui: l’UUID és estable.

3. Hi ha DOS nivells de menú.

  • Nivell 1 (UEFI): tria entre «Windows Boot Manager» i «deepin». Aquí decideixes quin bootloader carregar.
  • Nivell 2 (GRUB): un cop carregat GRUB, pot mostrar-te entrades addicionals:
    • El Deepin normal
    • Desplegaments ostree anteriors (snapshot de rollback — molt útil!)
    • Kernels antics
    • Memtest, etc.
    Per veure els desplegaments ostree disponibles: sudo ostree admin status

Comandaments per verificar-ho tu mateix

# Veure les entrades d'arrancada UEFI registrades
sudo efibootmgr -v

# Veure el contingut de la partició EFI
ls -la /boot/efi/EFI/

# Veure la configuració de GRUB (on apunta realment)
grep -i "root=" /boot/grub/grub.cfg | head -5

# Veure els deployments ostree (snapshots del sistema)
sudo ostree admin status

Resum del que et passa al Boot Menu

Boot Menu UEFI (F12)
 ├─ Windows Boot Manager → \EFI\Microsoft\...\bootmgfw.efi (sda1) → arrenca Windows (sda3)
 └─ deepin             → \EFI\deepin\grubx64.efi          (sda1) → GRUB → sda5 (Roota)

Per tant: sí, quan tries Deepin, primer va a sda1 (només a llegir el GRUB), després GRUB carrega el kernel que apunta a sda5 mitjançant el seu UUID, i finalment arrenca el sistema des de «Roota». Tot el Deepin viu dins sda5; sda1 només conté la porta d’entrada EFI.


FORÇAR TEPMS

1. Fem una còpia de seguretat per si de cas

sudo cp /boot/grub/grub.cfg /boot/grub/grub.cfg_backup

2. Forcem l’entrada 9 (la nostra manual de sda6) com a predeterminada

sudo sed -i ‘s/set default=»0″/set default=»9″/’ /boot/grub/grub.cfg

3. Forcem el temps d’espera del menú a 15 segons (canvia tots els «1» per «15»)

sudo sed -i ‘s/set timeout=1/set timeout=15/g’ /boot/grub/grub.cfg

4. Eliminem «splash quiet» de l’arrencada per veure el text real (Prova de la veritat)

sudo sed -i 's/set timeout=1/set timeout=15/g' /boot/grub/grub.cfg
sudo sed -i 's/splash quiet//g' /boot/grub/grub.cfg