如何用 livecd.sh 打包 Ventoy LiveCD ISO?
2026/9/9 22:38:09 网站建设 项目流程

如何用 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/下的vmlinuz64corepure64.gzmodules64.gz:Tinycore 11.x x86_64 的发行版文件,README 中给出了对应的 MD5SUM;
  • LiveCD/VTOY/ventoy/tcz/下的 8 个.tcz(如parted.tczglib2.tczreadline.tcz等);
  • LiveCD/VTOY/ventoy/drivers/下的内核驱动.ko,README 说明它们基于 Tinycore 5.4.3 内核编译(config-5.4.3-tinycore64linux-5.4.3-patched.txz),编译时禁用了某个无线网卡驱动以避免编译错误。

下载源地址与每个文件的 MD5SUM 以 LiveCD/README.txt 为准,替换这些文件后可重新打包。

运行前提

livecd.sh 开头有两处硬性检查,不满足会直接退出:

  1. 当前目录的上一级($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",脚本按此值命名产物。

  2. 必须存在对应版本的安装包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,安装的系统包列表中包含本脚本用到的gccxorriso;脚本还依赖cpiogzipddmkfs.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 的执行顺序:

  1. 校验grub.cfgventoy-${version}-linux.tar.gz存在,解析出版本号;
  2. 复制ISO/ISO_TMP/VTOY/VTOY_TMP/,复制失败会报Copy ISO_TMP failed/Copy VTOY_TMP failed并退出;
  3. VTOY_TMP内用gcc -O2编译ventoy/disksize.c生成disksize,随后删除该 .c 源文件(注意:此删除发生在临时副本VTOY_TMP中),再给ventoy/*.sh加执行权限,把整个目录打成cpio newc + gzip归档写入ISO_TMP/EFI/ventoy/ventoy.gz
  4. ventoy-${version}-linux.tar.gzGRUB/cdrom.imgGRUB/bootx64.efi拷入ISO_TMP/EFI/
  5. dd建一个 2MB 的efi.imgmkfs.vfat格式化,挂载后把GRUB/bootx64.efi复制为efimnt/EFI/boot/bootx64.efi再卸载——这一步需要 root,失败会导致打包中断;
  6. sedISO_TMP/EFI/boot/grub.cfg中的占位符xxx替换为实际版本号。LiveCD/ISO/EFI/boot/grub.cfg 里的菜单项Ventoy xxx LiveCDnewc:ventoy.tar.gz:/EFI/ventoy/ventoy-xxx-linux.tar.gz因此变成真实版本路径,set default=LiveCD指定默认启动项,另有Ventoy xxx LiveCD (Debug Mode)菜单项(loglevel=10 multivt)用于调试;
  7. 调用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
  8. 清理临时目录ISO_TMPVTOY_TMPefimntefi.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 detectedno ventoy-${version}-linux.tar.gz detectedCopy ISO_TMP failedCopy 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是脚本预留的占位符,不要手动改成版本号——sedxxx精确替换,改了反而会导致版本号替换不进去;
  • 重新打包前脚本会删除并重建ISO_TMPVTOY_TMPefi.img,这些都是临时文件,但运行livecd.sh属于生成产物操作,确认LiveCD/下没有需要保留的本地改动后再执行。

【免费下载链接】VentoyA new bootable USB solution.项目地址: https://gitcode.com/GitHub_Trending/ve/Ventoy

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询