ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

RHEL 6.4 ISO校验、本地yum源与Kickstart离线部署指南

RHEL 6.4 ISO校验、本地yum源与Kickstart离线部署指南

简介:面向需要搭建或复现早期企业级 Linux 实验环境的运维学习者与系统管理员,这份文档整理并提供了 Red Hat Enterprise Linux Server 6.4 的获取入口,适合用于虚拟机安装、基础命令练习、服务部署实验及老系统兼容性测试等场景。压缩包内共 1 个 docx 文件,整体约 10KB,以轻量文档形式集中记录下载所需信息,便于快速查阅和转存,不包含镜像文件本身。内容围绕 RHEL 6.4 x86_64 DVD 安装介质展开,可用于搭建本地实验机、验证软件兼容性,或为旧版教材与课程环境复现提供线索。当前已有 1404 人浏览学习,适合对 Linux 入门、服务器运维及历史版本环境有需求的学习者按需参考。

1. RHEL Server 6.4 镜像:一份还在被翻出来的老介质

RHEL Server 6.4 下载这件事,隔三差五还会有人问起。触发场景很集中:某条产线上的工控机还锁在 2.6.32 内核上,配套采集卡的驱动只提供 6.x 的 rpm;某实验室要复现一份多年前的测试报告,环境必须一比一还原;还有做兼容性验证的,要拿老介质完整走一遍安装流程。这类需求跟"上新系统"完全是两码事,你要的是一份完整 DVD 介质,不是最小引导镜像。3.46 GiB 的 DVD 里装着几千个 rpm 包和完整的 repodata,离线装完就能直接当本地源用,这一点 boot.iso 给不了。适合维护遗留系统、做历史环境复现的人,新项目别往这上面凑。

2. 拿到 ISO 先别急着装:三步把介质确认干净

老介质最大的问题是"看起来能用"。文件名对、大小差不多、双击能挂载,很多人就直接拖进虚拟机开装了,结果装到 60% 弹一个包解压失败,前面半小时全白费。介质校验这一步省不得,尤其是从归档盘、旧硬盘、别人转发链接里拿到的副本。

2.1 先对齐字节数,再谈哈希比对

ed2k 链接的结构其实是自解释的:ed2k://|file|文件名|字节数|文件哈希|h=AICH根哈希|/。中间那串3720347648就是文件的精确字节数,等于 3.46 GiB,刚好卡在单层 DVD5 的容量线内。第一道关不是算哈希,而是看字节数对不对——差一个字节都不用往下走,那说明文件被截断了,或者被什么工具"修复"过。

# 1. 字节数必须精确等于链接里那串数字,多一位少一位都不行 stat -c '%s %n' /data/iso/rhel-server-6.4-x86_64-dvd.iso # 2. md4 对齐 ed2k 体系里的文件哈希,适合和源端给出的值比对 openssl dgst -md4 /data/iso/rhel-server-6.4-x86_64-dvd.iso # 3. sha256 是给长期归档用的,跟谁比对都行,自己算一次存着 sha256sum /data/iso/rhel-server-6.4-x86_64-dvd.iso

stat那一行是硬门槛,后面的哈希只是二次确认。openssl dgst -md4在 1.0.x 系列上开箱可用,如果你在更新的发行版上跑这条命令报unsupported,那是算法被移到了 legacy provider,加-provider legacy -provider default即可。sha256 值不一定要跟某个"官方值"对上——老介质的官方校验页大多已经下线了,更现实的做法是自己算一次,写进归档目录的 README,下次有人问"这份是不是好的",直接比这一串。

我一般会把这个校验做成一个两行的小脚本丢在 ISO 同目录,文件名就叫verify.sh。半年后回来找这份介质的人往往不是你,能让他少问一句是一句。

2.2 挂载 ISO,用包数量反推完整性

字节数对上只说明传输没断,不代表内部结构完整。真正靠谱的判断是挂载后数包:完整 DVD 的Packages目录下应该是几千个 rpm,repodata目录里有primary.xml.gz、filelists.xml.gz、other.xml.gz三件套外加 repomd.xml。少任何一个,这个 ISO 就只能当废盘。

#!/bin/bash ISO=/data/iso/rhel-server-6.4-x86_64-dvd.iso MNT=/mnt/dvd mkdir -p "$MNT" mount -o loop,ro "$ISO" "$MNT" || { echo "挂载失败,介质可能损坏"; exit 1; } # 包数量:完整 DVD 通常是几千个,明显偏少说明介质被裁剪过 echo "rpm 包数量: $(find "$MNT/Packages" -maxdepth 1 -name '*.rpm' | wc -l)" # repodata 四件套,缺一个 yum 就用不了 ls -1 "$MNT/repodata/" | grep -E 'repomd.xml|primary.xml.gz|filelists.xml.gz|other.xml.gz' # 顺手确认引导文件在不在,决定这份 ISO 能不能独立装机 ls -1 "$MNT/images/pxeboot/vmlinuz" "$MNT/isolinux/vmlinuz" 2>/dev/null

这里的逻辑是"结构决定可用性"。mount -o loop,ro里的ro不是可选项,老内核读 ISO9660 时对写挂载的处理并不友好,强制只读能避免一堆莫名其妙的 inode 报错。find -maxdepth 1限定只在顶层统计,防止把子目录里重复的包算进去。最后那段vmlinuz检查很关键:有的归档副本是从 DVD 里"抠"出来的裁剪版,包是全的但没有引导镜像,装不了机,只能当 yum 源用,用途差一半。

校验通过后就该把挂载关系固化下来,别每次手动敲 mount。写进/etc/fstab更省事:

echo "/data/iso/rhel-server-6.4-x86_64-dvd.iso /mnt/dvd iso9660 loop,ro 0 0" >> /etc/fstab mount -a && df -h /mnt/dvd

loop选项让内核自动建回环设备,ro保持只读,0 0表示不参与 dump 和 fsck。这一步做完,重启后介质依然在,后面配源就不用再操心挂载的事了。

2.3 把光驱变成常驻本地源

介质确认没问题,接下来就是让 yum 认它。6.4 的 yum 还是 Python 2.6 写的那个版本,配置文件放/etc/yum.repos.d/下,一条 repo 段落就够。

# /etc/yum.repos.d/local-dvd.repo [dvd-base] name=Local DVD Base baseurl=file:///mnt/dvd enabled=1 gpgcheck=1 gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-* cost=100

baseurl用file://协议指向挂载点,三个斜杠不能少——两个斜杠会被解析成主机名。gpgcheck=1建议开着,DVD 里自带公钥,RPM-GPG-KEY-*用通配符是为了兼容不同版本密钥文件名。cost=100是个容易被忽略的参数:当机器上同时存在多个源时,yum 会优先选 cost 低的,把本地源设成低值能让它优先命中,减少无谓的网络超时等待。

配完先清缓存再验证,顺序不能反:

yum clean all yum repolist all yum --disablerepo='*' --enablerepo=dvd-base list available | head -20

repolist all能看到dvd-base状态为 enabled 且包数量正常,说明源通了。第三条命令临时禁用所有其他源,只从 DVD 取列表,这一步是排查"到底是本地源坏了还是网络源拖慢了"的分水岭。如果这里能出包,但正常yum install还是卡住,问题一定在别的 repo 上,不在介质。

3. 装机参数怎么定:分区、网卡与服务的取舍

6.4 的安装器是 Anaconda 的老版本,界面和 7/8 差得很远,很多在 newer 版本上形成的手感在这台机器上是错的。这一章把三个最容易返工的地方说清楚:分区怎么切、网卡为什么突然变名、哪些服务必须关。

3.1 分区与文件系统:ext4 是当下最稳的选择

6.4 支持 ext4,也还留着 ext3。除非有明确的兼容要求,否则一律上 ext4,日志性能和目录规模都更好。LVM 建议用,尤其是做测试环境,后期扩/var不用停机。

挂载点建议大小文件系统说明
/boot500 MBext4引导文件,独立分区便于恢复
swap内存 ≤8G 时取 2 倍,>8G 取等量swap保留休眠能力的场景必须给足
/20 GB 起ext4 on LVM只放系统,业务数据另挂
/var10~20 GBext4 on LVM日志和 yum 缓存都在这,最容易撑爆
/home按需ext4 on LVM多人共用的测试机建议独立

/var单独切出来是我踩过坑之后的习惯:老版本 yum 的缓存清理策略比较粗,一次yum makecache加上几个大包,几个 G 就没了;如果/var和/在一起,根分区满了之后连login都会失败,救援起来非常难受。

分区表类型上,6.4 的引导器对 GPT 支持有限,除非磁盘超过 2TB,一律用 MBR。这一点跟后来"默认 GPT"的习惯正好相反,装的时候别下意识选错。

3.2 网卡命名:eth0 是默认,克隆机器记得清 udev 规则

6.4 用的是老的biosdevname体系,网卡名默认就是eth0,不会出现ens33这种 predictable name。这是好事,但也带来一个经典翻车点:虚拟机克隆之后,新机器网卡不通,ifconfig -a里只有eth1,配置文件却还是eth0。

原因在/etc/udev/rules.d/70-persistent-net.rules——它把 MAC 地址和网卡名绑定死了,克隆机带着旧 MAC 的记录启动,新网卡只能顺延成eth1。解决办法是删规则、改配置、重启网络:

# 1. 删掉绑定旧 MAC 的持久化规则 rm -f /etc/udev/rules.d/70-persistent-net.rules # 2. 确认实际网卡名,把 ifcfg 文件名改成一致 ip link show | grep -E '^[0-9]+: eth' # 3. 静态地址示例,/etc/sysconfig/network-scripts/ifcfg-eth0 cat > /etc/sysconfig/network-scripts/ifcfg-eth0 <<'EOF' DEVICE=eth0 BOOTPROTO=none ONBOOT=yes IPADDR=10.0.0.21 NETMASK=255.255.255.0 GATEWAY=10.0.0.1 DNS1=10.0.0.2 TYPE=Ethernet EOF # 4. 重启网络,别用 systemctl,6.4 没有 service network restart

BOOTPROTO=none表示静态,别写成static,6.x 的脚本对这个值处理得比较随意,none最稳。service network restart是老版本的标准动作,systemctl在 6.4 上根本不存在,从 7 迁过来的人第一次敲会愣一下。删规则这一步建议做成模板机的收尾动作,克隆前就先清掉,比事后救火省事。

3.3 服务裁剪与 SELinux:把开关拨到可预期

最小化安装出来的 6.4 依然会带一堆用不上的服务,chkconfig --list一屏拉不完。测试环境里最该关的是ip6tables、bluetooth、cups、NetworkManager(用传统 network 脚本管理时它只会添乱)。

# 关掉与测试环境无关的服务,chkconfig 是老版本的开关 for svc in ip6tables bluetooth cups avahi-daemon; do chkconfig "$svc" off 2>/dev/null done # SELinux 先降到 permissive,观察日志再决定是否回到 enforcing sed -i 's/^SELINUX=.*/SELINUX=permissive/' /etc/selinux/config getenforce

把 SELinux 切成 permissive 不是为了"关掉图省事",而是让策略违规只记录不阻断,/var/log/audit/audit.log里能看到完整拒绝记录。等应用跑顺了,用audit2allow生成策略再回 enforcing,才算真正收口。直接disabled会在文件系统上留下标记,想再开回来需要重新打标签,那个过程比重装好不了多少。

防火墙这边,6.4 用的是 iptables 而非 firewalld,规则改完必须service iptables save才会写进/etc/sysconfig/iptables,否则重启即丢。这是新手最容易漏的一步:

iptables -I INPUT -p tcp --dport 22 -j ACCEPT service iptables save service iptables status | head

4. 离线环境补齐工具链:自建仓库与依赖闭环

真正让人头疼的不是装系统,是装完之后要在这个封闭环境里加软件。6.4 自带的包版本偏老,编译新一点的组件就会撞墙:gcc 4.4.7 不认 C++11,Python 2.6 缺一堆语法,OpenSSL 1.0.1e 握手时对端直接拒。这一章讲怎么用 DVD 加上自建仓库把依赖闭环做出来。

4.1 用 createrepo 把散装 rpm 变成可用源

现场拿到的补充包往往是散装的,几十个 rpm 堆在一个目录里,yum install根本不认。得先建索引:

# 把补充包集中放到 /data/repo/extra mkdir -p /data/repo/extra cp /media/usb/*.rpm /data/repo/extra/ # 建索引,6.4 上 createrepo 需要 python-deltarpm,从 DVD 里装 yum --disablerepo='*' --enablerepo=dvd-base install -y createrepo createrepo -v /data/repo/extra # 之后每次加新包,只更新变化的元数据,别全量重建 createrepo --update /data/repo/extra

createrepo会在目标目录下生成repodata/,结构和 DVD 里一模一样,所以 yum 认它。--update是必须养成的习惯:全量重建在包多的时候要跑几分钟,增量更新几秒就完。另外注意权限,/data/repo如果给 ftp 或 http 服务共享,目录必须有o+rx,否则客户端拿不到元数据,报的还是 404,很容易误判成路径写错。

4.2 多源共存时的优先级与 GPG 处理

本地源、自建源、内网源同时存在时,同名包版本不一致会打架。6.4 需要单独装yum-plugin-priorities才有priority参数:

# /etc/yum.repos.d/local-extra.repo [local-extra] name=Local Extra Packages baseurl=file:///data/repo/extra enabled=1 gpgcheck=0 priority=10

priority数值越小优先级越高,DVD 源设 99、自建源设 10,这样自建源里的新版包会覆盖 DVD 里的旧版。gpgcheck=0只在自己签的包上开,公开来源的包一律保持 1。如果遇到Public key for xxx.rpm is not installed,说明 RPM 的签名公钥没导入:

rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-* rpm -qa gpg-pubkey* | head

rpm --import只影响之后的校验,已经装上的包不会回溯检查,所以导入动作要放在装包之前做。

4.3 编译环境的现实约束:gcc 4.4 与 Python 2.6

6.4 的默认工具链是 gcc 4.4.7 + Python 2.6.6,这个组合决定了你能编译什么、不能编译什么。C++11 的auto、nullptr、lambda 全部不支持,Python 侧的字典推导式、str.format的部分高级用法也会报语法错。绕过的方式有两条:一是找该组件更老的发布版本,二是通过 SCL 渠道装一套并行工具链,用scl enable临时切换环境,不动系统默认版本。

# 编译前先确认工具链版本,别假设 gcc --version | head -1 python -V # 小项目直接用系统 gcc,加上这两个参数能少踩一些坑 gcc -O2 -Wall -fPIC -o demo demo.c -I/usr/local/include -L/usr/local/lib -lssl -lcrypto # 编译产物依赖哪些库,用 ldd 一眼看清,缺什么补什么 ldd ./demo | grep 'not found'

-fPIC在 6.4 的 x86_64 上默认就开,显式写出来是为了让脚本在别的架构上也能用。ldd输出里出现not found是最常见的运行时故障来源,编译通过了不等于能跑,这一步别跳。

OpenSSL 那关更难受。1.0.1e 不支持 TLS 1.2 的部分扩展套件,某些内网服务端会直接拒绝握手,日志里表现为handshake failure。可行的做法是在应用层显式限定协议版本,或者单独编译一份新版 OpenSSL 装到/usr/local/openssl下,通过LD_LIBRARY_PATH指向它,不要覆盖系统自带的那份——系统里ssh、yum都链着它,覆盖一次可能连登录都进不去。

5. 避坑:六个让人返工的现场问题

老系统的坑有个共同特征:报错信息指向的地方,往往不是真正的故障点。下面六条都是我在真实环境里返工过的,按"现象 → 原因 → 解决"记下来,遇到时照着对。

5.1 安装到一半报 "The package could not be opened"

现象:进度条走到 60%~80% 突然停下,弹窗提示某个 rpm 无法打开,重试几次都卡在同一个包。

原因:ISO 传输过程中损坏,或者用工具"解压"过一遍再重新打包。字节数可能对得上,但内部某个 rpm 的校验和已经变了。

解决:回到第 2 章重新做完整性校验,重点看Packages目录里的包数量。确认损坏就重新取介质,不要试图跳过那个包——安装器不会让你跳过基础包。另外如果是 U 盘安装,检查写盘方式,必须是dd整盘写入,把 ISO 解压进 U 盘再启动的做法在 6.4 上基本都失败。

5.2 克隆虚拟机后网络起不来,只剩 eth1

现象:模板机一切正常,克隆出来的新机器ifconfig只有lo和eth1,service network restart报设备不存在。

原因:70-persistent-net.rules里绑着模板机的 MAC,新网卡只能拿到下一个编号。

解决:删规则文件、把ifcfg-eth0里的HWADDR行去掉(如果有)、重启。治本的办法是在做模板时就清空这个文件,克隆前执行一次rm -f /etc/udev/rules.d/70-persistent-net.rules并关机,之后所有克隆机都是干净的eth0。

5.3 yum 报 "Cannot retrieve repository metadata"

现象:yum repolist卡住几十秒后报错,提示某个 repo 的repomd.xml取不到,错误码 404 或超时。

原因:/etc/yum.repos.d/下还留着出厂自带的远端源配置,地址早就失效了。本地 DVD 源其实是好的,但 yum 是并行请求所有源的,一个超时拖慢整个流程。

解决:先把失效源禁掉再看。yum --disablerepo='*' --enablerepo=dvd-base repolist能通,就说明问题在别的源上。处理方式有两种:把无用 repo 文件的enabled改成 0,或者直接移出目录备份。不建议删,留着以后可能要参考。另外 6.4 的 yum 默认超时比较长,临时排查时可以加--setopt=timeout=5缩短等待。

5.4 系统时间偏差导致 rpm 签名校验失败

现象:yum install报Package does not verify: no digest或者提示签名过期,但同样的包在别的机器上装得好好的。

原因:虚拟机从快照恢复后时钟停在旧时间点,或者宿主机休眠导致时间漂移。RPM 签名带有效期,时间跑到签名有效期之外就会判失败。

解决:先对时再装包。date看一下当前时间,ntpdate或者date -s校正后重试。

date ntpdate 10.0.0.2 || date -s "$(date)" yum clean expire-cache yum install -y <pkg>

yum clean expire-cache是关键,光对时不生效,旧的元数据缓存里还留着失败标记。

5.5 图形安装器起不来,屏幕停在字符界面

现象:从 ISO 引导后没有进入图形安装向导,直接掉到boot:提示或者报No video mode。

原因:虚拟机显存给得太小,或者物理机的显卡不在老内核的支持列表里。6.4 的内核 2.6.32 对新的显卡驱动支持很差。

解决:不要硬碰图形界面,直接在引导菜单加text参数走文本安装,或者用vnc参数把安装界面导到另一台机器上看。文本安装的分区步骤是逐项交互的,虽然慢但结果完全一样。装完之后如果需要图形环境,再补@X Window System包组。

5.6 单独扩 /var 之后系统起不来

现象:用 LVM 给/var扩容或者新建独立 LV,改完 fstab 重启卡在Welcome to emergency shell。

原因:/var被独立挂载之后,/var/lib/rpm里的数据库在挂载前不可见,而 SELinux 打标签和部分服务启动依赖它,顺序一错就崩。

解决:独立/var必须在装机时分好,不要事后拆。已经拆坏的话,从救援模式进去把 fstab 里那一行注释掉,先让系统起来,再评估是否真的需要独立分区。这条属于"能不做就别做"的类型,后悔药成本太高。

6. 做成可复现模板:Kickstart 与快照回滚

一次装好不算本事,能反复装出同样的机器才算。6.4 的 Kickstart 语法和后来的版本有差异,但核心段落就那几行,写一次能用很多年。

6.1 ks.cfg 的关键段落

install cdrom lang en_US.UTF-8 keyboard us timezone Asia/Shanghai rootpw --iscrypted $6$replace_with_real_hash selinux --permissive firewall --enabled --service=ssh network --device=eth0 --bootproto=static --ip=10.0.0.21 --netmask=255.255.255.0 \ --gateway=10.0.0.1 --nameserver=10.0.0.2 --hostname=node01 bootloader --location=mbr --driveorder=sda zerombr clearpart --all --initlabel part /boot --fstype=ext4 --size=500 part swap --size=4096 part pv.01 --grow --size=1 volgroup vg0 pv.01 logvol / --fstype=ext4 --name=lv_root --vgname=vg0 --size=20480 logvol /var --fstype=ext4 --name=lv_var --vgname=vg0 --size=10240 reboot %packages @core %end

zerombr和clearpart --initlabel两行必须在分区段之前,作用是清掉磁盘上残留的引导记录和分区表标签,否则复用旧盘时会直接报错退出。--iscrypted后面必须是真正的 crypt 哈希,不要图省事写明文密码配--plaintext,那个参数在 6.4 上会让安装器行为不可预期。

%packages里的@core是组名,最小化安装够了。需要额外组的话必须和 DVD 里的 comps 数据完全对上,写错组名整个 ks 就中断,而且报错信息只说不认识的组,不告诉你哪个是对的——调试时先用yum grouplist在已装好的机器上看一遍名单。

6.2 一次校验,胜过三次重装

ks 跑完之后别急着交给别人。我的习惯是装完立刻做三件事:yum repolist确认源可用、ip addr确认网卡是 eth0 且地址对、getenforce确认 SELinux 状态符合预期。这三条都能过,才给模板机打快照。

快照的命名也值得讲究,别用什么snapshot1、test。我一般写成base-6.4-ks-<日期>-<用途>,回滚的时候能一眼看出这份快照是基于哪版 ks、什么时候做的。老系统的环境一旦漂移,排查成本比新系统高得多,多写几个字不亏。

从那以后我每归档一份老介质,都会把 sha256 值、挂载后的包数量、对应的 ks 文件三样东西写进同一个 README,出问题先翻那一页,比在聊天记录里翻半年前的链接靠谱得多。希望帮到你。

本文还有配套的精品资源,点击获取

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进