1

I'm trying to setup a ramdisk for a setup I have with AT91SAM9261 and 2.6.30 kernel. I know you would say why don't I use initramfs? I will use also that one, as of now I would like to check if I can boot with a ramdisk as rootfs.

I have already a root fs running fine on this system in jffs2 format. I used below tutorial:

http://www.ibm.com/developerworks/library/l-initrd/

So I created the ramdisk directly on the embedded target, with 4MB size. I used "dd" and "mkefs" and the ramdisk image works fine if I mount it as loop when rootfs is my jffs2. I can browse mount_point and do stuff inside. The content was created according to the section "Manually building initial RAM disk" in the above link.

In /dev I placed null and console, in /bin I copied busybox and created the links. I set the execute attribute to init script as well, which works fine when I run it here (as loop device with jffs2 as rootfs)

In my kernel config I enabled ramdisk support as follows:

CONFIG_BLK_DEV_INITRD=y
CONFIG_RD_GZIP=y

CONFIG_BLK_DEV_RAM=y
CONFIG_BLK_DEV_RAM_COUNT=16
CONFIG_BLK_DEV_RAM_SIZE=4096

Using tftp I download the ramdisk image to 0x21100000. At 0x20008000 I have the kernel uncompressed and at 0x22000000 the zImage copied.

However, I'm not able to boot successfully the system as it hangs when checking init process. As I mentioned, I checked several times that my init can be executed,

I also used in the bootargs init=/bin/busybox or other scripts/binaries to check if any can be used as init.

Command line I use now:

bootargs=64M console=ttyS0,115200 root=/dev/ram0 rw initrd=0x21100000,4194304 init=/init

For some I set ownership to "nobody" just to check if it makes any difference. As it can be seen in the log output the ramdisk is mounted, but init fails. It gives a warning to check the ext2 image, which I did before copying it and I have no error reported.

The tftp server is on Windows7. I though I might have some incompatibility if I copy the ramdisk image from linux to Windows then do tftp from Windows server. So I copied the image again from Windows to linux, mounted it and checked if the FS reports any error and scripts can be executed - everything looks normal.

So I do have all files in place, attributes set, ramdisk is reported as being mounted ok as rootfs, but init cannot be found.

 Uncompressing Linux......................................................................................................... done, booting the kernel.
Linux version 2.6.30-olimex (mishu@KubuntuVM) (gcc version 4.3.3 (Sourcery G++ Lite 2009q1-203) ) #1 Mon Dec 29 13:53:54 CET 2014
CPU: ARM926EJ-S [41069265] revision 5 (ARMv5TEJ), cr=00053177
CPU: VIVT data cache, VIVT instruction cache
Machine: Olimex SAM9-L9261
Ignoring unrecognised tag 0x54410008
Memory policy: ECC disabled, Data cache writeback
Clocks: CPU 198 MHz, master 99 MHz, main 18.432 MHz
Built 1 zonelists in Zone order, mobility grouping on.  Total pages: 16256
Kernel command line: 64M console=ttyS0,115200 root=/dev/ram0 rw initrd=0x21100000,4194304 init=/init
NR_IRQS:192
AT91: 96 gpio irqs in 3 banks
PID hash table entries: 256 (order: 8, 1024 bytes)
Console: colour dummy device 80x30
console [ttyS0] enabled
Dentry cache hash table entries: 8192 (order: 3, 32768 bytes)
Inode-cache hash table entries: 4096 (order: 2, 16384 bytes)
Memory: 64MB = 64MB total
Memory: 57384KB available (2924K code, 246K data, 132K init, 0K highmem)
Calibrating delay loop... 99.12 BogoMIPS (lpj=495616)
Mount-cache hash table entries: 512
CPU: Testing write buffer coherency: ok
net_namespace: 716 bytes
NET: Registered protocol family 16
AT91: Power Management
AT91: Starting after user reset
bio: create slab <bio-0> at 0
SCSI subsystem initialized
usbcore: registered new interface driver usbfs
usbcore: registered new interface driver hub
usbcore: registered new device driver usb
NET: Registered protocol family 2
IP route cache hash table entries: 1024 (order: 0, 4096 bytes)
TCP established hash table entries: 2048 (order: 2, 16384 bytes)
TCP bind hash table entries: 2048 (order: 1, 8192 bytes)
TCP: Hash tables configured (established 2048 bind 2048)
TCP reno registered
NET: Registered protocol family 1
Trying to unpack rootfs image as initramfs...
rootfs image is not initramfs (junk in compressed archive); looks like an initrd
Freeing initrd memory: 4096K
NetWinder Floating Point Emulator V0.97 (double precision)
JFFS2 version 2.2. (NAND) (SUMMARY)  © 2001-2006 Red Hat, Inc.
msgmni has been set to 120
io scheduler noop registered
io scheduler anticipatory registered (default)
atmel_lcdfb atmel_lcdfb.0: backlight control is not available
atmel_lcdfb atmel_lcdfb.0: 225KiB frame buffer at 23140000 (mapped at ffc00000)
Console: switching to colour frame buffer device 40x30
atmel_lcdfb atmel_lcdfb.0: fb0: Atmel LCDC at 0x00600000 (mapped at c4866000), irq 21
atmel_usart.0: ttyS0 at MMIO 0xfefff200 (irq = 1) is a ATMEL_SERIAL
atmel_usart.1: ttyS1 at MMIO 0xfffb0000 (irq = 6) is a ATMEL_SERIAL
brd: module loaded
loop: module loaded
ssc ssc.1: Atmel SSC device at 0xc4878000 (irq 15)
Driver 'sd' needs updating - please use bus_type methods
dm9000 Ethernet Driver, V1.31
eth0 (dm9000): not using net_device_ops yet
eth0: dm9000e at c486a000,c486e044 IRQ 107 MAC: 3a:1f:34:08:54:64 (chip)
NAND device: Manufacturer ID: 0xec, Chip ID: 0xdc (Samsung NAND 512MiB 3,3V 8-bit)
Scanning device for bad blocks
Bad eraseblock 1478 at 0x00000b8c0000
Creating 2 MTD partitions on "atmel_nand":
0x000000000000-0x000000040000 : "Partition 1"
0x000000040000-0x000020000000 : "Partition 2"
atmel_spi atmel_spi.0: Atmel SPI Controller at 0xfffc8000 (irq 12)
ohci_hcd: USB 1.1 'Open' Host Controller (OHCI) Driver
at91_ohci at91_ohci: AT91 OHCI
at91_ohci at91_ohci: new USB bus registered, assigned bus number 1
at91_ohci at91_ohci: irq 20, io mem 0x00500000
usb usb1: New USB device found, idVendor=1d6b, idProduct=0001
usb usb1: New USB device strings: Mfr=3, Product=2, SerialNumber=1
usb usb1: Product: AT91 OHCI
usb usb1: Manufacturer: Linux 2.6.30-olimex ohci_hcd
usb usb1: SerialNumber: at91
usb usb1: configuration #1 chosen from 1 choice
hub 1-0:1.0: USB hub found
hub 1-0:1.0: 2 ports detected
Initializing USB Mass Storage driver...
usbcore: registered new interface driver usb-storage
USB Mass Storage support registered.
udc: at91_udc version 3 May 2006
g_serial gadget: Gadget Serial v2.4
g_serial gadget: g_serial ready
mice: PS/2 mouse device common for all mice
input: gpio-keys as /class/input/input0
ads7846 spi0.2: touchscreen, irq 29
input: ADS784x Touchscreen as /class/input/input1
rtc-at91sam9 at91_rtt.0: rtc core: registered at91_rtt as rtc0
IRQ 1/rtc0: IRQF_DISABLED is not guaranteed on shared IRQs
rtc-at91sam9 at91_rtt.0: rtc0: SET TIME!
i2c /dev entries driver
i2c-gpio: probe of i2c-gpio failed with error -16
Registered led device: led1
Registered led device: led2
Registered led device: led3
Advanced Linux Sound Architecture Driver Version 1.0.20.
at73c213 spi0.3: at73c213: supported bitrate is 48500 (64 divider)
usb 1-1: new full speed USB device using at91_ohci and address 2
usb 1-1: New USB device found, idVendor=0457, idProduct=0151
usb 1-1: New USB device strings: Mfr=0, Product=2, SerialNumber=3
usb 1-1: Product: USB Mass Storage Device
usb 1-1: SerialNumber: 8d54bd8186b42c
usb 1-1: configuration #1 chosen from 1 choice
scsi0 : SCSI emulation for USB Mass Storage devices
ALSA device list:
  #0: SAM9-L9261 external DAC on irq 15
TCP cubic registered
NET: Registered protocol family 17
RPC: Registered udp transport module.
RPC: Registered tcp transport module.
rtc-at91sam9 at91_rtt.0: hctosys: unable to read the hardware clock
RAMDISK: ext2 filesystem found at block 0
RAMDISK: Loading 4096KiB [1 disk] into ram disk... done.
EXT2-fs warning: mounting unchecked fs, running e2fsck is recommended
VFS: Mounted root (ext2 filesystem) on device 1:0.
Freeing init memory: 132K
Failed to execute /init.  Attempting defaults...
Kernel panic - not syncing: No init found.  Try passing init= option to kernel.
[<c002f414>] (unwind_backtrace+0x0/0xdc) from [<c025bd34>] (panic+0x40/0x110)
[<c025bd34>] (panic+0x40/0x110) from [<c0029500>] (init_post+0xd0/0xf8)
[<c0029500>] (init_post+0xd0/0xf8) from [<c00085a0>] (kernel_init+0xbc/0xe4)
[<c00085a0>] (kernel_init+0xbc/0xe4) from [<c0041998>] (do_exit+0x0/0x5ac)
[<c0041998>] (do_exit+0x0/0x5ac) from [<00000001>] (0x1)

I plan to rebuild busybox and try again, but as my current ramdisk image works when I mount it as loop I don't have too much confidence it will change something. I'm out of ideas. I've been trying the whole day to get this working.

Help is much appreciated.

Thanks.

mdaniel
  • 191
  • 1
  • 12
  • 1
    *Failed to execute /init. Attempting defaults...*; try to create a symlink from `/init` to your busybox. It can also be that the libraries are not placed properly and you have no */dev/ttyS0* which you set as the console. From the *JFFS2* partition do a `chroot` of */bin/sh* (to mimic a clean boot environment). Related question: [Details on ARM linux boot](http://stackoverflow.com/questions/27607496/some-details-on-arm-linux-boot) – artless noise Dec 30 '14 at 22:34
  • @artlessnoise you can add your reply as answer so that I can mark it. I had the ttyS0 file created and also a simlink to busybox from init, but this busybox was compiled dinamically and the libs were not copied by me. However, after checking the dependencies with objdump as ldd was not installed, I copied all libs(and the symlinks: libm.so.6 libgcc_s.so.1 libc.so.6) and still I couldn't run chroot on any command inside /bin So I copied all libs found on my default jffs2 /lib and now it's working fine. Didn't check which of them was actually missing. – mdaniel Jan 05 '15 at 14:50
  • Another point for which I have no answer, perhaps I shall open a new thread (?) is regarding the ramdisk created with the busybox compiled by me. I have the "su" applet included but whenever I try to run it after the ramdisk is mounted as rootfs I get the following: "su: unknown user root" Busybox binary has the +s bit set and there is a symlink from su to busybox: -rwsr-sr-x 1 1000 1000 7 Jan 4 2015 su->busybox lrwxrwxrwx 1 1000 1000 1912608 Jan 4 2015 busybox – mdaniel Jan 05 '15 at 14:56
  • Just found the answer to my previous question regarding: unknown user root. I have added /etc/passwd file and this solved the issue. – mdaniel Jan 06 '15 at 13:24

1 Answers1

1

Missing libraries were the root cause for the non-executable init placed on the ramdisk. Using chroot turned out to be extremely useful. With this issue I learned how to use chroot and simulate a jail.

Another trick was to use user_debug=31 in the command line so that the kernel will output a message saying that the file is not found. It looks like the "file not found" does not really point to a missing file, but to a failure to read the file system due to busybox not executing properly (missing libraries).

In parallel I have compiled dynamically the busybox 1.20.02 for my arm architecture and the ramdisk worked properly (without libs). This user_debug=31 turned out to be again useful when I compiled and ran busybox, as it was also failing after mounting the ramdisk, but it thrown out an "undefined exception" which led me to a wrong "arch" value used for compiling busybox. After changing it everything was fine.

artless noise
  • 21,212
  • 6
  • 68
  • 105
mdaniel
  • 191
  • 1
  • 12