具体描述
本书讲解了Linux操作系统的工作机制以及运行Linux系统所需的常用工具和命令。根据系统启动的大体顺序,本书更深入地介绍从设备管理到网络配置的各个部分,最后演示了系统各部分的运行方式,并介绍了一些基本技巧和开发人员常用的工具。
Linux不像其他操作,会对用户隐藏很多重要的东西。相反,Linux会让用户掌控一切。而要掌控一切,就必须理解这个操作系统的工作机制,包括如何启动、如何连网,以及Linux内核如何工作。本书是畅销书的新版本,作者拥有多年的实践经验,内容通俗易懂。通过这本书,读者可以迅速从Linux新手变成老鸟,把作者丰富的经验装进自己的知识库。
作者简介
Brian Ward
毕业于芝加哥大学,获计算机科学博士学位。1993年开始接触Linux,研究并教授Linux二十余年。除了这本深受读者喜爱的书,Brian还著有Linux Kernel-HOWTO(No Starch Press)、The Linux Problem Solver(No Starch Press)等畅销著作。现居旧金山,身兼计算机高级顾问与高级讲师等数职。
目录信息
1.1 Linux操作系统中的抽象级别和层次 2
1.2 硬件系统:理解主内存 3
1.3 内核 3
1.3.1 进程管理 4
1.3.2 内存管理 5
1.3.3 设备驱动程序和设备管理 5
1.3.4 系统调用和系统支持 5
1.4 用户空间 6
1.5 用户 7
1.6 前瞻 8
第2章 基础命令和目录结构 9
2.1 Bourne shell: /bin/sh 9
2.2 shell的使用 10
2.2.1 shell窗口 10
2.2.2 cat命令 11
2.2.3 标准输入输出 11
2.3 基础命令 11
2.3.1 ls命令 12
2.3.2 cp命令 12
2.3.3 mv命令 12
2.3.4 touch命令 13
2.3.5 rm命令 13
2.3.6 echo命令 13
2.4 浏览目录 13
2.4.1 cd命令 14
2.4.2 mkdir命令 14
2.4.3 rmdir命令 14
2.4.4 shell通配符 14
2.5 中间命令 15
2.5.1 grep命令 15
2.5.2 less命令 16
2.5.3 pwd命令 16
2.5.4 diff命令 16
2.5.5 file命令 17
2.5.6 find和locate命令 17
2.5.7 head和tail命令 17
2.5.8 sort命令 17
2.6 更改密码和shell 18
2.7 dot文件 18
2.8 环境变量和shell变量 18
2.9 命令路径 19
2.10 特殊字符 19
2.11 命令行编辑 20
2.12 文本编辑器 21
2.13 获取在线帮助 21
2.14 shell输入输出 23
2.14.1 标准错误输出 23
2.14.2 标准输入重定向 24
2.15 理解错误信息 24
2.15.1 解析Unix的错误信息 24
2.15.2 常见错误 25
2.16 查看和操纵进程 26
2.16.1 命令选项 26
2.16.2 终止进程 27
2.16.3 任务控制 27
2.16.4 后台进程 28
2.17 文件模式和权限 28
2.17.1 更改文件权限 29
2.17.2 符号链接 30
2.17.3 创建符号链接 30
2.18 归档和压缩文件 31
2.18.1 gzip命令 31
2.18.2 tar命令 31
2.18.3 压缩归档文件(.tar.gz) 32
2.18.4 zcat命令 32
2.18.5 其他的压缩命令 33
2.19 Linux目录结构基础 33
2.19.1 root目录下的其他目录 34
2.19.2 /usr目录 35
2.19.3 内核位置 35
2.20 以超级用户的身份运行命令 35
2.20.1 sudo命令 35
2.20.2 /etc/sudoers 35
2.21 前瞻 36
第3章 设备管理 37
3.1 设备文件 37
3.2 sysfs设备路径 38
3.3 dd命令和设备 39
3.4 设备名总结 40
3.4.1 硬盘:/dev/sd* 40
3.4.2 CD和DVD:/dev/sr* 41
3.4.3 PATA 硬盘:/dev/hd* 41
3.4.4 终端设备/dev/tty/*、/dev/pts/*和/dev/tty 41
3.4.5 串行端口:/dev/ttyS* 42
3.4.6 并行端口:/dev/lp0 和/dev/lp1 42
3.4.7 音频设备:/dev/snd/*、/dev/dsp、/dev/audio 和其他 43
3.4.8 创建设备文件 43
3.5 udev 44
3.5.1 devtmpfs 44
3.5.2 udevd的操作和配置 44
3.5.3 udevadm 46
3.5.4 设备监控 47
3.6 详解SCSI和Linux内核 47
3.6.1 USB存储设备和SCSI 50
3.6.2 SCSI和ATA 50
3.6.3 通用SCSI设备 51
3.6.4 访问设备的多种方法 51
第4章 硬盘和文件系统 53
4.1 为磁盘设备分区 55
4.1.1 查看分区表 55
4.1.2 更改分区表 56
4.1.3 磁盘和分区的构造 57
4.1.4 固态硬盘 58
4.2 文件系统 59
4.2.1 文件系统类型 59
4.2.2 创建文件系统 60
4.2.3 挂载文件系统 60
4.2.4 文件系统UUID 62
4.2.5 磁盘缓冲、缓存和文件系统 62
4.2.6 文件系统挂载选项 63
4.2.7 重新挂载文件系统 64
4.2.8 /etc/fstab文件系统表 64
4.2.9 /etc/fstab的替代者 65
4.2.10 文件系统容量 65
4.2.11 检查和修复文件系统.66
4.2.12 特殊用途的文件系统.68
4.3 交换空间 68
4.3.1 使用磁盘分区作为交换空间 69
4.3.2 使用文件作为交换空间 69
4.3.3 你需要多大的交换空间 69
4.4 前瞻:磁盘和用户空间 70
4.5 深入传统文件系统 70
4.5.1 查看inode细节 72
4.5.2 在用户空间中使用文件系统 73
4.5.3 文件系统的演进 73
第5章 Linux内核的启动 75
5.1 启动消息 75
5.2 内核初始化和启动选项 76
5.3 内核参数 77
5.4 引导装载程序 78
5.4.1 引导装载程序任务 78
5.4.2 引导装载程序概述 79
5.5 GRUB 简介 79
5.5.1 使用GRUB命令行浏览设备和分区 81
5.5.2 GRUB配置信息 83
5.5.3 安装GRUB 84
5.6 UEFI 安全启动的问题 86
5.7 链式加载其他操作系统 86
5.8 引导装载程序细节 86
5.8.1 MBR启动 87
5.8.2 UEFI启动 87
5.8.3 GRUB工作原理 87
第6章 用户空间的启动 89
6.1 init介绍 89
6.2 System V运行级别 90
6.3 识别你的init 91
6.4 systemd 91
6.4.1 单元和单元类型 91
6.4.2 systemd中的依赖关系 92
6.4.3 systemd配置 94
6.4.4 systemd操作 96
6.4.5 在systemd中添加单元 98
6.4.6 systemd进程跟踪和同步 99
6.4.7 systemd的按需和资源并行启动 99
6.4.8 systemd的System V兼容性 103
6.4.9 systemd辅助程序 103
6.5 Upstart 104
6.5.1 Upstart初始化过程 104
6.5.2 Upstart任务 105
6.5.3 Upstart配置 107
6.5.4 Upstart操作 110
6.5.5 Upstart日志 111
6.5.6 Upstart运行级别和System V兼容性 111
6.6 System V init 112
6.6.1 System V init启动命令顺序 113
6.6.2 System V init链接池 114
6.6.3 run-parts 115
6.6.4 System V init控制 115
6.7 关闭系统 116
6.8 initramfs 117
6.9 紧急启动和单用户模式 118
第7章 系统配置:日志、系统时间、批处理任务和用户 119
7.1 /etc目录结构 119
7.2 系统日志 120
7.2.1 系统日志 120
7.2.2 配置文件 120
7.3 用户管理文件 122
7.3.1 /etc/passwd文件 122
7.3.2 特殊用户 123
7.3.3 /etc/shadow文件 124
7.3.4 用户和密码管理 124
7.3.5 用户组 124
7.4 getty和login 125
7.5 设置时间 125
7.5.1 内核时间和时区 126
7.5.2 网络时间 127
7.6 使用cron来调度日常任务 127
7.6.1 安装crontab文件 128
7.6.2 系统crontab文件 128
7.6.3 cron的未来 129
7.7 使用at进行一次性任务调度 129
7.8 了解用户ID和用户切换 129
7.9 用户标识和认证 131
7.10 PAM 132
7.10.1 PAM配置 133
7.10.2 关于PAM的一些注解 135
7.10.3 PAM和密码 136
7.11 前瞻 136
第8章 进程与资源利用详解 137
8.1 进程跟踪 137
8.2 使用lsof 查看打开的文件 138
8.2.1 lsof输出 138
8.2.2 lsof的使用 139
8.3 跟踪程序执行和系统调用 139
8.3.1 strace命令 139
8.3.2 ltrace命令 141
8.4 线程 141
8.4.1 单线程进程和多线程进程 141
8.4.2 查看线程 142
8.5 资源监控简介 143
8.6 测量CPU时间 143
8.7 调整进程优先级 144
8.8 平均负载 145
8.8.1 uptime的使用 145
8.8.2 高负载 145
8.9 内存 146
8.9.1 内存工作原理 146
8.9.2 内存页面错误 146
8.10 使用vmstat监控CPU和内存性能 147
8.11 I/O监控 149
8.11.1 使用iostat 149
8.11.2 使用iotop查看进程的I/O使用和监控 150
8.12 使用pidstat监控进程 151
8.13 更深入的主题 151
第9章 网络与配置 153
9.1 网络基础 153
9.2 网络层次 154
9.3 网际层 155
9.3.1 查看自己计算机的IP 地址 156
9.3.2 子网 157
9.3.3 共用子网掩码与无类域内路由选择 157
9.4 路由和内核路由表 158
9.5 基本ICMP和DNS工具 159
9.5.1 ping 159
9.5.2 traceroute 160
9.5.3 DNS与host 160
9.6 物理层与以太网 161
9.7 理解内核网络接口 161
9.8 配置网络接口 162
9.9 开机启动的网络配置 163
9.10 手动和开机启动的网络配置带来的问题 163
9.11 一些网络配置管理器 164
9.11.1 NetworkManager的操作 164
9.11.2 与NetworkManager交互 164
9.11.3 NetworkManager的配置 165
9.12 解析主机名 166
9.12.1 /etc/hosts 167
9.12.2 resolv.conf 文件 167
9.12.3 缓存和零配置DNS 167
9.12.4 /etc/nsswitch.conf文件 168
9.13 Localhost 168
9.14 传输层:TCP、UDP和Service 169
9.14.1 TCP 端口与连接 169
9.14.2 建立TCP连接 169
9.14.3 端口的数字和/etc/services 170
9.14.4 TCP的特点 171
9.14.5 UDP 171
9.15 普通本地网络 172
9.16 理解DHCP 173
9.16.1 Linux的DHCP客户端 173
9.16.2 Linux的DHCP服务器 173
9.17 将Linux配置成路由器 174
9.18 私有网络 175
9.19 网络地址转换(IP伪装) 176
9.20 路由器与Linux 177
9.21 防火墙 177
9.21.1 Linux防火墙基础 178
9.21.2 设置防火墙规则 179
9.21.3 防火墙策略 181
9.22 以太网、IP和ARP 182
9.23 无线以太网 183
9.23.1 iw 184
9.23.2 无线网络安全 184
9.24 小结 185
第10章 网络应用与服务 186
10.1 服务的基本概念 186
10.2 网络服务器 188
10.3 SSH 189
10.3.1 SSHD服务器 190
10.3.2 SSH客户端 191
10.4 守护进程inetd和xinetd 193
10.5 诊断工具 193
10.5.1 lsof194
10.5.2 tcpdump 195
10.5.3 netcat 196
10.5.4 扫描端口 197
10.6 远程程序调用 198
10.7 网络安全 198
10.7.1 典型漏洞 199
10.7.2 安全资源 199
10.8 前瞻 200
10.9 套接字:进程与网络的通信方式 200
10.10 Unix域套接字 201
10.10.1 对开发者的好处.201
10.10.2 列出Unix域套接字 202
第11章 shell脚本 203
11.1 shell脚本基础 203
11.2 引号与字面量 204
11.2.1 字面量 205
11.2.2 单引号 205
11.2.3 双引号 205
11.2.4 单引号的字面义 206
11.3 特殊变量 206
11.3.1 单个参数:$1,$2,…… 207
11.3.2 参数的数量:$# 207
11.3.3 所有参数:$@ 207
11.3.4 脚本名:$0 208
11.3.5 进程号:$$ 208
11.3.6 退出码:$? 208
11.4 退出码 208
11.5 条件判断 209
11.5.1 防范空参数 209
11.5.2 使用其他命令来测试 210
11.5.3 elif 210
11.5.4 逻辑结构&&和|| 210
11.5.5 测试条件 211
11.5.6 用case进行字符串匹配 213
11.6 循环 214
11.6.1 for循环 214
11.6.2 while循环 214
11.7 命令替换 215
11.8 管理临时文件 216
11.9 here文档 216
11.10 重要的shell脚本工具 217
11.10.1 basename 217
11.10.2 awk 218
11.10.3 sed 218
11.10.4 xargs 219
11.10.5 expr 219
11.10.6 exec 219
11.11 子shell 220
11.12 在脚本中包含其他文件 220
11.13 读取用户输入 221
11.14 什么时候(不)应该使用shell脚本 221
第12章 在网络上传输文件 222
12.1 快速复制 222
12.2 rsync 222
12.2.1 rsync基础 223
12.2.2 准确复制目录结构 224
12.2.3 以斜杠结尾 224
12.2.4 排除文件与目录 226
12.2.5 合并、检查及冗长模式 226
12.2.6 压缩 227
12.2.7 限制带宽 227
12.2.8 传文件到你的计算机 227
12.2.9 更多有关rsync的话题 227
12.3 文件共享 228
12.4 用Samba分享文件 228
12.4.1 配置服务器 228
12.4.2 服务器访问控制 229
12.4.3 密码 229
12.4.4 启动服务器 231
12.4.5 诊断和日志文件 231
12.4.6 配置文件共享 231
12.4.7 home目录 232
12.4.8 共享打印机 232
12.4.9 使用Samba客户端 232
12.4.10 作为客户去访问文件 233
12.5 NFS 客户端 234
12.6 有关网络文件服务的选择与局限的更多内容 234
第13章 用户环境 235
13.1 创建启动文件的规则 235
13.2 何时需要修改启动文件 236
13.3 shell启动文件的元素 236
13.3.1 命令路径 236
13.3.2 帮助手册的路径 237
13.3.3 提示符 237
13.3.4 别名 238
13.3.5 权限掩码 238
13.4 启动文件的顺序及例子 238
13.4.1 bash shell 239
13.4.2 tcsh shell 241
13.5 用户默认设置 241
13.5.1 shell默认设置 242
13.5.2 编辑器 242
13.5.3 翻页器 242
13.6 启动文件的一些陷阱 242
13.7 前瞻 243
第14章 Linux 桌面概览 244
14.1 桌面组件 244
14.1.1 窗口管理器 245
14.1.2 工具包 245
14.1.3 桌面环境 245
14.1.4 应用 245
14.2 近观X Window系统 245
14.2.1 显示管理器 246
14.2.2 网络透明性 246
14.3 探索X客户端 247
14.3.1 X事件 247
14.3.2 理解X输入以及偏好设定 248
14.4 X的未来 250
14.5 D-Bus 250
14.5.1 系统和会话实例 251
14.5.2 监视D-Bus消息 251
14.6 打印 251
14.6.1 CUPS 252
14.6.2 格式转换与打印过滤器 252
14.7 其他有关桌面的话题 253
第15章 开发工具 254
15.1 C 编译器 254
15.1.1 多个源码文件 255
15.1.2 头(include)文件和目录 256
15.1.3 连接库 257
15.1.4 共享库 258
15.2 make 261
15.2.1 一个Makefile实例 261
15.2.2 内置规则 262
15.2.3 最终的程序构建 262
15.2.4 保持更新 263
15.2.5 命令行参数与选项263
15.2.6 标准宏和变量 264
15.2.7 常规的目标 264
15.2.8 组织一个Makefile.265
15.3 调试器 266
15.4 Lex和Yacc.267
15.5 脚本语言 267
15.5.1 Python 268
15.5.2 Perl 268
15.5.3 其他脚本语言 268
15.6 Java 269
15.7 展望:编译包 270
第16章 从C代码编译出软件.271
16.1 软件的构建系统 271
16.2 解开C源码包 272
16.3 GNU autoconf 273
16.3.1 一个autoconf的例子 274
16.3.2 使用打包工具来安装 275
16.3.3 configure脚本的选项 275
16.3.4 环境变量 276
16.3.5 autoconf的目标 277
16.3.6 autoconf的日志文件 277
16.3.7 pkg-config 277
16.4 实践安装 278
16.5 打补丁 279
16.6 编译和安装的问题排查 280
16.7 前瞻 282
第17章 在基础上搭建 284
17.1 Web服务器与应用 284
17.2 数据库 285
17.3 虚拟化 285
17.4 分布式计算与实时计算 286
17.5 嵌入式系统 286
17.6 结束语 287
· · · · · · (收起)
读后感
本书讲解了Linux操作系统的工作机制以及运行Linux系统所需的常用工具和命令。根据系统启动的大体顺序,本书更深入地介绍从设备管理到网络配置的各个部分,最后演示了系统各部分的运行方式,并介绍了一些基本技巧和开发人员常用的工具。 Linux不像其他操作,会对用户隐藏很多重...
不要误会,这不是一本Linux内核或者自制发行版方面的书,而是一本Linux系统使用方面的科普导航书籍。 这本书涉及到的话题很全面,菜鸟和老鸟都会找到相适应的内容,大多数都是管中窥豹。如果对Linux使用比较熟悉的话,可以快速地过一过,帮助了解一下一些陌生方向上的变化,如...
并不厚的一本书却覆盖了很广甚至很深的话题,代价就是几乎所有内容都不详细。 对于新手,这本书涵盖的话题过于宽泛且深入,而且内容编排上并不算特别好,容易导致新手不知道自己在学什么。(如果你是纯新手的话,建议找一些专注于基本命令的书籍/课程进行入门。) 对于老手,这...
不要误会,这不是一本Linux内核或者自制发行版方面的书,而是一本Linux系统使用方面的科普导航书籍。 这本书涉及到的话题很全面,菜鸟和老鸟都会找到相适应的内容,大多数都是管中窥豹。如果对Linux使用比较熟悉的话,可以快速地过一过,帮助了解一下一些陌生方向上的变化,如...
本书讲解了Linux操作系统的工作机制以及运行Linux系统所需的常用工具和命令。根据系统启动的大体顺序,本书更深入地介绍从设备管理到网络配置的各个部分,最后演示了系统各部分的运行方式,并介绍了一些基本技巧和开发人员常用的工具。 Linux不像其他操作,会对用户隐藏很多重...
用户评价
我购买这本书的初衷是想解决工作中使用某特定Linux发行版时遇到的兼容性问题,没想到它提供了一个超越具体发行版限制的通用框架。这本书的叙事风格非常沉稳、严谨,读起来有一种面对老派大师传授经验的感觉。它花了相当大的篇幅去讲解包管理系统(RPM/DEB)背后的哲学差异,以及如何在不同体系间进行平滑迁移,这对跨平台维护带来了极大的便利。更令人称赞的是,它对系统日志的解读能力进行了深入的训练,教会读者如何从冗长、看似毫无规律的日志流中,精准定位问题根源,这种“侦探”式的技能是其他书籍很少提及的。它不是教你“做什么”,而是教你“为什么这么做”以及“出错时如何自救”。我甚至感觉自己对整个操作系统的设计哲学都有了更深一层的理解,这绝对是一本可以伴随职业生涯成长的参考书,值得反复研读。
这本书的价值在于它对“实践”的坚持,而不是空泛的理论说教。我印象最深的是关于Shell脚本自动化和定时任务管理的章节。它不是简单地罗列`cron`的语法,而是探讨了如何编写健壮的、能够处理异常和日志记录的复杂调度脚本,包括如何使用信号量避免任务的并发冲突。书中对文本处理工具集,如`awk`和`sed`的深入挖掘,简直是一次奇妙的“内功修炼”。作者展示了如何用一行命令完成过去需要编写几十行Python代码才能实现的数据清洗和格式转换,这极大地提高了我的日常工作效率。虽然这本书的篇幅不薄,但每一页的知识密度都非常高,几乎没有“注水”内容。如果你想真正融入Linux的工作环境,让命令行成为你最强大的武器,而不是一个让你感到畏惧的黑盒子,那么这本书的实战指导价值无可替代。
这本书简直是为我量身定做的,我一个对命令行操作一窍不通的初学者,看完前几章就感觉打开了新世界的大门。它没有那种高高在上的技术术语堆砌,而是用非常生活化的语言,一步步引导你熟悉Linux的内核和生态。特别是关于文件系统和权限管理的那几个章节,讲得细致入微,我终于搞明白了`chmod`和`chown`背后的逻辑,而不是死记硬背命令。作者似乎特别理解初学者的痛点,总能在关键时刻给出非常实用的调试技巧。比如说,当系统环境配置出问题时,书中推荐的排查步骤清晰明了,让我少走了很多弯路。我甚至开始享受在终端里飞快地输入命令的感觉了,那种掌控一切的成就感是图形界面无法比拟的。如果说有什么遗憾,可能就是希望它对最新的容器化技术能有更深入的探讨,不过对于打下坚实的基础来说,这本书绝对是无可替代的首选。我强烈推荐给所有想从Windows或macOS迁移过来的朋友,它会是你最靠谱的向导。
我是一个主要从事Web后端开发的工程师,过去对Linux的理解仅限于能跑起来我的应用和简单的服务部署。接触这本书后,我才意识到自己对底层操作系统的掌握是多么的匮乏。书中关于系统资源限制(ulimit)和Cgroups的详尽介绍,彻底改变了我对应用隔离和资源分配的看法。特别是作者在解释虚拟内存和交换空间管理时,引入了直观的类比,让我这个对操作系统原理不太擅长的开发者也能迅速建立起概念模型。我对那些充满代码片段的章节爱不释手,它们不仅是示例,更像是精心设计的思维导图,展示了如何用更“Linux化”的方式去解决传统编程中遇到的性能瓶颈。这本书的排版也非常人性化,注释和重要概念的加粗处理,使得在快速翻阅查找特定知识点时效率极高。它让我明白,要写出高性能、高可靠性的软件,对所依赖的平台有深刻的理解是多么重要。
作为一名资深系统管理员,我对市面上充斥着大量浮于表面的Linux“入门”书籍感到厌倦。然而,这本书的深度和广度让我眼前一亮。它没有停留在简单的Shell脚本编写上,而是深入剖析了系统启动流程、进程间通信(IPC)机制,以及内核参数调优的底层原理。作者对网络协议栈的阐述尤其精彩,清晰地解释了TCP/IP在Linux环境下的具体实现细节,这对于故障排查至关重要。书中对SELinux和AppArmor等安全框架的讲解,也远超一般书籍的介绍层面,提供了实用的配置示例和安全审计思路。我尤其欣赏它对性能监控工具如`perf`和`eBPF`的引入,这使得书本内容紧跟现代运维的前沿。唯一的不足可能在于,对于某些特定硬件(比如最新的NVMe或RDMA驱动)的深度优化实例可以再多一些,但总体而言,这是一部可以作为工具书常年摆在案头的宝典。
推荐的书就很值得了
言简意赅
中译有误,明明是入门概览,怎么就译成精通了呢?书作为概览有价值,详略上再改善些就更好了。
书名翻译太搞了……
粗略地读过,有点难...作者挺幽默的。