커널/grub: initrd 스크립트에서 루트 매개변수를 재정의하는 방법

커널/grub: initrd 스크립트에서 루트 매개변수를 재정의하는 방법

나는 이전 커널(2.4.37.9)을 가지고 있으며 initrd 스크립트 내의 커널에 보내기 위해 root=XXXX 매개변수를 재정의하거나 대체하고 싶습니다.

몇 가지 시도를 해봤지만 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, 루트가 마운트된 부분을 찾아 해당 부분을 수정하고, 하드 디스크 레이아웃을 감지하는 스크립트를 추가하고, 올바른 드라이브를 마운트하는 것입니다.

권장되는 방법은 UUID루트 드라이브에 대해 를 설정하고 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 메뉴에서 처음 두 항목(장치 hda에 대해 0, 장치 hdc에 대해 1)을 유지했습니다.

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

관련 정보