家里一年多前就有一个基于Allwinner A10-evb 1.2的平板,买来之后就装上了linaro-alip-armhf的ubuntu系统作为家中的服务器,配合lxde和触摸屏,可以方便的选择家中的无线网络,提供lamp等服务。前几天看到一个tb卖家挂出来的100元包邮的二手闲置全志A10s的Android miniPC,不由心动再添一台放到学校当服务器。当年买A10平板(1G A8 + 1G RAM + 8G ROM)可是花了将近400元!
联系卖家后爽快发货买下,只过了一天就运过来了,不过搭建系统是从我在YX上拍的特价49.9元的PNY 16G class10 TF卡两天后到货才开始的。
由于这个A10s没有平板的lcd,身边又没有hdmi显示器,所以并不能用外接鼠标键盘显示器进行改造后的操作。不过这不是问题,我们可以通过串口来进行操作。拆开机壳后发现,有两组ttl,其中一组卖家改造焊接上了一个红外头,另一组悬空着,但看痕迹应该是也焊接过,由于我用不到红外头,索性剪掉都引出杜邦2.54排针用于和usb ttl线进行连接,点击看大图,我的焊工很一般请轻喷。。。
硬件准备工作完成,连接上串口看一下输出的调试信息,经过一番查看后发现这个A10s和之前的A10并不相同,A10是架构是sun4i,A10s是sun5i,也就是说不能使用已有的A10的u-boot,linux kernel也必须重新编译。另外wifi连接使用的是SDIO的rtl8188cus,所以在rootfs的boot里的script.fex和相应的script.bin必须将SDIO配置好,否则启动后无法找到网卡。经过无数次失败的编译和部署,总结要点如下
- 去github上linux-sunxi/linux-sunxi克隆3.4.67或更新的kernel source,并更改.config为sun5i后编译uImage和modules
- 在adb shell下将android平台下nanda重新挂载,adb pull出原始script.bin并使用sunxi-tools中的bin2fex转换成script.fex进行修改再重新转换成script.bin
- 去github上linux-sunxi/u-boot-sunxi克隆最新的版本编译出mk802_a10s配置的u-boot
- 制作Debian rootfs包,安装kernel和modules,
- 提前在rootfs内安装ssh,wpasupplicant,firmware-realtek
- 在rootfs中boot内拷入修改好的script.fex和script.bin,删除boot.cmd和boot.scr
- 修改好rootfs中的etc/network/interfaces和wpa_supplicant.conf
- 根据TF卡分一个区还是两个区,还有分区格式正确修改uEnv.txt
完成这些后,直接插上TF卡,连接上电源,设备会自动启动并连接上配置好的无线网络,并可以用ssh登陆,如果接上ttl线还可以通过com口终端登陆。上面这几条说起来不多,但每条都是血泪经验。。。另外ttl线不是必须的,如果你每一步都操作正确,就不用通过ttl线查看输出了。
下面分别介绍每个步骤,我是参照下述链接才能搭建成功,感谢为全志平台贡献力量的所有人!
- 总体步骤:构建自己的Cubieboard Debian Linux(pdf)
- 工具链及源码资源:https://github.com/linux-sunxi
- kernel的.config文件:https://romanrm.net/a10/kernel
- Cubian提供的教程
- 配置无线网络:让UbuntuServer使用无线网卡
- cubieboard折腾手记
如果你不想麻烦再编译一遍,那么请点击这个链接下载中文版懒人包,内含编译好的rootfs和u-boot,这需要你在linux下操作,内附中文教程
If you don’t want to go through the whole steps, you can click this link to download the lazzy pack including rootfs, u-boot and a instruction in english. You need to operate under linux.
步骤按照总体步骤提供的pdf进行修改和完善
1.环境准备
我使用了一个在VirtualBox下的ubuntu 12.04 64bit的虚拟机,构建步骤适用于sun5i平台的A10s,A13的MK802 Android 4.0 miniPC。操作在root目录下进行
- 工作目录为$WORK_DIR
- 目标系统ROOTFS目录为$ROOTFS_DIR
我的设定如下:
1 2 |
# WORK_DIR=/home/sharpbai/mk802_a10s # ROOTFS_DIR=$WORK_DIR/chroot-armhf |
标有#号的代表命令或文件内容;因为页幅限制,有的行末尾有”” 折行符,表示该行尚未结束,在下一行继续——所以折行符不算是命令或文件内容的一部分。
1.1 下载必须的工具软件
1 2 3 |
# apt-get install build-essential libncurses5-dev u-boot-tools qemu-user-static debootstrap git binfmt-support libusb-1.0-0-dev pkg-config # apt-get install gcc-arm-linux-gnueabihf |
1.2 下载源码
从 github 下载 spl&u-boot、内核源码、sunxi 工具包等。注意内核源码超过 1.5G,耗时最长。如果曾经下载过这些代码,记得分别用 git pull 更新后再进行后续操作,因为代码仓库每天都有变化。
1 2 3 4 5 |
# cd $WORK_DIR # git clone https://github.com/linux-sunxi/u-boot-sunxi.git # git clone https://github.com/linux-sunxi/sunxi-tools.git # git clone https://github.com/linux-sunxi/sunxi-boards.git # git clone https://github.com/linux-sunxi/linux-sunxi.git |
1.3 下载并配置Debian基础系统
1 2 3 4 5 6 |
# mkdir $ROOTFS_DIR # cd $ROOTFS_DIR # debootstrap --foreign --arch armhf wheezy . # cp /usr/bin/qemu-arm-static usr/bin/ # LC_ALL=C LANGUAGE=C LANG=C chroot . /debootstrap/debootstrap --second-stage # LC_ALL=C LANGUAGE=C LANG=C chroot . dpkg --configure -a |
到此为止,Debian 基础系统已经配置好了;现在可以把 $ROOTFS DIR 保存为一个压缩包,以备日后之用。
1 2 |
# cd $ROOTFS_DIR # tar -zcvf ../debian-rootfs-armhf-clean.tar.gz * |
2 编译组件
2.1 编译 U-BOOT
1 2 3 |
# cd $WORK_DIR/u-boot-sunxi # make distclean CROSS_COMPILE=arm-linux-gnueabihf- # make mk802_a10s CROSS_COMPILE=arm-linux-gnueabihf- |
2.2 编译 sunxi-tools
1 2 |
# cd $WORK_DIR/sunxi-tools # make |
2.3 配置、编译内核
2.3.1 拷贝预设内核配置文件
1 2 3 4 |
# cd $WORK_DIR/linux-sunxi # <del>wget https://romanrm.net/dl/a10/kernels/server-3.4/3.4.67-r0-s-rm2%2b/config-3.4.67-r0-s-rm2%2b.txt -O .config</del> # 地址已经更新,请替换为下面的地址 # wget https://mirrors.romanrm.net/sunxi/a10/kernels/server-3.4/3.4.104-r0-s-rm2%2B/config-3.4.104-r0-s-rm2%2B.txt -O .config |
2.3.2 配置内核
由于.config文件是事先配置好的,所以无需大改,不用make menuconfig,只需要将平台改变即可
以下操作为方便使用系统自带的gedit,也可以使用vi,vim修改
1 |
# gedit .config |
点击 编辑 -> 首选项 -> 显示行号
定位到第276行,将”CONFIG_ARCH_SUN4I=y”改为
1 |
# CONFIG_ARCH_SUN4I is not set |
注意这里的#是需要输入的并非提示符
滴277行,将”# CONFIG_ARCH_SUN5I is not set”改为
1 |
CONFIG_ARCH_SUN5I=y |
保存并关闭
2.3.3 编译内核
1 |
# make -j5 ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- uImage modules |
这里会提示有几项新的配置需要选择,碰到跟mail,g2d,debug和video有关的选项全部都选n,其余的选择y即可
编译过程很长,请耐心等待
3 建立 ROOTFS
先进入$ROOTFS_DIR目录
1 |
# cd $ROOTFS_DIR |
3.1 重要步骤
Debian rootfs基础系统在前文中已经下载安装,现在需要进一步配置。首先且最重要的是设置管理员密码和主机名称
1 2 3 |
# chroot . passwd # echo "MK802_Server" >> etc/hostname # echo "127.0.0.1 MK802_Server" >> etc/hosts |
内核模块安装,这是最关键步骤:
1 2 3 |
# cp $WORK_DIR/linux-sunxi/arch/arm/boot/uImage boot/ # make -C $WORK_DIR/linux-sunxi INSTALL_MOD_PATH=`pwd` ARCH=arm \ CROSS_COMPILE=arm-linux-gnueabihf- modules_install |
设置串口调试终端参数,如果你想使用串口进行调试,这是必要的:
1 |
# echo T0:2345:respawn:/sbin/getty -L ttyS0 115200 vt100 >> etc/inittab |
配置并更新软件源:
1 2 3 4 |
# echo deb http://http.debian.net/debian/ wheezy main contrib non-free > etc/apt/sources.list # echo deb http://security.debian.org/ wheezy/updates main contrib non-free >> etc/apt/sources.list # chroot . apt-get update # chroot . apt-get upgrade |
3.2 安装必要组件
安装 Open SSH Server,这将是你操控MK802最简单方便的方式
1 |
# chroot . apt-get install openssh-server |
安装 locales
1 2 3 4 |
# chroot . apt-get install locales # echo "en_US.UTF-8 UTF-8" > etc/locale.gen # echo "zh_CN.UTF-8 UTF-8" >> etc/locale.gen # chroot . locale-gen |
安装vim
1 |
# chroot . apt-get install vim |
安装无线网卡相关组件
1 |
# chroot . apt-get install wireless-tools wpasupplicant firmware-realtek |
3.3 配置无线网络
修改etc/network/networking
1 2 3 4 |
# echo " " >> etc/network/interfaces # echo "auto wlan0" >> etc/network/interfaces # echo "iface wlan0 inet dhcp " >> etc/network/interfaces # echo "wpa-conf /etc/wpa_supplicant.conf" >> etc/network/interfaces |
创建etc/wpa_supplicant.conf
注意,这里的SSID要替换成自己无线路由的名称,KEY要替换成无线路由的密码,如果有多个路由器可以重复操作此步骤添加多个无线路由配置
1 |
wpa_passphrase SSID KEY >> etc/wpa_supplicant.conf |
3.4 生成并部署内核启动参数文件
这一步需要你在windows下使用adb来从MK802内部提取script.bin并修改
script.bin和script.fex是内核启动时配置设备使用的文件,我们需要使用SDIO接口的无线网卡,而SDIO接口就是在这里初始化的
首先下载A10的 adb driver 并安装
然后下载adb工具并解压
连接到MK802到电脑的的usb口
打开cmd,进入adb工具目录,输入
1 |
adb shell |
如果成功会显示root@android或类似信息
接下来,输入
1 2 3 |
# mkdir /sdcard/nanda # mount -t vfat /dev/block/nanda /sdcard/nanda # exit |
再输入
1 |
adb pull /sdcard/nanda/script.bin |
将提取出的script.bin传送到ubuntu虚拟机上,并复制到WORK_DIR/sunxi-tools
再回到ubuntu虚拟机上操作,接下来生成script.fex
1 2 |
# cd $WORK_DIR/sunxi-tools # ./bin2fex script.bin script.fex |
接下来编辑script.fex
1 |
# gedit script.fex |
删除与hdmi,video有关的配置节后保存
然后生成新的script.bin并复制到目标位置
1 2 3 |
# ./fex2bin script.fex script.bin # cp script.fex $ROOTFS_DIR/boot/ # cp script.bin $ROOTFS_DIR/boot/ |
接下来进入ROOTFS_DIR/boot目录删除不需要的文件
1 2 3 |
# cd $ROOTFS_DIR/boot # rm boot.cmd # rm boot.scr |
3.5 配置u-boot启动环境
最后修改(如果没有就添加一个)uEnv.txt
uEnv.txt是设置内核位置和设备配置文件等启动命令的配置文件
1 2 |
# cd $ROOTFS_DIR # gedit uEnv.txt |
替换为以下内容
1 2 3 |
mmcboot=ext4load mmc 0 0x43000000 script.bin; ext4load mmc 0 0x48000000 uImage; bootm 0x48000000; uenvcmd=run mmcboot bootargs=console=ttyS0,115200 console=tty0 root=/dev/mmcblk0p1 |
这几行的意思是,配置ttyS0串口和root目录,加载mmc 0的ext4分区中的boot/script.bin配置到内存0x43000000区域,加载mmc 0的ext分区中的boot/uImage内核到内存0x480000000,然后从0x48000000开始执行内核
到这里rootfs算是全部准备完毕了
4 安装到TF卡
下面将存储卡插入usb读卡器,并在Virtualbox中分配给ubuntu虚拟机,在我的机器中,TF卡设备分配了/dev/sdb设备名,实际要视自己情况而定,一定要指定正确,指定错误将会错误覆盖被指定的设备的数据,造成不可挽回的数据丢失!
1 |
# CARD=/dev/sdb |
4.1 安装 u-boot
清空前面1M左右的数据,为存放u-boot预留空间,然后在指定位置写入u-boot
1 2 3 |
# cd $WORK_DIR/u-boot-sunxi # dd if=/dev/zero of=$CARD bs=1k count=1024 # dd if=u-boot-sunxi-with-spl.bin of=$CARD bs=1024 seek=8 |
4.2 介质分区
使用fdisk将TF卡分成一个区即可,然后格式化成ext4格式
1 2 3 |
# fdisk $CARD ...(进行分区操作)... # mkfs.ext4 ${CARD}1 |
4.3 部署rootfs
复制整个rootfs到TF卡
1 2 3 4 |
# cd $ROOTFS_DIR # mount ${CARD}1 /mnt # tar --exclude=qemu-arm-static -cf - . | tar -C /mnt -xvf - # sync && umount /mnt |
切记一定要等最后sync和umount完成后再拔出,否则复制数据会不完整
5 完成
好了万事俱备只欠插入
将TF卡插入MK802中,如果你有ttl线的话连接好并打开终端,如果没有的话,请登录路由器dhcp管理页面。插上电源,ttl应该立即输出启动信息并最后出现登录界面,而在几分钟内路由器dhcp管理页面会显示多了一个你的设备。接下来使用ssh连接到MK802,尽情享受吧~
晒下我的MK802完成图,打了个孔引出两个内部串口,外加一个USB hub
一点问题:貌似这个rtl8188cus网速不是很快,实测最高2M/s左右,如果对速度有特殊需求可以添加usb无线或有线网卡。
博主你好,我是按照你的教程一步一步走的,但是我遇到一个问题是,如果我先分区再写入u-boot会使分区数据损坏,然后就无法识别了,又要重新分区。先写入u-boot,再分区的话u-boot的数据又会消失
您好请问能给一份完整的img镜像文件吗