让 Debian 在 Radxa 上跑起

作者 huhamhire,暂无评论,2014年2月4日 20:05 折腾历程

Radxa Rock 到手以后,对我而言,需要折腾的第一件事情就是装一个 Linux 跑起来。Radxa 发出来的时候默认在板子上安装了 android,官方也提供了一个 Ubuntu 的系统镜像,不过我个人很想用 Debian 来玩这板子,所以这回就来折腾一下适合 Radxa 的 Debian 版本 root 文件系统(后面简称 rootfs)。

Radxa Rock 与绝大多数采用福州 rockchip RK 系列 CPU 的设备引导方式类似,一般可以将 Linux 系统的内核以及引导刷到 nand 中的 recovery 分区,对应的 rootfs 可以设置在 nand 或者外部存储设备(如 Radxa 可以放在 TF 卡或 U 盘上)。编译内核应该并不是一件特别困难的事情,照着官方 Wiki 上的步骤一步步来即可,http://wiki.radxa.com/Rock/Booting_Linux 。需要自己动手折腾一下的主要就是做 rootfs。

1. 获取 rootfs 原始镜像

因为 Radxa 官方没有提供 Debian 的 rootfs 镜像,自己折腾的话无非就是两个选择,从头开始或者找一个比较干净的半成品再加工。我这里用了省事儿一点的做法,直接找了一个半成品,因为正好看到 freaktab 上有一篇帖子写到了的给 rk3188 板子用的 Debian 镜像。具体参阅 http://www.freaktab.com/showthread.php?6803-Linux-for-RK3188-based-TV-boxes 。这篇帖子里分别提供了适用于 MK888/DX05 的 Debian 以及 Ubuntu 刷机镜像。下回来使用 Rockchip 的工厂工具解包就可以得到我们需要的 rootfs 部分。(PS: 这里的 Debian 是 Debian 7 wheezy,需要其他版本的童鞋请自行解决 :-P )

需要注意的是工厂工具解包的时候会尝试解开 android 部分,由于这些分装好的文件中并不存在 android 部分的内容,解包时会出现错误提示。可以忽略这部分错误,其实这个时候我们需要的 rootfs 镜像已经提取到工具目录的 Temp/images 下了。

unpack-01 unpack-02 unpack-03

2. 调整 rootfs 镜像大小

从这部分开始,后面的配置均在 Linux 环境下完成。我这次折腾的时候用的是 Ubuntu 12.04 LTS。

由于目前得到的 dx05_debian.img 这个镜像文件压缩的非常精简,里面已经没剩下太大的空间,特别是剩余可供分配的 inode 也不充足了。为了后续添加内核模块,以及配置需要的软件包,建议首先对这个镜像文件进行扩容。

先把镜像文件改个名字:


mv dx05_debian.img radxa_debian.img

创建一个新的空白文件 add.img 用于向原有镜像后追加空间。具体大小可以自己按需设置,比如我这边可以设置的稍微大一点,直接给上 100 MB:


dd if=/dev/zero of=add.img bs=1M count=100

将空白内容追加到原有镜像之后:


cat add.img >> radxa_debian.img

检查镜像文件系统,并调整容量大小:


e2fsck -f radxa_debian.img
resize2fs radxa_debian.img

修改镜像分区卷标。如果是从外部存储设备上启动系统的话,这一步还是挺重要的,卷标的名称理论上也可以自己设置,不过最好需要和刷机时候修改的 parameter 中的相关内容一致,具体参考官方 Wiki 上的 Build your own kernel and boot into Linux 部分:


e2label radxa_debian.img "linuxroot"

3. 配置 Radxa 内核驱动模块

因为目前的系统镜像是针对 dx05 这些板子配置的,硬件上肯定会有差异。虽然目前来说,Radxa 的 Linux 内核驱动还不是做得很完善,比如 GPU 这部分暂时还不能驱动起来。不过话说回来,配置一下 kernel modules 总比不配置强,至少无线模块这部分可以驱动起来。

内核模块可以选择自己编译内核的时候生成一份,编译内核过程详见官方 Wiki 上的 Build your own kernel and boot into Linux。除此以外,也可以直接从官方提供的下载内容中找到,http://dl.radxa.com/rock/images/ubuntu/2013-12-17/3.0.36+.tar.gz

准备好内核模块后,就可以修改镜像文件了。首先挂载镜像文件,然后清理原有的内核模块。这里偷个懒,直接在工作目录下建了一个 rootfs 目录作为挂载点。


mkdir rootfs
sudo mount -o loop radxa_debian.img rootfs
sudo rm -rf rootfs/lib/modules/3.0.36+

接下来,解压下载获取的 kernel modules 文件,放到相应的目录,这一部分的配置就完成了:


tar zxvf 3.0.36+.tar.gz
sudo cp -r 3.0.36+ rootfs/lib/modules/

4. Debian 系统初始配置

a. 修改设备名

可能我有给东西分配名字的不良嗜好,不过至少要比 TBBT 的 Sheldon 同学给几乎所有东西贴上标签来的正常:-P


sudo vim rootfs/etc/hostname

改成自己想要的设备名,我这里直接把 rk3188 改成了 radxa 。

b. 修改软件包下载源

需要说下的是,像中科大、163或者是新近的阿里等镜像站点上几乎都不提供 arm 构架的软件包,至少 Debian 目前是这个情况。如果要配置国内的服务器的话,建议用 Debian 官方的中国镜像服务器。


sudo vim rootfs/etc/apt/sources.list

配置成合适的镜像站点:


deb http://ftp.cn.debian.org/debian wheezy main

c. 修改网络配置

首先配置网络接口,这里我没有使用无线模块,如果有相关需要的朋友可以阅读 Radxa Wiki 上设置无线网络部分的内容 Using Wireless on Rock ,再进行相应的设置。


sudo vim rootfs/etc/network/interfaces

可以配置成类似下面的内容:


1 # interfaces(5) file used by ifup(8) and ifdown(8)
2 
3 auto lo
4 iface lo inet loopback
5 
6 auto eth0
7 iface eth0 inet dhcp
8    hwaddress ether 11:22:33:44:55:66

由于 Radxa 上默认的有线网络 Mac 地址是随机生成的,可能每次使用都会有变化,这就非常不适合局域网管理,所以可以在这里手动指定一个,理论上网卡的物理地址只要不和同一个广播域内的其他设备冲突就可以了。有条件的话,最好在路由器上给 Radxa 设置的硬件地址手动指定一个固定的 IP 地址,便于后续可以远程管理。

接下来,为了一会儿用 chroot 添加软件包的时候可以正常访问网络,还需要配置一下当前局域网的 DNS,一般改成网关或者路由器的地址就行。


sudo vim rootfs/etc/resolv.conf

然后这里,我根据我的局域网环境改成了下面的设置:


nameserver 10.0.5.1

d. 设置 nand 分区开机自动链接

这一段是按着官网的 Wiki 上说的来做的。不过实话说,Radxa 用的 nand 颗粒 I/O 速度确实比较慢,我完全不考虑在 Linux 下用这部分空间。


sudo vim rootfs/usr/local/bin/mtd-by-name.sh

然后增加以下内容:


 1 #!/bin/sh -e
 2 # mtd-by-name link the mtdblock to name
 3 # radxa.com, thanks to naobsd
 4 rm -rf /dev/block/mtd/by-name/
 5 mkdir -p /dev/block/mtd/by-name
 6 for i in `ls -d /sys/class/mtd/mtd*[0-9]`; do
 7     name=`cat $i/name`
 8     tmp="`echo $i | sed -e 's/mtd/mtdblock/g'`"
 9     dev="`echo $tmp |sed -e 's/\/sys\/class\/mtdblock/\/dev/g'`"
10     ln -s $dev /dev/block/mtd/by-name/$name
11 done

设置脚本的执行权限:


sudo chmod +x rootfs/usr/local/bin/mtd-by-name.sh

配置开机自动运行:


sudo vim rootfs/etc/rc.local

在 exit 0 之前添加下面的内容:


/usr/local/bin/mtd-by-name.sh

另外,如果后面和我一向需要安装 ntpdate 来同步时间的话,可以顺带再这里加上一条:


/usr/sbin/ntpdate ntpdate time.nist.gov

5. 使用 Chroot 进入 rootfs 安装需要的软件包

首先是在当前系统安装模拟运行 arm 程序的时候必要的软件包:


sudo apt-get install qemu-user-static binfmt-support gcc-arm-linux-gnueabihf lzop libncurses5-dev

安装完成后,准备 Chroot 环境:


sudo cp /usr/bin/qemu-arm-static rootfs/usr/bin
sudo modprobe binfmt_misc
sudo mount -t devpts devpts rootfs/dev/pts
sudo mount -t proc proc rootfs/proc

接下来,就可以模拟进入这个文件系统来做相关修改了:


sudo chroot rootfs

chroot 以后,所有操作都在 rootfs 文件系统内执行。我先修改默认的 shell 为 bash:


rm /bin/sh && ln -s /bin/bash /bin/sh

配置一下默认的语言:


dpkg-reconfigure locales

在弹出的 Curses 菜单中选择需要的语言即可,比如我选了 en_US.UTF-8。或者在某些系统中,还可以直接使用下面的方式:


locale-gen en_US.UTF-8
locale-01 locale-02

更新当前系统的软件包,然后安装需要的软件包,这一步的操作就可以因人而异了,我只安装了最基础的 ssh, ntpdate, 无线网工具这些。


apt-get update
apt-get upgrade

apt-get install ssh usbutils wpasupplicant wireless-tools ntpdate

如果打算后面用高速 Micro SD(TF) 卡的话,建议只要在这里安装下几个比较基本的软件包就可以了,毕竟在 x86 平台用 chroot 模拟执行 arm 程序的效率不高,而且可能还会遇到文件系统上的一些小问题。

接下来,还可以设置一下 root 密码,并顺带创建一个普通用户,当然这一步现在也是可选的,如果要做一个干净一点的 rootfs,可以等刷到板子或者存储设备上的时候再配置。不过因为这个版本的 rootfs 默认没有 root 密码,为了安全起见,用的时候最好还是配置一下。


passwd
adduser xxx

配置完成以后,退出模拟运行环境,卸载 rootfs 镜像,一个适用于 Radxa 的 Debian 镜像就制作完成了。


exit
sync
sudo umount -l rootfs

6. 将 rootfs 写到外部存储设备

如果需要和我一样在 TF 卡上使用 Linux 系统的话,也只需简单几步的即可。首先插上存储卡后用 dd 把 rootfs 镜像写到卡上。


sudo dd if=radxa_debian.img of=/dev/mmcblk0

然后调整一下分区,以使得卡上的空间充分得到利用。至此,就算大功告成了。


sudo e2label /dev/mmcblk0 "linuxroot"
sudo e2fsck -f /dev/mmcblk0
sudo resize2fs /dev/mmcblk0

可能有同学会觉得用 ext4 的文件系统在卡上写日志会比较伤卡,可以用下面的命令选择关闭或者开启文件系统的日志功能:


# Disable
tune2fs -O ^has_journal /dev/mmcblk0
tune2fs -l /dev/mmcblk0 | grep 'Filesystem features' | grep 'has_journal'

# Enable
tune2fs -O has_journal /dev/mmcblk0

不过我是觉得一般也没必要把日志给关了,正常情况下,好一点的 TF 卡也没这么娇气,如果出现文件系统不一致,缺了日志没法立即恢复的时候,倒是挺麻烦的。

7. 后记

小小的提醒一下,从官方给出的模块示意图来看,Radxa 这板子上的 TF 卡槽上直接是连在了 CPU 的控制器部分,而不是从 USB 控制器上分出来的。官方的 Gplus 社区上也说到这板子可以支持 UHS-1 的 TF 卡。我找了一块 Sandisk 的 85 MB/s MicroSD 卡装上果断速度很给力,比普通 class-10 的卡要快上一个数量级,所以建议有条件的朋友可以把系统做在读写性能好一点的卡上,用起来可以快很多。

block_diagram

另外,如 freaktab 上的那篇帖子中提到的 Debian 系统可以使用 tasksel 来选择配置需要工作环境,比如要安装桌面环境的时候就可以方便不少。


tasksel

最后再附上一张 radxa 运行 Debian 桌面的截图,需要提醒的是,当前因为 GPU 暂时还没有驱动起来,不是很建议通过图形桌面来在 Radxa 上管理 Linux。

desktop
关键词:ARM , Debian , Radxa , 开发板
登录后进行评论