[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

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: