简介:面向仍在维护老版本系统的运维工程师与 Linux 初学者,这份文档汇总了红帽企业 Linux Server 6.4(x86_64 DVD 版)的 ed2k 下载链接,可直接导入迅雷等 P2P 客户端获取完整安装镜像,省去在各类镜像站反复检索、碰上失效入口的麻烦。文档内共有 1 个 docx 文件,体积约 10KB,正文记录镜像的 ed2k 地址与文件校验串;对应 ISO 约 3.46GB,属于完整 DVD 安装介质,可用于虚拟机实验环境搭建、老旧业务系统兼容性验证以及课堂教学演示。已有 1404 人学习下载,说明该版本在存量系统维护场景中仍有稳定需求。对于需要复现 RHEL 6 系操作习惯、验证软件包依赖,或准备旧版认证考点的读者,通过该链接获取原始安装介质后,即可对照官方文档完成分区规划、软件包组选择与基础服务配置等练习。
1. 从一条 ed2k 链接说起:这张 3.46 GiB 的盘值不值得下
手里只有一条ed2k://开头的字符串,长度 3720347648 字节,文件名指向 rhel-server-6.4-x86_64-dvd.iso——这就是一张完整的 RHEL Server 6.4 x86_64 DVD 安装镜像的下载描述。它不是种子、不是分卷包,而是一个可以断点续传、边下边校的完整光盘映像,落盘后挂载就能看到 isolinux、Packages、repodata 这些标准结构。
真正会去找这张 Linux 盘的人,场景往往很具体:接手了一批跑在老硬件上的遗留业务,需要按原版本重装;做驱动、中间件的兼容性验证,必须复现当年的基线;或者教学实验里要一个内核 2.6.32 时代的真实样本。它已经过了常规维护周期,不适合往上搭新业务,这点先讲清楚。下面按「验镜像 → 做介质 → 定分区 → 避坑 → 变常驻源」的顺序把这条链接走完。
2. 镜像验明正身:ed2k 哈希、SHA256 与 ISO 内部结构
从 ed2k 拿到的东西,最大的风险不是下不下来,而是「看着下完了」。ed2k 协议对分块和纠错有自己的设计,客户端显示 100% 不等于文件字节级一致。先搞懂链接里那几段数字,再谈校验。
2.1 一条链接里的四段信息各管什么
把这条链接拆开看:ed2k://|file|<文件名>|<字节数>|<ed2k hash>|h=<AICH 根哈希>|/。四段信息的作用完全不同,混着用就会白忙一场。
| 字段 | 这条链接里的值 | 实际含义 | 能否用于完整性校验 |
|---|---|---|---|
| 文件名 | rhel-server-6.4-x86_64-dvd.iso | 落盘默认名,可能被下载站点加水印 | 不能,改名不影响内容 |
| 字节数 | 3720347648 | 文件精确长度 | 能,最廉价的一关 |
| ed2k hash | 542c0277eff8b86b7f0c18358df84702 | 分块 MD4 树哈希,128 位 | 能,但算法是 ed2k 专有的 |
| h= | hzclqmdk4re2o4pi5hzr5hpvnu5o4iij | AICH 根哈希,用于分块级纠错 | 能,支持的工具很少 |
第一个容易翻车的地方是单位换算。3720347648 除以 1024³ 约等于 3.46 GiB,而很多文件管理器按 1000³ 显示成 3.72 GB。同一张盘两个数字,新手很容易以为下错了版本,白白重下一遍。
第二个是哈希类型。ed2k hash 不是 MD5、不是 SHA1,是把文件按 9500 KiB(9728000 字节)切块,每块算一次 MD4,再把各块的 MD4 摘要拼起来算一次 MD4;只有单块文件才直接取那一次的 MD4。所以拿md5sum的结果去和链接里那串 32 位十六进制对,永远对不上——它俩根本不是一个东西。
提示:
h=那段是 AICH(Advanced Intelligent Corruption Handling)的根哈希,用 SHA1 树算出来再做 base32 编码,用途是让客户端在传输中定位坏块。日常校验用它性价比很低,长度和 SHA256 对不上是正常的。
2.2 三段式校验:长度、摘要、结构
我一般按「长度 → 摘要 → 结构」三关走,任何一关不过就不进入下一步。前两关纯本地,第三关要真挂载。
# 第一关:字节数必须和链接完全一致,差一个字节都算没下完 stat -c '%n %s bytes' rhel-server-6.4-x86_64-dvd.iso # 第二关:摘要比对。值以发行方公布的为准,别抄论坛里转手多次的 sha256sum rhel-server-6.4-x86_64-dvd.iso md5sum rhel-server-6.4-x86_64-dvd.iso # 第三关:只读挂载,确认 ISO9660 目录结构没坏 mkdir -p /mnt/iso mount -o loop,ro rhel-server-6.4-x86_64-dvd.iso /mnt/iso ls /mnt/iso | head -n 20stat -c '%s'输出的是字节数,不带你系统语言环境下的千位分隔符,最适合做脚本比对。sha256sum比md5sum慢一些,但对「文件被中间环节改过」这类问题更敏感;如果手头只有 MD5 值,用 MD5 也能拦住 99% 的传输损坏。mount -o loop,ro里的ro别省,一旦后面手滑写进这个挂载点,源镜像就废了,而这东西重下要几个小时的带宽。
想要更严格地验证和链接本身一致,就得自己算 ed2k hash。下面是能直接跑的实现:
# ed2k_hash.py —— 按 eDonkey2000 规则计算文件哈希,用于和链接第三段比对 # 依赖:pip install pycryptodome import sys from Crypto.Hash import MD4 CHUNK = 9728000 # 9500 KiB,ed2k 固定分块大小,改了结果必然不对 def md4(data=b""): return MD4.new(data).digest() def ed2k_hash(path): outer = MD4.new() blocks = 0 with open(path, "rb") as f: while True: buf = f.read(CHUNK) if not buf: break outer.update(md4(buf)) # 每块先算 MD4,再把摘要喂给外层 blocks += 1 if blocks == 1: # 单块文件按规范直接返回该块的 MD4,不再套一层 with open(path, "rb") as f: return md4(f.read()).hex() return outer.hex() if __name__ == "__main__": print(ed2k_hash(sys.argv[1]))关键参数只有CHUNK。它必须是 9728000 字节,不是 10 MB、也不是 9500×1000。如果用1024*9500,分块边界整体偏移,算出来的哈希和链接里那串完全无关,会误判成「文件损坏」。跑法和预期:
python3 ed2k_hash.py rhel-server-6.4-x86_64-dvd.iso # 输出应与链接第三段一致:542c0277eff8b86b7f0c18358df84702这个脚本读一遍 3.46 GiB 大约几十秒到两分钟,取决于磁盘顺序读性能。它比 SHA256 更有意义的地方在于:能验证你手里的文件和当初生成这条链接的人是同一个文件,而不是「和某个第三方公布的摘要碰巧一致」。
2.3 挂载后先看这四个目录
镜像挂上之后,别急着写盘,先花两分钟看一眼内部结构,很多后续问题在这一步就能预判。
| 路径 | 内容 | 实际用途 |
|---|---|---|
| /isolinux | vmlinuz、initrd.img、isolinux.cfg | 光盘/U 盘引导入口,PXE 也复制这两个文件 |
| /images | install.img、efiboot.img、pxeboot/ | stage2 安装环境;EFI 引导所需镜像在这里 |
| /Packages | 数千个 rpm 包 | 安装时的软件来源,也是做本地 yum 源的主体 |
| /repodata | repomd.xml、primary.xml.gz 等 | yum 元数据,缺了它这个目录只能当文件堆用 |
| /EFI | EFI/BOOT/ 下的引导文件 | 只在 UEFI 模式下被读取,Legacy BIOS 用不到 |
/repodata存在与否决定这张盘能不能直接当软件源用,这在第 6 章会用到。/images/install.img是安装第二阶段的环境,大约一百多 MB;如果安装过程中提示找不到 stage2,通常就是这里或引导参数里的路径不对。顺手看一眼RELEASE-NOTES,能确认内核版本落在 2.6.32-358 这一档,和你要复现的基线对不对得上。
3. 从 ISO 到可启动介质:dd、虚拟机、PXE 三条落地路径
镜像验完,接下来是「怎么让它跑起来」。三种路径对应三种完全不同的使用场景:单台物理机、本地验证环境、批量部署。选错了不是装不上,而是会多花几个小时绕路。
3.1 物理机写盘:dd 的参数与残留清理
U 盘写盘最常见的失败不是 dd 写错,而是盘上残留了旧的分区表和文件系统签名,导致引导扇区读到了不该读的东西。
# 1) 先认准设备名。写错一个字母,整块移动硬盘就没了 lsblk -o NAME,SIZE,MODEL,TRAN # 2) 清掉旧分区表和文件系统签名,这一步很多人省,然后卡在黑屏 sudo wipefs -a /dev/sdX # 3) 整盘写入,注意 of 是 /dev/sdX,不是 /dev/sdX1 sudo dd if=rhel-server-6.4-x86_64-dvd.iso of=/dev/sdX \ bs=4M oflag=direct conv=fsync status=progress # 4) 落盘,拔盘前多等几秒 syncbs=4M是吞吐和内存占用的折中,U 盘写 3.46 GiB 用 4M 块比默认 512 字节快一个数量级。oflag=direct绕过页缓存直写设备,能避免「dd 显示完成但数据还在缓存里」的假成功。conv=fsync在结束时强制同步一次,和后面的sync是双保险。status=progress只是让 dd 每秒钟报一次进度,没有它你只能干等。
of=必须指向整块盘。ISO 是 isohybrid 结构,自带 MBR 引导代码和分区表,写到/dev/sdX1只会得到一堆散落文件,BIOS 根本不认。RHEL 6 系列的 DVD 镜像是 isohybrid 的,可以直接 dd;如果你手里是更老的非 hybrid 镜像,dd 出来在部分主板上起不来,那就得换用按 ISO 模式写入的写盘工具。
3.2 虚拟机直挂:最小可跑配置
只是要验证安装流程或跑个测试,虚拟机比物理机省事得多。RHEL 6.4 的内核自带 virtio 驱动,直挂 ISO 基本开箱可用。
| 项目 | 建议值 | 说明 |
|---|---|---|
| vCPU | 1~2 | 6.4 内核默认非 Tickless,核多收益不明显 |
| 内存 | 2 GB(图形)/ 1 GB(文本) | 低于 1 GB 时 Anaconda 会退回文本安装 |
| 磁盘 | 20 GB | 装完基础系统约占用 4~6 GB |
| 磁盘控制器 | virtio-blk 或 LSI Logic SAS | virtio 性能好;老 hypervisor 建议选 SAS 兼容 |
| 网卡 | e1000 | vmxnet3 也可,6.4 内核已内置驱动 |
| 固件 | BIOS | 除非你就是要测 UEFI 路径 |
一个容易忽略的点:图形安装对内存有硬门槛。给 512 MB 内存启动,Anaconda 不会报错退出,而是自动切到文本模式,很多人以为镜像有问题。另外 6.4 起对 UEFI 启动有了初步支持,但如果你在固件里选了 UEFI 又用了不支持的分区方案,卡在引导阶段的表现会比 BIOS 模式难排查得多,验证环境建议先用 BIOS。
3.3 PXE + HTTP 批量:参数写法和 7 不一样
一次要装五台以上,逐台插 U 盘就是自找麻烦。PXE 的网络引导加 ks 无人值守是标准解法,但 RHEL 6 的 anaconda 参数名和后来的版本不同,照抄新版本的写法会直接失败。
# 准备 TFTP 根目录,只复制引导必需的两个文件 mkdir -p /var/lib/tftpboot/rhel6.4 cp /mnt/iso/isolinux/vmlinuz /mnt/iso/isolinux/initrd.img /var/lib/tftpboot/rhel6.4/ cp /usr/share/syslinux/pxelinux.0 /var/lib/tftpboot/ mkdir -p /var/lib/tftpboot/pxelinux.cfg # ISO 整体挂到 HTTP 根下,供 anaconda 拉取 stage2 和软件包 mkdir -p /var/www/html/rhel6.4 mount -o loop,ro rhel-server-6.4-x86_64-dvd.iso /var/www/html/rhel6.4引导菜单文件pxelinux.cfg/default的内容是这样的:
default rhel6.4 prompt 1 timeout 60 label rhel6.4 kernel rhel6.4/vmlinuz append initrd=rhel6.4/initrd.img \ ks=http://10.0.0.10/ks/rhel6.4.ks \ method=http://10.0.0.10/rhel6.4/ \ ip=10.0.0.20 netmask=255.255.255.0 gateway=10.0.0.1 nameserver=10.0.0.2 \ ksdevice=eth0ks=是 kickstart 文件位置,不是inst.ks=;method=指定安装源,也不是inst.repo=。这两个参数名在 RHEL 6 上写错,表现是引导后提示「无法找到安装源」然后掉进交互界面,看上去像网络不通,实际是参数没被识别。ksdevice=eth0在多网卡机器上必给,不给的话 anaconda 可能挑了没接线的那个口,然后一直 DHCP 超时。ip=那一串是给安装环境预配静态地址,省掉 DHCP 依赖;如果你的环境有 DHCP,这几个参数可以整段去掉。
4. Anaconda 里的分区与包组:几个参数怎么定
安装器界面上的每一步都能用 kickstart 固化下来,但前提是你知道每个默认值背后的取舍。分区和包组是返工率最高的两项。
4.1 分区:/boot、swap 与 LVM 的边界
RHEL 6.4 默认文件系统是 ext4,默认卷管理方案是 LVM。这个组合在服务器上合理,但有两个硬约束必须提前知道。
| 挂载点 | 建议大小 | 文件系统 | 位置 | 理由 |
|---|---|---|---|---|
| /boot | 500 MB | ext4 | 标准分区 | 引导阶段只认标准分区,放 LVM 上会在写引导记录时失败 |
| swap | 内存 ≤8 GB 时取 2 倍,>8 GB 取 8~16 GB | swap | LVM 或标准分区均可 | 太小会在内存压力下直接 OOM |
| / | 20~50 GB | ext4 | LVM | 后续扩容最方便 |
| /var | 10~20 GB | ext4 | LVM | 日志和 yum 缓存是最常见的撑爆点 |
| /opt 或业务目录 | 剩余空间 | ext4 | LVM | 数据与系统分离,重装不丢 |
/boot必须是标准分区这一条,不是经验之谈而是安装器的硬性限制。曾经有人为了「统一管理」把/boot也塞进卷组,Anaconda 在最后写引导程序那一步直接抛错,前面的分区和格式化全白做,得从头再来。swap 的大小公式里,2 倍内存这条规则在内存 8 GB 以下成立;超过 8 GB 之后按 2 倍分配纯属浪费磁盘,取 8~16 GB 足够支撑常规峰值。/var单独分出来的价值在于隔离:yum 缓存和日志写满自己那一块,不会把根分区拖垮到无法登录。
4.2 包组:最小化起步,按需叠加
默认的「Basic Server」会带走一堆用不上的服务。生产环境我一般从最小化起步,再按角色加包组。
%packages --nobase @core @base @development openssh-server ntp -vsyslogd %end--nobase表示不安装 @base 之外的默认集合,实际效果是系统更干净。@core是最小可运行集,没有它连 shell 都不完整。@development带上 gcc、make、kernel-devel,如果你后面要编译第三方驱动(老 RAID 卡、老网卡经常需要),这个包组省很多事,代价是几百 MB 空间。减号前缀表示排除,比如-vsyslogd明确不装某个包。包组名在 6.4 和 7.x 之间变化很大,@development在 7 上就得换成@development tools,跨版本复制 ks 文件时这里是高频出错点。
4.3 一份能直接用的 kickstart 骨架
把上面的结论拼起来,得到一份可复现的 ks 文件:
#version=RHEL6 install lang en_US.UTF-8 keyboard us timezone Asia/Shanghai --isUtc rootpw --iscrypted $6$replace_with_your_own_hash selinux --enforcing 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 # 分区:/boot 走标准分区,其余进 LVM part /boot --fstype=ext4 --size=500 --ondisk=sda part pv.01 --size=1 --grow --ondisk=sda 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 logvol swap --fstype=swap --name=lv_swap --vgname=vg0 --size=8192 %packages --nobase @core @base openssh-server ntp %end %post --log=/root/ks-post.log # 关闭不需要的服务,减少暴露面 chkconfig iptables on chkconfig ip6tables on sed -i 's/^SELINUX=.*/SELINUX=enforcing/' /etc/selinux/config %endpart pv.01 --size=1 --grow是先占满剩余空间再交给 LVM,--size=1只是占位,实际大小由--grow决定。logvol三行必须在volgroup之后,顺序错了安装器会报找不到卷组。rootpw --iscrypted后面那串是/etc/shadow里的密码哈希,生成方式是openssl passwd -1或python -c "import crypt;print(crypt.crypt('yourpass'))",直接把明文写进去会安装失败——这也是一个很典型的踩坑点。
5. 踩坑记录:五个让 6.4 装不上或跑不稳的细节
下面这几条,基本覆盖了这张盘从下载到上线全流程里最常遇到的问题。每条按「现象 → 原因 → 解决」写,照着对号入座就行。
5.1 介质自检失败:客户端显示 100% 不等于文件完整
现象:安装器启动后执行「检查安装介质」,报某个文件校验不通过,或者安装到一半提示 rpm 解包错误。
原因:ed2k 客户端显示 100% 只代表所有分块都被标记为已获取,不代表每块内容都经过端到端校验。中途暂停恢复多次、或多个源混用,都可能留下内容错误的块。
解决:回到第 2 章的三段式校验,先比字节数,再比 SHA256,最后用脚本算 ed2k hash 对照链接。只信客户端进度条是最容易后悔的一次操作。校验不过就整文件重下,别指望修修补补。
5.2 U 盘启动失败:黑屏、卡在 isolinux 或提示 checksum error
现象:BIOS 里能看到 U 盘,选它启动后要么直接黑屏,要么卡在isolinux:提示符,要么报Image checksum error。
原因:三种可能——写盘前没清残留分区表;of=写到了分区而不是整盘;或者主板把这块 U 盘识别成可移动设备并在启动时做了额外处理。
解决:先wipefs -a清签名再dd,确认of=/dev/sdX整盘;如果仍不行,换 USB 2.0 接口试一次,部分老主板的 USB 3.0 在 Legacy 引导阶段没有驱动,插在蓝口上就是起不来,这属于玄学级别但非常真实。
5.3 安装器找不到硬盘或网卡
现象:分区界面磁盘列表是空的;或者装完系统发现网卡没被识别,ifconfig只有一个 lo。
原因:RAID 卡、高版本网卡芯片的驱动不在 6.4 的 DVD 里。这个版本的硬件支持集停留在它的发布年份,后来的芯片组基本都没有内置驱动。
解决:进主板 RAID 配置把模式改成 AHCI 或 JBOD 先完成安装;对确实需要阵列卡的场景,用dd=参数加载驱动盘(driver disk),把厂商提供的驱动镜像放到 U 盘或 HTTP 上,在安装器启动参数里指过去。网卡同理,装完后补装厂商 rpm 再modprobe。
5.4 装完重启进不了系统:grub 卡住或找不到根
现象:安装过程一切正常,重启后停在GRUB>提示符,或者报Error 15: File not found。
原因:/boot被放到了 LVM 逻辑卷上,或者磁盘用了 GPT 但没有规划引导用的分区,引导程序写不进去。
解决:重装,/boot用标准分区、500 MB 起步。如果因为容量必须用 GPT,得额外规划一个引导专用的小分区,否则在老式引导程序下注定失败。这一条返工成本最高,分区那一屏多花三十秒确认一下,比装完再重来划算得多。
5.5 yum 全部 404,新终端连 SSH 报 no matching key exchange
现象 A:yum install任何包都报Cannot retrieve repository metadata,HTTP 状态 404。 现象 B:用新版本的 SSH 客户端连这台机器,提示no matching host key type found或no matching key exchange method。
原因 A:官方在线源对这个版本早已下线,仓库地址整体迁移到归档路径,原来的 baseurl 自然全 404。 原因 B:这台机器上的 SSH 服务端只提供早期算法,而新客户端默认禁用了这些算法。
解决 A:把源指到归档地址或本地 ISO,具体配置见第 6 章。 解决 B:两个方向任选,要么在客户端显式放开算法(ssh -o HostKeyAlgorithms=+ssh-rsa -o PubkeyAcceptedAlgorithms=+ssh-rsa user@host),要么在服务端加一组兼容参数。客户端临时放开适合一次性排查,长期方案还是把服务端配置固化下来。
6. 从一次性安装到可维护:把 DVD 变成常驻源
装完不是终点。这个版本已经没有在线更新通道,长期跑下去真正的麻烦是「想装个包,发现没有源」。最省事的做法是把这张 DVD 本身变成一台常驻软件源。
# /etc/yum.repos.d/local-iso.repo [local-iso] name=RHEL 6.4 DVD (local) baseurl=file:///mnt/iso enabled=1 gpgcheck=1 gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-redhat-release把 ISO 挂到/mnt/iso并写进/etc/fstab(-o loop,ro那套参数原样抄过去),重启后源自动可用。file://后面是三个斜杠,少写一个就变成相对路径。gpgcheck=1保留,正好用来验证包签名;如果镜像里的 key 文件和系统里的不一致,rpm --import一次就好。
如果还需要 DVD 之外的包,就得配一份归档源,把 baseurl 换成归档路径:
# 归档源示例,URL 按你手头可用的镜像站替换 cat > /etc/yum.repos.d/archive.repo <<'EOF' [archive-base] name=Archive Base baseurl=https://<your-mirror>/6.10/os/x86_64/ enabled=0 gpgcheck=1 gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-redhat-release EOF注意enabled=0——归档源平时关着,只在需要补包时用--enablerepo=archive-base临时打开,避免它和本地 DVD 源的包版本打架,出现「同名包两个版本互相覆盖」这类难查的问题。
最后是三条验收命令,装完机器我每次都会跑一遍:
uname -r # 内核版本是否符合基线 rpm -q kernel # 已安装内核列表 yum --disablerepo='*' --enablerepo=local-iso list available | wc -l # 本地源可见包数量第一条确认内核落在预期的 2.6.32-358 档位;第二条看有没有多装内核占空间;第三条输出应该是几千的量级,如果是 0,说明repodata没被读到,多半是挂载路径或baseurl写错了。这三条跑完,一台机器的交付才算有了可复现的凭证,而不是「装完了,应该没问题」。
血泪经验是:这类老版本镜像,最容易出问题的环节从来不是安装本身,而是安装之后没人验证源和算法兼容性,等半年后要补一个包才发现全线 404。从那以后我每次落这种老系统,都会把「本地源 + 三条验收命令」当成装机的固定最后一步,宁可多花五分钟,也不留一个说不清状态的盒子。希望帮到你。
本文还有配套的精品资源,点击获取