一、Linux 简介
Linux是一种典型的多用户、多任务、支持多线程和多 CPU 的操作系统,不同的用户处于不同的地位,拥有不同的权限。Linux 能运行主要的 UNIX 工具软件、应用程序和网络协议。它支持 32 位和 64 位硬件。Linux 继承了 Unix 以网络为核心的设计思想,是一个性能稳定的多用户网络操作系统。
主要特点:
- 开源免费:源代码开放,可自由修改和分发。
- 多用户、多任务:支持多个用户同时使用,并行运行多个程序。
- 高安全性:相比其他系统更少受到病毒攻击。
- 稳定性强:服务器可长时间运行而不需要重启。
- 高度可定制:可根据需求定制系统。
二、Linux 系统架构
2.1 Linux 体系结构
bash
用户空间 (User Space)
├── 应用程序 (Applications)
├── 系统库 (Glibc, libstdc++等)
├── Shell (Bash, Zsh, Fish)
└── 桌面环境 (GNOME, KDE等)
内核空间 (Kernel Space)
├── 系统调用接口
├── 进程管理
├── 内存管理
├── 文件系统
├── 设备驱动
└── 网络协议栈
硬件层 (Hardware)
├── CPU
├── 内存
├── 存储设备
├── 网络设备
└── 其他外设
2.2 系统启动流程
bash
1. BIOS/UEFI
- 硬件自检
- 查找可启动设备
2. 引导加载程序
- GRUB2(最常见)
- 加载内核和initramfs
3. 内核初始化
- 初始化硬件
- 挂载根文件系统
4. Systemd初始化
- 第一个进程(PID 1)
- 启动所有系统服务
5. 登录界面
- 显示登录提示
- 启动用户会话
三、Linux 文件系统
核心理念:一切皆文件
在 Linux 中,几乎所有资源都被抽象为文件:
- 普通文件、目录
- 硬件设备(磁盘、键盘、打印机)
- 进程信息
- 网络套接字
- 内核参数
3.1 文件类型
Linux 使用文件类型标识符在 ls -l 命令的第一个字符显示:
bash
# 查看文件类型
ls -l
# 输出示例:
drwxr-xr-x 2 user group 4096 Jan 15 dir/
-rw-r--r-- 1 user group 1024 Jan 15 file.txt
lrwxrwxrwx 1 user group 10 Jan 15 link -> file.txt
crw-rw---- 1 root tty 4, 64 Jan 15 ttyS0
brw-rw---- 1 root disk 8, 0 Jan 15 sda
prw-r--r-- 1 user group 0 Jan 15 pipe
srwxr-xr-x 1 user group 0 Jan 15 socket
第一个字符含义表:
| 字符 | 文件类型 |
|---|---|
| - | 普通文件 |
| d | 目录文件 |
| l | 符号链接 |
| c | 字符设备 |
| b | 块设备 |
| p | 命名管道 |
| s | 套接字文件 |
文件类型的创建:
bash
# 创建各种类型的文件
# 1. 普通文件(已有命令)
touch file.txt
echo "content" > file.txt
dd if=/dev/zero of=file.bin bs=1M count=1
# 2. 目录
mkdir newdir
# 3. 符号链接
ln -s target link_name
# 4. 硬链接
ln original link_name
# 5. 设备文件(需要root权限)
# 字符设备
sudo mknod /dev/mychar c 100 0
# 参数:c=字符设备,100=主设备号,0=次设备号
# 块设备
sudo mknod /dev/myblock b 101 0
# 6. 命名管道
mkfifo myfifo
# 或
mknod myfifo p
# 7. 套接字(通常由程序创建)
# Python示例:
# import socket
# sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
# sock.bind("mysocket.sock")
3.2 文件权限
- 权限表示法
在第一个字符所代表的文件类型后面,分别以三个为一组,且均为 rwx 的三个参数的组合。

- 权限类别
- r (read):读取权限,数字来代表的值为:4
- w (write):写入权限,数字来代表的值为:2
- x (execute):执行权限,数字来代表的值为:1
- 特殊权限:s, t
- 数字权限表示
| 权限 | 二进制 | 八进制 |
|---|---|---|
| --- | 000 | 0 |
| --x | 001 | 1 |
| -w- | 010 | 2 |
| -wx | 011 | 3 |
| r-- | 100 | 4 |
| r-x | 101 | 5 |
| rw- | 110 | 6 |
| rwx | 111 | 7 |
3.3 文件扩展名
Linux 不强制使用扩展名,但约定俗成:
| 扩展名 | 说明 | 示例 |
|---|---|---|
| .txt | 文本文件 | readme.txt |
| .sh | Shell 脚本 | backup.sh |
| .py | Python 脚本 | script.py |
| .conf | 配置文件 | nginx.conf |
| .log | 日志文件 | access.log |
| .gz, .bz2, .xz | 压缩文件 | archive.tar.gz |
| .so | 共享库 | libc.so.6 |
| .lock | 锁文件 | /var/run/pid.lock |
3.4 Linux 目录结构
Linux 采用层次化目录结构,所有文件和目录都从根目录 / 开始。这种结构遵循 FHS(Filesystem Hierarchy Standard) 标准,确保不同发行版的一致性。
bash
/ # 根目录
├── bin/ # 基本命令(所有用户)
├── boot/ # 引导文件
├── dev/ # 设备文件
├── etc/ # 系统配置文件
├── home/ # 用户家目录
│ ├── username/ # 个人用户目录
│ └── ...
├── lib/, lib64/ # 系统库文件
├── media/, mnt/ # 挂载点
├── opt/ # 可选应用程序
├── proc/ # 进程和内核信息(虚拟文件系统)
├── root/ # root用户家目录
├── run/ # 运行时数据
├── sbin/ # 系统管理命令
├── srv/ # 服务数据
├── sys/ # 系统设备信息(虚拟文件系统)
├── tmp/ # 临时文件
├── usr/ # 用户程序和数据
│ ├── bin/, sbin/
│ ├── lib/, lib64/
│ ├── local/ # 本地安装软件
│ └── share/ # 架构无关数据
└── var/ # 可变数据
├── log/ # 系统日志
├── cache/ # 缓存
├── lib/ # 状态信息
├── spool/ # 队列数据
└── tmp/ # 临时文件
3.5 核心目录详解
-
/- 根目录- 整个文件系统的起点
- 包含所有其他目录
- 通常单独分区
-
/bin- 基本用户命令二进制文件- 存放单用户模式下必需的命令
- 所有用户都可使用
- 示例:ls, cp, cat, bash
-
/sbin- 系统管理命令二进制文件- 存放系统管理员使用的命令
- 通常需要 root 权限
- 示例:fdisk, ifconfig, reboot
-
/boot- 启动文件- 包含内核文件和引导加载程序
- vmlinuz - Linux 内核
- initramfs - 初始内存文件系统
- grub/ - GRUB 引导程序配置
-
/dev- 设备文件- 将硬件设备表示为文件
- 特殊文件类型:
- 块设备:硬盘 /dev/sda
- 字符设备:终端 /dev/tty
- 虚拟设备:随机数 /dev/random
-
/etc- 配置文件-
存放系统和应用程序的配置文件
-
普通文本文件,可手动编辑
-
重要子目录:
bash/etc/ ├── passwd # 用户账户信息 ├── group # 用户组信息 ├── fstab # 文件系统挂载表 ├── network/ # 网络配置 ├── ssh/ # SSH 配置 └── apt/ # APT 包管理器配置
-
-
/home- 用户主目录- 每个普通用户有自己的子目录
- 用户对该目录有完全控制权
- 示例:/home/alice, /home/bob
-
/root- 管理员主目录- root 用户的专属目录
- 普通用户无权访问
-
/lib和/lib64- 共享库文件- 存放系统运行所需的共享库(.so 文件)
- /lib64 用于 64 位系统
- 类似 Windows 的 DLL 文件
-
/usr- 用户程序资源-
级层次结构,包含大多数用户程序
-
重要子目录:
bash/usr/ ├── bin/ # 用户命令(非必需) ├── sbin/ # 管理员命令(非必需) ├── lib/ # 程序库 ├── share/ # 架构无关数据(文档、图标) ├── local/ # 本地安装的软件 └── src/ # 内核源代码
-
-
/var- 可变数据-
存放经常变化的数据
-
重要子目录:
bash/var/ ├── log/ # 系统日志 │ ├── syslog │ └── auth.log ├── cache/ # 应用程序缓存 ├── spool/ # 待处理数据(打印队列、邮件) ├── tmp/ # 临时文件(重启保留) └── www/ # Web 内容(某些系统)
-
-
/tmp- 临时文件- 存放临时文件
- 所有用户可读写
- 系统重启时自动清空
-
/opt- 可选应用程序- 存放第三方大型软件
- 每个软件在单独子目录
- 示例:/opt/google/chrome/
-
/mnt和/media- 挂载点/mnt- 手动挂载的文件系统/media- 自动挂载的可移动设备
-
/proc- 进程信息虚拟文件系统-
内核和进程信息的虚拟接口
-
文件内容动态生成
-
重要文件:
bash/proc/ ├── cpuinfo # CPU 信息 ├── meminfo # 内存信息 ├── <PID>/ # 每个进程的目录 └── mounts # 已挂载文件系统
-
-
/sys- 系统设备虚拟文件系统- 提供内核对象信息
- 用于配置硬件设备
- 动态反映系统状态
-
/run- 运行时数据- 存放系统启动后的运行时信息
- 替代旧的 /var/run
- 包含进程 ID 文件、锁文件等
3.6 常见文件系统类型
ext4:稳定可靠的传统选择
核心优势:
- 极致稳定性:经过15年+生产环境验证
- 完全兼容:无缝挂载ext2/ext3分区
- 低资源消耗:内存占用最小,适合资源受限环境
- 成熟工具链:e2fsprogs工具套件完整可靠
适用场景:
- 根文件系统:所有Linux发行版的默认选择
- 嵌入式系统:低资源消耗,高可靠性
- 传统服务器:不需要高级功能的稳定环境
- U盘/移动硬盘:跨版本兼容性好
XFS:大文件性能之王
核心优势:
- 极致大文件性能:8EB最大文件,专为媒体文件优化
- 高并发I/O:分配组(AG)机制实现真正的并行操作
- 在线扩展:支持热扩展(仅扩大)
- 条带化感知:自动优化RAID性能
适用场景:
- 视频处理服务器:4K/8K视频编辑
- 数据库服务器:PostgreSQL, MySQL大数据量
- 科学计算:大型数据集处理
- NAS存储:大文件归档
Btrfs:现代功能的集大成者
核心优势:
- 写时复制(CoW):所有操作都创建副本
- 内置RAID管理:软件RAID 0/1/5/6/10
- 子卷和快照:秒级创建,空间高效
- 透明压缩:zstd压缩率优秀
适用场景:
- 开发测试环境:频繁快照和回滚
- 桌面系统:/home分区,便于用户数据保护
- 虚拟化存储:为虚拟机提供快照功能
- 版本控制服务器:Git仓库存储
ZFS:企业级的数据完整性卫士
核心优势:
- 端到端校验和:防止静默数据损坏
- 存储池管理:统一管理多块磁盘
- 重复数据删除:节省存储空间
- 高级缓存:ARC + L2ARC + ZIL三级缓存
适用场景:
- 企业级存储:金融、医疗等关键数据
- 备份服务器:确保备份数据完整性
- 虚拟化平台:Proxmox VE, TrueNAS
- 科研数据:不可再生的实验数据
F2FS:为闪存而生
核心优势:
- 闪存寿命优化:减少写放大效应
- 随机写入优化:日志结构减少碎片
- TRIM优化:更有效的垃圾回收
- 低延迟:针对SSD/NVMe优化
适用场景:
- 智能手机/平板:Android data分区
- 笔记本电脑:SSD系统盘
- 嵌入式设备:eMMC/UFS存储
- 高速缓存盘:NVMe加速盘
3.7 文件链接
链接是 Linux 文件系统中创建文件引用的机制,允许一个文件有多个访问路径。Linux 支持两种类型的链接:
- 硬链接(Hard Link)
- 软链接/符号链接(Soft/Symbolic Link)
3.7.1 硬链接(Hard Link)
-
定义与特性
- 硬链接是指向原始文件 inode 的直接指针
- 与原始文件共享相同的 inode 编号和数据块
- 硬链接与原始文件完全平等,没有主次之分
- 删除任何一个硬链接,只要还有其他链接存在,文件数据就不会被删除
-
工作原理图示
bash+----------------+ | 目录项1 | +----------+ | 文件名: file1 |----->| | | inode: 1234 | | inode | +----------------+ | 编号: 1234 | +----------------+ | 链接数: 2 |----->| 数据块 | +----------------+ | 元数据 | | 文件内容 | | 目录项2 |----->| | +----------------+ | 文件名: link1 | +----------+ | inode: 1234 | +----------------+ -
创建硬链接
bash# 基本语法 ln 源文件 链接名 # 示例 $ echo "Hello World" > original.txt $ ln original.txt hardlink.txt # 验证 $ ls -li total 8 123456 -rw-r--r-- 2 user group 12 Jan 1 10:00 hardlink.txt 123456 -rw-r--r-- 2 user group 12 Jan 1 10:00 original.txt # ↑ 相同的inode编号和链接数 $ ls -l original.txt -rw-r--r-- 2 user group 12 Jan 1 10:00 original.txt # ↑ 数字"2"表示链接数 -
硬链接的限制
- 不能跨文件系统(不同分区)
- 不能链接到目录(避免循环引用)
- 不能链接到不存在的文件
- 所有硬链接必须在同一物理设备上
3.7.2 软链接/符号链接(Symbolic Link)
-
定义与特性
- 软链接是包含路径名的特殊文件
- 类似于 Windows 的快捷方式
- 有自己独立的 inode 和数据块(存储目标路径)
- 删除原始文件后,软链接会变成"断链"
-
工作原理图示
bash+----------------+ +----------+ | 软链接文件 |----->| | | 文件名: link2 | | inode | | inode: 5678 | | 编号: 5678 | +----------------+ +----------------+ | 链接数: 1 |----->| 数据块 | | 元数据 | | "original.txt" | +----------------+ +----------+ +----------------+ | 原始文件 | +----------+ | 文件名: file2 |----->| | | inode: 1234 | | inode | +----------------+ +----------------+ | 编号: 1234 |----->| 数据块 | | 链接数: 1 | | 文件内容 | +----------+ +----------------+ -
创建软链接
bash# 基本语法(使用 -s 选项) ln -s 源文件 链接名 # 示例 $ ln -s original.txt symlink.txt # 验证 $ ls -li total 8 123456 -rw-r--r-- 1 user group 12 Jan 1 10:00 original.txt 567890 lrwxrwxrwx 1 user group 12 Jan 1 10:00 symlink.txt -> original.txt # ↑ 不同的inode,'l'表示链接类型 -
软链接的优势
- 可以跨文件系统
- 可以链接到目录
- 可以链接到不存在的文件(断链)
- 可以创建相对路径或绝对路径链接
3.7.3 硬链接 vs 软链接对比
| 特性 | 硬链接 | 软链接 |
|---|---|---|
| 本质 | 指向 inode 的指针 | 包含路径的文本文件 |
| inode | 与源文件相同 | 独立的 inode |
| 跨文件系统 | ❌ 不支持 | ✅ 支持 |
| 链接目录 | ❌ 不允许 | ✅ 允许 |
| 删除源文件 | 文件仍存在(链接数减1) | 链接失效(断链) |
| 文件大小 | 与源文件相同 | 路径名的字节数 |
| 创建命令 | ln source link | ln -s source link |
| 相对/绝对路径 | 自动使用绝对路径 | 可使用相对或绝对 |
| 更新追踪 | 自动更新 | 保持创建时的路径 |
四、Linux 中的特殊符号
4.1 通配符
-
*: 匹配任意多个字符bash# 匹配所有文件 ls * ls *.txt # 所有.txt文件 ls file*.txt # file开头,.txt结尾 ls *log* # 文件名包含log -
?:匹配单个字符bashls file?.txt # file1.txt, fileA.txt ls ???.txt # 三个字符的txt文件 ls test-?.log # test-1.log, test-a.log -
[]:字符集合匹配bash# 基本用法 ls file[123].txt # file1.txt, file2.txt, file3.txt ls [abc]*.txt # a.txt, b.txt, cat.txt等 # 范围匹配 ls file[0-9].txt # file0.txt到file9.txt ls [a-z]*.txt # 小写字母开头 ls [A-Z]*.txt # 大写字母开头 ls [0-9a-f]*.txt # 十六进制字符开头 # 排除匹配 [!] ls [!0-9]*.txt # 非数字开头 ls file[!a-c].txt # 不是a,b,c -
{}:花括号扩展bash# 生成序列 echo file{1..5}.txt # file1.txt file2.txt ... file5.txt echo {a..e}.txt # a.txt b.txt c.txt d.txt e.txt echo file{01..10}.txt # file01.txt file02.txt ... file10.txt # 组合扩展 echo {red,blue,green}-{light,dark} # 输出:red-light red-dark blue-light blue-dark green-light green-dark # 创建多个文件 touch file_{a,b,c}.txt # 创建file_a.txt, file_b.txt, file_c.txt mkdir -p dir{1..3}/{src,build} # 嵌套扩展 echo {a,b{1,2},c}.txt # a.txt b1.txt b2.txt c.txt
4.2 重定向符号
-
标准流编号
- 0 - 标准输入 (stdin)
- 1 - 标准输出 (stdout)
- 2 - 标准错误 (stderr)
-
输出重定向
bash# 覆盖输出 command > file.txt # 标准输出到文件 command 1> file.txt # 同上,显式指定 command 2> error.log # 错误输出到文件 # 追加输出 command >> file.txt # 追加到文件 command 2>> error.log # 错误追加 # 同时重定向标准和错误 command > output.log 2>&1 # 旧语法 command &> output.log # bash简化语法 command > output.log 2> error.log # 分开重定向 -
输入重定向
bash# 文件作为输入 command < input.txt sort < data.txt # Here Document (<<) cat << EOF 这是多行文本 第二行 第三行 EOF # 带缩进的 Here Document cat <<- EOF 缩进的文本 会被去除缩进 EOF # Here String (<<<) grep "pattern" <<< "some text with pattern" bc <<< "2+2" -
特殊文件描述符
bash# /dev/null - 数据黑洞 command > /dev/null 2>&1 # 丢弃所有输出 command 2> /dev/null # 只丢弃错误 # /dev/zero - 零数据源 dd if=/dev/zero of=file.bin bs=1M count=10 # /dev/random - 随机数据 head -c 32 /dev/random > key.bin
4.3 管道和进程控制符号
-
|- 管道bash# 基本管道 ls -l | grep "txt" # 过滤 ps aux | sort -k4 -nr # 按内存排序 cat file.txt | wc -l # 统计行数 # 多级管道 ps aux | grep httpd | awk '{print $2}' | xargs kill # tee命令同时输出到屏幕和文件 ls -l | tee output.txt | wc -l ls -l | tee -a log.txt # 追加模式 -
|&- 管道包含标准错误bashcommand |& grep error # 包含stderr的管道 -
&- 后台运行bash# 后台运行 sleep 10 & ./server.sh & # 查看后台作业 jobs jobs -l # 前后台切换 fg %1 # 将作业1调到前台 bg %2 # 将作业2调到后台 -
;- 命令分隔符bash# 顺序执行 cd /tmp; ls; pwd make clean; make; make install # 注意:即使前面命令失败,后面的也会执行 false; echo "still runs" # 会输出 -
&&- 逻辑与bash# 前一个成功才执行下一个 cd /tmp && ls make && make test && make install [ -f file.txt ] && echo "文件存在" -
||- 逻辑或bash# 前一个失败才执行下一个 cd /nonexistent || echo "目录不存在" command1 || command2 || command3 -
组合使用
bash# 复杂逻辑 make && echo "编译成功" || echo "编译失败" cd /tmp && ls || echo "切换目录失败" # 执行命令并检查状态 command && echo "成功" || { echo "失败"; exit 1; }
4.4 变量和参数相关符号
-
$- 变量引用bashecho $HOME echo $PATH echo "用户: $USER" # 花括号明确变量边界 echo "${USER}name" # 正确:username echo "$USERname" # 错误:试图访问USERname变量 -
特殊变量
bash$0 # 脚本名 $1-$9 # 位置参数 $# # 参数个数 $@ # 所有参数(数组) $* # 所有参数(字符串) $? # 上一个命令退出码 $$ # 当前进程PID $! # 最后一个后台进程PID $_ # 上一个命令的最后一个参数 -
${}- 变量扩展bash# 默认值 echo ${VAR:-default} # 如果VAR未设置或为空,使用default echo ${VAR:=default} # 如果VAR未设置或为空,设为default echo ${VAR:+alternate} # 如果VAR设置了,使用alternate echo ${VAR:?错误信息} # 如果VAR未设置,显示错误并退出 # 子字符串 STR="Hello World" echo ${STR:6} # World echo ${STR:6:3} # Wor echo ${STR: -5} # World(注意空格) # 字符串操作 echo ${#STR} # 字符串长度:11 echo ${STR#Hello} # 最短前缀匹配删除: World echo ${STR##* } # 最长前缀匹配删除:World echo ${STR%World} # 最短后缀匹配删除:Hello echo ${STR%% *} # 最长后缀匹配删除:Hello # 数组操作 ARR=(a b c d) echo ${ARR[@]} # 所有元素 echo ${#ARR[@]} # 数组长度 echo ${!ARR[@]} # 数组索引 -
$( )和 ` - 命令替换bash# 推荐使用$() echo "今天是 $(date)" files=$(ls *.txt) # 旧式反引号 echo "今天是 `date`" # 嵌套命令替换 echo "文件数: $(ls $(pwd) | wc -l)"
4.5 引号相关符号
-
'- 单引号(强引用)bash# 所有字符都原样输出 echo '$HOME' # 输出:$HOME echo 'It\'s a test' # 错误:需要转义单引号 -
"- 双引号(弱引用)bash# 变量和命令会被展开 echo "$HOME" # 输出:/home/user echo "当前用户: $USER" echo "时间是: $(date)" # 部分特殊字符仍有效 echo "Line 1\nLine 2" # \n不会转义 echo -e "Line 1\nLine 2" # 需要-e选项 -
\- 反斜杠(转义字符)bash# 转义单个字符 echo \$HOME # 输出:$HOME echo "It\'s a test" # 正确 echo 价格:\$100 # 续行符 echo "这是一个很长的文本 \ 需要分成两行写" # 特殊转义序列 echo -e "Tab:\t制表符" echo -e "换行:\n新行" echo -e "退格:\b" echo -e "回车:\r"
4.6 路径相关符号
-
.- 当前目录bashcd . # 留在当前目录 ./script.sh # 执行当前目录脚本 . ./config.sh # source命令简写 -
..- 上级目录bashcd .. # 上一级 cd ../.. # 上两级 ls ../*.txt # 上级目录的txt文件 -
~- 家目录bashcd ~ # 当前用户家目录 cd ~/Documents # 家目录下的Documents echo ~user1 # user1的家目录 -
-- 上一次目录bashcd /tmp cd /usr/local cd - # 回到/tmp