DM-Verity整体流程

手动验证步骤

1、生成RSA密钥对  2、构建镜像,

1.1 生成密钥

私钥:  openssl genpkey -algorithm RSA -pkeyopt rsa_keygen_bits:2048 -out rsa_private_2048.pem

公钥:  openssl rsa -in rsa_private_2048.pem -pubout -out public.pem

1.2 从构建系统生成镜像

dd if=/dev/zero of=A_1_6_gos0-fs_targetfs.img bs=1024M count=20

sudo mkfs.ext4 -b 4096 A_1_6_gos0-fs_targetfs.img

2、服务器打包环节:3、生成 加密A_1_6_gos0-fs_targetfs.img 4、生成根哈希,(私钥)

2.1 制作nv包,获得 A_1_6_gos0-fs_targetfs.img

2.1.1 准备好nv的打包工具包 

dupkg.tar.gz

2.1.2 获取docker镜像

iregistry.baidu-int.com/apollo-os/jidu-package:v1.2

2.1.3 将dupkg工具挂载到docker镜像 

docker run -it --privileged=true --net=host -v /root/ota/dupkg/:/home iregistry.baidu-int.com/apollo-os/jidu-package:v1.2

2.1.4 获取底软 driveos的产出

wget -O output.tar.gz --no-check-certificate --header "IREPO-TOKEN:c875370d-e42e-4a71-a10d-5543890f3e46" "https://irepo.baidu-int.com/rest/prod/v3/baidu/acu/sanxian_gos_linux/releases/1.2.4.20/files"

2.1.5 挂载完成后,运行dupkg gen 打包命令

python3 /home/dupkg/dupkg.py gen --template dupkg_dual_tegra_template --in TEGRA_A_SRC=/home/output/orin_baidu_sanxian/pdk_6.0.4.0/baidu-acu-s0-ap_signed/642-63663-0001-001_TS2/flash-images TEGRA_B_SRC=/home/output/orin_baidu_sanxian/pdk_6.0.4.0/baidu-acu-s1-ap_signed/642-63663-0001-001_TS2/flash-images TII_META_VER=metav2 CONTAINER1=guest-linux CONTAINER2=qnx-update ERASE_PADDING_FLAG=0 VALIDATE_OPTION=True SHA_ALG=sha512 TARGET_OS=linux --out /home/out_new1

运行 成功后将一个out_new1的文件夹

2.2 进入nv产出包 out_new1 在tii-a 和tii-b 生成加密 A_1_6_gos0-fs_targetfs.img 

2.2.1 准备 1GBhash.img 追加到A_1_6_gos0-fs_targetfs.img 尾部用于存放hashtree 

dd if=/dev/zero of=hash.img bs=1024M count=1 cat hash.img >> A_1_6_gos0-fs_targetfs.img

2.2.2 sudo veritysetup format A_1_6_gos0-fs_targetfs.img A_1_6_gos0-fs_targetfs.img --data-blocks 5767168 --hash-offset 23622320128 (生成文件data+hash)

同时命令会输出如下信息:

[sudo] password for shaomingjin:VERITY header information for test_loop_hash_daviceUUID: 2e074a75-1230-4051-8702-db8c7b4c58b2Hash type: 1Data blocks: 563200Data block size: 4096Hash block size: 4096Hash algorithm: sha256Salt: 2e86e1f9d278540bbf17f28cff1e32310a63f32b0b0ec566bc6511e726fe03c4Root hash: f64407bcd7ac20d554bf9b145244a623fdf571f9bf972e5c38f1bc5d44196b29

2.3生成签名根哈希

Root hash : f64407bcd7ac20d554bf9b145244a623fdf571f9bf972e5c38f1bc5d44196b29

cat format_data.txt | grep Root | awk '{print $3}' >roothash.txt

openssl rsautl -sign -inkey rsa_private_2048.pem -in roothash.txt -hexdump

openssl rsautl -sign -inkey rsa_private_2048.pem -in roothash.txt -out sig.dat

2.4 将签名导入到镜像文件

cat sig.dat >> A_1_6_gos0-fs_targetfs.img 

2.5 由于更改了A_1_6_gos0-fs_targetfs.img大小,需要同步更新 metadata.json 里的 hash 以及 data_size 大小

2.6 将制作好的nv包压缩,拷贝到集度板卡上,做部署

3、设备上使用: 5、验证签名 6、创建加密对象 7、挂载 (公钥)

3.1 更改initramfs 配置 

①打包增加文件 

增加openssl相关、veitysetup相关的 bin+so

② 更改init.sh 文件 ,加入 验证签名、创建加密对象、挂载

3.2、验证签名

3.2.1 由于在2.4步骤,已经将sig.dat追加到 A_1_6_gos0-fs_targetfs.img尾部 {23GB + 256B,22G 是ext4的分区没有变化,后面的1G里面 hash tree,256Bsig.dat}

此时我们在 /dev/vblkdev0p1 取出 sig.dat

sudo dd if=$root_img of=sig1.dat bs=256 count=1 skip=96468992

3.2.2 验证签名 

openssl rsautl -verify -inkey public.pem --pubin -in sig.dat 

如果签名正确将从签名的roothash文件返回roothash

结果 = f64407bcd7ac20d554bf9b145244a623fdf571f9bf972e5c38f1bc5d44196b29

3.3、创建加密对象

sudo veritysetup open $root_img fangtroot $root_img --data-blocks 4980736 --hash-offset 20401094656 9dc233ac7d79b41c0c462927d07ead1f35b55e2ab15251c55150df6052bf01e1

删除: sudo dmsetup remove 

sudo dmsetup info 

3.4、挂载

sudo mount /dev/mapper/fangtroot /mnt/abc

3.5执行部署命令:content_server /opt/data/mj/out_new1 & sample_driveupdate -p /gos-a/content/files 

切A分区命令:

common_if_testapp -set_default_bootchain x1 A

common_if_testapp -set_default_bootchain x2 A

切B分区命令:

common_if_testapp -set_default_bootchain x1 B

common_if_testapp -set_default_bootchain x2 B

<think>好的,用户让我介绍一下学习Linux嵌入式,我需要先理清楚回答的结构,确保符合用户的要求。首先,用户提到系统级指令,需要注意数学表达式的格式,但这里可能用不上太多数学内容,不过还是得留意。然后用户可见层要求结构清晰,逐步解决问题,真实可靠。 首先,我应该明确用户的需求。他们可能对嵌入式系统有兴趣,想了解如何入门学习Linux嵌入式开发。可能的用户包括学生、刚入行的开发者,或者想转行的人。他们可能需要一个学习路径,包括基础知识、工具、实践项目等。 接下来,我需要分步骤介绍。先解释什么是Linux嵌入式系统,然后学习路径,包括Linux基础、嵌入式系统基础、内核和驱动、交叉编译、文件系统、实际项目、进阶内容以及资源推荐。每个部分要简明扼要,重点突出。 需要注意的是,用户可能对某些术语不熟悉,比如交叉编译、根文件系统等,需要适当解释,但不要过于深入,保持易懂。同时,要推荐一些资源,比如书籍、在线课程、社区,帮助用户进一步学习。 还要考虑用户的实际操作,比如建议使用开发板进行实践,这很重要,因为嵌入式开发强调动手能力。可能需要提到常见的开发板,如树莓派、BeagleBone,或者国内的开发板,方便用户获取。 另外,要提醒学习中的难点,比如内核配置、驱动开发,这些部分可能需要更多的耐心和实践。同时,强调社区和文档的重要性,因为开源社区是学习Linux的重要资源。 最后,总结学习路径,鼓励用户持续实践,参与项目,保持学习热情。整体结构要逻辑清晰,步骤明确,帮助用户建立学习框架,避免信息过载,分阶段学习。</think>学习Linux嵌入式系统开发可以按照以下步骤进行: ### 一、理解基本概念 1. **Linux嵌入式系统** = 裁剪优化的Linux内核 + 应用程序 + 硬件平台 2. **典型特征**: - 资源受限(内存/存储通常小于512MB) - 实时性要求(部分场景需RT-Linux补丁) - 交叉编译开发模式 ### 二、学习路径规划 #### 阶段1:Linux基础 ```shell # 必须掌握的技能 $ git clone https://github.com/embeded-linux-examples $ make menuconfig # 内核配置示例 $ gcc -o hello hello.c # 基础编译 ``` - 文件系统结构 - Shell脚本编程 - 进程/线程管理 #### 阶段2:嵌入式系统基础 1. **硬件接口**: - GPIO控制(如通过/sys/class/gpio) - I2C/SPI总线通信 - PWM输出配置 2. **开发工具链**: ```makefile CROSS_COMPILE = arm-linux-gnueabihf- CC = $(CROSS_COMPILE)gcc ``` #### 阶段3:内核与驱动开发 1. **内核模块开发示例**: ```c #include <linux/init.h> #include <linux/module.h> MODULE_LICENSE("GPL"); static int __init hello_init(void) { printk(KERN_INFO "Hello embedded world!\n"); return 0; } module_init(hello_init); ``` 2. **设备树(DTS)配置**: ```dts / { led-controller { compatible = "gpio-leds"; led0 { label = "sys_led"; gpios = <&gpio0 12 GPIO_ACTIVE_HIGH>; }; }; }; ``` #### 阶段4:构建系统实践 1. **交叉编译工具链配置** 2. **根文件系统制作**: - BusyBox编译 - 使用Buildroot/Yocto 3. **典型开发流程**: ``` 代码编辑 → 交叉编译 → 烧写镜像 → 目标板调试 ``` ### 三、实践建议 1. **硬件选择**: - 初级:树莓派/Rock Pi - 进阶:i.MX6UL/STM32MP1 2. **推荐实验项目**: - LED呼吸灯控制 - 温湿度传感器数据采集 - 通过CAN总线通信 - 实现OTA升级功能 ### 四、进阶方向 1. **实时性优化**: - PREEMPT_RT补丁应用 - 中断响应延迟测试 2. **安全机制**: - Secure Boot实现 - DM-verity配置 3. **性能调优**: ```shell $ perf stat -e cycles,instructions,cache-misses ./app ``` ### 五、学习资源 1. **经典书籍**: - 《Linux设备驱动程序》 - 《构建嵌入式Linux系统》 2. **在线资源**: - kernel.org 官方文档 - elinux.org 嵌入式wiki - GitHub嵌入式相关开源项目 3. **开发板文档**: - Raspberry Pi官方手册 - BeagleBone开发指南 ### 六、常见挑战 1. **内核panic调试**: - 结合JTAG调试器 - 分析Oops信息 2. **驱动兼容性问题**: - 设备树配置验证 - 时钟频率校准 建议每天保持2小时实践时间,通过实际项目驱动学习。遇到问题多查阅内核源码(建议使用VSCode+ctags进行代码导航),参与Linux嵌入式社区讨论(如Stack Overflow嵌入式板块)。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值