Recently, I was trying to update (and upgrade) Ubuntu Lucid, and received this error while running apt-get:
dpkg: unrecoverable fatal error, aborting:
failed in buffer_read(fd): files list for package `apparmor': Input/output error
E: Sub-process /usr/bin/dpkg returned an error code (2)
The solution was summarized nicely by Vivek Kapoor; he attributes the solution to C.M. Connelly (from 5 May, 2003). One of the nice things about Connelly’s entry is that he shows you how he debugged the problem he had, and how he fixed it; go read the post.
The error message is coming from dpkg, and refers to the “
files list for package `apparmor'“. The files list is in /var/lib/dpkg/info; in this case,
/var/lib/dpkg/info/apparmor.list. The problem being referred to in the error message is that, for some reason, this file cannot be read.
This file can be recreated if you have the package on hand; if not, you can fetch it with
apt-get install -d package (possibly with the
--reinstall option if necessary). The package will be downloaded to /var/cache/apt/archives, and even if a reinstall is attempted, the reinstall will fail (through dpkg) even though the download through apt succeeds.
The info file contains lines like this (using the top five lines of apparmor as an example):
drwxr-xr-x root/root 0 2010-03-30 14:59 ./ drwxr-xr-x root/root 0 2010-03-30 14:59 ./sbin/ -rwxr-xr-x root/root 783108 2010-03-30 14:59 ./sbin/apparmor_parser drwxr-xr-x root/root 0 2010-03-30 14:59 ./etc/ drwxr-xr-x root/root 0 2010-03-30 14:59 ./etc/apparmor/
To recreate the file, pipe the output from
dpkg -c debfile – like this:
dgd@cor:/var/cache/apt/archives$ dpkg -c apparmor_2.5-0ubuntu3_i386.deb |sudo tee /var/lib/dpkg/info/apparmor.list >/dev/null
After that, you should be good to go. You might want to check the disk (using
fdisk) and perhaps reinstall the package to make sure all files are okay.
I don’t understand how this dpkg problem can last for seven years now; dpkg should be able to cleanly handle the recreation of this file if necessary, and shouldn’t be reporting obscure messages about its internal workings. From a user perspective – and a system administrator perspective – dpkg should automatically recreate the list file if there are problems with it, or even recreate all control files used by the package.
One very interesting tip was hidden in Connelly’s blog post from 2003: you can use
less on a Debian package and it will report useful information (here’s an example from first lines of apparmor):
apparmor_2.5-0ubuntu3_i386.deb: new debian package, version 2.0. size 350314 bytes: control archive= 3944 bytes. 2338 bytes, 61 lines conffiles 360 bytes, 18 lines * config #!/bin/sh 662 bytes, 15 lines control 708 bytes, 10 lines md5sums 3577 bytes, 119 lines * postinst #!/bin/sh 2402 bytes, 90 lines * postrm #!/bin/sh 1186 bytes, 52 lines * preinst #!/bin/sh 959 bytes, 32 lines * prerm #!/bin/sh 421 bytes, 9 lines templates Package: apparmor Version: 2.5-0ubuntu3 Architecture: i386 Maintainer: Ubuntu Core Developers Installed-Size: 2248 Depends: libc6 (>= 2.8), debconf (>= 0.5) | debconf-2.0, lsb-base, initramfs-tools, debconf Suggests: apparmor-profiles, apparmor-docs Conflicts: libapache2-mod-apparmor (<< 2.5-0ubuntu2) Replaces: apparmor-parser, libapache2-mod-apparmor (<< 2.5-0ubuntu2) Section: admin Priority: extra Homepage: http://apparmor.wiki.kernel.org/ Description: User-space parser utility for AppArmor AppArmor Parser is a user level programs that is used to load in program profiles to the AppArmor Security kernel module. *** Contents: drwxr-xr-x root/root 0 2010-03-30 14:59 ./ drwxr-xr-x root/root 0 2010-03-30 14:59 ./sbin/