"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.