在我们做项目的时候,我们会经常遇到一种情况,那就是想制作我们自己的一个ARM的rootfs。在这篇文章中,我们来介绍如何制作的详细过程:
最新的Ubuntu arm64的image可以在这里找到:
http://cdimage.ubuntu.com/ubuntu-base/releases/16.04.5/release/ubuntu-base-16.04.5-base-arm64.tar.gz
我们可以直接下载,或者通过如下的办法来下载:
$ mkdir ~/ubuntu-rootfs && cd ubuntu-rootfs
然后,我们通过如下的方法来下载arm64的release软件:
$ wget http://cdimage.ubuntu.com/ubuntu-base/releases/16.04.5/release/ubuntu-base-16.04.5-base-arm64.tar.gz
$ tar -xpf ubuntu-base-16.04.2-base-arm64.tar.gz
等我们解压缩后,就可以直接删除这个下载的ubuntu-base-16.04.2-base-arm64.tar.gz文件了。ls 命令之后的样子是这样的:
user@user:~/ubuntu-rootfs$ ls
bin dev home media opt root sbin sys usr
boot etc lib mnt proc run srv tmp var
我们可以使用如下的指令来完成对qemu-user-static的安装
$ pwd
/home/user/ubuntu-rootfs
$ apt-get install qemu-user-static
$ cp /usr/bin/qemu-aarch64-static usr/bin
$ cp -b /etc/resolv.conf etc/
在这里我们要注意的是我们针对arm64的qemu-user-static安装的文件是qemu-aarch64-static。
利用一个简单的ch-mount.sh脚本来完成这个动作。它可以帮我们mount及unmount。我们把下载好的脚本置于ubuntu-rootfs目录的上一级目录,并做如下的处理:
user@user:~$ ls ch-mount.sh
ch-mount.sh
user@user:~$ chmod a+x ch-mount.sh
user@user:~$ sudo bash ch-mount.sh -m ubuntu-rootfs/
[sudo] user 的密码:
MOUNTING
root@user:/#
这样我们就进入到chroot的环境中了。
运用如下的命令来更新系统,并安装所需要的包。依赖网络环境,安装的时间可能会有差异。
root@user:/# apt-get update
root@user:/# apt-get install language-pack-en-base sudo ssh net-tools ethtool wireless-tools lxde xfce4-power-manager xinit xorg network-manager iputils-ping rsyslog lightdm-gtk-greeter alsa-utils gnome-mplayer lightdm bash-completion lxtask htop python-gobject-2 python-gtk2 synaptic --no-install-recommends
# useradd -s '/bin/bash' -m -G adm,sudo yourusername
# echo "Set password for yourusername:"
# passwd yourusername
# echo "Set password for root:"
# passwd root
# echo 'ubuntu.yourusername' > /etc/hostname
# apt-get install resolvconf
# dpkg-reconfigure resolvconf
127.0.0.1 localhost
127.0.1.1 yourhostname
# apt-get install tzdata
# dpkg-reconfigure tzdata
我们可以从我们的host中拷入我们想要的arm64的模块到系统中,比如:
# cp -r /opt/out/modules/3.4.5 ~/ubuntu-rootfs/lib/modules
在这里,我们把我们想要定制的包拷入到lib之下的modules中。
我们可以创建/etc/init/ttyS0.conf文件,并写入如下的内容:
start on stopped rc or RUNLEVEL=[12345]
stop on runlevel [!12345]
respawn
exec /sbin/getty -L 115200 ttyS0 vt102
在host中可以同如下的命令来登录:
$ sudo start ttyS0
等我们完成上面的工作后,我们就可以开始制作我们的rootfs文件了。在上面我们已经把我们所需要的文件拷入到相应的文件目录之中了。
root@user:/# exit
exit
user@user:~$ pwd
/home/user
user@user:~$ ./ch-mount.sh -u ubuntu-rootfs
$ dd if=/dev/zero of=ubuntu-rootfs.img bs=1M count=2048
$ sudo mkfs.ext4 ubuntu-rootfs.img
$ mkdir ubuntu-mount
$ sudo mount ubuntu-rootfs.img ubuntu-mount/
$ sudo cp -rfp ubuntu-rootfs/* ubuntu-mount/
$ sudo umount ubuntu-mount/
$ e2fsck -p -f ubuntu-rootfs.img
$ resize2fs -M ubuntu-rootfs.img
这样最终,我们生成了我们所需要的ubuntu-rootfs.img文件:
user@user:~$ ls ubuntu-rootfs.img -hal
-rw-rw-r-- 1 user user 2.0G 10月 31 16:23 ubuntu-rootfs.img
user@user:~$ file ubuntu-rootfs.img
ubuntu-rootfs.img: Linux rev 1.0 ext4 filesystem data, UUID=9ed3cd8b-e81a-4ec9-a8e0-bd185f223936 (needs journal recovery) (extents) (large files) (huge files)
参考文章:
https://gnu-linux.org/building-ubuntu-rootfs-for-arm.html
https://olimex.wordpress.com/2014/07/21/how-to-create-bare-minimum-debian-wheezy-rootfs-from-scratch/