[套装书]Linux哲学+Linux内核分析及应用(2册)

作者
[美] 戴维·博特(David Both)陈科
丛书名
Linux/Unix技术丛书
出版社
机械工业出版社
ISBN
9781909171431
简要
简介
内容简介书籍计算机书籍 ---------------------------Linux哲学--------------------------- 本书揭示并说明了命令行的强大功能和灵活性,以及支持这些特质的设计和使用的理念。了解如何从Linux命令行中提取尽可能多的信息,可以帮助你成为更好的系统管理员。理解为什么Linux和Unix世界中的许多事情都是按现在这样完成的,以及如何将Linux哲学应用于系统管理。 ---------------------------Linux内核分析及应用--------------------------- 本书由资深架构师亲力打造,分享了他十多年后端开发经验,特别是围绕Linux系统进行的服务开发经验。本书共8章,主要内容包括:第1章介绍Linux对进程和线程的实现原理,并分析了Memcached和Nginx工作进程池模型的实现;第2章介绍并发的概念以及Linux中的并发相关工具,然后分析常见开源软件的并发问题;第3章介绍Linux是如何进行内存管理的,分析了Memcached和Redis的内存管理机制。第4章介绍Linux系统对中断进行的封装和实现原理;第5章介绍I/O的全过程,并介绍了某些开源系统中I/O相关调用的实现等;第6章介绍Linux文件系统的整体架构及核心概念,然后介绍了ext4文件系统特点,以及tfs小文件系统的设计思路;第7章介绍Linux进程隔离技术,以及Docker容器的部分实现;第8章介绍Linux网络层数据的流转过程,以及lvs如何在netfilter上定制,最后分析了Nginx服务器socket监听初始化的过程。
目录



---------------------------Linux哲学---------------------------


译者序
作者简介
技术审阅者简介
致谢
第一部分 导论
第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
第二部分 基础
第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 FHS57
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 SELinux69
6.6 解决问题71
6.6.1 不正确地使用文件系统72
6.6.2 电子邮件收件箱72
6.6.3 坚持标准72
6.6.4 这个文件在哪里73
6.7 小结74
第三部分 功能
第7章 拥抱CLI77
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 shell83
7.2.11 SSH85
7.2.12 screen85
7.3 GUI和CLI87
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 SAR104
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 logwatch115
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 crontab133
9.6.2 cron.d135
9.6.3 anacron136
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 /boot204
14.4.2 /home204
14.4.3 /usr205
14.4.4 /opt206
14.4.5 /var206
14.4.6 /tmp206
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 LibreOffice216
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 WordPress224
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
第四部分 成为禅师
第17章 追求优雅239
17.1 硬件优雅239
17.1.1 PCB240
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 为什么我更喜欢SystemV271
19.2.2 为什么我更喜欢systemd272
19.2.3 真正的问题272
19.3 桌面环境272
19.4 用sudo还是不用sudo273
19.4.1 绕过sudo274
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 好奇心把我引入了Linux304
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



---------------------------Linux内核分析及应用---------------------------


前言
第1章 进程与线程 1
1.1 进程和线程的概念 1
1.1.1 进程的历史 1
1.1.2 线程的不同玩法 3
1.2 Linux对进程和线程的实现 5
1.2.1 Linux中的进程实现 6
1.2.2 进程创建之后 12
1.2.3 内核线程和进程的区别 13
1.2.4 用户线程库pthread 15
1.3 进程的调度 16
1.3.1 进程调度机制的架构 16
1.3.2 进程切换的原理 19
1.3.3 调度中的CPU亲和度 21
1.4 在应用程序中管理进程和线程 22
1.4.1 Memcached线程池模型分析 22
1.4.2 Nginx进程模型分析 24
1.5 处理进程和线程的相关工具 25
1.5.1 开发环境调试线程 25
1.5.2 进程崩溃调试方法 26
1.5.3 strace工具 28
1.5.4 SystemTap工具 29
1.5.5 DTrace工具 30
1.6 本章小结 32
第2章 并发 33
2.1 什么是并发 34
2.1.1 并发是如何产生的 34
2.1.2 并发会带来什么问题 34
2.1.3 如何解决并发带来的问题 35
2.2 操作系统会在哪些场景遇到并发 35
2.3 Linux中并发工具的实现 37
2.3.1 原子变量 37
2.3.2 自旋锁 38
2.3.3 信号量 42
2.3.4 互斥锁 43
2.3.5 读写锁 43
2.3.6 抢占 44
2.3.7 per-cpu变量 45
2.3.8 RCU机制 48
2.3.9 内存屏障 51
2.4 常见开源软件中的并发问题分析 54
2.4.1 Nginx原子性 54
2.4.2 Memcached中的互斥锁 55
2.4.3 Redis无锁解决方案 56
2.4.4 Linux中惊群问题分析 57
2.4.5 解决MyCat同步问题 65
2.4.6 false-sharing问题解决方案 67
2.5 本章小结 69
第3章 内存管理 70
3.1 为什么需要内存管理 71
3.2 MMU和地址空间 73
3.2.1 虚拟地址、线性地址、物理地址 73
3.2.2 MMU的内存管理机制 74
3.3 Linux中的分段和分页机制 79
3.3.1 分段机制 79
3.3.2 分页机制 80
3.4 Linux的内存管理 82
3.4.1 物理内存管理 83
3.4.2 进程地址空间管理 86
3.5 Linux的内存分配和管理 89
3.5.1 物理内存分配算法 89
3.5.2 slab分配器 95
3.5.3 内核态内存管理 105
3.5.4 用户态内存申请 109
3.6 栈内存分配和管理 109
3.7 内存管理案例分析 110
3.7.1 Memcached内存管理机制分析 110
3.7.2 Redis内存管理机制分析 113
3.8 本章小结 115
第4章 中断机制 116
4.1 x86系统的中断机制 116
4.1.1 x86中断架构 117
4.1.2 x86在保护模式下的中断 117
4.2 Linux对中断的支持和实现 119
4.2.1 初始化IRQ中断门 120
4.2.2 中断响应流程 120
4.2.3 中断回调handler注册过程 122
4.3 Linux加速中断处理的机制 122
4.3.1 软中断 122
4.3.2 tasklet 126
4.3.3 工作队列 128
4.4 系统调用 132
4.5 时钟中断 134
4.6 信号处理机制 135
4.7 Nginx信号处理机制 139
4.8 本章小结 141
第5章 输入输出 142
5.1 I/O在Linux中的生命周期 143
5.1.1 vfs层 143
5.1.2 文件系统层 144
5.1.3 Block层 152
5.1.4 scsi层 156
5.1.5 I/O流程总结 157
5.2 I/O调度器 159
5.3 多队列机制 161
5.4 I/O多路复用实现 163
5.5 Redis对epoll的封装 170
5.6 Nginx文件异步I/O 175
5.7 tail指令为何牛 177
5.8 零拷贝技术应用分析 179
5.8.1 mmap 180
5.8.2 sendfile 181
5.8.3 mmap和sendfile在开源软件中的使用 183
5.9 本章小结 186
第6章 文件系统 187
6.1 Linux文件系统架构 187
6.2 文件系统的主要功能 189
6.2.1 文件系统的安装 190
6.2.2 文件路径查找 191
6.3 ext4文件系统 201
6.3.1 磁盘布局 201
6.3.2 inode定位 203
6.3.3 碎片问题解决方案 204
6.3.4 extent tree结构 204
6.4 淘宝TFS小文件系统分析 206
6.5 本章小结 207
第7章 Linux的进程隔离技术与Docker容器 208
7.1 虚拟化相关技术 208
7.2 Linux进程隔离技术 209
7.2.1 chroot 209
7.2.2 namespace 210
7.2.3 cgroup 212
7.3 Docker容器的部分实现 219
7.3.1 新版Docker架构 220
7.3.2 containerd的实现 221
7.4 本章小结 241
第8章 Linux网络层数据流分析 242
8.1 数据在网络层的流转 242
8.1.1 sk_buff结构 243
8.1.2 数据流转过程 244
8.2 socket接口层的实现 248
8.2.1 socket系统初始化 248
8.2.2 socket创建 250
8.2.3 socket绑定 251
8.2.4 socket监听 253
8.2.5 socket接受连接 254
8.2.6 新连接的到来 257
8.2.7 socket整体流程 259
8.3 netfilter和lvs 260
8.3.1 netfilter 260
8.3.2 lvs 263
8.4 网络相关的一些参数 265
8.4.1 Java socket相关的参数 265
8.4.2 Linux TCP相关队列 267
8.5 Nginx服务器监听socket初始化过程 268
8.6 本章小结 274




有问题微信扫码联系

推荐

Understand China
桂ICP备20004708号-4