Skip to content

系统初始化与目录结构

拿到一台新机器(物理机、虚拟机、云主机都一样),上来就开始装服务其实挺危险的,因为默认状态下这台机器有几个雷你不知道:主机名是 localhost,多台机器混在一起分不清谁是谁;时区是 UTC,日志时间跟你本地时间差 8 小时;系统版本和内核版本不确认,装软件时选错包格式(把 yum 包往 Ubuntu 上装);目录结构不熟,出问题不知道去哪找日志和配置。

系统初始化说人话就是:在装业务之前,先把机器拉到一个统一的基准线上——版本明确、时钟同步、主机名有含义、目录结构心里有数。后面真出事的时候,排查第一步永远是先确认环境信息,这些基础数据比任何高级诊断工具都用得早。

一、发行版识别

Linux 服务器常见的发行版大致分两个系列,命令有差异。最直接的影响就是装软件——RHEL 系用 yum/dnf,Debian 系用 apt,装错了直接报命令找不到。

系列常见发行版包管理服务管理
RHEL 系RHEL、CentOS、Rocky、AlmaLinuxrpm / yum / dnfsystemd
Debian 系Debian、Ubuntudpkg / aptsystemd

两边的服务管理现在都是 systemd,这点倒是统一了。但包管理命令不同,排查问题或者写自动化脚本的时候,要先确认是哪个系列。

查看当前系统版本信息:

bash
cat /etc/os-release   # 发行版名称、版本号
uname -a              # 内核版本、架构
hostnamectl           # 主机名、系统信息

/etc/os-release 是 freedesktop 规范的一部分,主流发行版都遵循,这个文件最靠谱。uname -a 看内核版本——有时候发行版一样但内核版本不同,某些命令的参数支持也不一样(比如老内核的 ip 命令选项少一些)。排查问题的时候,先把这两个命令的输出贴出来,后面的命令建议才能更准确,不然别人给你的命令可能根本跑不通。

二、登录身份与会话信息

ssh 登录一台新机器之后,先别急着敲别的,确认一下当前身份和登录来源——这是个好习惯,尤其是在共享环境里:

bash
whoami     # 当前登录的用户名
id         # uid、gid、所属组
w          # 当前在线用户及其操作
last -n 5  # 最近 5 条登录记录

id 的输出比 whoami 信息更全——除了用户名,还能看到 uid、gid 和附加组列表。排查权限问题时,光看用户名不够,要看组关系。比如某个用户能读某文件,可能不是因为他本人有权限,而是他所在的组有权限。

w 能看到当前有哪些用户在线、从哪个 IP 连进来的、正在执行什么命令。last 看历史登录记录。如果在新机器上发现不认识的登录来源(比如你人在北京,却看到来自陌生海外 IP 的登录),先别急着动手,把记录截图留证,再决定是踢掉、改密码还是上报安全团队。

三、主机名配置

主机名用来在服务器之间区分身份。默认状态下多台机器都叫 localhost,批量管理的时候完全是灾难——日志里全是 localhost,你根本分不清是哪台机器报的错。

bash
hostname                       # 查看当前主机名
hostnamectl status             # 查看完整的主机名信息
hostnamectl set-hostname web-01  # 设置新主机名

命名最好有个规范,比如 业务名-编号(web-01mysql-02redis-03),有的团队会在前面加环境标识(prod-web-01test-web-01)区分环境。具体用哪种格式看团队约定,重点是保持统一——别这台叫 web-01,那台叫 Web-2,第三台叫 production-webserver-3,那样后期维护会疯。

主机名改完之后,顺手检查一下 /etc/hosts 里有没有对应的解析记录。有些服务(比如 Kafka、MySQL 主从)启动时会拿主机名做反查,如果 /etc/hosts 里解析不了自己的主机名,启动可能就卡住或者报错。

四、时间和时区

系统时间不准会影响一大片东西:日志时间戳错乱(出了问题对不上时间线)、TLS 证书校验失败(时间差太多浏览器直接报证书无效)、定时任务在不该跑的时间跑了(凌晨三点的备份提前到晚上跑)、集群节点间时间偏差导致数据不一致(分布式系统对时钟敏感,偏差几秒就可能出问题)。

bash
timedatectl                        # 查看时区、NTP 状态、当前时间
timedatectl set-timezone Asia/Shanghai  # 设置时区

时间同步服务推荐用 chrony,比传统的 ntpd 同步更快、网络抖动恢复也更敏捷,现在基本是 RHEL 系的默认选择:

bash
# RHEL / CentOS / Rocky
yum install chrony -y
systemctl enable --now chronyd

# Ubuntu / Debian
apt install chrony -y
systemctl enable --now chrony

装完之后检查同步状态:

bash
chronyc sources -v     # 查看时间源列表和状态
chronyc tracking       # 查看当前同步的详细指标

chronyc sources -v 输出里,源前面带的符号有讲究:^* 表示这是当前正在使用的时间源,^+ 表示候选源(备选),^? 表示连不上。如果所有源前面都是 ^?,说明这台机器根本没成功连上任何 NTP 服务器,时间还在靠硬件时钟裸奔,这种状态下日志时间根本不可信。

容器环境有个特别容易踩的坑:容器默认继承宿主机的系统时间(时钟是一致的),但时区配置可能不一样。遇到过宿主机时区是 Asia/Shanghai,容器里 date 看时间也是对的,但应用日志打出来还是 UTC——因为容器内没设时区,JVM 或者应用按 UTC 算的。所以容器里要显式挂载或者设置时区(/etc/localtime 或者 TZ 环境变量),别假设它跟宿主机一致。

五、目录结构

Linux 的目录结构遵循 FHS(Filesystem Hierarchy Standard)规范。整个 FHS 不需要全背,但几个高频目录得心里有数,不然排查问题的时候找不到东西。

/etc 是配置文件的大本营。几乎所有系统和服务的配置都在这——改配置、备份配置、排查"为什么我改了配置不生效",都绕不开这个目录。Nginx 的 nginx.conf、SSH 的 sshd_config、网络的 ifcfg-* 全在这。

/var 存运行时数据,重点是 /var/log(日志)、/var/cache(缓存)、/var/lock(锁文件)。/var/log 是最容易满的目录,业务跑久了日志堆一堆,不做 logrotate 或者定期清理,某天磁盘就 100% 了,服务直接挂。

/opt/usr/local 经常搞混:/opt 一般放第三方或者独立的软件包(整包安装的那种),/usr/local 放手工编译安装的软件。实际操作里,运维习惯把自建服务放 /opt 下,再用软链接做版本管理,比如 /opt/myapp/opt/myapp-1.2.0

/proc/sys 是两个虚拟文件系统——不占磁盘空间,内容由内核运行时动态生成。排查问题时 /proc 特别有用:/proc/cpuinfo 看 CPU、/proc/meminfo 看内存、/proc/loadavg 看负载、/proc/PID/cmdline 看某个进程的完整启动命令。这些信息不存任何文件,是内核"现编"给你的。

/tmp 是临时目录。注意有些发行版配置了重启后清空 /tmp(通过 systemd-tmpfiles 或者 tmp.mount),所以重要的东西绝对不要长期放 /tmp,哪天机器一重启就没了。

常用目录速查:

目录装什么
/etc系统和服务配置文件
/var/log各类日志
/opt第三方软件包
/usr/local手工编译/部署的软件
/home普通用户家目录
/rootroot 用户家目录
/tmp临时文件(部分系统重启清空)
/proc内核和进程信息(虚拟)
/sys设备和内核对象(虚拟)
/dev设备文件(磁盘、终端等)

六、基础信息检查

下面这些命令都是只读的,不改任何东西,新机器到手可以放心跑一遍,把基础信息摸清楚:

bash
cat /etc/os-release   # 系统版本
uname -r              # 内核版本
hostnamectl           # 主机名和系统信息
timedatectl           # 时区和时间状态
ip addr               # 网卡和 IP
ip route              # 路由表
df -h                 # 磁盘使用情况
free -h               # 内存使用情况

这套信息也是交接机器、写资产文档时必须收集的基础资料。更完整的初始化基线配置(包括内核参数、limits、防火墙、日志这些)可以参考 系统初始化基线