前言与简介
作者简介
Brian Ward 自 1993 年以来一直在使用 Linux。他还是《Linux 内核 HOWTO》、《VMware 之书》(No Starch Press)和《Linux 问题解决者》(No Starch Press)的作者。
技术审校简介
Jordi Gutiérrez Hermoso 是一位 GNU/Linux 用户和开发者,拥有近二十年的经验,并偶尔在自由软件社区的各个圈子(如 GNU Octave 和 Mercurial)做出贡献。他的专业工作使他能够与多种主题合作并学习,例如数字加密签名、医学影像,以及最近在温室气体核算和生态地图数据方面,所有这些都完全基于 Linux 和其他自由软件构建。当他不接近电脑时,他喜欢游泳、数学和针织。
Petros Koutoupis 目前在 HPE(原 Cray Inc.)的 Lustre 高性能文件系统部门担任高级性能软件工程师。他还是 RapidDisk 项目(www.rapiddisk.org)的创建者和维护者。Petros 在数据存储行业工作了十多年,并帮助开创了当今在野外释放的许多技术。
简要目录
| 章节 | 标题 | 页码 |
|---|---|---|
| 前言 | xxi | |
| 第 1 章 | 大局观 | 1 |
| 第 2 章 | 基本命令与目录层次结构 | 11 |
| 第 3 章 | 设备 | 47 |
| 第 4 章 | 磁盘与文件系统 | 69 |
| 第 5 章 | Linux 内核如何启动 | 117 |
| 第 6 章 | 用户空间如何启动 | 137 |
| 第 7 章 | 系统配置:日志记录、系统时间、批处理作业与用户 | 167 |
| 第 8 章 | 深入了解进程与资源利用 | 199 |
| 第 9 章 | 理解你的网络及其配置 | 223 |
| 第 10 章 | 网络应用与服务 | 269 |
| 第 11 章 | Shell 脚本入门 | 291 |
| 第 12 章 | 网络文件传输与共享 | 315 |
| 第 13 章 | 用户环境 | 335 |
| 第 14 章 | Linux 桌面与打印简要概述 | 347 |
| 第 15 章 | 开发工具 | 363 |
| 第 16 章 | 从 C 源代码编译软件入门 | 385 |
| 第 17 章 | 虚拟化 | 401 |
| 参考文献 | 419 | |
| 索引 | 423 |
详细目录
前言
xxi
谁应该阅读本书?
xxi
先决条件
xxii
如何阅读本书
xxii
动手实践的方法
xxii
本书的组织结构
xxiii
第三版的新内容?
xxiii
术语说明
xxiv
第 1 章:大局观
1
1.1 Linux 系统中的抽象层次与层级
2
1.2 硬件:理解主内存
4
1.3 内核
4
1.3.1 进程管理
5
1.3.2 内存管理
6
1.3.3 设备驱动程序与管理
6
1.3.4 系统调用与支持
7
1.4 用户空间
8
1.5 用户
9
1.6 展望未来
10
NOTE
以上内容对应于原始 PDF 的第 7–26 页,包含作者简介、技术审校、致谢和前言部分。在实际的 Obsidian 笔记中,你可以将每个章节标题设置为指向相应页面的 双向链接,或将其拆分为独立的笔记以更好地组织内容。
基本命令与目录层次
2.1 Bourne Shell:/bin/sh (p.12)
2.2 使用 Shell (p.12)
- 2.2.1 Shell 窗口 (p.13)
- 2.2.2
cat(p.13) - 2.2.3 标准输入与标准输出 (p.14)
2.3 基本命令 (p.15)
- 2.3.1
ls(p.15) - 2.3.2
cp(p.15) - 2.3.3
mv(p.16) - 2.3.4
touch(p.16) - 2.3.5
rm(p.16) - 2.3.6
echo(p.16)
2.4 目录导航 (p.16)
- 2.4.1
cd(p.17) - 2.4.2
mkdir(p.17) - 2.4.3
rmdir(p.17) - 2.4.4 Shell 通配符(“通配符”)(p.18)
x 目录详情
2.5 中级命令 (p.19)
- 2.5.1
grep(p.19) - 2.5.2
less(p.20) - 2.5.3
pwd(p.20) - 2.5.4
diff(p.21) - 2.5.5
file(p.21) - 2.5.6
find与locate(p.21) - 2.5.7
head与tail(p.21) - 2.5.8
sort(p.22)
2.6 更改密码与 Shell (p.22)
2.7 点文件 (p.22)
2.8 环境变量与 Shell 变量 (p.22)
2.9 命令路径 (p.23)
2.10 特殊字符 (p.24)
2.11 命令行编辑 (p.25)
2.12 文本编辑器 (p.25)
2.13 获取在线帮助 (p.26)
2.14 Shell 输入与输出 (p.28)
- 2.14.1 标准错误 (p.29)
- 2.14.2 标准输入重定向 (p.29)
2.15 理解错误消息 (p.29)
- 2.15.1 Unix 错误消息的结构 (p.30)
- 2.15.2 常见错误 (p.30)
2.16 列出与操作进程 (p.32)
- 2.16.1 命令选项 (p.32)
- 2.16.2 进程终止 (p.33)
- 2.16.3 作业控制 (p.34)
- 2.16.4 后台进程 (p.34)
2.17 文件模式与权限 (p.35)
- 2.17.1 修改权限 (p.36)
- 2.17.2 使用符号链接 (p.38)
2.18 归档与压缩文件 (p.39)
- 2.18.1
gzip(p.39) - 2.18.2
tar(p.39) - 2.18.3 压缩归档(
.tar.gz)(p.40) - 2.18.4
zcat(p.41) - 2.18.5 其他压缩工具 (p.41)
2.19 Linux 目录层次基础 (p.42)
- 2.19.1 其他根子目录 (p.43)
- 2.19.2
/usr目录 (p.44) - 2.19.3 内核位置 (p.44)
2.20 以超级用户身份运行命令 (p.44)
- 2.20.1
sudo(p.45) - 2.20.2
/etc/sudoers(p.45) - 2.20.3
sudo日志 (p.46)
2.21 展望 (p.46)
3
3 设备 47
3.1 设备文件 … … … … … … … … … … … … … … … … … … … … … … … … … … … … … . . 48
3.2 sysfs 设备路径 … … … … … … … … … … … … … … … … … … … … … … … … … … … . . 49
xi
3.3 dd 与设备 … … … … … … … … … … … … … … … … … … … … … … … … … … … … … . 50
3.4 设备名称总结 … … … … … … … … … … … … … … … … … … … … … … … … … … … . . 51
3.4.1 硬盘: /dev/sd* … … … … … … … … … … … … … … … … … … … … … … … … … . 52
3.4.2 虚拟磁盘: /dev/xvd*, /dev/vd* … … … … … … … … … … … … … … … … … … … … . 53
3.4.3 非易失性内存设备: /dev/nvme* … … … … … … … … … … … … … … … … … … … . 53
3.4.4 设备映射器: /dev/dm-, /dev/mapper/ … … … … … … … … … … … … … … … … . . 53
3.4.5 光盘和 DVD 驱动器: /dev/sr* … … … … … … … … … … … … … … … … … … … … . 53
3.4.6 PATA 硬盘: /dev/hd* … … … … … … … … … … … … … … … … … … … … … … … . . 53
3.4.7 终端: /dev/tty*, /dev/pts/* 和 /dev/tty … … … … … … … … … … … … … … … … … 53
3.4.8 串行端口: /dev/ttyS*, /dev/ttyUSB*, /dev/ttyACM* … … … … … … … … … … … … . . 55
3.4.9 并行端口: /dev/lp0 和 /dev/lp1 … … … … … … … … … … … … … … … … … … … . . 55
3.4.10 音频设备: /dev/snd/*, /dev/dsp, /dev/audio 等 … … … … … … … … … … … … … . 55
3.4.11 设备文件的创建 … … … … … … … … … … … … … … … … … … … … … … … . . 56
3.5 udev … … … … … … … … … … … … … … … … … … … … … … … … … … … … … … . . 56
3.5.1 devtmpfs … … … … … … … … … … … … … … … … … … … … … … … … … … . . 57
3.5.2 udevd 运行与配置 … … … … … … … … … … … … … … … … … … … … … … … . 58
3.5.3 udevadm … … … … … … … … … … … … … … … … … … … … … … … … … … . 60
3.5.4 设备监控 … … … … … … … … … … … … … … … … … … … … … … … … … … . 61
3.6 深入: SCSI 与 Linux 内核 … … … … … … … … … … … … … … … … … … … … … … … . . 62
3.6.1 USB 存储与 SCSI … … … … … … … … … … … … … … … … … … … … … … … . . 65
3.6.2 SCSI 与 ATA … … … … … … … … … … … … … … … … … … … … … … … … … . 65
3.6.3 通用 SCSI 设备 … … … … … … … .3.6.4 单个设备的多种访问方法 … … … … … … … … … … … … … … … … … … … … . 67
4 磁盘与文件系统
69
4.1 磁盘设备分区 … … … … … … … … … … … … … … … … … … … … … … … … … … … … 72
4.1.1 查看分区表 … … … … … … … … … … … … … … … … … … … … … … … … … … … . 72
4.1.2 修改分区表 … … … … … … … … … … … … … … … … … … … … … … … … … … … . 75
4.1.3 创建分区表 … … … … … … … … … … … … … … … … … … … … … … … … … … … . 76
4.1.4 浏览磁盘与分区几何结构 … … … … … … … … … … … … … … … … … … … … … … 78
4.1.5 从固态硬盘读取 … … … … … … … … … … … … … … … … … … … … … … … … … 80
4.2 文件系统 … … … … … … … … … … … … … … … … … … … … … … … … … … … … … . . 80
4.2.1 文件系统类型 … … … … … … … … … … … … … … … … … … … … … … … … … … 81
4.2.2 创建文件系统 … … … … … … … … … … … … … … … … … … … … … … … … … … 82
4.2.3 挂载文件系统 … … … … … … … … … … … … … … … … … … … … … … … … … … 83
4.2.4 文件系统 UUID … … … … … … … … … … … … … … … … … … … … … … … … … . . 85
4.2.5 磁盘缓冲、缓存与文件系统 … … … … … … … … … … … … … … … … … … … … … . 86
4.2.6 文件系统挂载选项 … … … … … … … … … … … … … … … … … … … … … … … … . 86
4.2.7 重新挂载文件系统 … … … … … … … … … … … … … … … … … … … … … … … … . 87
4.2.8 /etc/fstab 文件系统表 … … … … … … … … … … … … … … … … … … … … … … … 88
4.2.9 /etc/fstab 的替代方案 … … … … … … … … … … … … … … … … … … … … … … . . 89
4.2.10 文件系统容量 … … … … … … … … … … … … … … … … … … … … … … … … … . . 89
4.2.11 检查与修复文件系统 … … … … … … … … … … … … … … … … … … … … … … … . 91
4.2.12 特殊用途文件系统 … … … … … … … … … … … … … … … … … … … … … … … … 93
4.3 交换空间 … … … … … … … … … … … … … … … … … … … … … … … … … … … … … . 94
4.3.1 使用磁盘分区作为交换空间 … … … … … … … … … … … … … … … … … … … … … 94
4.3.2 使用文件作为交换空间 … … … … … … … … … … … … … … … … … … … … … … . . 95
4.3.3 确定所需交换空间大小 … … … … … … … … … … … … … … … … … … … … … … . . 95
4.4 逻辑卷管理器 … … … … … … … … … … … … … … … … … … … … … … … … … … … . . 96
4.4.2 使用 LVM … … … … … … … … … … … … … … … … … … … … … … … … … … … 97
4.4.3 LVM 实现 … … … … … … … … … … … … … … … … … … … … … … … … … … … 107
xii 目录
4.5 展望:磁盘与用户空间 … … … … … … … … … … … … … … … … … … … … … … … … . 111
4.6 传统文件系统内部 … … … … … … … … … … … … … … … … … … … … … … … … … … 111
4.6.1 Inode 详情与链接计数 … … … … … … … … … … … … … … … … … … … … … … … 113
4.6.2 块分配 … … … … … … … … … … … … … … … … … … … … … … … … … … … … 114
4.6.3 在用户空间处理文件系统 … … … … … … … … … … … … … … … … … … … … … … 115
5 Linux 内核如何启动
117
5.1 启动信息 … … … … … … … … … … … … … … … … … … … … … … … … … … … … … . 118
5.2 内核初始化与启动选项 … … … … … … … … … … … … … … … … … … … … … . . .5.3 内核参数 … … … … … … … … … … … … … … … … … … … … … … … … … … … … … … … … … … … . . 120
5.4 引导加载程序 … … … … … … … … … … … … … … … … … … … … … … … … … … … … … … … … … . 121
5.4.1 引导加载程序的任务 … … … … … … … … … … … … … … … … … … … … … … … … … … … . . 122
5.4.2 引导加载程序概览 … … … … … … … … … … … … … … … … … … … … … … … … … … … … 123
5.5 GRUB 简介 … … … … … … … … … … … … … … … … … … … … … … … … … … … … … … … … … … 123
5.5.1 使用 GRUB 命令行探索设备和分区 … … … … … … … … … … … … … … … … … … … … … … . 125
5.5.2 GRUB 配置 … … … … … … … … … … … … … … … … … … … … … … … … … … … … … … 127
5.5.3 GRUB 安装 … … … … … … … … … … … … … … … … … … … … … … … … … … … … … … 130
5.6 UEFI 安全启动问题 … … … … … … … … … … … … … … … … … … … … … … … … … … … … … … . . 131
5.7 链式加载其他操作系统 … … … … … … … … … … … … … … … … … … … … … … … … … … … … … 132
5.8 引导加载程序细节 … … … … … … … … … … … … … … … … … … … … … … … … … … … … … … . . 132
5.8.1 MBR 启动 … … … … … … … … … … … … … … … … … … … … … … … … … … … … … … 133
5.8.2 UEFI 启动 … … … … … … … … … … … … … … … … … … … … … … … … … … … … … … 133
5.8.3 GRUB 如何工作 … … … … … … … … … … … … … … … … … … … … … … … … … … … . . 134
6 用户空间如何启动
137
6.1 init 简介
138
6.2 识别你的 init
139
6.3 systemd
139
6.3.1 单元与单元类型
140
6.3.2 启动与单元依赖图
140
6.3.3 systemd 配置
141
6.3.4 systemd 运行
144
6.3.5 systemd 进程跟踪与同步
147
6.3.6 systemd 依赖
148
6.3.7 systemd 按需启动与资源并行化启动
151
6.3.8 systemd 辅助组件
156
6.4 System V 运行级别
156
6.5 System V init
157
6.5.1 System V init:启动命令序列
158
6.5.2 System V init 链接农场
159
6.5.3 run-parts
160
6.5.4 System V init 控制
161
6.5.5 systemd 的 System V 兼容性
161
6.6 关闭系统
162
6.7 初始 RAM 文件系统
163
6.8 紧急启动与单用户模式
164
6.9 展望
165
xiii
7 系统配置:日志记录、系统时间、批处理作业与用户
167
7.1 系统日志记录
168
7.1.1 检查你的日志设置
169
7.1.2 搜索与监控日志
169
7.1.3 日志文件轮转
172
7.1.4 日志维护
173
7.1.5 深入系统日志记录
173
7.2 /etc 目录结构
176
7.3 用户管理文件
177
7.3.1 /etc/passwd 文件
177
7.3.2 特殊用户
178
7.3.3 /etc/shadow 文件
179
7.3.4 操作用户与密码
179
7.3.5 使用组
180
7.4 getty 与 login
181
7.5 设置时间
181
7.5.1 内核时间表示与时区
182
7.5.2 网络时间
182
7.6 使用 cron 与定时器单元调度重复任务
183
7.6.1 安装 crontab 文件
184
7.6.2 系统 crontab 文件
185
7.6.3 定时器单元
185
7.6.4 cron 与定时器单元对比
187
7.7 使用 at 调度一次性任务
187
7.7.1 定时器单元等效
188
7.8 以普通用户身份运行定时器单元
188
7.9 用户访问主题
189
7.9.1 用户 ID 与用户切换
189
7.9.2 进程所有权、有效 UID、真实 UID 与已保存 UID
189
7.9.3 用户识别、认证与授权
191
7.9.4 使用库获取用户信息
192
7.10 可插拔认证模块 (PAM)
192
7.10.1 PAM 配置
193
7.10.2 PAM 配置语法提示
196
7.10.3 PAM 与密码
197
7.11 展望
198
Contents in Detail xiv Contents in Detail
8 深入理解进程与资源利用
199
8.1 追踪进程
200
8.2 使用 lsof 查找打开的文件
200
8.2.1 读取 lsof 输出
201
8.2.2 使用 lsof
202
8.3 追踪程序执行与系统调用
202
8.3.1 strace
202
8.3.2 ltrace
204
8.4 线程
204
8.4.1 单线程与多线程进程
204
8.4.2 查看线程
205
8.5 资源监控简介
206
8.5.1 测量 CPU 时间
207
8.5.2 调整进程优先级
207
8.5.3 通过负载平均值测量 CPU 性能
208
8.5.4 监控内存状态
210
8.5.5 使用 vmstat 监控 CPU 与内存性能
212
8.5.6 I/O 监控
214
8.5.7 使用 pidstat 进行每进程监控
216
8.6 控制组 (cgroups)
216
8.6.1 区分 cgroup 版本
217
8.6.2 查看 cgroups
219
8.6.3 操作与创建 cgroups
220
8.6.4 查看资源利用
221
8.7 进一步主题
221
第9章 了解你的网络及其配置
9.1 网络基础
9.2 数据包
9.3 网络层
9.4 互联网层
9.4.1 查看 IP 地址
9.4.2 子网
9.4.3 常见的子网掩码与 CIDR 表示法
9.5 路由与内核路由表
9.6 默认网关
9.7 IPv6 地址与网络
9.7.1 查看系统的 IPv6 配置
9.7.2 配置双协议栈网络
9.8 基本的 ICMP 和 DNS 工具
9.8.1 ping
9.8.2 DNS 与 host
9.9 物理层与以太网
9.10 了解内核网络接口
9.11 网络接口配置入门
9.11.1 手动配置接口
9.11.2 手动添加与删除路由
9.12 启动时激活的网络配置
9.13 手动与启动时网络配置的问题
9.14 网络配置管理器
9.14.1 NetworkManager 的工作原理
9.14.2 与 NetworkManager 交互
9.14.3 NetworkManager 的配置
9.15 主机名解析
9.15.1 /etc/hosts
9.15.2 resolv.conf
9.15.3 缓存与零配置 DNS
9.15.4 /etc/nsswitch.conf
9.16 本地回环
9.17 传输层:TCP、UDP 与服务
9.17.1 TCP 端口与连接
9.17.2 UDP
9.18 重新审视一个简单的本地网络
9.19 理解 DHCP
9.19.1 Linux DHCP 客户端
9.19.2 Linux DHCP 服务器
9.20 自动 IPv6 网络配置
9.21 将 Linux 配置为路由器
9.22 私有网络(IPv4)
9.23 网络地址转换(IP 伪装)
9.24 路由器与 Linux
9.25 防火墙
9.25.1 Linux 防火墙基础
9.25.2 设置防火墙规则
9.25.3 防火墙策略
9.26 以太网、IP、ARP 与 NDP
9.27 无线以太网
9.27.1 iw
9.27.2 无线安全
9.28 小结
第10章 网络应用与服务
10.1 服务的基础
10.2 深入观察
10.3 网络服务器
10.3.1 安全 Shell
10.3.2 sshd 服务器
10.3.3 fail2ban
10.3.4 SSH 客户端
10.4 systemd 之前的网络连接服务器:inetd/xinetd
10.5 诊断工具
10.5.1 lsof
10.5.2 tcpdump
10.5.3 netcat
10.5.4 端口扫描
10.6 远程过程调用
10.7 网络安全
10.7.1 常见漏洞
10.7.2 安全资源
10.8 展望未来
10.9 网络套接字
10.10 Unix 域套接字
11 Shell脚本入门
- 11.1 Shell脚本基础 … … … … … … … 291
- 11.1.1 Shell脚本的局限性 … … … … … . 292
- 11.2 引用和字面量 … … … … … … … . . 293
- 11.2.1 字面量 … … … … … … … … . . 293
- 11.2.2 单引号 … … … … … … … … . 294
- 11.2.3 双引号 … … … … … … … … . 295
- 11.2.4 字面单引号 … … … … … … … . 295
- 11.3 特殊变量 … … … … … … … … … 296
- 11.3.1 单个参数:2等 … … … … … 296
- 11.3.2 参数数量:$# … … … … … … … 297
- 11.3.3 所有参数:$@ … … … … … … . . 297
- 11.3.4 脚本名称:$0 … … … … … … … 297
- 11.3.5 进程ID:$$ … … … … … … … . 298
- 11.3.6 退出码:$? … … … … … … … . 298
- 11.4 退出码 … … … … … … … … … . 298
- 11.5 条件语句 … … … … … … … … … 299
- 11.5.1 空参数列表的解决方法 … … … … . . 299
- 11.5.2 用于测试的其他命令 … … … … … 300
- 11.5.3 elif … … … … … … … … … 300
- 11.5.4 逻辑结构 … … … … … … … . 300
- 11.5.5 测试条件 … … … … … … … . . 301
- 11.5.6 case … … … … … … … … . . 304
- 11.6 循环 … … … … … … … … … … 305
- 11.6.1 for 循环 … … … … … … … … 305
- 11.6.2 while 循环 … … … … … … … . 305
- 11.7 命令替换 … … … … … … … … … 306
- 11.8 临时文件管理 … … … … … … … . . 307
- 11.9 Here 文档 … … … … … … … … . . 308
- 11.10 重要的Shell脚本工具 … … … … … … 308
- 11.10.1 basename … … … … … … … … 308
- 11.10.2 awk … … … … … … … … … . 309
- 11.10.3 sed … … … … … … … … … . 309
- 11.10.4 xargs … … … … … … … … … 310
- 11.- 11.10.5 expr … … … … … … … … … … … … … … … . . 311
- 11.10.6 exec … … … … … … … … … … … … … … … . . 311
- 11.11 子Shell … … … … … … … … … … … … … … … … … … … . 311
- 11.12 在脚本中包含其他文件 … … … … … … … … … … … … … … … . . 312
- 11.13 读取用户输入 … … … … … … … … … … … … … … … … … … . . 312
- 11.14 何时(不)使用Shell脚本 … … … … … … … … … … … … … … … 312
12 网络文件传输与共享
- 12.1 快速复制 … … … … … … … … … … … … … … … … … … … . 316
- 12.2 rsync … … … … … … … … … … … … … … … … … … … … … 317
- 12.2.1 开始使用rsync … … … … … … … … … … … … … … … … 317
- 12.2.2 精确复制目录结构 … … … … … … … … … … … … … … 318
- 12.2.3 使用尾部斜杠 … … … … … … … … … … … … … … … . . 319
- 12.2.4 排除文件和目录 … … … … … … … … … … … … … … . 320
- 12.2.5 检查传输、添加安全保障并使用详细模式 … … … … … … … … . . 321
- 12.2.6 压缩数据 … … … … … … … … … … … … … … … … . . 321
- 12.2.7 限制带宽 … … … … … … … … … … … … … … … … . . 322
- 12.2.8 将文件传输到您的计算机 … … … … … … … … … … … … … 322
- 12.2.9 更多rsync主题 … … … … … … … … … … … … … … … . . 322
- 12.3 文件共享简介 … … … … … … … … … … … … … … … … … … … 323
- 12.3.1 文件共享的使用与性能 … … … … … … … … … … … … … . . 323
- 12.3.2 文件共享的安全性 … … … … … … … … … … … … … … . . 323
- 12.4 使用Samba共享文件 … … … … … … … … … … … … … … … … … . 324
- 12.4.1 服务器配置 … … … … … … … … … … … … … … … … . . 324
- 12.4.2 服务器访问控制 … … … … … … … … … … … … … … … 325
- 12.4.3 密码 … … … … … … … … … … … … … … … … … … 326
- 12.4.4 手动启动服务器 … … … … … … … … … … … … … … … 327
- 12.4.5 诊断和日志文件 … … … … … … … … … … … … … … … 328
- 12.4.6 文件共享配置 … … … … … … … … … … … … … … … . 328
- 12.4.7 家目录 … … … … … … … … … … … … … … … … … 328
- 12.4.8 打印机共享 … … … … … … … … … … … … … … … … 329
- 12.4.9 Samba客户端 … … … … … … … … … … … … … … … . . 329
- 12.5 SSHFS … … … … … … … … … … … … … … … … … … … … . . 331
- 12.6 NFS … … … … … … … … … … … … … … … … … … … … … . . 332
- 12.7 云存储 … … … … … … … … … … … … … … … … … … … … … 333
- 12.8 网络文件共享的现状 … … … … … … … … … … … … … … … … … . 333
13 用户环境
- 13.1 创建启动文件的指南 336
- 13.2 何时修改启动文件 336
- 13.3 Shell 启动文件元素 337
- 13.3.1 命令路径 337
- 13.3.2 手册页路径 338
- 13.3.3 提示符 338
- 13.3.4 别名 339
- 13.3.5 权限掩码 339
- 13.4 启动文件顺序与示例 340
- 13.4.1 bash Shell 340
- 13.4.2 tcsh Shell 342
- 13.5 默认用户设置 343
- 13.5.1 Shell 默认值 343
- 13.5.2 编辑器 344
- 13.5.3 分页器 344
- 13.6 启动文件的陷阱 344
- 13.7 更多启动主题 345
14 Linux 桌面与打印简述
- 14.1 桌面组件 348
- 14.1.1 帧缓冲 348
- 14.1.2 X Window 系统 348
- 14.1.3 Wayland 349
- 14.1.4 窗口管理器 349
- 14.1.5 工具包 350
- 14.1.6 桌面环境 350
- 14.1.7 应用程序 350
- 14.2 你运行的是 Wayland 还是 X? 351
- 14.3 深入 Wayland 351
- 14.3.1 合成窗口管理器 351
- 14.3.2 libinput 352
- 14.3.3 Wayland 中的 X 兼容性 353
- 14.4 深入 X Window 系统 354
- 14.4.1 显示管理器 355
- 14.4.2 网络透明性 355
- 14.4.3 探索 X 客户端的方法 355
- 14.4.4 X 事件 356
- 14.4.5 X 输入与偏好设置 357
- 14.5 D-Bus 359
- 14.5.1 系统与会话实例 360
- 14.5.2 D-Bus 消息监控 360
- 14.6 打印 360
- 14.6.1 CUPS 361
- 14.6.2 格式转换与打印过滤器 361
- 14.7 其他桌面主题 362
15 开发工具
- 15.1 C 编译器 364
- 15.1.1 编译多个源文件 365
- 15.1.2 与库链接 366
- 15.1.3 使用共享库 367
- 15.1.4 使用头文件(包含文件)与目录 371
- 15.2 make 373
- 15.2.1 示例 Makefile 374
- 15.2.2 内置规则 374
- 15.2.3 最终程序构建 375
- 15.2.4 依赖更新 375
- 15.2.5 命令行参数与选项 376
- 15.2.6 标准宏与变量 377
- 15.2.7 常规目标 378
- 15.2.8 Makefile 组织 378
- 15.3 Lex 与 Yacc 379
- 15.4 脚本语言 380
- 15.4.1 Python 381
- 15.4.2 Perl 381
- 15.4.3 其他脚本语言 381
- 15.5 Java 382
- 15.6 展望:编译软件包 383
16 从 C 源代码编译软件简介
- 16.1 软件构建系统 386
- 16.2 解压 C 源代码包 387
- 16.3 GNU Autoconf 388
- 16.3.1 Autoconf 示例 389
- 16.3.2 使用打包工具安装 390
- 16.3.3 configure 脚本选项 390
- 16.3.4 环境变量 391
- 16.3.5 Autoconf 目标 392
- 16.3.6 Autoconf 日志文件 392
- 16.3.7 pkg-config 393
- 16.4 安装实践 394
- 16.4.1 安装位置 395
- 16.5 应用补丁 395
- 16.6 编译与安装故障排除 396
- 16.6.1 特定错误 397
- 16.7 展望 399
17
虚拟化
17.1 虚拟机
- 17.1.1 虚拟机监控器
- 17.1.2 虚拟机中的硬件
- 17.1.3 虚拟机的常见用途
- 17.1.4 虚拟机的缺点
17.2 容器
- 17.2.1 Docker、Podman 与权限
- 17.2.2 Docker 示例
- 17.2.3 LXC
- 17.2.4 Kubernetes
- 17.2.5 容器的陷阱
17.3 基于运行时的虚拟化
致谢
本书的贡献者不仅包括参与开发过程的人,还包括那些没有他们我就不会了解 Linux 的人。他们包括:James Duncan、Douglas N. Arnold、Bill Fenner、Ken Hornstein、Scott Dickson、Dan Ehrlich、Felix Lee 和 Gregory P. Smith。之前的版本得到了 Karol Jurado、Laurel Chun、Serena Yang、Alison Law、Riley Hoffman、Scott Schwartz、Dan Sully、Dominique Poulain、Donald Karon 和 Gina Steele 的帮助。
第三版受益于 Barbara Yien、Rachel Monaghan、Jill Franklin、Larry Wake、Jordi Gutiérrez Hermoso 和 Petros Koutoupis 的出色工作。作为 No Starch Press 的出版人,Bill Pollock 自第一版以来一直为本书做出重要贡献。此外,谢欣汝再次包容了我修订过程中的种种。
前言
你的系统不应该是神秘的。你应该能够让软件做你想做的事,而不需要“魔法”般的咒语或仪式。获得这种能力的关键在于理解软件的基本原理及其工作方式,而这正是本书的全部内容。你永远不必与计算机作对。
Linux 是一个很好的学习平台,因为它不会试图对你隐藏任何东西。特别是,你可以在易于阅读的纯文本文件中找到大多数系统配置细节。唯一棘手的部分是弄清楚哪些部分负责什么,以及它们如何组合在一起。
谁应该阅读本书?
你对了解 Linux 工作原理的兴趣可能来自多种原因。在专业领域,运维和 DevOps 人员需要掌握本书中几乎所有的内容。Linux 软件架构师和开发人员也应该了解这些内容,以便充分利用操作系统。研究人员和学生(通常运行自己的 Linux 系统)也会发现本书提供了有用的解释,说明为什么系统以某种方式配置。
还有那些修补匠——那些只是为了好玩、赚钱或两者兼而有之而喜欢摆弄电脑的人。想知道为什么某些东西有效而其他无效?想知道如果移动某些东西会发生什么?你很可能就是一个修补匠。
先决条件
虽然 Linux 深受程序员的喜爱,但你不需要成为程序员就能阅读本书;你只需要基本的计算机用户知识。也就是说,你应该能够在 GUI(特别是 Linux 发行版的安装程序和设置界面)中摸索,并且知道文件和目录(文件夹)是什么。你还应该准备好查阅系统上和网络上的额外文档。最重要的是,你需要准备好并愿意摆弄你的电脑。
如何阅读本书
构建必要的知识是攻克任何技术课题的挑战。解释软件系统的工作方式可能会变得非常复杂。太多的细节会让读者陷入困境,难以理解重要概念(人脑一次无法处理太多新想法),但细节太少又会让读者感到困惑,并为后续内容准备不足。
我在大多数章节中设计了先处理最重要的内容:你为了继续学习所需的基本信息。在某些地方,我简化了内容以保持重点。随着章节的推进,你会看到更多细节,尤其是在最后几节。你需要立即了解这些细节吗?在大多数情况下,不需要;我会在适用的情况下注明这一点。当你面对刚学过的概念的大量额外细节而开始感到眼花缭乱时,不要犹豫,跳到下一章或休息一下。那些细枝末节仍然会在那里等着你。
动手实践
无论你选择如何继续阅读本书,你都应该有一台 Linux 机器摆在面前,最好是一台你可以放心用来做实验的机器。你可能更喜欢使用虚拟安装——我用 VirtualBox 测试了本书中的大部分内容。你还应该拥有超级用户(root)权限,但大多数时候尽量使用普通用户账户。你主要会在终端窗口或远程会话的命令行中工作。如果你对这种环境不太熟悉,没关系;第 2 章会帮你快速上手。
本书中的命令通常看起来像这样:
$ ls /
[一些输出]输入粗体文字;后面的非粗体文字是机器返回的内容。$ 是普通用户账户的提示符。如果你看到 # 作为提示符,你需要是超级用户(更多内容见第 2 章)。
本书的组织方式
我将本书的章节分为三个基本部分。第一部分是介绍性的,提供系统的鸟瞰图,然后让你动手体验一些在运行 Linux 期间始终需要的工具。接下来,你将更详细地探索系统的每个部分,从设备管理到网络配置,遵循系统启动的大致顺序。最后,你将参观运行系统中的一些组件,学习一些基本技能,并深入了解程序员使用的工具。
除第 2 章外,早期章节大多大量涉及 Linux 内核,但你会随着本书的推进逐渐进入用户空间(如果你不明白我在说什么,别担心;我会在第 1 章中解释)。
这些内容力求尽可能与发行版无关。话虽如此,涵盖系统软件的所有变体可能很繁琐,所以我尽量涵盖两大发行版系列:Debian(包括 Ubuntu)和 RHEL/Fedora/CentOS。我还专注于桌面和服务器的安装。相当多的内容也适用于嵌入式系统(如 Android 和 OpenWRT),但你需要自己去发现这些平台上的差异。
第三版的新内容?
第二版出版时正值 Linux 系统的过渡时期。几个传统组件正在被替换,这使得处理某些主题变得棘手,因为读者可能遇到各种各样的配置。然而现在,那些新组件(特别是 systemd)几乎被普遍采用,所以我能够精简相当多的讨论。
我保留了对内核在 Linux 系统中作用的强调。这部分内容很受欢迎,而且你可能比自己意识到的更频繁地与内核交互。
我新增了一章介绍虚拟化。虽然 Linux 在虚拟机(如云服务)上一直很受欢迎,但这种虚拟化不在本书的讨论范围内,因为系统在虚拟机上的运行方式与在“裸机”硬件上几乎相同。因此,这里的讨论主要集中于解读你会遇到的术语。然而,自从第二版出版以来,容器越来越受欢迎,它们也适合放在这里,因为它们基本上由一堆 Linux 特性组成,就像本书其余部分描述的那些。容器大量使用 cgroups,这也在第三版中得到了新的处理。
其他我愉快地扩展了的主题(不一定与容器相关)包括逻辑卷管理器、journald 日志系统以及网络材料中的 IPv6。
虽然我增加了相当多的内容,但这本书仍然保持了合理的篇幅。我想提供让你快速入门所需的信息,这包括在过程中解释某些难以理解的细节,但我不想让你为了拿起这本书而不得不变成举重运动员。一旦你掌握了这里的重要主题,你应该能够轻松地寻找并理解更多细节。
第一版包含了一些历史信息,后来我为了提升聚焦度而删除了。如果你对 Linux 及其与 Unix 历史的关系感兴趣,可以阅读 Peter H. Salus 的《The Daemon, the Gnu, and the Penguin》(Reed Media Services, 2008)。它很好地解释了我们所使用的软件如何随时间演变。
关于术语的说明
某些操作系统元素的名称在历史上引起了相当多的争论——甚至“Linux”这个词本身也是如此。应该叫“Linux”还是“GNU/Linux”以反映该操作系统也包含 GNU 项目的部分?在本书中,我尽量使用最常见、最不拗口的名称。