树莓派4B安装并使用TPM模块

2023-10-31 01:59
文章标签 模块 安装 使用 树莓 4b tpm

本文主要是介绍树莓派4B安装并使用TPM模块,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

 设备准备

  • 树莓派4B
  • Ubuntu18.04.6虚拟机
  • SD卡(已安装树莓派系统)
  • 读卡器
  • TPM模块(本文以国民技术Z32H30TC模块为例)

说明:本文以树莓派4B为例。如果树莓派型号不同还需要参考文末的参考链接。结合本文内容,相信你一定能弄明白。

安装依赖项

第一行安装一些后续程序所需要的包;第二行安装32位内核的交叉编译工具。

为什么需要交叉编译工具呢?这是由于我们使用的Ubuntu是基于Linux的64位系统,但是我们想要编译的树莓派系统内核是32位的ARM架构程序。因此需要借助交叉编译工具进行编译。

注意:没有依赖项和交叉编译工具后面的步骤无法顺利进行,请确保所有依赖项和交叉编译工具均已安装。此外,交叉编译工具仅用于交叉编译arm32位程序,如果想编译64位内核请参考文末的链接。

sudo apt install git bc bison flex libssl-dev make libc6-dev libncurses5-dev
sudo apt install crossbuild-essential-armhf

下载内核源码

--depth=1保证只下载最新版本的树莓派内核源代码。如果没有该参数则会下载所有的分支。如果不是想进行开发,建议使用git下载时都加上--depth参数。

如果想下载特定版本的树莓派内核,请打开GitHub - raspberrypi/linux: Kernel source tree for Raspberry Pi-provided kernel builds. Issues unrelated to the linux kernel should be posted on the community forum at https://forums.raspberrypi.com/在branch中寻找合适的版本并使用git下载到本地。

经测试,树莓派4B不能使用高于5.15.y版本的内核,因此需要使用下面的命令下载5.15版本的内核。(测试了6.1.y版本不行,5.18.y版本不行,5.15y版本可以)

git clone -b rpi-5.15.y --single-branch --depth=1 https://github.com/raspberrypi/linux
下载不同版本的树莓派系统内核
图1 下载不同版本的树莓派内核

预配置

进入刚刚下载树莓派源代码目录,设置环境变量KERNEL,并使用make指定bcm2711_defconfig配置模板生成arm架构32位的配置文件。

  • ARCH=arm代表架构位arm32位架构;
  • CROSS_CPMPILE指定交叉编译工具为linux平台交叉编译arm32位工具;
  • 最后指定初始配置文件的模板为bcm2711_defconfig。

注意:树莓派版本不同,这里设置的环境变量KERNEL不同,所使用的配置模板也不同。其他型号的具体参数设置请参考文末链接。

cd linux
KERNEL=kernel7l
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- bcm2711_defconfig

配置内核

由于树莓派5.15y版本默认将TPM2.0 SPI作为模块编译,因此不再需要配置内核。如果想自定义内核或者使用的内核版本太低没有开启TPM2.0 SPI选项,则需要手动开启。这里主要讲一下怎么手动开启TPM2.0。

首先使用make工具打开linux内核配置菜单。64位内核在这与此命令不同,请结合本文内容并参考文末链接:

ARCH和CROSS_COMPILE参数与预配置中的参数和意思相同,不再赘述。最后的menuconfig命令指示打开linux配置菜单。

make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- menuconfig

到menuconfig菜单选中Device Drivers----Character devices---<M>TPM Hardware support
选中TPM Interface Specification 1.3 Interface / TPM 2.0 FIFO Interface - (SPI)模块,按下 m 键将其前面变为[M]。返回并保存内核配置文件。如果不会内核配置操作,下方为内核配置的教程。如果可以成功开启请跳转至下一步。

内核配置相关操作(选看)

在配置菜单中,使用方向键移动光标;使用 y 键选择功能,可以将该功能编译进内核,此时功能前面变为[*];使用m键选中功能,可以将该功能作为模块编译,此时功能前面变为[M];使用 n 键可以取消选中,此时功能前面变为[ ]。

图2 内核配置菜单

在配置内核时,有时想将功能编译进内核,但是会如下图提示:

图3 将功能编译进内核却报错

这是因为这个功能还依赖于其他功能。而其他功能是被作为模块编译的。因此要想将该功能编译进内核,就也得把它依赖的功能编译进内核。所以,我们回到功能页面,按下 h 键就可以看到它依赖的都是哪些功能了。

图4 查看所依赖的功能

我们只需寻找到这些功能,并把它也配置为编译进内核就好了。怎么寻找呢?我们可以按下 / 键调出搜索菜单,然后输入功能的名字就可以查找到这个模块啦。找到模块位置后,将其状态设置为 [*] 就可以啦。此时再回到原来的功能,就可以成功将其编译进内核了。

图5 查找功能位置

最后不断按ESC返回上级菜单,提示选择YES保存即可。

准备设备树文件

设备树源码由厂家提供,请向厂家索要对应模块在树莓派上的tpm设备树源码。特别的,英飞凌的slb9670模块不需要准备设备树文件。因为该模块的设备树文件已经集成到树莓派系统4.15.0-1036.38以上的内核中:Bug #1822036 “Add devicetree overlay to support the SLB9670 TPM ...” : Bugs : linux-raspi2 package : Ubuntu

此处以国民技术的Z32H30TC模块为例,其设备树源码如下:

/** Device Tree overlay for the Nationz TPM 2.0(Nationz Z32H330TC) for the RPI**//dts-v1/;
/plugin/;/ {compatible = "brcm,bcm2835", "brcm,bcm2708", "brcm,bcm2709";fragment@0 {target = <&spi0>;__overlay__ {status = "okay";};};fragment@1 {target = <&spidev0>;__overlay__ {status = "disabled";};};fragment@2 {target = <&spi0>;__overlay__ {/* needed to avoid dtc warning */#address-cells = <1>;#size-cells = <0>;z32h330tc: z32h330tc@0{compatible = "tcg,tpm_tis-spi";reg = <0>;	/* CE0 */#address-cells = <1>;#size-cells = <0>;spi-max-frequency = <49800000>;status = "okay";};};};
};

 复制该设备树源码,执行以下代码:

cd arch/arm/boot/dts/overlays/
nano nations-tpm-z32h330tc.dts

粘贴设备树源码。按Ctrc+X退出编辑模式。然后依据提示按Y保存缓冲区的数据。最后按Enter写入文件。

此处的文件名可以推荐依据tpm厂家和tpm的具体型号不同进行自定义。但一定要记住该文件名。

最后,使用下面命令返回下载的内核的主文件夹。

cd -

交叉编译

内核配置完成后,我们就要进行交叉编译,将源代码编译为可执行程序。请不要直接执行下面的代码,先根据自己的情况更改dtbo文件名和-j参数。64位内核在这与此命令不同。请结合本文内容并参考文末链接:

  • ARCH、CROSS_COMPILE参数不再赘述。
  • zImage:生成的 Linux 内核镜像的文件名;
  • modules:生成内核模块;
  • dtbs:生成设备树二进制文件(Device Tree Binary)。设备树是一种描述硬件设备信息的数据结构,用于在 Linux 内核中动态配置硬件。生成的设备树二进制文件将包含硬件设备的描述信息
  • overlays/nations-tpm-z32h330tc.dtbo:前面的overlays/不用管,请将后面的文件名更改为上一步中设备树源码的文件名。
  • ;-j24 多线程编译。其后的数字取决于电脑的CPU线程数量,一般为CPU线程数量*1.5。请自行修改为适合自己电脑的参数。
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- zImage modules dtbs overlays/nations-tpm-z32h330tc.dtbo -j24

注意:如果编译失败,请自行查找错误。网络上一般都有线程的解决方法。唯一要注意的是,报错信息并不总是在make结尾,中间也可能出现报错。因此在编译失败后请使用第三方工具查找make输出所有结果中含有error的内容。建议将Make输出信息输出到文件,便于查找错误信息。

内核安装

将预安装有系统的SD卡插入读卡器,连接到Ubuntu虚拟机。执行下面的命令查看SD卡的分区情况。

sudo lsblk
图6 查看分区

其中,boot分区,即小一点的分区,文件系统格式一般为fat32;rootfs分区,即大一点的分区,文件系统格式一般为ex4。这里要将分区号与文件系统格式对应。在本文中,sdb1对应fat32文件系统;sdb2对应ex4文件系统。

此时,我们应该还在下载的树莓派内核源代码的目录,即在名为linux的目录下。如果不在,请切换到刚刚下载的树莓派内核源代码目录。

然后,创建文件夹,将不同的文件系统挂载到对饮的目录下。这里sdb1对应fat32文件系统;sdb2对应ex4文件系统。如果你的电脑上不是,请自行调整顺序,保证文件系统挂载到和其相同的目录下。

sudo mkdir mnt
sudo mkdir mnt/fat32
sudo mkdir mnt/ext4
sudo mount /dev/sdb1 mnt/fat32
sudo mount /dev/sdb2 mnt/ext4

接下来,执行下面的命令,安装内核及模块。64位内核在这与此命令不同,请结合本文内容并参考文末链接。

sudo env PATH=$PATH make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- INSTALL_MOD_PATH=mnt/ext4 modules_install

然后,备份原内核、复制新内核及设备树信息。64位内核在这与此命令不同,请结合本文内容并参考文末链接。

sudo cp mnt/fat32/$KERNEL.img mnt/fat32/$KERNEL-backup.img
sudo cp arch/arm/boot/zImage mnt/fat32/$KERNEL.img
sudo cp arch/arm/boot/dts/*.dtb mnt/fat32/
sudo cp arch/arm/boot/dts/overlays/*.dtb* mnt/fat32/overlays/
sudo cp arch/arm/boot/dts/overlays/README mnt/fat32/overlays/

 然后,使用nano编辑器打开树莓派配置文件。

nano mnt/fat32/config.txt

在文件末尾添加以下代码: 

dtparam=spi=on
dtoverlay=nations-tpm-z32h330tc

首先我们启用spi接口,然后设备树文件使用nations-tpm-z32h330tc。这里dtoverlay后的文件名应当与之前的.dtbo文件的文件名保持一致。

编辑完成后按Ctrc+X退出编辑模式。然后依据提示按Y保存缓冲区的数据。最后按Enter写入文件。

最后,执行以下命令取消挂载并弹出SD卡,然后将SD卡重新插入树莓派。

sudo umount mnt/fat32
sudo umount mnt/ext4

配置树莓派

连接tpm模块

在配置前,请将tpm模块正确连接到树莓派4B上。不同模块的接口不同,因此连接方式也不同。请询问厂家如何将模块安装到树莓派4B上。国民技术的Z32H30TC模块安装方式如下图所示:

图7 国民技术Z32H30TC模块在树莓派4B上的安装方式

查询内核版本

正确连接到树莓派后,我们首先使用以下命令查询内核版本。

uname -a

如果显示的内核版本和我们之前下载的内核版本一样,证明内核更换成功,可以继续操作。如果内核版本仍是更换前的版本,请重新下载并配置内核。 

如果内核更换成功且设备树文件配置正确。此时使用命令查看连接的设备。该命令的执行结果应该不为空。如果为空,则证明tpm模块未正确连接到树莓派,请自行查找问题并重新配置。

ls /dev | grep tpm

安装tpm2-tools工具

tpm2-tools是tpm2-tss的实现,可以通过它对tpm模块进行操作。

sudo apt-get update
sudo apt-get install tpm2-tools

测试tpm模块

以下实例代码使用tpm2-tools工具进行简单的加密解密和哈希测试tpm模块:

# 查询TPM的版本和状态
sudo tpm2_getcap properties-fixed# 创建一个主密钥(SRK)
sudo tpm2_createprimary -C o -c primary.ctx# 创建一个子密钥(EK)
sudo tpm2_create -C primary.ctx -u key.pub -r key.priv# 加载子密钥到TPM中,并获取一个句柄
sudo tpm2_load -C primary.ctx -u key.pub -r key.priv -c key.ctx# 对数据进行加密
sudo echo "Hello TPM" > plain.txt
sudo tpm2_rsaencrypt -c key.ctx -o cipher.txt plain.txt# 对数据进行解密
sudo tpm2_encryptdecrypt -c key.ctx -d -o decrypt.txt cipher.txt# 对数据进行哈希运算
sudo tpm2_hash -C n -g sha256 -o hash.bin plain.txt
图8 加解密功能和哈希功能测试结果

参考链接

配置树莓派参考链接:

​​​​Raspberry Pi Documentation - The Linux kernel --- Raspberry Pi 文档 - Linux 内核

主要参考Building the Kernel Locally、Cross-Compiling the Kernel、Configuring the Kernel三大部分。

进一步学习TPM可以参考以下链接:

tpm2-tools官方文档

TPM2.0原理讲解

这篇关于树莓派4B安装并使用TPM模块的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/312049

相关文章

Zookeeper安装和配置说明

一、Zookeeper的搭建方式 Zookeeper安装方式有三种,单机模式和集群模式以及伪集群模式。 ■ 单机模式:Zookeeper只运行在一台服务器上,适合测试环境; ■ 伪集群模式:就是在一台物理机上运行多个Zookeeper 实例; ■ 集群模式:Zookeeper运行于一个集群上,适合生产环境,这个计算机集群被称为一个“集合体”(ensemble) Zookeeper通过复制来实现

CentOS7安装配置mysql5.7 tar免安装版

一、CentOS7.4系统自带mariadb # 查看系统自带的Mariadb[root@localhost~]# rpm -qa|grep mariadbmariadb-libs-5.5.44-2.el7.centos.x86_64# 卸载系统自带的Mariadb[root@localhost ~]# rpm -e --nodeps mariadb-libs-5.5.44-2.el7

Centos7安装Mongodb4

1、下载源码包 curl -O https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-rhel70-4.2.1.tgz 2、解压 放到 /usr/local/ 目录下 tar -zxvf mongodb-linux-x86_64-rhel70-4.2.1.tgzmv mongodb-linux-x86_64-rhel70-4.2.1/

中文分词jieba库的使用与实景应用(一)

知识星球:https://articles.zsxq.com/id_fxvgc803qmr2.html 目录 一.定义: 精确模式(默认模式): 全模式: 搜索引擎模式: paddle 模式(基于深度学习的分词模式): 二 自定义词典 三.文本解析   调整词出现的频率 四. 关键词提取 A. 基于TF-IDF算法的关键词提取 B. 基于TextRank算法的关键词提取

python: 多模块(.py)中全局变量的导入

文章目录 global关键字可变类型和不可变类型数据的内存地址单模块(单个py文件)的全局变量示例总结 多模块(多个py文件)的全局变量from x import x导入全局变量示例 import x导入全局变量示例 总结 global关键字 global 的作用范围是模块(.py)级别: 当你在一个模块(文件)中使用 global 声明变量时,这个变量只在该模块的全局命名空

使用SecondaryNameNode恢复NameNode的数据

1)需求: NameNode进程挂了并且存储的数据也丢失了,如何恢复NameNode 此种方式恢复的数据可能存在小部分数据的丢失。 2)故障模拟 (1)kill -9 NameNode进程 [lytfly@hadoop102 current]$ kill -9 19886 (2)删除NameNode存储的数据(/opt/module/hadoop-3.1.4/data/tmp/dfs/na

Hadoop数据压缩使用介绍

一、压缩原则 (1)运算密集型的Job,少用压缩 (2)IO密集型的Job,多用压缩 二、压缩算法比较 三、压缩位置选择 四、压缩参数配置 1)为了支持多种压缩/解压缩算法,Hadoop引入了编码/解码器 2)要在Hadoop中启用压缩,可以配置如下参数

Makefile简明使用教程

文章目录 规则makefile文件的基本语法:加在命令前的特殊符号:.PHONY伪目标: Makefilev1 直观写法v2 加上中间过程v3 伪目标v4 变量 make 选项-f-n-C Make 是一种流行的构建工具,常用于将源代码转换成可执行文件或者其他形式的输出文件(如库文件、文档等)。Make 可以自动化地执行编译、链接等一系列操作。 规则 makefile文件

深入探索协同过滤:从原理到推荐模块案例

文章目录 前言一、协同过滤1. 基于用户的协同过滤(UserCF)2. 基于物品的协同过滤(ItemCF)3. 相似度计算方法 二、相似度计算方法1. 欧氏距离2. 皮尔逊相关系数3. 杰卡德相似系数4. 余弦相似度 三、推荐模块案例1.基于文章的协同过滤推荐功能2.基于用户的协同过滤推荐功能 前言     在信息过载的时代,推荐系统成为连接用户与内容的桥梁。本文聚焦于

使用opencv优化图片(画面变清晰)

文章目录 需求影响照片清晰度的因素 实现降噪测试代码 锐化空间锐化Unsharp Masking频率域锐化对比测试 对比度增强常用算法对比测试 需求 对图像进行优化,使其看起来更清晰,同时保持尺寸不变,通常涉及到图像处理技术如锐化、降噪、对比度增强等 影响照片清晰度的因素 影响照片清晰度的因素有很多,主要可以从以下几个方面来分析 1. 拍摄设备 相机传感器:相机传