
1. 项目概述为什么需要制作自动安装镜像最近在给公司的一批新终端做系统部署清一色的国产化硬件预装或要求安装的是银河麒麟桌面操作系统V10 SP2。手动一台台装光是想到要重复点击几十次“下一步”、配置相同的用户名密码、安装同样的基础软件包我就觉得头皮发麻。这不仅是效率问题更是标准化和一致性的挑战。一个配置失误后期排查起来能让你怀疑人生。于是制作一个“自动安装系统的镜像文件”就成了刚需。这玩意儿在Linux世界里有个更专业的名字定制化系统镜像或者更具体点基于Kickstart/Preseed的无值守安装镜像。它的核心价值在于你只需要制作一次就能像流水线一样为成百上千台机器部署出完全一致的操作系统环境。这对于企业IT运维、软件预装测试、甚至个人打造专属的“开箱即用”系统盘都极具意义。简单来说这个项目就是以官方发布的麒麟Kylin V10 SP2 ISO镜像为“原料”通过解包、定制、再封装生成一个全新的ISO文件。用这个新镜像启动电脑后安装过程将完全自动化无需人工干预直至进入桌面。2. 核心思路与工具选型不走弯路的顶层设计动手之前先理清思路。制作自动安装镜像本质上是对原版安装介质的“外科手术式”改造。主流路径有两条基于官方ISO在isolinux/grub引导菜单中嵌入自动应答文件如ks.cfg并修改引导参数。这是最经典、最通用的方法适用于绝大多数基于Anaconda安装程序的Linux发行版麒麟也不例外。使用livecd-creator或ubuntu-builder等工具从零开始构建一个Live系统镜像。这种方法更灵活可以深度定制但门槛也更高需要对系统构建有较深理解。对于麒麟V10 SP2我强烈推荐第一条路径。原因有三首先麒麟的安装程序本质是深度定制的Anaconda完美支持Kickstart其次方法成熟资料和社区经验相对丰富最后改造过程可逆、风险可控即便失败也能快速回退。核心工具清单基础环境一台正在运行的Linux系统可以是物理机也可以是虚拟机。为了方便我直接在Ubuntu 22.04 LTS的虚拟机里操作其工具链完整与麒麟同源兼容性好。必备工具genisoimage或mkisofs、isohybrid、xorriso用于处理ISO、syslinux包含isolinux.bin等引导文件。编辑工具任意文本编辑器vim/nano。原料银河麒麟桌面操作系统V10 SP2的官方ISO镜像文件。可以从麒麟软件官网或其镜像站如http://archive.kylinos.cn获取。注意操作全程建议在虚拟机或非关键环境中进行并做好原版ISO的备份。对引导区的修改有风险操作失误可能导致镜像无法启动。3. 实操详解七步打造“自动装机”麒麟镜像下面我将以“零基础”的视角拆解整个制作过程。你可以跟着一步步操作。3.1 第一步环境准备与原料获取首先确保你的工作环境工具齐全。# 在Ubuntu/Debian系系统中安装必要工具 sudo apt update sudo apt install -y genisoimage syslinux-utils xorriso p7zip-full # 创建我们的工作目录保持环境整洁 mkdir -p ~/kylin-auto-iso cd ~/kylin-auto-iso接着将下载好的麒麟V10 SP2官方ISO文件假设名为Kylin-Desktop-V10-SP2-Release-xxx.iso放入此目录。3.2 第二步解构原版ISO镜像我们需要把ISO这个“压缩包”解开看看里面的结构。# 创建一个目录用于挂载ISO mkdir -p iso-mount # 挂载ISO文件 sudo mount -o loop Kylin-Desktop-V10-SP2-Release-xxx.iso iso-mount/ # 再创建一个目录用于复制并修改ISO内容 mkdir -p iso-edit # 使用rsync复制所有文件保留权限和符号链接 sudo rsync -av iso-mount/ iso-edit/ # 复制完成后卸载ISO sudo umount iso-mount现在iso-edit目录里就是ISO的全部内容了。关键目录和文件如下isolinux/或boot/grub/存放引导配置。麒麟通常使用isolinux作为BIOS引导grub用于UEFI引导。.disk/一些磁盘信息。dists/,pool/存放软件包和仓库信息。md5sum.txt文件校验和。[EFI]UEFI引导相关文件。3.3 第三步创建Kickstart自动应答文件这是自动安装的“大脑”告诉安装程序每一步该怎么做。在iso-edit目录下创建一个文件例如ks.cfg。cd iso-edit sudo vim ks.cfg以下是一个最简化的、可用的ks.cfg示例它完成了分区、用户设置、软件包选择等核心操作# 平台架构x86_64 auth --enableshadow --passalgosha512 # 使用图形化安装也可以文本安装 graphical # 首次启动后不运行设置代理 firstboot --disable # 忽略未使用的存储设备 ignoredisk --only-usesda # 键盘布局、语言、时区 keyboard --vckeymapcn --xlayoutscn lang zh_CN.UTF-8 timezone Asia/Shanghai --isUtc # 网络配置启用网络并使用DHCP自动获取IP network --bootprotodhcp --devicelink --activate # 也可以配置静态IP例如 # network --bootprotostatic --ip192.168.1.100 --netmask255.255.255.0 --gateway192.168.1.1 --nameserver8.8.8.8 --deviceeth0 # Root密码此处使用加密密码生成命令openssl passwd -6或使用python3 -c import crypt; print(crypt.crypt(你的密码, crypt.mksalt(crypt.METHOD_SHA512))) rootpw --iscrypted $6$你的加密密码哈希值 # 创建普通用户 user --namekylinuser --password$6$你的加密密码哈希值 --iscrypted --groupswheel --gecosKylin User # 清除所有分区并初始化磁盘 zerombr clearpart --all --initlabel # 分区方案标准分区/boot 1G, swap 8G (内存8G时建议2倍内存)其余全部给 / autopart --typelvm # 安装源使用光盘介质 cdrom # 软件包选择安装带图形界面的桌面环境 %packages ^kylin-desktop-environment kexec-tools vim-enhanced %end # 安装后脚本可以在这里执行一些自定义命令如安装额外软件、配置服务等 %post --interpreter/bin/bash # 禁用防火墙根据实际需求决定 systemctl disable firewalld # 配置SSH允许root登录慎用仅示例 sed -i s/^#PermitRootLogin.*/PermitRootLogin yes/ /etc/ssh/sshd_config # 更新系统 dnf makecache dnf update -y %end # 重启系统 reboot实操心得rootpw和user的加密密码是新手最容易卡住的地方。务必使用openssl passwd -6或上述Python命令生成SHA-512格式的加密串直接写明文密码是无效的。分区方案autopart是最安全的选择除非你有特殊需求否则不建议新手自定义复杂分区。3.4 第四步修改引导配置注入Kickstart文件我们需要修改引导菜单让系统在启动时自动读取我们的ks.cfg。对于BIOS引导isolinuxcd ~/kylin-auto-iso/iso-edit sudo vim isolinux/isolinux.cfg找到以label linux开头的段落通常在menu default附近。修改其append行在末尾添加inst.kscdrom:/dev/sr0:/ks.cfg。修改后可能类似这样label linux menu label ^安装银河麒麟操作系统 kernel /images/vmlinuz append initrd/images/initrd.img inst.stage2hd:LABELKylin-10-2-2 inst.kscdrom:/dev/sr0:/ks.cfg quiet关键参数解释inst.ks指定Kickstart文件位置。cdrom:/dev/sr0:/ks.cfg表示从光盘根目录读取ks.cfg。inst.stage2hd:LABELKylin-10-2-2指定安装源位置这里的LABEL必须和后续制作新ISO时设置的卷标一致。对于UEFI引导GRUB2sudo vim boot/grub/grub.cfg同样找到linuxefi或linux行在末尾添加相同的inst.ks参数。可能还需要修改EFI/BOOT/grub.cfg取决于具体结构。3.5 第五步更新文件校验和ISO里有个md5sum.txt文件记录了所有文件的MD5值。我们修改了isolinux.cfg、grub.cfg并新增了ks.cfg需要更新它。cd ~/kylin-auto-iso/iso-edit # 删除旧的校验文件 sudo rm -f md5sum.txt # 重新生成所有文件的MD5校验和排除md5sum.txt自身 find . -type f -not -name ‘md5sum.txt’ -exec md5sum {} \; | sudo tee md5sum.txt3.6 第六步封装生成新的ISO镜像这是“打包”步骤用我们修改好的iso-edit目录生成新的ISO文件。cd ~/kylin-auto-iso sudo genisoimage -U -r -v -T -J -joliet-long \ -V “Kylin-10-AutoInstall” \ -volset “Kylin-10-AutoInstall” \ -A “Kylin-10-AutoInstall” \ -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 ./Kylin-V10-SP2-Auto.iso \ iso-edit/参数详解-V “Kylin-10-AutoInstall”设置ISO的卷标Volume ID。至关重要必须与前面isolinux.cfg中inst.stage2hd:LABEL后面的名称完全一致否则安装程序会找不到安装源。-b isolinux/isolinux.bin指定BIOS引导镜像。-e boot/grub/efi.img指定UEFI引导镜像。-o ./Kylin-V10-SP2-Auto.iso输出的新ISO文件名。3.7 第七步使ISO支持U盘启动可选但推荐直接用genisoimage生成的ISO只能用于光盘刻录。要写入U盘并启动需要运行isohybrid命令使其同时具备光盘和硬盘的引导特性。sudo isohybrid --uefi Kylin-V10-SP2-Auto.iso运行成功后你就可以使用dd命令或Rufus、balenaEtcher等工具将这个ISO文件直接写入U盘制作成一个可启动的U盘安装介质了。# 使用dd命令写入U盘请务必确认/dev/sdX是你的U盘设备写错会清空硬盘 sudo dd ifKylin-V10-SP2-Auto.iso of/dev/sdX bs4M statusprogress oflagsync4. 进阶定制让镜像更贴合你的需求基础自动化只是开始一个真正好用的镜像还需要更多打磨。4.1 预置软件包与驱动你可以在%packages部分添加任何你需要的软件包。首先需要知道包名。可以在一个已安装的麒麟系统上使用dnf list available查看或者直接查阅ISO中pool目录下的包列表。%packages ^kylin-desktop-environment vim-enhanced wget curl git # 例如安装微信通过麒麟软件仓库或第三方适配 # kylin-wechat # 安装Wine助手用于运行Windows程序 # kylin-wine-assistant %end对于特定的硬件驱动如某些网卡、显卡如果麒麟官方仓库没有你需要提前下载好.deb或.rpm包并将其放入ISO的某个目录如/extras/然后在%post阶段通过dnf install或dpkg -i进行安装。4.2 自动化配置系统与服务%post脚本段是你的“魔法舞台”。在这里你可以执行任意Shell命令来配置系统。%post --interpreter/bin/bash --log/root/ks-post.log # 1. 配置软件源例如添加企业内部源或更快的镜像源 cat /etc/yum.repos.d/local.repo EOF [local-base] nameLocal Base Repo baseurlhttp://your-internal-mirror/kylin/\$releasever/os/\$basearch/ enabled1 gpgcheck0 EOF # 2. 禁用不必要的服务优化开机速度 systemctl disable bluetooth.service systemctl disable cups.service # 3. 配置桌面环境自动设置壁纸、主题 sudo -u kylinuser DBUS_SESSION_BUS_ADDRESSunix:path/run/user/id -u kylinuser/bus gsettings set org.gnome.desktop.background picture-uri ‘file:///usr/share/backgrounds/your-wallpaper.jpg’ # 4. 部署公司内部的标准配置文件如浏览器书签、终端配置 cp /run/install/repo/extras/company-profile.tar.gz /home/kylinuser/ chown kylinuser:kylinuser /home/kylinuser/company-profile.tar.gz sudo -u kylinuser tar -xzf /home/kylinuser/company-profile.tar.gz -C /home/kylinuser/ # 5. 安装并配置Docker如果需要 dnf install -y docker-ce docker-ce-cli containerd.io systemctl enable --now docker usermod -aG docker kylinuser %end避坑技巧在%post脚本中涉及图形界面或用户级别的配置如gsettings必须像上面那样指定DBUS_SESSION_BUS_ADDRESS否则命令会在root环境下执行失败。--log参数可以将安装后脚本的输出记录到文件便于后期排查问题。4.3 处理U盘安装的特殊情况当安装介质是U盘时设备名可能不是/dev/sr0。为了更通用可以在ks.cfg中使用inst.kshd:LABELKylin-10-AutoInstall:/ks.cfg。同时确保在%post阶段如果需要从安装介质复制文件使用/run/install/repo这个路径它总是指向安装源挂载点。5. 测试、验证与问题排查实录镜像制作完成后切勿直接用于生产环境必须在虚拟机中充分测试。5.1 虚拟机测试流程创建测试虚拟机在VMware或VirtualBox中新建一台虚拟机内存建议4GB以上硬盘50GB以上。加载新ISO将生成的Kylin-V10-SP2-Auto.iso挂载为虚拟机的光驱。启动观察启动虚拟机你应该会看到短暂的引导菜单然后立即进入自动化安装流程无需任何点击。观察屏幕输出看是否有报错如找不到Kickstart文件、分区失败、软件包缺失等。验证结果安装完成后自动重启尝试用你设置的kylinuser和密码登录。检查网络是否通畅。预装的软件包如vim, git是否存在。%post脚本中的配置是否生效如Docker服务是否运行壁纸是否更改。5.2 常见问题与解决方案速查表问题现象可能原因排查与解决思路启动后停在“选择语言”界面Kickstart文件未被加载或路径错误。1. 检查isolinux.cfg/grub.cfg中inst.ks参数是否正确。2. 确认ks.cfg文件是否在ISO根目录且文件名无误。3. 在引导菜单按Tab键手动在命令行末尾添加inst.kscdrom:/dev/sr0:/ks.cfg测试。报错“无法找到安装源”ISO卷标Volume ID不匹配。1. 检查genisoimage命令中的-V参数值。2. 检查isolinux.cfg中inst.stage2hd:LABEL后面的值。3.确保两者完全一致包括大小写和空格。分区失败Kickstart中分区指令有误或与磁盘情况冲突。1. 对于测试虚拟机使用clearpart --all --initlabel和autopart最安全。2. 对于物理机需确认ignoredisk --only-use指定了正确的磁盘如sda。3. 在Kickstart中尝试更简单的分区方案。软件包安装失败指定的软件包名称不存在或依赖冲突。1. 在%packages部分暂时只保留^kylin-desktop-environment看基础包能否安装。2. 逐一添加其他包定位问题包。3. 使用dnf search 包名在麒麟系统中确认准确包名。%post脚本执行失败脚本中存在语法错误或命令路径不对。1. 在%post第一行加set -x开启调试模式查看详细执行过程。2. 检查--log指定的日志文件如/root/ks-post.log。3. 确保命令在最小化安装环境中可用如curl可能未安装。制作的新ISO无法U盘启动未运行isohybrid命令或U盘写入方式不对。1. 务必执行sudo isohybrid --uefi your-iso.iso。2. 使用Rufus工具写入时选择“DD模式”而非“ISO模式”。3. 使用dd命令写入后运行sudo sync确保数据刷入。5.3 我的踩坑记录与心得卷标是“隐形杀手”我最开始几次失败八成都是卷标问题。genisoimage的-V参数和引导文件里的LABEL必须一字不差。建议用一个简单的英文单词避免特殊字符。密码加密的坑直接复制/etc/shadow里的密码哈希是不行的必须用openssl passwd -6或指定了-6参数的mkpasswd命令重新生成。-1MD5加密方式已不被新版Anaconda默认支持。%post脚本的执行环境它是在chroot到新系统后执行的但此时系统可能还没有完整的网络和用户会话。所以涉及网络的操作dnf install要确保网络已配置好涉及用户图形配置的操作必须像前面那样指定DBUS地址。测试测试再测试每做一次修改哪怕只是加一个软件包都务必在虚拟机里从头到尾测试一遍安装过程。自动化是为了省事但调试阶段必须不怕麻烦。制作一个稳定可靠的自动安装镜像前期投入的时间可能会是手动安装的几倍。但一旦成功其带来的批量部署效率提升和配置一致性保障价值是巨大的。对于运维团队来说这不仅是技术活更是将重复劳动转化为标准化资产的过程。当你看到几十台新电脑在无人值守的情况下齐刷刷地安装好系统并完成初始化配置时那种成就感绝对值得这番折腾。