本帖最后由 中关村东路 于 2024-4-4 18:00 编辑
首先看看你当前的initramfs是什么格式的,6.0以后默认是zstd,如果是别的格式下面的脚本略有不同但操作类似:
- file /boot/initramfs-linux.img
- initramfs-linux-ramroot.img.zst: Zstandard compressed data (v0.8+), Dictionary ID: None
复制代码
接下来我们来看看mkinitcpio是怎么打包zstd格式的initramfs的,
按ctrl+w搜索关键字zstd,找到这段可以看到命令参数只有一个-T0,最终我们就要用zstd -T0来打包。如果你用的是其他压缩格式也是类似的。
- zstd)
- COMPRESSION_OPTIONS=('-T0' "${COMPRESSION_OPTIONS[@]}")
复制代码
现在来解压缩当前正常运行的initramfs,
- mkdir ramroot
- cd ramroot
- cp /boot/initramfs-linux.img initramfs-linux.img.zst
- zstd -d initramfs-linux.img.zst
- cpio -iF initramfs-linux.img
- rm initramfs-linux.img.zst initramfs-linux.img
复制代码
在启动脚本的最后,大约最后一个if之后,修改成如下:
- nano init
- if []
- fi
- mkdir /ram_root
- mount -t tmpfs -o rw,noatime none /ram_root
- cp -a /new_root/* /ram_root/
- mount --move /proc /ram_root/proc
- mount --move /sys /ram_root/sys
- mount --move /dev /ram_root/dev
- umount /new_root
- # this should always be the last thing we do before the switch_root.
- rdlogger_stop
- exec env -i \
- "TERM=$TERM" \
- /usr/bin/switch_root /ram_root "$init" "$@"
- # /usr/bin/switch_root /new_root "$init" "$@"
- # vim: set ft=sh ts=4 sw=4 et:
复制代码 注意上面这段假定硬盘根目录下容量小于内存的一半。如果不是,请参考【1】中的rsync --exclude技巧。
保存之后就可以打包了,注意最后一段,是假定了之前initramfs是用zstd格式压缩的,其他格式需要对应修改。
- find . -print0 | cpio --quiet --null -o -H newc --owner root:root --force-local | zstd -T0 > /boot/initramfs-linux-ramroot.img
复制代码
接下来修改/boot/grub/grub.cfg文件,找到这一段,复制个一模一样的,最后一行改成ramroot的版本。现在重启就会启动到ramroot里了,如果你想切回去就在启动系统时候选第二项。
- ### BEGIN /etc/grub.d/10_linux ###
- menuentry 'Arch Linux in ramroot' ... {
- ...
- initrd /boot/initramfs-linux-ramroot.img
- }
- menuentry 'Arch Linux' ... {
- ...
- initrd /boot/initramfs-linux.img
- }
复制代码
|