如何在内核更新后自动更新Burg

每次内核更新后,我都必须手动运行update-burg。如何让它自动运行?
4个回答

另一种方法是编辑/etc/kernel-img.conf文件。
do_symlinks = yes
relative_links = yes
do_bootloader = no
do_bootfloppy = no
do_initrd = yes
link_in_boot = no
postinst_hook = update-burg
postrm_hook = update-burg

从:https://bugs.launchpad.net/burg/+bug/594431(一个错误报告反映了你的经历)
这个问题可以通过更新来解决,但由于它在/etc/目录下,当有更新时,你应该会收到一个提示,询问是否保留现有配置。
正如在错误报告中提到的,这仍然不是理想的解决方案,因为有可能有人希望同时运行burg和grub,或者至少保持两者同步。
你还可以进一步编写一个新的脚本,像这样:
#!/bin/sh
set -e
exec update-grub "$@"
exec update-burg "$@"

将其保存为/usr/sbin/update-bootloaders,对其进行chmod +x操作,然后将update-bootloaders放入/etc/kernel-img.conf中,替换update-grubupdate-burg
我猜从长远来看,需要建立一个类似于Java、音频和其他可互换子系统的alternatives系统,用于各种引导加载程序。

我觉得你的回答更好(更简洁),但是我大约一年前只是把grub改成了burg,而且完全没有出现任何问题。 - Extender
2我刚刚通过update-manager进行了一次升级,结果在升级过程中,位于MBR的burg被grub覆盖了。我不得不重新安装burg。在这次经历之后,我决定彻底移除grub(希望burg没有对grub有依赖)。 - jumbli

通常会调用update-grub。这只是一个发生的事情。系统期望grub成为引导加载程序。假设您将永远不再使用grub,您可以这样做:
cd /usr/sbin/
sudo mv update-grub update-grub.backup
sudo ln -s update-burg update-grub

这将update-grub移出路径,并在其位置创建一个符号链接,实际上运行的是update-burg。因此,当安装新内核时,它将调用实际上是update-burgupdate-grub
有点取巧,但应该能行。
要恢复:
cd /usr/sbin/
sudo rm update-grub # this is only a symlink
sudo mv update-grub.backup update-grub

你确定更新或其他操作不会损坏符号链接吗? - jumbli
发布了另一个答案,应该对更新更具弹性一些。我会将这个留在这里作为一个快速而简单的替代品。 - Oli

如果您有习惯使用sudo apt-get upgrade来更新软件包和内核,下面的脚本将解决您的问题,并且100%适用于更新:
#!/bin/bash
# Check what kernels are installed.
KERLST=`ls /boot | grep vmlinu`

# Do updates.
sudo apt-get -y update
sudo apt-get -y upgrade
sudo apt-get -y dist-upgrade

# Update burg if kernels changed. 
if [ "$KERLST" != "`ls /boot | grep vmlinu`" ]; then
    sudo update-burg
fi

将其保存为文本文件apgrade.sh并标记为可执行文件。此脚本将执行所有可能的更新,检查内核列表是否已更改,并在需要时更新burg。我从10.04开始使用它(绑定到一个别名),迄今为止没有任何更新破坏它。
然而,如果您喜欢通过synaptic手动进行更新,则Oli的方法可能更好。

你可以通过打开你的"/.bash_aliases"文件,并添加一行"alias apgrade='/apgrade.sh'"(不包括双引号)来将其绑定到一个别名。只有在你打开一个新的终端后,这个更改才会生效。我发现这是更新的完美方法,因为它只需要在任何终端中按下四个键(ap<TAB><ENTER>),剩下的都是自动完成的。 - Malabarba
如果你想将其作为aupgrade运行,只需将其放在~/bin目录下(并删除.sh扩展名)。 - Oli
确实。我更喜欢使用别名,因为通过复制.bash_aliases文件,它们可以轻松地迁移到新的安装环境中。但这完全是个人偏好的问题。 - Malabarba

谢谢!

我根据这里提供的最有帮助/最高评级的信息创建了一个脚本。一个微小的变化是引导加载程序可执行文件不再被执行(例如,对于grub,它会退出;因此脚本也会退出,其他加载程序不会被执行(@Ubuntu11))。

该脚本可以配置多个引导加载程序..(如果可执行文件是update-name并且位于/usr/sbin中;-)。

它可以扩展以允许非update-name的更新可执行文件。为此,可以在引导加载程序配置变量中使用name:exec作为值,并拆分该变量,然后相应地更改执行命令(可能需要使用不同的语言来使其优雅)。

#!/bin/sh
# #################################################################
#
# Updates (multiple) bootloaders after kernel update.
#
# @shell bash
# @see http://askubuntu.com/questions/4905/how-to-automatically-update-burg-after-a-kernel-update
#
# #################################################################
#
# Install:
#
# -----------------------------------------------------------------
# * Save as:   /usr/sbin/update-bootloaders
# * Then:      chmod +x /usr/sbin/update-bootloaders
# * Edit /etc/kernel-img.conf and append/replace the following parameters:
# ** postinst_hook = update-bootloaders
# ** postrm_hook = update-bootloaders
#
# #################################################################
#
# Configuration:
#
# -----------------------------------------------------------------
# BOOTLOADERS: configuration variable to list bootloaders
BOOTLOADERS="grub burg"
#
# #################################################################
set -e
for BOOTLOADER in ${BOOTLOADERS}; do
    EXEC="/usr/sbin/update-${BOOTLOADER}"
    if [ -x ${EXEC} ]; then
        echo "Updating ${BOOTLOADER}..."
        ${EXEC} "$@"
    fi
done
# eof