Ubuntu – How to recreate a deleted ‘/var/lib/dpkg’ directory

dpkg

Yesterday I had some problem with /var/lib/dpkg/lock during update. I knew that in such cases removing lock file could solve problem. So I tried to do it, but by mistake I removed all DPKG directory. So now I cannot do any update, install, upgrade and so on.

I try via Software Center, Terminal, Qapt, Synaptic. None of these work because all of them do such operations via dpkg. And as my dpkg is corrupted, so I have problem.

How can I completely restore DPKG? I have downloaded dpkg_1.16.1.2ubuntu7_amd64.deb (I use 64bit Ubuntu 12.04) file, but what to do with it in terminal? Simple double-clicking on .deb opens Software Center and you already know, it doesn't work.

P.S. Terminal gives such error:

dpkg: error: cannot read info directory: No such file or directory
E: Sub-process /usr/bin/dpkg returned an error code (2)

Best Answer

Okay I haven't tried this, but it should work I think.

First boot from a live CD.

Next open a terminal and type

sudo fdisk -l

From this you want to determine the partition that your Ubuntu installation is on. If you have only one hard drive it will be /dev/sdaX, where X is the partition number.

Next mount the Ubuntu installation's partition replacing X with the correct partition number.

sudo mount /dev/sdaX /mnt

Next navigate to the directory where dpkg_1.16.1.2ubuntu7_amd64.deb is and use this command:

sudo dpkg --root=/mnt -i dpkg_1.16.1.2ubuntu7_amd64.deb

Hopefully this will work, and you can reboot into your Ubuntu installation and find that dpkg has been reinstalled. If there are any errors let me know and I will try to help you.

edit:

I've been reading through the dpkg manpage and I think the command I suggested above might not work. Here are the relevant sections of the manpage for reference.

   --admindir=dir
          Change default administrative directory,  which  contains
          many   files   that  give  information  about  status  of
          installed or uninstalled  packages,  etc.   (Defaults  to
          /var/lib/dpkg)

   --instdir=dir
          Change default installation directory which refers to the
          directory where packages are to be installed. instdir  is
          also  the  directory  passed  to chroot(2) before running
          package's installation  scripts,  which  means  that  the
          scripts see instdir as a root directory.  (Defaults to /)

   --root=dir
          Changing  root  changes  instdir  to  dir and admindir to
          dir/var/lib/dpkg.

using --root=dir as I suggested would set the admin folder to /mnt/var/lib/dpkg--the folder that you deleted.

Instead try this:

sudo dpkg --force-overwrite --instdir=/mnt -i dpkg_1.16.1.2ubuntu7_amd64.deb

This will use the liveCD's /var/lib/dpkg folder, but the --force-overwrite flag should make it install even though it thinks the package is already installed.

Good luck!

edit2

While this should work to reinstall dpkg I don't think it will rebuild the package lists that are in /var/lib/dpkg. Following the advice in izx's comment to copy the directories/file from a liveCD and go from their is probably your best bet.

Related Question