构建initrd文件系统

  由于需要在initrd增加更多的操作,原来的initrd文件sbin lib等版本太老,新的系统组件命令不兼容,所以此时需要整一个完全新的系统组件。

经过搜索以及查找目前找到了ubuntu-base 基础镜像!

  ubuntu-img基础组件      ubuntu-base 基础组件在此;Ubuntu 针对不同的 CPU 架构提供相应的 ubuntu base 根文件系统,有 amd64(64 位 X86)、 armhf、 i386(32 位 X86)、 powerpc、 ppc64el 等系统。

 解压缩 ubuntu base 根文件系统

tar -xvf ubuntu-base-18.04.5-base-amd64.tar.gz  -C rootfs

配置base跟文件系统

cp /etc/resolv.conf    rootfs/etc/resolv.conf

同时替换 rootfs/etc/apt/sources.list 目前一般替换为aliyun等镜像源

编写挂在脚本

#!/bin/bash
mnt() {
    echo "mount ------ing"
    sudo mount -t proc /proc ${2}/proc
    sudo mount -t sysfs /sys ${2}/sys
    sudo mount -o bind /dev ${2}/dev
    sudo mount -o bind /dev/pts ${2}/dev/pts
    sudo chroot ${2}
}
umnt() {
    echo "umount-----ing"
    sudo umount ${2}/proc
    sudo umount ${2}/sys
    sudo umount ${2}/dev/pts
    sudo umount ${2}/dev
}

if [ "$1" == "-m" ] && [ -n "$2" ] ;
then
    mnt $1 $2
elif [ "$1" == "-u" ] && [ -n "$2" ];
then
    umnt $1 $2
else
    echo "For example:  mount -m /media/sdcard/rootfs"
    echo ""

fi

 

修改脚本的权限 chmod  a+x mountrootfs.sh

执行挂在chroot动作;

./mountrootfs.sh -m rootfs

于是变切换到了ubuntu-base的根文件系统中

安装所需要的的组件

此时已经进入到了chroot 环境,可以安装当前所需要的的组件

apt update
apt install sudo language-pack-en-base ssh net-tools ethtool 
apt install cryptsetup

  此时可以添加管理员账号 使用passwd  useradd 等进行操作

到目前为止已经按照需求修改了一份跟文件系统。剩下的就是需要将它打包

镜像打包

 首先用 dd 工具创建一个空文件,这里conut的大小参考你的根文件系统(rootfs)的大小,这里生成 1G

dd if=/dev/zero of=LeeUbuntuBase.img bs=1M count=1024

 

 使用 mkfs.ext4 来格式化镜像文件

mkfs.ext4 -F -L rootfs LeeUbuntuBase.img

 

将该镜像文件挂载到一个文件夹上,来读写。将你定制好的根文件系统(rootfs文件夹内)内的文件拷贝到挂载的文件夹内以写入到 img 文件内。

mkdir LeeUbuntuBase
mount LeeUbuntuBase.img LeeUbuntuBase
cp -rfp  rootfs/* LeeUbuntuBase/

 

  • -p:不拷贝符号链接的目标文件,仅拷贝该符号链接

由于项目安全需求, 实际处理过程中一般会对rootfs镜像加密 ;具体涉密就不说了。

核心是

  1. 要找到ubuntu-base 基础镜像
  2. mount 后chroot
  3. apt 安装需要组件
  4. 裁剪文件系统
  5. 根据项目需求压缩 加密

 

posted @ 2022-06-28 22:15  codestacklinuxer  阅读(47)  评论(0)    收藏  举报