Linux 服务器这个东西,网上的教程一搜一大把,但大多要么是零散的命令堆砌,要么是上来就甩内核源码,看得人一头雾水。我带过不少新人,也接手过各种奇奇怪怪的线上问题,最深的感觉是:基础知识扎实的人,遇到故障不会慌,因为他知道系统底层是怎么跑的;反之,只会背命令的人,换个环境就抓瞎。这篇文章我想把关于 linux 服务器的核心基础和工作原理系统串一遍,从“它是个什么东西”讲到“日常怎么维护”,再讲到“出了问题怎么排查”,最后附上我的初始化清单和踩坑心得。无论你是刚准备入行运维,还是从开发转过来想了解服务器部署,又或者是用云服务器搭过服务但没深究过原理的人,这篇内容都能帮你把知识框架补完整。
文中聊的不会绑定某个特定发行版。你用的是 CentOS、Ubuntu、Debian 还是 openEuler、统信 UOS,核心思路都相通,命令稍有差异我会特意点出来。
1. Linux 服务器的定位与运行模型
很多新人第一个困惑是:Linux 服务器和普通电脑上的 Windows 到底差在哪?这个问题如果只从“界面不同”去理解,后面学什么都别扭。我更喜欢从两个角度切入:文件模型和权限模型。
1.1 “一切皆文件”到底怎么理解
Linux 最基础的设计哲学,就是“一切皆文件”。这句话听着像口号,但确实整个系统都建立在这个抽象之上。普通文件是文件,目录是文件,硬盘、U 盘是设备文件,甚至正在运行的进程、内核里的参数、硬件信息,都被映射成了文件。
举个例子。你想看 CPU 信息,不用装任何软件,直接执行:
cat /proc/cpuinfo想看内存信息:
cat /proc/meminfo这些 /proc 下面的内容,本质上是内核暴露出来的虚拟文件。这里的“文件”不是一个躺在硬盘上的实体文件,而是内核提供的一个“接口”,你读它,得到的是系统实时数据。这就是为什么 Linux 运维里,很多操作最后都能归结为“读写文件”。配置文件是文本,日志是文本,硬件信息也是文本。
你用 ls 查看设备时,会看到 /dev/sda、/dev/nvme0n1 这样的设备文件。往这些文件里写数据,就是在往磁盘写数据;从里面读数据,就是在读磁盘。图形界面里的“磁盘”和“U 盘”,在命令行底层其实就是这些设备文件。明白了这一点,你再看管道符(|)和重定向(>)就会觉得很自然——既然进程和文件都是文件,那么把一个程序的输出“喂”给另一个程序的输入,本质就是文件流之间的搬运。
理解“一切皆文件”还有一个好处:排查问题的时候,你会习惯先去 /proc、/sys、/dev 这些地方找线索,而不是瞎猜。比如网卡丢包,你可以看 /proc/net/dev;内核报错,可以看 /proc/kmsg。系统对你来说是“透明”的,这就是 Linux 服务器适合做后端的原因之一。
1.2 内核态与用户态:命令背后发生了什么
光知道“一切皆文件”还不够,你还得明白权限边界在哪里。Linux 把运行状态分成内核态和用户态。内核态是最高权限,可以直接操作 CPU、内存、磁盘、网卡这些硬件资源;用户态是普通程序运行的地方,没有权限直接碰硬件。
那普通程序怎么访问磁盘?必须通过系统调用(syscall)。比如你用 cp 拷贝文件,cp 本身是用户态进程,它没办法自己控制磁盘读写,于是向内核发起一个 write 系统调用,内核去操作硬件,把结果返回给 cp。这个“用户态到内核态”的切换是操作系统稳定性的关键。用户程序出bug崩溃,最多就是自己的进程挂了,不会把整个系统搞死;如果每个程序都能直接写内核,一台机器上有一个程序乱来,整个服务器就等着重启吧。
系统调用对小白来说可能比较抽象,我经常用一个比喻。内核就像酒店的前台,用户程序是住客。住客想打扫房间、订餐、借吹风机,都不能自己跑去仓库拿,而是给前台打电话,由前台安排。这个“打电话”就是系统调用。好处是统一管理,安全可控,也方便记账。shell 命令、编程语言里的文件操作函数,兜兜转转最后都会变成系统调用。
你还会经常听说“systemd”这个词。它其实是 Linux 系统里的 1 号进程,是所有用户态进程的老祖宗。系统启动时内核起完身后,会把控制权交给 systemd,由它拉起各种服务,比如 sshd、nginx、mysqld。这也是 Linux 服务器开机后“能看到一个登录界面”和“看不到任何窗口”都能正常运行的原理。服务器上没有显示器,不代表它没工作,它所有的“界面”都体现在网络端口、配置文件、进程列表和日志里。
2. 基础操作与日常维护
原理讲完就该上手了。Linux 服务器的日常维护,本质上就是“看状态、改配置、起服务、查日志”。下面我把最常用、最关键的内容按场景整理出来。
2.1 目录结构记忆法:别背,靠理解
Linux 的目录结构有一堆约定,但真正要重点记的就几个。根目录 / 是整个文件系统的大树根;/etc 放配置文件,比如网卡配置、DNS 配置、服务配置;/var/log 放日志;/home 是普通用户的家目录;/root 是管理员的家目录;/tmp 是临时文件;/usr 类似 Windows 的 Program Files,装的大部分软件都在这里。
最容易搞混的是 /bin、/sbin、/usr/bin 这些。现在很多发行版把它们都软链接到了 /usr/bin,你没必要死记。关键要知道 /sbin 或 /usr/sbin 里面的命令通常是管理员才能用的,比如 iptables、fdisk。普通用户的 PATH 里默认不包含这些目录,所以刚用 sudo 的时候会碰到明明安装了命令却提示找不到的情况,先排查一下 PATH 是正经事。
还有一个经常被忽略的目录是 /run。很多服务运行时生成的套接字文件、进程 ID 文件(pid 文件)都在这里。比如 nginx 的 pid 文件可能是 /run/nginx.pid,如果你手动杀掉了 nginx 进程,但 pid 文件还在,启动时可能报错“Address already in use”或者“pid file exists”。这时候删掉 /run 下面对应的 pid 文件再启动即可。
目录结构这块还涉及“挂载”的概念。Linux 里不像 Windows 那样用盘符,而是把一块硬盘“挂”到某个目录上。比如 /dev/sdb1 这块分区,你把它挂载到 /data 目录,之后往 /data 里写文件,就是写到这块盘里了。查看目前挂载情况用 df -h 或者 findmnt。理解挂载,后面理解磁盘扩容和 LVM 会轻松一点。
2.2 必须掌握的常用命令清单
命令是工具,不是目的。我推荐按“场景”记命令,而不是按字母表背“大全”。以下这几个场景是日常使用频率最高的:
# 文件与目录操作 ls -lhtr # 按时间倒序/正序排,注意 -r 可以反转 cd /var/log && pwd # 切换目录并确认当前位置 cp -a src dst # 保留属性拷贝 mv old new # 移动或重命名 rm -rf /path # 删除目录(慎用!见下文踩坑) find /etc -name "*.conf" # 按名查找文件 grep -rn "keyword" /etc # 按内容递归查找# 查看系统状态 top 或 htop # 看进程、CPU、内存 ps -ef | grep nginx # 看某个进程是否存在 free -h # 看内存和 swap df -h # 看磁盘剩余空间 du -sh /var/log/* # 看某个目录占用多大 ss -lntp # 查看监听端口和对应进程 uptime # 看负载和运行时长 dmesg | tail # 看内核环形缓冲区最近的日志# 网络排查 ip addr # 查看网卡 IP ip route # 查看路由表 ping -c 4 8.8.8.8 # 测试三层连通性 telnet 10.0.0.1 22 # 测试端口连通性(没有就装 telnet 或 nc) curl -v http://127.0.0.1 # 测试本地 HTTP 服务 traceroute <host> # 查看路径经过的路由节点# 服务管理(systemd 系列) systemctl status nginx # 查看服务状态 systemctl start|stop|restart nginx systemctl enable --now nginx # 设置开机自启并立刻启动 systemctl daemon-reload # 改了 unit 文件后重载 journalctl -u nginx -f # 跟踪服务日志上面这些命令基本可以应对 80% 的日常操作。我的建议是不要贪多,先把这些用熟,等遇到具体需求时再查对应工具。比如要排查磁盘 IO 再用 iostat,要看网卡流量再用 nload,这些属于“用到再学”型命令。
2.3 用户与权限:管理员的必修课
Linux 是典型的多用户系统。服务器的每个服务、每个运维人员都应该用独立的账号,而不是全拿 root 裸奔。新建用户的命令并不复杂:
useradd -m -s /bin/bash zhangsan # 创建用户并创建家目录,指定 shell passwd zhangsan # 设置密码 usermod -aG wheel zhangsan # CentOS/RHEL 将用户加入 wheel 组 # Ubuntu 下是 usermod -aG sudo zhangsan为什么强调用独立用户?因为权限模型一旦被破坏,系统隔离就形同虚设。文件权限分三段:属主(u)、属组(g)、其他(o),每段有读 r=4、写 w=2、执行 x=1。比如 644 表示属主可读写、属组和其他人只读。755 表示属主可读写执行,其他人可读可执行。改权限用 chmod,改属主用 chown。
新手最容易犯的错就是图省事执行chmod -R 777 /某个目录。这样做虽然临时解决了权限导致的报错,但等于把目录完全敞开,任何用户都能改动。如果这个目录里是网站代码,那任何能登录服务器的用户都能改你的网页;如果里面有敏感配置,那就更危险。正规做法是:明确这个目录归哪个用户管、哪个组管,然后给最小必要权限。举个例子,nginx 运行用户是 nginx,网站代码目录让 nginx 用户可读就够了,写操作只针对 upload 目录单独放开。
还有两个特殊权限值得知道:setuid(4)和 setgid(2)。最经典的例子是 /usr/bin/passwd。普通用户改密码时,需要写 /etc/shadow 这个只有 root 才能写的文件。passwd 命令加了 setuid 位,使得普通用户执行它时能临时以 root 身份运行。查看方法:
ls -l /usr/bin/passwd # -rwsr-xr-x 1 root root ...那个 s 就是 setuid 标志。这种权限非常敏感,线上环境如果发现某些二进制文件被加了奇怪的 setuid 位,通常意味着被入侵,要重点排查。
3. 网络与服务:服务器对外提供能力的核心
服务器和普通电脑最大的区别在于它要持续对外提供服务。网络配置、SSH 远程管理、时间同步、DNS 解析,这些看似基础的东西,恰恰是线上故障高发区。
3.1 网络配置与连通性排查:从本机到公网
新装好的 Linux 服务器通常没有图形界面,网络配置全靠改文件或命令行。不同发行版的配置文件路径不一样:CentOS/RHEL 用 /etc/sysconfig/network-scripts/ifcfg-eth0,当然新版本 NetworkManager 会用 /etc/NetworkManager/system-connections/;Ubuntu 用 netplan 的 YAML 文件(/etc/netplan/*.yaml)。不管格式怎么变,核心就是三件套:IP 地址、子网掩码、网关。
配完 IP 后,先检查一下有没有生效:
ip addr show ping -c 3 <网关IP>如果有 IP 但网关不通,多半是子网掩码选错了,或者物理链路的问题。如果本机网关通、但外网不通,接着用nslookup或dig看 DNS 能不能解析域名。如果解析不了,查 /etc/resolv.conf:
cat /etc/resolv.conf # nameserver 8.8.8.8这里提一个常见坑:很多系统装好后 /etc/resolv.conf 是空文件,或者被 systemd-resolved 接管,直接编辑它重启后又被覆盖。解决办法要么是修改 NetworkManager 或 netplan 里的 DNS 配置,要么是使用resolvectl命令来管理。
按“从底向上”的排查思路:通不通先 ping IP,再 ping 域名,再 telnet 端口。很多同事一上来就 curl 一个地址,失败后就懵了。其实你只要分层测,很快能定位到是网卡、路由、DNS 还是防火墙的问题。比如域名不通但 IP 通,那就是 DNS;IP 通但端口连不上,那就要考虑服务器防火墙、云安全组、服务是否监听正确地址。
3.2 SSH 远程管理与安全加固:远程服务器的命脉
没有显示器,怎么管理服务器?答案是 SSH(Secure Shell)。SSH 是 Linux 服务器远程管理的默认方式,它用加密隧道保证传输安全。默认端口是 22,默认登录方式是用密码。线上环境我强烈建议改成密钥登录,并禁止 root 直接登录。流程很简单:
# 在本地生成密钥对(如果没有) ssh-keygen -t ed25519 # 把公钥放到服务器上(第一次需要密码) ssh-copy-id -i ~/.ssh/id_ed25519.pub user@server_ip然后编辑服务器的 /etc/ssh/sshd_config:
PermitRootLogin no PasswordAuthentication no PubkeyAuthentication yes改完执行systemctl reload sshd。注意千万别写错配置把自己锁在门外,建议先保持一个已登录的会话不要断开,测试新会话能登录后再退出旧会话。数字签名、密钥对的工作原理可以用一个简单的类比:私钥是你的钥匙,公钥是锁芯。你把锁芯放到服务器上,自己留着钥匙。登录时服务器验证你确实持有对应的钥匙,但整个过程私钥不出本地。
VSCode 连接 SSH 远程服务器、JetBrains 家 IDE 的 Remote Development 都是基于同样的 SSH 协议。配置好密钥后,直接在 VSCode 的 Remote-SSH 插件里填user@server_ip就能连上。如果连不上,先确认 sshd 是否运行、22 端口是否监听、云安全组是否放行。顺带提醒,不要为了省事把 SSH 端口改成一个特别生僻的高位端口就算安全了,安全的核心还是密钥认证和禁用密码登录。
还有个容易困惑的场景:浏览器访问时提示“此连接已被阻止,因为它是公共页面发起的,旨在连接到您本地网络上的设备或服务器”。这其实是浏览器出于安全策略,阻止公网网页去访问你内网地址(比如 http://192.168.1.1/xxx)。这是浏览器为了防范 CSRF 攻击。如果你确实要访问本地设备的管理页面,一般需要在该设备的域名/IP 上做白名单,或者用本地调试工具。这和服务器本身没太大关系,但经常有人问。
3.3 时间同步与 DNS 解析:两个容易“小问题大事故”的环节
服务器时间不准,最直接的后果是日志时间对不上,排查问题时你连哪个事件在先都分不清。更严重的,HTTPS 证书校验失败、分布式系统节点间数据不一致、定时任务乱触发,都是时间不同步的锅。Linux 下主流的时间同步方案是 chrony,老系统用 ntpd。
# 安装 chrony(Debian/Ubuntu) apt install chrony -y # CentOS/RHEL yum install chrony -y systemctl enable --now chronyd chronyc sources -v # 查看同步源状态 timedatectl # 查看系统时间和时区 timedatectl set-timezone Asia/Shanghai # 设置时区同步源(时间服务器地址)可以用公共 NTP 池,也可以自己搭建内网时间服务器给集群统一对时。内网时间服务器就是一台跑着 chronyd 的机器,配置里允许网段访问,其他机器把它的 IP 写进 chrony.conf 即可。这个对需要严格时间一致性的数据库集群特别重要。
DNS 这边,除了前面提到的 resolv.conf,还有一个经典问题是:刚改了网站解析,但服务器上 curl 还是旧 IP。这是因为本地有 DNS 缓存。可以用nscd或systemd-resolved的缓存清理命令。注意,如果服务器的 /etc/nsswitch.conf 里 hosts 那行把 files 放在 dns 前面,那 /etc/hosts 文件里的条目会优先于 DNS 解析。这个文件常用于内网主机名映射,改错了也会导致“莫名其妙的连不上”。
4. 存储、内核与虚拟化:服务器的底盘技术
单台服务器再强,资源也有限。存储怎么扩容、数据怎么冗余、多台服务器怎么协同,这些是深入 Linux 服务器必须理解的问题。
4.1 磁盘分区、文件系统与 LVM:从裸盘到可用空间
拿到一块新数据盘,操作顺序是:分区(或直接整盘)、创建文件系统、挂载。查看磁盘设备用lsblk或fdisk -l。如果你用 fdisk 给磁盘分了区,比如 /dev/sdb1,然后在上面格式化:
mkfs.xfs /dev/sdb1 # CentOS 默认 xfs mkfs.ext4 /dev/sdb1 # Ubuntu 传统上常用 ext4然后挂载到 /data:
mkdir /data mount /dev/sdb1 /data echo "/dev/sdb1 /data xfs defaults 0 2" >> /etc/fstab不要忽略最后一步写进 fstab,不然重启后就掉挂载。fstab 里每一列分别表示设备、挂载点、文件系统类型、挂载参数、dump 标志、fsck 顺序。这个文件写错可能会导致系统起不来,所以改完最好用mount -a做一次预验证。
LVM(逻辑卷管理)是解决分区扩容问题的原子化方案。它的核心是把多块物理硬盘(Physical Volume, PV)合并成一个卷组(Volume Group, VG),然后从 VG 里划出逻辑卷(Logical Volume, LV)。挂载、格式化都在 LV 上。好处是扩容不需要重新分区,比如 VG 里还有剩余空间,执行:
lvextend -l +100%FREE /dev/mapper/vg_data-lv_data xfs_growfs /data # xfs 在线扩容 # ext4 用 resize2fs /dev/mapper/vg_data-lv_data就完成在线扩容。这背后是内核的设备映射(Device Mapper)机制,LVM 在逻辑层做了一层虚拟化。理解这个思路,对后面看虚拟化技术会有帮助——都是“在底层磁盘和上层文件之间加一层抽象”。
4.2 磁盘阵列(RAID)选型思路
服务器磁盘阵列(RAID)不是 Linux 特有的概念,但运维要会选型和维护。简单说,RAID 就是把多块盘组合成一个逻辑盘,实现冗余和性能提升。最常见的几种:
| RAID 级别 | 最少磁盘数 | 冗余能力 | 空间利用率 | 典型场景 |
|---|---|---|---|---|
| RAID0 | 2 | 无 | 100% | 性能优先,可容忍数据丢失 |
| RAID1 | 2 | 镜像,坏一块可用 | 50% | 系统盘 |
| RAID5 | 3 | 只允许坏一块 | (n-1)/n | 常规数据盘 |
| RAID10 | 4 | 每组镜像,每组各坏一块仍可用 | 50% | 数据库高性能场景 |
生产环境我最推荐 RAID10,它兼顾了性能和冗余,代价是空间利用率低。很多廉价主机商给的是 RAID5,但 RAID5 在磁盘重建时遇到第二块盘故障的概率并不小,数据库这类随机写入重的业务要慎重。软件 RAID(mdadm)在 Linux 里也能做,性能和兼容性足够用于测试环境,生产环境的物理机建议用 RAID 卡做硬 RAID,细节更多,包括缓存策略、写策略配置。但这块要根据具体硬件来,原理上记住“冗余不等于备份”就够了——误删除、勒索病毒、机房火灾,RAID 都救不了你,备份是另一套体系。
4.3 服务器虚拟化:一台变多台的底层逻辑
服务器虚拟化技术的本质,是用软件模拟出一台或多台“虚拟服务器”,让它们共享底层物理资源。常见的实现有两类,一类是基于 Hypervisor 的硬件虚拟化,比如 KVM(Kernel-based Virtual Machine),它直接利用 CPU 的虚拟化指令,在 Linux 内核里运行虚拟机。另一类是容器虚拟化,比如 Docker、Podman,它共享宿主机内核,隔离的是进程、文件系统和网络空间,不仿真硬件。
为什么需要虚拟化?因为物理机的资源利用率往往很低。一台 32 核 64G 的机器只跑一个 Nginx,大部分资源都闲置。虚拟化之后,可以在这台机器上开 10 个虚拟机分别跑不同服务,互相隔离,互不影响。虚拟机内部看到的是完整的硬件:自己的 CPU、内存、磁盘、网卡,甚至自己的内核。容器则轻量很多,启动只需毫秒级,因为它不需要再启动一个操作系统,直接用宿主机的操作系统来跑应用。
选型时怎么判断?如果业务需要兼容旧软件、需要不同内核版本、需要强隔离,就选 KVM 这样的虚拟机;如果都是自己的应用,希望部署快、密度高、CI/CD 友好,容器更合适。现在很多云服务器本身就是运行在 KVM 虚拟化之上的“云主机”,这也解释了为什么你在云服务器里看到的驱动经常是 virtio。虚拟化之上再叠加负载均衡和集群管理,就是云服务器、服务器集群的雏形。集群的底层思想也不复杂:多台机器干同一个活,前面加一层调度器(比如 Nginx、LVS、SLB),用户访问的是集群入口,后端的某一台挂了,流量自动切换到其他机器。
5. 性能分析与故障排查实战
运维的核心能力不是“会敲命令”,而是“能快速定位问题”。下面我用最常见的三类故障,演示排查思路。
5.1 CPU、内存、I/O:三大件的判断方法
线上系统变慢,第一反应是看top或htop。top 第一行的 load average 是 1 分钟、5 分钟、15 分钟的平均负载。这个值具体多高算高?要看 CPU 核数。单核机器负载 2 就是明显过载,16 核机器负载 2 说明很闲。你可以想象负载是“等待中任务+运行中任务”的平均数,超过核数就意味着有排队。
内存用free -h看。注意 available 是真正可用的内存,它包含了缓存和 buffer。别一看 used 高就以为内存不够。内存不够的典型信号是 swap 被大量使用,因为 swap 是磁盘上的交换分区,速度远低于内存。用top里按 P 排序看 CPU,按 M 排序看内存。如果某个 Java 进程内存居高不下,用 jmap、jstat 这些工具分析堆内/堆外内存。用vmstat可以看 CPU 的 us、sy、wa 等状态。wa 高说明 I/O 等得太久,常见就是磁盘慢或者存储链路有问题。
I/O 排查用iostat -x 1。关注 %util 和 await。%util 接近 100% 说明磁盘已经忙不过来。如果是云服务器,还要看是不是云盘的性能上限被跑满了。定位到具体进程可以用iotop。这里有个经验:数据库慢查询往往不是 SQL 本身的问题,而是磁盘 I/O 达到瓶颈,导致所有 SQL 都在排队。遇到这种情况先看 iostat,再慢 SQL 优化。
5.2 日志与服务排错:从报错到定位
服务和服务的“信息出口”,一是端口,二是日志。很多人看到服务起不来就慌,其实按流程走很简单。
以常见的统信 UOS 或 Ubuntu 上打印机服务(CUPS)报错“cups 服务器未运行”为例。先看服务状态:
systemctl status cups journalctl -u cups -n 50 --no-pagerjournalctl 是 systemd 的日志工具,-u 指定服务单元,-n 指定行数。如果 CUPS 服务起不来,日志里通常会写端口被占用、权限不对、配置文件语法错误。看到日志报的具体行,问题就解决一半了。
通用排错流程我给新人的建议是四步:
systemctl status <服务>确认运行状态。journalctl -u <服务> -f跟踪日志,或者看 /var/log/ 下对应的日志文件。- 看监听端口:
ss -lntp | grep <端口>,确认服务是否真的在监听。 - 如果端口没监听,回到日志;如果端口在监听但外部连不上,查防火墙和安全组。
内核层面的问题看dmesg -T,比如内存相关的 OOM、磁盘 I/O error、网卡丢包,都会在这里体现。系统整体日志在 /var/log/messages 或 /var/log/syslog。很多故障不是一蹴而就,而是反复出现的小错误积累出来的,养成定期看日志的习惯很重要。Linux 下的杀毒软件,比如 ClamAV、阿里巴巴的云安全插件,也都是通过监控文件、进程行为来发现异常,本质上还是在读文件系统事件和系统日志。
5.3 新手高频故障速查表
我根据平时带人和网上提问的常见情况,整理了一份“速查表”。表格里都是特别经典的问题,如果你遇到,先按这个方向查,大概率能省不少时间:
| 现象 | 大概率原因 | 排查方向 |
|---|---|---|
| 解压文件乱码 | 文件名编码不是 UTF-8 | 用unzip -O gbk或在unzip -O cp936后转换;tar可用convmv批量转码 |
| 端口启动失败:Address already in use | 端口被旧进程占用 | `ss -lntp |
| 磁盘满了但文件不见 | 有已删除文件被进程占用 | lsof +L1找出被删除但未释放的文件句柄 |
| SSH 连接慢 | DNS 反查或 GSSAPI 认证开启 | sshd_config 里关掉UseDNS no和GSSAPIAuthentication no |
| 外网访问不了本地服务 | 云安全组/防火墙/服务监听地址不对 | 确认ss -lntp显示0.0.0.0:端口,再查安全组 |
| 新建用户后 sudo 提示不在 sudoers 中 | 用户没有加入特权组 | 用 root 执行usermod -aG wheel 用户名(Ubuntu 是 sudo 组) |
| 服务器时间一变,报警就来了 | NTP 未配置或时区错 | timedatectl、chronyc sources确认同步源 |
| 系统启动进入紧急模式 | /etc/fstab 写错挂载 | 用维护模式修正 fstab,注释掉错误的行再重启 |
这个表不是标准答案,但它代表了一种“先定位再行动”的思路。很多人遇到问题第一反应是重启,重启确实能解决一部分问题,但如果不找到根因,同一个坑大概率还会再踩。
6. 从入门到生产:我的初始化清单与经验
最后这部分算是我自己长期实践出来的“私货”。很多教程教你怎么用命令,但不会告诉你一台新服务器拿到手之后应该按什么顺序做基础设置。我提供一个初始化清单,你可以根据公司规范调整。
6.1 新服务器落地八件事
第一,更新软件源和系统包,CentOS 系yum update,Debian/Ubuntu 系apt update && apt upgrade。注意生产环境不要无脑升级内核和关键软件,至少要在测试环境验证过。
第二,设置主机名和时区。方便日志归类,也避免分布式环境里“我是谁”的混乱。hostnamectl set-hostname app-node01,然后timedatectl set-timezone Asia/Shanghai。
第三,创建普通管理员账号,配置 SSH 密钥登录,并PermitRootLogin no。这一步前面讲过,属于安全基线。
第四,配置防火墙。用 firewalld、ufw 或 iptables 都行,核心是先放行 SSH,再放行业务端口,测试阶段可以先从最小规则开始。云服务器记得安全组和镜像防火墙两层都要看。
第五,关闭不需要的服务。新装的系统默认会开启一些非必需服务,比如打印服务、蓝牙服务。用systemctl list-unit-files --type=service检查,把不需要的 disable 掉,既能减少攻击面,也省内存。
第六,配置 NTP 同步。特别是多台机器组成的集群,时间不同步会出现很多诡异问题,前面已经细说了。
第七,设置资源监控。最简单的做法是安装 netdata、node_exporter + Prometheus,或者至少用 cron 定时记录top和df快照。没有监控,线上出问题就像闭着眼开车。
第八,做好备份策略。哪怕是最简单的 tar 打包 + 异地拷贝,也比裸奔强。至少把 /etc 和关键数据目录做定时备份。如果业务允许,备份多用“冷备+热备”双保险。
6.2 从事故里换来的几条经验
第一,别手快执行rm -rf带可疑路径。有人说运维最怕两件事:rm 跑得快,awk 用不对。我见过同事把rm -rf /var/log/nginx/*敲成rm -rf /var/log/nginx/ *,多了一个空格,直接删了整个 /var 下所有文件。这种教训一次都嫌多。建议高危命令写全路径,并且用find先 ls 出来确认再删。
第二,别随意chmod -R 777。权限问题要查“运行用户是谁”“目录属主是谁”,权限给到最小够用就行。很多安全漏洞就是这么被放大出来的。
第三,改配置之前先备份,改完用语法检查。比如 nginx 改完nginx -t,sshd 改完sshd -t,systemd 改完systemctl daemon-reload。这些检查都是秒级的,但能让你避免因为一个符号错误把整个服务拉垮。
第四,处理线上问题要先看监控和日志,不要猜。很多新手一上来就重启服务,结果问题复现了才知道没抓现场。正确姿势是先保留现场,抓日志、抓进程栈、抓网络状态,再考虑操作。
第五,内核参数不要乱调。很多人看了一篇文章就改 vm.swappiness、net.core.somaxconn,结果适得其反。生产环境内核参数的调整一定要在测试环境压测验证,不然你调的可能是“负优化”。
最后,再分享一个我坚持了很多年的小习惯:每次解决掉一个疑难故障,我都会把排查过程、根因、解决步骤写进自己的知识库,用 Markdown 按日期归档。这东西积累久了,就是个人的“排障手册”。Linux 服务器基础的东西就那么多,难的是把零碎的知识连接成一张网。希望这篇文章能帮你在自己的知识网里补上几根关键的线,后面遇到问题时,知道从哪里切入,怎么一步步拆解。