
去年年底我帮一个老朋友收拾他那几台跑了好几年的CentOS服务器发现一个很有意思的现象他的系统里躺着好几个不知道什么时候装的软件包有些服务开机自启了一堆没用的东西防火墙的规则写得也相当随意。他说这几年全靠“出问题就搜一下”撑着从来没系统看过一份完整的运维手册。我花了一整晚帮他梳理了一遍顺便把这几年的实操经验整理成了一份真正能落地的CentOS手册。这份手册不会教你背命令而是告诉你装好系统之后应该干什么、出了事按什么路径去查正好适合刚接手Linux服务器的新人也适合那些一直靠碎片知识撑着的老同事。1. 版本选型先搞懂你该装哪个CentOS很多人拿到一台服务器第一件事就是从网上随便下个镜像开始装。等到后面装软件、配仓库的时候才发现版本选错了能让你多踩一半的坑。这里先帮大家把几个常见版本的定位理清楚。1.1 CentOS 7、Stream、以及“停止维护”的真实含义CentOS 7是很多老运维最熟悉的版本默认的软件包管理器是yum内核版本是3.10.x发布至今已经非常稳定。它的生命周期在2024年年中正式画上了句号也就是说官方不再提供免费的安全更新和bug修复了。注意停止维护并不等于系统马上就不能用而是说继续使用会面临无法获得安全补丁的风险这对于暴露在公网的服务器来说是个很大的问题。CentOS Stream则是另一种形态。它不是传统意义上的“下一个CentOS版本”而是滚动更新的发行版处在Fedora和RHEL之间。也就是说你今天装的Stream三个月后的软件包版本可能已经前进了一大截。这种模式适合想做预演、或者喜欢跟上游保持同步的场景但不适合追求“装完就不动”的稳定生产环境。至于CentOS 8它的生命周期结束得更早而且和CentOS 7不属于同一个平滑升级路径。如果你现在手上还有跑着CentOS 8的机器我的建议是尽快规划迁移不要抱有侥幸心理。1.2 生产环境选型的判断标准我个人选型时一般只看三个指标软件包是否足够老而稳、官方仓库是否还活着、社区踩坑文档是否还搜得到。如果是为了跑一个需要长期稳定、不想频繁变动的业务比如内网数据库、文件服务器选一个生命周期内的老版本反而更省心。如果是为了搭一个实验环境、想体验新内核特性那直接上Stream或者更新的发行版更好没必要守着老版本不放。这里有一个很关键的判断你搜索到的教程是否与你当前系统匹配。很多人拿着重灌后的CentOS 8系统去搜CentOS 7的教程结果yum命令都变了自然对不上号。要养成一个好习惯每次操作之前先用命令确认一下当前系统版本然后再决定用哪一套命令语法。cat /etc/redhat-release # 查看内核 uname -r我一直建议运维新人把这三行输出养成肌肉记忆。后面很多奇怪的故障排查到最后往往就是版本不匹配造成的。2. 最小化安装后必须马上做的五件事很多教程喜欢教大家“装完系统后改IP、关防火墙、关SELinux”这其实是把系统变得更好用好访问而不是更安全更规范。我自己的习惯是装完最小化系统之后先做五件基础配置这五件事做完之后再谈业务部署会顺畅很多。2.1 第一件事确认网络状态并配置静态IP最小化安装的CentOS很可能默认开着NetworkManager但不一定自动获取到合适的IP。先执行ip addr看看网卡名和地址状态。如果你是虚拟机或者云主机一般会有dhcp自动分配如果是物理机几乎都需要手动配置静态地址。配置静态IP最稳妥的方式是直接改网卡配置文件路径在/etc/sysconfig/network-scripts/下文件名以ifcfg-开头加网卡名。要改的核心项是BOOTPROTOstatic ONBOOTyes IPADDR192.168.1.10 NETMASK255.255.255.0 GATEWAY192.168.1.1 DNS1223.5.5.5 DNS2114.114.114.114改完执行systemctl restart network或者nmcli connection reload。这一步看起来最简单却是后面所有步骤的基础建议改完顺手验证一下跨网段连通性别只ping网关。2.2 第二件事时钟同步服务器时间不准带来的问题往往非常隐蔽。日志时间错乱、证书校验失败、定时任务执行时间不对根因多半都在这。CentOS默认可能装了chrony也可以用ntpdate做一次性同步。我更推荐使用chrony因为它在网络抖动时也能保持较好的精度。装完chrony之后建议配好时间源然后执行systemctl enable --now chronyd chronyc sources -v timedatectl set-timezone Asia/Shanghai时区的设置往往最容易忽略。不设置时区会出现日期对但小时对不上的情况尤其排查日志时特别容易绕晕。2.3 第三件事创建普通用户并配置sudo很多人图省事一路用root操作。但在生产环境root直登的风险非常高无论是误操作还是被爆破损失都很大。我更习惯创建一个普通用户加入wheel组再通过sudo提权来做日常维护。useradd ops passwd ops usermod -aG wheel ops然后修改/etc/ssh/sshd_config把PermitRootLogin改成no这步放在确认新用户能正常登录之后再做。顺序别搞反否则容易把自己锁在外面。2.4 第四件事核实yum源可用性安装完系统之后第一条yum install命令往往会让人心凉半截因为默认官方源在部分地区访问很慢或者在老版本生命周期结束后源已经被官方移除。这时候需要把base源、epel源确认清楚。CentOS 7在EOL之后官方源默认指向的路径大多已经失效需要把mirrorlist改成baseurl并指向vault源。这一步当年让很多人踩坑因为看起来就是404或者超时。一个快速判断方法是yum clean all yum makecache如果命令报错提示找不到repomd.xml那基本就是源的问题。此时可以手动编辑/etc/yum.repos.d/CentOS-Base.repo把里面的mirrorlist注释掉把baseurl改成可用的镜像地址。记住一个原则源配置完之后一定要执行yum makecache重新生成缓存才能确认源真的可用。2.5 第五件事配置SSH连接优化保留默认的22端口在公网上会招来大量扫描如果条件允许可以把端口改到高位。另外建议在sshd_config里加上MaxAuthTries 3把密码尝试次数限制住。配置完用sshd -t做一次语法检查再重启服务。这里提一句不要贪图方便关闭密码登录只留密钥等密钥文件弄丢的时候你会非常痛苦最稳的方案是密码加密钥同时保留并配合白名单限制来源IP。3. 软件包管理yum和dnf的高频操作避坑点软件包管理是CentOS使用频率最高的操作没有之一。但很多人只会yum install -y这一招等遇到依赖冲突、找不到包、误升级内核这类问题时就不知道怎么处理了。3.1 基础命令对照表在CentOS 7上默认是yum在CentOS 8及Stream上默认是dnf但dnf兼容多数yum命令行习惯。我整理了一个日常对照表操作场景CentOS 7 (yum)CentOS 8/Stream (dnf)安装软件包yum install -y 包名dnf install -y 包名搜索软件包yum search 关键词dnf search 关键词查看包信息yum info 包名dnf info 包名列出已安装yum list installeddnf list installed查看依赖yum deplist 包名dnf repoquery --requires 包名卸载软件包yum remove 包名dnf remove 包名历史回滚yum historydnf history命令本身不难难的是理解背后的行为。比如yum update会更新所有可更新软件包包括内核。如果一台服务器跑了很久内核一更新就要重启才能生效而重启往往不在你的计划内。所以我一般建议日常只做安全更新或者用yum update 具体包名单独更新某个软件。3.2 安装本地rpm包时怎么处理依赖有时候你需要离线安装一个rpm包这时最容易出现依赖缺失问题。直接rpm -ivh xxx.rpm通常会报一堆requires错误正确做法是先把依赖关系搞清楚。我的习惯是先查这个包到底依赖哪些库rpm -qpR xxx.rpm然后把rpm包放到同一个目录里用yum localinstall安装它会尝试从本地目录加网络仓库去解决依赖。CentOS 8上对应的是dnf localinstall。如果公司内部有自建仓库也可以先把这些rpm包上传到仓库里统一管理这才是真正省心的方案。3.3 查看某个文件属于哪个包排查问题时经常遇到这样一个场景你知道一个配置文件的路径但不知道哪个软件包提供了它也不能随便删。这时可以用rpm -qf /etc/nginx/nginx.conf反过来想知道一个已安装包生成了哪些文件rpm -ql nginx这两条命令在排查“我怎么找不到这个文件”和“这个文件是哪个祖宗留下来的”时候非常有用建议刻进肌肉记忆。3.4 内核升级与回滚内核升级本身不复杂yum update kernel一条命令就能装上新的内核。关键在于重启之后如果发现驱动不兼容或者性能异常你得知道怎么回滚。查看系统当前能用的所有内核rpm -qa | grep kernel查看默认启动的内核grubby --default-kernel回滚思路是手动修改默认内核比如指定到旧版本grubby --set-default/boot/vmlinuz-3.10.0-xxx改完再重启进去先用uname -r确认一下内核版本是否切换成功。这里特别提醒不要手动删除旧内核文件保留两三个内核是运维的基本修养否则一旦新内核出问题你连哭的地方都没有。4. systemd服务管理从写unit到排查启动失败CentOS从7开始全面使用systemd管理服务。虽然service和chkconfig命令还能用但它们本质上只是兼容层。理解了systemd之后很多看似复杂的启动问题都能轻松拆解。4.1 systemd的关键概念systemd把服务定义放在.service文件里路径一般在/etc/systemd/system/或/usr/lib/systemd/system/。通过systemctl命令控制服务状态。常用命令我就不赘述了大家基本都会。可真正需要理解的是systemd会为每个服务维护自己的cgroup、日志和依赖关系。一个服务起不来时systemctl status会提示它是被依赖等待了、还是启动后立即退出了甚至能看到致命的报错信息比旧时代靠ps硬看好用太多。4.2 编写一个自己的service文件比如你用Python写了一个脚本希望开机自动运行。可以这样做vim /etc/systemd/system/myapp.service[Unit] DescriptionMy Custom App Afternetwork.target [Service] Typesimple Userops ExecStart/usr/bin/python3 /opt/myapp/main.py Restarton-failure RestartSec5 [Install] WantedBymulti-user.target这个文件里的Afternetwork.target表示等网络就绪后再启动Restarton-failure可以在程序崩溃后5秒自动拉起。配置完执行systemctl daemon-reload systemctl enable --now myapp这里的关键点是Type。简单脚本用Typesimple没问题但如果你要启动的是一个会fork出子进程的旧式守护进程那要改用Typeforking并指定PIDFile否则systemd会误判服务启动失败然后疯狂拉起新进程。4.3 journalctl日志查询systemd的日志统一用journald收集排查服务异常第一件事就是看日志journalctl -u myapp.service -n 100 --no-pager看指定时间窗口journalctl -u myapp.service --since 2025-01-01 10:00:00 --until 2025-01-01 11:00:00配合-f参数可以实时跟踪日志。很多服务问题并不在配置文件本身而在日志中的一段Python回溯或权限报错所以养成先查日志的习惯能让排查效率翻倍。4.4 服务启动失败的排查链路服务启动失败时别急着改配置我的固定链路是systemctl status 服务名看服务当前状态和最近日志journalctl -u 服务名 -n 50看完整报错检查相关目录权限尤其是服务运行用户是否有读写权限检查端口是否被占用ss -lntp修正后用systemctl daemon-reload再启动这套链路帮我解决过大量奇怪问题比如某个服务明明配置对了却因为日志目录属主不是运行用户而启动失败报错信息还特别隐晦。遇到这种情况用ls -ld /var/log/myapp看一眼属主往往比反复改配置有效得多。5. 网络配置、防火墙与SELinux这三件套决定了系统能不能用CentOS的网络安全三件套也就是网络配置、firewalld和SELinux是新手最容易搞砸的地方。很多人图省事直接全关结果后面补安全课补得很痛苦。5.1 使用NetworkManager还是直接改配置文件CentOS 7以上默认使用NetworkManager管理网络连接。对于简单静态IP配置两种方式都可以但是要注意手动改了/etc/sysconfig/network-scripts/ifcfg-*之后最好通过nmcli重新加载否则NetworkManager可能覆盖你的修改。查看当前连接nmcli connection show修改IP信息建议用nmcli交互式完成它会一并处理好配置文件和active connection的状态比直接改文件少踩很多坑。只要记住一个大原则要么全用nmcli要么全用配置文件加systemctl restart network不要混着来。5.2 firewalld常用命令与常见坑firewalld是CentOS自带的防火墙日常操作主要是放行端口和服务firewall-cmd --permanent --add-port8080/tcp firewall-cmd --reload危险的命令是--remove-port当你把正在使用的端口从防火墙里移除时连接并不会立刻断开但新连接会进不来而且一旦你reload之后自己也会断网。所以我强烈建议在改防火墙规则时至少新开一个SSH会话保持连接再操作避免把自己锁在门外。--permanent参数是否加决定了这条规则是仅本次生效还是永久生效。很多问题根源就在这加了--permanent但忘了reload规则不生效没加--permanent重启后规则丢了。这里建议固定套路修改前firewall-cmd --list-all看当前全量规则修改后firewall-cmd --reload然后立刻--list-all复核。5.3 SELinux是关还是调SELinux是CentOS里被误解最多的组件。很多人遇到权限异常第一反应是setenforce 0关掉。这确实能快速绕过问题但也确实削弱了系统安全。我的建议是生产环境尽量保留enforcing遇到问题优先学习怎么打正确的布尔值或加文件上下文标签。举个例子你手动把nginx的网站根目录放在/data/www访问时发现403很可能是SELinux上下文不对而不是文件权限不对。这时执行semanage fcontext -a -t httpd_sys_content_t /data/www(/.*)? restorecon -Rv /data/www就能在不关闭SELinux的情况下解决。实在需要临时关闭调试时也建议用setenforce 0只做临时切换不要修改/etc/selinux/config永久关闭否则系统重启之后如果忘了状态反而更难排查。5.4 SSH安全基线SSH是最常用也最容易被爆破的入口建议快速核对以下配置项PermitRootLogin no禁止root直接登录PasswordAuthentication视情况保留密码时建议加AllowUsers ops限制可登录账号MaxAuthTries 3限制尝试次数ClientAliveInterval 300和ClientAliveCountMax 2防止长时间空闲连接占用会话有条件就配置fail2ban自动封禁反复尝试的IP每改完一个参数都建议用sshd -t做语法检查再重启避免手滑把配置文件写错导致所有人都连不上。6. 磁盘与日志容量会无声无息吃掉你的人磁盘满是最常见的“无声故障”。现象往往是服务突然不可用登录一看df -h才发现/已经100%了。这类问题如果平时有巡检习惯本可以完全避免。6.1 磁盘使用情况排查查看磁盘整体与inode使用df -h df -i很多新人只看df -h不看df -i遇到“明明有空间但文件创建失败”就去怀疑权限实际上是inode耗尽了。哪个目录产生了海量小文件用下面这条命令找出来for i in /*; do echo $i; find $i -type f | wc -l; done6.2 LVM扩容实战如果当初装系统时用了LVM在磁盘空间不足时扩容是非常顺滑的操作。流程是先在虚拟机层面或物理机层面把磁盘扩容然后在新磁盘上创建PV把PV加入VG再扩展LV最后扩容文件系统。以/dev/sdb是新增空间为例pvcreate /dev/sdb vgextend centos /dev/sdb lvextend -l 100%FREE /dev/mapper/centos-root xfs_growfs /这里有个非常容易踩的坑文件系统是xfs还是ext4决定了最后一步用xfs_growfs还是resize2fs两者不能通用。扩展前务必确认blkid /dev/mapper/centos-root6.3 日志轮转配置CentOS使用logrotate来轮转日志。配置文件在/etc/logrotate.d/下。一个典型的配置长这样/var/log/myapp/*.log { daily rotate 7 compress delaycompress missingok notifempty }含义是每天轮转一次、保留7份、压缩旧的日志。这里提醒一句delaycompress配合compress使用可以避免压缩时正在写入的日志内容丢失这个细节能让日志排查更完整。写完配置后可以执行logrotate -d /etc/logrotate.conf做一次调试模式检查确认配置没有语法错误。7. 故障排查先看日志再动手少走一半弯路最后一章写给所有遇到问题就想去重启服务或重装系统的朋友。CentOS的排查思路其实可以固化成一套固定流程按流程走大部分问题都能定位。7.1 我的标准排查链路按优先级顺序如下看系统负载与资源uptime、free -h、df -h看系统日志tail -n 200 /var/log/messages看服务日志journalctl -u 服务名 -n 100看网络连接ss -lntp看进程状态ps aux | grep 关键词这套链路看起来简单但很多人做不到。因为大家最喜欢跳过前两步直接去看配置文件。事实上超过一半的问题在日志里已经写得明明白白浪费时间去猜反而不高效。7.2 常见问题速查表现象优先排查方向服务启动失败journalctl -u 服务名权限目录属主端口占用网站访问慢网络带宽、DNS解析、CPU负载、数据库慢查询磁盘满导致服务异常df -h、df -i、大文件定位命令找不到yum/dnf search、检查PATH环境变量时间不对导致证书报错timedatectl、chronyc sources网络通但ping不通域名cat /etc/resolv.conf、ping网关7.3 我在实际维护中最深刻的几条体会踩过的坑久了总会沉淀出几条自己的规矩。我现在给自己定了三条铁律分享出来给大家参考。第一条重要操作前先拍照。这个拍照指的是记录当前状态比如改配置文件之前先cp一份带日期后缀的备份比如nginx.conf.bak.20250115。大多数“改坏了”的场景其实都有救就怕改完忘了原来的内容。第二条一次只动一个变量。很多同学排错时同时改配置文件、重启防火墙、又升级了内核最后出问题时根本不知道是谁引起的。一次只动一个变量才能让因果清晰这也是最基础但最有效的排障纪律。第三条文档比记忆靠谱。CentOS的坑不会因为你记性好就绕开你。我现在每处理完一个问题都会顺手在本子或文档里记一句问题现象和解决方案。半年下来这份自己的手册比很多通用教程都有用。这次帮他收拾完那几台服务器我把这套思路原原本本写成了他机器上的一个运维文档他之后很少再因为同样的问题半夜打电话给我。CentOS本身不是一个花哨的系统它的价值恰恰在于稳定、透明、可预期。只要把基础打得扎实日常运维真的可以很从容。