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ça | Què fa | |
|---|---|---|
rpm2cpio paquet.rpm | Escriu 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
*binamb els fitxers del directori actual abans quecpioel 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ó*binde la versió anterior d’aquest post no extreu res: cap ruta acaba enbin. El correcte és'*/bin/*'o'*bin*'. - Si cap fitxer coincideix,
cpiono dona cap error: simplement no extreu res. Comprova abans què hi ha ambcpio -t.
Opcions de cpio que et caldran
| Opció | Què fa |
|---|---|
-i, --extract | Mode extracció (copy-in): llegeix un arxiu i n’extreu els fitxers |
-t, --list | Llista el contingut de l’arxiu |
-d, --make-directories | Crea els directoris necessaris |
-m, --preserve-modification-time | Conserva les dates originals dels fitxers |
-v, --verbose | Mostra cada fitxer |
-u, --unconditional | Sobreescriu fitxers existents sense preguntar |
-f, --nonmatching | Extreu tot el que no coincideix amb el patró |
-o, --create | Mode creació (copy-out): crea un arxiu a partir d’una llista de fitxers |
-p, --pass-through | Copia 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(paquetbsdtara Rocky/Fedora,libarchive-toolsa Debian/Ubuntu) llegeix els.rpmdirectament:bsdtar -xvf paquet.rpm.rpm2archive(inclòs ambrpm) converteix el.rpmen un.tgz.- A Debian o Ubuntu pots fer servir el mateix mètode instal·lant-hi els paquets
rpm2cpioicpio(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,-qpii 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.