本书内容源自淘宝技术大学的培训实战。由来自阿里巴巴集团的资深Linux系统专家赵鑫磊和同样来自阿里巴巴集团的支付宝网络技术有限公司的高级专家Jie Zhang(张洁)共同著写。
两位作者用轻松、诙谐的语言讲解了高深的Linux特性。通俗易懂、深入浅出,从Linux设计思想的角度出发,授人以渔。同时,又密切结合应用案例,透彻展示出Linux的系统架构设计是如何在实际中贯穿的,从而让读者真正掌握Linux的强大之处。书中不含较为复杂的技术理论问题,一切从实际出发。
全书共分为三个部分:基础篇、进阶篇和扩展篇。通过对Linux的版本选择与安装、基本使用与系统结构、设计哲学与思想、脚本编程与软件开发、内核编译、网络与认证,以及多媒体等几个方面的精彩讲解,将Linux操作系统的灵魂与运用教授给读者。
赵鑫磊
阿里巴巴集团资深Linux系统专家。
自1998年开始使用Linux,曾参与国内著名的Linux社区发行版MagicLinux的开发工作,是一个土生土长的东北人。工作经历丰富,开过小网吧、大学讲过课、发过小广告(时在阿里妈妈)、干过铁路工(开发铁路车载电视系统)、当过副总裁,但始终没有放弃对Linux的探索与研究,并将这份经历凝聚在了本书之中。
电子邮箱:jagen.zhao@gmail.com
来往账号:飞芃
微信账号:567867
Jie Zhang(张洁)
阿里巴巴集团支付宝网络技术有限公司高级专家。
曾在美国、日本、加拿大和中国的多家高科技企业担任过技术总监等职。参与研发的Jack of Spades Combo卡于1999年3月获得北美权威的PC Magazine杂志的Editors' Choice奖,并赢得PC Computing MVP Finalist Award奖。自1998年开始从事Linux开发,研发基于Linux平台的网络、多媒体、通讯和电子商务等多领域的高科技产品与项目,获中国国家科技进步三等奖,并拥有多项国家发明专利。
电子邮箱:jie_joy_zhang@yahoo.com
来往账号:方如
微信账号:fangru-jiezhang
目 录
第一部分 基础篇 第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 为什么