Alibaba Cloud Linux 4 自建 Kickstart 安装树实施方案(iPXE 直连版)
阿里云官方对 Alibaba Cloud Linux 4(内核 6.6,Anaconda 38)不提供 ISO 安装镜像,仅发布两类镜像:
- ECS 云镜像(
.vhd,仅供阿里云控制台使用); - On-premise 本地镜像(
qcow2 / vhd,nocloud 类型,用于 KVM 等虚拟化环境直接导入,需配合seed.img初始化)。
因此"使用 ISO 安装"在官方渠道不成立。补位方案 就是本方案的思路:官方 YUM 仓库本身是完整、标准的 RPM 仓库结构(Packages/ + repodata/ 且带 comps 软件组元数据),可以把它镜像到内网作为 Anaconda 安装源(底层等价于安装树),再自行生成引导介质(PXE 或本地引导)与 Kickstart 文件,即可实现全无人值守安装。
版本:v2.0(iPXE 直连官方仓库) 适用环境:需批量安装 alinux4 且能访问公网(mirrors.aliyun.com)的内网 / 虚拟化环境
一、方案结论与变化说明
本版相对 v1.0(PXE + 内网仓库镜像)的核心变化:
| 维度 | v1.0(PXE 版) | v2.0(本版,iPXE 直连) |
|---|---|---|
| 引导协议 | PXE + TFTP | iPXE + HTTP |
| 安装源 | 内网镜像的 os/updates/plus 仓库 | 直接指向官方仓库 mirrors.aliyun.com/alinux/4/ |
| 内网同步 | 需镜像约 20 GB 仓库 | 不需要同步仓库,仅需托管约 100 MB 引导文件 |
| 部署服务器 | 内网安装服务器(仓库+TFTP+DHCP) | 任意一个可放引导文件与 ks 的 HTTP 位置(可选公网) |
| 前置网络 | 仅内网 | 目标机需能访问官方镜像站 |
技术可行性关键事实(本版已核实):
- 官方仓库可直接作为 Anaconda 安装源 :
https://mirrors.aliyun.com/alinux/4/os/x86_64/os/是标准 RPM 仓库(Packages/平铺 +repodata/,含 primary/filelists/group=alinux4-comps.xml)。Anaconda 38(alinux4 同代)支持"纯仓库 baseurl"安装源:Kickstart 中用url --url=指定含 repodata 的路径即可,无需 .treeinfo。官方仅不提供引导用的 vmlinuz/initrd 与 ISO,其余安装所需全部在仓库中。 - 安装器运行时已内置 initrd:现代 Anaconda(Fedora 28+/RHEL 9 同代)已将 stage2(install.img)合并进引导 initrd.img,并废弃依赖 .treeinfo 定位 install.img 的 inst.stage2 机制。因此只要 iPXE 从 HTTP 加载官方仓库派生的 vmlinuz + initrd.img,inst.repo 指向官方 URL 即可完成安装,不需要额外下载 install.img。
- 引导文件需一次性自建:官方仓库不含 vmlinuz/initrd.img,需用源内自带工具链 lorax-40.0 + lorax-templates-alinux-37.0 在 alinux4 环境生成一次(约 80--120 MB),之后长期复用,与仓库更新无关。
- iPXE 固件官方提供预编译件 :boot.ipxe.org 提供
undionly.kpxe(BIOS)、ipxe.efi/snponly.efi(UEFI),可做成启动 U 盘/ISO 直接引动,或嵌入脚本定制编译;iPXE 原生支持 HTTP,直接kernel http://...+initrd http://...加载。
方案仍包含一条"内网全量镜像"的可选离线路径(第八节),用于完全隔离公网的场景;默认主路径不需要同步仓库。
二、总体架构
┌────────────────────────────────────────────────────────────────────┐
│ 任意 HTTP 托管点(可内网小服务器,也可直接放公网对象存储,约 100 MB) │
│ ├─ /boot/vmlinuz lorax 一次性生成的安装内核 │
│ ├─ /boot/initrd.img lorax 一次性生成的安装器运行时(含 stage2) │
│ └─ /ks/test.ks Kickstart 应答文件 │
└──────────────────────────────┬─────────────────────────────────────┘
│ HTTP
目标机器 ▼
┌──────────────────────────────────────────────────────────────────┐
│ iPXE 固件(启动U盘/ISO 或 现有PXE链式加载) │
│ └─ #!ipxe 脚本:kernel/initrd 从上面 HTTP 点拉取 │
│ inst.repo=http://mirrors.aliyun.com/alinux/4/os/x86_64/os/ │
│ inst.ks=http://.../ks/test.ks │
│ Anaconda 启动 → 读取官方仓库元数据(repodata+comps)→ 自动安装 │
└──────────────────────────────────────────────────────────────────┘
前置条件:
- 目标机可访问公网
mirrors.aliyun.com(或走专线/代理):直连官方仓库的前提; - 需要一个可被目标机访问的 HTTP 位置存放引导文件与 ks(内网一台装有 nginx/httpd/python http.server 的小机器即可,也可用公网对象存储);
- 生成引导文件时准备一台 alinux4 环境(可用官方 nocloud qcow2 起的临时 VM 或 alinux4 容器);
- 目标机 BIOS 需支持从 U 盘/ISO(iPXE 介质)或网卡 PXE 启动。
三、步骤 1:一次性生成引导文件(vmlinuz / initrd.img)
在 alinux4 环境(以官方 nocloud qcow2 起的临时 VM 或同架构容器)中执行。先将 alinux4 三个仓库配置为可用源(可直连官方):
bash
cat > /etc/yum.repos.d/alinux4.repo <<'EOF'
[alinux4-os]
name=alinux4-os
baseurl=https://mirrors.aliyun.com/alinux/4/os/$basearch/os/
gpgcheck=0
enabled=1
[alinux4-updates]
name=alinux4-updates
baseurl=https://mirrors.aliyun.com/alinux/4/updates/$basearch/os/
gpgcheck=0
enabled=1
[alinux4-plus]
name=alinux4-plus
baseurl=https://mirrors.aliyun.com/alinux/4/plus/$basearch/os/
gpgcheck=0
enabled=1
EOF
dnf clean all && dnf makecache
dnf install -y lorax lorax-templates-alinux
生成引导文件(x86_64 示例;aarch64 在同架构环境执行同命令):
bash
mkdir -p /srv/alinux4-boot
lorax -p "Alibaba Cloud Linux" -v 4.0 -r 4.0 \
-s https://mirrors.aliyun.com/alinux/4/os/x86_64/os/ \
/srv/alinux4-boot/
ls -lh /srv/alinux4-boot/images/pxeboot/
# 期望输出 vmlinuz 与 initrd.img(约 80-120 MB)
将生成/srv/alinux4-boot目录复制到你的 HTTP 托管点:
bash
mkdir -p /var/www/html/alinux4-boot # 内网 HTTP 服务器示例(nginx)
cp /srv/alinux4-boot/images/pxeboot/{vmlinuz,initrd.img} /var/www/html/alinux4-boot/
说明:
- 该步骤只需执行一次;此后官方仓库更新不影响引导文件;
- 若不想自建 lorax,可临时起一台官方 nocloud qcow2 虚拟机,在其中
dnf install lorax lorax-templates-alinux后执行上述命令(镜像为 alinux4 环境,工具链版本匹配); %结尾的%end、EOF等仅为 shell 语法示例,按实际环境调整。
此处可参考https://blog.csdn.net/qq_34777982/article/details/166895498?sharetype=blogdetail\&sharerId=166895498\&sharerefer=PC\&sharesource=qq_34777982\&spm=1011.2480.3001.8118
四、步骤 2:准备 iPXE 固件
方式 A(推荐,无需任何 PXE/TFTP/DHCP 服务端):直接使用官方预编译 iPXE 启动介质。
bash
# 从官方获取(预编译 BIOS/UEFI 固件)
wget https://boot.ipxe.org/undionly.kpxe # BIOS 链式加载用(若走 PXE 链路)
wget https://boot.ipxe.org/ipxe.efi # UEFI 链式加载用
wget https://boot.ipxe.org/ipxe.iso # 启动 ISO(刻录/虚拟光驱)
wget https://boot.ipxe.org/ipxe.usb # 启动 U 盘镜像(dd 写入)
制作启动盘(U 盘示例):dd if=ipxe.usb of=/dev/sdX bs=4M conv=fsync(注意确认设备名,勿写错盘)。
启动后进入 iPXE 命令行,手动执行脚本(或直接输入):
dhcp
kernel http://<你的HTTP点>/alinux4-boot/images/pxeboot/vmlinuz inst.repo=http://<你的HTTP点>/alinux4-boot/ inst.ks=http://<你的HTTP点>/ks/test.ks
initrd http://<你的HTTP点>/alinux4-boot/images/pxeboot/initrd.img
boot
方式 B(批量/无人值守友好):把脚本嵌进 iPXE 固件,或用脚本 URL 一键链入。将 boot.ipxe 放到 HTTP 点:
bash
cat > /var/www/html/ipxe/boot.ipxe <<'EOF'
#!ipxe
dhcp
set base http://<你的HTTP点>
kernel ${base}/alinux4-boot/images/pxeboot/vmlinuz inst.repo=${base}/alinux4-boot/ inst.ks=${base}/ks/test.ks console=ttyS0,115200n8
initrd ${base}/alinux4-boot/images/pxeboot/initrd.img
boot
EOF
- 已有传统 PXE/DHCP 环境时,将 DHCP 的 bootfile 指到 iPXE 固件(BIOS 用
undionly.kpxe,UEFI 用ipxe.efi)链式加载,再执行脚本; - 纯 UEFI 机器如启用 Secure Boot,alinux4 引导未签入厂商 UEFI 数据库,需关闭 Secure Boot 或本地注册(见常见问题)。
五、步骤 3:Kickstart 文件(直连官方仓库版)
/var/www/html/ks/test.ks 完整示例:
kickstart
#version=RHEL9
# 基础配置
lang zh_CN.UTF-8
keyboard --vckeymap=cn --xlayouts='cn'
timezone Asia/Shanghai --utc
url --url="https://mirrors.aliyun.com/alinux/4/os/x86_64/os/"
repo --name="updates" --baseurl="https://mirrors.aliyun.com/alinux/4/updates/x86_64/os/"
repo --name="plus" --baseurl="https://mirrors.aliyun.com/alinux/4/plus/x86_64/os/"
# 认证与用户
# 密码哈希参考 /etc/shadow 条目,只取第 2 段 $y$...(yescrypt),切勿粘 root: 前缀及尾部字段
rootpw --iscrypted '$y$j9T$wugj3udv6Iz/jXSYZ9ybP.$C.dHhZdD42nLPSltMtdBmr/zDBHb6P22xKzEqWAGGl9'
# 网络
network --bootproto=dhcp --device=link --activate --hostname=al4
services --enabled=sshd,chronyd
# 系统
selinux --enforcing
firewall --enabled --service=ssh
authselect --useshadow --passalgo=yescrypt
skipx
# 磁盘与分区(BIOS + GPT + LVM;BIOS+GPT 必须建 biosboot 引导分区,否则 Anaconda 报 KS 不可用)
clearpart --all --initlabel
zerombr
part biosboot --fstype="biosboot" --size=1
part /boot --fstype="xfs" --size=2048
part pv.01 --fstype="lvmpv" --size=1 --grow
volgroup vg0 pv.01
logvol / --fstype="xfs" --name=root --vgname=vg0 --size=1 --grow
# 引导(BIOS 传统引导;不硬编码启动盘)
bootloader --location=mbr --append="console=ttyS0,115200n8 console=tty0"
reboot --eject
# ===== 软件包 =====
%packages
@^minimal-environment
@standard
@development
vim-enhanced
git
wget
curl
openssl
tar
jq
unzip
tzdata
openssh-server
openssh-clients
%end
# ===== 安装后定制 =====
%post
# 允许 root 通过 SSH 密码登录(RHEL9/AliLinux4 默认 prohibit-password)
sed -i 's/^#\?PermitRootLogin.*/PermitRootLogin yes/' /etc/ssh/sshd_config
grep -q '^PermitRootLogin yes' /etc/ssh/sshd_config || echo 'PermitRootLogin yes' >> /etc/ssh/sshd_config
sshd -t && systemctl restart sshd
# 备份系统默认源到 backup/(仅保留下面写入的 alinux4.repo 作为唯一源)
mkdir -p /etc/yum.repos.d/backup
find /etc/yum.repos.d -maxdepth 1 -name '*.repo' ! -name 'alinux4.repo' \
-exec mv -t /etc/yum.repos.d/backup {} +
# 装完直接用官方源(此步骤确保 repolist 可见且可用)
cat > /etc/yum.repos.d/alinux4.repo <<'EOF'
[alinux4-os]
name=Alibaba Cloud Linux 4 - os
baseurl=https://mirrors.aliyun.com/alinux/4/os/$basearch/os/
gpgcheck=1
gpgkey=https://mirrors.aliyun.com/alinux/4/RPM-GPG-KEY-ALINUX-4
enabled=1
[alinux4-updates]
name=Alibaba Cloud Linux 4 - updates
baseurl=https://mirrors.aliyun.com/alinux/4/updates/$basearch/os/
gpgcheck=1
gpgkey=https://mirrors.aliyun.com/alinux/4/RPM-GPG-KEY-ALINUX-4
enabled=1
[alinux4-plus]
name=Alibaba Cloud Linux 4 - plus
baseurl=https://mirrors.aliyun.com/alinux/4/plus/x86_64/os/
gpgcheck=1
gpgkey=https://mirrors.aliyun.com/alinux/4/RPM-GPG-KEY-ALINUX-4
enabled=1
EOF
# 导入官方 GPG 密钥(repo 已配 gpgkey 可由 dnf 自动导入,此处 rpm --import 双保险;-f 下载失败即报错)
curl -fsS -o /etc/pki/rpm-gpg/RPM-GPG-KEY-ALINUX-4 \
https://mirrors.aliyun.com/alinux/4/RPM-GPG-KEY-ALINUX-4
rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-ALINUX-4
dnf clean all && dnf makecache -q
echo "kickstart install done" > /root/ks-done
%end
要点说明:
- 直连官方源的核心就是
url --url与repo --baseurl直接填官方 URL,安装期软件包解析即为官方仓库最新状态; - 若要安装即含最新安全补丁,把
updates仓库放进%packages解析范围(示例已加 repo 行,安装时可用--excludepkgs控制); - 若网络出口需代理,可在内核 append 中加
proxy=http://代理地址或 ks 中network --bootproto=static ... --nameserver配合; rootpw --iscrypted的哈希只取/etc/shadow条目第 2 段$y$...(如$y$j9T$...,yescrypt),切勿把root:前缀和:20726:0:99999:7:::尾部字段一起粘贴,否则 crypt 校验必然失败;必须带--iscrypted,哈希用单引号 包裹以防$被 shell/PowerShell 展开截断,文件保持 LF 行尾、UTF-8 无 BOM;- root 密码密文推荐用 yescrypt(
$y$)方式生成 :在任意 Ubuntu/Debian 上sudo apt install -y whois后执行mkpasswd -m yescrypt '密码'(或在 AliLinux4/RHEL9 上用python3 -W ignore -c "import crypt; print(crypt.crypt('密码', crypt.mksalt(crypt.METHOD_YESCRYPT)))")。每次运行因随机盐不同输出也不同,属正常现象,任取一次结果的整串贴入rootpw --iscrypted均有效 ;生成后可自验python3 -c "import crypt; print(crypt.crypt('密码','生成的整串')=='生成的整串')"输出True即正确。 - 防火墙默认开启 且仅放行 ssh(
firewall --enabled --service=ssh);services行不可再写--disabled=firewalld(会覆盖启用);%post 已把PermitRootLogin置为yes(RHEL9 系默认 root 仅可密钥登录); - 本示例为 BIOS + GPT + LVM :
biosboot(1 MiB、无文件系统)是 BIOS+GPT 的硬性引导分区 ------x86_64 的 RHEL9 系强制 GPT,手动分区若不声明它,摘要页就会报"无法使用 Kickstart(未配置)"(Anaconda 自动分区模式会自动建它)。数据分区仅boot与/(/占满剩余空间),无 swap、无/data;UEFI 机型 改为part /boot/efi --fstype="efi" --size=512+bootloader --location=partition,并去掉biosboot(两者互斥)。 - 切勿硬编码磁盘名 (
--ondisk=sda/--drives=sda/--boot-drive=sda):目标机磁盘名不是sda(VM 常见vda/nvme0n1)时,Anaconda 摘要页"安装目的地"会显示"无法使用 Kickstart(未配置)",rootpw 等其余 ks 配置虽生效但分区需手动重配。本示例已改为自动选盘;若多盘环境必须锁定磁盘,先确认目标机实际磁盘名再写--ondisk=实际名。
六、步骤 4:安装与验证
-
校验 KS :
ksvalidator /var/www/html/ks/test.ks(无输出即通过,组名错误会在此报出)。 -
启动安装:
- iPXE 介质(U 盘/ISO)直接启动 → 脚本自动执行;
- 手动模式输入第五节脚本对应的三条命令(kernel/initrd/boot);
- 观察串口或进 Anaconda 图形/TUI 确认安装源加载成功。
- 检查点:
- iPXE 阶段:
dhcp有 IP、HTTP 拉取 vmlinuz/initrd 成功; - Anaconda 阶段:能解析官方仓库 repomd.xml,软件组正常加载;
- 日志:
journalctl -b | grep anaconda、/tmp/anaconda.log、/tmp/program.log。
- 装完验证:
bash
cat /etc/alinux-release 2>/dev/null; uname -r # 期望 6.6.x-x.alnx4
dnf repolist # 三个仓库均可访问
dnf -y update && reboot # 验证官方源全链路可用(可选)
ls /root/ks-done # %post 执行确认
df -h / && lsblk # 确认 boot 与 /(LVM)两个分区
firewall-cmd --list-services # 期望 ssh(防火墙已开启)
- 回滚:安装前对目标磁盘做快照/镜像备份,失败秒回。
七、网络与代理注意事项
- 目标机需要能直连公网 mirrors.aliyun.com (HTTP/HTTPS 443)。内网仅放行白名单时,把
mirrors.aliyun.com加白;走统一代理时用 iPXE 的set http_proxy/内核 appendproxy=参数; - 若个别机房访问官方镜像慢,可把
inst.repo指向阿里云内网版mirrors.cloud.aliyuncs.com(仅阿里云 ECS 内可达)或改走第七节离线镜像; - iPXE 的
kernel/initrd两文件体积约 100 MB,HTTP 传输比 TFTP 快一个数量级,批量并发无压力。
八、可选:内网全量镜像(完全离线场景)
仅当目标机不能访问公网时需要。此时把官方仓库镜像到内网(约 15-20 GB),并将 iPXE 脚本与 ks 中的 URL 全部改为内网地址:
bash
mkdir -p /var/www/alinux4
for repo in os updates plus; do
rsync -avz --delete \
"rsync://mirrors.aliyun.com/alinux/4/${repo}/x86_64/os/" \
"/var/www/alinux4/${repo}/x86_64/os/"
done
然后:
- ks 中
url --url="http://内网服务器/alinux4/os/x86_64/os/"、repo --name=updates/plus同步改内网; - %post 中 repo 文件 baseurl 改内网,gpgcheck 可先
gpgcheck=0(内网无外网拉密钥)或把RPM-GPG-KEY-ALINUX-4一起镜像到内网; - iPXE 脚本的
${base}指向内网服务器。
该路径即 v1.0 的 PXE+镜像方案,仅作离线兜底,不作为主路径。
九、常见问题与注意事项
| 现象 | 原因与处理 |
|---|---|
iPXE 下 kernel http://... 失败 |
HTTP 点未放行、防火墙拦 80/443;检查 URL 可达性(浏览器/curl);确认 IP 与代理设置 |
| 提示找不到安装源/无法读取 repomd.xml | inst.repo/url --url 必须指向含 repodata 的层级(.../os/x86_64/os/);确认出口能到 mirrors.aliyun.com |
| ks 中组名报错 | 组名必须与 alinux4 comps 一致:可用 @^minimal-environment、@core、@standard、@server-product、@development |
| Secure Boot 使 iPXE/UEFI 引导失败 | alinux4 安装内核未签入厂商 UEFI 数据库,关闭 Secure Boot 或本地注册密钥后重试 |
| 安装很慢/超时 | 官方库带宽受限时改用阿里云内网域名 mirrors.cloud.aliyuncs.com(仅 ECS 内)+HTTP,或走第七节离线镜像 |
| 安装后 dnf 报 GPG 失败 | 导入 RPM-GPG-KEY-ALINUX-4(%post 已含),确认不处于离线网络 |
| 反复装同一批机器想省带宽 | 引导文件仅 100 MB 可内网缓存;仓库包可在安装验证后用 dnf cache 或走镜像 |
| lorax 生成失败 | 确认在 alinux4 环境、三仓库可用、lorax-templates-alinux 已装;临时 VM 用官方 nocloud qcow2 最稳 |
十、附录
A. iPXE 脚本模板(可直接复用)
bash
#!ipxe
# 语法检查: 将本文件放入 HTTP 根目录, 任何机器 iPXE 后 chain http://<IP>/boot.ipxe
dhcp
set base http://192.168.10.10
kernel ${base}/alinux4-boot/vmlinuz \
inst.repo=https://mirrors.aliyun.com/alinux/4/os/x86_64/os/ \
inst.ks=${base}/ks/test.ks \
console=ttyS0,115200n8
initrd ${base}/alinux4-boot/initrd.img
boot
B. 目标机 repo 模板(安装后写入, 与 %post 一致;每个 repo 段含 gpgkey= 行可让 dnf 自动导入密钥,%post 另有 rpm --import 双保险)
ini
[alinux4-os]
name=Alibaba Cloud Linux 4 - os
baseurl=https://mirrors.aliyun.com/alinux/4/os/$basearch/os/
gpgcheck=1
gpgkey=https://mirrors.aliyun.com/alinux/4/RPM-GPG-KEY-ALINUX-4
enabled=1
[alinux4-updates]
name=Alibaba Cloud Linux 4 - updates
baseurl=https://mirrors.aliyun.com/alinux/4/updates/$basearch/os/
gpgcheck=1
gpgkey=https://mirrors.aliyun.com/alinux/4/RPM-GPG-KEY-ALINUX-4
enabled=1
[alinux4-plus]
name=Alibaba Cloud Linux 4 - plus
baseurl=https://mirrors.aliyun.com/alinux/4/plus/x86_64/os/
gpgcheck=1
gpgkey=https://mirrors.aliyun.com/alinux/4/RPM-GPG-KEY-ALINUX-4
enabled=1
C. 关键资源清单
- 官方仓库根:https://mirrors.aliyun.com/alinux/4/
- os 仓库:https://mirrors.aliyun.com/alinux/4/os/x86_64/os/
- updates 仓库:https://mirrors.aliyun.com/alinux/4/updates/x86_64/os/
- plus 仓库:https://mirrors.aliyun.com/alinux/4/plus/x86_64/os/
- GPG 密钥:https://mirrors.aliyun.com/alinux/4/RPM-GPG-KEY-ALINUX-4
- iPXE 官方固件:https://boot.ipxe.org/(undionly.kpxe / ipxe.efi / ipxe.iso / ipxe.usb)
- 官方帮助文档(on-premise 镜像用法,含 2/3 版本流程):https://help.aliyun.com/document_detail/215519.html
D. 架构扩展
aarch64 目标机:lorax 在 aarch64 的 alinux4 环境生成对应架构引导文件;官方仓库 URL 中 x86_64 替换为 aarch64;ks 无需其他改动。
E. 与 v1.0(PXE 版)差异速览
| 项 | v1.0 | v2.0 |
|---|---|---|
| 引导 | PXE + TFTP + pxelinux.cfg | iPXE + HTTP 脚本 |
| 安装源 | 内网镜像仓库 | 官方仓库 URL 直连 |
| 内网同步 | 必需(约 20 GB) | 不需要(可选离线才用) |
| 引导文件 | 由内网源生成 | lorax 一次性生成,托管任意 HTTP 点 |
| 适用 | 全离线内网 | 可访问公网;离线场景走第八节兜底 |