rpm2cpio: extreure fitxers d'un paquet RPM | Iespai

rpm2cpio i cpio: extreure fitxers d’un paquet RPM sense instal·lar-lo



La combinació rpm2cpio paquet.rpm | cpio --extract --make-directories serveix per treure els fitxers d’un paquet .rpm sense instal·lar-lo. És molt útil per mirar què conté un paquet, recuperar un fitxer de configuració original que has modificat, o aprofitar un binari en una màquina on no vols (o no pots) instal·lar res.

Un fitxer .rpm és, per dins, una capçalera amb metadades seguida d’un arxiu comprimit en format cpio amb els fitxers. rpm2cpio treu aquest arxiu i cpio l’extreu.

Què fa cada peça

PeçaQuè fa
rpm2cpio paquet.rpmEscriu a la sortida estàndard l’arxiu cpio que hi ha dins del .rpm, ja descomprimit
`\`Passa aquest arxiu a cpio
cpio --extract (-i)Llegeix un arxiu cpio de l’entrada i n’extreu els fitxers
--make-directories (-d)Crea els directoris que calguin (usr/bin/, usr/share/…)
'patró'Opcional: extreu només els fitxers el nom dels quals coincideix amb el patró

Els fitxers s’extreuen dins del directori actual, amb la seva ruta relativa (./usr/bin/…), no a /usr/bin. Per això no cal sudo i no es toca el sistema.

Exemple

Treballa sempre en un directori buit. Primer, descarrega el paquet (a RHEL, Rocky, AlmaLinux o Fedora, dnf download no instal·la res):

$ mkdir /tmp/tree-rpm && cd /tmp/tree-rpm
$ dnf download tree
$ ls
tree-1.8.0-10.el9.aarch64.rpm

Mira què conté abans d’extreure’l (-t llista, no extreu):

$ rpm2cpio tree-1.8.0-10.el9.aarch64.rpm | cpio -t
./usr/bin/tree
./usr/lib/.build-id
./usr/lib/.build-id/eb
./usr/lib/.build-id/eb/f495fc590177780ffe87f62e7012c1af514c94
./usr/share/doc/tree
./usr/share/doc/tree/README
./usr/share/licenses/tree
./usr/share/licenses/tree/LICENSE
./usr/share/man/man1/tree.1.gz
325 blocks

Extreu-ho tot (-idmv = --extract --make-directories --preserve-modification-time --verbose):

$ rpm2cpio tree-1.8.0-10.el9.aarch64.rpm | cpio -idmv
./usr/bin/tree
...
./usr/share/man/man1/tree.1.gz
325 blocks
$ ls
tree-1.8.0-10.el9.aarch64.rpm  usr

Extreu només els binaris de bin/:

$ rpm2cpio tree-1.8.0-10.el9.aarch64.rpm | cpio -idv '*/bin/*'
./usr/bin/tree
325 blocks

Recuperar el fitxer de configuració original d’un paquet (per exemple, per comparar-lo amb el teu):

rpm2cpio openssh-server-*.rpm | cpio -idv './etc/ssh/sshd_config'
diff etc/ssh/sshd_config /etc/ssh/sshd_config

Compte amb el patró

  • Posa’l sempre entre cometes. Sense cometes, el shell intenta expandir *bin amb els fitxers del directori actual abans que cpio el vegi.
  • El patró es compara amb la ruta sencera tal com és a l’arxiu (./usr/bin/tree), i aquí * també inclou les barres /. Per això el patró *bin de la versió anterior d’aquest post no extreu res: cap ruta acaba en bin. El correcte és '*/bin/*' o '*bin*'.
  • Si cap fitxer coincideix, cpio no dona cap error: simplement no extreu res. Comprova abans què hi ha amb cpio -t.

Opcions de cpio que et caldran

OpcióQuè fa
-i, --extractMode extracció (copy-in): llegeix un arxiu i n’extreu els fitxers
-t, --listLlista el contingut de l’arxiu
-d, --make-directoriesCrea els directoris necessaris
-m, --preserve-modification-timeConserva les dates originals dels fitxers
-v, --verboseMostra cada fitxer
-u, --unconditionalSobreescriu fitxers existents sense preguntar
-f, --nonmatchingExtreu tot el que no coincideix amb el patró
-o, --createMode creació (copy-out): crea un arxiu a partir d’una llista de fitxers
-p, --pass-throughCopia fitxers d’un directori a un altre sense crear cap arxiu

cpio sempre llegeix l’arxiu de l’entrada estàndard: per això cpio -i paquet.rpm (com deia la versió anterior d’aquest post) no funciona. El .rpm ha de passar primer per rpm2cpio.

Alternatives

  • bsdtar (paquet bsdtar a Rocky/Fedora, libarchive-tools a Debian/Ubuntu) llegeix els .rpm directament: bsdtar -xvf paquet.rpm.
  • rpm2archive (inclòs amb rpm) converteix el .rpm en un .tgz.
  • A Debian o Ubuntu pots fer servir el mateix mètode instal·lant-hi els paquets rpm2cpio i cpio (sudo apt install rpm2cpio cpio).
  • Si només vols saber què conté, no cal extreure res: rpm -qpl paquet.rpm.

Comandes relacionades

  • La comanda rpm: instal·lar, consultar i verificar paquets.
  • Consultar paquets amb rpm: -qpl, -qpi i altres consultes sobre fitxers .rpm.
  • rpmbuild --rebuild: recompilar un paquet a partir del codi font.
  • tar: l’altre gran format d’arxiu de Linux.
  • dpkg: a Debian, dpkg -x paquet.deb directori/ fa el mateix amb els .deb.

Esta web usa cookies.