如何在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
相关产品推荐
相关产品推荐

