Firefly Ubuntu开发入门之(6)制作Ubuntu Rootfs镜像

本帖最后由 牛头 于 2016-9-29 15:09 编辑

 很多朋友希望在拿到Firelfy发布的Ubuntu镜像后,会想自己加驱动或自己编译的内核等等,但做的过程中难免出现各种各样的问题。网上各种教程都不那么切题,讲解都不是那么细致,让人感到迷茫,又或许是无助。Firefly团队努力地在帮助开发者打破此困局,整理策划了系列教程,让开发者可以通过Firefly开源平台可以快速上手开发,并快速打造出成熟产品。

“[b]创新 开源 分享 定制[/b]”是我们的口号,我们一直在努力。

之前教程已经讲完如何替换kernel及boot 镜像制作,今天讲如何制作Ubuntu Rootfs镜像。本文主要讲解镜像制作的流程,Ubuntu系统本身的配置优化等不在本文范围。以前介绍的Rootfs镜像制作方法,需要用到miniroot工具在开发板上来操作,方法比较原始复杂。现在有新的方法,可以在PC主机上制作完可烧录的Rootfs镜像,比较方便,参考价值高。

 让我们上路吧。

首先从ubuntu官方下载ubuntu core,就是ubuntu根文件系统的核心部分,没有图形界面等等,简单说就是要啥没啥的效果:

cd ~/UbuntuDev/

mkdir rootfs

cd rootfs

wget [b][u]http://cdimage.ubuntu.com/ubuntu-base/releases/16.04/release/ubuntu-base-16.04-core-armhf.tar.gz[/u][/b]

下载完后,解压到ubuntu目录:

mkdir ubuntu

sudo tar -xpf ubuntu-base-16.04-core-armhf.tar.gz -C ubuntu

jcjt62.png

解压后,可以ls看看,这就是最小化的ubuntu根文件系统,可以直接用来生成镜像,但里面基本是要啥没啥。如何可以预置一些程序呢,如vim,openssh-server,git什么的工具。办法是有的:在PC里模拟运行这个根文件系统,运行后安装配置一些需要预置的程序,再把此根文件系统打包成固件。

在PC上模拟运行根文件系统,需要安装一个工具:

sudo apt-get install qemu-user-static


另外,在切换到此根文件系统前,要对根文件系统做一些配置修改,copy qemu:

cd ubuntu

sudo cp /usr/bin/qemu-arm-static usr/bin/

拷贝PC主机端的dns配置,因为待会安装程序时要用网络:

sudo cp -b /etc/resolv.conf etc/resolv.conf

增加软件源:

sudo vim etc/apt/source.list

加入如下两行内容,保存后退出:

deb [b]http://ports.ubuntu.com/ubuntu-ports/[/b] xenial main universe

deb-src [b]http://ports.ubuntu.com/ubuntu-ports/[/b] xenial main universe

jcjt63.png

经过上述步骤,已经对ubuntu根文件系统做了简单的配置,现在可以用工具切换到此根文件系统了。

为了简化操作过程,这里使用一个切换根文件系统的脚本,[\[u\]点击下载\[/u\]](https://pan.baidu.com/s/1pLo36jD)。下载后,拷贝到~/UbuntuDev/rootfs目录,并增加可执行权限。用脚本挂载切换到指定的根文件系统,命令为:

cd ~/UbuntuDev/rootfs

chmod +x ch-mount.sh

./ch-mount.sh -m ubuntu/

可以看到执行后,终端显示的用户名发生了变化,用ls可以看到文件系统也有变化,此终端里的根文件系统已经切换到binary目录里的根文件系统。可以在终端里做安装程序等操作了,就像进入了一个新系统,所以我也叫作是模拟运行根文件系统。

这里我们实验性的给新系统装一些常用的工具:

apt-get install vim git openssh-server

jcjt65.png

敲完回车,泡茶静静地等待吧,软件装得越多就越慢。

程序装完后,给系统增加一个叫ubuntu的管理员帐号:

useradd -s ‘/bin/bash’ -m -G adm,sudo ubuntu

修改ubuntu用户密码,回车后按提示输入两次密码:

passwd ubuntu

修改root帐号的密码,回车后按提示输入两次密码:

passwd root

对新系统的修改到此为止,准备打包镜像。

退出chroot:

exit

jcjt67.png

用脚本载缷载退出根文件系统:

./ch-mount.sh -u ubuntu/

jcjt68.png

终于要制作镜像了,用dd工具创建镜像文件:

dd if=/dev/zero of=ubuntu.img bs=1M count=3000

jcjt69.png

格式化镜像文件,并加入linuxroot卷标:

sudo mkfs.ext4 -F -L linuxroot ubuntu.img

挂载镜像并往里面拷入修改后的文件系统:

mkdir ubuntu-mount

sudo mount ubuntu.img ubuntu-mount

sudo cp -rfp ubuntu/* ubuntu-mount

缷载镜像:

sudo umount ubuntu-mount


这样ubuntu.img里就已经有刚才制作的根目录内容了,但ubuntu.img文件大小却是定义的分区大小,不是文件系统的实际大小,所以还要经过一些处理才能发布。

检查并修复ubuntu.img镜像的文件系统,不熟悉的朋友可以通过网络了解此工具:

e2fsck -p -f ubuntu.img

jcjt611.png

减小ubuntu.img镜像文件的大小:

resize2fs -M ubuntu.img

执行上面两命令后,ubuntu.img瘦身不少,可以用来烧录了。

启动后,效果刚刚的,顺利启动到字符终端模式,可以通过键盘登陆ubuntu帐号。

接下来就是各种ubuntu的配置,如网络配置、安装图形桌面等等了。

路漫漫其修远兮,但毕竟我们已经在路上。

沙发

好,楼主威武。

备份下 ch-mount.sh

#!/bin/bash

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 chroot ${2}
}

function umnt() {
    echo "UNMOUNTING"
    sudo umount ${2}proc
    sudo umount ${2}sys
    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

有个问题,安装配置完qemu-user-static,好像并没有使用到这个工具啊

这个是国内的armhf ubuntu的源,提供给大家参考

deb http://mirrors.ustc.edu.cn/ubuntu-ports/ xenial-updates main restricted universe multiverse
deb-src http://mirrors.ustc.edu.cn/ubuntu-ports/ xenial-updates main restricted universe multiverse

deb http://mirrors.ustc.edu.cn/ubuntu-ports/ xenial-security main restricted universe multiverse
deb-src http://mirrors.ustc.edu.cn/ubuntu-ports/ xenial-security main restricted universe multiverse

deb http://mirrors.ustc.edu.cn/ubuntu-ports/ xenial-backports main restricted universe multiverse
deb-src http://mirrors.ustc.edu.cn/ubuntu-ports/ xenial-backports main restricted universe multiverse

deb http://mirrors.ustc.edu.cn/ubuntu-ports/ xenial main universe restricted
deb-src http://mirrors.ustc.edu.cn/ubuntu-ports/ xenial main universe restricted

deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ xenial-updates main restricted universe multiverse
deb-src http://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ xenial-updates main restricted universe multiverse

deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ xenial-security main restricted universe multiverse
deb-src http://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ xenial-security main restricted universe multiverse

deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ xenial-backports main restricted universe multiverse
deb-src http://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ xenial-backports main restricted universe multiverse

deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ xenial main universe restricted
deb-src http://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ xenial main universe restricted

csersoft 发表于 2016-9-30 10:28
有个问题,安装配置完qemu-user-static,好像并没有使用到这个工具啊

sudo cp /usr/bin/qemu-arm-static usr/bin/
这里用到啦,你可以不加这句去试试{:4_176:}

wangdongx40423p 发表于 2016-9-30 12:49
这个是国内的armhf ubuntu的源,提供给大家参考

deb http://mirrors.ustc.edu.cn/ubuntu-ports/ xenial …

{:4_170:}阔以,谢谢了

老大,能不能先公布一下网络的配置方法,现在系统启动起来了,没有网络,真的蛋疼,有了网络后面都好办了。

wangdongx40423p 发表于 2016-9-30 17:31
老大,能不能先公布一下网络的配置方法,现在系统启动起来了,没有网络,真的蛋疼,有了网络后面都好办了。

su root
dhclient eth0
前提是开发板有用以太网线连接到带DHCP服务的路由哦

wangdongx40423p 发表于 2016-9-30 17:31
老大,能不能先公布一下网络的配置方法,现在系统启动起来了,没有网络,真的蛋疼,有了网络后面都好办了。

su root
dhclient eth0
前提是开发板有用以太网线连接到带DHCP服务的路由哦

dhclient 怎么提示没有这条指令呢

wangdongx40423p 发表于 2016-9-30 17:44
dhclient 怎么提示没有这条指令呢


有的,仔细确认下

本帖最后由 wangdongx40423p 于 2016-9-30 19:07 编辑

问题我查到了,是没有执行安装软件那条指令
apt-get install vim git openssh-server

但是又有个奇怪的问题了,ifconfig这个条命令竟然没有,看来只能等楼主的大作了,
ping 指令竟然也没有,出鬼了。

本帖最后由 wangdongx40423p 于 2016-9-30 22:25 编辑

这个是rockchip 给的制作ubuntu的方法,链接如下
http://rockchip.wikidot.com/porting-os

另外rockchip 也给出来比较简单的方法,已经制作成文件了,只要运行两条命令就可以了,给大家做个参考
https://github.com/rockchip-linux/rk-rootfs-build

但是要注意rockchip 的说明

usage This repo contains rockchip rootfs build script. It will download linaro releases and set up enviroment for our chip based on the download releases.
apt-get install qemu-user-static to installing the build tools because we will chroot to this base rootfs.
//下面的命令是制作debian的文件系统
./mk-rootfs.sh to build rk-debian rootfs
./mk-image.sh to create the ext4 image(linaro-rootfs.img).

other spackages-rebuild./rebuild-packages.sh is the script help to rebuild rockchip supplied packages.To rebuild the packages, the environment must be set up properly.I recommend to chroot to a clean Stretch Debian.

//下面的是制作ubuntu的文件系统
build-ubuntuSince a lot of peoples want to get other distributions, such as ubuntu, so i write mk-rootfs-ubuntu.sh to help.But please notice this script is not well maintenance and the rootfs built by this script can be easily broken because the script don’t use package manager to install packages, it just unpack packages.

还是等楼主的大作,rockchip的并不一定合适我们这个板子

本帖最后由 wangdongx40423p 于 2016-10-1 13:36 编辑


执行如下指令,即可启动eth0
root@ubuntu:~# echo auto eth0 > /etc/network/interfaces.d/eth0
root@ubuntu:~# echo iface eth0 inet dhcp >> /etc/network/interfaces.d/eth0
root@ubuntu:~# ifup eth0

root@ubuntu:~# [b][b]dhclient eth0

如果想安装xubuntu,直接执行
[/b][/b]root@ubuntu:~# apt-get update
root@ubuntu:~# apt-get install xubuntu-desktop

安装好ifconfig指令就有了

wangdongx40423p 发表于 2016-10-1 13:33
执行如下指令,即可启动eth0
root@ubuntu:~# echo auto eth0 > /etc/network/interfaces.d/eth0
root@u …

{:4_158:}不错哦,继续前进吧

@牛头,下面可不可以介绍一下在桌面系统下怎么启用GPU?

这个是国内的armhf ubuntu的源,提供给大家参考