基于现有发行版本的initrd.img创建内存操作系统(livecd)


    两年前基于kylin创建内存文件系统时整理,现重新梳理如下:x86/arm64/mips架构理论上通用。

    原理:在启动initrd-switch-root.service服务时,调用启动getty服务启动字符终端(tty1)进入bash。
    直接用initrd.img和vmlinuz打包为efi启动导致启动进入救援模式
    解压发行版系统镜像,拷贝images\pxeboot\中的initrd.img vmlinuz,解压initrd.img

mv initrd.img initrd.img.xz
xz -vd initrd.img.xz
cpio -iv -F ../initrd.img

    拷贝images\install.img\LiveOS\rootfs.img,并挂载到新建的rootfs文件夹
    进入rootfs文件夹/etc/systemd/system,拷贝getty.target.wants文件夹到initrd.img对应目录

cp -r getty.target.wants/ /home/www/make_ramos/legacy/etc/systemd/system/

    同时在initrd.img文件系统的getty.target.wants文件夹下新建软链接

ln -s /usr/lib/systemd/system/serial-getty@.service serial-getty@tty1.service

    如下:serial-getty@tty1.service -> /usr/lib/systemd/system/serial-getty@.service
    进入rootfs文件夹/usr/lib/systemd/system/ 拷贝getty服务到initrd.img对应目录

cp getty* /home/www/make_ramos/legacy/usr/lib/systemd/system/
cp serial-getty@.service /home/www/make_ramos/legacy/usr/lib/systemd/system

    进入rootfs文件夹/usr/lib/systemd//system-generators/

cp systemd-getty-generator /home/www/make_ramos/legacy/usr/lib/systemd/system-generators/

    修改initrd.img /usr/lib/systemd/system/initrd-switch-root.service

[Service]
#Type=oneshot
#ExecStart=/usr/bin/systemctl --no-block switch-root /sysroot
ExecStart=/usr/lib/systemd/system/getty.sh
RemainAfterExit=yes

    并在当前目录新建getty.sh文件,内容为

#!/bin/bash
systemctl daemon-reload  > /var/log/syslog1
systemctl restart serial-getty@tty1.service > /var/log/syslog2
#此处可改为需要运行的脚本
/usr/lib/systemd/system/isib.sh > /var/log/syslog3

    修改getty@service中的ExecStart为下述内容

#!/bin/bash
[Service]
#ExecStart=-/sbin/agetty -o '-p -- \\u' --noclear %I $TERM
ExecStart=-/sbin/agetty --autologin root --noclear -n -l /bin/bash -o '--login' %I 38400

    修改getty.target添加Wants参数

Wants=getty@tty1.service

    修改serial-getty@.service中的dev-%i.device为dev-%i,同时修改ExecStart如下

#ExecStart=-/sbin/agetty -o '-p -- \\u' --keep-baud 115200,38400,9600 %I $TERM
ExecStart=-/sbin/agetty --autologin root --noclear -n -l /bin/bash -o '--login' %I 38400

    进入rootfs文件夹拷贝/sbin/agetty到initrd.img对应目录,进入initrd.img的/usr/lib/systemd/system/目录,删除dracut相关的服务 rm -rf dracut-* 重新打包initrd.ing

find . | cpio -cvo | xz -9 --format=lzma > ../initrd.img

    到此,完工,本文为原创,转载请注明出处。