
每年的新系统发布季都会有很多人问同一个问题RHEL9到底适不适合拿来练手命令操作该怎么学才不会走弯路。我在实验环境里完整走了一遍RHEL9系统部署、初始化配置、常用命令操作和故障排错这篇文章就把这次实验的整个过程、关键决定和踩坑记录全部摊开讲。准备装系统、刚接触Linux运维、或者正在为实验报告发愁的朋友可以直接照着这个路线来它能帮你省掉大量试错时间。这次实验不追求花哨功能重点解决三件事一是把RHEL9从ISO镜像到可用系统这一路的关键选择讲清楚二是把文件、文本、权限、服务、网络这些高频命令在真实场景中的用法梳理成可复用的套路三是把我在实验中遇到的那几个能让新手下巴惊掉的故障连同排查方法完整记录下来。整篇内容基于RHEL9.3环境实测但大部分命令和思路在RHEL8/CentOS Stream等发行版上同样适用。1. 实验准备搭建RHEL9环境前要先想明白的几件事1.1 为什么选RHEL9而不是CentOS、Ubuntu、openEuler实验开始前首先被问住的是选哪个发行版。很多初学者随手就装个Ubuntu理由是教程多、桌面友好但如果是奔着企业运维、系统管理岗位去的RHEL9反而是更接近生产环境的选择。原因有三第一红帽系的文档体系、认证体系RHCSA/RHCE和大量企业的实际运维栈都围绕RHEL/兼容发行版展开第二RHEL9使用的是dnf包管理器、systemd服务管理、firewalld防火墙、SELinux安全机制这套组合在国产化替代场景中同样被大量借鉴学会了换个发行版迁移成本低第三RHEL9默认文件系统是XFS内核版本基于5.14支持容器、虚拟化等现代基础设施踩坑经验和生产环境复用的匹配度更高。如果担心RHEL商业订阅费用实验阶段不必焦虑。红帽提供开发者订阅注册一个账号可以免费在最多16台物理机上使用RHEL也支持虚拟机环境。这比早年只能靠评估版过期后重装方便得多。当然也可以选择Rocky Linux、AlmaLinux这些RHEL兼容发行版它们对RHEL9实验内容几乎无缝兼容。1.2 虚拟化平台、硬件资源与安装镜像获取我这次实验用的是VMware Workstation Pro虚拟机配置是2核CPU、4GB内存、60GB虚拟磁盘。这个配置对学习和绝大部分企业应用足够了别一上来就分配8核16G后面画快照、复制虚拟机都拖累宿主机。如果机器性能一般2核2G内存也能跑字符界面但做桌面环境实验就会卡。关于镜像获取这里说个容易忽略的点去官网下载ISO时要注意选择“RHEL 9.x Binary DVD”而不是Boot ISO因为安装时要用的软件包都在DVD镜像里Boot ISO装系统时需要额外指定软件源对新手极不友好。下载完务必校验SHA256红帽官网每个镜像文件旁边都给了校验值用sha256sum命令核对一下防止文件损坏导致安装到一半报错。这是我在一次“安装器找不到系统镜像”故障里用半小时换来的教训。1.3 实验记录习惯与初始快照策略正式开始前我强烈建议先规划“记录方式”。不是说要写多正式的报告而是准备一个文本文件或笔记工具记录每条关键命令的用途、执行结果、遇到问题的现象和解决方法。我在实验中一直用三个表一个是虚拟机和系统配置登记表版本号、IP地址、主机名、系统时间一个是命令操作记录表执行时间、命令、执行结果、备注一个是故障排查记录表现象、初步判断、验证过程、解决办法。实验做到一半往往会发现前面少记录了什么一开始就定格式记录最后整理报告时能少熬两个晚上。安装完成后立刻创建虚拟机快照这一步特别重要。RHEL9实验过程中经常要把系统配置改坏比如改了错误的SELinux布尔值、装了一半依赖冲突的软件有快照就能秒回滚不用重装系统。我的习惯是在“安装完成并首次登录成功”这个节点做一次快照后续每完成一个大阶段再补一个快照。2. RHEL9系统部署实操从引导界面到首次登录2.1 安装流程关键步骤拆解RHEL9的安装过程走的是Anaconda图形安装器引导后最先进入的是语言选择界面。这里有个大多数人不会说的小窍门语言选择决定了root用户环境默认的字符集和错误提示语言。做实验建议直接选EnglishEnglish而不是中文原因不是装高端而是Linux各种报错信息、软件包依赖输出在英文环境下更好搜中文翻译版本晦涩且网上的解决方案大多基于英文报错去搜。个人使用习惯当然可以选中文但实验报告阶段我强烈建议用英文环境沉淀一下感觉。后续配置按顺序拆开看并不复杂核心在几个关键页面“Software Selection”能选的最小化安装是“Minimal Install”只有约四百多个包没有图形界面。做命令操作实验就用它干净、占用小所有后续软件都可以用dnf按需补装。如果想要GNOME桌面则选“Workstation”启动慢且占用大本实验没必要。“Installation Destination”要手动分区。默认“Automatic”虽然省事但生产环境的分区规划更精细Linux运维工作面试必考这个我放在下一节单独展开。“KDUMP”如果内存不够4GB这个功能建议关闭。KDUMP是为内核崩溃时保留内存做日志转储的机制默认会预留一定内存在小型实验环境中它常导致安装时可用内存变小实验阶段可以关了到真实服务器上按业务需求再开。“Root Password”设置root密码时如果强度不够安装器会弹警告我建议用一个足够复杂的密码比如包含大小写字母、数字和特殊符号的10位以上密码中间插两个生僻符号。密码策略这块在生产环境有专门基线要求实验时就当提前养成习惯。系统安装过程大概是几分钟到十几分钟取决于磁盘速度。装完后重启在命令行看到login提示符第一次用root登录RHEL9默认的策略会要求在首次登录时改密码吗不会但建议手动做密码轮换和快照。2.2 手动分区方案设计RHEL9默认文件系统为XFS分区方案我给出的参考配置如下/boot1GB标准分区ext4文件系统存内核和引导文件/剩余空间全部给根分区LVMXFS文件系统swap4GBLVMswap类型为什么把/boot单独分出来1GB因为GRUB引导程序、内核镜像、initramfs都放在/boot这块区域和根分区的备份恢复策略不同。很多默认自动分区方案也会单独分/boot新版本还需要/boot/efiUEFI引导时的EFI分区以及一个小的BIOS boot分区这些在手动分区里会自动提示照做就行。swap大小怎么算是个经典问题物理内存小于2GB时swap设为内存的2倍内存2GB以上时swap建议设为物理内存大小或至少4GB。不过RHEL9实际安装时系统也会根据内存自动给出建议。我这次4GB内存的虚拟机设了4GB swap实测运行编译类任务没出现过内存不足的告警。要不要用LVM是另一个关键决定。RHEL9自动分区默认会启用LVM好处是后续根分区空间不够时能用vgextend、lvextend在线扩容不用重做分区表。生产环境强烈建议LVM实验环境也建议用后面实验到磁盘扩容相关内容时你有现成的操作场景。分区只做/boot、/、swap三块不需要单独拆/home、/var理由是实验室环境数据不多拆太碎只增加管理复杂度真实生产环境再根据业务拆分。2.3 安装后的第一组命令订阅、更新、防火墙首次登录后别急着跑各种命令先把系统的“基础设施”状态确认一遍。RHEL9默认状态是SELinux开启、firewalld开启、订阅未注册。如果下载的是开发者订阅ISO先用注册命令激活仓库subscription-manager register --username你的账号 --password你的密码 subscription-manager attach --auto注册成功后更新系统仓库缓存和软件dnf clean all dnf makecache dnf update -y有些刚上手的朋友会问为什么RHEL9里还能用yum命令。我在实验中也确认过RHEL9保留了yum这个命令软链接到dnf两者的配置文件、仓库源配置基本一致但真正的新特性在dnf里比如dnf history、dnf system-upgrade后续命令操作一律用dnf就好。然后查看SELinux和防火墙状态getenforce systemctl status firewalld这里有一个新手常见的纠结要不要把SELinux直接关了进入permissive/disabled来躲开权限干扰我的建议是实验阶段不要关。很多企业Linux面试和实战故障最后都指向SELinux上下文错误你从第一天就习惯看SELinux报错后面会省很多事。真正排查服务起不来的问题时先看httpd_error_log再配合ausearch查SELinux拒绝记录比盲目setenforce 0靠谱得多。网络方面先查看IP是否正常获取ip addr show一切就绪后给虚拟机打上第一个快照。记住这个时间点后续所有命令实验都是在这个快照基础之上进行的万一玩坏直接回滚。3. Linux命令操作核心实战文件、文本、包管理的正确姿势3.1 文件操作命令的细节与安全习惯文件操作是Linux命令的基桩但很多实验报告只列了“ls、cd、cp、mv、rm”这些命令的形态没有讲使用场景和细节。我这次重点记录了几个容易出错的操作点。第一个是ls的别名坑。RHEL9的root用户默认alias llls -l有些终端环境里ls其实是ls --colorauto。做实验时尽量用全称带上参数比如想看到所有文件包括隐藏文件应该执行ls -la而不是想当然记忆“ls -a就够了”。输出里第一列那十个字符是权限位每一个字符有具体含义在面试里几乎必问。第二个是rm的不可恢复性。Linux命令行没有回收站rm -rf是真正的“告别”。这次实验里我专门用一个测试目录演练了rm -rf和find -exec的组合然后在报告里特意标注“生产环境慎用”建议新手在实验系统里先用验证过路径的echo命令打日志或者使用mv到/tmp/trash这种软删除方式。第三个是find命令的几个高频套路。删除指定日期前的日志文件是运维里的经典需求我实验时的命令是find /var/log/ -name *.log -mtime 30 -exec rm {} \;这条命令的执行流程是find搜索符合条件的文件-mtime 30表示修改时间超过30天-exec把每个结果传给你指定的命令。比写脚本来遍历目录高效得多。更稳妥的版本是先不接-exec只跑find部分看结果确认公会后再执行删除。cp和mv也有细节。目录复制必须加-r否则报错。mv同分区之间是移动名字跨分区会变成复制删除数据量大时耗时明显。RHEL9默认cp、mv遇到目标文件存在是否覆盖取决于别名和是否交互脚本里要养成cp -f、mv -f的显式习惯避免交互卡住自动化任务。3.2 文本查看与grep、sed、awk三剑客RHEL9作为最小化安装的系统日志、配置都是纯文本掌握文本查看命令是看得懂系统状态的基础。查看大日志文件别用cat日志几万行时cat会把终端刷爆正确姿势是用lessless支持上下翻页、搜索按/输入关键词以及直接跳到文件尾按G。tail中最常用的是tail -f实时跟踪日志输出我在排查服务启动失败时基本全程用它盯日志。文本处理里绕不开grep、sed、awk我把它们放在一起做一个实战场景来演示。假设我们想找出系统中所有监听端口的监听地址和进程ss -tlnp | grep LISTEN这只是一个“过滤”动作。但要把每行按列拆开取第4列本地地址端口和第6列进程就用到了awkss -tlnp | awk NR1 {print $4, $NF}如果日志里出现了大量error想看error前后5行用grep -E加上选项或结合awk的上下文逻辑。而sed更擅长按模式做替换常见例子是把配置文件里的旧IP全量替换成新IPsed -i s/192.168.1.10/192.168.2.10/g /etc/nginx/nginx.conf注意-i要谨慎它直接改源文件没有备份的情况下执行后很难回退。我的习惯是先不加-i执行一遍confirm输出再决定是否真正替换。在实验中我把这条规律总结成“先预览后落地”配合cp config config.bak做备份。3.3 DNF包管理命令与RPM查询RHEL9默认源里的软件包数量对做实验足够了但企业里有时候需要额外的EPEL源来补装常见软件。实验里我遇到的核心操作是这个顺序dnf install -y epel-release dnf install -y vim wget tar treednf相比yum在RHEL9上的显著改进是事务历史和依赖解析更清楚。如果想回滚某次安装可以查dnf history然后回退比如两天前装了vsftpd导致一堆依赖变化用dnf history list dnf history undo ID号这个功能在学生实验里很少见但企业运维非常实用。我最建议每个新手都去把dnf install的下载安装流程看一遍理解“软件包下载到缓存、依赖解析、事务执行”三个阶段。当系统里已经装了的软件需要定位它属于哪个包时用rpm -qfwhich passwd rpm -qf /usr/bin/passwd查询出来的结果就是passwd这个命令的来源包。这种“路径反查包”的思路也是排查“这个程序是哪来的”的标准动作。4. 用户权限与系统管理命令实操体系化梳理4.1 新建用户、组与sudo授权的完整过程RHEL9系统部署完以后应尽量避免长期用root直接操作最佳实践是先建普通用户再配置sudo提权。我在实验里用一组命令完整走了一遍useradd -m -s /bin/bash devuser passwd devuser-m表示创建家目录-s指定默认shell。如果要指定用户ID和附加组useradd -u 2001 -G wheel -m devuser注意-G wheel是让该用户加入wheel组RHEL9默认sudo权限配置中wheel组内的成员可以使用sudo执行全部命令。这就是“运维账号管理”的入门。随后用visudo确认sudoers里的wheel行没有被注释掉。查看用户信息id devuser whoami groups devuser实验中发现很多新手对usermod和useradd分不清useradd是“新建”usermod是“修改已有用户信息”比如把devuser追加到wheel组要用usermod -aG而不是重新useradd。RHEL9里-aG后面直接跟组名多次执行不会覆盖已有附加组这是最容易踩的坑。4.2 文件权限、特殊位与umaskLinux权限位是运维核心中的核心。我在实验里专门搭了个小场景一份项目目录要让人、组、其他人分别有不同权限。起手用chmod给权限chmod 750 /data/project750解释为所有者rwx(7)、所属组r-x(5)、其他人无权限(0)。742、764这些数字是从r4、w2、x1叠加出来的实验报告里建议把这张换算表整理出来面试和考试高频。不过只做chmod还不够RHEL9默认的进程权限机制还包括特殊位。比如/usr/bin/passwd命令就带有SUID位权限位里s普通用户执行它时临时获得root权限来修改密码。用ls -l可以看到-rwsr-xr-x。在实验里可以刻意测试一下把/etc/shadow的权限改成普通用户可读这是错误示范看看系统的SELinux和ACL会不会兜底。另外/tmp目录是sticky位场景sticky位确保用户只能删除自己创建的文件所以/tmp权限是rwxrwxrwt。umask决定新建文件的默认权限。RHEL9默认umask是022意味着文件默认644、目录默认755。可以通过umask命令临时修改也可以写入/etc/profile永久生效。实验时可以用touch一个文件再ls -l看权限验证。4.3 systemd服务管理与systemctl常用操作RHEL9全程使用systemd管理服务实验里最常处理的三个动作是启动、开机自启、查看状态systemctl start httpd systemctl enable httpd systemctl status httpd我刚接触时经常混淆start和enable现在总结为start是“现在立即运行”enable是“以后开机自动运行”两者没有依赖关系。一个服务可以只start不enable也可以enable但没启动运维状态下会看systemctl is-enabled和is-active两个维度的状态。RHEL9里还可以用systemctl list-unit-files --typeservice来查看所有服务单元的enabled状态。排查服务起不来时第一步是看status输出的错误详情第二步是用journalctl看日志journalctl -u httpd --no-pager -n 50这里的-u是按单元过滤-n 50是取最近50条--no-pager避免输出被卡在分页器里。不用退出就直接看完整日志这是排查效率最高的路径。平时要杀进程时用systemctl stop建议先正常停止别一上来就kill -9正常情况下systemd会把SIGTERM发过去给进程收拾配置和释放资源的机会。4.4 网络命令与主机名、时间同步配置网络配置现在RHEL9最常用的是nmcli它基于NetworkManager。实验里我用它配置了一个静态IPnmcli connection modify ens160 ipv4.addresses 192.168.100.10/24 nmcli connection modify ens160 ipv4.gateway 192.168.100.2 nmcli connection modify ens160 ipv4.dns 192.168.100.2 nmcli connection modify ens160 ipv4.method manual nmcli connection up ens160注意最后一步要重新激活连接才能生效。查看当前端口监听状态则用ss尽量养成用ss而不是netstat的习惯RHEL9默认不一定装了net-tools但ss是iproute2自带ss -tunlp查看系统时间状态以及开启时间同步是另一个容易忽略的命令组。RHEL9默认用chrony服务timedatectl status chronyc sources -v如果服务器时间和真实时间差太多很多访问、证书校验都会异常。我在实验里遇到过NTP对不上的情况后来手动systemctl restart chronyd并加上时间源配置后才正常。这个场景单独放在排错章节展开。5. 实验中踩过的坑与故障排查实录5.1 一套可复制的故障排查思路Linux运维面试题常问“遇到服务起不来你怎么排查”我在这次实验里给自己的方法做了框架化先确认现象再查看最近两次操作接着看系统和服务日志最后用命令检查端口和进程。前三步的顺序不能乱因为很多故障是自己改配置改出来的回看一下history能节省一半排查时间。具体到执行层我总结的排查命令清单如下目的命令查看内核与硬件日志dmesg | tail -30查看系统日志与服务日志journalctl -xe、journalctl -u 服务名查看端口监听ss -tunlp查看用户进程ps -ef | grep 服务名查看磁盘空间df -hT查看内存占用free -h查看服务单元状态systemctl status/是否enable和is-active5.2 实验中的四个高频故障案例案例一dnf更新直接报错。现象是执行dnf makecache时提示找不到仓库或无法连接。排查发现不是网络问题而是系统时间偏差过大。解决办法先timedatectl set-ntp true同步时间再执行dnf clean all、dnf makecache就恢复了。案例二HTTP服务启动成功了但浏览器无法访问。我在实验环境里装了httpd启动正常但外部访问超时。先用systemctl status httpd确认Active状态ss -tunlp看到8080端口在监听再查firewalld发现防火墙没放行http服务。处理firewall-cmd --permanent --add-servicehttp firewall-cmd --reload这类“服务没挂但外部不通”的故障八成是防火墙或SELinux挡路先查这两项。案例三SELinux阻塞了自定义网站目录。把默认的/var/www/html换成/data/web结果访问403。selinux报错在/var/log/audit/audit.log里可用ausearch -m avc查。解决方法是更新文件上下文semanage fcontext -a -t httpd_sys_content_t /data/web(/.*)? restorecon -Rv /data/web这是RHEL系独有的操作别的发行版没有semanage这套学会了才算真正懂RHEL9。这也是我不会轻易setenforce 0的原因生产环境的合规和加固要求不允许关闭SELinux。案例四DNS解析失效导致所有域名访问失败。场景是我把ens160的DNS写成了无法访问的地址结果curl外网全部超时ping IP可以通但ping域名报name or service not known。排查路径是ip route、cat /etc/resolv.conf、nmcli device show发现问题后重新nmcli connection modify设置正确DNS。这类问题特征是“IP通、域名不通”要立刻想到DNS。5.3 故障排查应该记录什么真实发生过的故障比顺利跑通的流程更有复用价值实验报告里最好每个案例都按“现象、环境、复现步骤、定位过程、根因、解决命令、防止复发建议”七要素记录。我在整理这次实验报告时用表格把三个主要故障收敛成了“快速诊断速查表”后续遇到类似现象直接按图索骥不用再看长篇教程。另外记录命令时别只记成功的失败的命令和它的报错文本同样重要。比如我故意执行了useradd一个已存在用户报错user exists这个报错能帮你理解RHEL9用户信息存储的完整流程/etc/passwd、/etc/shadow、/etc/group三份文件的联动。故障复现的日志比成功路径更能巩固对系统机制的理解。6. 把Linux实验做成高质量报告的框架与心得6.1 实验报告怎么搭才能让人一眼看懂做实验和写报告是两回事。报告的目标是让一个没跟过你操作的人看懂你做了什么、为什么做、踩了什么坑、得出了什么结论。我这次的报告结构是四段式实验环境说明、操作过程记录、结果验证、故障与心得。环境说明用一个表格把发行版版本、内核版本、虚拟机配置、IP规划、主机名列清楚操作过程按“任务、命令、执行结果”三步写关键处附实时输出而不是事后脑补结果验证不能只说“成功”要把验证命令和输出贴出来比如用ss -tunlp验证端口监听、用systemctl status验证服务active状态。标题别写“实验一”“实验二”这种没有信息量的标题改用“RHEL9安装与初始化配置”“用户权限配置实践”“服务管理命令实操”这种能直接定位内容的小标题。如果报告中包含表尽量用Markdown表格我整理报告时发现表格比一大段文字清晰十倍。正文里的命令除了展示执行结果至少给一行注释说明这条命令为什么这么用这和本次实验强调的“知其所以然”是一致的。6.2 我的个人实验心得与后续扩展思路这次实验做完我最大的体会是命令不能靠背要靠场景。RHEL9的每条命令之所以存在都是因为人类遇到某个具体问题需要解决。你不去亲手建一个用户很难理解passwd、useradd、usermod之间的关联不去复现一次SELinux拦截就永远觉得semanage是个多余的麻烦。所以我建议每一个准备写报告的朋友多花一点时间制造“意外”故意改错权限、故意停掉服务然后去排查。这些意外才是报告里最有价值的部分。后续如果想把实验往生产方向延伸有三条路可以选第一条是学习自动化用Ansible把RHEL9的初始化、软件安装、服务启停编排成playbook把重复操作交给机器第二条是深入容器方向在RHEL9上装Podman跑容器化应用看systemd和容器怎么协作第三条是补全监控与加固内容比如用auditd配置审计规则、用sshd加固策略锁远程登录。每一条路都足够写出一篇新的实验报告。但无论走哪条先把这个实验过程中的命令操作和排错框架吃透永远是第一优先级。