Skip to content

Linux 基础

前言

服务器的世界,Linux 是绝对的主角。 全球超过 90% 的服务器运行 Linux,从你每天用的微信到 Google 搜索,背后都是 Linux 在支撑。作为开发者,掌握 Linux 基础不是可选项,而是必修课。

这篇文章会带你学什么?

学完这章后,你将获得:

  • 文件系统:理解 Linux 目录结构和"一切皆文件"的哲学
  • 常用命令:掌握文件操作、文本处理、进程管理等核心命令
  • 权限模型:理解用户、组、权限的概念
  • Shell 基础:了解管道、重定向、环境变量等 Shell 核心概念
  • 实战技能:学会日志查看、进程排查、网络诊断等运维基本功
章节内容核心概念
第 1 章文件系统目录结构、一切皆文件
第 2 章常用命令文件、文本、进程、网络
第 3 章权限模型用户、组、rwx、sudo
第 4 章Shell 基础管道、重定向、变量、脚本
第 5 章实战场景日志排查、性能诊断

1. 文件系统:一切皆文件

Linux 最核心的哲学之一就是一切皆文件。普通文件是文件,目录是文件,硬盘是文件,甚至网络连接、进程信息都是文件。这个统一的抽象让你可以用同一套工具(读、写、权限控制)操作几乎所有系统资源。

Linux 文件系统层级
点击目录查看用途说明
📁/根目录
⚙️/bin基础命令
📋/etc配置文件
🏠/home用户目录
📊/var可变数据
🗑️/tmp临时文件
📦/usr用户程序
🔍/proc进程信息
🔌/dev设备文件
/
整个文件系统的起点,所有目录和文件都从这里开始。Linux 中一切皆文件,所有设备、进程信息都以文件形式存在于这棵目录树中。

目录结构速记

把 Linux 文件系统想象成一棵倒过来的树:

/                    ← 根目录(树根)
├── home/            ← 用户的家(你的文件都在这)
├── etc/             ← 配置文件(系统的"设置面板")
├── var/             ← 变化的数据(日志、缓存)
├── usr/             ← 用户安装的程序
├── tmp/             ← 临时文件(重启就没了)
├── proc/            ← 进程信息(虚拟的,不占磁盘)
├── dev/             ← 设备文件(硬盘、终端)
├── bin/             ← 基础命令(ls、cp、mv)
├── sbin/            ← 系统管理命令(需要 root)
├── opt/             ← 第三方软件
└── root/            ← root 用户的家目录

路径的两种写法

类型格式示例说明
绝对路径/ 开始/home/alice/code/app.js从根目录出发,不会歧义
相对路径从当前目录开始./code/app.js../config. 是当前目录,.. 是上级目录

"一切皆文件"的威力

想知道 CPU 信息?读文件:cat /proc/cpuinfo 想知道内存使用?读文件:cat /proc/meminfo 想产生随机数?读文件:cat /dev/urandom 想丢弃输出?写文件:echo "no thanks" > /dev/null

不需要专门的 API,读写文件就够了。这就是 Unix 哲学的优雅之处。


2. 常用命令

Linux 命令遵循一个统一的格式:命令 [选项] [参数]。比如 ls -la /home 中,ls 是命令,-la 是选项,/home 是参数。

Linux 命令速查
按分类查看常用命令及示例
ls列出文件和目录
ls -la /home
cd切换目录
cd /var/log
cp复制文件
cp -r src/ backup/
mv移动/重命名
mv old.txt new.txt
rm删除文件
rm -rf dist/
mkdir创建目录
mkdir -p src/components
find查找文件
find . -name "*.js" -type f

最常用的 10 个命令

如果只能记住 10 个命令,记这些:

命令用途记忆技巧
ls列出文件list
cd切换目录change directory
cat查看文件concatenate
grep搜索文本global regular expression print
find查找文件就是 find
ps查看进程process status
tail -f实时看日志看文件"尾巴",-f 是 follow
chmod改权限change mode
curl发 HTTP 请求client URL
ssh远程登录secure shell

命令组合的艺术

Linux 的强大不在于单个命令,而在于命令组合。通过管道 | 把多个简单命令串起来,解决复杂问题:

bash
# 找出占用 CPU 最多的 5 个进程
ps aux --sort=-%cpu | head -6

# 统计日志中出现最多的错误类型
grep "ERROR" app.log | awk '{print $4}' | sort | uniq -c | sort -rn | head -10

# 查找大于 100MB 的文件
find / -size +100M -type f 2>/dev/null

# 实时监控日志中的错误
tail -f /var/log/app.log | grep --color "ERROR"

Unix 哲学

"做一件事,做好它。" 每个命令只负责一个功能,通过管道组合实现复杂操作。这就是为什么 Linux 命令都很短小——它们是积木,不是瑞士军刀。


3. 权限模型

Linux 是多用户系统,权限模型是安全的基石。每个文件都有三组权限,分别控制所有者(Owner)所属组(Group)其他人(Others)能做什么。

读懂 ls -l 的输出

bash
$ ls -l app.js
-rwxr-xr-- 1 alice developers 2048 Jan 15 10:30 app.js
│├──┤├──┤├──┤
          └── 文件大小
     └── 所属组
     └── 所有者
   └── 其他人权限:r-- (只读)
   └── 组权限:r-x (读+执行)
 └── 所有者权限:rwx (读+写+执行)
└── 文件类型:- 普通文件,d 目录,l 链接

权限的三种操作

权限字母数字对文件的含义对目录的含义
r4查看文件内容列出目录内容(ls)
w2修改文件内容创建/删除目录中的文件
执行x1运行程序/脚本进入目录(cd)
Linux 权限解读器
输入权限字符串或数字,查看含义
-rwxr-xr-x
所有者(Owner)
所属组(Group)
其他人(Others)
常见权限组合
644普通文件(owner 读写,其他只读)
755可执行文件/目录(owner 全权限)
600私密文件(仅 owner 读写)
777完全开放(不推荐)

数字权限速算

三个数字分别代表 Owner、Group、Others 的权限,每个数字是 r(4) + w(2) + x(1) 的和:

chmod 755 script.sh
  7 = rwx (4+2+1)  → 所有者:读+写+执行
  5 = r-x (4+0+1)  → 组:读+执行
  5 = r-x (4+0+1)  → 其他人:读+执行
常见权限含义典型用途
644rw-r--r--普通文件(所有者可写,其他人只读)
755rwxr-xr-x可执行文件/目录
600rw-------私密文件(如 SSH 密钥)
777rwxrwxrwx所有人可读写执行(危险,避免使用)

sudo:临时获取超级权限

普通用户权限有限,有些操作需要 root 权限。sudo 让你临时以 root 身份执行命令:

bash
# 普通用户无法修改系统配置
$ vim /etc/nginx/nginx.conf
# Permission denied

# 用 sudo 临时提权
$ sudo vim /etc/nginx/nginx.conf
# 输入你的密码后可以编辑

# 切换到 root 用户(谨慎使用)
$ sudo su -

最小权限原则

永远不要用 chmod 777 解决权限问题,这等于把门锁拆了。正确做法是搞清楚谁需要什么权限,精确授予。同样,不要长期以 root 身份操作,只在必要时用 sudo


4. Shell 基础

Shell 是你和 Linux 内核之间的"翻译官"。你输入命令,Shell 解释并交给内核执行。最常用的 Shell 是 Bash(大多数 Linux 发行版默认)和 Zsh(macOS 默认)。

管道与重定向

这是 Shell 最强大的两个特性:

符号名称作用示例
``管道把前一个命令的输出作为后一个的输入
>输出重定向把输出写入文件(覆盖)echo "hello" > file.txt
>>追加重定向把输出追加到文件末尾echo "world" >> file.txt
<输入重定向从文件读取输入wc -l < file.txt
2>错误重定向把错误信息写入文件cmd 2> error.log
2>&1合并输出把错误和正常输出合并cmd > all.log 2>&1

环境变量

环境变量是 Shell 中的"全局配置",影响命令的行为:

bash
# 查看所有环境变量
env

# 查看某个变量
echo $PATH
echo $HOME

# 临时设置(只在当前 Shell 有效)
export API_KEY="abc123"

# 永久设置(写入配置文件)
echo 'export API_KEY="abc123"' >> ~/.bashrc
source ~/.bashrc   # 让配置立即生效
常见变量含义示例值
$PATH命令搜索路径/usr/local/bin:/usr/bin:/bin
$HOME用户主目录/home/alice
$USER当前用户名alice
$PWD当前工作目录/var/log
$SHELL当前使用的 Shell/bin/bash

Shell 脚本入门

把多个命令写进一个文件,就是 Shell 脚本。它是自动化运维的起点:

bash
#!/bin/bash
# deploy.sh - 简单的部署脚本

APP_DIR="/opt/myapp"
LOG_FILE="/var/log/deploy.log"

echo "$(date) - 开始部署..." >> $LOG_FILE

# 拉取最新代码
cd $APP_DIR && git pull origin main

# 安装依赖
npm install --production

# 重启服务
pm2 restart myapp

echo "$(date) - 部署完成" >> $LOG_FILE
bash
# 给脚本执行权限并运行
chmod +x deploy.sh
./deploy.sh

脚本调试技巧

在脚本开头加 set -ex-e 让脚本遇到错误立即退出(而不是继续执行),-x 会打印每条执行的命令(方便排查问题)。这两个选项在生产脚本中几乎是标配。


5. 实战场景

理论学完了,来看几个开发中最常遇到的实战场景。

5.1 日志排查

服务出问题,第一反应就是看日志。以下是日志排查的常用套路:

bash
# 1. 实时跟踪日志(最常用)
tail -f /var/log/app/error.log

# 2. 搜索特定时间段的错误
grep "2024-01-15 14:" error.log | grep "ERROR"

# 3. 统计每小时的错误数量
grep "ERROR" app.log | awk '{print substr($1,1,13)}' | uniq -c

# 4. 查看最近 100 行日志
tail -100 app.log

# 5. 在多个日志文件中搜索
grep -r "OutOfMemory" /var/log/app/

5.2 进程排查

应用卡死、CPU 飙高、内存泄漏——这些问题都需要从进程入手:

bash
# 查看 CPU 占用最高的进程
ps aux --sort=-%cpu | head -10

# 查看内存占用最高的进程
ps aux --sort=-%mem | head -10

# 查找特定进程
ps aux | grep "node"

# 查看进程的详细信息(包括线程)
top -Hp <PID>

# 查看进程打开的文件
lsof -p <PID>

# 优雅终止进程(SIGTERM)
kill <PID>

# 强制终止(SIGKILL,最后手段)
kill -9 <PID>

5.3 网络诊断

服务连不上?先搞清楚是网络问题还是应用问题:

bash
# 测试目标是否可达
ping -c 4 google.com

# 检查端口是否开放
telnet db-server 3306
# 或者用 nc
nc -zv db-server 3306

# 查看本机监听的端口
ss -tlnp
# 或
netstat -tlnp

# DNS 解析检查
dig api.example.com
nslookup api.example.com

# 测试 HTTP 接口
curl -v http://localhost:3000/health

# 查看网络连接状态统计
ss -s

5.4 磁盘空间排查

磁盘满了是线上最常见的故障之一:

bash
# 查看各分区使用情况
df -h

# 找出占用空间最大的目录
du -sh /* 2>/dev/null | sort -rh | head -10

# 进一步定位大目录
du -sh /var/log/* | sort -rh | head -10

# 查找大文件(>100MB)
find / -type f -size +100M 2>/dev/null | head -20

# 清理常见的空间占用
# 清理旧日志
sudo journalctl --vacuum-size=500M
# 清理 Docker 无用镜像
docker system prune -a

线上排查口诀

"一看日志,二看进程,三看网络,四看磁盘"。90% 的线上问题都能通过这四步定位到原因。养成习惯后,排查效率会大幅提升。


总结

Linux 是开发者的必备技能,掌握基础就能应对大部分日常开发和运维场景。

回顾本章的关键要点:

  1. 一切皆文件:Linux 用文件抽象统一了对硬件、进程、网络等资源的访问方式
  2. 命令组合:单个命令功能简单,通过管道 | 组合才能发挥真正威力
  3. 权限模型:Owner/Group/Others × Read/Write/Execute,用数字(如 755)快速设置
  4. Shell 基础:管道、重定向、环境变量、脚本是自动化的基石
  5. 实战排查:日志 → 进程 → 网络 → 磁盘,四步定位大部分线上问题

延伸阅读