0 背景

有一个很厉害的师兄针对我们实验室的需求设计了一块控制板,以beaglebone为基础,由于更改了一些底层的硬件,所以重新定制编译的内核,并预先烧写到了板子的flash中。现在需要安装ubuntu的文件系统,以使用ROS的相关功能函数库。前一段时间我在beaglebone官网下载了其提供的预编译好的根文件系统,修改挂载设置fstab文件后顺利启动,但是不能支持图形界面,不知是内核支持的原因还是文件系统的原因。前面琢磨了如何编译适用于ARM架构的内核(编译适用于ARM的linux内核并进行QEMU仿真),为了今后在需要时按自己的意愿修改文件系统,最近两天一直在研究如何定制自己的根文件系统,参考了几篇经验帖,结合自己的实践,特记录于此。

图1 Ubuntu rootfs定制流程

1 获得ubuntu基本裸系统

1.1 利用debootstrap工具

参考ubuntu提供的网站https://wiki.ubuntu.com/ARM/RootfsFromScratch/QemuDebootstrap

由于我要跨平台运行,所以不能简单地进行本机编译,在网上查询专门有一个模拟不同机器架构的软件qemu,而在ubuntu中对其支持良好。所以首先在PC主机ubuntu系统中安装qemu模拟器:

sudo apt-get install qemu-user-static

然后就可以利用下面的命令获得一个基本的ubuntu裸文件系统:

sudoqemu-debootstrap --arch armhf --variant=minbase --verbose trusty /mnt/rootfs/

生成的minbase文件系统大小为123M。

manqemu-debootstrap可以看到其原理:

The  qemu-debootstrap  wrapper calls  debootstrap(8)  making use  of  the --foreign  and  --second-stage  options, and copies the appropriate qemu-user-static(1) binary into place inorder to install cross-architecture chroots. In order for it  to work  seamlessly,  the binfmt-support package must be installed.

也就是qemu-debootstrap调用debootstrap函数,并且把qemu-user-static的二进制文件qemu-arm-static复制到目标目录中以用于跨平台编译。qemu-debootstrap的参数选项和debootstrap相同,具体的可以查看debootstrap的用法。

1.2 从ubuntu官网下载

我们也可以从ubuntu官方网站下载其提供的最小裸文件系统。

mkdir~/ubuntu-rootfs

cd ubuntu-rootfs

# 下载Ubuntu Core rootfs

wget http://cdimage.ubuntu.com/ubuntu-core/releases/14.04.1/release/ubuntu-core-14.04-core-armhf.tar.gz

解压Ubuntu Core rootfs tar包,注意一定要用sudo

sudo tar -xzvf ubuntu-core-14.04-core-armhf.tar.gz

# 退回到上一级目录

cd ..

由于我们要chroot,所以需要能够在chroot环境执行armhf版本的binary,所以我们要接触linux的binfmt机制和qemu static解释器

sudo apt-getinstall qemu-user-static

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

先将本机的dns配置复制到目标rootfs,后面联网时会用到

sudo cp -b/etc/resolv.conf ~/ubuntu-rootfs/etc/resolv.conf

2 挂载相关文件系统并chroot

挂载proc, sys, dev, dev/pts等文件系统,我们可以编写一个bash脚本ch-mount.sh来完成挂载和后面的卸载操作,下载ch-mount.sh至当前目录,执行如下操作:

sudo bashch-mount.sh -m ubuntu-rootfs/

ch-mount.sh的内容

#!/bin/bash
function mnt() {echo "MOUNTING"sudo mount -t proc /proc ${2}procsudo mount -t sysfs /sys ${2}syssudo mount -o bind /dev ${2}devsudo mount -o bind /dev/pts ${2}dev/pts        sudo chroot ${2}
}
function umnt(){echo "UNMOUNTING"sudo umount ${2}procsudo umount ${2}syssudo umount ${2}dev/ptssudo umount ${2}dev
}
if ["$1" == "-m" ] && [ -n "$2" ] ;
thenmnt $1 $2
elif ["$1" == "-u" ] && [ -n "$2" ];
thenumnt $1 $2
elseecho ""echo "Either 1'st, 2'nd or bothparameters were missing"echo ""echo "1'st parameter can be one ofthese: -m(mount) OR -u(umount)"echo "2'nd parameter is the full pathof rootfs directory(with trailing '/')"echo ""echo "For example: ch-mount -m/media/sdcard/"echo ""echo 1st parameter : ${1}echo 2nd parameter : ${2}
fi

3 配置网络服务

一旦进入了chroot的环境,我们需要修改/etc/apt/sources.list的内容。去掉除以deb-src开头的所有库的注释,这里可能需要用到vim编辑器,所以最好是在chroot之前就在主机目录下把ubuntu-rootfs//etc/apt/sources.list的内容修改好,因为一旦chroot后,裸根文件系统很可能没有安装vim编辑器。网络的dns我们在第一步中已经复制过来了。

4 安装所需软件包

apt-get update

首先更新资源列表,然后安装必备的软件包,根据自己的需求:

#language-pack-en-base   英文翻译的mo文件

# sudo                    sudo命令

# ssh                     ssh的client和server

# net-tools               ifconfig,netstat,route,arp等

# ethtool                 ethtool命令,显示、修改以太网设置

#wireless-tools          iwconfig等,显示、修改无线设置

# ifupdown                ifup,ifdown等工具

#network-manager         Network Manager服务和框架,高级网络管理

# iputils-ping            ping和ping6

# rsyslog                 系统log服务

#bash-completion         bash命令行补全

# htop                    htop工具,交互式进程查看器

apt-get install\language-pack-en-base \sudo \ssh \net-tools \ethtool \wireless-tools \ifupdown \network-manager \iputils-ping \rsyslog \bash-completion \htop \--no-install-recommends

5 设置用户相关

adduser Ubuntu,然后根据提示设置密码。

设置主机名称:

echo"ubuntu-arm">/etc/hostname

设置本机入口ip:

echo"127.0.0.1 localhost">>/etc/hosts

echo"127.0.1.1 ubuntu-arm">>/etc/hosts

允许自动更新dns:

dpkg-reconfigureresolvconf

设置时区:

dpkg-reconfiguretzdata

6 配置串口调试服务

在用debootstrap制作的rootfs里,是不包含有串口登陆tty的。需要添加一个/etc/init/ttyS0.conf文件才能从串口登陆。否则你会在串口看见KERNL的输出信息,但就是等不到登陆提示。

cp tty1.confttyS0.conf

vi ttyS0.conf,修改其内容如下:

start on stoppedrc or RUNLEVEL=[12345]

stop on runlevel[!12345]

respawn

exec /sbin/getty-L 115200 ttyS0 vt102

由于最后要利用SD卡在板子上启动,需要修改/etc/fstab 的内容,以便根文件系统能够正确地挂载,否则不能正确挂载根文件系统将导致系统无法启动。由于在内核中设置的根文件系统的挂载目录是SD卡的第五分区,于是如下设置:

# <file system>   <dir>         <type>    <options>                          <dump> <pass>
/dev/mmcblk0p5    /             ext4      defaults,noatime,errors=remount-ro   0      1
/dev/mmcblk0p1    /boot/uboot   vfat      defaults,noatime                     0      0

然后exit退出chroot,执行sudo bash ch-mount.sh -m ubuntu-rootfs/卸载相关文件系统即可。

我利用debootstrap工具完成的根文件系统包的大小为:

sudo du -s -h rootfs

288M    rootfs

而利用ubuntu官方网站提供的裸系统制作的根文件系统包的大小为:

sudo du -s -hubuntu-core-rootfs

276M    ubuntu-core-rootfs

为什么我自己做的会稍微大一点儿呢?我什么也没有多加啊,都是按照最简化来的。

参考文献:

[1] https://wiki.ubuntu.com/ARM/RootfsFromScratch/QemuDebootstrap

[2] http://gnu-linux.org/building-ubuntu-rootfs-for-arm.html

[3] http://blog.csdn.net/wjs1033/article/details/44559035

[4] https://uframer.gitbooks.io/beaglebone-black-notes/content/building_ubuntu_rootfs_for_arm.html

祝枫

2016年6月18日于深圳

---------------------------------------------------分割线--------------------------------------------------------------

2016年6月20日记:

今天试了下前两天自己做的系统,分别是在ubuntu系统下基于debootstrap制作的最小文件系统和在ubuntu官网提供的ubuntu-core的基础上修改的文件系统。观察其启动过程,应该是都通过了文件系统检查并已成功启动,因为kernel输出的启动信息都到了* Stopping System Vrunlevel compatibility[ OK ],然而都是无法正常显示登陆界面,致使无法登陆。查询原因,应该是串口登录设置不正确,针对根据debootstrap制作的无论怎么修改串口设置,都不见成效,最后只能暂时放下。根据ubuntu-core更改的系统,一开始也是启动到相同的位置就卡住了,由于之前从beaglebone官网上下载的能够正常启动的文件系统就是beaglebone根据ubuntu-core更改的,于是我参考了一下之前下载的那个文件系统中的串口登录设置,发现其/etc/init/文件夹下有一个名为serial.conf的文件,打开后其内容如下:

start on stoppedrc RUNLEVEL=[2345]

stop on runlevel[!2345]

respawn

exec /sbin/getty115200 ttyO0

额,竟然是ttyO0,不是tty00!!!!!怪不得刚才在第一个文件系统中尝试tty00没有反应,在linux下O和0可真像啊。。。对了,在第二个系统中我是直接把那个serial.conf复制过去的,然后就正常气动了。要不然让我写成了tty00,又不知道要再在这里卡多少天呢,但是这也暴露了对于文件系统内部的知识,我还是很欠缺的。把第一个系统中的串口登录配置也改为serial.conf时,成功启动!

在成功启动的系统中,又遇到了用户权限问题,系统里面没有root用户权限。应该是当时没有修改debootstrap的root密码导致的。在PC上通过chroot更改根目录后,执行:

passwd root修改root密码后,在板子上就可以通过su –切换至超级用户,然后修改/etc/sudoers里面的内容,在root行下加上这句:

user    ALL=(ALL:ALL) ALL,然后user就可以获得root权限了。

至此,一个自己定制并成功安装的ubuntu for ARM最小根文件系统就完成了。

定制适用于ARM平台的Ubuntu rootfs(根文件系统)相关推荐

  1. 如何在arm平台移植ubuntu系统(转)

    linux查看内核版本和发行版本号: https://www.cnblogs.com/guiyishanren/articles/8638921.html 华为开源镜像网站:含有不同平台架构的系统资源 ...

  2. 玩转mini2440开发板之【编译烧录rootfs根文件系统全过程记录】

    前段时间研究了一下如何使用busybox编译和生成最简linux根文件系统(rootfs),并在mini2440开发板上使用NFS网络文件系统进行挂载启动,今天继续研究如何将该根文件系统烧录到开发板上 ...

  3. Linux学习笔记---记一次rootfs根文件系统下载时掉进的大坑

    俗话说要想技术好,踩坑少不了.技术的好坏和踩坑的多少基本是成正比的.这次就大大的提升了一次技术(大大的踩了一次坑).废话少说,直奔主题. 最近入手了一块正点原子的IMX6ULL开发板,跟着视频教程和开 ...

  4. rootfs根文件系统扫盲

    rtos用的文件系统,根据设备介质,分为几种: 1. RAM上文件系统RAMFS, ROMFS 2. SPI FLASH/SD CARD上文件系统为fatfs,spiffs,Reliance Edge ...

  5. android rootfs根文件系统挂载

    linux下文件目录为树状结构,文件系统挂载在虚拟系统的VFS各个目录下. VFS是Linux中的一个虚拟文件文件系统,也称为虚拟文件系统交换层(Virtual Filesystem Switch), ...

  6. docker image aarch64 x86_64_「docker」交叉编译适用于ARM平台的Docker源码

    前言 docker的编译环境实际是创建了一个docker容器,在docker容器内对代码进行编译.创建该docker容器的过程中,会安装一些编译docker源码需要的第三方库以及go语言环境.此处需要 ...

  7. 【ARM】使用Busybox构建根文件系统

    Busybox构建根文件系统 介绍 下载 配置busybox 配置交叉编译器 取消静态库编译 添加vi命令的支持 取消简化模块 支持mdev 中文支持 编译 完善根文件系统 创建必要文件夹 复制库 启 ...

  8. 【ARM】使用Ubuntu-base构建根文件系统

    使用Buildroot构建根文件系统 介绍 资源下载 配置根文件系统 设置软件源 安装必要软件 添加新用户 设置主机名称和本机IP 设置终端串口 网络DHCP FTP服务器搭建 串口无法登录 开机启动 ...

  9. 【linux】rootfs根文件系统镜像制作

    在嵌入式linux平台中,大部分工作则是填充根文件系统,在开发中,根文件系统一般都是以目录的方式放在开发宿主机上. 当根文件系统填充完成后,我们需要将其打包成xxx.img或者其他的镜像格式.本文以x ...

最新文章

  1. 使用OpenCV进行直播(附代码)
  2. VC++从txt文本中读取字符和数字
  3. 开发过程中快速抓包并解析
  4. 好东西+php,推荐个好东西swoole,php如虎添翼
  5. 纯CSS实现圆角矩形框
  6. mysql4中出现的本地计算机 无法启动mysql服务 错误1067解决办法
  7. 老鸟程序员才知道的40个小技巧
  8. 送你两个神器,关系数据库数据入湖轻松应对
  9. argb可以和rgb同步吗_更冷更静更降温!第三代双腔设计,酷冷至尊海魔240水冷岂止RGB...
  10. python抛硬币代码_求助python掷硬币
  11. mongodb 默认端口号_你的爬虫数据储存在哪?MongoDB入门篇
  12. android 扫描SDCard.
  13. 004. Asp.Net Routing与MVC 之二: 请求如何激活Controller和Action
  14. 三级等保要求配置文档-《物理环境》《网络通信》《区域边界》《计算环境》《管理中心》《管理制度》《运维管理》《硬件配置清单》
  15. 强大的图表制作,前端数据可视化,echarts
  16. SECS\GEM RMS系统OEE定义
  17. 傲梅备份服务器系统,傲梅轻松备份如何还原系统的详细解析
  18. mac关闭和开启启动声
  19. asp.net 文件下载的五种方式
  20. 网络拨测DialTest简单介绍

热门文章

  1. 在Activiti中如何使用自定义的组织架构
  2. 相邀直播app最新入驻58位海外阿姨
  3. Subarray Sum
  4. 使用minidom来处理XML的示例(Python 学习)(转载)
  5. 《恋上数据结构第1季》二叉树基础、真二叉树、满二叉树、完全二叉树、二叉树的遍历(重点)
  6. 【Java 正则表达式】单字符匹配、预定字符、量词、Matcher(贪婪、勉强、独占模式)、捕获组、边界匹配符、String类与正则表达式
  7. Notepad++ 查找替换 换行符的方法
  8. jQuery form表单的serialize()参数和其他参数 如何一起传给后端
  9. 数仓、数据平台和中台还分不清楚?大佬的10年经验之谈,看完懂了
  10. 小白python自学—报错问题汇总(持续更新)