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