第1章 走近GNU/Linux、LFS 1
1.1 GNU、Linux、Hurd及开源软件 2
1.1.1 开源的兴起——GNU简介 2
1.1.2 开源项目的标志—Linux简介 3
1.1.3 “古老的开源内核”——Hurd简介 3
1.1.4 越来越多的开源软件 4
1.2 GNU/Linux的发行版 4
1.2.1 Debian GNU/Linux——发行版中的常青树 4
1.2.2 RedHat Linux——Linux系统的代名词 4
1.2.3 Slackware Linux——古老而简洁的发行版 5
1.2.4 Arch Linux——快速、轻量的发行版 5
1.2.5 Gentoo——可高度定制的发行版 5
1.2.6 越来越多的Linux发行版 6
1.3 创造自己的GNU/Linux系统——LFS 6
1.4 GNU/Linux相关标准化介绍 6
1.4.1 POSIX标准简介 7
1.4.2 LSB——Linux系统兼容的新起点 7
1.4.3 FHS——文件存放标准 7
1.5 源代码定制系统相关网络资源 8
第2章基 础准备——Linux系统定制原理 9
2.1 Linux系统的组成及架构 10
2.1.1 了解Linux——Linux系统使用案例分析 10
2.1.2 Linux系统的一般组成 11
2.1.3 Linux系统的架构 14
2.2 Linux的启动过程 16
2.3 本地定制Linux系统的原理 18
2.3.1 名词说明 18
2.3.2 源代码的编译过程 19
2.3.3 系统制作的反向分析 20
2.4 本地定制GNU/Linux系统的制作步骤设计 30
2.4.1 制作流程分解 30
2.4.2 制作过程中的相关技术 33
2.4.3 制作步骤设计 38
第3章 制作GNU/Linux系统的准备工作 43
3.1 准备好你的计算机 44
3.2 下载必要的软件 44
3.2.1 LiveCD的下载 44
3.2.2 虚拟机软件——VirtualBox 45
3.2.3 LiveCD的使用 54
3.3 保存和恢复工作状态的方法 55
3.3.1 虚拟机专用的状态保存及恢复方法 55
3.3.2 通用的恢复方法 56
3.4 创建制作分区 56
3.4.1 设置新的分区 56
3.4.2 格式化分区 57
第4章 本地定制GNU/Linux系统——临时系统 61
4.1 设置环境变量 62
4.1.1 “创作基地”的建立 62
4.1.2 建立用于制作系统的用户 64
4.1.3 设置制作用户的环境 66
4.1.4 创建测试文件 67
4.1.5 恢复工作状态(1) 68
4.2 编译软件包的一般步骤 70
4.2.1 什么是软件包 70
4.2.2 软件包的下载 70
4.2.3 软件包解压缩 71
4.2.4 进入源代码目录 72
4.2.5 给源代码应用补丁文件 73
4.2.6 配置源代码 74
4.2.7 编译源代码和安装软件 74
4.2.8 软件包编译安装过程正确性判断 75
4.2.9 软件包编译安装过程记录 76
4.2.10 软件包安装的文件 77
4.2.11 反安装软件包 77
4.2.12 删除源代码目录 78
4.3 预工具链 78
4.3.1 汇编链接器(Binutils) 78
4.3.2 编译器(GCC) 81
4.4 临时工具链 85
4.4.1 内核头文件(Linux kernel headers) 85
4.4.2 基本C库(Glibc) 87
4.4.3 调整工具链 89
4.4.4 汇编工具(Binutils) 91
4.4.5 编译工具(GCC) 92
4.4.6 测试工具集 96
4.5 临时系统 98
4.5.1 文本交互函数库(Ncurses) 98
4.5.2 用户交互环境(Bash) 98
4.5.3 压缩工具(Bzip2) 99
4.5.4 常用命令工具集(Coreutils) 100
4.5.5 文件比较工具(Diffutils) 101
4.5.6 文件查找工具(Findutils) 101
4.5.7 文本处理工具(Gawk) 102
4.5.8 国际化语言支持工具(Gettext) 102
4.5.9 文本匹配搜索工具(Grep) 103
4.5.10 压缩工具(Gzip) 103
4.5.11 宏处理工具(M4) 104
4.5.12 语法分析工具(Bison) 104
4.5.13 编译过程控制工具(Make) 105
4.5.14 补丁文件使用工具(Patch) 105
4.5.15 广泛使用的脚本语言(Perl) 106
4.5.16 文本流编辑工具(Sed) 107
4.5.17 文件打包工具(Tar) 107
4.5.18 信息阅读工具(Texinfo) 108
4.5.19 清理临时系统 108
4.5.20 退出临时系统制作用户 110
4.5.21 恢复工作状态(2) 110
第5章 本地定制GNU/Linux系统——目标系统 112
5.1 目标系统环境设置 113
5.1.1 设置环境变量 113
5.1.2 恢复工作状态(3) 116
5.1.3 建立目标环境目录 117
5.1.4 建立目标系统用户 120
5.1.5 建立必要的文件 122
5.2 目标系统工具链的制作 123
5.2.1 Linux内核头文件(Linux-Header) 123
5.2.2 GNU基本C库(Glibc) 124
5.2.3 调整工具链 133
5.2.4 ZIP格式支持库(Zlib) 135
5.2.5 汇编器(Binutils) 138
5.2.6 任意精度算法库(GMP) 141
5.2.7 高精度浮点数算法库(MPFR) 142
5.2.8 编译器(GCC) 143
5.2.9 工具链的回测 146
5.3 目标系统的制作 147
5.3.1 Linux系统帮助手册(Man-Pages) 147
5.3.2 高性能数据库(Berkeley DB) 149
5.3.3 阶段性检查 151
5.3.4 文本流编辑工具(Sed) 151
5.3.5 软件包安装信息读取工具(Pkg-config) 153
5.3.6 文本下的鼠标工具(GPM) 154
5.3.7 文本环境交互函数库(Ncurses) 155
5.3.8 Linux系统常用工具(Util-Linux-ng) 158
5.3.9 EXT文件系统管理工具(E2fsprogs) 162
5.3.10 常用命令工具集(Coreutils) 165
5.3.11 端口及协议文件(Iana-etc) 169
5.3.12 宏处理工具(M4) 169
5.3.13 语法分析工具(Bison) 170
5.3.14 常用进程管理工具(Procps) 171
5.3.15 文本匹配搜索工具(Grep) 172
5.3.16 行编辑支持库(Readline) 173
5.3.17 用户交互环境工具(Bash) 175
5.3.18 恢复工作状态(4) 176
5.3.19 GNU通用库支持工具(Libtool) 177
5.3.20 小型数据库(GDBM) 178
5.3.21 常用网络工具集(Inetutils) 179
5.3.22 脚本语言工具(Perl) 180
5.3.23 自动化配置脚本生成工具(Autoconf) 183
5.3.24 自动化编译脚本生成工具(Automake) 184
5.3.25 压缩工具(Bzip2) 184
5.3.26 文件比较工具(Diffutils) 187
5.3.27 文件类型查询工具(File) 188
5.3.28 文本处理工具(Gawk) 188
5.3.29 文件查找工具(Findutils) 189
5.3.30 程序生成工具(Flex) 191
5.3.31 国际化语言支持工具(Gettext) 192
5.3.32 格式化文本工具(Groff) 194
5.3.33 压缩工具(Gzip) 196
5.3.34 网络管理工具(IPRoute2) 197
5.3.35 键盘映射表工具(Kbd) 199
5.3.36 分页查看命令(Less) 202
5.3.37 编译过程控制工具(Make) 203
5.3.38 帮助手册查看工具(Man-DB) 204
5.3.39 Linux内核模块管理工具(Module-Init-Tools) 205
5.3.40 补丁文件使用工具(Patch) 206
5.3.41 进程管理工具(Psmisc) 207
5.3.42 密码管理工具(Shadow) 208
5.3.43 日志记录工具(Rsyslog) 210
5.3.44 开关机过程控制工具(Sysvinit) 212
5.3.45 文件打包工具(Tar) 214
5.3.46 信息阅读工具(Texinfo) 215
5.3.47 设备文件自动管理工具(Udev) 217
5.3.48 动态网络地址获取工具(DHCPCD) 220
5.3.49 强大的文本编辑器(VIM) 221
5.3.50 压缩工具(XZ-Utils) 223
5.3.51 数值处理工具(Bc) 225
5.3.52 加密算法支持库(OpenSSL) 226
5.3.53 安全的主机互联工具(OpenSSH) 228
5.3.54 文件下载工具(Wget) 230
5.3.55 Linux系统启动脚本集(Bootscript) 231
5.3.56 安装启动器(GRUB) 233
5.3.57 Linux内核 235
5.3.58 清除调试信息 237
5.4 使系统可以启动 238
5.4.1 制作目标系统启动相关文件 238
5.4.2 设置启动器 43
5.4.3 重新启动进入新系统 246
5.5 如何提高成功率以及部分常见问题的解决方法 247
5.5.1 制作前的准备 247
5.5.2 制作中的常见问题 248
5.5.3 制作后的疑问 255
第6章 LiveCD/DVD的制作 257
6.1 LiveCD启动原理 258
6.1.1 计算机的引导过程 258
6.1.2 LiveCD的启动过程 263
6.2 LiveCD相关技术介绍 265
6.2.1 回环设备(Loop Device) 265
6.2.2 镜像文件 266
6.2.3 临时文件系统——TmpFS 268
6.2.4 压缩文件系统——SquashFS 269
6.2.5 复合文件系统——AUFS 269
6.2.6 启动器——GRUB 271
6.3 LiveCD制作的准备工作 271
6.3.1 工作目录 272
6.3.2 压缩文件系统操作工具(Squashfs-tools) 272
6.3.3 光盘文件制作工具(Mkisofs) 273
6.3.4 文件打包工具(Cpio) 274
6.3.5 文件下载工具(CURL) 275
6.3.6 版本管理工具(Git) 275
6.4 LiveCD最终系统的制作 276
6.5 LiveCD专用内核制作 279
6.5.1 LiveCD对内核的要求 279
6.5.2 AUFS的内核补丁 280
6.5.3 准备Linux内核源代码 280
6.5.4 配置Linux内核源代码 281
6.5.5 编译安装LiveCD专用内核 285
6.6 LiveCD初始化辅助系统的制作 286
6.6.1 Initrd 286
6.6.2 Initramfs 292
6.7 LiveCD的生成 298
6.7.1 最终系统的完成 298
6.7.2 在光盘上安装GRUB-2 299
6.7.3 生成iso文件 300
6.8 完成之后 301
第7章 LiveUSB的制作 307
7.1 LiveUSB相关原理 308
7.1.1 什么是LiveUSB 308
7.1.2 LiveUSB与LiveCD 308
7.1.3 LiveUSB的启动 311
7.2 Live系统的启动方式 314
7.2.1 直接文件系统启动方式 314
7.2.2 镜像文件系统启动方式 315
7.2.3 U盘搜索的不同方式 317
7.2.4 两类启动Live系统方式的对比 319
7.3 LiveUSB制作的准备工作 320
7.3.1 工作目录 320
7.3.2 相关软件包的编译安装 321
7.4 Live系统的制作 325
7.5 LiveUSB专用内核制作 328
7.5.1 LiveUSB对内核的要求 328
7.5.2 AuFS的内核补丁 328
7.5.3 准备Linux内核源代码 329
7.5.4 配置Linux内核源代码 329
7.5.5 编译安装LiveUSB专用内核 333
7.6 LiveUSB初始化辅助系统的制作 334
7.6.1 Initramfs的init命令 334
7.6.2 制作辅助系统 339
7.6.3 辅助系统与内核的合并 341
7.7 LiveUSB的生成 343
7.7.1 最终系统的完成 343
7.7.2 设置GRUB-2 344
7.7.3 创建LiveUSB的U盘 346
7.7.4 U盘安装GRUB-2 348
7.7.5 扫尾工作 349
第8章 交叉编译GNU/Linux系统原理 351
8.1 交叉编译简介 352
8.1.1 交叉编译的定义 352
8.1.2 交叉编译的适用范围 352
8.2 目标平台的准备 352
8.2.1 常见的CPU 353
8.2.2 大端和小端的字节序 353
8.2.3 目标平台的选择 354
8.3 交叉编译原理及相关技术 354
8.3.1 名词说明 354
8.3.2 程序文件的交叉编译 355
8.3.3 交叉编译目标系统 356
8.3.4 Sysroot方式交叉编译目标系统 359
8.4 交叉编译的实施步骤设计 364
8.4.1 制作流程阶段分解 364
8.4.2 制作步骤设计 367
8.5 交叉编译的准备 370
第9章 交叉编译GNU/Linux系统过程 372
9.1 制作环境准备 373
9.1.1 创建工作目录 373
9.1.2 创建制作用户 374
9.1.3 设置制作用户 375
9.1.4 相关软件包下载 377
9.2 目标系统准备 378
9.2.1 恢复工作状态(1) 378
9.2.2 建立目录结构 380
9.2.3 创建必要的用户和组 381
9.2.4 创建必要文件 382
9.3 制作交叉工具链 382
9.3.1 内核头文件(Linux-Header) 382
9.3.2 Binutils交叉工具 383
9.3.3 GCC交叉工具(仅支持C语言) 385
9.3.4 目标系统的Glibc 386
9.3.5 GCC交叉工具(支持C语言和C++语言) 392
9.3.6 测试交叉工具链 393
9.4 完善交叉编译环境 395
9.4.1 File软件包 395
9.4.2 Groff软件包 396
9.4.3 Shadow软件包 397
9.4.4 Ncurses软件包 398
9.4.5 清理交叉编译环境 399
9.5 制作目标系统 400
9.5.1 制作环境设置 400
9.5.2 恢复工作状态(2) 402
9.5.3 Linux系统帮助手册(Man-pages) 403
9.5.4 ZIP格式支持库(Zlib) 403
9.5.5 汇编工具集(Binutils) 404
9.5.6 任意精度算法库(GMP) 406
9.5.7 高精度浮点数算法库(MPFR) 407
9.5.8 编译器(GCC) 408
9.5.9 文本流编辑工具(Sed) 410
9.5.10 文本下的鼠标工具(GPM) 411
9.5.11 文本环境交互函数库(Ncurses) 411
9.5.12 Linux系统常用工具集(Util-Linux-ng) 413
9.5.13 EXT文件系统管理工具(E2fsprogs) 414
9.5.14 常用命令工具集(Coreutils) 416
9.5.15 端口及协议文件(Iana-Etc) 418
9.5.16 宏处理工具(M4) 418
9.5.17 语法分析工具(Bison) 418
9.5.18 进程管理工具(Procps) 419
9.5.19 GNU通用库支持工具(Libtool) 420
9.5.20 行编辑支持库(Readline) 420
9.5.21 自动化配置脚本生成工具(Autoconf) 421
9.5.22 自动化编译脚本生成工具(Automake) 422
9.5.23 用户交互环境工具(Bash) 422
9.5.24 压缩工具(Bzip2) 424
9.5.25 网络地址自动获取工具(DHCPCD) 425
9.5.26 文件比较工具(Diffutils) 425
9.5.27 文件类型查询工具(File) 426
9.5.28 文件查找工具(Findutils) 426
9.5.29 程序生成工具(Flex) 427
9.5.30 文本处理工具(Gawk) 428
9.5.31 国际化语言支持工具(Gettext) 429
9.5.32 文本匹配搜索工具(Grep) 430
9.5.33 格式化文本工具(Groff) 430
9.5.34 压缩工具(Gzip) 431
9.5.35 网络测试工具集(IPutils) 432
9.5.36 网络管理工具(IPRoute2) 433
9.5.37 键盘映射表工具(Kbd) 434
9.5.38 分页查看器(Less) 435
9.5.39 编译过程控制工具(Make) 435
9.5.40 帮助手册查看工具(Man) 436
9.5.41 Linux内核模块管理工具(Module-Init-Tools) 438
9.5.42 补丁文件使用工具(Patch) 438
9.5.43 进程管理工具(Psmisc) 439
9.5.44 密码管理工具(Shadow) 440
9.5.45 日志记录工具(Rsyslog) 441
9.5.46 开关机过程控制工具(Sysvinit) 443
9.5.47 文件打包工具(Tar) 445
9.5.48 信息阅读工具(Texinfo) 445
9.5.49 设备文件自动管理工具(Udev) 446
9.5.50 文本编辑器(VIM) 447
9.5.51 文件下载工具(Wget) 450
9.5.52 压缩工具(XZ-Utils) 450
9.5.53 Bootscript启动脚本安装 451
9.6 使系统可以启动 452
9.6.1 Linux内核 452
9.6.2 制作目标系统启动相关文件 454
9.7 目标系统的使用 456
9.7.1 切换用户 457
9.7.2 目标系统所有者设置 457
9.7.3 目标系统打包 457
9.7.4 将系统存放到目标计算机中 458
9.7.5 建立启动选项 458
9.7.6 启动目标系统 459
第10章 GNU/Hurd系统的制作 460
10.1 GNU/Hurd简介 461
10.2 GNU/Hurd制作原理 463
10.3 GNU/Hurd制作的实施步骤设计 466
10.3.1 制作流程阶段分解 466
10.3.2 制作步骤设计 470
10.4 GNU/Hurd制作的准备 473
10.5 制作环境准备 474
10.5.1 创建工作目录 474
10.5.2 创建制作用户 475
10.5.3 设置制作用户 476
10.6 目标系统准备 477
10.6.1 恢复工作状态(1) 477
10.6.2 建立目录结构 479
10.6.3 创建必要的文件 480
10.7 制作交叉工具链 480
10.7.1 Autoconf(工具链环境) 481
10.7.2 Automake(工具链环境) 481
10.7.3 启动器GRUB-1 481
10.7.4 汇编链接器(Binutils) 482
10.7.5 编译器(GCC) 483
10.7.6 微内核头文件(GNU Mach-Headers) 484
10.7.7 Hurd内核头文件(GNU Hurd-Headers) 485
10.7.8 MIG(编译Hurd内核所需工具) 486
10.7.9 Glibc的头文件(Glibc-Headers) 487
10.7.10 Binutils(交叉工具链) 488
10.7.11 GCC(交叉工具链) 489
10.7.12 目标系统的C函数库(Glibc) 491
10.8 制作微型目标系统 493
10.8.1 GNU Mach微内核 494
10.8.2 GNU Hurd内核 495
10.8.3 目标系统的汇编工具(Binutils) 496
10.8.4 GMP函数库 497
10.8.5 MPFR函数库 497
10.8.6 目标系统的编译器(GCC) 498
10.8.7 临时的Bash 499
10.8.8 文本流编辑工具(Sed) 501
10.8.9 文本匹配搜索工具(Grep) 501
10.8.10 常用命令工具集(Coreutils) 502
10.8.11 编译过程控制命令(Make) 503
10.8.12 文件比较工具(Diffutils) 503
10.8.13 文本处理工具(Gawk) 504
10.8.14 压缩工具(Gzip) 505
10.8.15 文件打包工具(Tar) 505
10.8.16 完成微型系统 506
10.9 建立相对完整的目标系统 510
10.9.1 本地制作的准备 510
10.9.2 恢复工作状态(2) 512
10.9.3 补丁文件使用工具(Patch) 512
10.9.4 压缩工具(Bzip2) 512
10.9.5 文件查找工具(Findutils) 514
10.9.6 GCC编译器(C/C++) 514
10.9.7 文本环境交互函数库(Ncurses) 516
10.9.8 国际化语言支持工具(Gettext) 517
10.9.9 信息阅读工具(Texinfo) 518
10.9.10 高性能数据库(Berkeley DB) 518
10.9.11 端口及协议文件(Iana-etc) 519
10.9.12 EXT文件系统管理工具(E2fsprogs) 519
10.9.13 宏处理工具(M4) 520
10.9.14 语法分析工具(Bison) 521
10.9.15 GNU通用库支持工具(Libtool) 521
10.9.16 ZIP格式支持库(Zlib) 522
10.9.17 脚本语言工具(Perl) 522
10.9.18 行编辑支持库(Readline) 523
10.9.19 自动化配置脚本生成工具(Autoconf) 524
10.9.20 自动化编译脚本生成工具(Automake) 524
10.9.21 文件类型查询工具(File) 525
10.9.22 用户交互环境工具(Bash) 525
10.9.23 程序生成工具(Flex) 526
10.9.24 格式化文本工具(Groff) 527
10.9.25 常用网络工具集(Inetutils) 527
10.9.26 分页查看器(Less) 529
10.9.27 帮助手册查看工具(Man-DB) 529
10.9.28 进程管理工具(Psmisc) 530
10.9.29 密码管理工具(Shadow) 531
10.9.30 压缩工具(XZ-Utils) 533
10.9.31 文本编辑器(VIM) 533
10.9.32 文件下载工具(Wget) 535
10.9.33 Hurd内核编译相关工具(MIG) 536
10.10 启动GNU/Hurd系统 536
10.10.1 设置系统相关配置文件 536
10.10.2 重新设置GRUB配置文件 538
10.10.3 重新启动,进入GNU/Hurd 539
参考文献 542