工具、库编译
依赖库列表(必须按顺序编译安装到同一 SYSROOT)

  1. util-linux (提供 libuuid、libblkid)

  2. lvm2 (提供 libdevmapper)

  3. popt (命令行参数解析)

  4. json-c (LUKS2 元数据)

  5. 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 disableallprograms enablelibuuidenablelibblkid disablestaticenablesharedmakej(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 enablestaticlinkdisableshared disableselinuxdisablereadline withudevdir=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/installmakej(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 crosscompileprefix=aarch64linuxgnumakej(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="-ICROSSPREgcc./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="ldevmapperlcryptoljsonclaio"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=CROSSPREdisableluks2reencryptiondisablecryptsetupdisableasciidocdisablesshtokenwithcryptobackend=opensslmakeinstallDESTDIR={SCRIPT_DIR}

  6. 目标板内核要求
    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。

  1. 创建空镜像(大小自定,这里 1G 示例)
    dd if=/dev/zero of=myfolder.img bs=1M count=1024
  2. 用 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 错误 。

Logo

openvela 操作系统专为 AIoT 领域量身定制,以轻量化、标准兼容、安全性和高度可扩展性为核心特点。openvela 以其卓越的技术优势,已成为众多物联网设备和 AI 硬件的技术首选,涵盖了智能手表、运动手环、智能音箱、耳机、智能家居设备以及机器人等多个领域。

更多推荐