参考:
http://wiki.t-firefly.com/zh_CN/Firefly-RK3399/linux_build_ubuntu_rootfs.html
https://blog.csdn.net/mountzf/article/details/51707853

从官网下载ubuntu基本裸系统

http://cdimage.ubuntu.com/ubuntu-base/releases/16.04/release/
http://cdimage.ubuntu.com/ubuntu-base/releases/16.04/release/ubuntu-base-16.04-core-armhf.tar.gz
下载得到ubuntu-base-16.04-core-armhf.tar.gz文件,解压:

chry@chry-PC:~/code/rk3288$ mkdir ubuntufs
chry@chry-PC:~/code/rk3288$ sudo tar -xpf ubuntu-base-16.04-core-armhf.tar.gz -C ubuntufs
chry@chry-PC:~/code/rk3288$ 

修改根文件系统

准备工作

准备qemu

由于我们要chroot,所以需要能够在chroot环境执行arm64版本的binary,所以我们要接触linux的binfmt机制和qemu static解释器。qemu是纯软件实现的虚拟化模拟器,几乎可以模拟任何硬件设备,有了它就可以通过chroot命令进入不同平台架构的根文件系统进行相关操作。

chry@chry-PC:~/code/rk3288$ sudo apt-get install qemu-user-static
安装完毕后复制
chry@chry-PC:~/code/rk3288$ sudo cp /usr/bin/qemu-arm-static ubuntufs/usr/bin/

注意要拷对qemu的版本,有arm、aarch64、i86等等等等,这里下载的ubuntu-base-16.04-core-armhf.tar.gz对应qemu-arm-static版本。

准备网络

将本机的dns配置复制到目标rootfs

chry@chry-PC:~/code/rk3288$ sudo cp -b /etc/resolv.conf ubuntufs/etc/resolv.conf

修改安装包的源,老生常谈了。把所有的# deb替换成deb,即取消注释,然后将所有链接换成阿里云的源。另外需要注意的是,其中的xenial代表ubuntu16.04版本,如果是ubuntu18.04则对应bionic

chry@chry-PC:~/code/rk3288$ sudo vi ubuntufs/etc/apt/sources.list

# See http://help.ubuntu.com/community/UpgradeNotes for how to upgrade to
# newer versions of the distribution.

deb http://mirrors.aliyun.com/ubuntu-ports/ xenial main restricted
deb-src http://mirrors.aliyun.com/ubuntu-ports/ xenial main restricted

## Major bug fix updates produced after the final release of the
## distribution.
deb http://mirrors.aliyun.com/ubuntu-ports/ xenial-updates main restricted
deb-src http://mirrors.aliyun.com/ubuntu-ports/ xenial-updates main restricted

## Uncomment the following two lines to add software from the 'universe'
## repository.
## N.B. software from this repository is ENTIRELY UNSUPPORTED by the Ubuntu
## team. Also, please note that software in universe WILL NOT receive any
## review or updates from the Ubuntu security team.
deb http://mirrors.aliyun.com/ubuntu-ports/ xenial universe
deb-src http://mirrors.aliyun.com/ubuntu-ports/ xenial universe
deb http://mirrors.aliyun.com/ubuntu-ports/ xenial-updates universe
deb-src http://mirrors.aliyun.com/ubuntu-ports/ xenial-updates universe

## N.B. software from this repository may not have been tested as
## extensively as that contained in the main release, although it includes
## newer versions of some applications which may provide useful features.
## Also, please note that software in backports WILL NOT receive any review
## or updates from the Ubuntu security team.
deb http://mirrors.aliyun.com/ubuntu-ports/ xenial-backports main restricted
deb-src http://mirrors.aliyun.com/ubuntu-ports/ xenial-backports main restricted

deb http://mirrors.aliyun.com/ubuntu-ports/ xenial-security main restricted
deb-src http://mirrors.aliyun.com/ubuntu-ports/ xenial-security main restricted
deb http://mirrors.aliyun.com/ubuntu-ports/ xenial-security universe
deb-src http://mirrors.aliyun.com/ubuntu-ports/ xenial-security universe
deb http://mirrors.aliyun.com/ubuntu-ports/ xenial-security multiverse
deb-src http://mirrors.aliyun.com/ubuntu-ports/ xenial-security multiverse

使用chroot命令进入根文件系统进行操作

chry@chry-PC:~/code/rk3288$ sudo chroot ubuntufs

chroot,即 change root directory,更改root目录的意思,命令详情自查。

root@chry-PC:/# ls
bin  boot  dev  etc  home  lib  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
root@chry-PC:/# pwd
/

更新及安装软件

第一件事肯定是从源服务器那里下载最新的软件包列表,使用apt update命令,然后酌情使用apt upgrade命令更新已安装的软件

root@chry-PC:/# apt update
root@chry-PC:/# apt upgrade

然后是使用apt-get install命令安装需要用到的软件,这一步自行发挥。可以在最后面增加--no-install-recommends参数来避免安装非必须的文件,从而减小镜像的体积。

root@chry-PC:/# apt-get install vim net-tools iputils-ping ssh udhcpc sudo rsync --no-install-recommends

添加用户及设置密码

root@chry-PC:/# useradd -s '/bin/bash' -m -G adm,sudo chry
root@chry-PC:/# passwd chry
Enter new UNIX password: 
Retype new UNIX password: 
passwd: password updated successfully
root@chry-PC:/# passwd root
Enter new UNIX password: 
Retype new UNIX password: 
passwd: password updated successfully
root@chry-PC:/# 

设置可使用root用户登录ssh

安装ssh后,默认情况下不允许使用root用户登录,需作以下修改:

root@chry-PC:/# vi /etc/ssh/sshd_config 

找到PermitRootLogin prohibit-password,改成PermitRootLogin yes

设置串口

因为暂时未安装桌面,所以这里的配置要具体和内核中登录的串口的设备对应起来,不然对导致无法通过串口登录的问题。具体可能会因为目标板差异而不同,具体要参考所使用的平台进行修改。
我的目标开发板为rk3288,它的登录串口为ttyFIQ0,

vi /lib/systemd/system/serial-getty\@.service
  • 修改BindsTo选项:
    dev-%i.device
    改成
    dev-%i
    如果不执行这一步,烧录文件系统后启动,串口可能会卡死。
    或另行参考链接(未验证):https://blog.csdn.net/u010632165/article/details/78424000

串口自动登录root用户(可选)

  • 修改ExecStart选项:
    -/sbin/agetty --keep-baud 115200,38400,9600 %I $TERM
    改成
    -/sbin/agetty -a root --keep-baud 115200,38400,9600 %I $TERM

允许root用户登录串口(可选)

vi /etc/pam.d/login

搜索pam_securetty.so,找到改行在前面加#号注释掉:
#auth [success=ok new_authtok_reqd=ok ignore=ignore user_unknown=bad default=die] pam_securetty.so

设置主机名(可选)

默认主机名为localhost.localdomain

root@chry-PC:/# echo 'ubuntu.chry' > /etc/hostname

添加主机入口

root@chry-PC:/# vi /etc/hosts
127.0.0.1		localhost
127.0.0.1		ubuntu.chry

如果不修改/etc/hosts,该系统每次运行sudo命令都会有错误提示,但不影响使用。

制作根文件系统

在修改完跟文件系统后,使用exit退出来,开始制作镜像文件。

root@chry-PC:/# exit

使用du命令查看一下修改后根文件系统的大小

chry@chry-PC:~/code/rk3288$ sudo du -h --max-depth=0 ubuntufs/
410M	ubuntufs/

用dd工具创建镜像文件,注意6G是分区大小:

chry@chry-PC:~/code/rk3288$ dd if=/dev/zero of=linuxroot.img bs=1M count=6144
记录了6144+0 的读入
记录了6144+0 的写出
6442450944 bytes (6.4 GB, 6.0 GiB) copied, 48.2686 s, 133 MB/s

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

chry@chry-PC:~/code/rk3288$ mkfs.ext4 -F -L linuxroot linuxroot.img
mke2fs 1.43.4 (31-Jan-2017)
丢弃设备块: 完成                            
创建含有 1572864 个块(每块 4k)和 393216 个inode的文件系统
文件系统UUID:b9207194-30bc-4f8c-9476-70ccf7c83794
超级块的备份存储于下列块: 
	32768, 98304, 163840, 229376, 294912, 819200, 884736

正在分配组表: 完成                            
正在写入inode表: 完成                            
创建日志(16384 个块)完成
写入超级块和文件系统账户统计信息: 已完成

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

chry@chry-PC:~/code/rk3288$ mkdir rootfs
chry@chry-PC:~/code/rk3288$ sudo mount linuxroot.img rootfs/
chry@chry-PC:~/code/rk3288$ sudo cp -rfp ubuntufs/*  rootfs/
chry@chry-PC:~/code/rk3288$ sudo umount rootfs/

这样linuxroot.img里就已经有刚才制作的根目录内容了,但linuxroot.img文件大小却是定义的分区大小,不是文件系统的实际大小,所以还要经过一些处理才能发布。检查并修复linuxroot.img镜像的文件系统,不熟悉的朋友可以通过网络了解此工具:

chry@chry-PC:~/code/rk3288$ e2fsck -p -f linuxroot.img
linuxroot:正在修复日志
linuxroot:16382/393216 文件(0.0% 为非连续的), 75104/1572864 块

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

chry@chry-PC:~/code/rk3288$ resize2fs -M linuxroot.img
resize2fs 1.43.4 (31-Jan-2017)
将 linuxroot.img 上的文件系统调整为 206153 个块(每块 4k)。
linuxroot.img 上的文件系统现在为 206153 个块(每块 4k)。

chry@chry-PC:~/code/rk3288$ ls -lh linuxroot.img 
-rw-r--r-- 1 chry chry 806M 9月   4 09:48 linuxroot.img

这样 linuxroot.img 就是最终的根文件系统映像文件了。
对以上命令做了整合:

sudo du -h --max-depth=0 ubuntufs/
sudo rm -rf rootfs/*
rm -rf linuxroot.img 
dd if=/dev/zero of=linuxroot.img bs=1M count=6144
mkfs.ext4 -F -L linuxroot linuxroot.img
sudo mount linuxroot.img rootfs/
sudo cp -rfp ubuntufs/*  rootfs/
sudo umount rootfs/
e2fsck -p -f linuxroot.img
resize2fs -M linuxroot.img
ls -lh linuxroot.img 
cp linuxroot.img ~/share/rockdev/

测试根文件系统

烧录

启动

测试

给rootfs分区扩展磁盘空间

分别运行命令:

sudo lsblk
sudo df -h

检查根文件系统大小是否一致,如果,不一致,运行一下命令解决:

sudo resize2fs /dev/mmcblk2p*

上面的*换成lsblk下根文件系统对应的编号。重新运行sudo df -h,问题解决。

网络测试

ifconfig发现只有127.0.0.1,运行sudo udhcpc自动获取ip,测试ping命令,测试电脑上通过ssh使用root用户登录到板子上。

更新根文件系统

在真机上做完一些改动,需要把改动更新到镜像里面,则执行以下步骤,主要在电脑ubuntu主机上运行。

chry@chry-PC:~/code/rk3288$ mkdir boardfs
chry@chry-PC:~/code/rk3288$ sudo rsync -avx root@10.6.1.46:/ boardfs/

输入验证信息即可,完成后会把开发板上的文件同步到boardfs目录,接着将该目录制作成镜像文件即可,方法同上。

rm -rf linuxroot.img 
dd if=/dev/zero of=linuxroot.img bs=1M count=6144
mkfs.ext4 -F -L linuxroot linuxroot.img
sudo mount linuxroot.img rootfs/
sudo cp -rfp boardfs/*  rootfs/
sudo umount rootfs/
e2fsck -p -f linuxroot.img
resize2fs -M linuxroot.img
ls -lh linuxroot.img 
cp linuxroot.img ~/share/rockdev/

Logo

更多推荐