Educating the world

Our blog has over 10,000 readers a month

Science Fiction

January 9th, 2012

There are many people who turn their noses up at Science Fiction films and yet the majority of people do like them, it’s just they re-classify them in their mind. I over heard a conversation in the pub on Friday.

John: Don’t like SciFi.
Al: What about Terminator 2?
John: That’s not SciFi, that’s an action film.
Al: Robots coming from the future to change history, how much more SciFi can you get??

rpmdb: unable to join the environment

January 6th, 2012

How time flies? It only seemed like yesterday that I installed CentOS 5.4 at a customer site. This week I needed to update rsync from 2.6.8 to what ever the latest version is. So I typed:

yum update rsync

and got the following message.

Loaded plugins: fastestmirror
rpmdb: unable to join the environment
error: db4 error(11) from dbenv->open: Resource temporarily unavailable
error: cannot open Packages index using db3 - Resource temporarily unavailable (11)
error: cannot open Packages database in /var/lib/rpm
Traceback (most recent call last):
File “/usr/bin/yum", line 29, in ?
yummain.user_main(sys.argv[1:], exit_code=True)
File “/usr/share/yum-cli/yummain.py", line 309, in user_main
errcode = main(args)
File “/usr/share/yum-cli/yummain.py", line 157, in main
base.getOptionsConfig(args)
File “/usr/share/yum-cli/cli.py", line 187, in getOptionsConfig
self.conf
File “/usr/lib/python2.4/site-packages/yum/__init__.py", line 664, in <lambda>
conf = property(fget=lambda self: self._getConfig(),
File “/usr/lib/python2.4/site-packages/yum/__init__.py", line 239, in _getConfig
self._conf = config.readMainConfig(startupconf)
File “/usr/lib/python2.4/site-packages/yum/config.py", line 804, in readMainConfig
yumvars[’releasever’] = _getsysver(startupconf.installroot, startupconf.distroverpkg)
File “/usr/lib/python2.4/site-packages/yum/config.py", line 877, in _getsysver
idx = ts.dbMatch(’provides’, distroverpkg)
TypeError: rpmdb open failed

I also tried:

rpm -qa

which resulted in:

rpmdb: unable to join the environment
error: db4 error(11) from dbenv->open: Resource temporarily unavailable
error: cannot open Packages index using db3 - Resource temporarily unavailable (11)
error: cannot open Packages database in /var/lib/rpm

Even though the message says Resource temporarily unavailable, it was in fact always unavailable!
Hunted around and found this article which helped a lot.

The problem is caused by an empty database index file in the RPM repository, probably caused by corruption. In my case it was because most of the index files were missing.

[root@host tmp]# ls -l /var/lib/rpm
total 39656
-rw-r–r– 1 root root 5107712 Nov 11 11:58 Basenames
-rw-r–r– 1 root root 12288 Oct 5 2010 Conflictname
-rw-r–r– 1 root root 0 Dec 12 11:42 __db.001
-rw-r–r– 1 root root 1036288 Nov 11 11:58 Dirnames
-rw-r–r– 1 root root 5259264 Nov 11 11:58 Filemd5s
-rw-r–r– 1 root root 24576 Nov 11 11:58 Group
-rw-r–r– 1 root root 16384 Nov 11 11:58 Installtid
-rw-r–r– 1 root root 40960 Nov 11 11:58 Name
-rw-r–r– 1 root root 30818304 Nov 11 11:58 Packages
-rw-r–r– 1 root root 331776 Nov 11 11:58 Providename
-rw-r–r– 1 root root 102400 Nov 11 11:58 Provideversion
-rw-r–r– 1 root root 12288 Oct 5 2010 Pubkeys
-rw-r–r– 1 root root 413696 Nov 11 11:58 Requirename
-rw-r–r– 1 root root 208896 Nov 11 11:58 Requireversion
-rw-r–r– 1 root root 81920 Nov 11 11:58 Sha1header
-rw-r–r– 1 root root 45056 Nov 11 11:58 Sigmd5
-rw-r–r– 1 root root 12288 Feb 16 2010 Triggername

So all I needed to do was remove all the index files and rebuild them.

rm -rf /var/lib/rpm/__db*
rpm -rebuilddb

The RPM repository now looks like:

-rw-r–r– 1 root root 2768896 Jan 6 09:49 Basenames
-rw-r–r– 1 root root 12288 Oct 5 2010 Conflictname
-rw-r–r– 1 root root 0 Jan 6 09:49 __db.000
-rw-r–r– 1 root root 24576 Jan 6 09:49 __db.001
-rw-r–r– 1 root root 1318912 Jan 6 09:49 __db.002
-rw-r–r– 1 root root 450560 Jan 6 09:49 __db.003

-rw-r–r– 1 root root 978944 Jan 6 09:49 Dirnames
-rw-r–r– 1 root root 5267456 Jan 6 09:49 Filemd5s
-rw-r–r– 1 root root 24576 Jan 6 09:49 Group
-rw-r–r– 1 root root 16384 Jan 6 09:49 Installtid
-rw-r–r– 1 root root 45056 Jan 6 09:49 Name
-rw-r–r– 1 root root 25427968 Jan 6 09:49 Packages
-rw-r–r– 1 root root 335872 Jan 6 09:49 Providename
-rw-r–r– 1 root root 98304 Jan 6 09:49 Provideversion
-rw-r–r– 1 root root 12288 Oct 5 2010 Pubkeys
-rw-r–r– 1 root root 409600 Jan 6 09:49 Requirename
-rw-r–r– 1 root root 196608 Jan 6 09:49 Requireversion
-rw-r–r– 1 root root 81920 Jan 6 09:49 Sha1header
-rw-r–r– 1 root root 45056 Jan 6 09:49 Sigmd5
-rw-r–r– 1 root root 12288 Feb 16 2010 Triggername

I re-issued the update command:

yum update rsync

and it successfully installed rsync 3.0.6-4.el5_7.1.

Interestingly, CentOS 5.4 has been deprecated and so this version of rsync was for CentOS 5.7, but it didn’t need to install any dependencies.

Format a USB drive under unix

January 3rd, 2012

In order to format a USB device under Unix you need to follow these simple steps under the root user account.

Find out the name of the device file representing the USB hardware device:

  1. If the system is busy I clean out the dmesg to make it easier to find the reports when the USB device is connected. I clear the existing log to a date stamped file:

    dmesg -c > dmesg.`date +%Y-%m-%d-%H-%M-%S`

  2. Plug in the USB device.
  3. Type:

    dmesg

    again and you should get something like:
    usb 1-5: new high speed USB device using ehci_hcd and address 4
    usb 1-5: configuration #1 chosen from 1 choice
    Initializing USB Mass Storage driver...
    scsi4 : SCSI emulation for USB Mass Storage devices
    usbcore: registered new driver usb-storage
    USB Mass Storage support registered.
    usb-storage: device found at 4
    usb-storage: waiting for device to settle before scanning
      Vendor: WDC WD15  Model: EARS-00S0XB0      Rev: 80.0
      Type:   Direct-Access                      ANSI SCSI revision: 05
    SCSI device sdb: 2930277168 512-byte hdwr sectors (1500302 MB)
    sdb: Write Protect is off
    sdb: Mode Sense: 23 00 00 00
    sdb: assuming drive cache: write through
    SCSI device sdb: 2930277168 512-byte hdwr sectors (1500302 MB)
    sdb: Write Protect is off
    sdb: Mode Sense: 23 00 00 00
    sdb: assuming drive cache: write through
     sdb: unknown partition table
    sd 4:0:0:0: Attached scsi disk sdb
    sd 4:0:0:0: Attached scsi generic sg2 type 0
    
    You can see that the kernel has assigned sdb as the block device (i.e. /dev/sdb). You can also see that the kernel was not able to detect the partition type of the drive

Now that we know the device file we must create a partition on the drive and format it. The tool used for this is fdisk.

  1. Launch the program telling it which device file to look at:

    fdisk /dev/sdb

  2. If you get the following message then ignore it because doing a write will just create an empty partition which isn’t what we want.

    Warning: invalid flag 0x0000 of partition table 4 will be corrected by w(rite)

  3. Add a partition by pressing n (for new partition).

    Command action
    e extended
    p primary partition (1-4)
    p
    Partition number (1-4): 1
    First cylinder (1-182401, default 1):
    Using default value 1
    Last cylinder or +size or +sizeM or +sizeK (1-182401, default 182401): 182401

    I only want one partition and for that partition to contain the whole drive. If you wanted a different number of partitions then here would be the place to set that up.
  4. Next up, we have to set the type of the filesystem. So hit t.

    Selected partition 1
    Hex code (type L to list codes): 7
    Changed system type of partition 1 to 7 (HPFS/NTFS)

  5. Then look over what we have done.

    Disk /dev/sdb: 1500.3 GB, 1500301910016 bytes
    255 heads, 63 sectors/track, 182401 cylinders
    Units = cylinders of 16065 * 512 = 8225280 bytes

    Device Boot Start End Blocks Id System
    /dev/sdb1 1 182401 1465136001 7 HPFS/NTFS

  6. Finally enter w to write the partition table and quit.
  7. Typing dmesg again gives:

    SCSI device sdb: 2930277168 512-byte hdwr sectors (1500302 MB)
    sdb: Write Protect is off
    sdb: Mode Sense: 23 00 00 00
    sdb: assuming drive cache: write through
    sdb: sdb1

Now that the partition has been created we must make it ready for action.

  1. The first thing we need to do is format the drive and create a filesystem. Issue the following command. There should be a longish wait (1.5TB drive took about 20 seconds.)

    # mkfs -t vfat /dev/sdb1
    mkfs.vfat 2.11 (12 Mar 2005)

  2. Now we are ready. We can mount the USB drive:

    mount -t vfat /dev/sdb1 /mnt

  3. For confirmation we’ll check the mounted partitions with the command df -h to give:

    Filesystem Size Used Avail Use% Mounted on
    /dev/sda1 388G 30G 338G 9% /
    /dev/sda2 436G 366G 48G 89% /home
    tmpfs 1013M 0 1013M 0% /dev/shm
    /dev/sdb1 1.4T 16K 1.4T 1% /mnt

  4. Don’t forget to edit your backup scripts to reflect the new device name.