第一部分 基础篇 2
第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.1KDE初学者的首选 18
1.3.2GNOME不可磨灭的经典 20
1.3.3XFCE——轻量、简单、高效 21
1.3.4LXDE——更轻,同样精悍 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.1Linux的文件系统——甩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.7ADSL拨号上网方式 94
2.8不能割舍的shell 96
2.8.1勤勤恳恳的bash 96
2.8.2环境变量 98
2.8.3bash的配置文件 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.1Linux的文件组织结构 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.1Unix的文化和哲学 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.4echo普通中见“伟大” 177
5.4.5“-x”跟踪问题本领高 177
5.4.6assert函数 177
5.4.7Caller命令 178
5.4.8trap命令 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.8eval语句 185
5.5.9内建命令 186
5.6shell脚本编程实战 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.1Groff简介 207
6.3.2Groff的工作方式 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.2dc简介 239
6.5.3更为常用的bc 244
6.5.4小结 250
6.6不为人知的m4 250
6.6.1m4的历史 251
6.6.2m4的特性 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.2vi的使用 261
7.1.3vi的高级功能 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.5Makefile实战 312
8.5.1自动产生依赖 312
8.5.2递归式的Makefile 315
8.5.3自动产生Makefile 317
8.6结束语 323
第二部分 进阶篇 326
第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.3procfs实战 335
9.2.4小结 339
9.3tmpfs——满足你对“时空”的双重渴望 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.1Bootloader 355
10.3.2GRUB的功能 356
10.3.3GRUB的工作流程 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内功心法:TC/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.1You’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.1C2级安全认证 479
14.2Linux的安全问题 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.2PAM的体系结构 485
14.3.3配置PAM 487
14.3.4密码映射 494
14.4应用PAM API 495
14.4.1开发概述 495
14.4.2PAM事务 496
14.4.3事务属性 498
14.4.4用户认证 499
14.4.5认证凭证 500
14.4.6PAM会话 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.3VFS简介 539
15.2.4基本数据结构 540
15.2.5sockfs 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.1C10K问题 553
15.4.2epoll的优点 554
15.4.3epoll的工作模式 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
第三部分 扩展篇 630
第17章 窈窕淑女君子好逑 630
17.1女人心事难捉摸——Linux图形环境 630
17.1.1X Window 630
17.1.2桌面系统 638
17.1.3XOrg 639
17.2云想衣裳花想容——Qt与GTK 644
17.2.1发展历史 644
17.2.2GTK与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.1V4L2 698
18.5.2ALSA 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.1LSB SDK 715
19.3.2App Checker 716
19.3.3Distribution Checker 718
19.3.4LSB Navigator 720
19.3.5lsb release的规范定义和实现 720
19.4LSB的前世今生 721
19.4.1吃一堑,长一智 722
19.4.2“哥只是个传说” 723
19.4.3意气风发的LSB5.0 724
19.5结束语 724
附录 我的Linux,我做主 725