第一部分 基础篇
第1章 第一次亲密接触 2
1.1 让Linux入驻我们的电脑 2
1.1.1 我们用Linux的理由 3
1.1.2 选择哪个发行版 4
1.1.3 安装系统 6
1.1.4 登录系统 15
1.2 不一样的图形操作 15
1.2.1 没有图形的图形 15
1.2.2 架构设计 17
1.3 主流桌面环境 18
1.3.1 KDE初学者的首选 18
1.3.2 GNOME不可磨灭的经典 20
1.3.3 XFCE——轻量、简单、高效 21
1.3.4 LXDE——更轻,同样精悍 21
1.4 返璞归真的命令行 22
1.4.1 开始执行命令 22
1.4.2 文本和图形的切换 23
1.4.3 基础命令的操作 23
1.4.4 快捷键 26
1.4.5 错误信息 28
1.4.6 联机帮助——man很靠谱 30
1.4.7 致命的Linux命令 31
1.5 结束语 32
第2章 融于心而表于行 33
2.1 多用户多任务分时操作系统 33
2.2 用户的身份 35
2.2.1 澡堂子模型 35
2.2.2 理解用户角色 36
2.2.3 /etc/passwd文件查看用户 37
2.2.4 /etc/group文件查看组 38
2.2.5 管理用户和组 39
2.2.6 夺面双雄——利用sudo假借身份 41
2.2.7 我是谁? 44
2.3 文件和它与权限的关系 45
2.3.1 目录与文件 46
2.3.2 文件属性和权限 47
2.3.3 文件连接到底是什么 49
2.3.4 修改文件的属性和权限 51
2.3.5 深入文件权限 52
2.3.6 文件的基本操作 54
2.3.7 搜索文件 55
2.3.8 对文件打包压缩 57
2.4 程序的执行问题 58
2.4.1 执行程序的方法,以及多任务协调机制 58
2.4.2 计划任务 62
2.4.3 守护进程及其作用 64
2.4.4 全面了解程序信息 66
2.5 软件的安装方式 71
2.5.1 从源代码安装软件 71
2.5.2 利用软件管理工具rpm和dpkg 72
2.5.3 更酷的线上升级 73
2.6 磁盘的管理方式 76
2.6.1 Linux的文件系统——甩Windows几条街 76
2.6.2 磁盘的基本操作 78
2.6.3 /etc/fstab文件——决定分区的连接 83
2.6.4 弹性调整容量——逻辑卷 85
2.7 解决上网问题 90
2.7.1 了解IP地址 90
2.7.2 相关配置文件 91
2.7.3 安装网卡 92
2.7.4 手工设定IP地址 92
2.7.5 自动获取IP地址 93
2.7.6 固定IP上网方式 93
2.7.7 ADSL拨号上网方式 94
2.8 不能割舍的shell 96
2.8.1 勤勤恳恳的bash 96
2.8.2 环境变量 98
2.8.3 bash的配置文件 98
2.9 文本处理 101
2.9.1 查看文本内容 101
2.9.2 正则表达式 101
2.9.3 搜索文本的grep 104
2.9.4 排序和去重 105
2.9.5 文件对比命令——diff 105
2.10 结束语 107
第3章 一棵“树”的奥秘 108
3.1 Linux的文件组织结构 109
3.2 基本组织原则 110
3.3 根文件系统 111
3.3.1 原则与特性 111
3.3.2 必备的内容 112
3.3.3 可选的内容 113
3.4 子目录 113
3.4.1 /bin目录——shell命令 113
3.4.2 /boot目录——启动过程所需内容 115
3.4.3 /dev目录——设置文件 116
3.4.4 /etc目录——配置文件 116
3.4.5 /home目录——用户专有 118
3.4.6 /lib目录——共享库和内核模块 119
3.4.7 /media目录——可移动设备 119
3.4.8 /mnt目录——临时挂接 120
3.4.9 /opt目录——附加软件包 120
3.4.10 /root目录——root专有 120
3.4.11 /sbin目录——必备的系统软件 121
3.4.12 /srv目录——服务进程所需数据 121
3.4.13 /tmp目录——临时文件 122
3.5 /usr目录组织结构 122
3.5.1 /usr/bin目录 123
3.5.2 /usr/include目录 123
3.5.3 /usr/lib目录 123
3.5.4 /usr/local目录 123
3.5.5 /usr/sbin目录 124
3.5.6 /usr/share目录 124
3.5.7 /usr/share/man目录 125
3.5.8 /usr/share/misc目录 126
3.6 /var目录组织结构 127
3.6.1 /var/account目录 128
3.6.2 /var/cache目录 128
3.6.3 /var/lib目录 128
3.6.4 /var/lock目录 128
3.6.5 /var/log目录 129
3.6.6 /var/mail目录 129
3.6.7 /var/opt目录 129
3.6.8 /var/run目录 129
3.6.9 /var/spool目录 130
3.6.10 /var/tmp目录 130
3.7 结束语 130
第4章 “笨”出来的文化和哲学 131
4.1 Unix的文化和哲学 133
4.2 “四大笨”之一:万般皆文本 134
4.2.1 二进制的烦恼 135
4.2.2 文本的快乐 135
4.2.3 文本之于配置文件 136
4.2.4 文本之于程序组合 137
4.2.5 文本之于通信协议 138
4.2.6 硬件也文本 138
4.3 “四大笨”之二:四处用脚本 139
4.3.1 富饶的脚本语言 139
4.3.2 为什么不是C 140
4.3.3 脚本的不足和混合编程 141
4.3.4 强力胶水 141
4.3.5 极端的例子 143
4.3.6 软件的适度规模 143
4.4 “四大笨”之三:规律无处寻 144
4.4.1 机制与策略 145
4.4.2 接口与引擎 145
4.4.3 不用重新造轮子 146
4.4.4 内在的支持 146
4.4.5 沉默是金,吝啬是银 147
4.5 “四大笨”之四:配置乱生根 148
4.5.1 什么是不可配的 148
4.5.2 配置三元素 149
4.5.3 配置文件 150
4.5.4 环境变量 151
4.5.5 命令行选项 152
4.6 什么样的文化 154
4.6.1 “傻x”的精明 154
4.6.2 “简单”不简单 155
4.7 这一切的基础大师的阐释 156
第5章 shell脚本编程 159
5.1 第一个shell脚本程序 159
5.2 编程的基本要素 160
5.2.1 变量 162
5.2.2 运算 164
5.2.3 流程控制 165
5.2.4 自定义函数 169
5.3 输入和输出 172
5.3.1 基本的输出 172
5.3.2 命令行参数 172
5.3.3 使用read读取文本行 173
5.3.4 文件描述符 174
5.3.5 格式化输出 175
5.4 调试跟踪 175
5.4.1 空变量问题 175
5.4.2 缺引号问题 176
5.4.3 隔离问题 176
5.4.4 echo普通中见“伟大” 177
5.4.5 “-x”跟踪问题本领高 177
5.4.6 assert函数 177
5.4.7 Caller命令 178
5.4.8 trap命令 178
5.5 高级特性 180
5.5.1 波浪号“~” 180
5.5.2 通配符 180
5.5.3 元字符 181
5.5.4 转义符 182
5.5.5 命令替换 183
5.5.6 运算优先级 183
5.5.7 文件包含 184
5.5.8 eval语句 185
5.5.9 内建命令 186
5.6 shell脚本编程实战 187
5.6.1 守护进程的启动脚本 187
5.6.2 读取数据文件和平滑启动nginx 188
第6章 微型语言 194
6.1 什么是微型语言 194
6.2 软件管理的RPM 196
6.2.1 构建你的第一个RPM包 197
6.2.2 工作原理——分析Spec文件 199
6.2.3 依赖关系 203
6.2.4 个软件多个包 204
6.2.5 小结 206
6.3 制作联机帮助文档的Groff 206
6.3.1 Groff简介 207
6.3.2 Groff的工作方式 208
6.3.3 如何制作一份联机帮助文档 213
6.3.4 导出联机帮助文档 219
6.3.5 小结 220
6.4 把文本当数据库的awk 221
6.4.1 使用方法 221
6.4.2 基本概念 222
6.4.3 注释与空白 223
6.4.4 字符串 223
6.4.5 数值 225
6.4.6 变量 228
6.4.7 模式与行为 229
6.4.8 行为语句 231
6.4.9 小结 237
6.5 神奇的计算器dc和bc 238
6.5.1 历史渊源——最古老的Unix语言dc 238
6.5.2 dc简介 239
6.5.3 更为常用的bc 244
6.5.4 小结 250
6.6 不为人知的m4 250
6.6.1 m4的历史 251
6.6.2 m4的特性 252
6.6.3 从Hello World开始 253
6.6.4 工作方式 255
6.6.5 小结 257
6.7 结束语 258
第7章 编辑器的纷争 259
7.1 独步青云的vi 260
7.1.1 我为vi狂 260
7.1.2 vi的使用 261
7.1.3 vi的高级功能 264
7.1.4 跟我一起打造一个IDE 266
7.2 横刀立马的Emacs 274
7.2.1 Emacs的来历 274
7.2.2 Emacs的基本使用 275
7.2.3 使用Emacs必知必会 278
7.2.4 Lisp语言 279
7.2.5 处理中文问题 283
7.2.6 跟我一起打造一个IDE 283
7.3 结束语 285
第8章 我是Makefile 286
8.1 GNU make及其基本用法 288
8.2 基本概念 289
8.2.1 第一个Makefile例子 290
8.2.2 目标、条件和命令 291
8.2.3 依赖 292
8.2.4 工作方式 292
8.2.5 基本语法 293
8.3 认识规则 294
8.3.1 标准规则 294
8.3.2 隐式规则 294
8.3.3 变量 295
8.3.4 自动变量 297
8.3.5 模式规则 299
8.3.6 假目标 300
8.3.7 路径搜索 302
8.4 高级特性 303
8.4.1 文件包含 303
8.4.2 命令 305
8.4.3 深入变量 307
8.4.4 宏与函数 310
8.4.5 条件指令 311
8.5 Makefile实战 312
8.5.1 自动产生依赖 312
8.5.2 递归式的Makefile 315
8.5.3 自动产生Makefile 317
8.6 结束语 323
第二部分 进阶篇
第9章 特种文件系统 326
9.1 日志和ReiserFS 326
9.1.1 理解日志 327
9.1.2 ReiserFS——卓越的小文件性能与渺茫的未来 328
9.1.3 应用实战 331
9.1.4 小结 331
9.2 进程文件系统procfs 331
9.2.1 神秘的9号计划 332
9.2.2 /proc目录 333
9.2.3 procfs实战 335
9.2.4 小结 339
9.3 tmpfs——满足你对“时空”的双重渴望 339
9.3.1 背景 340
9.3.2 tmpfs文件系统 341
9.3.3 tmpfs实战 341
9.4 devfs和sysfs 345
9.4.1 devfs的由来 345
9.4.2 进入devfs 346
9.4.3 sysfs的由来 347
9.4.4 小结 348
9.5 其他特种文件系统 348
9.5.1 RelayFS 348
9.5.2 debugfs 349
9.6 结束语 349
第10章 生死与共的“兄弟” 351
10.1 死心眼儿的BIOS 352
10.2 小肚鸡肠的MBR(主引导记录) 353
10.2.1 MBR的结构 353
10.2.2 磁盘分区表 353
10.2.3 MBR的功能 355
10.3 和事佬GRUB(牛B的统一引导加载器) 355
10.3.1 Bootloader 355
10.3.2 GRUB的功能 356
10.3.3 GRUB的工作流程 357
10.4 唇齿相依的内核启动参数 358
10.4.1 什么是内核启动参数 358
10.4.2 内核启动参数的格式 359
10.4.3 常用的内核启动参数 359
10.5 自力更生的Linux内核 360
10.5.1 内核引导协议 360
10.5.2 内核为什么要压缩 360
10.5.3 startup_32 361
10.5.4 start_kernel 362
10.5.5 kernel_init 362
10.6 及时雨initramfs 363
10.6.1 寻找init的问题 363
10.6.2 较早的initrd 363
10.6.3 为什么选择initramfs 364
10.7 “生”、“死”永相伴的init进程 364
10.7.1 名不副实 364
10.7.2 运行级别 365
10.7.3 进入运行级别之前 368
10.7.4 进入运行级别 369
10.7.5 转换运行级别 371
10.8 幕后英雄们 371
10.8.1 终端 372
10.8.2 getty系列命令 372
10.8.3 Display Manager 373
10.8.4 伪终端 374
10.8.5 配置文件 374
10.9 结束语 375
第11章 独霸网络的“蜘蛛神功” 376
11.1 功夫理论:网络知识 376
11.2 “蜘蛛神功”第一层:网络工具 378
11.2.1 马步:ifconfig 378
11.2.2 掌法:route 380
11.2.3 腿功:netstat 381
11.2.4 眼力:DNS二把刀 383
11.2.5 身法:tcpdump 385
11.3 “蜘蛛神功”第二层:套接字 387
11.4 内功心法:TCP/IP协议栈初探 388
11.4.1 枯树盘根:系统调用 388
11.4.2 凝神静态:sockfs文件系统 390
11.4.3 气沉丹田:sk_buff 392
11.5 临战杂谈 397
11.5.1 对UDP的错误的认识 398
11.5.2 事半功倍,调节内核参数 399
第12章 一个网络一个世界 402
12.1 You’ve Got a Mail 402
12.1.1 Email服务模式 402
12.1.2 架设Postfix服务器 405
12.1.3 Email故事的结局 409
12.2 联接世界的Web应用 409
12.2.1 Web服务器 410
12.2.2 数据库 412
12.2.3 解释型语言 413
12.2.4 架设Web服务器 414
12.3 铜墙铁壁真功夫——Linux内核集成的IP信息包过滤系统 419
12.3.1 iptables 420
12.3.2 netfilter 423
12.3.3 实践出真知 426
12.3.4 小盒子的秘密 427
12.4 分享文件的乐趣 434
12.4.1 NFS 438
12.4.2 Samba 442
12.5 在虚拟与现实之间穿梭——实现安全的连接 446
12.5.1 VPN实现方式 447
12.5.2 IPSec VPN 448
12.5.3 SSL VPN 452
第13章 打通任督二脉 455
13.1 了解网络驱动 455
13.1.1 网络设备闲谈 455
13.1.2 ioctl这把刷子 456
13.1.3 设备驱动的秘密 459
13.2 无线风光在险峰 461
13.2.1 WLAN 461
13.2.2 Bluetooth 466
13.2.3 NFC——近距无线通信 469
13.2.4 谜底 474
13.3 奇迹是执着创造出来的 474
13.3.1 从2.4到2.6 474
13.3.2 从2.6到3.0 477
第14章 身在江湖 479
14.1 C2级安全认证 479
14.2 Linux的安全问题 480
14.2.1 黑客入侵 480
14.2.2 “病毒泛滥” 482
14.2.3 拒绝服务攻击 483
14.2.4 小结 484
14.3 PAM用户认证机制 485
14.3.1 什么是PAM(可拔插认证模块) 485
14.3.2 PAM的体系结构 485
14.3.3 配置PAM 487
14.3.4 密码映射 494
14.4 应用PAM API 495
14.4.1 开发概述 495
14.4.2 PAM事务 496
14.4.3 事务属性 498
14.4.4 用户认证 499
14.4.5 认证凭证 500
14.4.6 PAM会话 501
14.4.7 用户认证流程 502
14.4.8 模块开发 507
14.4.9 密码的保存 508
14.5 安全增强系统 509
14.5.1 主动访问控制DAC 509
14.5.2 强制访问控制MAC 510
14.5.3 SELinux——Linux的MAC实现 511
14.6 结束语 515
第15章 七种武器 516
15.1 长生剑:fork 516
15.1.1 从线程说起 516
15.1.2 古老而充满活力的进程 520
15.1.3 多进程程序开发 523
15.1.4 进程间通信的实现 531
15.2 离别钩:VFS 537
15.2.1 一切都是文件 538
15.2.2 一棵有生命的“树” 538
15.2.3 VFS简介 539
15.2.4 基本数据结构 540
15.2.5 sockfs 541
15.3 孔雀翎:mmap(内存映射) 543
15.3.1 理解mmap 543
15.3.2 虚拟内存技术 544
15.3.3 应用mmap 548
15.4 碧玉刀:epoll(增强I/O复用) 553
15.4.1 C10K问题 553
15.4.2 epoll的优点 554
15.4.3 epoll的工作模式 555
15.4.4 正确使用epoll 556
15.4.5 用epoll解决C100K问题 561
15.5 多情环:udev 564
15.5.1 设计理念 564
15.5.2 基本构成 565
15.5.3 配置文件 566
15.5.4 规则 566
15.6 霸王枪:LVS 567
15.6.1 负载均衡 567
15.6.2 一个中国人的勇气 569
15.6.3 LVS的特点 570
15.6.4 LVS的工作模式 571
15.6.5 LVS的负载均衡调度算法 576
15.7 拳头:module 578
15.7.1 内核中的Web服务 578
15.7.2 编写你的第一个module 579
15.7.3 module与普通程序的不同 582
15.7.4 module与用户通信 584
15.7.5 内核加载module的原理 590
15.8 结束语 592
第16章 谁都可以从头再来——从头开始编译一套Linux系统 593
16.1 初识工具链——准备环境的必备工具 594
16.1.1 编译器 594
16.1.2 连接器 594
16.1.3 程序库 595
16.1.4 工具链——破解奇特的四角恋 595
16.2 准备环境 596
16.2.1 宿主系统环境 597
16.2.2 生成工具链的binutils 598
16.2.3 生成工具链的gcc 599
16.2.4 生成工具链的glibc 600
16.2.5 解决工具链的一些问题 603
16.2.6 第二次生成工具链的binutils 604
16.2.7 第二次生成工具链的gcc 605
16.2.8 丰富工具链的功能 608
16.2.9 整理工具链 610
16.2.10 小结 610
16.3 生成目标系统的运行环境 611
16.3.1 准备工作 611
16.3.2 安装glibc 614
16.3.3 调整工具链 617
16.3.4 安装binutils 617
16.3.5 安装gcc 618
16.3.6 安装其他基础设施 620
16.3.7 系统启动脚本 622
16.3.8 结束语 623
16.4 定制Linux内核 623
16.4.1 内核的make参数 624
16.4.2 定制界面 625
16.4.3 编译与安装 626
16.5 独立运行 627
16.5.1 /etc/fstab文件 627
16.5.2 使用GRUB配置启动过程 627
16.6 结束语 628
第三部分 扩展篇
第17章 窈窕淑女君子好逑 630
17.1 女人心事难捉摸——Linux图形环境 630
17.1.1 X Window 630
17.1.2 桌面系统 638
17.1.3 XOrg 639
17.2 云想衣裳花想容——Qt与GTK 644
17.2.1 发展历史 644
17.2.2 GTK与Qt的比较 646
17.2.3 大家闺秀Qt 648
17.2.4 小鸟依人GTK 657
第18章 这里也是鼓乐笙箫 667
18.1 与多媒体的第一次握手 667
18.1.1 听声 668
18.1.2 看影 669
18.1.3 多媒体工作室 674
18.2 鼓——ffmpeg 676
18.2.1 羞辱柱与软件许可 676
18.2.2 多媒体的来龙去脉 678
18.2.3 家庭成员 684
18.3 乐——MPlayer与VLC 685
18.3.1 绿色的MPlayer 685
18.3.2 浪漫的VLC 687
18.4 笙——FrameBuffer 690
18.4.1 原理 691
18.4.2 设置FrameBuffer 691
18.4.3 文字倒置滚动 692
18.5 箫——V4L2与ALSA 697
18.5.1 V4L2 698
18.5.2 ALSA 703
18.6 结束语 707
第19章 团结就是力量 708
19.1 标准的前世今生 708
19.1.1 一场拆分引发的标准 708
19.1.2 站在POSIX肩膀上的LSB 709
19.1.3 工作组 711
19.1.4 标准化流程 712
19.2 认证 713
19.3 工具 714
19.3.1 LSB SDK 715
19.3.2 App Checker 716
19.3.3 Distribution Checker 718
19.3.4 LSB Navigator 720
19.3.5 lsb_release的规范定义和实现 720
19.4 LSB的前世今生 721
19.4.1 吃一堑,长一智 722
19.4.2 “哥只是个传说” 723
19.4.3 意气风发的LSB5.0 724
19.5 结束语 724
附录 我的Linux,我做主 725
· · · · · · (
收起)