Hi3798MV200 恩兔N2 NS-1 (四): 制作 Debian rootfs
目录
- Hi3798MV200 恩兔N2 NS-1 (一): 设备介绍和刷机说明
- Hi3798MV200 恩兔N2 NS-1 (二): HiNAS海纳思使用和修改
- Hi3798MV200 恩兔N2 NS-1 (三): 制作 Ubuntu rootfs
- Hi3798MV200 恩兔N2 NS-1 (四): 制作 Debian rootfs
关于 Debian rootfs
Debian 没有像 Ubuntu 提供 Ubuntu-Base 那样提供打包好的 rootfs, 但是 Debian 提供了一个制作 rootfs 的工具 debootstrap. 以下介绍使用 debootstrap 制作 Debian rootfs 的过程.
debootstrap 初始化一阶段
安装 debootstrap
sudo apt install debootstrap
准备一个工作目录, 例如 workroot, 初始化. 注意一定要加 mirror, 否则会非常慢
sudo debootstrap --arch=arm64 --foreign buster workroot/ http://mirrors.ustc.edu.cn/debian/
复制 qemu-aarch64-static 到目标系统, 如果没有的话要先安装一下sudo apt install qemu-user-static
sudo cp /usr/bin/qemu-aarch64-static workroot/usr/bin/
检查一下是否能正常执行
sudo chroot workroot/ /usr/bin/qemu-aarch64-static /bin/ls
准备 resolv.conf
echo "nameserver 127.0.0.53" | sudo tee workroot/etc/resolv.conf
debootstrap 初始化二阶段
chroot 到目标系统下
sudo chroot workroot/
第二阶段的初始化
/debootstrap/debootstrap --second-stage http://mirrors.ustc.edu.cn/debian/
初始化成功的话, 能看到I: Base system installed successfully
安装设置
安装基础软件
添加 Debian apt source
cat <<EOT > /etc/apt/sources.list
# 依次输入以下内容
deb http://mirrors.ustc.edu.cn/debian buster main contrib non-free
deb-src http://mirrors.ustc.edu.cn/debian buster main contrib non-free
deb http://mirrors.ustc.edu.cn/debian-security/ buster/updates main contrib non-free
deb-src http://mirrors.ustc.edu.cn/debian-security/ buster/updates main contrib non-free
deb http://mirrors.ustc.edu.cn/debian buster-updates main contrib non-free
deb-src http://mirrors.ustc.edu.cn/debian buster-updates main contrib non-free
EOT
检查是否正确
cat /etc/apt/sources.list
最后执行 apt update
更新, apt upgrade
升级
安装一些基础软件, 这一步之后系统大小为 434M
apt install locales dialog
配置 locales, 选择 en_US.UTF-8 UTF-8, en_US.UTF-8
dpkg-reconfigure locales
继续安装一些软件
apt install vim-tiny openssh-server sudo ifupdown net-tools udev iputils-ping sysstat smartmontools
添加驱动文件
仅使用kernel自带的驱动可以启动rootfs, 但是一些板载的外设, 例如SATA硬盘和USB, 会因为没有驱动而无法识别. 需要手动将这些驱动放到rootfs中.
通过uname -r
可以看到目标系统的架构为4.4.35-hi3798mv2x
, 由此可以确定驱动的路径为
/lib/modules/4.4.35-hi3798mv2x/
将系统中这部分文件提取后放到rootfs的对应目录下, 结构类似于
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
基础设置
设置主机名
echo n2ns1 > /etc/hostname
设置网络
cat << EOT > /etc/network/interfaces.d/10-eth0
# 依次输入
auto eth0
iface eth0 inet dhcp
EOT
设置 vim
nano /etc/vim/vimrc.tiny# 修改compatible为nocompatible
set nocompatible
# 增加这行修复backspace键
set backspace=2
重要 给 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
添加欢迎界面, 新建 /etc/update-motd.d/60-welcome, 内容如下, 属性设为可执行
#!/bin/sh
#
IP=$(ifconfig eth0 | grep '\<inet\>'| grep -v '127.0.0.1' | awk '{print $2}' | awk 'NR==1')
DEVICE=$(dmesg 2> /dev/null | grep "CPU: hi3798" | awk -F ':[ ]' '/CPU/{printf ($2)}')
[ ! "$DEVICE" ] && DEVICE=$(head -n 1 /etc/regname 2> /null)
echo "Board : ${DEVICE}Module : $(egrep -oa "hi3798.+reg" /dev/mmcblk0p1| cut -d '_' -f1 | sort | uniq | tr "\\n" ",")CPU : $(cat -v /proc/device-tree/compatible |sed 's/\^@//g') @ $(cat /proc/cpuinfo | grep "processor" | sort | uniq | wc -l) coresVersion : $(awk -F '[= "]' '/PRETTY_NAME/{print $3,$4,$5}' /etc/os-release) | $(uname -r)-$(getconf LONG_BIT)bitStorage : $(df -m / | grep -v File | awk '{a=$4*100.0/$2;b=$4;c=$2} {printf("%.1f%% free, %.1fMiB of %.1fMiB\n",a,b,c)}')Memory : $(free -m | grep Mem | awk '{a=$7*100.0/$2;b=$2} {printf("%.1f%% free, %.1fMiB total\n",a,b)}') | Swap:$(free -m | grep Swap | awk '{a=$4*100/$2;b=$4} {printf("%.1f%% %.1fMiB\n",a,b)}')Up Time : $(awk '{a=$1/86400;b=($1%86400)/3600;c=($1%3600)/60;d=($1%60)} {printf("%d days %02d:%02d:%02d\n",a,b,c,d)}' /proc/uptime)IP Addr : $IPTemp : $(grep Tsensor /proc/msp/pm_cpu | awk '{print $4}')°CMAC : $(ifconfig eth0 |grep "ether"| awk '{print $2}')
"
文件清理
安装完成后, 清理apt
apt autoremove
apt autoclean
apt clean
最后exit
退出
制作 rootfs 镜像文件
# 生成一个适当大小的空镜像,这个大小参考du -h workroot/ -d1
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
参考
- Detailed process https://akhileshmoghe.github.io/_post/linux/debian_minimal_rootfs
相关文章:
Hi3798MV200 恩兔N2 NS-1 (四): 制作 Debian rootfs
目录 Hi3798MV200 恩兔N2 NS-1 (一): 设备介绍和刷机说明Hi3798MV200 恩兔N2 NS-1 (二): HiNAS海纳思使用和修改Hi3798MV200 恩兔N2 NS-1 (三): 制作 Ubuntu rootfsHi3798MV200 恩兔N2 NS-1 (四): 制作 Debian rootfs 关于 Debian rootfs Debian 没有像 Ubuntu 提供 Ubuntu-…...

面试热题(字符串相加)
给定两个字符串形式的非负整数 num1 和num2 ,计算它们的和并同样以字符串形式返回。 你不能使用任何內建的用于处理大整数的库(比如 BigInteger), 也不能直接将输入的字符串转换为整数形式。 输入:num1 "11"…...
我的创作纪念日【第一个2048day】
机缘 初心:研究生期间,帮老师做一个项目,过程中学习的东西想记录下来,于是,就选择了CADN让技术分享成为工作的一部分 收获 获得了1800多粉丝的关注获得了63万的访问量,其中《C#设计模式》专栏深受大家喜欢…...

内网穿透-————SSH远程连接树莓派
前言 文章目录 前言内网穿透实现公网SSH远程连接树莓派1. 在树莓派上安装[cpolar客户端](https://www.cpolar.com/)2. 在树莓派浏览器中输入本地9200端口3. 在公共互联网的电脑的命令行界面输入命令 内网穿透实现公网SSH远程连接树莓派 随着科技的进步和信息技术的发展&#x…...

一键开启ChatGPT“危险发言”
大数据文摘授权转载自学术头条 作者:Hazel Yan 编辑:佩奇 随着大模型技术的普及,AI 聊天机器人已成为社交娱乐、客户服务和教育辅助的常见工具之一。 然而,不安全的 AI 聊天机器人可能会被部分人用于传播虚假信息、操纵舆…...

RISC-V基础之函数调用(一)简单的函数调用(包含实例)
高级语言支持函数(也称为过程或子程序)来重用通用的代码,以及使程序更加模块化和可读。函数可以有输入,称为参数,和输出,称为返回值。函数应该计算返回值,并且不产生其他意外的副作用。 在一个…...
apt、aptitude、apt-get/apt-cache语法的区别
apt句法 aptitude句法 apt-get/apt-cache语法 描述 apt update aptitude update apt-get update 更新包存档元数据 apt install foo ap...
华为认证 | HCIA和HCIP有啥区别?
HCIA和HCIP都是华为认证体系里的,所以它们的考试流程大同小异,唯一区别的话,那可能就是课程内容方面的区别较大了。 那么HCIA和HCIP考试有啥区别呢?下面我们就来跟随小编来了解一下吧。 01 HCIA和HCIP考试有啥区别 ★ 等级不同 …...
JavaScript基础知识
JavaScript基础知识 一、变量与数据类型1. 变量2. 数据类型 二、表达式与运算符1.字面量2.表达式3.运算符3.1 算术运算符3.2 比较运算符3.3 逻辑运算符3.4 赋值运算符 三、条件语句1. 控制流程2. 语句块3. if 语句3. switch 语句4. 条件运算符 四、循环语句1. while2. do...whi…...

vue2 todoapp案例(静态)
1.创建三个子组件(TodoHeader、TodoMain、TodoFooter)和两个(index.css、base.css)样式; TodoHeader页面 <template><header class"header"><h1>todos</h1><input id"toggle-all" class"toggle-all" typ…...
qt5.14 和 qt5.15的区别
Qt 5.14 和 Qt 5.15 是两个不同的 Qt 版本,它们之间有一些区别和改进。 以下是一些 Qt 5.15 相对于 Qt 5.14 的变化和改进: 性能改进:Qt 5.15 引入了一些性能改进,包括提高渲染性能和减少内存占用。 Qt 3D:Qt 5.15 对…...

如何使用自己域名进行远程访问内网群晖NAS 6.X
使用自己的域名远程访问内网群晖NAS 6.X【内网穿透】 文章目录 使用自己的域名远程访问内网群晖NAS 6.X【内网穿透】 在之前的文章中,我们向大家演示了如何使用cpolar,创建一条固定的、能够在公共互联网登录内网群晖NAS的数据隧道。这条隧道已经能够应对…...
PHP判处重复延长队列执行时间
需求是这样: 14:00的时候,需要给1000个门店执行发券操作,有的门店需要发3个场景,开放平台的接口有请求频次限制,他是按照门店的场景发券需要间隔10秒。比如说,AB两个门店同时发a券,但不能 A门店…...

flask中的应用上下文
flask中的应用上下文 Flask应用上下文主要包含两个对象:current_app和g。这两个对象在处理请求期间都是全局可访问的,但在每个请求结束时都会被重置。 current_app:这是当前激活的Flask应用的实例。在大多数情况下,你可以将其视为…...

cocos creator 的input.on 不生效
序: 1、执行input.on的时候发现不生效 2、一直按控制台也打印不出来console.log 3、先收藏这篇,因为到时候cocos要开发serveApi的时候,你得选一款趁手的后端开发并且,对习惯用ts写脚本的你来说,node是入门最快…...
WFPlayer
WFPlayer WFPlayer 可以实现分析音视频生成音频波形图 在线demo地址: demo WFPlayer支持: 在不加载整个媒体文件的情况下创建波形自定义光标、进度、网格、标尺显示和颜色加载媒体url和加载媒体dom元素(视频标签和音频标签)颜色或宽度等实时…...
Netty面试题
1.BIO、NIO 和 AIO 的区别? BIO:一个连接一个线程,客户端有连接请求时服务器端就需要启动一个线程进行处理。线 程开销大。 伪异步 IO:将请求连接放入线程池,一对多,但线程还是很宝贵的资源。 NIO&#x…...

基于Home Assistant远程开门
基于Home Assistant远程开门 1.购买云服务器 1.1 阿里云服务器 本人使用的是阿里云服务器,其他的腾讯云,百度云都可以 如果你想要一个建议的话: 推荐在打折优惠的时候买,比如双十一 阿里云最近有一个飞天计划,在校…...
Docker相关的参数配置
Docker的配置文件/etc/docker/daemon.json中的大部分配置项如下所示 : {"allow-nondistributable-artifacts": [],"api-cors-header": "","authorization-plugins": [],"bip": "","bridge"…...

【CSS3】CSS3 2D 转换 - scale 缩放 ③ ( 使用 scale 设置制作可缩放的按钮案例 )
文章目录 一、需求分析二、代码分析三、代码示例四、执行结果 一、需求分析 设置一个 按钮 , 默认状态下显示的样式如下 : 按钮 外部 有 圆形的外边框 ;按钮 中的文本 , 水平居中对齐 , 垂直居中对齐 ; 当鼠标移动到 按钮 上之后 , 鼠标 变为 小手 样式 , 并且 按钮 以 中心位…...

使用VSCode开发Django指南
使用VSCode开发Django指南 一、概述 Django 是一个高级 Python 框架,专为快速、安全和可扩展的 Web 开发而设计。Django 包含对 URL 路由、页面模板和数据处理的丰富支持。 本文将创建一个简单的 Django 应用,其中包含三个使用通用基本模板的页面。在此…...
Spring Boot 实现流式响应(兼容 2.7.x)
在实际开发中,我们可能会遇到一些流式数据处理的场景,比如接收来自上游接口的 Server-Sent Events(SSE) 或 流式 JSON 内容,并将其原样中转给前端页面或客户端。这种情况下,传统的 RestTemplate 缓存机制会…...
GitHub 趋势日报 (2025年06月08日)
📊 由 TrendForge 系统生成 | 🌐 https://trendforge.devlive.org/ 🌐 本日报中的项目描述已自动翻译为中文 📈 今日获星趋势图 今日获星趋势图 884 cognee 566 dify 414 HumanSystemOptimization 414 omni-tools 321 note-gen …...

Linux 内存管理实战精讲:核心原理与面试常考点全解析
Linux 内存管理实战精讲:核心原理与面试常考点全解析 Linux 内核内存管理是系统设计中最复杂但也最核心的模块之一。它不仅支撑着虚拟内存机制、物理内存分配、进程隔离与资源复用,还直接决定系统运行的性能与稳定性。无论你是嵌入式开发者、内核调试工…...
【无标题】路径问题的革命性重构:基于二维拓扑收缩色动力学模型的零点隧穿理论
路径问题的革命性重构:基于二维拓扑收缩色动力学模型的零点隧穿理论 一、传统路径模型的根本缺陷 在经典正方形路径问题中(图1): mermaid graph LR A((A)) --- B((B)) B --- C((C)) C --- D((D)) D --- A A -.- C[无直接路径] B -…...
C++课设:简易日历程序(支持传统节假日 + 二十四节气 + 个人纪念日管理)
名人说:路漫漫其修远兮,吾将上下而求索。—— 屈原《离骚》 创作者:Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊) 专栏介绍:《编程项目实战》 目录 一、为什么要开发一个日历程序?1. 深入理解时间算法2. 练习面向对象设计3. 学习数据结构应用二、核心算法深度解析…...

STM32---外部32.768K晶振(LSE)无法起振问题
晶振是否起振主要就检查两个1、晶振与MCU是否兼容;2、晶振的负载电容是否匹配 目录 一、判断晶振与MCU是否兼容 二、判断负载电容是否匹配 1. 晶振负载电容(CL)与匹配电容(CL1、CL2)的关系 2. 如何选择 CL1 和 CL…...
从面试角度回答Android中ContentProvider启动原理
Android中ContentProvider原理的面试角度解析,分为已启动和未启动两种场景: 一、ContentProvider已启动的情况 1. 核心流程 触发条件:当其他组件(如Activity、Service)通过ContentR…...

DBLP数据库是什么?
DBLP(Digital Bibliography & Library Project)Computer Science Bibliography是全球著名的计算机科学出版物的开放书目数据库。DBLP所收录的期刊和会议论文质量较高,数据库文献更新速度很快,很好地反映了国际计算机科学学术研…...
在RK3588上搭建ROS1环境:创建节点与数据可视化实战指南
在RK3588上搭建ROS1环境:创建节点与数据可视化实战指南 背景介绍完整操作步骤1. 创建Docker容器环境2. 验证GUI显示功能3. 安装ROS Noetic4. 配置环境变量5. 创建ROS节点(小球运动模拟)6. 配置RVIZ默认视图7. 创建启动脚本8. 运行可视化系统效果展示与交互技术解析ROS节点通…...