วิธีการติดตั้งด้วงในไฟล์. img


26

ฉันทำต่อไปนี้:

  1. สร้างไฟล์. img ว่างด้วย dd
  2. เชื่อมโยงกับ / dev / loop0 กับ losetup
  3. สร้างพาร์ติชันในนั้นด้วย fdisk
  4. จัดรูปแบบพาร์ติชันดังกล่าวด้วย mke2fs
  5. คัดลอกระบบ GNU / Linux ที่กำหนดเองไปยังพาร์ติชั่นนั้น

ตอนนี้ฉันต้องการทำให้ไฟล์. img ที่สามารถบู๊ตได้โดยติดตั้งด้วงลงใน MBR และ / boot directory เป้าหมายของฉันคือการโหลดไฟล์. img ด้วย qemu มันจะดีกว่าถ้าใช้ grub2 แทน grub legacy

ขอบคุณ


คำตอบ:


24

นี่คือกับรุ่นด้วงพีซี 1.98 + 20100804-5ubuntu3 (ไม่ฝักใฝ่ฝ่ายใดเมียร์แคต)

ตัวติดตั้ง 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- style (label label) และบูตโดยใช้ BIOS นอกเหนือจากการวาง stage1 / boot.img ใน MBR แล้ว stage1.5 / core.img จะถูกวางในพื้นที่ฝังในพื้นที่ที่ไม่มีการแบ่งพาร์ติชัน (!) หลังจากนี้และต้องมีพื้นที่สำหรับสิ่งนี้

เคล็ดลับคือบอกตัวติดตั้ง grub2 ผ่านแผนที่อุปกรณ์ว่าการตั้งค่าลูปแบ็คของคุณจะแมปกับไดรฟ์ BIOS ในเครื่องเสมือนอย่างไร (ใน 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

(ระวังว่า post-installer ของแพ็คเกจ grub-pc จะเรียกใช้โพรบที่เขียนทับ map map (!) ดังนั้นคุณจะต้องเขียนมันหลังจากการติดตั้งและรัน 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

ว้าว! ฉันวิ่งเข้าไปหาคำตอบของคุณในขณะที่พยายามเข้าใจว่าทำไมฉันไม่สามารถอัปเดตไฟล์ภาพเมานต์แบบ chrooted ได้ ฉันจะดูว่าสิ่งนี้สามารถนำไปใช้กับปัญหาของฉัน แต่นั่นเป็นเส้นทางที่น่าสนใจและคุ้มค่ากับการลงคะแนนของฉัน ขอบคุณ!
filofel

1
คำตอบที่ดีน่าเสียดายที่chroot /mnt grub-mkconfig -o /boot/grub/grub.cfgล้มเหลวเพราะไม่มีgrub-mkconfigหรือไบนารีใด ๆ สำหรับเรื่องนั้นในดิสก์. img และ/mntติดตั้งแล้ว มันจะดีถ้าคุณทำตามขั้นตอนและเขียนรายละเอียด / คำสั่งทั้งหมด
Flavius

@RolKau: ขอบคุณสำหรับเอกสารที่ยอดเยี่ยมนี้! เมื่อรวมกับการดัดแปลงของ toh ด้านล่างมันแก้ปัญหาหลายอย่างที่ฉันมีมานานหลายปีกับด้วงเมื่อฝังจากภายในสภาพแวดล้อมที่ chrooted
sparkie

1
losetup -Pเป็นอีกหนึ่งวิธีที่ดีของการติดตั้งพาร์ทิชันเดียว: stackoverflow.com/a/15200862/895245
Ciro Santilli新疆改造中心法轮功六四事件

ฉันเข้าใจแล้ว: /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.mapจะทำในสภาพแวดล้อมที่ chrooted? /boot/grub/device.mapถ้าเป็นเช่นนั้นเส้นทางที่ควรจะเป็น
cbliard

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 (เดเบียน 1: 2.5 + dfsg-5ubuntu10.6) ลิขสิทธิ์ (c) 2003-2551 Fabrice Bellard"
  • ดิสก์อิมเมจชื่อ "disk1" ในไดเรกทอรีปัจจุบัน
  • / dev / loop0 มี "ประเภท Disklabel: dos" (เช่นกับ fdisk)
  • / dev / loop0p1 เป็นพาร์ติชันที่สามารถบู๊ตได้ซึ่งมีรูปแบบเป็น ext4 อยู่แล้ว

นี่คือวิธีที่ฉันบูท qemu ในเมนู GRUB:

    # 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

จากนั้นด้วงเชลล์จะเกิดขึ้น:

                        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>

หากคุณคัดลอกเคอร์เนลและดิสก์ RAM ไปยัง / 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.