设为首页 加入收藏

TOP

Hi3798MV200 恩兔N2 NS-1 (三): 制作 Ubuntu rootfs(一)
2023-08-26 21:10:25 】 浏览:121
Tags:Hi3798MV200 恩兔 NS-1 制作 Ubuntu rootfs

目录

关于根文件系统 rootfs

在 Linux 中, 所有的文件和目录被组织成一个树状的结构, 而根文件系统, rootfs, the root filesystem, 位于文件树的顶层(路径'/'). Linux 内核通过 root = 设置的参数挂载 rootfs. 在根文件系统中也包含了其它文件树的挂载点(mount points), 用于将其它文件(设备)挂载到当前环境中, 形成完整的系统.

在根文件系统中包含了用于系统启动和操作的关键文件. 系统引导启动程序会在根文件系统挂载之后执行初始化脚本(如rcS, init.d, profile).

如果把整个Linux操作系统看作层级关系, 根文件系统是位于内核之上的模块,对于同样的硬件和架构, Linux各个发行版的区别主要在于根文件系统, 而底层的内核部分几乎是一样的. 通过制作根文件系统, 可以更换成其它发行版, 定制自己的最小化安装.

文件准备

底包

本例使用的是稍息版 Debian 10, 替换成 Ubuntu20.04.

从 stretch.tar.bz2 中提取驱动部分, 位于 /lib/modules/4.4.35-hi3798mv2x/

下载 ubuntu-base

从国内镜像站点, 下载 ubuntu-base 包

解压

在本地创建工作目录, 将压缩包解压到工作目录下, 注意要用 sudo + -p(-p, --preserve-permissions)参数, 保留原owner和原权限

mkdir workroot
sudo tar -xpf ubuntu-base-20.04.5-base-arm64.tar.gz -C workroot/

初始的目录大小为77MB左右. 可以检查一下 workroot 下的文件目录, owner是否为 root.

关于为什么要用 sudo

Even if you use tar's --same-owner flag, you will still need to extract the files as root to preserve ownership.
--same-owner flag is on by default for root.
--no-same-owner, extract files as yourself, which is default for ordinary users

准备 resolv.conf

base系统中 resolv.conf 为空, 需要设置 nameserver 否则 chroot 后目标系统 apt install 时无法解析域名

选项一, 复制

复制 resolv.conf 到目标系统

sudo cp /etc/resolv.conf workroot/etc/resolv.conf

选项二, 直接写

echo "nameserver 127.0.0.53" | sudo tee workroot/etc/resolv.conf

复制 qemu-xxx-static

安装 qemu-user-static, 这个包里面有各个架构的二进制执行文件, 会安装到 /usr/bin

sudo apt install qemu-user-static

对于 armhf, 复制 qemu-arm-static; 对于 arm64 复制 qemu-aarch64-static

# armhf
sudo cp /usr/bin/qemu-arm-static workroot/usr/bin/
# arm64
sudo cp /usr/bin/qemu-aarch64-static workroot/usr/bin/

在进行下一步之前检查文件格式是否正确, 32位的 armhf 用 qemu-arm-static, 64位的 arm64 用 qemu-aarch64-static

# armhf
sudo chroot workroot/ /usr/bin/qemu-arm-static /bin/ls
# arm64
sudo chroot workroot/ /usr/bin/qemu-aarch64-static /bin/ls

如果文件架构不匹配, 会提示- /bin/ls: Invalid ELF image for this architecture

修改目标系统软件源

vi workroot/etc/apt/sources.list

替换为USTC源

: %s/http:\/\/ports.ubuntu.com\/ubuntu-ports\//http:\/\/mirrors.ustc.edu.cn\/ubuntu-ports\//gc

挂载目标系统

选项一: 手工挂载

挂载目录

sudo mount -t proc /proc    workroot/proc
sudo mount -t sysfs /sys    workroot/sys
sudo mount -o bind /dev     workroot/dev
sudo mount -o bind /dev/pts workroot/dev/pts

切换根目录

sudo chroot workroot/

如果前面的检查没问题, 但是这一步总是提示 '/bin/bash': Exec format error, 检查一下 binfmts 是否开启

update-binfmts --display

正常应该显示如下, 对应格式为 enabled,

qemu-aarch64 (enabled):
     package = qemu-user-static
...
qemu-arm (enabled):
     package = qemu-user-static
...

如果显示为 disabled, 需要检查是否有软件未安装. 安装了 Docker 的 Ubuntu 环境可能会有冲突.

$ mount | grep binfmt
systemd-1 on /proc/sys/fs/binfmt_misc type autofs (rw,relatime,fd=29,pgrp=1,timeout=0,minproto=5,maxproto=5,direct,pipe_ino=18150)
binfmt_misc on /proc/sys/fs/binfmt_misc type binfmt_misc (rw,nosuid,nodev,noexec,relatime)

选项二: 使用脚本挂载

以上的操作, 可以通过一个脚本进行简化

#!/bin/bash
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/
首页 上一页 1 2 3 4 下一页 尾页 1/4/4
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇物联网开发平台PlatformIO手册(中.. 下一篇Hi3798MV200 恩兔N2 NS-1 (二): H..

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目