在线更新内核和 U-Boot
本小节介绍了在线更新的一个简单的流程。将内核、U-Boot 或者其他需要更新的文件打包成 deb 安装包,然后导入到本地包仓库,实现在设备上下载并自动更新。仅供用户参考。
准备 deb 安装包
操作中需要升级内核和 U-Boot,事先已经准备好了修改好的相关文件:<span class="pre">uboot.img</span>
、<span class="pre">trust.img</span>
、<span class="pre">boot.img</span>
。
deb 是 Debian Linux 的软件包格式,打包最关键的是在 <span class="pre">DEBIAN</span>
目录下创建一个 <span class="pre">control</span>
文件。首先创建 deb 工作目录,然后在 deb 目录中创建相应的目录和文件:
mkdir deb
cd deb
mkdir firefly-firmware # 创建 firefly-firmware 目录
cd firefly-firmware
mkdir DEBIAN # 创建 DEBIAN 目录,这个目录是必须要有的。
mkdir -p usr/share/{kernel,uboot}
mv ~/boot.img ~/deb/firefly-firmware/usr/share/kernel # 将相应文件放到相应的目录
mv ~/uboot.img ~/deb/firefly-firmware/usr/share/uboot
mv ~/trust.img ~/deb/firefly-firmware/usr/share/uboot
<span class="pre">DEBIAN</span>
目录下存放的文件是 deb 包安装的控制文件以及相应的脚本文件。
在 <span class="pre">DEBIAN</span>
目录下创建控制文件 <span class="pre">control</span>
和脚本文件 <span class="pre">postinst</span>
。
<span class="pre">control</span>
文件内容如下,用于记录软件标识,版本号,平台,依赖信息等数据。
Package: firefly-firmware
Version: 1.0
Architecture: arm64
Maintainer: neg
Installed-Size: 1
Section: test
Priority: optional
Descriptionon: This is a deb test
<span class="pre">postinst</span>
文件内容如下,就是将需要更新的内核和 U-Boot 文件用 <span class="pre">dd</span>
命令写进对应分区的脚本:
echo "-----------uboot updating------------"
dd conv=fsync,notrunc if=/usr/share/uboot/uboot.img of=/dev/disk/by-partlabel/uboot
echo "-----------trust updating------------"
dd conv=fsync,notrunc if=/usr/share/uboot/trust.img of=/dev/disk/by-partlabel/trust
echo "-----------kernel updating------------"
dd conv=fsync,notrunc if=/usr/share/kernel/boot.img of=/dev/disk/by-partlabel/boot
说明:<span class="pre">postinst</span>
脚本,是在解包数据后运行的脚本,对应的还有:
preinst:在解包数据前运行的脚本;
prerm:卸载时,在删除文件之前运行的脚本;
postrm:在删除文件之后运行的脚本;
其他相关知识点用户可以自行了解。这里只用到了 <span class="pre">preinst</span>
脚本。
以下是创建好的目录树:
deb
└── firefly-firmware
├── DEBIAN
│ ├── control
│ └── postinst
└── usr
└── share
├── kernel
│ └── boot.img
└── uboot
├── trust.img
└── uboot.img
进入 deb 目录,用 <span class="pre">dpkg</span>
命令生成 deb 包:
dpkg -b firefly-firmware firefly-firmware_1.0_arm64.deb
生成 deb 包时,一般按照这种规范进行命名:<span class="pre">package_version-reversion_arch.deb</span>
。
创建本地仓库
首先安装需要的包:
sudo apt-get install reprepro gnupg
然后用 GnuPG 工具生成一个 GPG 密匙,执行命令后请根据提示操作:
gpg --gen-key
执行 <span class="pre">sudo <span class="pre">gpg <span class="pre">--list-keys</span></span></span>
可以查看刚刚生成的密匙信息:
sudo gpg --list-keys
gpg: WARNING: unsafe ownership on homedir
gpg: 正在检查信任度数据库
gpg: marginals needed: 3 completes needed: 1 trust model: pgp
gpg: 深度:0 有效性: 4 已签名: 0 信任度:0-,0q,0n,0m,0f,4u
gpg: 下次信任度数据库检查将于 2021-05-29 进行
/home/firefly/.gnupg/pubring.kbx
--------------------------------
pub rsa3072 2019-05-31 [SC] [有效至:2021-05-30]
BCB65788541D632C057E696B8CBC526C05417B76
uid [ 绝对 ] firefly <firefly@t-chip.com>
sub rsa3072 2019-05-31 [E] [有效至:2021-05-30]
接下来创建包仓库,首先创建目录:
cd /var/www
mkdir apt # 包仓库目录
mkdir -p ./apt/incoming
mkdir -p ./apt/conf
mkdir -p ./apt/key
把前面生成的密匙导出到仓库文件夹,请用户对应好自己创建的用户名和邮箱地址。
gpg --armor --export firefly firefly@t-chip.com > /var/www/apt/key/deb.gpg.key
在 <span class="pre">conf</span>
目录下创建 <span class="pre">distributions</span>
文件,其内容如下:
Origin: Neg
Label: Mian
Suite: stable
Codename: bionic
Version: 1.0
Architectures: arm64
Components: main
Description: Deb source test
SignWith: BCB65788541D632C057E696B8CBC526C05417B76
建立仓库树:
reprepro --ask-passphrase -Vb /var/www/apt export
将第 2 步做好的 deb 包加入到仓库中:
reprepro --ask-passphrase -Vb /var/www/apt includedeb bionic ~/deb/firefly-firmware_1.0_arm64.deb
可以查看库中添加的文件:
root@Desktop:~# reprepro -b /var/www/apt/ list bionic
bionic|main|arm64: firefly-firmware 1.0
你的包已经加入了仓库,如果要移除它的话采用如下命令:
reprepro --ask-passphrase -Vb /var/www/apt remove bionic firefly-firmware
安装 nginx 服务器:
sudo apt-get install nginx
修改nginx的配置文件 <span class="pre">/etc/nginx/sites-available/default</span>
为:
server {
listen 80 default_server;
listen [::]:80 default_server;
root /var/www/apt;
access_log /var/log/nginx/repo.access.log;
error_log /var/log/nginx/repo.error.log;
location ~ /(db|conf) {
deny all;
return 404;
}
}
重启 nginx 服务器:
sudo service nginx restart
客户端更新安装
在客户端设备中,首先要添加本地包仓库的源,在目录 <span class="pre">/etc/apt/sources.list.d</span>
下添加一个新的配置文件 <span class="pre">bionic.list</span>
,内容如下:
deb http://192.168.31.106 bionic main
IP 地址是服务器地址, <span class="pre">bionic</span>
是仓库发布代码名, <span class="pre">main</span>
是组件名。
从服务器中获取并添加 GPG 密匙:
wget -O - http://192.168.31.106/key/deb.gpg.key | apt-key add -
更新后即可安装自定义软件源里的 <span class="pre">firefly-firmware_1.0_arm64</span>
包:
root@firefly:/home/firefly# apt-get update
Hit:1 http:
Hit:2 http:
Hit:3 http:
Hit:4 http:
Hit:5 http:
Hit:6 http:
Hit:7 http:
Reading package lists... Done
root@firefly:/home/firefly# apt-get install firefly-firmware
Reading package lists... Done
Building dependency tree
Reading state information... Done
The following package was automatically installed and is no longer required:
libllvm6.0
Use 'apt autoremove' to remove it.
The following NEW packages will be installed:
firefly-firmware
0 upgraded, 1 newly installed, 0 to remove and 3 not upgraded.
Need to get 0 B/6982 kB of archives.
After this operation, 1024 B of additional disk space will be used.
Selecting previously unselected package firefly-firmware.
(Reading database ... 117088 files and directories currently installed.)
Preparing to unpack .../firefly-firmware_1.0_arm64.deb ...
Unpacking firefly-firmware (1.0) ...
Setting up firefly-firmware (1.0) ...
-----------uboot updating------------
8192+0 records in
8192+0 records out
4194304 bytes (4.2 MB, 4.0 MiB) copied, 0.437281 s, 9.6 MB/s
-----------trust updating------------
8192+0 records in
8192+0 records out
4194304 bytes (4.2 MB, 4.0 MiB) copied, 0.565762 s, 7.4 MB/s
-----------kernel updating------------
39752+0 records in
39752+0 records out
20353024 bytes (20 MB, 19 MiB) copied, 0.1702 s, 120 MB/s
可以看到安装过程中执行了 deb 包中的 <span class="pre">poinst</span>
脚本。安装完成后,重启设备,更新完成。
在 <span class="pre">/usr/share</span>
目录中还可以看到 <span class="pre">kernel</span>
和 <span class="pre">uboot</span>
目录,分别存放了 <span class="pre">boot.img</span>
,<span class="pre">uboot.img</span>
和 <span class="pre">trust.img</span>
。
注意事项
在制作 deb 包中,与 <span class="pre">DEBIAN</span>
同级的目录视为根目录,即放在与 <span class="pre">DEBIAN</span>
同目录下的文件,在客户端安装 deb 包后,可以在客户端的根目录下找到
deb 包中的文件和脚本,用户要根据自己的实际情况做调整
每次在仓库中修改了配置文件后,都要重新导入仓库目录树
nginx 服务器配置中,<span class="pre">root</span>
参数配置的是仓库的地址,请用户根据自己的实际情况修改
客户端添加的新下载源的文件时,注意核对正确的服务器地址,包仓库代码名和组件名。注意客户端要连通服务器
客户端要用 <span class="pre">apt-key <span class="pre">add</span></span>
命令添加 GPG 密匙之后,才可以获取本地的仓库的信息。
原作者:DMCF