Requirements
- Basic knowledge about linux kernel
- Rooted android phone. For instance: HTC Magic (also known as HTC Sapphire)
- SDcard with at least 1GB memory space
- Arch Linux ARM binaries
- ARM EABI Toolchain
- Android kernel sources
- Android SDK Tools
- Fastboot
Goal
We’re going to run Arch Linux (arm version) on android device (HTC Magic) via fastboot directly from sdcard. This is completely non destructive to the android OS. Connectivity with device is provided by adbd. Furthermore we’re going to configure kernel to print boot logs in framebuffer, so we won’t need a serial cable.
Device Specification
Device name: HTC Magic
ROM: yoshimod 1.5 with 32a kernel
Radio: 3.22.20.17
HBOOT: 1.33.2010
Recovery: RA-sapphire-v1.7.0H
Preparing SDcard
Yoshimod rom requires 2 partitions:
- first: /sdcard (vfat)
- second contains android apps (ext2)
Now we need third partition designed for Arch Linux. It’s very important to have proper order of the partitions (android wants vfat to be the first partition). This is my configuration:
/dev/block/mmcblk0p1 -> /sdcard
/dev/block/mmcblk0p2 -> Android apps
/dev/block/mmcblk0p3 -> Arch Linux. Ext2 seems to be the best choice. Journaling may be bad for sdcard life.
I’ve prepared partitions using fdisk but you can use gparted as well.
Installing Arch Linux
# Connect with the device
adb shell
# Remount (rootfs is mounted in read only mode by default)
mount -o rw,remount /
# Create archlinux mountpoint directory
mkdir /mnt/arch
# Mount filesystem
mount -t ext2 /dev/block/mmcblk0p3 /mnt/arch
# Download and extract Arch Linux binaries
wget http://archlinuxarm.org/os/ArchLinuxARM-armv5te-latest.tar.gz
tar xzf ArchLinuxARM-armv5te-*.tar.gz
rm ArchLinuxARM-armv5te-*.tar.gz
# Copy adbd
cp /sbin/adbd /mnt/arch/sbin/adbd
# Chroot
mount -o bind /dev/ /mnt/arch/dev
sysctl -w net.ipv4.ip_forward=1
export PATH=/usr/bin:/usr/sbin:/bin:$PATH
export TERM=linux
export HOME=/root
chroot /mnt/arch/ /bin/bash
# Now we are in Arch Linux
mount -t proc proc /proc
mount -t sysfs sysfs /sys
# Update the system
echo "nameserver 8.8.8.8" > /etc/resolv.conf
pacman -Syu
# Reinstall udev (udev gives off many errors, so we're going to install udev-oxnas)
pacman -Rdd udev
pacman -S udev-oxnas
# Configure startup
mkdir -p /system/bin/
ln -s /bin/bash /system/bin/sh
# Configure users
passwd
useradd -m yourusername -s /bin/bash
passwd yourusername
vi /etc/rc.local -> add line "/sbin/adbd &"
vi /etc/rc.conf -> disable eth0 interface and leave syslog-ng, hwclock daemons enabled (disable the rest by adding "!" eg. "!sshd")
# Modify /etc/fstab by adding
/dev/block/mmcblk0p3 / ext2 defaults 1 1
proc /proc proc defaults 0 0
/dev/mmcblk0p1 /media/sdcard vfat defaults 0 0
Building the kernel
New kernel should have:
- Initrd turned off – system won’t boot with initrd (if you know why please write explanation in comment)
- Framebuffer turned on – we want to see booting process on the screen
I’m gonna use the cyanogemod kernel (2.6.35.7-cyanogenmod), so let’s build!
# Debian/Ubuntu required packages sudo apt-get install git-core gnupg sun-java6-jdk flex bison gperf libsdl-dev libesd0-dev libwxgtk2.6-dev build-essential zip curl libncurses5-dev zlib1g-dev # Get ARM EABI Toolchain tool mkdir ~/Tools && cd ~/Tools wget https://sourcery.mentor.com/sgpp/lite/arm/portal/package9740/public/arm-none-eabi/arm-2011.09-69-arm-none-eabi-i686-pc-linux-gnu.tar.bz2 tar -xjf arm-* export CCOMPILER=${HOME}/Tools/arm-2011.09/bin/arm-none-eabi- # Download kernel Sources mkdir -p ~/android/kernel cd ~/android/kernel git clone git://github.com/CyanogenMod/cm-kernel.git cd cm-kernel # Select branch git checkout android-msm-2.6.35 # Instead of writing kernel configuration from scratch we'll modify existing kernel config. But first we have to download it: cd ~/kernel/cm-kernel adb pull /proc/config.gz ~/config.gz cat config.gz | gunzip > .config # Enable framebuffer by adding: CONFIG_FB_MSM=y CONFIG_FB_MSM_LEGACY_MDP=y CONFIG_FB_MSM_MDP_PPP=y CONFIG_FB_MSM_MDDI=y CONFIG_DUMMY_CONSOLE=y CONFIG_FRAMEBUFFER_CONSOLE=y CONFIG_FRAMEBUFFER_CONSOLE_DETECT_PRIMARY=y CONFIG_FRAMEBUFFER_CONSOLE_ROTATION=y CONFIG_FONTS=y CONFIG_FONT_8x8=y CONFIG_LOGO=y CONFIG_LOGO_LINUX_CLUT224=y # Disable initrd change CONFIG_BLK_DEV_INITRD to "# CONFIG_BLK_DEV_INITRD is not set" # The easiest way to enable/disable the kernel options is to use menu config. If above modifications won't work, try to use: cd ~/android/kernel/cm-kernel/ make ARCH=arm CROSS_COMPILE=$CCOMPILER menuconfig # Compile! make ARCH=arm CROSS_COMPILE=$CCOMPILER -j
grep 'processor' /proc/cpuinfo | wc -l
# Did you get some errors? I did:/ if "drivers/media/video/msm/msm_vfe7x.c" fails, you may: 1. Substitute the file with https://github.com/ezterry/kernel-biff-testing/blob/ezgb-2636/drivers/media/video/msm/msm_vfe7x.c 2. Substitute the file/directory with https://github.com/pershoot/kernel-2635">Pershoot kernel file/directory # Also modify "drivers/video/msm/msm_fb.c" by commenting ("//") if (msmfb->sleeping != AWAKE) DLOG(SUSPEND_RESUME, "pan_update in state(%d)\n", msmfb->sleeping); # Compile again. make ARCH=arm CROSS_COMPILE=$CCOMPILER -jgrep 'processor' /proc/cpuinfo | wc -l
# Zip kernel modules cd ~/android/kernel/cm-kernel tar -czf modules.tgzfind . | grep ko$
# Prepare modules archive Download 32a kernel.zip http://www.mediafire.com/?cabub1g3y37gj#sv2ozcq27k6e8 Unizp and enter /mod/ Rename "2.6.35.10-cyanogenmod" dir to "2.6.35.7-cyanogenmod" and enter the directory Unpack modules.tgz to /mod/2.6.35.7-cyanogenmod/kernel # Create archive tar -czf "2.6.35.7-cyanogenmod" modules.tgz # Upload modules adb push modules.tgz /mnt/arch/lib/modules # Unpack modules (being in chroot) cd /lib/modules/ tar -xzf modules.tgz rm modules.tgz # Load modules depmod -a # Alternatively you can use modprobe to load single modules.
Fastboot
Eventually! We’re going to boot Arch Linux via fastboot
cd ~/android/kernel/cm-kernel/arch/arm/boot/
fastboot -c 'root=/dev/mmcblk0p3 rw rootfs=ext2 init=/sbin/init rootwait noinitrd' boot zImage
It’s working? Yeah!
Summary
We’ve managed to boot Arch Linux on HTC Magic but a lot of things still doesn’t work. I’m gonna work on the most important issues such as wifi, adbd, drivers in my leisure time;] So you can expect continuation of this article soon;]
Demo
Sources: