RHEL 9 虚拟机安装与运维配置实战:从静态IP到SELinux排错
发布时间:2026/9/9 2:25:14 作者:尧图编辑部 阅读量:1,286

1. 先说说这份作业到底是什么定位第二次红帽作业如果只是“装个系统截图交差”那其实半天就能糊弄完。但这门课的老师明显不是这个意图整个作业拆解下来包含六个硬性要求在虚拟机上完成 Red Hat Enterprise Linux 9 的安装、给系统配置静态 IP、创建带 sudo 权限的专用用户、通过合法订阅或本地仓库完成 httpd 服务安装、让宿主机能通过浏览器访问到测试页最后再写一个收集系统信息的脚本。每一项单独看都不难但串起来之后基本上把一名运维人员日常工作里最常用的操作都覆盖了。我这篇文章不打算重复官方文档里那些“点击下一步直到完成”的内容重点记录两件事一是我在虚拟机里装红帽 9、配置服务时的完整操作链路二是安装过程中 GUI 界面进不去这种经典故障到底怎么一步步排查。如果你也在做类似的课程作业或者刚接触红帽系系统想在虚拟机里搭一套能用的环境这份记录应该能帮你少走不少弯路。说下我的实验环境宿主机是 Windows 11虚拟机软件用的 VMware Workstation 17镜像文件是 RHEL-9.4-x86_64-dvd.iso虚拟机分配了 4 核 CPU、8GB 内存、80GB 虚拟磁盘。这配置对纯学习场景来说绰绰有余网上很多人说 2GB 内存就够了但如果你要在图形界面里同时跑浏览器和终端4GB 以下真的会很痛苦。至于版本选择直接选 9.4 而不是 8.x原因很简单红帽 9 系列已经是当前稳定主线dnf 包管理、默认文件系统 XFS、SELinux 策略这些都比 8 系列更贴近现在生产环境的通用实践学新不学旧。作业里有一项容易被忽略的隐性要求所有操作要有记录最终提交物里要能看出“这个过程是你亲手跑通的”。所以从建虚拟机那一刻起我建议就把每一条关键命令、每一次报错都截图保存。后面你会感谢这个习惯。2. 虚拟机里装红帽 9 的完整复盘2.1 创建虚拟机时最容易出错的三个参数很多人装系统失败问题往往不是出在 ISO 镜像上而是虚拟机创建阶段就有隐患。VMware 新建虚拟机时选择“典型”还是“自定义”影响不大关键在三个地方第一客户机操作系统类型要选 Red Hat Enterprise Linux 9 64 位。如果你选的是“其他 Linux 3.x 内核”或者干脆选了 CentOS 7VMware 的虚拟硬件兼容性、网卡型号、内存管理都会有细微差异后续系统安装时出现奇怪报错的可能性会大很多。第二虚拟磁盘创建时选择“将虚拟磁盘存储为单个文件”还是“拆分成多个文件”如果宿主机磁盘格式是 NTFS两者都能用但单个文件在后续做快照、迁移的时候更省事。磁盘容量建议直接给 60GB 以上红帽 9 默认的 Server with GUI 安装模式装完就要占用 6GB 左右加上后续要装 httpd、开发工具、缓存日志空间太小很快会捉襟见肘。第三网络适配器选 NAT 模式。有些同学习惯用桥接模式但桥接模式要求宿主机网络环境里有 DHCP 服务而在学校机房、公司网络这种限制较多的环境里桥接模式经常导致虚拟机拿不到 IP后期排查很浪费时间。NAT 模式下宿主机访问虚拟机 IP 完全不受影响完全满足“宿主机通过浏览器访问服务”的作业要求。创建完虚拟机后先别急着启动。在 VMware 的设置里把“显示器”的“加速 3D 图形”选项勾掉显存默认就行。这个动作跟我后面遇到的 GUI 安装失败问题直接相关原因后面细说。2.2 安装引导阶段的选择带 GUI 还是最小化安装介质加载后界面会提示你选择启动选项。如果只是用键盘上下键选择 Install Red Hat Enterprise Linux 9.4然后回车会进入图形化安装界面。但这种安装模式在 VMware 里有一个潜在风险——虚拟机显卡不支持完整 3D 加速时安装界面可能花屏或者卡死。我这次就遇到了过程记录在 2.3 节。进入安装摘要界面后必配的项有四个键盘和语言保持默认即可安装目的地要进入后选择“自定义”或者直接点“完成”用自动分区软件选择里面如果作业要求里有图形界面选“带 GUI 的服务器”如果后面要用 VNC 远程桌面选“最小安装”会更省内存Root 密码和用户创建建议都在安装阶段就设置好避免装完还要切到单用户模式去改。我这次选的是“带 GUI 的服务器”并且额外勾选了“开发工具”这个附加软件组。这个附加组里包含了 gcc、make、git 等工具后续写 C 程序脚本或者编译软件会用到。作业虽然没有强制要求编译安装但多勾这一项不会增加多少安装时间后续用到的时候不用再补装。分区方面如果对 LVM 不熟悉直接用自动分区就行。红帽 9 的自动分区方案默认使用 LVM逻辑卷的优点是以后空间不够可以动态扩容。手动分区时要特别注意 /boot 分区不能太小红帽 9 的内核加 initramfs 已经逼近 100MB如果 /boot 分 200MB装第二个内核版本时基本必炸。我见过不少同学在这里栽跟头建议 /boot 至少给 1GB。2.3 GUI 安装失败的完整排查链路这是我的重点记录部分。第一次安装时安装阶段一切正常但安装完成后虚拟机重启屏幕黑屏键盘按什么都没反应只有鼠标光标能移动系统像是卡在登录界面但画面完全没有渲染出来。当时第一反应是 VMware 显卡驱动问题。红帽 9 默认使用 GNOME 桌面GNOME 在 VMware 虚拟机上依赖 VMware SVGA 驱动和 3D 加速。如果安装系统时没有安装 open-vm-tools或者虚拟机显示设置里开启了“加速 3D 图形”且显存分配不当登录界面经常出现黑屏或花屏。排查的第一步是切换终端。不要看到黑屏就重启按 CtrlAltF2 切换到命令行登录界面输入 root 账号密码登录。如果命令行能进去说明系统核心没问题问题出在图形栈。然后执行journalctl -b | grep -E (gdm|gnome-shell|drm) | tail -50我这里的日志里有大量drm:vmwgfx ... failed to create ...和gnome-shell: Failed to create scanout之类的记录。看到 vmwgfx 关键词基本就能锁定方向了虚拟显卡驱动与系统渲染方式存在冲突。解决办法有两条路。第一条是重回安装界面进入 GRUB 引导菜单后按 e 编辑引导参数在linux开头的行末尾加上nomodeset然后按 CtrlX 启动。这个参数会强制系统使用帧缓冲设备而不加载显卡驱动模块能解决大部分 VMware 黑屏问题。不过加上 nomodeset 之后GNOME 桌面的渲染性能会打折扣但作为作业演示足够了。第二条路是进入系统后查看当前默认登录使用的是 Wayland 还是 Xorg。方式是在登录界面点击用户名后输入密码之前点右下角的齿轮图标选择“GNOME on Xorg”。RHEL 9 默认登录会话是 Wayland而 VMware 虚拟机里 Wayland 支持并不算完美切到 Xorg 后黑屏问题通常直接消失。我最后采取的是双保险关闭 VMware 显示设置里的“加速 3D 图形”并在 GRUB 引导参数里加nomodeset。重启后顺利进入图形登录界面。这次的教训是如果你用的是 VMware 这类虚拟化软件装 RHEL 9 图形界面之前先直接关闭 3D 加速可以减少至少一半的图形问题。很多人习惯性勾上“加速 3D 图形”结果安装界面都进不去回头还以为是镜像坏了。2.4 一个反直觉的结论交作业不一定要用图形界面装完图形界面并修复黑屏问题后我心里其实有点动摇。因为这版系统在虚拟机里跑 GUI 确实有些卡而且截图虽然好看但真正体现能力的操作截图全部来自终端命令。后来我把系统又重装了一次这次选了“最小安装”然后用dnf groupinstall Server with GUI补装图形环境。最小安装的好处是系统体积小、内存占用低后续操作响应更快。补装命令如下dnf groupinstall Server with GUI -y systemctl set-default graphical.target reboot这套流程跟直接在安装阶段选“带 GUI 的服务器”效果几乎一样但好处是如果你不需要图形界面完全不用安装需要时再补装主动权在自己手里。作业提交时我其实既可以提交“最小安装 终端命令”的截图也可以补装 GUI 后提供桌面截图两种形态都验证过。这也顺便回答了很多同学纠结的问题作业要求里并没有明确说“必须使用图形界面”所以从效率角度最小安装反而是最优解。图形界面的作用只是让你心里踏实而真正给老师展示能力的是命令和配置成果。3. 装完系统之后的四个硬配置IP、仓库、用户、服务3.1 用 nmcli 配静态 IP而不是手改配置文件红帽系系统从 8 开始网络配置的推荐方式就是 NetworkManager 的 nmcli 命令。虽然直接编辑 /etc/sysconfig/network-scripts/ifcfg-ens160 也能改但 NetworkManager 服务会持续监控配置文件文件格式稍有偏差就会被还原反而弄出“改了不生效”的奇怪问题。我先用ip addr查看网卡名称虚拟机里一般是 ens160。然后执行nmcli con show拿走当前的连接名称一般是 ens160 或 Wired connection 1。接着nmcli con mod ens160 ipv4.method manual ipv4.addresses 192.168.116.128/24 ipv4.gateway 192.168.116.2 ipv4.dns 8.8.8.8 114.114.114.114 nmcli con down ens160 nmcli con up ens160IP 地址选择要根据你虚拟机 NAT 网络的网段来定。VMware 默认 NAT 网段是 192.168.x.0可以在 VMware“编辑 - 虚拟网络编辑器”里看到。网关一般是 x.2比如 192.168.116.2。为了避免跟宿主机当前网络环境冲突最好固定一个网段内的地址。配置完别急着继续先验证ping -c 3 192.168.116.2 ping -c 3 www.baidu.com ip addr show ens160课后作业里很多人的静态 IP 配置错就错在忘了把 DNS 写完整或者网关写错。开启 NetworkManager 后IPv4 的 DNS 会自动接管 /etc/resolv.conf所以用nmcli con mod配 DNS 是最可靠的方式。3.2 订阅注册与本地仓库两条路都得会RHEL 的软件源跟 CentOS 不同默认情况下 dnf 安装软件包会因为没有可用仓库而报错。这里有两种合法途径。第一种是使用 Red Hat 官方提供的开发者订阅个人可以免费注册注册后执行subscription-manager register --username 你的账号 --password 你的密码 subscription-manager attach --auto dnf repolist这个订阅对个人学习完全够用我在作业里用的就是这种方式。注册成功后dnf 就能正常从官方 CDN 拉取软件包。注意注册过程需要虚拟机能够访问外网如果你的实验网络环境受限就走第二条路。第二种是在完全离线的环境中把安装 ISO 作为本地仓库。先把 ISO 上传到虚拟机或直接挂在虚拟光驱上然后mount /dev/cdrom /mnt ls /mnt在 /mnt 下能看到 BaseOS 和 AppStream 两个目录分别创建仓库文件cat /etc/yum.repos.d/local.repo EOF [BaseOS] nameBaseOS baseurlfile:///mnt/BaseOS enabled1 gpgcheck0 [AppStream] nameAppStream baseurlfile:///mnt/AppStream enabled1 gpgcheck0 EOF dnf clean all dnf makecachegpgcheck0 是告诉 dnf 跳过 GPG 密钥校验离线环境通常没问题。如果是生产环境建议保留 gpgcheck1 并导入官方 GPG key。这里有个细节光驱里挂着 ISO 的情况下如果虚拟机重启挂载点会丢失所以离线环境做作业的话最好把命令作为启动脚本固化下来或者直接复制 ISO 到磁盘并做一个开机自动挂载的 systemd unit。3.3 创建用户与 sudo 权作业里必有的一项红帽作业里几乎不太会允许你全程用 root 操作创建专用用户是考核点之一。我创建了用户 webadminuseradd webadmin passwd webadmin usermod -aG wheel webadmin把用户加入 wheel 组后这个用户就拥有了通过 sudo 提权的能力。红帽 9 的 sudoers 默认配置里wheel 组成员是可以执行任意命令的所以不需要手动编辑 /etc/sudoers。建议顺手做两个限制一个是用chage -M 30 webadmin设置密码有效期 30 天另一个是用visudo给 webadmin 添加一条Defaults requiretty这个选项在纯终端环境里意义不大反而可能造成 SSH 执行远程命令时提示 no tty不推荐新手设置。关键是要理解 sudo 的生效机制su - webadmin sudo whoami输出的结果必须是 root才能证明 sudo 配置成功。另外如果作业要求里有“禁止 root 远程登录”这种话术对应的配置在 /etc/ssh/sshd_config 里的PermitRootLogin no行改完记得systemctl restart sshd。3.4 部署 httpd 服务并从宿主机访问验证这个环节是整个作业的实体要求。安装命令很简单sudo dnf install -y httpd sudo systemctl enable --now httpd不复杂但很多人的服务起不来并非因为安装有问题而是忘了防火墙。红帽 9 默认防火墙是 firewalld它对 httpd 的 80 端口是放行的但如果没有手动添加规则依然会被拦截。执行sudo firewall-cmd --permanent --add-servicehttp sudo firewall-cmd --reload sudo firewall-cmd --list-all服务和防火墙都准备好了接着写测试页面。作业要求里允许自定义页面我在 /var/www/html/index.html 里写了一个简单的页面。里面特意加入主机名、IP、时间信息方便老师确认访问到的确实是我的虚拟机html headtitleRHEL9 Web Server/title/head body h1RHEL 9 httpd is running/h1 pHostname: myrhel9/p pIP: 192.168.116.128/p pDate: 2025-03-22/p /body /html宿主机浏览器访问 http://192.168.116.128/能正常看到这个页面。如果访问不了优先检查三条链虚拟机和宿主机能否互相 ping 通防火墙有没有放行 80 端口httpd 进程是否还在运行。把这三条链理的清清楚楚全班 80% 的网络问题都能自己定位。4. 最有“红帽味”的排错自定义网站根目录被 SELinux 拦截4.1 现象页面已经部署好访问却全是 403作业里老师额外加了一个进阶项把网站的根目录改到自定义路径比如 /data/www而不是默认的 /var/www/html。我在完成默认路径后决定碰一碰这一项。首先创建新目录并移动页面sudo mkdir -p /data/www sudo cp /var/www/html/index.html /data/www/然后修改 httpd 的主配置sudo vim /etc/httpd/conf/httpd.conf找到DocumentRoot /var/www/html和Directory /var/www/html改成 /data/www 对应路径。改完后重启服务sudo systemctl restart httpd结果再次访问网页显示 403 Forbidden。当时第一反应是权限问题因为 /data 目录是 root 创建的普通用户确实没有执行权限。于是执行ls -ld /data/www sudo chmod 755 /data/www但改完权限还是 403。接下来检查 httpd 错误日志sudo tail -50 /var/log/httpd/error_log日志里写着Permission denied: /data/www/index.html路径完全正确权限也确实是 755那问题基本就是 SELinux 没跑了。4.2 用 audit2why 定位 SELinux 拦截红帽系统默认启用 SELinux强制模式 enforcing。它在内核层面上控制着进程、文件、网络端口之间的关系httpd 进程有自己的一套上下文类型httpd_sys_content_t而我们新建的 /data/www 目录默认继承的是default_t或unconfined_u之类的类型httpd 没有权限访问。可以用命令验证上下文ls -ldZ /data/www输出里能看到类似unconfined_u:object_r:default_t:s0这样的标记。再看一下正常的 /var/www/htmlls -ldZ /var/www/html对比就很明显。解决思路有两个第一个是临时关闭 SELinux不推荐但适合新手快速确认问题sudo setenforce 0再次访问网站发现 403 消失。这就确定了是 SELinux 拦截。第二个是正规做法用 semanage 给自定义目录添加正确的文件上下文类型sudo dnf install -y policycoreutils-python-utils sudo semanage fcontext -a -t httpd_sys_content_t /data/www(/.*)? sudo restorecon -Rv /data/wwwadd 完规则后restorecon 会根据规则重新标记目录。再次访问问题解决。这条排错链路让我意识到红帽系跟 Ubuntu 系最大的差别不在于命令不同而是多了一层 SELinux 的权限模型。很多把 Ubuntu 习惯带过来的人遇到这种问题大概率会直接setenforce 0或者改配置文件禁用 SELinux这在作业里分数会扣得很惨。老师布置这个进阶项要考察的基本就是学生能不能理解上下文类型并用 semanage 给目录打上正确的标签。4.3 一条命令写出系统诊断脚本把信息一次性收集齐最后一个硬要求是脚本。要求在虚拟机上执行后能输出主机名、内核版本、内存容量、磁盘使用情况、当前登录用户和 IP 地址。这类作业的本质是考察脚本逻辑与命令熟悉度。我写的脚本如下#!/bin/bash echo System Info echo Hostname: $(hostname) echo Kernel: $(uname -r) echo Memory: free -h | awk /^Mem:/ {print Total: $2 , Used: $3 , Free: $4} echo Disk: df -h / | awk NR2 {print / usage: $5 used, $4 available} echo Users: who | awk {print $1 from $5} echo IP Address: ip -4 addr show | grep -oP (?inet\s)\d(\.\d){3} | grep -v ^127\.脚本的亮点在于用命令替换将 uname、free、df、who、ip 的输出抓取出来再做格式化。执行前赋予执行权限chmod x sysinfo.sh ./sysinfo.sh输出效果看起来整洁而且每一步的命令都标准。如果你基础比较薄弱也可以写得简单一点比如只输出echo System Info hostname uname -r free -h df -h who ip add但作业要求只写了“收集并输出”没有硬性要求美化。不过既然想做得好加一点格式处理能让人看出你懂命令逻辑不是一个一个命令在硬抄。5. 交作业前最后过的三道关以及踩过才懂的坑5.1 提交物不等于截图堆砌要有验证过程作业提交要求里有截图但不是随便拍几张就完事。老师明确要求每张截图必须有对应的“验证动作”。比如静态 IP 配置截图旁边要带着ip addr show的输出证明这个 IP 真的是当前生效的地址而不是编辑配置文件后就拍个照。httpd 服务截图旁边要带systemctl status httpd显示 activerunning状态。这样提交物才具备可追溯性。我最后的提交物包含四个部分虚拟机配置截图、安装过程截图、命令操作截图、网页访问结果截图。网页访问结果截图里既有宿主机浏览器访问成功画面也有虚拟机内部curl 127.0.0.1的输出两个角度都验证过了老师复核时不用再怀疑。5.2 这次作业踩过但下次绝不会再犯的三个坑第一个坑是快照意识缺失。装完系统刚准备配置 IP 时虚拟机连不上网我一直在排查网络后来发现是 VMware 虚拟网络编辑器里 NAT 服务被 Windows 防火墙拦截了。这种宿主机层面的问题跟虚拟机里的配置毫无关系排查起来非常浪费时间。正确做法是装完系统、完成基础配置后立即打一个快照后面怎么折腾都能快速回滚。比如 SELinux 那一段我连续改了三次上下文如果没有快照一次失败就可能要重装系统。第二个坑是防火墙规则临时与持久化混淆。班级里好几个同学在firewall-cmd --add-servicehttp之后忘了加--permanent重启后端口规则消失页面又访问不了了。这个细节在红帽作业里出现频率极高我在排查时也会第一时间想到它。第三个坑是自定义目录权限时漏了 SELinux。我最初以为 403 就是文件权限问题绕了一大圈。后来回想整个排查链路可以归纳为“网络通不通端口监听有没有防火墙放没放SELinux 拦没拦”按这条路走就不会迷路。5.3 如果你也想靠这份记录复现一遍建议按这个顺序操作镜子给了路径也画好了给准备动手复现的朋友整理一个顺序参考先建虚拟机安装时直接选最小安装系统起来后用 nmcli 配好静态 IP紧接着注册订阅或配本地仓库再创建 webadmin 用户并加入 wheel 组然后 dnf 安装 httpd、放行防火墙、部署页面最后写一个系统信息收集脚本提交前每一条务必验证。这套顺序里最容易被跳过的其实是“每验证一步再做下一步”。很多人喜欢把系统装完一次性把所有崩溃解决再去截图但作业要求里的“验证过程”恰恰是你真实操作留下的痕迹。我也理解作业这种事时间越紧越容易粗糙可越粗糙越容易出错。如果后面有时间这整套环境还能继续往下扩展比方说给 httpd 加一个自定义端口然后在 SELinux 里放行对应端口或者用 dnf 安装 nginx 做个反向代理再或者基于这套虚拟机环境做一个 ansible 的初步实验。红帽系的深度不在安装本身而在运行之后整个系统策略与权限模型如何协同工作。第二次作业只是个入口。