"no init found"로 사용자 정의 라즈 비안 이미지가 부팅되지 않습니다


11

debootstrap을 사용하여 Raspbian의 사용자 정의 SD 이미지를 작성하고 있는데 결과 이미지가 Kernel panic - not syncing: No init found.Raspberry Pi와 qemu에서 모두 부팅되지 않습니다 . Pi의 다른 SD 카드를 사용하더라도 2012-07-15-wheezy-raspbian 이미지를 모두 성공적으로 부팅 할 수 있습니다 . qemu의 경우 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)

init=/bin/bash커널 명령 줄에 추가 해도 도움이되지 않습니다.

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.

내 이미지에는 /boot및 /파티션이 포함되어 있으며 올바른 내용이 포함 된 것 같습니다.

% 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

/sbin/init내 이미지 의 SHA1 해시 는 2012-07-15-wheezy-raspbian 이미지 의 SHA1 해시 와 일치합니다.

이것은 내 스크립트이며 이미지는 여기에서 다운로드 할 수 있습니다 .

#!/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

흥미 롭군 내가 생각할 수있는 유일한 것은 init가 커널과 동일한 아키텍처로 컴파일되지 않았다는 것입니다.
— Jivings

1
@Jivings 내 SHA1 해시 /sbin/init는 공식 라즈 비안 이미지의 파일과 일치합니다.
— mgorven

증명할 수있는 것은 당신의 init가 공식과 동일하다는 것입니다. 그것은 내가 말한 것이 아닙니다. 커널은 다른 플래그로 컴파일되었을 수 있습니다
— Jivings

@Jivings 아, 맞아. Qemu를 사용할 때 커널이 외부에 있다는 것을 이해하면 동일하며 공식 이미지가 작동합니다.
— mgorven

cmdline.txt재단과 어떻게 비교합니까?
— Alex Chamberlain

답변:


5

문제는 빌드 디렉토리에서 이미지로의 rsync가 장치 및 특수 파일을 복사하지 않았고 충분한 파일 속성을 보존하지 않았다는 것입니다. 특히, 내가 추가하는 데 필요한 --archive, --devices그리고 --specials명령이 다음과 같아야하므로, 옵션 :

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

이제 Qemu에서 제대로 부팅됩니다.


이거 쓰시 겠어요? 그것은 스스로 대답하는 질문으로 좋을 것입니다. 커스텀 Raspbian 이미지는 어떻게 빌드합니까?
— Alex Chamberlain

답변에서 이미지를 만드는 대신 사용자 정의 이미지를 만드는 방법에 대한 블로그를 만드는 것이 낫지 않습니까? 나는 그것이 몇 줄의 코드가 아닐 것이라고 확신합니다.
— Piotr Kula

@AlexChamberlain 나는 그것을 할 시간을 찾으려고 노력할 것이다.
— mgorven

블로그에 작업 스크립트 를 게시했습니다 .
— mgorven

0

이 오류 메시지는 루트 파일 시스템을 마운트하기 위해 initramfs 를 요청 합니다. 잘못된 드라이버 나 기능을 추가 또는 제거했는데 커널이 제대로 부팅되지 않는 것 같습니다. 또한 공식 이미지가 정상적으로 부팅되는 이유를 설명합니다.

이것이 실제로 문제라면 두 가지 옵션이 있습니다.

  1. 제거 된 드라이버 또는 기능을 찾아서 다시 넣으십시오. 또한 모듈로 마스크하지 말고 기본 커널 이미지에 내장되어 있습니다. 나는 이것을 추천합니다.
  2. initramfs를 작성하십시오. 너무 번거롭지 마
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.