RK3399制作及使用ubuntu文件系统--上

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文件系统

下篇文章记录一下制作好的镜像在使用中遇到的问题。

上一篇:rk3399 源码下查找交叉编译工具链


下一篇:RK3399平台开发系列讲解(内核子系统篇)2.14、I2C的读写相关数据结构关系