第一部分 导论 3
第1章 Linux哲学简介 3
1.1 我是系统管理员吗 4
1.2 哲学的结构 6
1.3 谁应该读这本书 7
1.3.1 但我不满足这些要求 8
1.3.2 谁不适合读这本书 8
1.4 Linux的真相 9
1.5 限制性操作系统 9
1.6 Linux是开放和免费的 9
1.7 真正的知识 10
1.8 启示 10
第2章 准备 11
2.1 实验 11
2.2 系统要求 12
2.2.1 如何访问命令行 13
2.2.2 创建student用户 13
2.2.3 准备U盘 14
2.3 实验不起作用怎么办 15
第二部分 基础 20
第3章 数据流 20
3.1 文本流——通用接口 20
3.2 STDIO文件句柄 21
3.3 生成数据流 21
3.4 使用“yes”来检验一个理论 23
3.5 探索U盘 25
3.6 随机流 29
3.7 小结 30
第4章 转换数据流 31
4.1 数据流作为原材料 31
4.2 管道梦 32
4.3 建立管线 33
4.4 重定向 34
4.5 管线的挑战 37
4.5.1 问题 37
4.5.2 解决方案 38
4.5.3 关于解决方案的思考 41
4.6 小结 41
第5章 一切都是文件 42
5.1 什么是文件 42
5.2 设备文件 43
5.3 udev简化 43
5.4 设备数据流 45
5.5 设备文件分类 46
5.6 有趣的设备文件 47
5.7 随机数、零等设备 50
5.8 备份主引导记录 53
5.9 一切都是文件的应用 56
5.10 小结 56
第6章 使用Linux FHS 57
6.1 定义 57
6.2 标准 58
6.3 使用定义明确的文件系统结构 59
6.4 Linux统一目录结构 60
6.5 特殊文件系统 61
6.5.1 /proc文件系统 61
6.5.2 /sys文件系统 66
6.5.3 SELinux 69
6.6 解决问题 71
6.6.1 不正确地使用文件系统 72
6.6.2 电子邮件收件箱 72
6.6.3 坚持标准 72
6.6.4 这个文件在哪里 73
6.7 小结 74
第三部分 功能 77
第7章 拥抱CLI 77
7.1 定义命令行 77
7.2 CLI术语 78
7.2.1 命令提示符 78
7.2.2 命令行 78
7.2.3 命令行界面 78
7.2.4 终端 78
7.2.5 控制台 79
7.2.6 虚拟控制台 80
7.2.7 终端仿真器 81
7.2.8 伪终端 83
7.2.9 会话 83
7.2.10 shell 83
7.2.11 SSH 85
7.2.12 screen 85
7.3 GUI和CLI 87
7.3.1 非限制性接口 88
7.3.2 邮件列表 88
7.4 解决方案原则 90
7.5 用大数据阻止他们 90
7.6 CLI的威力 92
第8章 当一名懒惰的系统管理员 93
8.1 准备工作 93
8.2 真正的生产力 93
8.3 预防性维护 94
8.4 最小化打字量 95
8.4.1 别名 95
8.4.2 其他打字捷径 96
8.5 文件命名 96
8.6 Bash效率 97
8.6.1 自动补全功能 97
8.6.2 命令行调用和编辑 98
8.6.3 历史记录 99
8.6.4 使用历史记录 100
8.7 日志是你的朋友 103
8.7.1 SAR 104
8.7.2 邮件日志 106
8.7.3 消息 106
8.7.4 dmesg 107
8.7.5 安全 108
8.7.6 跟踪日志文件 110
8.7.7 systemd日志 111
8.7.8 logwatch 115
8.8 成功地当一名懒惰的系统管理员 117
第9章 自动化一切 118
9.1 为什么我使用脚本 118
9.2 我是如何达到的 119
9.3 编写重复性任务脚本 119
9.3.1 让它更容易 120
9.3.2 从理想到必要 120
9.4 更新 121
9.5 其他自动化水平 131
9.6 使用cron进行定时自动化操作 133
9.6.1 crontab 133
9.6.2 cron.d 135
9.6.3 anacron 136
9.6.4 关于作业安排的提示 138
9.6.5 关于cron的想法 138
9.6.6 cron资源 138
9.7 其他可能自动化的任务 139
9.8 深化哲学 140
第10章 始终使用shell脚本 141
10.1 定义 141
10.2 系统管理员语境 142
10.2.1 需求 143
10.2.2 开发速度 143
10.2.3 性能速度 144
10.2.4 变量 145
10.2.5 测试 145
10.2.6 开放和开源 145
10.3 把shell脚本作为原型 146
10.4 处理 146
10.4.1 快捷而不完善 146
10.4.2 规划和远见 147
10.5 小结 156
第11章 尽早测试,经常测试 157
11.1 流程 158
11.1.1 创建测试计划 158
11.1.2 在一开始就开始测试 159
11.1.3 最终测试 160
11.1.4 生产测试 160
11.2 模糊测试 161
11.3 自动化测试 161
11.4 尝试一下 162
11.4.1 MOTD脚本的需求 163
11.4.2 MOTD脚本测试计划 163
11.4.3 开发脚本 164
11.4.4 添加健全性检查 167
11.4.5 版本号 168
11.5 修复脚本 177
11.6 小结 178
第12章 使用常识命名 179
12.1 脚本和程序名称 179
12.2 变量 181
12.2.1 命名变量 181
12.2.2 把一切变成变量 182
12.3 子程序 184
12.4 主机 185
12.5 机构命名 185
12.6 小结 186
第13章 以公开格式存储数据 187
13.1 封闭是不可理解的 187
13.2 开放是可知的 188
13.3 纯ASCII文本 188
13.3.1 系统配置文件 189
13.3.2 全局Bash配置 193
13.3.3 用户配置文件 195
13.3.4 ASCII的可贵之处 197
13.4 小结 198
第14章 对数据使用分离的文件系统 199
14.1 为什么我们需要分离的文件系统 199
14.1.1 硬盘崩溃 200
14.1.2 文件系统填满 200
14.2 挽救便携式计算机 200
14.3 数据安全 202
14.4 建议 203
14.4.1 /boot 204
14.4.2 /home 204
14.4.3 /usr 205
14.4.4 /opt 206
14.4.5 /var 206
14.4.6 /tmp 206
14.4.7 其他分支 207
14.5 一开始就分离文件系统 207
14.6 稍后添加分离的文件系统 207
14.7 小结 212
第15章 使程序可移植 213
15.1 从英特尔PC到大型机 213
15.2 体系结构 214
15.3 可移植性限制 215
15.3.1 许可 215
15.3.2 技术 215
15.3.3 LibreOffice 216
15.4 shell脚本 216
15.5 互联网和可移植性 218
15.6 创建网页 218
15.6.1 静态内容 219
15.6.2 作为新工作的动态网页 220
15.6.3 CGI——开放并可移植 223
15.6.4 WordPress 224
15.7 小结 225
第16章 使用开源软件 226
16.1 开源的定义 226
16.2 开源定义(注释) 227
16.3 为什么这很重要 229
16.4 创造术语 229
16.5 许可我们自己的代码 229
16.6 机构代码共享 230
16.6.1 孤岛很差劲 231
16.6.2 开放式机构和代码共享 231
16.6.3 要避免的事情 232
16.7 代码可用性 232
16.7.1 我如何分享代码 232
16.7.2 代码共享注意事项 233
16.8 小结 235
第四部分 成为禅师 239
第17章 追求优雅 239
17.1 硬件优雅 239
17.1.1 PCB 240
17.1.2 主板 240
17.1.3 计算机 240
17.1.4 数据中心 241
17.1.5 电源和接地 241
17.2 软件优雅 242
17.3 修复我的网站 245
17.4 删除废物 246
17.4.1 旧的或未使用的程序 246
17.4.2 脚本中的旧代码 249
17.4.3 旧文件 250
17.5 小结 255
第18章 追求简单 257
18.1 数字中的复杂性 257
18.2 简单性的基础知识 258
18.3 永无止境的简化过程 259
18.4 简单的程序做一件事 259
18.5 简单程序很小 261
18.6 简单与哲学 262
18.6.1 简化我自己的程序 263
18.6.2 简化他人的程序 263
18.6.3 未注释的代码 263
18.7 硬件 267
18.8 Linux和硬件 268
18.9 窘境 268
18.10 小结 269
第19章 使用你喜爱的编辑器 270
19.1 不仅仅是编辑器 271
19.2 Linux启动 271
19.2.1 为什么我更喜欢SystemV 271
19.2.2 为什么我更喜欢systemd 272
19.2.3 真正的问题 272
19.3 桌面环境 272
19.4 用sudo还是不用sudo 273
19.4.1 绕过sudo 274
19.4.2 sudo的有效用途 275
19.5 小结 276
第20章 记录一切 277
20.1 红男爵 278
20.2 我的文档理念 278
20.2.1 帮助选项 279
20.2.2 自由地注释代码 280
20.2.3 我编写代码文档的流程 282
20.3 手册页 282
20.4 系统文档 282
20.5 为现有代码编写文档 285
20.6 保持文档更新 285
20.7 小结 286
第21章 备份一切,经常备份 287
21.1 数据丢失 287
21.2 依靠备份救援 289
21.2.1 问题 289
21.2.2 恢复 294
21.3 按我的方式做 294
21.3.1 备份选项 295
21.3.2 异地备份 300
21.4 灾难恢复服务 301
21.5 其他选择 301
21.6 如何“经常”备份 301
21.7 小结 302
第22章 追随你的好奇心 303
22.1 查理 303
22.2 好奇心把我引入了Linux 304
22.3 好奇心解决问题 307
22.4 追随自己的好奇心 320
22.4.1 成为作者 320
22.4.2 失败是一种机会 321
22.4.3 去做就对了 321
22.5 小结 322
第23章 没什么应当 323
23.1 始终存在各种可能性 323
23.2 释放力量 324
23.3 解决问题 325
23.3.1 批判性思维 326
23.3.2 解决问题的推理 327
23.4 自知之明 330
23.5 多样性的含义 331
23.6 量化考核狂热 331
23.7 优秀的管理人员 332
23.8 协作 333
23.8.1 孤岛城市 334
23.8.2 简单的方法 334
23.9 小结 335
第24章 指导年轻的系统管理员 336
24.1 雇用合适的人 337
24.2 指导 337
24.3 解决问题的艺术 339
24.4 示例 343
24.5 迭代 344
24.6 小结 345
第25章 支持你最喜欢的开源项目 346
25.1 项目选择 346
25.2 编写代码 347
25.3 测试 347
25.4 提交错误报告 348
25.5 文档 348
25.6 协助 349
25.7 教学 349
25.8 写作 350
25.9 捐赠 351
25.10 小结 351
第26章 现实部分 352
26.1 人 352
26.2 指手画脚的管理者 353
26.3 过犹不及 354
26.4 技术支持烦恼 354
26.5 你应当按我的方式做 355
26.6 可以拒绝 356
26.7 科学方法 356
26.8 了解过去 357
26.9 结语 357
参考文献 358