Hình ảnh Raspbian tùy chỉnh không khởi động được với không tìm thấy init


10

Tôi đang xây dựng hình ảnh SD tùy chỉnh của Raspbian bằng debootstrap và hình ảnh kết quả không khởi động được Kernel panic - not syncing: No init found.trên cả Raspberry Pi của tôi và dưới qemu. Tôi có thể khởi động thành công hình ảnh 2012 / 07-15-wheezy-raspbian trên cả hai (mặc dù với một thẻ SD khác trên Pi). Đối với qemu tôi đang sử dụng kernel từ XEC Design .

% qemu-system-arm -M versatilepb -cpu arm1136 -kernel /usr/local/share/qemu/kernel-qemu -m 256 -drive file=raspbian3.img -serial stdio -append "dwc_otg.lpm_enable=0 console=ttyAMA0,115200 kgdboc=tty1,115200 console=tty1 root=/dev/sda2 elevator=noop"
...
EXT3-fs (sda2): error: couldn't mount because of unsupported optional features (240)
EXT2-fs (sda2): error: couldn't mount because of unsupported optional features (240)
EXT4-fs (sda2): mounted filesystem with ordered data mode. Opts: (null)
VFS: Mounted root (ext4 filesystem) readonly on device 8:2.
devtmpfs: mounted
Freeing init memory: 132K
Kernel panic - not syncing: No init found.  Try passing init= option to kernel. See Linux Documentation/init.txt for guidance.
[<c001a1cc>] (unwind_backtrace+0x0/0xf0) from [<c037ada0>] (panic+0x58/0x180)
[<c037ada0>] (panic+0x58/0x180) from [<c000857c>] (init_post+0x7c/0xcc)
[<c000857c>] (init_post+0x7c/0xcc) from [<c0475834>] (kernel_init+0xec/0x11c)

Thêm init=/bin/bashvào dòng lệnh kernel không giúp đỡ:

Failed to execute /bin/bash.  Attempting defaults...
Kernel panic - not syncing: No init found.  Try passing init= option to kernel. See Linux Documentation/init.txt for guidance.

Hình ảnh của tôi chứa một /boot/phân vùng, và dường như chứa những điều đúng:

% fdisk -l raspbian3.img

Disk raspbian3.img: 499 MB, 499999744 bytes
255 heads, 63 sectors/track, 60 cylinders, total 976562 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00000000

        Device Boot      Start         End      Blocks   Id  System
raspbian3.img1   *        1024      132095       65536    c  W95 FAT32 (LBA)
raspbian3.img2          132096      976561      422233   83  Linux

% mount | grep raspbian
/dev/mapper/loop1p2 on /tmp/raspbian type ext4 (rw)
/dev/mapper/loop1p1 on /tmp/raspbian/boot type vfat (rw)

% ls /tmp/raspbian/
bin  boot  dev  etc  home  lib  lost+found  media  mnt  opt  proc  root  run  sbin  selinux  srv  sys  tmp  usr  var
% ls /tmp/raspbian/boot
arm128_start.elf  arm224_start.elf  bootcode.bin  config.txt          kernel_emergency.img  loader.bin
arm192_start.elf  arm240_start.elf  cmdline.txt   kernel_cutdown.img  kernel.img            start.elf
% ls /tmp/raspbian/sbin/*init*
/tmp/raspbian/sbin/init
% ls /tmp/raspbian/bin/*sh*
/tmp/raspbian/bin/bash  /tmp/raspbian/bin/dash

Hàm băm SHA1 /sbin/inittrong hình ảnh của tôi thậm chí khớp với hình ảnh của năm 2012-07-15-wheezy-raspbian.

Đây là kịch bản của tôi và hình ảnh có thể được tải xuống ở đây .

#!/bin/sh
set -ev

# Author: Michael Gorven <http://michael.gorven.za.net/>

IMAGE="${1?Please specify output image name.}"
IMAGE_SIZE=500
BOOT_SIZE=64
ALIGN_SECTORS=1024
ALIGN_FSBLOCKS="$(($ALIGN_SECTORS*512/4096))"
MIRROR="http://mirrordirector.raspbian.org/raspbian"
PACKAGES="openssh-server sudo ntp fake-hwclock"

bootstrap() {
    if [ ! "$BUILDROOT" ]; then
        echo "BUILDROOT is empty, aborting."
        exit 1
    fi

    qemu-debootstrap --arch=armhf --keyring=~/.gnupg/pubring.gpg wheezy "$BUILDROOT" "$MIRROR"
}

configure() {
    if [ ! "$BUILDROOT" ]; then
        echo "BUILDROOT is empty, aborting."
        exit 1
    fi

    cat > "$BUILDROOT/etc/apt/sources.list" <<-EOF
    deb http://mirrordirector.raspbian.org/raspbian/ wheezy main contrib non-free rpi
    EOF

    cat > "$BUILDROOT/etc/apt/sources.list.d/mene.list" <<-EOF
    deb http://archive.mene.za.net/raspbian wheezy contrib
    EOF

    cat > "$BUILDROOT/etc/apt/sources.list.d/raspi.list" <<-EOF
    deb http://archive.raspberrypi.org/debian/ wheezy main untested
    EOF

    if [ "$http_proxy" ]; then
        cat > "$BUILDROOT/etc/apt/apt.conf.d/30proxy" <<-EOF
        Acquire::http::proxy "$http_proxy";
        EOF
    fi

    wget -O- http://archive.raspberrypi.org/debian/raspberrypi.gpg.key | chroot "$BUILDROOT" apt-key add -
    wget -O- http://archive.mene.za.net/key.asc | chroot "$BUILDROOT" apt-key add -

    chroot "$BUILDROOT" apt-get --yes update
    chroot "$BUILDROOT" apt-get --yes install raspberrypi-bootloader libraspberrypi-bin $PACKAGES
    chroot "$BUILDROOT" apt-get --yes clean

    cp "$BUILDROOT/boot/arm128_start.elf" "$BUILDROOT/boot/start.elf"

    cat > "$BUILDROOT/boot/config.txt" <<-EOF
    disable_overscan=1
    EOF

    cat > "$BUILDROOT/boot/cmdline.txt" <<-EOF
    dwc_otg.lpm_enable=0 console=ttyAMA0,115200 kgdboc=ttyAMA0,115200 console=tty1 root=/dev/mmcblk0p2 rootfstype=ext4 elevator=deadline rootwait
    EOF

    chroot "$BUILDROOT" adduser --disabled-password --gecos 'rpi,,,,' rpi
    echo 'rpi:rpi' | chroot "$BUILDROOT" chpasswd
    chroot "$BUILDROOT" adduser rpi sudo
    chroot "$BUILDROOT" adduser --disabled-login --shell /bin/false --gecos 'XBMC,,,' xbmc

    cat >> "$BUILDROOT/etc/network/interfaces" <<-EOF
    auto eth0
    iface eth0 inet dhcp
    EOF

    echo "xbmc" > "$BUILDROOT/etc/hostname"

    cat > "$BUILDROOT/etc/fstab" <<-EOF
    /dev/mmcblk0p1  /boot   vfat    defaults    0   0
    /dev/mmcblk0p2  /       ext4    errors=remount-ro,noatime,nodiratime    0   0
    EOF

    cat >> "$BUILDROOT/etc/modules" <<-EOF
    vchiq
    snd_bcm2835
    EOF
}

mkimage() {
    dd if=/dev/zero of="$IMAGE" bs=1MB count=0 seek="$IMAGE_SIZE"
    cat | sfdisk --quiet --unit S --force "$IMAGE" <<-EOF
    $ALIGN_SECTORS,$(($BOOT_SIZE*2048)),c,*
    $(($ALIGN_SECTORS+$BOOT_SIZE*2048)),,L

    EOF

    LOOP="$(basename $(losetup -f))"
    kpartx -a "$IMAGE"
    BOOT="/dev/mapper/${LOOP}p1"
    ROOT="/dev/mapper/${LOOP}p2"

    mkfs.vfat -F 32 -n boot "$BOOT"
    mkfs.ext4 -b 4096 -E stride=$ALIGN_FSBLOCKS,stripe-width=$ALIGN_FSBLOCKS -m 1 -L root "$ROOT"

    MNT="$(mktemp -d --tmpdir raspbian.XXXXXX)"
    mount "$ROOT" "$MNT"
    mkdir "$MNT/boot"
    mount "$BOOT" "$MNT/boot"

    rsync -rtvPHAX "$BUILDROOT" "$MNT"

    umount "$MNT/boot"
    umount "$MNT"

    kpartx -d "$IMAGE"
}

BUILDROOT="$(mktemp -d $PWD/raspbian.XXXXXX)/root/"
bootstrap
configure
mkimage

Hấp dẫn. Điều duy nhất tôi có thể nghĩ là init không được biên dịch cho cùng một kiến ​​trúc như kernel.
Jivings

1
@Jivings Hàm băm SHA1 của tôi /sbin/initkhớp với tệp trong hình ảnh Raspbian chính thức ...
mgorven

Tất cả những gì chứng minh là init của bạn giống như chính thức. Đó không phải là những gì tôi nói. Hạt nhân có thể đã được biên dịch với các cờ khác nhau
Jivings

@Jivings ơi, đúng rồi. Theo như tôi hiểu thì kernel là bên ngoài khi sử dụng Qemu, do đó, hình ảnh chính thức cũng vậy.
mgorven

Làm thế nào để bạn cmdline.txtso sánh với Foundation?
Alex Chamberlain

Câu trả lời:


5

Vấn đề là rsync từ thư mục xây dựng vào hình ảnh không sao chép thiết bị và các tệp đặc biệt và không bảo toàn đủ các thuộc tính tệp. Cụ thể, tôi cần thiết để thêm --archive, --devices--specialstùy chọn, do đó lệnh bây giờ trông như thế này:

rsync --archive --devices --specials --hard-links --acls --xattrs --sparse --verbose

Bây giờ nó khởi động tốt dưới Qemu.


Bạn sẽ viết nó lên? Nó sẽ là tuyệt vời như một câu hỏi tự trả lời; Làm cách nào để tạo một hình ảnh Raspbian tùy chỉnh?
Alex Chamberlain

Sẽ không tốt hơn để tạo một blog về cách tạo một hình ảnh tùy chỉnh thay vì làm nó trong một câu trả lời. Tôi chắc chắn rằng nó sẽ không phải là một vài dòng mã.
Piotr Kula

@AlexChamberlain Tôi sẽ cố gắng tìm thời gian để làm điều đó.
mgorven

Tôi đã đăng kịch bản làm việc trên blog của mình .
mgorven

0

Thông báo lỗi này đang yêu cầu một initramfs để gắn kết hệ thống tệp gốc của bạn. Tôi nghĩ rằng bạn đã thêm hoặc xóa trình điều khiển hoặc tính năng sai và kernel không thể khởi động đúng cách. Điều này cũng giải thích tại sao một hình ảnh chính thức khởi động bình thường.

Nếu đây thực sự là vấn đề, bạn có hai lựa chọn:

  1. Tìm trình điều khiển hoặc tính năng đã được gỡ bỏ và đưa nó trở lại. Cũng đảm bảo KHÔNG che dấu như một mô-đun, nhưng tích hợp nito hình ảnh hạt nhân chính. Tôi đề nghị cái này
  2. Tạo một initramfs. Quá nhiều rắc rối, đừng làm vậy.
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.