Hi3798MV200 恩兔N2 NS-1 (三): 制作 Ubuntu rootfs

这篇具有很好参考价值的文章主要介绍了Hi3798MV200 恩兔N2 NS-1 (三): 制作 Ubuntu rootfs。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

  • Hi3798MV200 恩兔N2 NS-1 (一): 设备介绍和刷机说明
  • Hi3798MV200 恩兔N2 NS-1 (二): HiNAS海纳思使用和修改
  • Hi3798MV200 恩兔N2 NS-1 (三): 制作 Ubuntu rootfs
  • Hi3798MV200 恩兔N2 NS-1 (四): 制作 Debian 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 包

  • https://mirrors.ustc.edu.cn/ubuntu-cdimage/ubuntu-base/releases/
  • https://mirrors.tuna.tsinghua.edu.cn/ubuntu-cdimage/ubuntu-base/releases/

解压

在本地创建工作目录, 将压缩包解压到工作目录下, 注意要用 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/pts
    sudo chroot ${2}
}
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

需要使用目标系统环境时

./mount.sh -m workroot/

定制 rootfs 内容

root@Box:/# uname -a
Linux Box 5.15.0-52-generic #58~20.04.1-Ubuntu SMP Thu Oct 13 13:09:46 UTC 2022 aarch64 aarch64 aarch64 GNU/Linux
# 检查 mount
root@Box:/# mount
/proc on /proc type proc (rw,relatime)
/sys on /sys type sysfs (rw,relatime)
udev on /dev type devtmpfs (rw,nosuid,noexec,relatime,size=6965676k,nr_inodes=1741419,mode=755,inode64)
devpts on /dev/pts type devpts (rw,nosuid,noexec,relatime,gid=5,mode=620,ptmxmode=000)

添加驱动文件

仅使用kernel自带的驱动可以启动rootfs, 但是一些板载的外设, 例如SATA硬盘和USB, 会因为没有驱动而无法识别. 需要手动将这些驱动放到rootfs中.

通过uname -r可以看到目标系统的架构为4.4.35-hi3798mv2x, 由此可以确定驱动的路径为

/lib/modules/4.4.35-hi3798mv2x/

从前面准备的底包中, 将驱动部分文件提取后放到这个目录下, 结构类似于

modules
└── 4.4.35-hi3798mv2x
    ├── kernel
    │   ├── crypto
    │   ├── drivers
    │   ├── fs
    │   ├── lib
    │   └── net
    ├── modules.alias
    ├── modules.alias.bin
    ├── modules.builtin
    ├── modules.builtin.alias.bin
    ├── modules.builtin.bin
    ├── modules.dep
    ├── modules.dep.bin
    ├── modules.devname
    ├── modules.order
    ├── modules.softdep
    ├── modules.symbols
    └── modules.symbols.bin

安装基础软件

# 77M -> 300M
apt update
# 300M -> 304M
apt install nano sudo vim-tiny

修改软件源vi /etc/apt/sources.list, 替换为USTC源

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

再安装其它软件就快多了

apt upgrade
# 304M -> 440M
apt install openssh-server
# 440M -> 445M
apt install u-boot-tools net-tools sysstat smartmontools network-manager

安装的软件包中

  • openssh-server 提供 ssh 服务
  • u-boot-tools 提供 fw_printenv 和 fw_setenv 方法, 用于修改 UBOOT 启动参数
  • net-tools 提供 ifconfig, netstat 等常用工具
  • sysstat 提供 iostat 等常用工具

基础设置

设置网络

mkdir /etc/network/interfaces.d
echo auto eth0 > etc/network/interfaces.d/eth0
echo iface eth0 inet dhcp >> etc/network/interfaces.d/eth0

给 root 用户设置密码 注意 这一步别忘了

passwd

开启 root 用户 ssh 访问, 编辑 /etc/ssh/sshd_config, 找到

#PermitRootLogin prohibit-password

替换为

PermitRootLogin yes

配置登录的串口, 修改文件 /etc/systemd/system/getty.target.wants/getty@tty1.service

vi /etc/systemd/system/getty.target.wants/getty\@tty1.service

ConditionPathExists=/dev/tty0

修改为实际的名称

ConditionPathExists=/dev/ttyAMA0

清理文件

安装完成后, 清理apt

apt autoremove
apt-get autoclean
apt-get clean
apt clean
# 结束后 368M

取消挂载目标系统

在目标系统上, exit 退出

结束后, 要先取消挂载

选项一: 手工取消挂载

sudo umount workroot/proc
sudo umount workroot/sys
sudo umount workroot/dev/pts
sudo umount workroot/dev

选项二: 通过脚本取消挂载

如果通过脚本, 则是

./mount.sh -u workroot/

制作 rootfs 镜像文件

# 生成一个适当大小的空镜像,这个大小参考du -h workroot
dd if=/dev/zero of=rootfs.img bs=1M count=1024
# 格式化 
mkfs.ext4 rootfs.img
# or
mkfs -t ext4 rootfs.img
# 挂载空镜像
mkdir rootfs
sudo mount rootfs.img rootfs/
# 写入文件, 保留权限
sudo cp -rfp workroot/* rootfs/
# 取消挂载
sudo umount rootfs/
# 检查文件系统并自动修复
e2fsck -p -f rootfs.img
# 使镜像紧凑
resize2fs -M rootfs.img

问题和解决

Root 能串口登录, 无法 ssh 登录

这是因为 ssh 默认禁止 root 登录, 编辑 /etc/ssh/sshd_config, 找到

#PermitRootLogin prohibit-password

替换为

PermitRootLogin yes

然后systemctl restart sshd重启 sshd 服务

分区可用空间为0

这是因为镜像压缩后写入, 分区大小就是镜像大小, 需要通过 resize2fs /dev/[partition] 扩充分区

方案一: 使用脚本, 手工执行

创建 /usr/bin/local_resize.sh, 内容如下, chmod +x 设为可执行

#!/bin/bash
rootfs_partition=/dev/$(lsblk -l|grep /|awk '{print $1}')
logger -t "resize-disk[$$]" "resizing $rootfs_partition"
if [ "$(echo $rootfs_partition | grep "mmc")" = "" ];then
    rootfs_disk=$(echo "$rootfs_partition" |sed -E -e 's/^(.*)[0-9]+/\1/g')
else
    rootfs_disk=$(echo "$rootfs_partition" |sed -E -e 's/^(.*)p[0-9]+/\1/g')
fi

if [ "$rootfs_disk" = "/dev/mmcblk0" ]; then
    resize2fs $rootfs_partition 2>&1 > /dev/null
else
    rootfs_partition_num=$(echo "$rootfs_partition" |sed -E -e 's/^.*([0-9]+)/\1/g')
    startfrom=$(fdisk -l ${rootfs_disk} -o device,start|grep ${rootfs_partition}|awk '{print $2}')
    (echo d; echo $rootfs_partition_num; echo n; echo p; echo $rootfs_partition_num; echo $startfrom; echo ; echo p; echo w;) | fdisk $rootfs_disk
    sync
    resize2fs $rootfs_partition
fi
logger -t "resize-disk[$$]" "resized $rootfs_partition"

方案二: 使用 systemd service 在第一次启动时执行

增加 /usr/sbin/local-resize2fs.sh , chmod +x 设为可执行

#!/bin/bash
if [ ! -f /etc/first_init ]; then
    rootfs_partition=/dev/$(lsblk -l|grep /|awk '{print $1}')
    logger -t "resize-disk[$$]" "resizing $rootfs_partition"
    if [ "$(echo $rootfs_partition | grep "mmc")" = "" ];then
        rootfs_disk=$(echo "$rootfs_partition" |sed -E -e 's/^(.*)[0-9]+/\1/g')
    else
        rootfs_disk=$(echo "$rootfs_partition" |sed -E -e 's/^(.*)p[0-9]+/\1/g')
    fi

    if [ "$rootfs_disk" = "/dev/mmcblk0" ]; then
        resize2fs $rootfs_partition 2>&1 > /dev/null
    else
        rootfs_partition_num=$(echo "$rootfs_partition" |sed -E -e 's/^.*([0-9]+)/\1/g')
        startfrom=$(fdisk -l ${rootfs_disk} -o device,start|grep ${rootfs_partition}|awk '{print $2}')
        #lastsector=$(fdisk -l ${rootfs_disk} -o device,end|grep ${rootfs_partition}|awk '{print $2}')
        (echo d; echo $rootfs_partition_num; echo n; echo p; echo $rootfs_partition_num; echo $startfrom; echo ; echo p; echo w;) | fdisk $rootfs_disk
        sync
        resize2fs $rootfs_partition
    fi
    echo `date +%s%N` > /etc/first_init
    logger -t "resize-disk[$$]" "resized $rootfs_partition"
fi
exit 0

增加service: /etc/systemd/system/resize2fs.service

[Unit]
Description=resize2fs local filesystem
Before=local-fs-pre.target
DefaultDependencies=no

[Service]
Type=oneshot
TimeoutSec=infinity
ExecStart=/usr/sbin/local-resize2fs.sh
RemainAfterExit=true

[Install]
RequiredBy=local-fs-pre.target

在 /etc/systemd/system/local-fs-pre.target.wants/ 下面增加 resize2fs.service 的软链, 使其生效文章来源地址https://www.toymoban.com/news/detail-630445.html

参考

  • https://wiki.t-firefly.com/en/ROC-RK3399-PC/linux_build_ubuntu_rootfs.html

到了这里,关于Hi3798MV200 恩兔N2 NS-1 (三): 制作 Ubuntu rootfs的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • EC6110-Hi3798MV310-当贝纯净桌面-卡刷强刷固件包

    EC6110-Hi3798MV310-当贝纯净桌面-卡刷强刷固件包-内有教程及短接点 特点: 1、适用于对应型号的电视盒子刷机; 2、开放原厂固件屏蔽的市场安装和u盘安装apk; 3、修改dns,三网通用; 4、大量精简内置的没用的软件,运行速度提升,多出大量的存储空间; 5、去除应用安装限制

    2024年02月03日
    浏览(37)
  • 华为盒子EC6110-M、EC6110-T(3798mv310芯片)强刷固件及教程

    固件特点: 1.采用官方系统核心以及官方内核; 2.全局精简,保留基本功能,速度更快,无广告,无推送; 3.微调运行机制,使系统更流畅; 4.默认开启硬件GPU加速; 5.固件默认开启ROOT。默认开启ADB; 6.添加精简版当贝桌面,桌面和软件可以自由选择卸载; 7.本固件刷机为三

    2024年02月11日
    浏览(42)
  • RISC-V Linux系统rootfs制作

    buildroot 是一个构建嵌入式Linux系统的框架。整个 buildroot 是由Makefile(*.mk) 脚本和 Kconfig(Config.in) 配置文件构成的,因此可以像配置 Linux 内核一样执行 make menuconfig 进行配置,编译出一个完整的、可以直接烧写到机器上运行的 Linux 系统文件(包含 bootloader、kernel、rootfs 以及 rootf

    2024年02月11日
    浏览(40)
  • NS2安装及入门实例——(ns2.35 / Ubuntu20.04)

    官网下载地址:http://www.isi.edu/nsnam/ns/ 点击 allinone 点击 current release 2.35 安装 ns-allinone-2.35.tar.gz ① 问题1 解决: ② 问题2 解决: ③ 问题3 解决:全部加上 (char) 加入一下配置: 输入 ns,进入成功: 解决:

    2024年02月10日
    浏览(40)
  • ubuntu22.04下rv1109 rootfs编译问题处理

    出于对Ubuntu新版本系统的体验,将系统更新到了ubuntu22.04了。然后在编译rv1109 sdk时出现了一些异常的错误。但是已经不回去了,只能硬着头皮一路走下去了。并将错误记录以下,以便下次有类似错误,做个参考。 buildroot 报错:c-stack.c:55:26:error:missing binary operator before token “

    2024年02月11日
    浏览(39)
  • 【TES714】JFM7K325T(复旦微FPGA)+HI3531DV200(华为海思)的综合视频处理平台设计原理图及调试经验

    板卡概述 TES714 是自主研制的一款 5路HD-SDI 视频采集图像处理平台,该平台采用上海复旦微的高性能Kintex系列FPGA加上华为海思的高性能视频处理器 HI3531DV200 来实现。 华为海思的HI3531DV200是一款集成了ARM A53四核处理器性能强大的神经网络引擎,支持多种智能算法应用,集成多

    2024年02月13日
    浏览(43)
  • Ubuntu22.04安装ns3全教程并整合ns3-ai

    ns-3是一个开源的网络仿真器,用于网络通信系统和协议的建模与仿真。它被广泛应用于研究、开发和测试各种网络技术和算法。ns-3被构建为一组相互协作的软件库,用户可以编写C++或Python编程语言的程序,并与这些库进行链接或导入。   ns-3的整个可用库集合依赖于第三方库

    2024年02月07日
    浏览(82)
  • SuperMap Hi-Fi 3D SDK for Unity制作游戏引擎材质

    kele     在交通,电力,规划等行业中,有的对象常常具有很强的质感,比如金属质感的 钢轨,电力塔;陶瓷材质的绝缘子;玻璃材质的建筑幕墙等,但常规方式的表现效果 往往差强人意。     游戏引擎(Unity3D)中已有丰富的材质资源库,比如玻璃,金属等材质,这

    2024年02月09日
    浏览(84)
  • Ubuntu20.04安装NS3的3.36版本(最新版本)

    1.1 VMware安装包Ubuntu的光盘映像文件: 下载链接: 下载Ubuntu光盘映像文件VMware安装包的网盘链接. 1.2 VMware安装 安装链接: VMware安装的CSDN链接. 1.3 Ubuntu安装 安装链接: Ubuntu 安装的CSDN链接. 2.1 安装ns3的依赖库 (1)安装Python API 用户的最低要求(3.30 版及更高版本,以及 ns-3-dev):

    2024年02月04日
    浏览(76)
  • 香橙派--关于jammy-xfce-arm64.f12a43b3e629442a073a7236bf9166ce.tar.lz4的rootfs定制与镜像制作

    Linux SDK,即 orangepi-build,支持在安装有 Ubuntu 22.04 的电脑上运行,所以下载 orangepi-build 前,请首先确保自己电脑已安装的 Ubuntu 版本是 Ubuntu22.04。查看电脑已安装的 Ubuntu 版本的命令如下所示,如果 Release 字段显示的不是 22.04,说明当前使用的 Ubuntu 版本不符合要求,请更换系

    2024年02月03日
    浏览(41)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包