You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Ubuntu自动安装ISO中加入自定义Bash脚本并在late-commands阶段执行?

如何在Ubuntu自动安装ISO中加入自定义Bash脚本并在late-commands阶段执行?

我刚好处理过类似的离线Ubuntu自动安装需求,给你一步步拆解怎么实现:

1. 把自定义脚本加入到自动安装ISO中

首先你需要先解压官方的Ubuntu auto-install ISO到本地目录,比如我习惯放在~/ubuntu-autoiso:

mkdir ~/ubuntu-autoiso
7z x ubuntu-22.04-autoinstall.iso -o~/ubuntu-autoiso

(如果没有7z可以用mount挂载ISO后复制文件,效果一样)

接下来在解压后的nocloud/目录下新建一个scripts文件夹,把你的两个bash脚本(比如setup-app.sh和config-system.sh)放进去。记得给脚本加上执行权限,不然后面没法运行:

mkdir ~/ubuntu-autoiso/nocloud/scripts
cp /path/to/your/scripts/*.sh ~/ubuntu-autoiso/nocloud/scripts/
chmod +x ~/ubuntu-autoiso/nocloud/scripts/*.sh

最后重新打包成新的ISO文件,用xorriso工具(这个工具比genisoimage更适配Ubuntu的ISO结构):

xorriso -as mkisofs -r -V "Ubuntu AutoInstall Custom" \
  -J -l -b isolinux/isolinux.bin -c isolinux/boot.cat \
  -no-emul-boot -boot-load-size 4 -boot-info-table \
  -eltorito-alt-boot -e boot/grub/efi.img -no-emul-boot \
  -o ~/ubuntu-auto-install-custom.iso ~/ubuntu-autoiso/

2. 在user-data的late-commands中配置复制与执行脚本

late-commands是在安装接近尾声时运行的,不过要注意:它是在安装器的临时环境里执行,不是在刚安装好的系统里,所以我们需要通过/target目录(目标系统的根分区挂载点)来操作新系统的文件。

假设你在user-data里创建的用户是server-user,下面是完整的late-commands配置示例:

late-commands:
  # 第一步:把ISO里的脚本复制到目标系统的用户家目录(或者你想放的其他目录)
  - cp /cdrom/nocloud/scripts/setup-app.sh /target/home/server-user/
  - cp /cdrom/nocloud/scripts/config-system.sh /target/home/server-user/
  # 给脚本加上执行权限(因为复制后权限可能会变)
  - chmod +x /target/home/server-user/*.sh
  # 第二步:进入目标系统环境执行脚本
  # 用chroot切换到目标系统,直接运行脚本
  - chroot /target /home/server-user/setup-app.sh
  # 如果脚本需要以普通用户身份运行,用su切换用户
  - chroot /target su - server-user -c "/home/server-user/config-system.sh"

如果你想把脚本放到/opt或者/var这类系统目录,只需要修改路径就行,比如:

late-commands:
  - cp /cdrom/nocloud/scripts/setup-app.sh /target/opt/
  - chmod +x /target/opt/setup-app.sh
  - chroot /target /opt/setup-app.sh

3. 关键注意事项

  • 离线环境适配:确保你的脚本里没有任何需要联网的操作(比如apt install),不然会执行失败
  • 路径正确性:安装器会把ISO挂载到/cdrom,所以脚本的源路径一定是/cdrom/nocloud/scripts/xxx.sh
  • 权限问题:复制脚本后一定要重新加执行权限,避免因为文件权限丢失导致无法运行
  • 脚本兼容性:脚本里的路径要使用目标系统的绝对路径,比如/home/server-user/而不是~/,因为chroot环境下的家目录和安装器的不一样

备注:内容来源于stack exchange,提问作者Nando

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.17 09:14:37