1. 为什么现在还在折腾 CentOS 7环境选型与准备思路CentOS 7 虽然已经停更在 7.9 这个版本但在企业内部环境、教学场景和老项目维护里它依然是绕不开的一套系统。原因其实不复杂大量遗留项目、老旧中间件、老版本编译环境都是围绕 CentOS 7 的 glibc 版本和 systemd 体系跑起来的你贸然换成新系统可能一个 yum 装不上的包就能卡你一整天。所以这几年我给团队搭测试环境CentOS 7 的镜像和虚拟机模板一直是常备件装一次、打个快照后面复制克隆比每次重装省太多事。这篇文章我打算从头到尾捋一遍从镜像怎么选、虚拟机参数怎么定到分区怎么划、网络怎么调通再到本地 yum 源怎么建、systemd 服务怎么设、几个高频工具怎么配。它适合刚接触 CentOS 7 的新手照着抄作业也适合被老项目折磨、需要快速拉起一套能跑环境的同学。全文都是我自己踩过坑之后总结出来的做法参数和命令可以直接用但每一条背后的逻辑我也会讲清楚方便你按自己的环境灵活调整而不是死记硬背。1.1 镜像从哪来、怎么选才不浪费磁盘CentOS 7 停更之后官方已经把安装镜像挪到了归档仓库vault主流做法是直接去国内几家高校和企业维护的镜像站下载。下载之前先想清楚你要哪种镜像类型很多人一上来就下 Everything 版结果 10 个 G 下下来装完发现 90% 的包根本用不到。常见的几种镜像区别我整理成了一张表按需选就行镜像类型体积约适用场景Minimal900MB 左右服务器、测试机系统干净后续按需装包DVD4.5GB 左右需要常用软件包或网络不稳想离线装Everything10GB 左右要全量软件包常用于搭建内网本地源LiveGNOME1.4GB 左右想先体验桌面环境再决定装不装NetInstall500MB 左右网络稳定装的时候在线拉包我的习惯是做服务器模板一律用 Minimal需要图形界面就用 DVD 或 LiveGNOME。给内网做离线源的时候才会用 Everything因为本地源要尽量全。另外提醒一句下载完一定要核对一下校验值镜像站偶尔会有下载不完整的情况装到一半报错才发现就白折腾了。1.2 虚拟机参数怎么定别凭感觉拍脑袋用 VMware 或类似的虚拟化软件建虚拟机时很多人是随手填参数结果跑起来卡得难受。我一般按用途给一个区间CPU 给 2 核起步内存最小 2GB、推荐 4GB磁盘 40GB 用精简置备。之所以内存不建议低于 2GB是因为 systemd 本身加上一个 yum 操作就吃掉大几百兆剩下不到 1GB 的话你连编译个小程序都可能被 OOM 杀掉。磁盘我习惯用精简置备而不是预分配好处是初期占物理空间小、克隆快坏处是磁盘会随使用慢慢涨。虚拟机网络模式先别急着定这个放到第 3 章专门讲因为它和你能不能上网、能不能被局域网其他机器访问直接相关。新建虚拟机时先把 ISO 挂上勾选“启动时连接”然后开机。2. 安装过程里那些被忽略的关键选项真正装系统的过程其实很快二十分钟左右但有几个选项一旦选错后面补起来很麻烦所以这一步我从来不敢一路点“下一步”。2.1 分区方案自动还是手动这题有标准答案安装界面里的“安装位置”那一步默认是自动分区但我不推荐生产或测试模板用自动。自动分区最大的问题是它会默认做个 LVM然后/和/home分配得很随意时间长了/很容易被日志撑满而/home却空着。手动分区更可控我的分法是这样的挂载点建议大小说明/boot512MB ~ 1GB存放内核和引导不用太大swap内存的 1~2 倍内存 ≥16GB 时给 8GB 即可交换分区内存大时不必给满/剩余全部根分区日志、软件都在这/home视情况可合并进 /有独立数据需求时才拆出来关于 swap 给多少网上有“内存的两倍”这种老说法那是机械盘时代内存只有几百兆的经验。现在内存动辄 8GB、16GBswap 给到内存 1~2 倍纯属浪费磁盘我一般内存小于 8GB 给 2 倍大于 8GB 就给 4~8GB够用。文件系统默认 XFS 就行CentOS 7 的默认也是 XFS性能稳定。分区的时候记得选“标准分区”而不是 LVM除非你明确需要在线扩容。LVM 灵活但多层结构对新手不友好出问题时排查更绕。2.2 首次启动后的三件事改语言、改密码、打快照系统装完重启第一次登录进去我固定做三件事。第一是设置中文环境因为看英文报错信息对新手不友好命令是yum install -y langpacks-zh_CNMinimal 版默认没装然后编辑/etc/locale.conf把LANG改成zh_CN.UTF-8localectl set-locale LANGzh_CN.UTF-8更直接。改完重新登录生效。第二是确认 root 密码策略安装时设的密码如果太弱会在首次登录后提示。如果忘了密码也有办法救开机在 GRUB 界面按e进入编辑在linux16那行末尾加rd.break进入紧急模式后重新挂载、用passwd改 root 密码最后touch /.autorelabel重启。这个技巧我在第 5 章还会再细说一遍完整步骤。第三也是最重要的一步——打快照。刚装完、没做任何配置的时候打一个“纯净快照”后面无论怎么折腾一把回滚就回来了。很多人是配置乱了才想起快照那时候已经晚了。虚拟机管理界面里选“快照 → 拍摄快照”命名成install-clean之类三十秒的事。3. 网络配置静态 IP、DNS 与连通性分层排查网络这一块是新手最容易卡住的地方也是我最常被问的。CentOS 7 默认网卡可能不会自动启动装完发现上没有网、ping 不通其实很多时候只是网卡没起来。这一章我把配置写法和排查顺序都讲透。3.1 网卡命名与 ifcfg 文件的写法CentOS 7 开始网卡命名变成了ens33、ens160这种可预测命名而不是老的eth0。先执行ip addr或nmcli device status看看你的网卡名是什么后面的配置都要对应这个名字。网卡配置文件在/etc/sysconfig/network-scripts/目录下比如ifcfg-ens33用静态 IP 的写法大概是这样TYPEEthernet BOOTPROTOstatic NAMEens33 DEVICEens33 ONBOOTyes IPADDR192.168.10.100 PREFIX24 GATEWAY192.168.10.2 DNS1223.5.5.5 DNS2114.114.114.114几个关键点必须解释清楚。ONBOOTyes决定开机是否自动启用网卡默认是no这就是为什么很多人装完没网——不是配错了是根本没启用。BOOTPROTOstatic表示静态地址如果你用的是 DHCP 就写dhcp并且不需要 IPADDR 那几行。PREFIX24是子网掩码长度等价于NETMASK255.255.255.0二选一即可。改完文件不会立刻生效要重启网络服务systemctl restart network或者nmcli connection reload nmcli connection up ens33。我一般直接用systemctl restart network简单粗暴。生效后用ip addr show ens33确认 IP 已经带上。3.2 三种网络模式怎么选NAT、桥接、仅主机虚拟机网络模式这块选错了会导致“主机能上、虚拟机不能上”或者“虚拟机 IP 变了”这类玄学问题。三种主流模式的区别我用一张表说清楚模式虚拟机能否上外网主机能否访问虚拟机局域网其他机器能否访问典型用途NAT可以可以默认不行单机测试、只想能上网桥接可以可以可以需要被局域网访问、搭服务仅主机不行可以不行完全隔离的内网实验我自己的习惯单纯学命令、装软件用 NAT 最省事IP 冲突概率低要搭建一个让同事能访问的测试服务用桥接虚拟机相当于局域网里一台独立机器IP 要跟物理机同网段做内网隔离实验就选仅主机。要注意桥接下虚拟机 IP 是从你真实路由器拿的跟物理机抢地址所以别设成和物理机冲突的静态 IP。3.3 连不上网按这四层顺序排查遇到“配了静态 IP 但上不了网”不要东试西试按从底到顶的顺序查效率最高。第一层看网卡有没有起来、IP 在不在ip addr。如果发现网卡状态是DOWN先ip link set ens33 up或者检查ONBOOT。第二层看能不能通网关ping 192.168.10.2换成你自己的网关。通不了说明 IP 段、网关或虚拟网络本身有问题检查虚拟机的虚拟网络编辑器。第三层看能不能通公网 IPping 223.5.5.5。能通网关但通不了这个通常是网关或宿主机网络的问题。第四层看能不能解析域名ping www.baidu.com。如果前三层都通、只有第四层不通那基本就是 DNS 的问题检查/etc/resolv.conf里有没有正确的 nameserver或者 ifcfg 里 DNS1 有没有配。这里有个坑要提醒你如果手动改过/etc/resolv.conf重启网络或者重启系统后可能被覆盖因为 CentOS 7 下这个文件经常是被 NetworkManager 或 network 服务动态生成的所以正确做法是把 DNS 写在 ifcfg 文件里而不是直接改 resolv.conf。还有个特别常见的坑是防火墙。CentOS 7 默认开着 firewalld你服务起不来、端口不通先别怀疑配置systemctl status firewalld看一眼。测试阶段我一般systemctl stop firewalld systemctl disable firewalld关掉生产环境则用firewall-cmd按需放行端口比如firewall-cmd --permanent --add-port8080/tcp firewall-cmd --reload。注意装完系统就顺手确认防火墙和 SELinux 状态getenforce这两个是排查服务不通时的头号嫌疑人很多人折腾半天的“端口不通”其实是它们拦的。测试环境可以临时setenforce 0但生产务必按策略配置别一关了之。4. 把环境调到能干活软件源与常用工具系统能上网之后接下来就是把它变成一个真正能干活的环境。这一步的核心是搞定 yum 源因为 CentOS 7 停更后默认源地址很多已经失效不换源你连个 vim 都装不了。4.1 yum 源在线换国内源 离线本地源在线换源是必做项。默认的CentOS-Base.repo指向的地址在停更后基本不可用了换成国内镜像站最稳。做法是先备份原文件然后下载对应版本的 repo 文件覆盖最后yum clean all yum makecache重建缓存。缓存重建成功后装包速度会明显不一样。这里有个细节换源后如果makecache报错说找不到仓库大概率是 repo 文件里的baseurl和你系统版本不匹配用cat /etc/redhat-release先确认版本号再选源。离线环境或者内网机器靠在线源是不行的这时候要建本地 yum 源。思路很简单把 Everything 或 DVD 镜像挂载到本地然后写一个指向它的 repo 文件。命令大概是这样mkdir -p /mnt/cdrom mount -o loop /root/CentOS-7-x86_64-DVD.iso /mnt/cdrom然后新建/etc/yum.repos.d/local.repo[local] nameLocal CentOS 7 baseurlfile:///mnt/cdrom enabled1 gpgcheck0gpgcheck0是图省事跳过签名校验内网自用没问题但如果你在意完整性可以把镜像里的 GPG key 导入并开启校验。要做成一个永久的本地源还得把挂载写进/etc/fstab否则重启后挂载就没了yum会报找不到源。写成CentOS-7-x86_64-DVD.iso /mnt/cdrom iso9660 loop 0 0这一行就行。4.2 几个高频工具的安装与配置环境搭好之后下面这几个工具我基本上每次都会装属于“装了不亏”系列。第一个是sshpass用于带密码的批量 ssh 或 scp脚本化运维时特别方便。安装命令是yum install -y sshpass用的时候形如sshpass -p 你的密码 ssh userhost。提醒一句密码写在命令行会留在 history 里可以用-f从文件读或者用完清理 history安全性更好。第二个是certbot给站点申请和管理 TLS 证书。CentOS 7 上老版本的 certbot 包比较旧现在更推荐用 snap 安装或者用 pip 装到虚拟环境里避免污染系统 Python。申请证书的典型命令是certbot certonly --webroot -w /var/www/html -d example.com走 webroot 验证不影响现有服务。证书自动续期靠certbot renew配合 crontab 定时跑就行。第三个是docker 升级。CentOS 7 自带的 docker 包版本很老要装新版本得先卸载旧包再配置 docker-ce 的软件源然后安装。核心步骤是yum remove docker docker-client docker-common清掉旧版导入官方 docker-ce 源yum install -y docker-ce最后systemctl enable --now docker。这里有个坑卸载的时候别用yum remove docker之外的模糊匹配也别把依赖 containerd 一起误删删之前先rpm -qa | grep docker看清楚装了哪些包。4.3 systemd 开机自启服务比 init 脚本省心CentOS 7 用的是 systemd取代了老的 SysV init。给一个自研程序设置开机自启最规范的做法是写一个 unit 文件放到/etc/systemd/system/比如myapp.service[Unit] DescriptionMy App Service Afternetwork.target [Service] Typesimple ExecStart/opt/myapp/start.sh Restarton-failure Userroot [Service] 段里 Restarton-failure 表示进程挂了会自动拉起然后是[Install]段[Install] WantedBymulti-user.target写完之后三步走systemctl daemon-reload重载配置systemctl enable myapp设为开机自启systemctl start myapp立即启动。用systemctl status myapp看状态journalctl -u myapp -f看日志。相比老的chkconfig加 init 脚本systemd 的 unit 文件声明式、可读性强日志还统一归到 journalctl排查起来顺手很多。这套东西如果你装过 docker、nginx其实它们的服务就是这么管的理解一个就理解一片。5. 快照、克隆与常见问题速查环境搭好不代表万事大吉日常运维里真正花时间的是排障。这一章我把高频问题和对应的处理思路整理出来都是实际遇到过、能直接抄的。5.1 快照与克隆的正确姿势虚拟机的快照和克隆是我用得最多的两个功能但用法上有讲究。快照不是备份它是磁盘某一时刻的状态记录长期挂着大量快照会拖慢虚拟机性能所以我的习惯是关键节点打一次快照确认后续稳定之后就删掉旧快照只保留最近一两层。比如装完系统、调好网络、装好环境各打一个之后就把前面的删了。克隆分“完整克隆”和“链接克隆”两种。完整克隆独立、占空间适合给别人分发模板链接克隆共享父盘、省空间适合我自己快速开一排测试机。这里有个几乎人人踩过的坑克隆出来的机器 MAC 地址会变如果你当初配了固定网卡名和静态 IP克隆后网卡可能变成 ens34、ens35导致没网。解决办法是克隆后重新确认网卡名、更新 ifcfg 文件或者干脆在克隆前把网卡配置文件清理成 DHCP 状态。5.2 常见问题速查表下面这张表是我自己排障时用得最多的一份速查列出来方便你对照现象大概率原因处理思路装完系统无网络网卡未启用检查 ifcfg 里 ONBOOT 是否为 yes配了静态 IP 上不了外网网关/DNS 没配对先 ping 网关再 ping 公共 DNS最后查 resolv.conf能 ping 通 IP 但解析不了域名DNS 问题把 DNS 写进 ifcfg 而非直接改 resolv.confyum 装包报找不到仓库源地址失效或版本不匹配换国内源确认 redhat-release 版本服务端口不通防火墙或 SELinux 拦截临时测试关 firewalld检查 getenforce忘了 root 密码密码丢失GRUB 加 rd.break 进紧急模式重置克隆后没网网卡名变化确认新网卡名重建 ifcfg 配置开机服务不自启未 enablesystemctl enable 服务名并 daemon-reload补充一个忘记密码的完整实操因为问的人实在太多了。开机在 GRUB 菜单选中内核那一项按e进入编辑模式找到以linux16开头的那一行在行尾加一个空格再加rd.break然后按CtrlX启动。系统会进入紧急 shell这时根文件系统是只读挂载在/sysroot上的依次执行mount -o remount,rw /sysrootchroot /sysrootpasswd root输入新密码然后touch /.autorelabel这一步很关键让 SELinux 重新打标签否则改完密码可能进不了系统最后exit两次重启。整个过程两三分钟比重装快得多。注意touch /.autorelabel之后首次重启会花较长时间做标签重建屏幕可能看起来像卡住了别急着断电等它跑完就行。5.3 一点个人体会最后说点在职场上摸爬滚打出来的感受。我装 CentOS 7 这么多年最大的心得就是环境一定要模板化、快照化别每次现装现配。一套调通的模板配好静态 IP 规则、换好源、装好常用工具、关掉用不上的服务能省下的时间远超搭它花的时间。另外遇到问题先停下来想“是哪一层出了问题”从网络到文件系统到服务分层去查比漫无目的地试命令快十倍。老系统之所以还在用不是因为不想换而是因为换的成本和风险摆在那儿能把它维护得稳、维护得清楚本身就是一门实打实的手艺。这套流程你照着走一遍后面再遇到新的老环境心里就有底了。