Kernel4.4
RK Linux SDK
rk的buildroot对ros支持不友好,也没有官方可用教程参考,项目需求只好用ubuntu做文件系统。
记录下制作方法步骤:
1.首先下载最新的arm64 ubuntu release image
最新的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
解压缩后是这样的:
user@user:~/ubuntu-rootfs$ ls
bin dev home media opt root sbin sys usr
boot etc lib mnt proc run srv tmp var
2.安装 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。
3.mount proc, sys, dev, dev/pts到新的文件系统
利用一个简单的ch-mount.sh脚本来完成这个动作。
它可以帮我们mount及unmount。
#!/bin/bash
#
#sudo chgrp -R root ubuntu-rootfs/
#sudo chown -R root ubuntu-rootfs/
function mnt() {
echo "MOUNTING"
sudo mount -t proc /proc ${2}proc
sudo mount -t sysfs /sys ${2}sys
sudo mount -o bind /dev ${2}dev
sudo mount -o bind /dev/pts ${2}dev/pts
sudo chroot ${2}
}
function umnt() {
echo "UNMOUNTING"
sudo umount ${2}proc
sudo umount ${2}sys
sudo umount ${2}dev/pts
sudo umount ${2}dev
}
if [ "$1" == "-m" ] && [ -n "$2" ] ;
then
mnt $1 $2
elif [ "$1" == "-u" ] && [ -n "$2" ];
then
umnt $1 $2
else
echo ""
echo "Either 1'st, 2'nd or both parameters were missing"
echo ""
echo "1'st parameter can be one of these: -m(mount) OR -u(umount)"
echo "2'nd parameter is the full path of rootfs directory(with trailing '/')"
echo ""
echo "For example: ch-mount -m /media/sdcard/"
echo ""
echo 1st parameter : ${1}
echo 2nd parameter : ${2}
fi
把下载好的脚本置于ubuntu-rootfs目录的上一级目录,并修改权限:
user@user:~$ chmod a+x ch-mount.sh
执行mount动作,注意退出后一定再执行unmount,否则你的本机ubuntu系统会出问题,需要重启才能恢复正常。
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 bash-completion lxtask htop python-gobject-2 python-gtk2 synaptic --no-install-recommends
apt install bash-completion
apt install vim
如不能安装更新一下源
apt update
安装dhcp server
apt install isc-dhcp-server
安装gcc make g++
apt install build-essential
4.系统基础配置
在chroot环境中配置
root@user:/# useradd -s '/bin/bash' -m -G adm,sudo vampire
root@user:/# passwd vampire
root@user:/# passwd root
设置主机名
root@user:/# echo 'ubuntu.vampire' > /etc/hostname
设置自动更新DNS
root@user:/# apt-get install resolvconf
root@user:/# dpkg-reconfigure resolvconf
添加主机入口到/etc/hosts:
root@user:/#echo "127.0.0.1 localhost" > /etc/hosts
root@user:/#echo "127.0.0.1 ubuntu.vampire" > /etc/hosts
root@user:/#echo "127.0.1.1 vampire" > /etc/hosts
设置timezone
root@user:/# apt-get install tzdata
root@user:/# dpkg-reconfigure tzdata
在lib目录下创建目录并拷入我们自己硬件相关的模块文件
我们可以从我们的host中拷入我们想要的arm64的模块到系统中,比如:
root@user:/# cp -r /opt/out/modules/3.4.5 ~/ubuntu-rootfs/lib/modules
在这里,我们把我们想要定制的包拷入到lib之下的modules中。
退出并制作可烧录的固件
root@user:/# exit
这里一定要注意,**每次exit出来之后要执行一次umount**,不然会导致本机系统会挂掉
exit
user@user:~$ pwd
/home/user
user@user:~$ ./ch-mount.sh -u ubuntu-rootfs
/proc target is busy
如果umount失败了,需要重启,然后直接下一步即可
5.制作打包ubuntu文件系统镜像
使用dd指令制作空的固件容器
$ dd if=/dev/zero of=ubuntu-rootfs.img bs=1M count=4096
bs乘以count是容器的大小,这个具体看做出来的image有多大,编译ros后镜像有6g,所以这里可以把count=8192即可满足。
$ sudo mkfs.ext4 ubuntu-rootfs.img
将arm64文件系统内容制作到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)
6.下载到板子中开机
使用rk自带工具
./upgrade_tool di -rootfs ubuntu-rootfs.img
然后上电,开机
参考
制作ubuntu文件系统
下篇文章记录一下制作好的镜像在使用中遇到的问题。