如何用 livecd.sh 打包 Ventoy LiveCD ISO?
【免费下载链接】VentoyA new bootable USB solution.项目地址: https://gitcode.com/GitHub_Trending/ve/Ventoy
如果你已经拿到 Ventoy 源码树并完成了完整编译打包,接下来想生成一张可引导的 Ventoy LiveCD ISO(Tinycore 发行版 + Ventoy Linux 安装包),那么只需要运行 LiveCD/livecd.sh 一个脚本。本文基于 LiveCD/livecd.sh、LiveCD/README.txt 和 DOC/BuildVentoyFromSource.txt 说明运行前提、脚本实际做了什么、如何确认产物生成,以及脚本自带的错误提示。
LiveCD ISO 里包含什么
LiveCD/README.txt 说明:Ventoy LiveCD = Tinycore 发行版 + Ventoy linux 安装包。具体由三部分文件组成:
LiveCD/ISO/EFI/boot/下的vmlinuz64、corepure64.gz、modules64.gz:Tinycore 11.x x86_64 的发行版文件,README 中给出了对应的 MD5SUM;LiveCD/VTOY/ventoy/tcz/下的 8 个.tcz(如parted.tcz、glib2.tcz、readline.tcz等);LiveCD/VTOY/ventoy/drivers/下的内核驱动.ko,README 说明它们基于 Tinycore 5.4.3 内核编译(config-5.4.3-tinycore64、linux-5.4.3-patched.txz),编译时禁用了某个无线网卡驱动以避免编译错误。
下载源地址与每个文件的 MD5SUM 以 LiveCD/README.txt 为准,替换这些文件后可重新打包。
运行前提
livecd.sh 开头有两处硬性检查,不满足会直接退出:
当前目录的上一级(
$PWD/../)必须存在INSTALL/grub/grub.cfg,脚本还会从中读取版本号:version=$(grep 'set.*VENTOY_VERSION=' $VENTOY_PATH/INSTALL/grub/grub.cfg | awk -F'"' '{print $2}')也就是说必须在
LiveCD/目录内运行脚本,且源码树中已有INSTALL/的打包产物。当前仓库中 INSTALL/grub/grub.cfg 的版本行为set VENTOY_VERSION="1.0.99",脚本按此值命名产物。必须存在对应版本的安装包
INSTALL/ventoy-${version}-linux.tar.gz,否则报错no ventoy-${version}-linux.tar.gz detected并退出。该 tar 包是完整编译打包的产物,按 DOC/BuildVentoyFromSource.txt 的流程,在INSTALL/下运行all_in_one.sh(或单独修改后运行ventoy_pack.sh)生成,见 INSTALL/ventoy_pack.sh。
编译环境方面,DOC/BuildVentoyFromSource.txt 给出的基准环境是 CentOS 7.8 x86_64,安装的系统包列表中包含本脚本用到的gcc和xorriso;脚本还依赖cpio、gzip、dd、mkfs.vfat。注意脚本会执行mount efi.img efimnt,需要 root 权限。
执行打包
在LiveCD/目录下运行:
cd LiveCD sh livecd.sh脚本首行参数支持一个可选值:
sh livecd.sh CI两者的差别只有一处:正常模式用cp -a复制GRUB/bootx64.efi进 EFI 镜像,CI模式改用cp -dR。这是脚本内OPT变量的唯一用途。
脚本内部做了什么
按 livecd.sh 的执行顺序:
- 校验
grub.cfg与ventoy-${version}-linux.tar.gz存在,解析出版本号; - 复制
ISO/为ISO_TMP/、VTOY/为VTOY_TMP/,复制失败会报Copy ISO_TMP failed/Copy VTOY_TMP failed并退出; - 在
VTOY_TMP内用gcc -O2编译ventoy/disksize.c生成disksize,随后删除该 .c 源文件(注意:此删除发生在临时副本VTOY_TMP中),再给ventoy/*.sh加执行权限,把整个目录打成cpio newc + gzip归档写入ISO_TMP/EFI/ventoy/ventoy.gz; - 把
ventoy-${version}-linux.tar.gz、GRUB/cdrom.img、GRUB/bootx64.efi拷入ISO_TMP/EFI/; - 用
dd建一个 2MB 的efi.img,mkfs.vfat格式化,挂载后把GRUB/bootx64.efi复制为efimnt/EFI/boot/bootx64.efi再卸载——这一步需要 root,失败会导致打包中断; - 用
sed把ISO_TMP/EFI/boot/grub.cfg中的占位符xxx替换为实际版本号。LiveCD/ISO/EFI/boot/grub.cfg 里的菜单项Ventoy xxx LiveCD和newc:ventoy.tar.gz:/EFI/ventoy/ventoy-xxx-linux.tar.gz因此变成真实版本路径,set default=LiveCD指定默认启动项,另有Ventoy xxx LiveCD (Debug Mode)菜单项(loglevel=10 multivt)用于调试; - 调用
xorriso -as mkisofs生成 ISO。关键参数包括:卷标VentoyLiveCD、-P 'VENTOY COMPATIBLE'、BIOS 引导文件-b EFI/boot/cdrom.img配--grub2-mbr ../GRUB/boot_hybrid.img、EFI 引导-e EFI/boot/efi.img配-append_partition 2 0xEF,输出到../ventoy-${version}-livecd.iso; - 清理临时目录
ISO_TMP、VTOY_TMP、efimnt、efi.img。
cdrom.img内嵌的 GRUB 入口是 LiveCD/GRUB/embed.cfg,它只做两件事:search -f /EFI/VentoyLiveCD -s root找到卷,然后加载($root)/EFI/boot/grub.cfg。/EFI/VentoyLiveCD标记文件就来自 LiveCD/ISO/EFI/VentoyLiveCD。
如何确认打包成功
脚本在xorriso之前先执行rm -f ../ventoy-${version}-livecd.iso,因此产物路径完全由版本号决定:
cd .. # 回到 Ventoy 源码根目录 ls ventoy-${version}-livecd.iso # 以当前仓库 grub.cfg 中 VENTOY_VERSION="1.0.99" 为例: ls ventoy-1.0.99-livecd.iso文件存在且大小非零即代表xorriso已成功写出。脚本过程中若失败,会看到它自己给出的错误文本:no grub.cfg detected、no ventoy-${version}-linux.tar.gz detected、Copy ISO_TMP failed、Copy VTOY_TMP failed,按提示回到前提检查对应文件即可。
限制与说明
- 脚本假设运行目录就是源码树的
LiveCD/(VENTOY_PATH=$PWD/../),在其他位置运行会因找不到INSTALL/grub/grub.cfg而失败; - 版本号唯一来源是
INSTALL/grub/grub.cfg里的VENTOY_VERSION,如果INSTALL/ventoy-*-linux.tar.gz的版本与它不一致,脚本会以 grub.cfg 中的版本去查找 tar 包并报错,需要先保证两者一致; LiveCD/ISO/EFI/boot/grub.cfg中的xxx是脚本预留的占位符,不要手动改成版本号——sed按xxx精确替换,改了反而会导致版本号替换不进去;- 重新打包前脚本会删除并重建
ISO_TMP、VTOY_TMP、efi.img,这些都是临时文件,但运行livecd.sh属于生成产物操作,确认LiveCD/下没有需要保留的本地改动后再执行。
【免费下载链接】VentoyA new bootable USB solution.项目地址: https://gitcode.com/GitHub_Trending/ve/Ventoy
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考