grub을 .img 파일에 설치하는 방법은 무엇입니까?


26

나는 다음을 수행했다.

  1. dd로 빈 .img 파일을 만들었습니다.
  2. losetup과 함께 / dev / loop0에 연결했습니다.
  3. fdisk로 파티션을 만들었습니다
  4. 이러한 파티션을 mke2fs로 포맷
  5. 사용자 정의 GNU / Linux 시스템을 해당 파티션에 복사

이제 grub을 MBR 및 / boot 디렉토리에 설치하여 .img 파일을 부팅 가능하게 만들고 싶습니다. 내 목표는 qemu로 .img 파일을로드하는 것입니다. grub 레거시 대신 grub2를 사용하는 것이 좋습니다.

감사.


답변:


24

이것은 grub-pc 버전 1.98 + 20100804-5ubuntu3 (Maverick Meerkat)과 함께 제공됩니다.

grub2 설치 프로그램은 장치를 루프백 장치에 설치할 수 있지만 장치 매퍼를 사용하여 마운트하면 LVM 체계가 혼란스러워 추상화 누락에 대한 불만으로 인해 실패하게됩니다.

대신, "/ dev / loop [0-9]"패턴과 일치 해야하는 이름을 사용하여 파티션에 대한 루프백 장치를 직접 설정 해야합니다 ( 예 : 끝에 파티션 지정자가없는 경우).

kpartx -v -a /dev/loop0
losetup /dev/loop1 /dev/mapper/loop0p1
mount /dev/loop1 /mnt

grub-mkconfig / update-grub이이 볼륨에서 작동하게하려면 파티션 루프백 을 이미지 파일이 아닌 / dev 아래의 디스크 루프백에 연결해야합니다 .

fdisk를 사용하여 이미지를 분할 했으므로 msdos 스타일의 파티션 테이블 (일명 레이블)이 있고 BIOS를 사용하여 부팅합니다. stage1 / boot.img를 MBR에 넣는 것 외에도 stage1.5 / core.img는 바로 다음에 파티션되지 않은 공간 (!) 의 임베드 영역 에 배치되며 이에 대한 공간이 있어야합니다.

요령은 루프백 설정이 가상 머신의 BIOS 드라이브에 어떻게 매핑되는지 장치 맵을 통해 grub2 설치 프로그램에 알리는 것입니다. (grub1 레거시에서 이것은 쉘에서 직접 수행되었습니다). 이 이미지를 첫 번째 디스크로 부팅 할 계획이므로 적절한 매핑은 다음과 같습니다.

mkdir -p /mnt/boot/grub
cat > /mnt/boot/grub/device.map <<EOF
(hd0)   /dev/loop0
(hd0,1) /dev/loop1
EOF

부팅 디스크 구성 파일 grub.cfg를 생성 할 수 있도록 게스트 디스크 이미지 안에 장치 맵을 넣었습니다.

mount --bind /dev /mnt/dev
chroot /mnt grub-mkconfig -o /boot/grub/grub.cfg

(grub-pc 패키지의 설치 후 관리자는 장치 맵을 덮어 쓰는 프로브를 실행합니다 (!). 설치 후에 이를 작성하고 grub-mkconfig / update-grub을 직접 실행해야합니다).

이제 호스트 에서 설치 관리자를 실행하고 게스트 설치를 가리 킵니다.

grub-install --no-floppy --grub-mkdevicemap=/mnt/boot/grub/device.map --root-directory=/mnt /dev/loop0

마지막으로 이미지에서 qemu를 시작하기 전에 여기에 설정된 모든 것을 마운트 해제하십시오.

umount /mnt/dev
umount /mnt
losetup -d /dev/loop1
kpartx -v -d /dev/loop0

와우! 왜 마운트 루프 된 루트 이미지 파일을 업데이트 할 수 없는지 이해하려고 노력하면서 귀하의 답변에 부딪 쳤습니다. 이것이 이것이 내 문제에 적용될 수 있는지 살펴볼 것입니다. 그러나 그것은 확실히 흥미로운 트랙이며 매우 가치가 있습니다. 감사!
filofel

1
좋은 대답입니다. 불행히도 .img 디스크에 해당 문제에 대한 바이너리 chroot /mnt grub-mkconfig -o /boot/grub/grub.cfggrub-mkconfig없거나 /mnt이미 마운트되어 있기 때문에 실패합니다 . 단계별로 수행하고 모든 세부 사항 / 명령을 작성하면 좋을 것입니다.
Flavius

@ 롤 카우 :이 훌륭한 문서에 감사드립니다! 아래의 toh의 수정과 함께 chroot 된 환경에서 임베드 할 때 grub과 관련된 많은 문제를 해결했습니다.
sparkie

1
losetup -P단일 파티션 설치의 또 다른 좋은 방법은 다음과 같습니다 stackoverflow.com/a/15200862/895245
치로 틸리가新疆改造中心法轮功六四事件

나는 얻고있다 : /usr/sbin/grub-probe: warning: the device.map entry 'hd0,1' is invalid. Ignoring it. Please correct or delete your device.map.그래서이 대답은 쓸모가 없습니다.
Calmarius

11

이러한 설명에 감사드립니다. 다음 수정 (귀하의 표기법 / 변수로 번역)을 사용하여 솔루션을 내 스크립트에 통합했습니다.

modprobe dm_mod
kpartx -va /root/rootfs.img # *.img is setup elsewhere
# normally you now would mount /dev/loop0p1 directly. BUT
# grub specialists didn't manage to work with loop partitions other than /dev/loop[0-9]
losetup -v -f --show /dev/mapper/loop0p1
mount /dev/loop1 /mnt
mkdir -p /mnt/boot/grub

# change into chrooted environment. all remaining work will be done from here. this differs from the howto above.
LANG=C chroot /mnt /bin/bash
set -o vi
mount -t sysfs sysfs /sys
mount -t proc  proc  /proc
# avoid grub asking questions
cat << ! | debconf-set-selections -v
grub2   grub2/linux_cmdline                select   
grub2   grub2/linux_cmdline_default        select   
grub-pc grub-pc/install_devices_empty      select yes
grub-pc grub-pc/install_devices            select   
!
apt-get -y install grub-pc
# don't setup device.map prior to this point. It will be overwritten by grub-pc install
#corrected the /mnt/boot/grub/device.map to /boot/grub/device.map
cat > /boot/grub/device.map << !
(hd0)   /dev/loop0
(hd0,1) /dev/loop1
!
# install here to fill /boot/grub for grub-mkconfig (update-grub)
grub-install /dev/loop0
# generate /boot/grub/grub.cfg
update-grub

이것은 적어도 데비안 스퀴즈에서 작동합니다. 올바른지 '/boot/grub/grub.cfg'를 확인하십시오.


1
cat > /mnt/boot/grub/device.mapchroot 환경에서 해야합니까 ? 그렇다면 경로는이어야합니다 /boot/grub/device.map.
cbliard 2019

0

다음은 GRUB을 QEMU 디스크 이미지에 수동으로 설치하고 부팅하는 방법에 대한 간단한 설명입니다. grub.cfg를 사용하여 다음 단계로 진행하지는 않았지만이 기본 설정이 완료되면 꽤 간단하다고 가정합니다.

가정 :

  • 'grub-install --version'은 "grub-install (GRUB) 2.02 ~ beta2-36ubuntu3.2"입니다.
  • 'qemu-system-x86_64 --version'은 "QEMU 에뮬레이터 버전 2.5.0 (Debian 1 : 2.5 + dfsg-5ubuntu10.6), 저작권 (c) 2003-2008 Fabrice Bellard"입니다.
  • 현재 디렉토리에 "disk1"이라는 디스크 이미지
  • / dev / loop0에는 "Disklabel type : dos"가 있습니다 (예 : fdisk 사용).
  • / dev / loop0p1은 이미 ext4로 포맷 된 부팅 가능한 파티션입니다

이것이 GRUB 메뉴에서 qemu를 부팅하는 방법입니다.

    # losetup -fP disk1
    # ls /dev/loop0*
    /dev/loop0  /dev/loop0p1  /dev/loop0p2  /dev/loop0p3
    # mount /dev/loop0p1 /mnt
    # cat > loop0device.map <<EOF
    (hd0) /dev/loop0
    EOF
    # grub-install --no-floppy --grub-mkdevicemap=loop0device.map \
    --modules="part_msdos" --boot-directory=/mnt /dev/loop0 -v
    # umount /mnt
    # losetup -d /dev/loop0
    # qemu-system-x86_64 -m 512 -curses -hda disk1 -enable-kvm

그런 다음 GRUB 쉘이 나타납니다.

                        GNU GRUB  version 2.02~beta2-36ubuntu3.2

       Minimal BASH-like line editing is supported. For the first word, TAB
       lists possible command completions. Anywhere else TAB lists possible
       device or file completions.


    grub> ls
    (hd0) (hd0,msdos3) (hd0,msdos2) (hd0,msdos1) (fd0)
    grub>

커널과 램 디스크를 / dev / loop0p1에 복사 한 경우 부팅 할 수 있습니다.

    grub> linux (hd0,msdos1)/vmlinuz
    grub> initrd (hd0,msdos1)/initrd
    grub> boot

그리고 여기에 기본 Linux 쉘이 있습니다 (이 경우 / sbin / init를 사용할 수 없기 때문에)

    BusyBox v1.22.1 (Ubuntu 1:1.22.0-15ubuntu1) built-in shell (ash)
    Enter 'help' for a list of built-in commands.

    (initramfs)
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.