다음과 같이 Grub에서 Knoppix ISO를 부팅하려고 합니다.
loopback loop /boot/iso/knoppix.iso
linux (loop)/boot/isolinux/linux lang=en bootfrom=/mnt-iso//boot/iso/knoppix.iso
initrd (loop)/boot/isolinux/minirt.gz
내 문제는 bootfrom
매개 변수입니다. 이중 슬래시를 포함하지 않으면 시스템이 부팅되지 않습니다. 드라이브에서 KNOPPIX
폴더를 찾을 수 없다고 불평합니다(ISO 내부에 있기 때문에).
이 폴더를 찾으려고 드라이브를 검색합니다. 폴더의 끝은 이미 ~ /dev/
에 존재합니다 .sda1
sdz15
인수에 이중 슬래시를 포함하면
bootfrom
드라이브를 몇 번 검색한 다음 (아마도 설치 후/mnt-iso
) "예! 찾았습니다/dev/sdd5/boot/iso/knoppix.iso
" 라고 의기양양하게 선언합니다.
물론 이 시점에서는sda1
이미 생성되었습니다. 그러니까 이건 좋은 일이 아닐 수 없어.sdh15
/dev/
사용하면
bootfrom=/dev/sdd5/boot/iso/knoppix.iso
즉시 작동하지만 이 장치를 사용하는 모든 시스템에서 작동한다고 보장할 수는 없습니다. UUID를 사용할 수 있나요?
Fedora 15에서는 사용할 수 있다고 읽었root=live:UUID={uuid}:{isofile}
지만 이것은더 이상 그렇지 않은 것 같습니다.슬래시가 하나만 있으면 왜 다르게 동작합니까?
이것은 매우 혼란스럽습니다.
편집하다:진전!
다음 메뉴 항목을 사용하여 knoppix가 ISO 파일을 열고 검사할 수 있다고 주장했지만 그 안에서 KNOPPIX 폴더를 찾을 수 없었다고 주장했습니다.
iso 이미지에서 KNOPPIX 디렉토리를 찾을 수 없습니다:
loopback loop /boot/iso/knoppix.iso
linux (loop)/boot/isolinux/linux lang=en bootfrom=UUID=<uuid>/boot/iso/knoppix.iso
initrd (loop)/boot/isolinux/minirt.gz
TTY가 작고 텍스트가 줄 바꿈되지 않기 때문에 무슨 일이 일어나고 있는지 말하기가 어렵습니다.
편집하다:앞으로 더 많은 진전이 있을 것입니다. knoppix 저장소의 절반 이상을 조사한 후 grep
시스템의 나머지 부분은 어쨌든 로드되지 않았기 때문에 문제가 커널에 있는지 확인하기로 결정했습니다.
strings linux | grep "Cannot find"
- 결과가 없다
initrd.gz는 어떻습니까? (여기에 무엇이 있는지 전혀 모릅니다. 어딘가에서 실제 메모리 블록이라고 들었습니다.)
아, 거기 또 다른 아카이브가 있다... 아, 거기 파일 시스템이 있다! init이라는 큰 파일에는 무엇이 들어있나요? ...
if [ ! -r "$BOOTSYS/$knoppix_dir/KNOPPIX" ]; then
message "${CRE}${RED}Cannot find $knoppix_dir dir in ISO image ${MAGENTA}${BOOTDEV}${YELLOW}/${BOOTFILE}${NORMAL} "
정말? 도대체 누가 오류 메시지에 조건과 명확하게 구분된 변수를 사용하도록 만들었나요?
글쎄, 적어도 나는 문제의 정확한 라인(591)을 알고 있지만 내가 본 유일한 방법은 이 bash를 엉망으로 만들고 하드코딩하여 나를 통과시키려는 극도로 해키적인 시도입니다... 또는 내 파티션에서 문제가 발생하도록 설정하는 것입니다. sda에. 물론 무엇을 해야할지 모르겠습니다. 응! 그래서. 어떻게 편집하나요 init
?
답변1
knoppix의 initramfs에 있는 init 스크립트는 스파게티 코드인 것으로 밝혀졌습니다.
특히 해당 형식의 장치만 허용하도록 하드코딩되어 있어 /dev/sdxy
긴 경로 이름 및 UUID와 같은 문제가 발생합니다.
방금 새 initrd를 생성하고 전체 섹션을 삭제하고 UUID를 여기에 하드코딩했습니다. 물론 그렇게 쉬운 일은 아니다. knoppix initrd는 매우 작으며 와 같은 기능도 없고 blkid
마운트를 전달하는 기능도 없습니다 UUID=
.
마침내 fdisk와 grep을 사용하여 장치 파일을 찾았습니다.
message "${CRE}${RED}This minitrt has been hacked by Jonathan Vollebregt due to the horrific state of the knoppix init. You are about to see a very dirty hack.${NORMAL} "
echo "Hardcoded identifier awaits: Using fdisk and partition details to match device"
echo "grepping '/dev/sd.5.+4096.+57935871.+28965888.+83.+Linux'"
BOOTDEV=`fdisk -lu`
BOOTDEV=`echo "$BOOTDEV" | grep -E "^/dev/sd.5.+4096.+57935871.+28965888.+83.+Linux$"`
BOOTDEV=`echo "$BOOTDEV" | grep -o "^/dev/sd.5"`
if [ -z "$BOOTDEV" ]; then
echo "Well shit..."
sleep 1m
fi
echo "Device file: $BOOTDEV"
echo "mkdir -p /mnt-hack"
mkdir -p "/mnt-hack"
echo "mount -t ext4 -o ro $BOOTDEV /mnt-hack"
mount -t ext4 -o ro "$BOOTDEV" "/mnt-hack"
BOOTFILE="/${BOOTFROM#*/}"
echo "Stripping also reveals: /$BOOTFILE"
echo "mount -t iso9660 -o ro /mnt-hack/$BOOTFILE $BOOTSYS"
mount -t iso9660 -o ro "/mnt-hack/$BOOTFILE" "$BOOTSYS"
echo "knoppix_dir=$knoppix_dir"
echo "BOOTSYS=$BOOTSYS"
문제의 파티션 크기가 상당히 독특해서 조만간 충돌이 일어날지 의문입니다.