Alibaba Cloud Linux 4 IPXE全自动安装(直连官方源)——筑梦之路

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 位置(可选公网)
前置网络 仅内网 目标机需能访问官方镜像站

技术可行性关键事实(本版已核实):

  1. 官方仓库可直接作为 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,其余安装所需全部在仓库中。
  2. 安装器运行时已内置 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。
  3. 引导文件需一次性自建:官方仓库不含 vmlinuz/initrd.img,需用源内自带工具链 lorax-40.0 + lorax-templates-alinux-37.0 在 alinux4 环境生成一次(约 80--120 MB),之后长期复用,与仓库更新无关。
  4. 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/

说明:

四、步骤 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:安装与验证

  1. 校验 KS :ksvalidator /var/www/html/ks/test.ks(无输出即通过,组名错误会在此报出)。

  2. 启动安装:

  • iPXE 介质(U 盘/ISO)直接启动 → 脚本自动执行;
  • 手动模式输入第五节脚本对应的三条命令(kernel/initrd/boot);
  • 观察串口或进 Anaconda 图形/TUI 确认安装源加载成功。
  1. 检查点:
  • iPXE 阶段:dhcp 有 IP、HTTP 拉取 vmlinuz/initrd 成功;
  • Anaconda 阶段:能解析官方仓库 repomd.xml,软件组正常加载;
  • 日志:journalctl -b | grep anaconda、/tmp/anaconda.log、/tmp/program.log。
  1. 装完验证:
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(防火墙已开启)
  1. 回滚:安装前对目标磁盘做快照/镜像备份,失败秒回。

七、网络与代理注意事项

  • 目标机需要能直连公网 mirrors.aliyun.com (HTTP/HTTPS 443)。内网仅放行白名单时,把 mirrors.aliyun.com 加白;走统一代理时用 iPXE 的 set http_proxy/内核 append proxy= 参数;
  • 若个别机房访问官方镜像慢,可把 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. 关键资源清单

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 点
适用 全离线内网 可访问公网;离线场景走第八节兜底
相关推荐
encoderlee1 小时前
ubuntu server 如何播放视频显示网页
linux·ubuntu·音视频·树莓派·ubuntu server·arm嵌入式
云计算练习生1 小时前
什么是 Linux?从 Unix 到开源生态的完整脉络
linux·开源·操作系统·unix
Pointer Pursuit1 小时前
make / Makefile
linux·运维·服务器
ZhangJun951 小时前
Linux常用命令笔记,中高级运维高频指令,并附上vim常见操作
linux·运维·centos·云计算·vim
逐流人2 小时前
Ceph对象存储与文件系统存储管理:从RADOS网关、S3与Swift到CephFS快照同步
linux·运维·ceph·云原生·云计算·swift·rados
分布式存储与RustFS2 小时前
日志目录的预算是 2 GiB:轮转、保留和压缩这三件事
运维·云原生·开源·对象存储·分布式存储·s3·性能基准
wdfk_prog2 小时前
Wi-Fi Direct 教程 05:control socket 与 eloop——P2P_FIND 怎样进入 wpa_supplicant 命令解析器
运维·服务器·后端·网络协议·ubuntu·p2p·wifi-direct
Golden_Chen2 小时前
在 Ubuntu 上搭建 FTP 服务器
linux·运维·服务器
ZMacros2 小时前
Live-build方法构建debian和ubuntu
linux·ubuntu·debian