# Initramfs Template **Repository Path**: plasma-csv/initramfs-template ## Basic Information - **Project Name**: Initramfs Template - **Description**: No description available - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2024-01-12 - **Last Updated**: 2024-01-12 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # Initramfs Template 为了将GuestOS 完全运行`csv`的加密内存中,从而实现既能对guest os进行度量,又可以对应用的运行时进行保护。 要想将完整的操作系统运行在内存中有两种方式: + a)将整个系统作为initramfs initramfs就是一个小文件系统,也是开机第一个加载的文件系统,所以把整体系统都做成initramfs,那么系统启动只需要initramfs 镜像即可。也就是说在initramfs最后要切换到真正的root_fs时,不切换到了,直接运行系统中的/sbin/init。 + b) 在initramfs运行过程中,将压缩的GuestOS解压并复制到内存中运行(我们采用此方案) initramfs其实就是执行一个init脚本,可通过修改脚本流程。将寻找root device设备进行挂载的步骤忽略,并将其替换为将操作系统镜像直接解压到 /sysroot,再切换到真正的root fs。 ### 1.修改根目录挂载方式 实际上,initramfs 提供了hooks,用于自定义rootfs的挂载逻辑,具体步骤如下 + a) 在initramfs的:/usr/lib/dracut/hooks/pre-pivot/目录下创建80-rootfs.sh + b) 添加如下脚本 ```bash #!/bin/sh echo "hook pivot for mount sysroot form app.tar" mount -t ramfs -o size=500m ramfs /sysroot #将/sysroot mount成ramfs tar xf /app/*.tar -C /sysroot ``` 从脚本可知,在实际使用中,将guest os 的rootfs打包成 tar包,放置在initramfs的`/app`目前中随initramfs镜像一起打包即可。 脚本将从`app`目录中解压guest os到挂载的目录 + c) 虚拟机启动方式 ```bash qemu-system-x86_64 -kernel /opt/csv/kernel/bzImage-5.4.117 -append "root=/dev/ram0 init=/init rootfstype=ramfs" -initrd /home/user/chase/csv-agent/tools/initrd.img -m 32768M -enable-kvm -cpu host -drive if=pflash,format=raw,unit=0,file=/opt/csv/firmware/OVMF.fd,readonly=on -object sev-guest,id=sev0,policy=1,cbitpos=47,reduced-phys-bits=5,kernel-hashes=on -machine memory-encryption=sev0 -vnc localhost:1 ``` 使用这种方式,需在内核启动参数中增加`root=/dev/ram0 rootfstype=ramfs`, 并且需要在编译内核时打开一下module,以便开启对initramfs的支持 ```bash CONFIG_BLK_DEV_INITRD=y CONFIG_BLK_DEV_RAM=y CONFIG_BLK_DEV_RAM_COUNT=1 CONFIG_BLK_DEV_RAM_SIZE=10240 ``` ### 2. docker-image 转 initramfs-image 工具 为方便将应用打包成initramfs镜像,提供从docker-image直接转换的工具,目前支持ubuntu容器镜像。 开发人员可将应用打包基于ubuntu镜像 打包,然后只用转换工具直接生成可在initrd中运行的镜像。 ```bash cd tools bash docker2initrd.sh ``` 打包后生成了可直接加载的initramfs镜像。