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)?


DNI de la partició (UUID)

Exacte, tens tota la raó. partclone fa una còpia bit a bit de la partició, així que inclou TOT: sistema operatiu, programes, configuracions, i sí, tots els identificadors únics.

Anem a desglossar els dos «DNI» clau que has mencionat:

1. DNI de la partició (UUID)

On es guarda:

  • Al superblock d’ext4: Cada partició ext4 té un UUID únic incrustat al seu superblock (a l’inici de la partició).
  • A /etc/fstab: El sistema operatiu fa servir aquest UUID per saber quina partició muntar a l’arrel (/).
  • A la taula de particions GPT/MBR: El disc sencer també té un identificador.

Problema en clonar: Si copies aquesta partició a un altre disc i l’arrencs, tindràs dues particions amb el mateix UUID (f6959e2a-75c7-4d61-8d31-a0b8ea007a9b). Això pot causar conflictes si els dos discos estan connectats alhora.

2. DNI de l’ordinador (machine-id, hostname)

On es guarda:

  • /etc/machine-id: Identificador únic del sistema (32 caràcters hexadecimals).
  • /etc/hostname: El nom de l’ordinador a la xarxa.
  • Possiblement a /etc/hosts: Mapeig del hostname.
  • Configuracions de xarxa: Si tens configuracions estàtiques, poden incloure el hostname.
  • Logs i bases de dades: Alguns serveis (com systemd-journal) fan servir el machine-id.

Problema en clonar: Si tens dos ordinadors amb el mateix machine-id a la mateixa xarxa, pot haver-hi conflictes amb serveis com DHCP, logs centralitzats, o aplicacions que fan servir aquest ID per a llicències.


Com trobar-los un cop acabi el backup

Quan acabi el procés de partclone, podem muntar la imatge en mode només lectura i buscar exactament on són aquests identificadors:

# Crear un punt de muntatge
sudo mkdir -p /mnt/backup_roota

# Muntar la imatge (partclone.ext4 crea imatges que es poden muntar directament)
sudo mount -o ro,loop /media/Miquel/backup_principal/backup_sda4_roota.img /mnt/backup_roota

# Veure el machine-id
cat /mnt/backup_roota/etc/machine-id

# Veure el hostname
cat /mnt/backup_roota/etc/hostname

# Veure el fstab (on es referencia l'UUID)
cat /mnt/backup_roota/etc/fstab

# Desmuntar quan acabem
sudo umount /mnt/backup_roota

Per veure l’UUID de la partició (el que està al superblock), podem fer servir blkid directament sobre la imatge o sobre el fitxer muntat:

sudo blkid /media/Miquel/backup_principal/backup_sda4_roota.img

O si la imatge està muntada:

lsblk -f /dev/loopX  # on loopX és el dispositiu que s'ha creat en muntar

Resum: Sí, la imatge inclou tots dos «DNI». Quan acabi el backup, els podrem trobar fàcilment muntant la imatge. Si algun dia vols clonar aquesta partició a un altre lloc, haurem de canviar l’UUID (amb tune2fs -U) i possiblement el machine-id (es pot regenerar amb systemd-machine-id-setup o simplement esborrant el fitxer i deixant que es regeneri al proper arrenc).

Mentre s’acaba el backup, puc anar preparant els comandaments per extreure aquesta informació. Digues-me quan acabi!


Exacte, tens tota la raó. partclone fa una còpia bit a bit de la partició, així que inclou TOT: sistema operatiu, programes, configuracions, i sí, tots els identificadors únics.

Anem a desglossar els dos «DNI» clau que has mencionat:

1. DNI de la partició (UUID)

On es guarda:

  • Al superblock d’ext4: Cada partició ext4 té un UUID únic incrustat al seu superblock (a l’inici de la partició).
  • A /etc/fstab: El sistema operatiu fa servir aquest UUID per saber quina partició muntar a l’arrel (/).
  • A la taula de particions GPT/MBR: El disc sencer també té un identificador.

Problema en clonar: Si copies aquesta partició a un altre disc i l’arrencs, tindràs dues particions amb el mateix UUID (f6959e2a-75c7-4d61-8d31-a0b8ea007a9b). Això pot causar conflictes si els dos discos estan connectats alhora.

2. DNI de l’ordinador (machine-id, hostname)

On es guarda:

  • /etc/machine-id: Identificador únic del sistema (32 caràcters hexadecimals).
  • /etc/hostname: El nom de l’ordinador a la xarxa.
  • Possiblement a /etc/hosts: Mapeig del hostname.
  • Configuracions de xarxa: Si tens configuracions estàtiques, poden incloure el hostname.
  • Logs i bases de dades: Alguns serveis (com systemd-journal) fan servir el machine-id.

Problema en clonar: Si tens dos ordinadors amb el mateix machine-id a la mateixa xarxa, pot haver-hi conflictes amb serveis com DHCP, logs centralitzats, o aplicacions que fan servir aquest ID per a llicències.


Com trobar-los un cop acabi el backup

Quan acabi el procés de partclone, podem muntar la imatge en mode només lectura i buscar exactament on són aquests identificadors:

# Crear un punt de muntatge
sudo mkdir -p /mnt/backup_roota

# Muntar la imatge (partclone.ext4 crea imatges que es poden muntar directament)
sudo mount -o ro,loop /media/Miquel/backup_principal/backup_sda4_roota.img /mnt/backup_roota

# Veure el machine-id
cat /mnt/backup_roota/etc/machine-id

# Veure el hostname
cat /mnt/backup_roota/etc/hostname

# Veure el fstab (on es referencia l'UUID)
cat /mnt/backup_roota/etc/fstab

# Desmuntar quan acabem
sudo umount /mnt/backup_roota

Per veure l’UUID de la partició (el que està al superblock), podem fer servir blkid directament sobre la imatge o sobre el fitxer muntat:

sudo blkid /media/Miquel/backup_principal/backup_sda4_roota.img

O si la imatge està muntada:

lsblk -f /dev/loopX  # on loopX és el dispositiu que s'ha creat en muntar

Resum: Sí, la imatge inclou tots dos «DNI». Quan acabi el backup, els podrem trobar fàcilment muntant la imatge. Si algun dia vols clonar aquesta partició a un altre lloc, haurem de canviar l’UUID (amb tune2fs -U) i possiblement el machine-id (es pot regenerar amb systemd-machine-id-setup o simplement esborrant el fitxer i deixant que es regeneri al proper arrenc).

Mentre s’acaba el backup, puc anar preparant els comandaments per extreure aquesta informació. Digues-me quan acabi!


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.

⭐Flux de l’arrancada de deepin

1. Firmware UEFI (el «BIOS» modern)

Quan encens l’ordinador, el primer que s’executa és el firmware (UEFI) de la placa base. Llegeix les entrades d’arrencada que té guardades a la NVRAM i tria la primera de la llista (BootOrder). Al teu cas:

BootOrder: 0002,0000
Boot0002* deepin → \EFI\DEEPIN\SHIMX64.EFI

Per tant arrenca l’entrada deepin, que apunta a un fitxer de la partició EFI (/dev/sda1, la partició petita FAT32). El «Timeout: 2 seconds» que sortia a efibootmgr és el menú propi del firmware (si prems F12/F11 per triar sistema), no el de GRUB.

2. shimx64.efi → grubx64.efi (el carregador GRUB)

A la partició EFI hi ha dos executables encadenats:

  • shimx64.efi → el que carrega la UEFI. És un petit «pont» amb la firma de Microsoft per poder passar el Secure Boot.
  • grubx64.efi → el GRUB de debò. El shim el verifica i el llança.

Ara el control ja és de GRUB, un mini-sistema operatiu que sap llegir sistemes de fitxers (ext4, fat, etc.) i interpretar scripts.

3. GRUB busca i llegeix la configuració (grub.cfg)

GRUB necessita saber què ha de fer. Busca el seu script en dos passos:

a) El «stub» de la partició EFI (/efi/EFI/deepin/grub.cfg) — el que hem vist:

search.fs_uuid 913ddb59-... root hd0,gpt6
set prefix=($root)'/boot/grub'
configfile $prefix/grub.cfg

És a dir: «troba el disc/partició amb aquest UUID (el gpt6, el teu Deepin 25 Community) i carrega la configuració real que hi ha allà».

b) La configuració real (/boot/grub/grub.cfg del gpt6) — el fitxer generat que hem estat tocant. Aquest script és llarg i fa de tot:

  • Carrega mòduls (insmod), la font i el tema deepin
  • Defineix el timeout → ara 15 segons gràcies al teu set timeout=15 de 40_custom (l’últim que s’executa, el que mana)
  • Defineix els menuentries (les opcions del menú):
    • Deepin 25 Community (la teva)
    • Rollback…
    • Windows Boot Manager (sda1)
    • Deepin 25 (25) (sda5, sda6) — via os-prober
    • System Setup (entrada UEFI)

4. GRUB mostra el menú

Amb tot carregat, GRUB pinta el menú amb el tema gràfic de deepin i comença el compte enrere de 15 segons. Si no toques res, tria l’opció per defecte (GRUB_DEFAULT=0 → «Deepin 25 Community»). Si prems una tecla, el compte enrere es para i pots triar tu.

5. GRUB carrega el kernel

Quan es tria una opció, GRUB executa el contingut del menuentry:

linux /boot/vmlinuz-6.6.143-... root=UUID=913ddb59-... ostree=auto quiet ...
initrd /boot/initrd.img-6.6.143-...
  • linux ... → carrega el nucli (kernel) amb els paràmetres que li passa (quina partició és la root, etc.)
  • initrd ... → carrega el «initramfs», un mini-sistema temporal en memòria que ajuda el kernel a muntar el sistema real

6. El kernel arrenca (aquí era on hi havia el cercle blau)

El kernel s’inicia i, gràcies a l’initramfs, munta el sistema real. Aquí és on apareixia Plymouth, el cercle blau difús: és una animació que tapa els missatges d’arrencada perquè la pantalla quedi «bonica». S’activava pel paràmetre splash que vam eliminar → ara, en lloc del cercle, veuràs els missatges d’arrencada en text.

(Nota: el sistema és OSTree/immutable, per això el paràmetre és ostree=auto: el kernel sap que ha de muntar el desplegament immutable que li toca.)

7. Sessió gràfica

Quan el sistema està muntat, s’inicia el display manager (la pantalla d’inici de sessió de deepin) i, després d’identificar-te, el DDE (Deepin Desktop Environment) amb el teu escriptori.


Resum de qui fa què en el teu cas

PasQuiQuè faOn és
1UEFItria entrada i executaNVRAM / sda1
2shim → grubx64.eficarrega GRUB/dev/sda1/EFI/deepin/
3astub grub.cfgtroba gpt6 i crida la config real/efi/EFI/deepin/grub.cfg
3bgrub.cfg realcarrega tema, timeout, entrades/boot/grub/grub.cfg (gpt6)
4GRUBmostra el menú (ara 15 s)
5GRUBcarrega kernel + initrd/boot/
6kernelarrenca sistema (sense splash)
7DDEpantalla de login i escriptori

I recorda la cadena de generació (on hem fet els canvis):

/etc/default/grub  +  /etc/grub.d/* (00_header, 40_custom...)
        │
        └── sudo update-grub (grub-mkconfig)
                │
                └── genera → /boot/grub/grub.cfg
                                 │
                                 └── és el que llegeix GRUB a cada arrencada

Tot encaixa: el teu set timeout=15 (via 40_custom) és el que fa que el menú es quedi 15 segons, i treure el splash és el que elimina el cercle blau. 👍

⭐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:~$ 

Backup d’apps

tinc el Deepin amb la instalació bàsica quin directoris de la imatge adjunta serien necesaris per carregar apps d’usuar d’un altre deepin sense afectar al deepin base?

Referencia 10 fuentes

Deep think completado (tardó 6s)

Segons l’estructura de la imatge adjunta (sembla un backup complet del sistema Deepin), per carregar apps d’usuari d’un altre Deepin sense afectar el Deepin base, els directoris clau són:


📁 Directoris necessaris

1. opt → Imprescindible

Aquí s’instal·len els programes de tercers (deb, run, etc.), com ara Chrome, WPS, QQ, etc.

plaintext

1/opt/apps/com.tencent.qq

2/opt/apps/com.wps.office

3

  • ✅ No afecta el sistema base
  • ✅ Conté la majoria d’aplicacions d’usuari

2. home → Molt recomanable

Conté les dades personals i les configuracions d’aplicacions de cada usuari:

plaintext

1/home/usuari/.local/share/applications → Accessos directes

2/home/usuari/.config/ → Configuracions d’apps

3/home/usuari/.local/bin/ → Scripts i binaris d’usuari

4

  • ✅ Configuracions i dades d’aplicacions

3. var → Parcialment (només var/lib/linglong)

Si l’altre Deepin té apps en format Linglong, es troben a:

plaintext

1/var/lib/linglong/layers/main/

2

  • ⚠️ Només interessa aquesta subcarpeta, no tot /var

4. usr → ❌ NO (només puntualment)

  • /usr/bin/usr/lib/usr/share → Afecten el sistema base
  • Millor no tocar-lo per evitar trencar el Deepin base

📋 Resum: Què copiar?

DirectoriNecessari?Per què?
opt✅ Apps d’usuari (deb, run)
home✅ Dades, configs, accessos directes
var (linglong)⚠️ Només si tens apps LinglongApps en format contenidor
usr❌ NoAfecta el sistema base
etc❌ NoConfiguració del sistema
binlibsbin❌ NoParts del sistema base

🔧 Com fer-ho (idea general)

bash

1# Copiar apps de tercers

2sudo cp -a /origen/opt/* /destí/opt/

3

4# Copiar dades d’usuari (canviant el nom d’usuari si cal)

5sudo cp -a /origen/home/usuari /destí/home/usuari

6

7# Si hi ha apps Linglong

8sudo cp -a /origen/var/lib/linglong /destí/var/lib/linglong

9

Nota: Després de copiar, potser caldrà actualitzar els accessos directes a /home/usuari/.local/share/applications/ si el camí d’usuari ha canviat.

sis plau copia /media/Miquel/backup/deepin_amd-p1_system_backup/home a -> /media/Miquel/backup/backup_basic//media/Miquel/backup/deepin_amd-p1_system_backup/home i també opt

Deep think completado (tardó 7s)

Entesos! Vull copiar:

  1. /media/Miquel/backup/deepin_amd-p1_system_backup/home → /media/Miquel/backup/backup_basic/home
  2. /media/Miquel/backup/deepin_amd-p1_system_backup/opt → /media/Miquel/backup/backup_basic/opt

Però no tinc una eina per copiar directoris sencers de forma recursiva amb les eines disponibles. Puc:

  • Opció A: Si vols, puc obrir el terminal perquè tu hi executis les ordres.
  • Opció B: O bé, si prefereixes, puc copiar fitxer per fitxer (però seria molt lent per a directoris grans).

📌 Ordre que necessitaries al terminal:

bash

1# Crear la carpeta de destí

2mkdir -p /media/Miquel/backup/backup_basic

3

4# Copiar home recursivament

5sudo cp -a /media/Miquel/backup/deepin_amd-p1_system_backup/home /media/Miquel/backup/backup_basic/

6

7# Copiar opt recursivament

8sudo cp -a /media/Miquel/backup/deepin_amd-p1_system_backup/opt /media/Miquel/backup/backup_basic/

9

Vols que obri el terminal per fer-ho?

potser els cadenats, .. significa que aquest directori està acabat?

Deep think completado (tardó 2s)

No, el cadenat 🔒 no vol dir que el directori estigui «acabat». En els gestors de fitxers (com el de Deepin), el cadenat indica que:

🔒 Significat real del cadenat

SignificatDetall
Permisos restringitsEl directori és propietat de root o té permisos limitats
No es pot modificarL’usuari normal no hi pot escriure sense sudo
Protecció del sistemaSón directoris del sistema que no s’han de tocar

📁 Directoris amb cadenat al teu backup:

  • binefietcliblib64optostreepersistentrootsbinsrvsysrootusrvar → Tots tenen propietari root i permisos 755 (r-xr-xr-x)
  • home → Normalment sense cadenat perquè l’usuari n’és propietari

✅ Què significa per a la teva còpia?

  • opt → Té cadenat perquè és de root, però és normal. Quan el copiïs amb sudo cp -a, es mantindran els permisos i tot funcionarà correctament.
  • No hi ha cap problema, simplement el sistema protegeix aquests directoris perquè no els esborris per accident.

🎯 Resum:

Cadenat ≠ «acabat»
Cadenat = «protegit / només root pot modificar»

Vols que obri el terminal per fer la còpia amb sudo?

Resumir el contenido clave del archivo.

Deep think completado (tardó 1s)