首頁 > 軟體

安卓裝置執行原生 Debian(非 chroot)

2020-06-16 17:47:00

最近在折騰安卓盒子的過程中發現,通過修改安卓核心的 initramfs 檔案,新增一個自己的 BusyBox 來 switch_root 進入 Debian 是可行的。而且在 BusyBox 下就可以直接 insmod *.ko 核心模組了,所以驅動不是問題。如此,則市面上大部分安卓裝置都可以原生執行 Debian 系統了?

原理:利用安卓核心來引導 Debian 的 rootfs。

拆解與打包 boot.img。

boot.img 包含了 zImage 和 initramfs 等檔案,現在需要修改 initramfs 來 switch_root 進入 Debian。

利用 mkbootimg 和 unpackbootimg:https://github.com/osm0sis/mkbootimg

編譯後,先提取安卓預設 boot.img:

dd if=/dev/block/nandX of=boot.img

拆分:

unpackbootimg boot.img

會提取出若干檔案。

製作自己的 initramfs:

mkdir initramfs
cd initramfs

建立一個 init 檔案:

 

#!/bin/sh
mkdir -p /root
mkdir -p /proc
mkdir -p /sys
mkdir -p /dev
mkdir -p /tmp
mount -t proc none /proc
mount -t sysfs none /sys
mount -t ramfs none /dev
mount -t tmpfs none /tmp
insmod /ko/disp.ko
insmod /ko/lcd.ko
insmod /ko/hdmi.ko
insmod /ko/nand.ko
insmod /ko/gpio-sunxi.ko
insmod /ko/ump.ko
insmod /ko/mali.ko
insmod /ko/videobuf-core.ko
insmod /ko/videobuf-dma-contig.ko
insmod /ko/uvcvideo.ko
insmod /ko/rtl8150.ko
echo /sbin/mdev > /proc/sys/kernel/hotplug
mdev -s

echo -e "Waiting 5 seconds for removable devices to stablize"
i=0
while [ $i -lt 5 ]; do
    sleep 1
    echo -n "."
    i=$(($i+1))
done
echo
blkid | grep 4cc77658-b809-4894-b6a7-c5f15d8b00fe > /tmp/mountdev

#/bin/sh
mount $(cat /tmp/mountdev | cut -d ':' -f 1) -o noatime,nodiratime /root
exec switch_root /root /sbin/init

這裡 4cc77658-b809-4894-b6a7-c5f15d8b00fe 為 rootfs 裝置的 UUID。

chmod u+x init

編譯 BusyBox(不再贅述)。

將編譯好的 BusyBox 目錄拷貝到 initramfs 下,進行打包:

find . | cpio -H newc -o > ../initramfs.cpio.gz

重新製作 boot.img

mkbootimg --base 0x00200000 --kernel zImage --ramdisk initramfs.cpio.gz -o my-boot.img

--base 為解包後檢視裡面的 base 引數。

以上只是一個大體的架構步驟,具體到某些盒子可能不太一樣,另外要準備好 ttl 線以便檢視引導錯誤。如此,一個陳舊的、吃灰的安卓盒子可以跑原生的 Debian 系統,然後隨意使用 apt 來安裝自己的服務當小型伺服器來用了,何樂不為?而且目前市面上的安卓盒子記憶體基本都是 1G 左右,功耗且低,在家裡跑服務是非常不錯的。

本文永久更新連結地址http://www.linuxidc.com/Linux/2016-01/127462.htm


IT145.com E-mail:sddin#qq.com