Skip to content

Linux 与系统管理

运维视角的 Linux 系统管理手册:不是「学会一条命令」,而是建立「出事时知道去哪查」的系统排查框架。示例语境:Ubuntu 22.04 / systemd / bash,命令需在真实环境验证。

系统分层与发行版

  • 内核:管理硬件、进程调度、内存、文件系统与网络;版本形如 6.8.xuname -r 查看;
  • 发行版:内核 + 用户态工具 + 包管理的组合,两大族系:Debian/Ubuntu(apt)与 RHEL/Rocky(dnf/yum);命令入口不同,概念一致;
  • 包管理纪律:生产环境锁版本与锁定仓库源;升级前看变更与备份;避免大版本自动滚动。
bash
uname -a          # 内核与架构
cat /etc/os-release   # 发行版信息
apt list --installed | grep nginx   # 已装版本(Debian 系)

文件系统与权限

FHS 目录速查:/etc 配置、/var 运行时数据(/var/log 日志、/var/lib 状态)、/tmp 临时、/home 用户、/proc/sys 内核接口、/usr/bin 程序。

权限模型三条规则先记牢:

  1. rwx 对文件与目录含义不同:目录的 r 是能列出、x 是能进入,改目录内容看 w删除文件看所在目录权限,与文件本身无关
  2. chmod 数字法(755 = owner 全部、group/other 读+执行)对目录递归加 -R 前想清楚;
  3. chown 改属主属组是特权操作,误把系统文件 chown 到应用账号会让服务起不来。
bash
ls -lh /var/log/syslog          # 看权限与属主
stat -c '%a %U:%G %n' /etc/hosts
sudo chown -R app:app /opt/app  # 递归改属主
umask 0022                      # 新建文件默认权限基准
  • sudo 纪律:账号走 sudo 而非直接用 root;用 visudo 编辑,NOPASSWD 白名单只给明确命令;
  • 粘滞位与 suid/tmpt 位防止跨用户删文件;尽量不用 suid 程序。

systemd 与进程管理

bash
systemctl status nginx            # 单元状态与最近日志
systemctl enable --now nginx      # 开机自启 + 立即启动
journalctl -u nginx -n 50 -f      # 跟随某服务的日志
systemctl daemon-reload           # 改了 unit 文件后必须重载

排查思路:先看进程有没有,再看日志说什么

bash
ps -eo pid,ppid,stat,cmd | grep -v grep   # 全量进程
pgrep -af nginx                            # 按名字找进程
htop                                       # 交互式资源视图
ss -lntp                                   # 监听端口与进程(替代 netstat)
kill -TERM <pid>                           # 先温柔后暴力:TERM → KILL
  • 僵尸进程:子进程结束父进程未 wait,若父进程持续产生僵尸,往往是业务 bug,不是 kill 能解决的;
  • 孤儿进程:父进程先亡,子进程被 init/systemd 收养,正常现象。

网络排查:从「不通」到「找到断点」

一条命令一层层剥:

bash
ping -c 3 1.1.1.1        # ① 基础连通性(先排除 DNS/路由大方向)
curl -vI https://example.com   # ② 七层通不通、TLS、响应头
ss -lntp                 # ③ 本地端口是否在监听
dig example.com A        # ④ DNS 解析(非 resolv.conf 缓存层)
ip route                 # ⑤ 路由与默认网关
iptables -L -n           # ⑥ 防火墙(或 nftables/ufw/云安全组)

按序做一遍,基本能定位「域名没解析 / 没监听 / 被防火墙挡 / 对端没通」中的一类。

磁盘与空间排查

bash
df -h                    # 分区使用率(只看已挂载)
du -sh --exclude=proc /var/* | sort -h   # 找大头
df -i                    # inode 耗尽会「磁盘有空间但写不进去」
lsof +L1                 # 已删除但仍被进程占用的文件(日志轮转经典问题)
  • 日志轮转用 logrotate,别用「删掉日志」糊弄——句柄还开着,磁盘不会释放,重启进程才释放;
  • /var/log 单独分区(或至少监控),避免日志写满根分区拖垮系统。

Shell 与脚本纪律

bash
#!/usr/bin/env bash
set -euo pipefail        # 出错即停 / 变量未定义即报错 / 管道失败不被吞
  • 脚本要幂等:重复执行结果一致(先判断再创建、idempotent 操作优先);
  • 不要在脚本里用交互式命令(rm -imysql 无密码提示);
  • 敏感信息走环境变量或密钥文件,不硬编码、不打进脚本仓库;
  • cron 里跑脚本注意 PATH 与环境变量为空,日志要重定向到文件。
bash
# 每天 2:30 执行并留日志(cron)
30 2 * * * /opt/backup.sh >> /var/log/backup.log 2>&1

长期任务优先用 systemd timer(可看日志、可控环境、可依赖),cron 适合简单调度。

常见坑速查

现象解法
删除文件磁盘没释放空间依旧不足lsof +L1 找占用进程,重启或重开句柄
目录 755 看成文件可删删不掉/误删记住:删除看目录写权限
改了 unit 文件不生效systemctl 报错daemon-reload 先做
chown -R 整库误操作系统服务起不来操作前确认目标,备份属主表
看日志找不到服务服务没起来ps + systemctl status + journalctl 顺序排查
cron 环境变量空脚本跑一半失败脚本内显式 PATH;输出重定向留痕
端口通但连接失败被防火墙/安全组挡本地 ss、远端 nc -vz、云安全组逐层查
inode 满提示磁盘已满但 df 有空间df -i,删海量小文件

检查清单

  • [ ] 生产变更前有回退方案,关键操作先备份;
  • [ ] 服务走 systemd 托管且 enable 自启,日志通过 journalctl 可查;
  • [ ] 权限遵循最小化:应用不用 root、目录属主正确、umask 合理;
  • [ ] 网络故障有固定排查顺序并能快速定位断点;
  • [ ] 日志已配置轮转并单独监控容量,无「磁盘写满」隐患;
  • [ ] 脚本满足 set -euo pipefail 与幂等,无明文密钥入库。

基于 VitePress 构建 · 内容以知识共享方式沉淀