F15: Erased rpm database!! What now?

Panu Matilainen pmatilai at laiskiainen.org
Mon Sep 26 12:01:16 UTC 2011


On 09/25/2011 11:28 PM, g wrote:
> On 09/25/2011 08:15 PM, sean darcy wrote:
>> Doing something really silly, which erased /var/lib/rpm/. Sigh.
>>
>> Found http://www.sharp-tools.net/archives/000765.html which talks about
>> recovering from an erasure by using a log file /var/lib/rpmpkgs that a
>> cron job did on his system. Can't find any such file on my system.
>>
>> Any suggestions really appreciated.
>
> 1] use either;
>
>    man rpm
> or
>    info rpm
>
> search for word;
>
>    --initdb

This is of no use whatsoever in this situation, it doesn't help 
reconstructing the accidentally erased rpmdb contents.

> 2] learn how to back up your system.

While good advise, this doesn't help after the fact either.

The best option is to see if the db can be undeleted as-is: avoid 
writing on the filesystem where /var/lib/rpm/ was and give extundelete 
(or other similar tool) a go: see http://extundelete.sourceforge.net/ 
for general undelete instructions.

Extundelete is packaged in Fedora but you can't use rpm/yum to install 
it, you'll need to download it to some other partition than /var and 
unpack with rpm2cpio (and hope you had its dependencies installed) and 
use it from that temporary location.

The all-important file is /var/lib/rpm/Packages, everything else is just 
indexes that can be recreated from the Packages file. IF you can find 
that with undelete-tricks then there should be zero loss of data: put 
the undeleted Packages file back to /var/lib/rpm/, run 'rpmdb 
--rebuilddb' and that's it.

If undelete is not possible (eg /var has been written to which may have 
caused the deleted contents to be actually destroyed), things harder and 
more error prone. Your best chance might be 
/var/lib/yum/rpmdb-indexes/pkgtups-checksums, the script below will pull 
out a package list similar to what /var/log/rpmpkgs used to be:

-- cut here --
#!/usr/bin/python
f = open('/var/lib/yum/rpmdb-indexes/pkgtups-checksums')
for x in [1, 2]:
     f.readline()
lines = []
for l in f.readlines():
     lines.append(l.strip())
pd = zip(*[lines[i::7] for i in range(7)])
for (n,a,e,v,r,x,y) in pd:
     print '%s-%s-%s.%s' % (n,v,r,a)
-- cut here --

With that data, you can then try to reconstruct the rpmdb contents 
similarly to described in eg 
http://www.sharp-tools.net/archives/000765.html. Whether this is worth 
the trouble depends - reinstall might well be an easier option in practise.

	- Panu -


More information about the users mailing list