dm-integrity机制
工具、库编译
依赖库列表(必须按顺序编译安装到同一 SYSROOT)
-
util-linux (提供 libuuid、libblkid)
-
lvm2 (提供 libdevmapper)
-
popt (命令行参数解析)
-
json-c (LUKS2 元数据)
-
openssl (libcrypto / libssl)
2.1 util-linux
wget https://mirrors.edge.kernel.org/pub/linux/utils/util-linux/v2.39/util-linux-2.39.tar.xz
tar -xf util-linux-2.39.tar.xz && cd util-linux-2.39
./configure --host=CROSSPRE −−prefix=/home/ubuntu/install −−disable−all−programs −−enable−libuuid−−enable−libblkid −−disable−static−−enable−sharedmake−j{CROSS_PRE} \ --prefix=/home/ubuntu/install \ --disable-all-programs \ --enable-libuuid --enable-libblkid \ --disable-static --enable-shared make -jCROSSPRE −−prefix=/home/ubuntu/install −−disable−all−programs −−enable−libuuid−−enable−libblkid −−disable−static−−enable−sharedmake−j(nproc) && make install
2.2 lvm2 → 得到 libdevmapper
wget https://sourceware.org/pub/lvm2/LVM2.2.03.21.tgz
tar -xf LVM2.2.03.21.tgz && cd LVM2.2.03.21
./configure --host=aarch64-linux-gnu
–prefix=SYSROOT/usr −−enable−staticlink−−disable−shared −−disable−selinux−−disable−readline −−with−udevdir=SYSROOT/usr \ --enable-static_link --disable-shared \ --disable-selinux --disable-readline \ --with-udevdir=SYSROOT/usr −−enable−staticlink−−disable−shared −−disable−selinux−−disable−readline −−with−udevdir=SYSROOT/lib/udev
make -jKaTeX parse error: Expected 'EOF', got '&' at position 29: ….device-mapper &̲& make install …{CROSS_PRE}
–prefix=/home/ubuntu/install
–disable-static --enable-shared
–disable-nls
make -jKaTeX parse error: Expected 'EOF', got '&' at position 9: (nproc) &̲& make install …{CROSS_PRE}-gcc
-DCMAKE_BUILD_TYPE=Release
-DBUILD_SHARED_LIBS=ON
-DCMAKE_INSTALL_PREFIX=TOPPWD/installmake−jTOP_PWD/install make -jTOPPWD/installmake−j(nproc) && make install
2.5 openssl
wget https://www.openssl.org/source/openssl-3.0.12.tar.gz
tar -xf openssl-3.0.12.tar.gz && cd openssl-3.0.12
./Configure linux-aarch64 no-asm --prefix=SYSROOT/usr −−cross−compile−prefix=aarch64−linux−gnu−make−jSYSROOT/usr \ --cross-compile-prefix=aarch64-linux-gnu- make -jSYSROOT/usr −−cross−compile−prefix=aarch64−linux−gnu−make−j(nproc) && make install
2.6 cryptsetup
复制
wget https://gitlab.com/cryptsetup/cryptsetup/-/archive/v2.6.1/cryptsetup-v2.6.1.tar.gz
tar -xf cryptsetup-v2.6.1.tar.gz && cd cryptsetup-v2.6.1
./autogen.sh
if [ -f Makefile ];then
make distclean
fi
pwd
export CC=CROSSPRE−gcc./configureCPPFLAGS="−I{CROSS_PRE}-gcc ./configure CPPFLAGS="-ICROSSPRE−gcc./configureCPPFLAGS="−ISCRIPT_DIR/include"
LDFLAGS="-LSCRIPTDIR/lib"LIBS="−ldevmapper−lcrypto−ljson−c−laio"−−prefix=SCRIPT_DIR/lib" LIBS="-ldevmapper -lcrypto -ljson-c -laio" --prefix=SCRIPTDIR/lib"LIBS="−ldevmapper−lcrypto−ljson−c−laio"−−prefix={SCRIPT_DIR} --host=CROSSPRE−−disable−luks2−reencryption−−disable−cryptsetup−−disable−asciidoc−−disable−ssh−token−−with−cryptobackend=opensslmakeinstallDESTDIR=CROSS_PRE --disable-luks2-reencryption --disable-cryptsetup --disable-asciidoc --disable-ssh-token --with-crypto_backend=openssl make install DESTDIR=CROSSPRE−−disable−luks2−reencryption−−disable−cryptsetup−−disable−asciidoc−−disable−ssh−token−−with−cryptobackend=opensslmakeinstallDESTDIR={SCRIPT_DIR} -
目标板内核要求
CONFIG_DM_INTEGRITY=y
否则用户空间工具会报 “device-mapper: table load failed: No such file or directory”。
文件夹”做成 带 dm-integrity 校验的 ext4 文件系统
要把“文件夹”做成 带 dm-integrity 校验的 ext4 文件系统,思路只有一条:先把文件夹打包成镜像文件 → 把镜像文件虚拟成块设备 → 用 integritysetup 给块设备加 integrity 标签 → 在映射设备上 mkfs.ext4 → 挂载使用。下面给出最简 5 步,全部命令非 root 用户只需在前面加 sudo。
- 创建空镜像(大小自定,这里 1G 示例)
dd if=/dev/zero of=myfolder.img bs=1M count=1024 - 用 integritysetup 格式化并打开映射
复制
生成 integrity 超级块+标签区
integritysetup format myfolder.img --integrity
hmac(sha256) --integrity-key=32字节key
–data-block-size=1024
–hash-block-size=1024
得到 /dev/mapper/int_vol
integritysetup open myfolder.img int_vol --integrity-key-file=/etc/intkey.bin ----integrity-key-size=32
–data-block-size=1024
–hash-block-size=1024
可用文件方式 --integrity-key-file=/etc/intkey.bin ,需要使用密钥校验文件系统真实性采用
(/etc/intkey.bin必须是32 字节的原始二进制)
设备块大小不是默认的4K需要指定参数
–data-block-size=1024
–hash-block-size=1024
3. 在“带校验”的映射设备上建 ext4
mkfs.ext4 /dev/mapper/int_vol
4. 挂载 → 拷文件夹 → 正常使用
mount /dev/mapper/int_vol /mnt
cp -a /your/folder/* /mnt/
umount /mnt
以后每次使用:
integritysetup open myfolder.img int_vol # 重新挂出 /dev/mapper/int_vol
mount /dev/mapper/int_vol /mnt
用完反向关闭即可:
umount /mnt
integritysetup close int_vol
losetup -d /dev/loop0
要点小结
● “文件夹”本身无法直接加 integrity,必须先变成块设备
● integritysetup 负责在块层追加校验标签;mkfs.ext4 只是把它当成普通磁盘格式化。
● 如果镜像文件被外部篡改,下次读文件时内核会报 Input/output error,实现静默数据损坏检测 。
系统如何使用 dm-integrity类型的文件系统
把“根文件系统”本身放进 dm-integrity,相当于让内核“一启动就面对一个带校验标签的块设备”。
Linux 目前对 早期用户空间(initramfs)以外的块设备只能做 只读哈希树(dm-verity) 的“内核原生挂载”;可写的 dm-integrity 仍需借助 initramfs 先映射、再 pivot_root,否则内核无法得知“超级块里已经存在标签”。
因此下面给出两条路线,按需选用:
路线 A适合嵌入式:dm-verity只读根文件系统,在系统启动过程中加脚本挂载dm-integrity类型的文件系统,之后就可以正常读写文件。
dm-verity只读根文件系统,见
https://alidocs.dingtalk.com/api/doc/transit?spaceId=2679964648&dentryId=205626420863&corpId=ding72acb342117d33b7路线 B:可写根——用 initramfs 先映射 dm-integrity,再 pivot_root
适合服务器、桌面,需要正常读写,同时防静默损坏。
准备独立分区
假设 /dev/sda3 留给未来根
wipefs -a /dev/sda3
在 宿主机 上格式化并打开 dm-integrity
wipefs -a /dev/sda3
在 宿主机 上格式化并打开 dm-integrity
integritysetup format /dev/sda3
integritysetup open /dev/sda3 int_root
mkfs.ext4 /dev/mapper/int_root
mount /dev/mapper/int_root /mnt
把系统装进去(rsync / debootstrap / pacstrap …)
生成 early 阶段的 initramfs hook
下面以 dracut 为例(Debian 可用 initramfs-tools,思路相同)
新建 /usr/lib/dracut/modules.d/90integrity/integrity-root.sh
#!/bin/sh
integritysetup open /dev/sda3 int_root || emergency_shell
mount /dev/mapper/int_root /sysroot
然后在 /etc/dracut.conf.d/integrity.conf 加入
复制
add_device=“/dev/sda3”
add_drivers+=" dm-integrity dm-mod "
install_items+=“/sbin/integritysetup”
重新生成 initramfs
dracut -f -v
调整 真实 root 的 /etc/fstab
把原来的 UUID=xxx / ext4 … 改成
/dev/mapper/int_root / ext4 defaults 0 1
bootloader 段无需再写 dm-mod.create,因为映射由 initramfs 完成;只需让内核知道“真正的根在 /dev/mapper/int_root”
GRUB 示例:
复制
linux /vmlinuz root=/dev/mapper/int_root rd.auto=1
initrd /initramfs-xxx.img
重启即可。
以后每次写数据,内核自动计算 HMAC/CRC32c 标签并先写 journal 区,再合并到最终位置;读盘时若标签不匹配立即返回 I/O 错误 。
openvela 操作系统专为 AIoT 领域量身定制,以轻量化、标准兼容、安全性和高度可扩展性为核心特点。openvela 以其卓越的技术优势,已成为众多物联网设备和 AI 硬件的技术首选,涵盖了智能手表、运动手环、智能音箱、耳机、智能家居设备以及机器人等多个领域。
更多推荐


所有评论(0)