当前位置: 首页 > news >正文

从头开始为 ARM 创建 Ubuntu 映像

大家好!我是大聪明-PLUS

当开发刚刚开始时,通常还不清楚哪些包将进入目标 rootfs。

 

换句话说,现在就使用 LFS、buildroot 或 yocto(或其他任何系统)还为时过早,但现在是时候开始了。对于那些资金充裕的人来说(我的试点样品上有 4GB eMMC),解决方案是向开发人员分发一个发行版,这样他们就可以快速交付目前缺少的所有内容。这样,我们就可以随时收集软件包列表,并为目标 rootfs 创建列表。

 

这篇文章没有任何创新,只是简单的复制粘贴指令。

 

本文的目的是为 ARM 板构建 Ubuntu rootfs(在我的情况下,基于 Colibri imx7d)。

 

组装图像

 

我们正在构建用于复制的目标 rootfs。

 

解压 Ubuntu Base

 

我们根据自己的需求和个人喜好来选择版本。我在这里列出了 20 个。

 

$ mkdir ubuntu20
$ cd ubuntu20
$ mkdir rootfs
$ wget http://cdimage.ubuntu.com/ubuntu-base/releases/20.04/release/ubuntu-base-20.04-base-armhf.tar.gz
$ tar xf ubuntu-base-20.04-base-armhf.tar.gz -C rootfs

 

检查内核中是否支持 BINFMT

 

如果您使用的是通用发行版,则 BINFMT_MISC 支持已存在且所有配置均已完成。如果没有,那么我相信您知道如何在内核中启用 BINFMT 支持。

 

确保内核中启用了 BINFMT_MISC:

 

$ zcat /proc/config.gz | grep BINFMT
CONFIG_BINFMT_ELF=y
CONFIG_COMPAT_BINFMT_ELF=y
CONFIG_BINFMT_SCRIPT=y
CONFIG_BINFMT_MISC=y

 

现在您需要检查设置:

 

$ ls /proc/sys/fs/binfmt_misc
qemu-arm  register  status
$ cat /proc/sys/fs/binfmt_misc/qemu-arm
enabled
interpreter /usr/bin/qemu-arm
flags: OC
offset 0
magic 7f454c4601010100000000000000000002002800
mask ffffffffffffff00fffffffffffffffffeffffff

 

设置 qemu 静态 arm

 

现在我们需要一个静态编译的 qemu 实例。

 

$ wget http://ftp.debian.org/debian/pool/main/q/qemu/qemu-user-static_5.0-13_amd64.deb
$ alient -t qemu-user-static_5.0-13_amd64.deb
$ mkdir qemu
$ tar xf qemu-user-static-5.0.tgz -C qemu
$ file qemu/usr/bin/qemu-arm-static
qemu/usr/bin/qemu-arm-static: ELF 64-bit LSB executable, x86-64, version 1 (GNU/Linux), statically linked, BuildID[sha1]=be45f9a321cccc5c139cc1991a4042907f9673b6, for GNU/Linux 3.2.0, stripped
$ cp qemu/usr/bin/qemu-arm-static rootfs/usr/bin/qemu-arm
$ file rootfs/usr/bin/qemu-arm
rootfs/usr/bin/qemu-arm: ELF 64-bit LSB executable, x86-64, version 1 (GNU/Linux), statically linked, BuildID[sha1]=be45f9a321cccc5c139cc1991a4042907f9673b6, for GNU/Linux 3.2.0, stripped

 

Chroot

 

简单脚本:

 

ch-mount.sh

 

让我们欣赏一下结果:

 

$ ./ch-mount.sh -m rootfs/
# cat /etc/os-release
NAME="Ubuntu"
VERSION="20.04 LTS (Focal Fossa)"
ID=ubuntu
ID_LIKE=debian
PRETTY_NAME="Ubuntu 20.04 LTS"
VERSION_ID="20.04"
HOME_URL="https://www.ubuntu.com/"
SUPPORT_URL="https://help.ubuntu.com/"
BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"
PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"
VERSION_CODENAME=focal
UBUNTU_CODENAME=focal
# uname -a
Linux NShubin 5.5.9-gentoo-x86_64 #1 SMP PREEMPT Mon Mar 16 14:34:52 MSK 2020 armv7l armv7l armv7l GNU/Linux

 

为了好玩,让我们测量一下安装最小(对我来说)软件包集之前和之后的大小:

 

# du -d 0 -h / 2>/dev/null
63M     /

 

让我们更新一下:

 

# apt update
# apt upgrade --yes

 

让我们安装我们感兴趣的软件包:

 

# SYSTEMD_IGNORE_CHROOT=yes apt install --yes autoconf kmod socat ifupdown ethtool iputils-ping net-tools ssh g++ iproute2 dhcpcd5 incron ser2net udev systemd gcc minicom vim cmake make mtd-utils util-linux git strace gdb libiio-dev iiod

 

内核头文件和模块是另一个主题。我们当然不会通过 Ubuntu 安装引导加载程序、内核、模块或设备树。它们来自外部,我们自己编译,或者由主板制造商提供。无论如何,它们超出了本指南的范围。

 

在某种程度上,版本差异是可以接受的,但最好从内核构建中获取它们。

 

# apt install --yes linux-headers-generic

 

让我们看看发生了什么,结果相当不错:

 

# apt clean
# du -d 0 -h / 2>/dev/null
770M    /

 

不要忘记设置密码。

 

打包图像

 

$ sudo tar -C rootfs --transform "s|^./||" --numeric-owner --owner=0 --group=0 -c ./ | tar --delete ./ | gzip > rootfs.tar.gz

 

此外,我们可以安装带有自动推送设置的 etckeeper。

 

好吧,假设我们已经分发了我们的构建,并且我们开始弄清楚如何最好地组装我们系统的不同版本。

 

etckeeper 可以帮助我们。

 

安全是每个人的私事:
  • 您可以保护某些分支
  • 为每个设备生成唯一的密钥
  • 禁用强制推送
  • ETC。 ...

 

# ssh-keygen
# apt install etckeeper
# etckeeper init
# cd /etc
# git remote add origin ...

 

让我们设置自动推送

 

当然,我们可以提前在设备上创建分支(例如,创建一个在第一次启动时运行的脚本或服务)。

 

# cat /etc/etckeeper/etckeeper.conf
PUSH_REMOTE="origin"

 

或者我们可以做一些更聪明的事情......

 

懒惰的方法

 

假设我们有某种唯一标识符,比如处理器序列号(或 MAC——大型公司会购买一系列):

 

cat /proc/cpuinfo

 

然后我们可以使用它作为我们将推送到的分支的名称:

 

# cat /proc/cpuinfo | grep Serial | cut -d':' -f 2 | tr -d [:blank:]
06372509

 

让我们创建一个简单的脚本:

 

# cat /etc/etckeeper/commit.d/40myown-push
#!/bin/sh
set -eif [ "$VCS" = git ] && [ -d .git ]; thenbranch=$(cat /proc/cpuinfo | grep Serial | cut -d':' -f 2 | tr -d [:blank:])cd /etc/git push origin master:${branch}
fi

 

就是这样 - 过一段时间后,我们可以查看更改并为目标固件创建包列表。

 

http://www.dtcms.com/a/499664.html

相关文章:

  • Android 开发 | 如何使用命令使 Android 应用进入调试状态
  • 在线下单网站怎么做国家企业信用信息查询公示系统广东
  • 企业营销网站建设策划书邯郸市人社局
  • 中山哪里可以做网站产品推广方案ppt
  • 城管综合执法办案系统的技术体系解析:从移动端到云端
  • 开发基于AKS能运维开工单的智能体应用
  • 3D生成软件Rodin 2.0 简单测试案例
  • vivado 从已实现的设计工程创建自定义PL IBIS文件方法
  • TFword:从字符到片段,解析一个“小而精”的字符串处理工具的设计智慧
  • 甘肃网站备案审核flash网站源码带asp后台
  • 网站模板 手机app展示西安seo外包平台
  • F - 算符优先分析
  • 深入剖析RocketMQ3-底层原理
  • 网站建设所出现的问题电影网站域名
  • ROS趣味题25-26-1版本
  • 网络编程的基础知识
  • 【GESP】C++三级、四级练习 luogu-P1597 语句解析-系列题目3
  • 广告公司网站源码下载巴西网站域名
  • Java基础入门
  • 网站建设的价code wordpress
  • 自己做的网站项目面试为什么要做营销型的网站建设
  • 网站开发公众号开发网易企业邮箱网页版登录入口
  • 斯坦福大学生物医学数据科学(BMDS)项目概览
  • 手机转SIP-手机做中继网关-落地线路对接软交换呼叫中心
  • Redis 在订单系统中的实战应用:防重、限流与库存扣减
  • flex 做网站去成都旅游攻略怎么做
  • PHP网站开发涉及的工具有哪些秦皇岛市海港区建设局网站
  • 如何定期清理电脑垃圾文件
  • 网站怎么做现场直播视频全国企业信息公示系统查询
  • JAVA村里租房系统小区租售系统源码支持微信小程序 + H5