This blog post and anything that comes after this and is related to this is probably gonna be less like a tutorial and more like an attempt to keep a record of whatever I am doing/did as I have found the steps forgotten pretty much every time I tried repeating them.
DRAM: 512 MiB
Trying to boot from MMC1
U-Boot 2017.03-armbian (Mar 16 2017 - 14:23:25 +0600) Allwinner Technology
CPU: Allwinner H3 (SUN8I 1680)
Model: Xunlong Orange Pi Zero
DRAM: 512 MiB
MMC: SUNXI SD/MMC: 0
*** Warning - bad CRC, using default environment
Setting up a 720x576i composite-pal console (overscan 32x20)
Error: no valid bmp image at 66000000
In: serial
Out: vga
Err: vga
Net: phy interface0
eth0: ethernet@1c30000
Hit any key to stop autoboot: 0
6944 bytes read in 159 ms (42 KiB/s)
switch to partitions #0, OK
mmc0 is current device
Scanning mmc 0:1...
Found U-Boot script /boot/boot.scr
1884 bytes read in 147 ms (11.7 KiB/s)
## Executing script at 43100000
115 bytes read in 123 ms (0 Bytes/s)
5156878 bytes read in 633 ms (7.8 MiB/s)
4754656 bytes read in 620 ms (7.3 MiB/s)
Found legacy kernel configuration
35384 bytes read in 487 ms (70.3 KiB/s)
## Loading init Ramdisk from Legacy Image at 43300000 ...
Image Name: uInitrd
Image Type: ARM Linux RAMDisk Image (gzip compressed)
Data Size: 5156814 Bytes = 4.9 MiB
Load Address: 00000000
Entry Point: 00000000
Verifying Checksum ... OK
Loading Ramdisk to 49b15000, end 49ffffce ... OK
Starting kernel ...
[sun8i_fixup]: From boot, get meminfo:
Start: 0x40000000
Size: 512MB
ion_carveout reserve: 160m@0 256m@0 130m@1 200m@1
ion_reserve_select: ion chipid [0x2c00042!
ion_reserve_common: ion reserve: [0x57e00000, 0x60000000]!
Loading, please wait...
starting version 229
Begin: Loading essential drivers ... done.
Begin: Running /scripts/init-premount ... done.
Begin: Mounting root file system ... Begin: Running /scripts/local-top ... done.
Begin: Running /scripts/local-premount ... Scanning for Btrfs filesystems
done.
Begin: Will now check root file system ... fsck from util-linux 2.27.1
[/sbin/fsck.ext4 (1) -- /dev/mmcblk0p1] fsck.ext4 -a -C0 /dev/mmcblk0p1
/dev/mmcblk0p1: recovering journal
/dev/mmcblk0p1: clean, 4787/89584 files, 89637/358144 blocks
done.
done.
Begin: Running /scripts/local-bottom ... done.
Begin: Running /scripts/init-bottom ... done.
mount: mounting /run on /root/run failed: No such file or directory
testboard login: root
login[151]: root login on 'ttyS0'
~ #
Okay,lets get started. I love single board computers. I have various ones(mostly from China). I was formerly working in an R&D company and I was doing basic linux image building using various build systems there. Now,up untill a few days ago,I was quite happy with the build systems available but then I saw a wonderful video on how someone managed to boot linux with busybox in just 1 frigging second! Here is the video,
That got me thinking, hmm ,lets try that! First I will try to create a very basic filesystem and boot and will also enable wifi. Fast booting is for later experiments.
I chose Orange pi Zero as my guinea pig as I am playing with that board now.Its a pretty nice board with an Allwinner H2 quad core processor,512MB RAM and 10/100 ethernet and wifi! It costs about $6.99 in aliexpress(mine was twice as much as I bought it from a local source).
Alright,so the first step was to boot obviously.So,I downloaded the latest u-boot source and tried to build it for orange pi zero(u-boot has defconfig for this board so I didnt have to write my own) and volla! it failed. It was a gcc issue.I am running Ubuntu 16.04 and the default gcc version is 5.4.0(same for the arm-linux-gnueabihf-gcc I used) and u-boot and linux build for Allwinner boards doesnt go well with that.
Then after some other random attempts,I tried another weird idea. I saw this link where they ran OpenWrt on that board using kernel and u-boot from Armbian build system.
So I thought,lets try it this way first.But, my requirement is a very basic filesystem with thing that I need only.For now, that is just wifi and dropbear with scp support.Now I am using u-boot and kernel from Armbian with all the drivers(I will load whatever I want).
For doing most of the steps,a linux system is needed. You can try linux in VirtualBox or VMWare if you are in Windows. For some of the super annoying problems, even I had to switch to a 32bit ubuntu server VM image as my 64 bit Ubuntu was throwing errors during some builds.
Note: use sudo if you see permission denied.
so here are my steps.
- Download/build an armbian ubuntu xenial headless image(kernel 3.4.113 for now). Armbian website has very nice download page for each of the single board computers they support.The Legacy one was the choice here.I will try the mainline one too.
- Write that to SD card.Now you have a nice Armbian filesystem with u-boot and 3.4.113 legacy kernel.
- Now delete everything there except boot and lib folder. Inside lib folder, you can delete everything except modules and firmware folders.
- Now time for some build operations. First some prerequisites.Some of them may not even be prerequisites, but I am still including them anyway.Note that these may not contain everything you need.So if an error comes like no such file bla bla bla,feel free to google.Now,open up a terminal and type,
sudo apt-get install build-essential gawk autoconf libncurses5-dev git libssl-dev crossbuild-essential-armhf - Once we are done with that. its time to build busybox. Its a set of many useful linux tools. Some of the version selections etc might look weird but its basically a compilation of things I scavenged from the internet.
wget http://busybox.net/downloads/busybox-1.24.1.tar.bz2
tar -xjf busybox-1.24.1.tar.bz2
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- defconfig
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- -j8
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- install It then copies the files to _install folder in the busybox directory. Now we copy it to SD card. probably we could have copied it in the last command by specifying CONFIG_PREFIX.
Now run,
sudo rsync -a _install/ /path/to/sd/card
This copies the contents of _install to SD card with proper permission. - We are almost done on that.Now time to do some finishing touches.
cd /path/to/sd/card
mkdir proc sys dev etc
sudo mknod dev/console c 5 1 (note the missing / before dev.we are not working on our PC filesystem here.so dont put a / before anything unless specified here)
sudo mknod dev/null c 1 3
Now we create the inittab file where we specify what to load during boot
gedit etc/inittab (add sudo if says permission denied)
copy paste the following
null::sysinit:/bin/mount -t proc proc /proc
null::sysinit:/bin/hostname -F /etc/hostname
null::respawn:/sbin/getty -L ttyS0 115200 vt100
null::shutdown:/sbin/umount -a -r
Save and close
Now,
mkdir root
gedit etc/passwd
copy paste the following
root:x:0:0:root:/root:/bin/sh
Save and exit
gedit etc/shadow
copy paste
root::10933:0:99999:7:::
Save and exit
mkdir -p usr/share/udhcpc
cp /path/to/busybox_src/examples/udhcp/simple.script usr/share/udhcpc/default.script
gedit etc/hostname
testlinux - Now we make glibc which is used by various programs.
wget http://ftp.gnu.org/gnu/libc/glibc-2.22.tar.xz
tar -xJf glibc-2.22.tar.xz
mkdir glibc-build
cd glibc-build/
../glibc-2.22/configure arm-linux-gnueabihf --target=arm-linux-gnueabihf --build=x86_64-pc-linux-gnu --prefix= --enable-add-ons
make
make install install_root=/path/to/sd/card
If you get error like LD_LIBRARY_PATH should not contain current directory etc. during configuration, rununset LD_LIBRARY_PATH
then run configure again.
- Now that everything is done,Open up a terminal in ur sd card folder and type sync.
Now remove the SD card and put it in your Orange pi Zero SD slot. Attach a USB-serial to it and fire up your favorite terminal emulator(picocom in my case). Power the Orange pi and you should see something like this.
U-Boot SPL 2017.03-armbian (Mar 16 2017 - 14:23:25)DRAM: 512 MiB
Trying to boot from MMC1
U-Boot 2017.03-armbian (Mar 16 2017 - 14:23:25 +0600) Allwinner Technology
CPU: Allwinner H3 (SUN8I 1680)
Model: Xunlong Orange Pi Zero
DRAM: 512 MiB
MMC: SUNXI SD/MMC: 0
*** Warning - bad CRC, using default environment
Setting up a 720x576i composite-pal console (overscan 32x20)
Error: no valid bmp image at 66000000
In: serial
Out: vga
Err: vga
Net: phy interface0
eth0: ethernet@1c30000
Hit any key to stop autoboot: 0
6944 bytes read in 159 ms (42 KiB/s)
switch to partitions #0, OK
mmc0 is current device
Scanning mmc 0:1...
Found U-Boot script /boot/boot.scr
1884 bytes read in 147 ms (11.7 KiB/s)
## Executing script at 43100000
115 bytes read in 123 ms (0 Bytes/s)
5156878 bytes read in 633 ms (7.8 MiB/s)
4754656 bytes read in 620 ms (7.3 MiB/s)
Found legacy kernel configuration
35384 bytes read in 487 ms (70.3 KiB/s)
## Loading init Ramdisk from Legacy Image at 43300000 ...
Image Name: uInitrd
Image Type: ARM Linux RAMDisk Image (gzip compressed)
Data Size: 5156814 Bytes = 4.9 MiB
Load Address: 00000000
Entry Point: 00000000
Verifying Checksum ... OK
Loading Ramdisk to 49b15000, end 49ffffce ... OK
Starting kernel ...
[sun8i_fixup]: From boot, get meminfo:
Start: 0x40000000
Size: 512MB
ion_carveout reserve: 160m@0 256m@0 130m@1 200m@1
ion_reserve_select: ion chipid [0x2c00042!
ion_reserve_common: ion reserve: [0x57e00000, 0x60000000]!
Loading, please wait...
starting version 229
Begin: Loading essential drivers ... done.
Begin: Running /scripts/init-premount ... done.
Begin: Mounting root file system ... Begin: Running /scripts/local-top ... done.
Begin: Running /scripts/local-premount ... Scanning for Btrfs filesystems
done.
Begin: Will now check root file system ... fsck from util-linux 2.27.1
[/sbin/fsck.ext4 (1) -- /dev/mmcblk0p1] fsck.ext4 -a -C0 /dev/mmcblk0p1
/dev/mmcblk0p1: recovering journal
/dev/mmcblk0p1: clean, 4787/89584 files, 89637/358144 blocks
done.
done.
Begin: Running /scripts/local-bottom ... done.
Begin: Running /scripts/init-bottom ... done.
mount: mounting /run on /root/run failed: No such file or directory
testboard login: root
login[151]: root login on 'ttyS0'
~ #
Right now some errors are there and we will fix them.Right now the boot time is about 9 seconds from boot to console login.
References used:
References used: