Benutzerdefiniertes Raspbian-Image kann nicht mit "Kein Init gefunden" gestartet werden.

10

Ich erstelle ein benutzerdefiniertes SD-Image von Raspbian mit Debootstrap, und das resultierende Image kann nicht Kernel panic - not syncing: No init found.sowohl auf meinem Raspberry Pi als auch unter Qemu gestartet werden. Ich kann das 2012-07-15-wheezy-raspbian- Image auf beiden erfolgreich booten (obwohl mit einer anderen SD-Karte auf dem Pi). Für qemu verwende ich den Kernel von 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)

Das Hinzufügen init=/bin/bashzur Kernel-Befehlszeile hilft nicht:

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.

Mein Bild enthält eine /bootund /Partition, und scheint die richtigen Dinge zu enthalten:

% 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

Der SHA1-Hash von /sbin/initin meinem Bild stimmt sogar mit dem des 2012-07-15-wheezy-raspbian-Bildes überein.

Dies ist mein Skript und das Bild kann hier heruntergeladen werden .

#!/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
mgorven
quelle
Interessant. Das einzige, woran ich denken kann, ist, dass init nicht für dieselbe Architektur wie der Kernel kompiliert wurde.
Jivings
1
@ Jivings Der SHA1-Hash von mir /sbin/initstimmt mit der Datei im offiziellen Raspbian-Bild
überein
Alles was beweist ist, dass Ihr Init derselbe ist wie der Beamte. Das habe ich nicht gesagt. Der Kernel könnte mit verschiedenen Flags kompiliert worden sein
Jivings
@ Jivings Oh, richtig. Soweit ich weiß, ist der Kernel bei der Verwendung von Qemu extern, das ist also dasselbe und das offizielle Image funktioniert.
mgorven
Wie ist Ihr cmdline.txtVergleich mit dem der Stiftung?
Alex Chamberlain

Antworten:

5

Das Problem war, dass der rsync aus dem Build-Verzeichnis in das Image nicht Geräte und spezielle Dateien kopierte und nicht genügend Dateiattribute beibehielt. Insbesondere musste ich die hinzuzufügen --archive, --devicesund --specialsOptionen, so dass nun der Befehl wie folgt aussehen:

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

Es bootet jetzt gut unter Qemu.

mgorven
quelle
Wirst du das aufschreiben? Es wäre großartig als selbst beantwortete Frage; Wie erstelle ich ein benutzerdefiniertes Raspbian-Image?
Alex Chamberlain
Wäre es nicht besser, ein Blog darüber zu erstellen, wie ein benutzerdefiniertes Bild erstellt wird, als dies in einer Antwort zu tun? Ich bin sicher, dass es nicht ein paar Codezeilen sein werden.
Piotr Kula
@AlexChamberlain Ich werde versuchen, die Zeit dafür zu finden.
mgorven
Ich habe das Arbeitsskript in meinem Blog veröffentlicht .
mgorven
0

In dieser Fehlermeldung werden Sie nach einem initramfs gefragt , um Ihr Root-Dateisystem bereitzustellen. Ich denke, Sie haben einen falschen Treiber oder eine falsche Funktion hinzugefügt oder entfernt und der Kernel kann nicht richtig booten. Dies erklärt auch, warum ein offizielles Image normal bootet.

Wenn dies wirklich das Problem ist, haben Sie zwei Möglichkeiten:

  1. Finden Sie heraus, welcher Treiber oder welche Funktion entfernt wurde, und legen Sie sie zurück. Stellen Sie außerdem sicher, dass Sie NICHT als Modul maskieren, sondern das Hauptkernel-Image integrieren. Ich empfehle dieses.
  2. Erstellen Sie ein initramfs. Zu viel Mühe, tu das nicht.
Willian Paixao
quelle