公司里每次来一台新机器,最烦的就是那些重复到让人麻木的初始化操作。装系统、改主机名、配 yum 源、关防火墙、调内核参数、装 JDK、装 Docker……一套流程走下来,少说半小时,多则一小时,中间还容易漏掉一两个细节。后来我索性把整个初始化流程写成了一个 CentOS 7 初始化脚本,一条命令跑完,干净利落。这篇文章就把这个脚本的思路、完整实现、踩坑记录都摊开来讲,希望能给同样被重复劳动折磨的运维和开发同学一点参考。
这个脚本适合谁?适合所有需要批量维护 CentOS 7 机器的同学,不管你是运维、后端开发还是刚入门的 Linux 新手。你不需要精通 Shell,脚本拿到手改几个变量就能用,但我会把关键逻辑也讲清楚,让你敢改、会改、改完不慌。这里我默认你手上是一台刚装好最小化系统的 CentOS 7 机器,架构是 x86_64,有 root 权限,网络能通外网。
1. 内容整体设计与思路拆解
1.1 为什么偏偏要给初始化写脚本
CentOS 7 的初始化操作看起来不难,每一项单独拎出来都有现成命令,难的是“每一项都要做、顺序不能乱、漏了不好查”。举个例子,如果你不先把 SELinux 关掉就急着装 Docker,后面容器起不来你八成会先怀疑 Docker 装错了,排查半天才发现是 SELinux 拦截。再比如防火墙默认 zone 的配置,不同版本的系统默认网卡叫法还不一样,有的是 eth0,有的是 ens33,脚本里就得做动态判断。
写脚本还有一个更实际的考虑:人记不住那么细。就算你经验丰富,每次手动敲命令,总有那么一两次会漏掉内核参数没改,或者忘记同步时间。我踩过一次坑,新机器没有配置时间同步,日志时间漂移,排查线上问题的时候对不上时间戳,折腾到半夜。把初始化脚本化之后,至少每台机器的基础配置是一致的,这就是“可复现”的价值。
另外,脚本能帮你省下大量重复劳动。公司一次采购 10 台机器,手动一台一台配置,弄到第三台就开始烦躁,后面效率明显下降。我用脚本批量跑,10 台机器铺开同时配置,半小时内全部搞定,还能自动输出每台机器的执行日志,谁成功谁失败一目了然。
1.2 模块划分:先想清楚再动手
写这个脚本之前,我先把初始化需要做的事按模块拆了一遍,避免想到哪写到哪。模块划分大概是这样:
- 前置检查:确认系统是 CentOS 7、有 root 权限、磁盘空间足够、网络通。
- 基础配置:主机名、时区、时间同步、DNS 解析。
- 软件源配置:备份并替换 yum 源为国内镜像,安装 EPEL 源和常用工具。
- 安全加固:SELinux、防火墙、SSH 配置、创建普通用户并配置免密登录。
- 内核与性能调优:修改文件句柄数、TCP 内核参数、关闭不必要的服务。
- 运行环境:安装 JDK、Docker、Python、Git 等与具体业务相关的组件。
这个划分不是拍脑袋定的,而是按“先环境后应用、先系统后服务”的顺序。比如时间同步必须放在前面,不然后面编译安装软件时时间戳不对会引发各种奇怪问题。yum 源也要尽量靠前,因为后续绝大多数软件都依赖它。
脚本里的每个函数对应一个模块,主流程只负责按顺序调用。这样有个明显好处:你不需要我的业务场景,可以直接删掉不需要的模块;或者你自己想加一个模块,比如安装 Nginx,只需要再写一个 install_nginx 函数,在主流程里加上一行调用就行,其他部分不用动。
1.3 设计原则:幂等性、可追溯、可重跑
我在写脚本时给自己定了几条军规,第一条就是脚本必须幂等。所谓幂等,就是同一台机器上跑两遍、三遍,结果都是一样的,不会因为重复执行而出问题。比如添加用户前先判断用户是否存在,配置文件修改前先做备份,软件已安装就跳过安装步骤。这些细节让脚本可以安全地反复执行,重跑不会把机器搞坏。
第二条是日志要完整。脚本里每一步操作都写日志,包括时间、操作内容、执行结果。日志文件统一放在 /var/log/centos7-init.log,执行完后我可以 grep 这个文件快速定位失败点。给机器最多的就是时间,日志留痕能让你在出问题时很快知道这台机器当初是怎么配置的。
第三条是变量要收敛。脚本里所有可变的配置项,比如主机名、DNS 服务器地址、要安装的 JDK 版本、Docker 镜像加速地址,都集中放在脚本开头的配置区。跑的时候改配置区,不要改函数体。这样做的好处显而易见:你接手别人的脚本时,不需要读懂每个函数,看一眼配置区就知道这台机器会被配置成什么样。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 核心细节解析与实操要点
2.1 前置检查:别让脚本跑了一半才报错
脚本刚开始的前置检查是个“快速失败”机制,目的是尽早发现问题,而不是让脚本跑了一多半才报错,留下一个半配置状态的系统。这个环节我主要检查三件事:操作系统版本、当前用户权限、网络连通性。
操作系统版本检查不能只靠 cat /etc/redhat-release,因为有些发行版会伪装成 CentOS。我用的是 grep -qi "CentOS" /etc/redhat-release && rpm -q centos-release 双保险,确保系统确实是 CentOS 7。网络检查用 curl -sI http://mirrors.aliyun.com 探测,能通才继续往下走,否则提示配置网络后重新运行。
这里有一个容易忽略的点:脚本里很多操作需要 root 权限,但并不是每个人都会用 root 登录。我在脚本开头用 [ "$(id -u)" -eq 0 ] 判断当前用户 ID,如果不是 0 就提示用 sudo 执行或者切换到 root,然后退出。别小看这个检查,没有了它,脚本可能在中途因为权限不足而输出一堆晦涩的错误信息,新手根本看不明白怎么回事。
磁盘空间检查也值得做。初始化时要安装的软件、拉取的镜像、编译的临时文件都会占用空间,如果根分区只有 5GB,装完基础环境大概率就满了。我用 df -P / | awk 'NR==2 {print $4}' 取根分区剩余空间,小于 2GB 直接退出,并给出清理建议。
2.2 配置 yum 源:换不换镜像,体验差距极大
CentOS 7 默认的 yum 源在公网环境下速度慢得让人崩溃,尤其是安装 Docker、GCC 这类大的依赖树时。我一般直接把 yum 源替换成阿里云镜像,顺手把 EPEL 源也换上。EPEL 是 Extra Packages for Enterprise Linux 的缩写,里面有大量 CentOS 官方源没有的软件包,比如 htop、jq、sshpass 这些运维常用工具。
这里有个细节:替换源之前必须先备份。我习惯把原始 repo 文件复制到一个 backup 目录,命名加上时间戳。这样万一新源的仓库配置有问题,可以一键还原。备份命令就是 mkdir -p /etc/yum.repos.d/backup && cp /etc/yum.repos.d/*.repo /etc/yum.repos.d/backup/。
替换源之后必须清理并重建缓存。这个步骤很多人会忘记,直
