在之前那篇BananaPro镜像生成脚本的文章中,忽略掉了root-fs的步骤。我们都知道,Linux是将内核和root-fs分离的,我们可以使用同一个Linux的内核来使用各种文件系统,包括各种linux的发行版。这篇文章就是用来讲解怎么构建一个最小的root-fs文件系统,这样的文件系统一般只包含很少的软件包,需要有一定的Linux基础才能够把持的住。在这里我们主要是使用ubuntu为例来讲解一个最小的文件系统是怎么构建的。
使用现有的root-fs包。
很多发行版都会为ARM架构(一般是armv7,现在都开始armv8了)编译出一套root-fs,比如Archlinux、kali等,后续如果有时间的话会继续移植这些发行版。这里使用官网提供的发行包ubuntu-core来构建最小文件系统。我们首先需要获得ubuntu-core的二进制包,在此之前我们需要区分以下三个站点:
- http://cdimage.ubuntu.com/ 这个是用来获取各种ubuntu版本(lubuntu、kubuntu、ubuntu-snappy等)的镜像包或是压缩包,这里面包含各个版本的ubuntu(10.04-16.04),也包含各种架构(x86,armhf等)。
- http://ports.ubuntu.com/ubuntu-ports/arm架构的官方更新源,不过速度太慢,自己一般使用国内清华大学的镜像https://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/
- http://archive.ubuntu.com/ubuntu/普通的官方更新源,速度貌似也很慢,这里给大重邮昨天新上线的镜像源打个广告http://ubuntu.mirrors.cqupt.edu.cn/
清楚这个后我们就知道可以在http://cdimage.ubuntu.com/ubuntu-core/releases/选择下载我们的root-fs包,这里要注意的是貌似14.04版本有点问题,我使用了几次好像有成功启动的,但大都卡死在<4>init: plymouth-upstart-bridge main process ended, respawning
串口卡死不能登陆,在显示屏倒是正常,怀疑是ubuntu的版本的问题,改用高版本的ubuntu解决问题,例如使用15.04一切正常。先切换到root-fs目录cd xxx/root-fs
,然后解压sudo tar -xvf ../package/ubuntu-core-15.04-core-armhf.tar.gz
这里记得要用sudo不然有些特殊的设备文件无法创建,这样系统就跑不起来了。然后接下来要对系统进行初始化,由于主机是x86架构因为在宿主是 x86 架构,不能运行 arm 架构的软件。一种笨方法是将文件系统生成镜像然后挂载到arm架构的机器上chroot,另一种简便方法是需要依靠 qemu-arm-static 来模拟成 arm 环境进行系统初始化。复制qemu-arm-static
到刚构建的基本系统中sudo cp /usr/bin/qemu-arm-static bananaPro/root-fs/usr/bin
从而可以用qemu-arm-static
来模拟arm环境。然后chroot到目标文件系统sudo chroot root-fs /bin/bash
然后设置密码以及安装一些常用的软件,使用一键编译脚本(前面提到)生成镜像。将镜像dd
到tf卡然后跑起系统。但是由于ubuntu_core 实在是太精简了,太多的软件都没有(连 man都没得),安装软件很麻烦所以我们试试另一个方案。
使用debootstrap
来构造最小文件系统
debootstrap
是debian/ubuntu下的一个工具,用来构建一套基本的系统(根文件系统)。生成的目录符合Linux文件系统标准(FHS),即包含了/boot、/etc、/bin、/usr等等目录,但它比发行版本的Linux体积小很多,当然功能也没那么强大,因此,只能说是“基本的系统”(参考这里)。
sudo qemu-debootstrap --arch armhf xenial xenial_arm http://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/
分别是指定架构和版本以及目标目录,最后是使用清华大学的镜像,不然的话会很慢。- 稍等片刻看到
I: Base system installed successfully.
表示安装完成。 sudo chroot ./xenial_arm /bin/bash
chroot到目标目录。passwd root
设置root密码,否则等下开机你不知道输啥密码。- 设置镜像源
1
2
3
4
5deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ xenial main restricted universe
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ xenial-security main restricted universe
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ xenial-updates main restricted universe
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ xenial-proposed main restricted universe
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ xenial-backports main restricted universe - 如果出现下面所示错误
E: The method driver /usr/lib/apt/methods/https could not be found.
N: Is the package apt-transport-https installed?
表示那个软件没有装好不支持https协议,可以把https换成http,然后apt-get update
更新源,apt-get install apt-transport-https
让apt支持https,谁让清华的源这么高的逼格呢:(
7. 然后安装软件 apt-get install curl git vim net-tools zsh openssh-server
8. 为了后面安装openkeeper
可以先把python3 build-essential ntp pppd patch
顺便安装了,如果需要也可以吧openssh-server mysql-server vnstat nmap
顺便装了
9. exit
退出chroot,然后用sudo cp ./xenial_arm/* ./root-fs/ -r
拷贝我们刚刚生成的最小文件系统到我们的root-fs,然后sudo sh build.sh
运行我们的一键生成镜像脚本生成镜像,烧录到tf卡后启动。
10. 如果使用低版本可能会出现<4>init: plymouth-upstart-bridge main process ended, respawning
的错误,在串口中卡死在显示屏正常,请改用高版本的ubuntu,换用16.04/xenial解决问题。这里初步怀疑是systemd的问题,没有去深究。
11. 接着就是扩展tf卡的分区大小,为了能上网需要安装openkeeper
,方法也很简单直接sudo sh install.sh
就ok。
12. 在hosts中添加一条127.0.0.1与主机名的映射127.0.0.1 BananaPro
以避免出现类似sudo: unable to resolve host ThinkPad-E430
的错误。
13. chsh -s /usr/bin/zsh
修改默认shell,sh -c "$(curl -fsSL https://raw.github.com/robbyrussell/oh-my-zsh/master/tools/install.sh)"
使用oh-my-zsh
。
14. 设置时区sudo tzselect
,然后sudo cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
,然后ntptime
校正时间以便我们能够利用openkeeper拨号上网。
15. 添加用户,安装配置i3-wm xinit conky lightdm lxappearance
,可以参照之前archlinux的文章。
16. 出现sudo: /usr/bin/sudo must be owned by uid 0 and have the setuid bit set
的报错可以这样解决
1 | chown root:root /usr/bin/sudo |
- 无法登陆(输入密码后回到登陆界面)的问题可以
chmod 777 .Xauthority
来解决。 ifconfig -a
找不到wlan0的问题可以在/etc/modules
里面添加ap6210来解决。- 更新系统后发现不能够串口登录的问题。经查是systemd的问题,在启动的输出中会出现可以尝试下面这样看能不能解决
1
2[ TIME ] Timed out waiting for device dev-ttyS0.device.
[DEPEND] Dependency failed for Serial Getty on ttyS0.如果这样可以解决的话,确定就是这个问题,可以切换到root然后1
2
3systemctl daemon-reload
systemctl stop serial-getty at ttyS0.service
systemctl start serial-getty at ttyS0.servicesystemctl enable [email protected]
彻底解决。 - xterm 无法修改配置以及无法自动登录可以考录
.Xresource
和.Xauthority
的权限问题。