ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

CentOS Manual实战:初始化、磁盘扩容与内网SMTP邮件服务部署

CentOS Manual实战:初始化、磁盘扩容与内网SMTP邮件服务部署 1. 项目概述一份“CentOS Manual”到底该装什么先交代个背景。我日常工作里经常要碰CentOS从7到Stream都摸过期间给团队写过不少内部手册也收集过社区里零散的资料。时间一长CentOS Manual这件事就有了比较明确的轮廓——它不是简单把几个命令堆一块儿而是围绕CentOS系统从初始化、扩容、服务部署到排障的一整套可复用的操作集合。说白了手册的价值不在于“多”而在于“准”和“能落地”。这篇文章就把我在整理与补全这套Manual时的思路、实操步骤、踩坑过程完整梳理出来。内容覆盖系统初始化、磁盘扩容、邮件SMTP服务部署、日常排障技巧。无论你是刚接手CentOS服务器的新手还是已经有一定经验、想把手头操作固化成文档的老手都能从中找到可直接复现的流程。先说结论一份合格的CentOS运维手册至少要回答清楚三个问题——这台机器装好后第一件事做什么磁盘不够用怎么安全扩容业务需要对外发邮件时SMTP服务怎么在内网里正确搭建。这三个问题恰好对应了CentOS使用频率最高的场景初始配置、扩容、邮件服务。我把它拆成四个部分逐个展开。2. 系统初始化新机器到手后的标准动作2.1 为什么初始化环节最容易被忽略很多人拿到一台CentOS服务器第一反应是装软件、跑业务结果用了两周才发现时区不对、防火墙规则混乱、SSH端口暴露在公网、yum源慢到怀疑人生。这种情况我见过太多次了所以Manual的第一章永远留给初始化而不是业务部署。初始化不是“可做可不做”的加分项它是后续所有操作的地基。举个具体例子如果你在一开始没把时区设为Asia/Shanghai后续写日志分析脚本时时间戳全是UTC排查问题时差八小时浪费的精力远超当初设置时区花掉的十秒钟。2.2 初始化清单与关键操作我在Manual里把初始化拆成了固定步骤每一步后面标注了“为什么”这样团队新人照着做也能理解目的更新系统与安装基础工具yum update -y yum install -y vim wget curl net-tools lsof telnet bash-completion这里有个细节net-tools提供ifconfig和netstat虽然新版系统推荐用ip命令但很多老脚本和排障习惯里仍依赖它装上有备无患。bash-completion装上后记得source /usr/share/bash-completion/bash_completion才能生效。设置主机名与hosts解析hostnamectl set-hostname mail-server echo 192.168.1.100 mail-server /etc/hosts关于hosts解析我吃过亏内网环境如果DNS不稳定主机名解析失败会导致不少服务启动异常。比如后面要讲的Postfix启动时如果解析不了自己的主机名会直接报fatal: hostname lookup failure。所以无论如何/etc/hosts里先把自己写进去这是最稳妥的保障。同步时间与设置时区timedatectl set-timezone Asia/Shanghai yum install -y chrony systemctl enable --now chronyd chronyc sources -vchronyc sources -v用来确认时间源是否同步成功如果显示^*开头说明已同步。这一步直接决定了后续日志分析和证书校验的准确性尤其是部署邮件服务时TLS证书对时间极其敏感时间偏差超过几分钟SSL握手直接失败。配置防火墙与SELinuxsystemctl start firewalld systemctl enable firewalld firewall-cmd --permanent --add-servicessh firewall-cmd --reloadSELinux这块单独说明除非你明确知道自己在做什么否则不建议关闭生产环境里不少安全问题靠它兜底。但内网测试环境为了省事不少人选择setenforce 0这个我理解不过Manual里我坚持的标准做法是——能用chcon或semanage调整上下文就不关SELinux。尤其后面部署Postfix时邮件目录的SELinux上下文不正确会导致无法读写邮件文件到时候你还以为是权限问题查半天。配置yum源国内服务器强烈建议换成阿里云或清华源。CentOS 7的源配置路径是/etc/yum.repos.d/CentOS-Base.repoCentOS Stream则是/etc/yum.repos.d/下的stream相关文件。换源的操作不展开了但有个技巧换完后执行yum clean all yum makecache然后随便装个小包测试速度。2.3 实操心得初始化环节最容易踩的坑有三个直接用了默认的SSH端口22。如果服务器有公网IP我强烈建议改到高位端口比如sed -i s/#Port 22/Port 2222/ /etc/ssh/sshd_config然后注意放行防火墙端口firewall-cmd --permanent --add-port2222/tcp。改完先不要关当前SSH会话另开一个窗口测试新端口能连上再退出防止把自己锁在外面。忘记设置ulimit。很多中间件比如后面要讲的Postfix对文件描述符和进程数有要求可以在/etc/security/limits.conf里加* soft nofile 65535和* hard nofile 65535。yum源配置不正确导致后续安装失败。这个最常见尤其CentOS 7的base源和epel源都要配只配一个的话有些包永远装不上。初始化部分我给团队的要求是任何一台新机器从装机到初始化完成必须能在半小时内搞定且全程有日志记录。做不到说明Manual里还有没写清楚的地方。3. 磁盘扩容从分区梳理到在线扩容的完整流程3.1 为什么扩容是CentOS的高频操作“centos扩容”能成为热词不是没道理。业务日志膨胀、邮件队列堆积、数据库文件增长随便一个都能把磁盘塞满。而CentOS默认的分区方案里根分区空间往往捉襟见肘扩容几乎是每个运维的必修课。Manual里这张图我画得特别细先看现状再定方案最后操作每一步都有对应的验证命令。这样能避免一个非常愚蠢的错误——没搞清楚磁盘布局就盲目扩容结果把数据搞丢。3.2 扩容前的磁盘状态检查清单在动任何分区之前第一步永远是收集现状信息。我习惯按下面这个顺序执行# 查看磁盘整体使用情况 df -h # 查看块设备详细信息 lsblk # 查看分区表类型MBR还是GPT fdisk -l /dev/vda # 查看物理卷、卷组、逻辑卷信息LVM环境下 pvdisplay vgdisplay lvdisplay为什么要这么详细因为扩容方案完全取决于当前的分区类型LVM逻辑卷这是最理想的场景可以在线扩容不需要停机灵活性最高。GPT分区 非LVM需要看分区后面有没有空闲空间有的话可以用growpart扩展分区再用xfs_growfs或resize2fs扩展文件系统。MBR分区主分区数量限制为4个扩展空间可能受限于分区表布局操作更繁琐。我见过最复杂的案例一台机器的根分区是MBR下的标准分区结果磁盘满了但分区后面还跟着一个swap分区导致无法直接扩容。最后只能把swap停掉、删除、扩展根分区、重建swap整个过程需要重启系统风险极高。所以扩容前必须先用lsblk看清楚布局。3.3 场景一LVM环境下安全扩容LVM扩容是我最喜欢的场景因为完全可以在线完成不需要停机。下面是完整流程假设当前逻辑卷/dev/mapper/centos-root空间不足卷组名是centos。第一步确认卷组有可用空间vgdisplay看Free PE / Size字段如果有空闲空间直接跳到扩逻辑卷那步没有的话需要先把新磁盘加到卷组里。第二步新磁盘加入卷组没有空闲空间时假设新磁盘是/dev/vdb# 创建物理卷 pvcreate /dev/vdb # 将物理卷加入卷组 vgextend centos /dev/vdb第三步扩展逻辑卷# 将根逻辑卷扩展20G lvextend -L 20G /dev/mapper/centos-root # 或者扩展到卷组所有剩余空间 lvextend -l 100%FREE /dev/mapper/centos-root这里有个细节lvextend只是扩大了逻辑卷容量文件系统还没变大必须执行第四步。第四步扩展文件系统这一步要看文件系统类型xfs和ext4的命令不一样# XFS文件系统CentOS 7默认 xfs_growfs / # ext4文件系统 resize2fs /dev/mapper/centos-root第五步验证扩容结果df -h看到/分区容量已经变为扩容后的值扩容完成。3.4 场景二非LVM分区扩容如果分区不是LVM比如/dev/vda1挂载在/且分区后面有足够空闲空间可以用growpart在线扩容。# 安装cloud-utils-growpart如果没装 yum install -y cloud-utils-growpart # 扩展分区vda的第1个分区扩展到最大 growpart /dev/vda 1 # 扩展文件系统 xfs_growfs /执行growpart后系统会提示分区表已更新这时不需要重启直接扩展文件系统即可。但如果提示需要重启那就必须安排在维护窗口执行。3.5 扩容过程中踩过的坑与排查技巧扩容看似简单实际操作中坑非常多我把最常见的几个整理成一张速查表问题现象可能原因解决方法growpart报错unexpected output分区表与系统识别不一致先执行partprobe刷新分区表再重试growpartxfs_growfs报No space left on device逻辑卷未扩展只扩展了文件系统先lvextend扩展逻辑卷再xfs_growfs扩容后df -h容量没变化未执行文件系统扩展命令确认文件系统类型执行对应扩容命令重启后扩容失效分区表变更未持久化检查是否为GPT分区必要时用parted重新同步挂载点变成只读文件系统损坏重启进入救援模式执行fsck修复另一个容易忽视的点是扩容后监控指标的同步。我在实际运维中发现很多监控系统采集的是df输出的缓存扩容后如果不刷新缓存监控上依然显示旧容量白白触发一堆告警。建议扩容后执行sync df -h并在监控系统里强制刷新采集。4. 邮件SMTP服务部署从零搭建内网邮件中继4.1 先从需求说起“centos部署邮件smtp服务器”、“centos 搭建内网smtp服务器”这两个热词热度一直很高。需求通常来自两种场景一是企业内部系统监控告警、报表、验证码需要发邮件但不想依赖外部邮箱服务希望在纯内网环境里搭一套SMTP服务二是想把本地邮件通过自己的服务器转发出去充当邮件中继。注意这篇文章讲的是内网SMTP服务搭建不涉及公网IP的邮件服务器对外收发。内网环境意味着没有公网MX记录、可能没有PTR记录、甚至DNS解析都不完整这种情况下Postfix是最理想的选择——轻量、稳定、配置直观CentOS仓库里直接就有。4.2 为什么选Postfix而不是Sendmail或Exim三者的对比我做成表方便参考特性PostfixSendmailExim配置复杂度低主配置集中在main.cf高宏定义多学习曲线陡中安全性模块化设计默认配置较安全历史漏洞较多安全但配置语法独特内网中继场景支持且有relay机制支持但配置复杂支持CentOS生态默认自带文档丰富默认自带使用较少需额外安装在内网场景下Postfix几乎是最优解。它默认不开放开放中继自带基本的反垃圾机制配合cyrus-sasl可以轻松实现认证发信。这里重点说一下很多内网搭建的根本需求其实是“邮件中继”也就是让内网其他机器能通过这一台服务器发邮件出去而Postfix的relayhost和sasl_passwd机制天然适合这种场景。4.3 内网SMTP服务器搭建完整流程步骤一安装Postfix及相关组件yum install -y postfix cyrus-sasl cyrus-sasl-plain cyrus-sasl-lib mailxmailx是命令行发邮件客户端测试时用。安装完成后确认postfix服务存在systemctl status postfix如果提示Unit postfix.service not found多数情况是没安装或包名不同检查源配置后重新安装。步骤二备份并编辑主配置Postfix的主配置在/etc/postfix/main.cf动手前养成备份习惯cp /etc/postfix/main.cf /etc/postfix/main.cf.bak下面是一份适配内网场景的main.cf核心配置段直接说明每行的作用# 主机名配置 myhostname mail-server mydomain localdomain myorigin $mydomain # 监听地址内网所有接口 inet_interfaces all inet_protocols ipv4 # 允许接收的邮件域 mydestination $myhostname, localhost.$mydomain, localhost, $mydomain # 内网网段允许转发 mynetworks 192.168.1.0/24, 127.0.0.0/8 # 限制中继只允许本机认证用户 smtpd_relay_restrictions permit_mynetworks, permit_sasl_authenticated, reject_unauth_destination # SMTP认证配置 smtpd_sasl_auth_enable yes smtpd_sasl_type cyrus smtpd_sasl_path smtpd broken_sasl_auth_clients yes # 发信限制与队列设定 home_mailbox Maildir/关键参数说明mynetworks定义了哪些网段允许直接通过本机发信不需要认证。内网环境把这配成内网网段即可注意不要配成0.0.0.0/0否则变成开放中继这是安全底线。smtpd_relay_restrictions这是新版Postfix推荐的限制方式优先级高于老的smtpd_recipient_restrictions如果不加这条默认策略可能过于宽松或过于严格。smtpd_sasl_auth_enable yes开启SASL认证配合dovecot或cyrus-sasl实现账号密码认证。步骤三配置saslauthd认证这一步相当关键也是最容易踩坑的地方。先用cyrus-sasl自带的saslauthd对接系统用户# 启动saslauthd systemctl enable saslauthd systemctl start saslauthd # 测试认证是否生效 systemctl status saslauthd如果想用独立账号比如adminlocaldomain可以在/etc/sasl2/smtpd.conf里配置pwcheck_method: saslauthd mech_list: plain login saslauthd_path: /var/run/saslauthd/mux注意saslauthd默认通过PAM连接系统账号所以用系统用户测试时确保认证能过testsaslauthd -u root -p testpassword如果返回0: OK Success.说明认证链路OK。常见报错是connect() : No such file or directory说明saslauthd没启动或socket路径不对检查/var/run/saslauthd/mux是否存在。步骤四配置邮件投递与用户邮箱Postfix默认把邮件投递到/var/spool/mail/user我习惯改成Maildir格式每一封邮件一个文件方便后续用IMAP读取# 在main.cf中已经配置 # home_mailbox Maildir/创建用户邮箱目录# 假设系统用户webmaster mkdir -p /home/webmaster/Maildir chown -R webmaster:webmaster /home/webmaster/Maildir chmod -R 700 /home/webmaster/Maildir步骤五防火墙与SELinux调整# 放行25端口内网SMTP标准端口 firewall-cmd --permanent --add-servicesmtp firewall-cmd --reloadSELinux如果不处理Postfix会报一堆权限错误。最简单的处理方式是为Postfix开启SMTP相关布尔值setsebool -P httpd_can_sendmail 1 setsebool -P mailman_manage_domains 1 setsebool -P smtpd_connect_any 1如果还是有问题检查/var/log/audit/audit.log看有没有avc: denied记录有的话用audit2allow生成自定义策略模块而不是直接关SELinux。步骤六重启服务并测试发信systemctl restart postfix systemctl enable postfix # 查看服务状态 systemctl status postfix # 使用mailx发送测试邮件 echo Test mail from CentOS SMTP Server | mail -s Test Subject userlocalhost查看邮件是否到达# 检查邮件队列 mailq # 检查用户邮箱 ls -l /home/user/Maildir/4.4 部署排障实录我在内网SMTP搭建中遇到的5个问题这套流程我至少搭过二十次每次遇到的问题都略有不同但高频的就这几个问题1发信后队列堆积mailq显示deferred原因通常是目标域名解析失败或连接超时。内网环境里如果收件方是localdomain但Postfix的mydestination里包含了这个域名它会认为是本地投递不会外发。如果收件方是外部域名而DNS解析失败邮件就会一直排着。排查方法postconf -n cat /var/log/maillog | grep -i deferred看到statusdeferred (Host or domain name not found. Name service error for namexxx)就是DNS问题检查/etc/resolv.conf。问题2发送邮件报smtp: 554 5.7.1 Relay access denied这是Postfix拒绝中继了。检查mynetworks配置是否正确以及客户端IP是否在允许网段内。如果是本机测试还报这个错检查inet_interfaces是否包含127.0.0.1。问题3认证失败报SASL authentication failed先确认saslauthd存活再用testsaslauthd测试系统账号是否能认证成功。如果认证能过但Postfix还是失败检查smtpd_sasl_path smtpd是否与saslauthd的socket路径一致。另外cyrus和dovecot两种SASL后端路径写法完全不同混用会导致认证失败。问题4发信超时客户端连接到25端口失败先检查防火墙firewall-cmd --list-all | grep smtp。然后确认Postfix监听端口netstat -tlnp | grep :25。如果监听地址是127.0.0.1说明inet_interfaces没配置好。问题5邮件发送成功但收件箱是空的这个问题很隐蔽。如果你的home_mailbox Maildir/设置生效但用户目录下的Maildir没创建Postfix会投递失败但不会报错。解决方案就是提前创建目录并且注意权限owner必须是用户本身。4.5 进阶配置外部邮件中继RelayHost很多内网服务器没有公网IP无法直接对外发信这时候需要用到relayhost——把邮件交给一个可信的外部SMTP服务器转发。配置方式# main.cf里添加 relayhost [smtp.qq.com]:587 smtp_sasl_auth_enable yes smtp_sasl_password_maps hash:/etc/postfix/sasl_passwd smtp_sasl_security_options noanonymous smtp_tls_security_level encrypt然后创建/etc/postfix/sasl_passwd[smtp.qq.com]:587 你的邮箱qq.com:授权码生成hash并设置权限postmap /etc/postfix/sasl_passwd chmod 600 /etc/postfix/sasl_passwd systemctl reload postfix这里有个技巧生成hash后sasl_passwd和sasl_passwd.db两个文件建议同时设置600权限否则Postfix会告警提示不安全。用587端口TLS是为了避免25端口被封禁这在很多云厂商环境里是硬性限制。配置完测试发一封外部邮件echo Relay test | mail -s Relay Test usergmail.com然后盯/var/log/maillogtail -f /var/log/maillog看到statussent就说明中继成功。5. 日常排障技巧要有一双能“看日志”的眼睛5.1 日志分析是运维的主线CentOS运维绕不开日志分析。很多人遇到问题习惯到处翻文档、问人但我的经验是——先看日志日志里90%的问题都能找到答案。Manual里我专门用一章讲日志排查方法这里分享几个实际操作中总结的技巧。技巧一养成先看journalctl和/var/log/messages的习惯journalctl -xe-x会附加解释告诉你每条日志大概是什么含义-e是跳到日志末尾查看最新记录。这是排查问题的第一把钥匙。技巧二针对特定服务的日志持续跟踪tail -f /var/log/maillog邮件服务、SSH、Nginx、MySQL都有独立日志跟踪时一定用tail -f实时观察别用cat读完就完了。技巧三用grep精准定位关键字grep -i error /var/log/messages | tail -20 grep -i fail /var/log/secure | tail -20实际排查中我会把日志先下载到本地再用编辑器里的正则搜索效率比在服务器上一条条翻高得多。5.2 常见问题速查表把群里和论坛里最高频的CentOS问题整理成一张表基本覆盖90%的日常故障现象排查命令最可能原因SSH连接慢systemd-analyze blameDNS反向解析问题/etc/ssh/sshd_config里UseDNS no系统负载高但CPU空闲top看D状态进程IO阻塞检查磁盘IOiostat -x 1内存不足OOMdmesggrep -i oom端口被占用netstat -tlnp | grep 端口上一次服务未正常退出磁盘满但du找不到大文件lsof | grep deleted有进程占用了已删除的文件yum安装报Cannot retrieve metalink检查源配置源地址失效换阿里云源Postfix启动失败journalctl -u postfix主配置语法错误postfix check验证cron任务不执行grep cron /var/log/croncrond服务未启动或脚本权限不对SELinux导致服务异常ausearch -m avc -ts recent布尔值或文件上下文配置错误DNS解析失败nslookup或dig/etc/resolv.conf配置错误或上游DNS故障这十类问题几乎覆盖了日常运维的绝大多数场景。每次遇到新问题我都会先在这张表里查一遍没有的话再深挖日志。这也是Manual价值所在——把分散在“经验”里的东西固化成表格所有人都能快速上手。5.3 一个实用的排查思路用排除法缩小范围排障的核心是“缩小范围”。我总结了一个简单的方法确认是硬件还是软件问题top看CPU/内存/IO如果硬件指标全正常基本锁定软件层。确认是系统还是应用问题systemctl status看服务状态全挂就查系统资源个别挂就查应用日志。确认是全局还是局部问题所有机器都有问题→基础架构问题单台机器有问题→这台机器的配置或资源问题。确认是新问题还是老问题回滚最近变更如果恢复说明是变更引入的这个方法在实操中非常有效。举个例子后来说Postfix发信失败我按这个思路锁定先看systemctl status postfix——服务正常再看journalctl -u postfix——报SASL authentication failed然后检查saslauthd——发现进程没起来启动后一切恢复。整个过程五分钟如果没有这套思路可能会先去检查网络、检查防火墙、检查DNS绕一大圈。6. 实战联动把初始化、扩容、邮件服务串起来6.1 一次真实的完整部署记录前面分章节讲了初始化、扩容、邮件服务但实际运维中它们往往是联动的。这里还原一次真实部署过程帮助你理解Manual在实际工作中长什么样。需求一台内网虚拟机CentOS 7.9磁盘初始50G需要部署一套内网SMTP服务用于接收监控系统的告警邮件并转发到外部邮箱。同时预测日志增长较快需要预留扩容方案。操作顺序初始化按第二章流程完成系统更新、时区、防火墙、主机名配置。扩容预规划执行lsblk确认磁盘布局发现根分区在LVM卷组里还有20G未分配空间记录在案暂时不扩。邮件服务部署按第四章流程安装Postfix配置mynetworks为192.168.1.0/24接收内网告警邮件同时配置relayhost转发到外部邮箱。扩容操作一周后df -h显示根分区使用率已达75%按第三章流程用lvextend -L 20G和xfs_growfs /完成在线扩容。整个流程中我坚持一个原则每一步操作前必须备份配置每完成一步就验证一次。备份的粒度可以根据风险程度调整——改main.cf前先cp一份扩容分区前先vgdisplay确认再动手。6.2 关于Manual的版本管理与维护最后聊聊Manual本身的维护。我见过不少团队的文档写了一版就再也不更新半年后里面全是过期命令。我的做法是每次操作后把新经验写回Manual哪怕只是一句话。比如“扩容前记得先执行sync”这类细节通常不会出现在官方文档里但对后来者价值极大。为每个章节设置“最后更新时间”超过三个月没有更新就提醒review。把典型排障案例添加进速查表表格是我认为Manual里最实用的部分因为它能让新人在30秒内定位到问题方向。回到“CentOS Manual”本身它不是一个静态的文档集合而是一个持续演进的操作知识库。写它本质上是在跟过去的自己对话——把踩过的坑、验证过的步骤、优化过的方案记录下来让下一个接手的人少走弯路。我个人体会最深的一点是文档写得再好不如自己亲手操作一遍。只有当你真正在虚拟机里从头到尾跑通“初始化—扩容—部署邮件服务”这套流程理解每条命令背后的意图这份Manual才真正属于你。这也是我写这篇文章的初衷把最核心的流程讲清楚剩下的细节需要你在自己的机器上一点点验证、补充最终形成属于你自己的CentOS手册。
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进