Bug#547365: "initramfs-tools -d -k foo" is not idempotent
Package: initramfs-tools
Version: 0.93.4
Hi,
The command 'update-initramfs -d -k "$version"' can be used (and is used)
in maintainer scripts to delete a kernel's initrd. Unfortunately, it is
not idempotent: it exits with nonzero status if the initrd file is
missing from a previous successful run. So a maintainer script has to
use something like 'update-initramfs -d -k "$version" || :', which is
both counterintuitive and less safe.
Would it be possible to make this command (possibly with another option)
quietly do nothing if no initrd is found? I understand one wants to
catch typos, but scripts don't make typos. :) Alternatively, could the
default /etc/kernel/postrm.d/initramfs-tools be changed in some other
way to be idempotent?
Thanks,
Jonathan
Here's how I ran into this problem: The last few times I tried to
purge old kernel packages (different versions each time), I received
messages like the following:
| Removing linux-image-2.6.31-01336-g6a1e85e ...
| update-initramfs: Deleting /boot/initrd.img-2.6.31-01336-g6a1e85e
| Purging configuration files for linux-image-2.6.31-01336-g6a1e85e ...
| Cannot delete /boot/initrd.img-2.6.31-01336-g6a1e85e, doesn't exist.
| run-parts: /etc/kernel/postrm.d/initramfs-tools exited with return code 1
| dpkg: error processing linux-image-2.6.31-01336-g6a1e85e (--purge):
| subprocess installed post-removal script returned error exit status 1
These kernel packages are built with "make; fakeroot make deb-pkg" from
vanilla upstream kernels. The linux-image postrm is as follows:
| #!/bin/sh
|
| set -e
|
| # Pass maintainer script parameters to hook scripts
| export DEB_MAINT_PARAMS="$*"
|
| test -d /etc/kernel/postrm.d && run-parts --arg="2.6.31-01336-g6a1e85e" /etc/kernel/postrm.d
| exit 0
which invokes the only file in postrm.d, /etc/kernel/postrm.d/initramfs-tools:
| #!/bin/sh
|
| # passing the kernel version is required
| [ -z "$1" ] && exit 0
|
| # kernel-package passes an extra arg; hack to not run under kernel-package
| [ -z "$2" ] || exit 0
|
| # delete initramfs
| update-initramfs -d -k "$1"
from initramfs-tools. It's not clear to me why the initrd is always
missing before this command gets run, but the command should be able to
handle a missing initrd anyway.
update-initramfs bugscript output attached.
-- /proc/cmdline
BOOT_IMAGE=/boot/vmlinuz-2.6.31-05316-g3bada4b root=UUID=9dd1f668-ec78-4bd3-9bc3-b6f6073468f7 ro quiet quiet
-- /proc/filesystems
ext3
-- lsmod
Module Size Used by
binfmt_misc 7876 1
microcode 7860 0
loop 14684 0
arc4 1740 2
ecb 2752 2
ath5k 135064 0
mac80211 157104 1 ath5k
ath 8056 1 ath5k
snd_maestro3 17864 0
cfg80211 117600 3 ath5k,mac80211,ath
snd_ac97_codec 97748 1 snd_maestro3
rfkill 19336 1 cfg80211
ac97_bus 1648 1 snd_ac97_codec
led_class 4356 1 ath5k
snd_pcm 69016 2 snd_maestro3,snd_ac97_codec
snd_timer 19540 1 snd_pcm
pcmcia 25344 0
snd 48524 4 snd_maestro3,snd_ac97_codec,snd_pcm,snd_timer
snd_page_alloc 8852 1 snd_pcm
i2c_piix4 9728 0
shpchp 29856 0
video 19896 0
yenta_socket 22512 3
rsrc_nonstatic 9376 1 yenta_socket
parport_pc 30088 0
dcdbas 7396 0
pcspkr 2536 0
psmouse 41576 0
evdev 9648 15
i2c_core 22036 1 i2c_piix4
pcmcia_core 34456 3 pcmcia,yenta_socket,rsrc_nonstatic
pci_hotplug 27588 1 shpchp
soundcore 1592 1 snd
button 5540 0
output 2940 1 video
parport 34876 1 parport_pc
processor 32796 1
ac 3156 0
battery 6628 0
ext3 112968 1
jbd 45684 1 ext3
mbcache 7856 1 ext3
sg 21648 0
sr_mod 14732 0
cdrom 31364 1 sr_mod
sd_mod 32296 3
crc_t10dif 1732 1 sd_mod
uhci_hcd 20604 0
ata_piix 22920 2
ehci_hcd 31488 0
libata 147660 1 ata_piix
scsi_mod 140564 4 sg,sr_mod,sd_mod,libata
usbcore 137280 2 uhci_hcd,ehci_hcd
nls_base 7304 1 usbcore
intel_agp 25644 1
agpgart 33656 1 intel_agp
floppy 52140 0
thermal 13904 0
fan 3424 0
thermal_sys 15176 4 video,processor,thermal,fan
hwmon 2828 1 thermal_sys
-- /etc/kernel-img.conf
# Kernel image management overrides
# See kernel-img.conf(5) for details
do_symlinks = yes
relative_links = yes
do_bootloader = no
do_bootfloppy = no
do_initrd = yes
link_in_boot = no
postinst_hook = update-grub
postrm_hook = update-grub
-- /etc/initramfs-tools/initramfs.conf
MODULES=most
BUSYBOX=y
KEYMAP=n
BOOT=local
DEVICE=eth0
NFSROOT=auto
Reply to: