简介面向需要搭建或复现早期企业级 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|文件名|字节数|文件哈希|hAICH根哈希|/。中间那串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.isostat那一行是硬门槛后面的哈希只是二次确认。openssl dgst -md4在 1.0.x 系列上开箱可用如果你在更新的发行版上跑这条命令报unsupported那是算法被移到了 legacy provider加-provider legacy -provider default即可。sha256 值不一定要跟某个官方值对上——老介质的官方校验页大多已经下线了更现实的做法是自己算一次写进归档目录的 README下次有人问这份是不是好的直接比这一串。我一般会把这个校验做成一个两行的小脚本丢在 ISO 同目录文件名就叫verify.sh。半年后回来找这份介质的人往往不是你能让他少问一句是一句。2.2 挂载 ISO用包数量反推完整性字节数对上只说明传输没断不代表内部结构完整。真正靠谱的判断是挂载后数包完整 DVD 的Packages目录下应该是几千个 rpmrepodata目录里有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/dvdloop选项让内核自动建回环设备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] nameLocal DVD Base baseurlfile:///mnt/dvd enabled1 gpgcheck1 gpgkeyfile:///etc/pki/rpm-gpg/RPM-GPG-KEY-* cost100baseurl用file://协议指向挂载点三个斜杠不能少——两个斜杠会被解析成主机名。gpgcheck1建议开着DVD 里自带公钥RPM-GPG-KEY-*用通配符是为了兼容不同版本密钥文件名。cost100是个容易被忽略的参数当机器上同时存在多个源时yum 会优先选 cost 低的把本地源设成低值能让它优先命中减少无谓的网络超时等待。配完先清缓存再验证顺序不能反yum clean all yum repolist all yum --disablerepo* --enablerepodvd-base list available | head -20repolist 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 DEVICEeth0 BOOTPROTOnone ONBOOTyes IPADDR10.0.0.21 NETMASK255.255.255.0 GATEWAY10.0.0.1 DNS110.0.0.2 TYPEEthernet EOF # 4. 重启网络别用 systemctl6.4 没有 service network restartBOOTPROTOnone表示静态别写成static6.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.*/SELINUXpermissive/ /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 | head4. 离线环境补齐工具链自建仓库与依赖闭环真正让人头疼的不是装系统是装完之后要在这个封闭环境里加软件。6.4 自带的包版本偏老编译新一点的组件就会撞墙gcc 4.4.7 不认 C11Python 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* --enablerepodvd-base install -y createrepo createrepo -v /data/repo/extra # 之后每次加新包只更新变化的元数据别全量重建 createrepo --update /data/repo/extracreaterepo会在目标目录下生成repodata/结构和 DVD 里一模一样所以 yum 认它。--update是必须养成的习惯全量重建在包多的时候要跑几分钟增量更新几秒就完。另外注意权限/data/repo如果给 ftp 或 http 服务共享目录必须有orx否则客户端拿不到元数据报的还是 404很容易误判成路径写错。4.2 多源共存时的优先级与 GPG 处理本地源、自建源、内网源同时存在时同名包版本不一致会打架。6.4 需要单独装yum-plugin-priorities才有priority参数# /etc/yum.repos.d/local-extra.repo [local-extra] nameLocal Extra Packages baseurlfile:///data/repo/extra enabled1 gpgcheck0 priority10priority数值越小优先级越高DVD 源设 99、自建源设 10这样自建源里的新版包会覆盖 DVD 里的旧版。gpgcheck0只在自己签的包上开公开来源的包一律保持 1。如果遇到Public key for xxx.rpm is not installed说明 RPM 的签名公钥没导入rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-* rpm -qa gpg-pubkey* | headrpm --import只影响之后的校验已经装上的包不会回溯检查所以导入动作要放在装包之前做。4.3 编译环境的现实约束gcc 4.4 与 Python 2.66.4 的默认工具链是 gcc 4.4.7 Python 2.6.6这个组合决定了你能编译什么、不能编译什么。C11 的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和eth1service 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* --enablerepodvd-base repolist能通就说明问题在别的源上。处理方式有两种把无用 repo 文件的enabled改成 0或者直接移出目录备份。不建议删留着以后可能要参考。另外 6.4 的 yum 默认超时比较长临时排查时可以加--setopttimeout5缩短等待。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 pkgyum 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 --servicessh network --deviceeth0 --bootprotostatic --ip10.0.0.21 --netmask255.255.255.0 \ --gateway10.0.0.1 --nameserver10.0.0.2 --hostnamenode01 bootloader --locationmbr --driveordersda zerombr clearpart --all --initlabel part /boot --fstypeext4 --size500 part swap --size4096 part pv.01 --grow --size1 volgroup vg0 pv.01 logvol / --fstypeext4 --namelv_root --vgnamevg0 --size20480 logvol /var --fstypeext4 --namelv_var --vgnamevg0 --size10240 reboot %packages core %endzerombr和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出问题先翻那一页比在聊天记录里翻半年前的链接靠谱得多。希望帮到你。本文还有配套的精品资源点击获取