[Megoldva] Az rpm csomag telepítése, miközben éppen rpm kellene ehhez. Hogyan?

Nem kicsit vagyok gondban. Egy ismerősöm gépét karbantartottam távolról, kikapcsolta. Épp a selinux-policy frissítése volt soron, így bekapcsolás után nem értem el távolról a gépet. Ismerős nem ért a géphez, Skype-on mondtam, mit tegyen. Az lett belőle, hogy letörölte az rpm parancsot.

Hogyan tegyem vissza, amikor ez éppen az a parancs, amivel feltelepíthetném? Selinuxot kikapcsoltam, most éppen elérem a gépet, de nem tudok telepíteni. A yum ezt mondja:

yum install rpm
error: Unable to open /usr/lib/rpm/rpmrc for reading: No such file or directory.
error: no dbpath has been set
error: cannot open Packages database in /%{_dbpath}
CRITICAL:yum.main:

Error: rpmdb open failed

Megoldás:
Az rpm csomagot kibontottam a saját gépemen, a file-okat átmásoltam ssh-n, majd chown root:root az érintett file-okra. Ezt követően

yum install rpm

így a pre- és post install scriptek is normálisan futottak.

Hozzászólások

scp-zd rá másik gépről a letörölt fájlokat.

Na jó, de nem másik rendszerről kell nem egészen odaillő file-okat másolni. Repókból vagy build szerverről elérhetők a pontosan odaillő rpm csomagok. Ezt bontottam ki a saját gépemen, aztán átmásoltam file-osan a cél gépre. Utána bemásoltam a file-okat, ahova valók, a tulajdonost, csoportot remdbe szedtem. Ekkor már működött a telepítés, s feltelepítettem szintén az rpm-et. Egyrészt azért, mert a manual page-eket nem tettem fel, ahhoz nem volt türelmem, hiszen csak az kellett, hogy működjön. Másrészt azért, hogy a post install script konfigurálgasson kedvére, ha szeretne. Utána meg már teljes a rendszer, innen egyenesben voltam.

tr '[:lower:]' '[:upper:]' <<<locsemege
LOCSEMEGE

(Természetesen én is bakiztam, és orvosoltam ugyanígy már ilyet, meg azt is, amit más bakizott el, és akkor, de a mai napig sem értem, hogy az RH semmitmondó csomagokat is fel képes venni a függőségi lánc elejére, de az rpm-et mégsem védi privilegizáltabban, mint a többi csomagot, hogy pl. egy spéci kapcsoló szolgálna arra, hogy az ember harakirizhessen, ha tényleg azt akarja.)

Csomagkezelő ebben valóban lehetne szofisztikáltab, de ha jobban belegondolok, az rm -Rf /* ellen sincs semmi védelem. Lényegében én voltam a hülye, hogy a számítástechnikához nem értő 64 éves keresztanyámnak mondtam, terminálon legyen root, aztán mondtam neki, mit tegyen. Arra a legkevésbé sem számítottam, hogy kétszer másolja be a parancsot, lehet, hogy billentyűismétlés miatt, s így a második az argumentuma lesz az elsőnek, valahogy így:

rpm -e --nodeps csomag1 csomag2 rpm -e --nodeps csomag1 csomag2

Az a második rpm az első argumentumaként okozta a bajt.

tr '[:lower:]' '[:upper:]' <<<locsemege
LOCSEMEGE

Durva hekk, de egy misét megér.

Bontsd ki az rpm-et (ha van rpm2cpio a gépen), és a cpio-t is egy könyvtárba, és másold a megfelelő fájlokat a megfelelő helyre (értsd: ha a cpio tartalmaz etc, usr, var és egyéb könyvtárakat, azok tartalmát értelem szerűen a gyökér fájlrendszer azonos könyvtáraiba tedd).

A másolás után futtass egy ldconfig-ot biztos, ami biztos alapon, aztán próbálkozz egy rpm -qa paranccsal, hogy jól megy-e.
Lehet, hogy érdemes belekukkantani a preinstall/postinstall scriptekbe is.

Ami megnehezítheti a dolgod, az az, ha a jóember néhány szükséges függőséget is eldobott - emiatt lehet, hogy pl. rpm2cpio-d sincs.
Én a google-t javaslom, "extract rpm without rpm binary" keresőfeltétellel, ha a fenti nem OK.

Ha viszont sikerrel jársz, akkor az rpm-et mindenképp telepítsd újra (talán -U, ha minden igaz, de lehet, hogy force-olnod is kell).

--
PtY - www.onlinedemo.hu

Valami ilyesmin agyalok magam is. Kibontom a saját gépemen, aztán rsync-kel átküldöm. Ha odáig eljutok, hogy fel tudom tenni az rpm-et a gányolt rpm-mel, akkor nyert ügyem van. Ami még para, hogy lehet, megszabadultam a teljes rpm adatbázistól is, bár arra van valami rebuild opció emlékeim szerint.

Amúgy a törlés úgy történt, hogy én egy rpm parancsot mondtam neki Skype-on, ám azt kétszer másolta a terminálba. A második példányban lévő rpm valójában az első rpm parancs argumentuma lett így, és hát persze éppen az rpm -e, azaz a törlés parancs volt ez.

tr '[:lower:]' '[:upper:]' <<<locsemege
LOCSEMEGE

Köszönöm az ötleteket!

tr '[:lower:]' '[:upper:]' <<<locsemege
LOCSEMEGE