内核/grub:如何覆盖 initrd 脚本中的 root 参数

内核/grub:如何覆盖 initrd 脚本中的 root 参数

我有一个旧内核( 2.4.37.9 ),我想覆盖或替换 root=XXXXX 参数以发送到 initrd 脚本内的内核。

我已经做了一些尝试,但似乎在 initrd grub 结束时总是将 menu.lst 文件中定义的根参数传递给内核,而我尝试定义一个动态值(例如 hda1 或 hdc1 )取决于主板的布局。

title Linux-2.4.37.9_CCL_20130122 with INITRD
    root (hd0,0)
    kernel /boot/vmlinuz-2.4.37.9_CCL_20130122  ro root=XXXXXX console=ttyS0,9600 console=tty0 apm=off
    initrd /boot/initrd-CCL.img.gz

有什么建议 ?

答案1

不可以,不支持。

你可以做的就是解压initrd /boot/initrd-CCL.img.gz,找到挂载root的部分,并修改相应的部分,添加检测硬盘布局的脚本,并挂载正确的驱动器。

推荐的方法是UUID为您的根驱动器设置 a ,并将该root=部分更改root=UUID=XXX为 ,我不确定旧发行版是否支持它。这样,无论设备布局如何变化,它总是安装正确的设备。

答案2

这不是解决这个问题的更礼貌的解决方案,但它有效,并且 mybe 应该对其他人有帮助,所以我在这里简要描述我如何解决我的问题,让 DOM 能够自动更改它的启动设备。

在 linuxrc 内,initrd 的脚本中,我检测到该设备可用,并根据该结果设置 grub 使用的默认启动选项

我的 linuxrx 我是这样的

#!/bin/ash

restart=0
mntdev=""

target="hda"
echo "--> check fdisk ${target} "

mount -t ext2 /dev/${target}1 /mnt/tmp
if [ -f /mnt/tmp/etc/slackware-release ]; then
  echo "Found $target "
  mntdev="/dev/${target}1"
      olddef=$( cat /mnt/tmp/boot/grub/default )
      if [ $olddef -ne 0 ]; then
          echo "0" > /mnt/tmp/boot/grub/default
          restart=1
      fi
fi
umount /mnt/tmp
# ================================
if [ -z $dskroot ]; then
    target="hdc"
    echo "--> check fdisk ${target} "

    mount -t ext2 /dev/${target}1 /mnt/tmp
    if [ -f /mnt/tmp/etc/slackware-release ]; then
      echo "Found $target  "
      mntdev="/dev/${target}1"
      olddef=$( cat /mnt/tmp/boot/grub/default )
      if [ $olddef -ne 1 ]; then
          echo "1" > /mnt/tmp/boot/grub/default
          restart=1
      fi
    fi
    umount /mnt/tmp
fi
# ================================

if [ $restart -eq 1 ]; then
  echo "Changed grub default : Rebooting PC "
  echo "===================================="
  sleep 2
  mount -t ext2 $mntdev /mnt/tmp
  chroot /mnt/tmp <<EOF
  /sbin/reboot -f
EOF
fi

在 grub 菜单中,我保留了前两个条目,0 表示设备 hda,1 表示设备 hdc

default saved

title Linux-2.4.37.9_CCL_20130122 with INITRD hda pos 0
        root (hd0,0)
        kernel /boot/vmlinuz-2.4.37.9_CCL_20130122  ro root=/dev/hda1 console=ttyS0,9600 console=tty0 apm=off
        initrd /boot/initrd-CCL.img.gz

title Linux-2.4.37.9_CCL_20130122 with INITRD hdc pos 1
        root (hd0,0)
        kernel /boot/vmlinuz-2.4.37.9_CCL_20130122  ro root=/dev/hdc1 console=ttyS0,9600 console=tty0 apm=off
        initrd /boot/initrd-CCL.img.gz

相关内容