Linux就是这个范儿.pdf
http://www.100md.com
2020年4月17日
![]() |
| 第1页 |
![]() |
| 第4页 |
![]() |
| 第17页 |
![]() |
| 第30页 |
![]() |
| 第32页 |
![]() |
| 第860页 |
参见附件(8916KB,1057页)。
Linux就是这个范儿是赵鑫磊写的关于linux的书籍,作者以简洁易懂的语言讲述了Linux的特性,全书分为基础篇,进阶篇,扩展篇三部分,让你感受linux的强大。

Linux就是这个范儿内容
本书内容源自淘宝技术大学的培训实战。由来自阿里巴巴集团的资深Linux系统专家赵鑫磊和同样来自阿里巴巴集团的支付宝网络技术有限公司的高级专家Jie Zhang(张洁)共同著写。
两位作者用轻松、诙谐的语言讲解了高深的Linux特性。通俗易懂、深入浅出,从Linux设计思想的角度出发,授人以渔。同时,又密切结合应用案例,透彻展示出Linux的系统架构设计是如何在实际中贯穿的,从而让读者真正掌握Linux的强大之处。书中不含较为复杂的技术理论问题,一切从实际出发。
全书共分为三个部分:基础篇、进阶篇和扩展篇。通过对Linux的版本选择与安装、基本使用与系统结构、设计哲学与思想、脚本编程与软件开发、内核编译、网络与认证,以及多媒体等几个方面的精彩讲解,将Linux操作系统的灵魂与运用教授给读者。
作者简介
赵鑫磊
阿里巴巴集团资深Linux系统专家。自1998年开始使用Linux,曾参与国内著名的Linux社区发行版MagicLinux的开发工作,是一个土生土长的东北人。工作经历丰富,开过小网吧、大学讲过课、发过小广告(时在阿里妈妈)、干过铁路工(开发铁路车载电视系统)、当过副总裁,但始终没有放弃对Linux的探索与研究,并将这份经历凝聚在了本书之中。
守护进程及其作用
计划任务基本上就算介绍完了,还有什么不明白的就找那个“男”的问吧。那么接下来就要看看计划任务是怎么被执行的了,这主要归功于守护进程。
Linux服务器在启动时需要启动很多系统服务(其实Windows也这样),它们向本地或网络用户提供了Linux的系统功能接口,直接面向应用程序和用户。提供这些服务的程序是由运行在后台的守护进程(daemons)来执行的。
守护进程是生存期很长的一种进程。它们独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件。它们常常伴随着Linux系统启动时启动,关闭时关闭。linux系统有很多守护进程,大多数服务器都是用守护进程实现的。另外,某些守护进程还协助完成了很多系统任务,比如负责计划任务的atd和crond、负责打印的lqd等。
有些资料也把守护进程称作:“服务”,但严格意义上来讲还是有一些不同的,只是一般我们不用去强调它们的异同。如果一定要分出个是非来,那么“服务”是静态的概念,而守护进程是动态的概念。服务由守护进程提供。选择运行哪些守护进程,要根据具体需求来决定。查看系统中拥有哪些守护进程,或者说能够提供哪些服务,可以使用ntsysv命令(在RedHat或CentOS中)。要成功执行这个命令,需要使用root权限。
实际上守护进程也是有分类的,可以按照它的启动和管理方式来区分,分为独立启动的standalone和xinetd两类。
所谓的standalone,从字面上的意思来看就是“独立”的含义。这种类型的守护进程有两大特点,一是可以自行启动运行而不需要利用系统其他机制来管理,二是启动之后会一直占用内存与系统资源。因而这种守护进程拥有了一个非常突出的优点:响应最快。standalone守护进程非常多,常见的apache、mysql等都是。
至于xinetd则是一种比较新型的守护进程。它由一个统一的standalone守护进程来负责唤起。这个特殊的守护进程还有一个好听的名字——superdaemon。之所以会引入这种机制,就是因为standalone会一直占用内存和资源显得很浪费。所以一些喜欢精打细算的人就提出来按需分配这种概念。也就是说,当没有客户端要求的时候,xinetd类型的守护进程都是未启动,待有客户端要求服务时,superdaemon才会去唤醒具体的xinetd守护进程。但是这种按需分配的机制的致命缺点就是不能及时响应。但是优点也非常鲜明。其一,由于superdaemon负责唤醒各项服务,因此可以赋予superdaemon安全管控的机制,这就类似网络防火墙的功能了;其二,也是它的设计初衷,即客户端的联机结束后就关闭,不会一直占用系统资源。
书籍章节预览
第一部分 基础篇
第1章 第一次亲密接触
1 ......
书名:Linux就是这个范儿
作者:[中] 赵鑫磊 [加] Jie Zhang(张洁)
ISBN:978-7-115-35936-0
本书由北京图灵文化发展有限公司发行数字版。版权所有,侵权必究。
您购买的图灵电子书仅供您个人使用,未经授权,不得以任何方式复制和传播
本书内容。
我们愿意相信读者具有这样的良知和觉悟,与我们共同保护知识产权。
如果购买者有侵权行为,我们可能对该用户实施包括但不限于关闭该帐号等维
权措施,并可能追究法律责任。
图灵社区会员 ptpress(libowen@ptpress.com.cn) 专享 尊重版权
序一
序二
前言
致谢
联系方式
第一部分 基础篇
第 1 章 第一次亲密接触
1.1 让Linux入驻我们的电脑
1.1.1 我们用Linux的理由
1.1.2 选择哪个发行版
1.1.3 安装系统
1.1.4 登录系统
1.2 不一样的图形操作
1.2.1 没有图形的图形
1.2.2 架构设计
1.3 主流桌面环境
1.3.1 KDE初学者的首选
1.3.2 GNOME不可磨灭的经典
1.3.3 XFCE——轻量、简单、高效1.3.4 LXDE——更轻,同样精悍
1.4 返璞归真的命令行
1.4.1 开始执行命令
1.4.2 文本和图形的切换
1.4.3 基础命令的操作
1.4.4 快捷键
1.4.5 错误信息
1.4.6 联机帮助——man很靠谱
1.4.7 致命的Linux命令
1.5 结束语
第 2 章 融于心而表于行
2.1 多用户多任务分时操作系统
2.2 用户的身份
2.2.1 澡堂子模型
2.2.2 理解用户角色
2.2.3 etcpasswd文件查看用户
2.2.4 etcgroup文件查看组
2.2.5 管理用户和组
2.2.6 夺面双雄——利用sudo假借身份2.2.7 我是谁?
2.3 文件和它与权限的关系
2.3.1 目录与文件
2.3.2 文件属性和权限
2.3.3 文件连接到底是什么
2.3.4 修改文件的属性和权限
2.3.5 深入文件权限
2.3.6 文件的基本操作
2.3.7 搜索文件
2.3.8 对文件打包压缩
2.4 程序的执行问题
2.4.1 执行程序的方法,以及多任务协调机制
2.4.2 计划任务
2.4.3 守护进程及其作用
2.4.4 全面了解程序信息
2.5 软件的安装方式
2.5.1 从源代码安装软件
2.5.2 利用软件管理工具rpm和dpkg
2.5.3 更酷的线上升级2.6 磁盘的管理方式
2.6.1 Linux的文件系统——甩Windows几条街
2.6.2 磁盘的基本操作
2.6.3 etcfstab文件——决定分区的连接
2.6.4 弹性调整容量——逻辑卷
2.7 解决上网问题
2.7.1 了解IP地址
2.7.2 相关配置文件
2.7.3 安装网卡
2.7.4 手工设定IP地址
2.7.5 自动获取IP地址
2.7.6 固定IP上网方式
2.7.7 ADSL拨号上网方式
2.8 不能割舍的shell
2.8.1 勤勤恳恳的bash
2.8.2 环境变量
2.8.3 bash的配置文件
2.9 文本处理
2.9.1 查看文本内容2.9.2 正则表达式
2.9.3 搜索文本的grep
2.9.4 排序和去重
2.9.5 文件对比命令——diff
2.10 结束语
第 3 章 一棵“树”的奥秘
3.1 Linux的文件组织结构
3.2 基本组织原则
3.3 根文件系统
3.3.1 原则与特性
3.3.2 必备的内容
3.3.3 可选的内容
3.4 子目录
3.4.1 bin目录——shell命令
3.4.2 boot目录——启动过程所需内容
3.4.3 dev目录——设备文件
3.4.4 etc目录——配置文件
3.4.5 home目录——用户专有
3.4.6 lib目录——共享库和内核模块3.4.7 media目录——可移动设备
3.4.8 mnt目录——临时挂接
3.4.9 opt目录——附加软件包
3.4.10 root目录——root专有
3.4.11 sbin目录——必备的系统软件
3.4.12 srv目录——服务进程所需数据
3.4.13 tmp目录——临时文件
3.5 usr目录组织结构
3.5.1 usrbin目录
3.5.2 usrinclude目录
3.5.3 usrlib目录
3.5.4 usrlocal目录
3.5.5 usrsbin目录
3.5.6 usrshare目录
3.5.7 usrshareman目录
3.5.8 usrsharemisc目录
3.6 var目录组织结构
3.6.1 varaccount目录
3.6.2 varcache目录3.6.3 varlib目录
3.6.4 varlock目录
3.6.5 varlog目录
3.6.6 varmail目录
3.6.7 varopt目录
3.6.8 varrun目录
3.6.9 varspool目录
3.6.10 vartmp目录
3.7 结束语
第 4 章 “笨”出来的文化和哲学
4.1 Unix的文化和哲学
4.2 “四大笨”之一:万般皆文本
4.2.1 二进制的烦恼
4.2.2 文本的快乐
4.2.3 文本之于配置文件
4.2.4 文本之于程序组合
4.2.5 文本之于通信协议
4.2.6 硬件也文本
4.3 “四大笨”之二:四处用脚本4.3.1 富饶的脚本语言
4.3.2 为什么不是C
4.3.3 脚本的不足和混合编程
4.3.4 强力胶水
4.3.5 极端的例子
4.3.6 软件的适度规模
4.4 “四大笨”之三:规律无处寻
4.4.1 机制与策略
4.4.2 接口与引擎
4.4.3 不用重新造轮子
4.4.4 内在的支持
4.4.5 沉默是金,吝啬是银
4.5 “四大笨”之四:配置乱生根
4.5.1 什么是不可配的
4.5.2 配置三元素
4.5.3 配置文件
4.5.4 环境变量
4.5.5 命令行选项
4.6 什么样的文化4.6.1 “傻x”的精明
4.6.2 “简单”不简单
4.7 这一切的基础大师的阐释
第 5 章 shell脚本编程
5.1 第一个shell脚本程序
5.2 编程的基本要素
5.2.1 变量
5.2.2 运算
5.2.3 流程控制
5.2.4 自定义函数
5.3 输入和输出
5.3.1 基本的输出
5.3.2 命令行参数
5.3.3 使用read读取文本行
5.3.4 文件描述符
5.3.5 格式化输出
5.4 调试跟踪
5.4.1 空变量问题
5.4.2 缺引号问题5.4.3 隔离问题
5.4.4 echo普通中见“伟大”
5.4.5 “-x”跟踪问题本领高
5.4.6 assert函数
5.4.7 caller命令
5.4.8 trap命令
5.5 高级特性
5.5.1 波浪号“~”
5.5.2 通配符
5.5.3 元字符
5.5.4 转义符
5.5.5 命令替换
5.5.6 运算优先级
5.5.7 文件包含
5.5.8 eval语句
5.5.9 内建命令
5.6 shell脚本编程实战
5.6.1 守护进程的启动脚本
5.6.2 读取数据文件和平滑启动nginx第 6 章 微型语言
6.1 什么是微型语言
6.2 软件管理的RPM
6.2.1 构建你的第一个RPM包
6.2.2 工作原理——分析Spec文件
6.2.3 依赖关系
6.2.4 一个软件多个包
6.2.5 小结
6.3 制作联机帮助文档的Groff
6.3.1 Groff简介
6.3.2 Groff的工作方式
6.3.3 如何制作一份联机帮助文档
6.3.4 导出联机帮助文档
6.3.5 小结
6.4 把文本当数据库的awk
6.4.1 使用方法
6.4.2 基本概念
6.4.3 注释与空白
6.4.4 字符串6.4.5 数值
6.4.6 变量
6.4.7 模式与行为
6.4.8 行为语句
6.4.9 小结
6.5 神奇的计算器dc和bc
6.5.1 历史渊源——最古老的Unix语言dc
6.5.2 dc简介
6.5.3 更为常用的bc
6.5.4 小结
6.6 不为人知的m4
6.6.1 m4的历史
6.6.2 m4的特性
6.6.3 从Hello World开始
6.6.4 工作方式
6.6.5 小结
6.7 结束语
第 7 章 编辑器的纷争
7.1 独步青云的vi7.1.1 我为vi狂
7.1.2 vi的使用
7.1.3 vi的高级功能
7.1.4 跟我一起打造一个IDE
7.2 横刀立马的Emacs
7.2.1 Emacs的来历
7.2.2 Emacs的基本使用
7.2.3 使用Emacs必知必会
7.2.4 Lisp语言
7.2.5 处理中文问题
7.2.6 跟我一起打造一个IDE
7.3 结束语
第 8 章 我是Makefile
8.1 GNU make及其基本用法
8.2 基本概念
8.2.1 第一个Makefile例子
8.2.2 目标、条件和命令
8.2.3 依赖
8.2.4 工作方式8.2.5 基本语法
8.3 认识规则
8.3.1 标准规则
8.3.2 隐式规则
8.3.3 变量
8.3.4 自动变量
8.3.5 模式规则
8.3.6 假目标
8.3.7 路径搜索
8.4 高级特性
8.4.1 文件包含
8.4.2 命令
8.4.3 深入变量
8.4.4 宏与函数
8.4.5 条件指令
8.5 Makefile实战
8.5.1 自动产生依赖
8.5.2 递归式的Makefile
8.5.3 自动产生Makefile8.6 结束语
第二部分 进阶篇
第 9 章 特种文件系统
9.1 日志和ReiserFS
9.1.1 理解日志
9.1.2 ReiserFS——卓越的小文件性能与渺茫的未来
9.1.3 应用实战
9.1.4 小结
9.2 进程文件系统procfs
9.2.1 神秘的9号计划
9.2.2 proc目录
9.2.3 procfs实战
9.2.4 小结
9.3 tmpfs——满足你对“时空”的双重渴望
9.3.1 背景
9.3.2 tmpfs文件系统
9.3.3 tmpfs实战
9.4 devfs和sysfs
9.4.1 devfs的由来9.4.2 进入devfs
9.4.3 sysfs的由来
9.4.4 小结
9.5 其他特种文件系统
9.5.1 RelayFS
9.5.2 debugfs
9.6 结束语
第 10 章 生死与共的“兄弟”
10.1 死心眼儿的BIOS
10.2 小肚鸡肠的MBR(主引导记录)
10.2.1 MBR的结构
10.2.2 磁盘分区表
10.2.3 MBR的功能
10.3 和事佬GRUB(牛B的统一引导加载器)
10.3.1 Bootloader
10.3.2 GRUB的功能
10.3.3 GRUB的工作流程
10.4 唇齿相依的内核启动参数
10.4.1 什么是内核启动参数10.4.2 内核启动参数的格式
10.4.3 常用的内核启动参数
10.5 自力更生的Linux内核
10.5.1 内核引导协议
10.5.2 内核为什么要压缩
10.5.3 startup_32
10.5.4 start_kernel
10.5.5 kernel_init
10.6 及时雨initramfs
10.6.1 寻找init的问题
10.6.2 较早的initrd
10.6.3 为什么选择initramfs
10.7 “生”、“死”永相伴的init进程
10.7.1 名不副实
10.7.2 运行级别
10.7.3 进入运行级别之前
10.7.4 进入运行级别
10.7.5 转换运行级别
10.8 幕后英雄们10.8.1 终端
10.8.2 getty系列命令
10.8.3 Display Manager
10.8.4 伪终端
10.8.5 配置文件
10.9 结束语
第 11 章 独霸网络的“蜘蛛神功”
11.1 功夫理论:网络知识
11.2 “蜘蛛神功”第一层:网络工具
11.2.1 马步:ifconfig
11.2.2 掌法:route
11.2.3 腿功:netstat
11.2.4 眼力:DNS二把刀
11.2.5 身法:tcpdump
11.3 “蜘蛛神功”第二层:套接字
11.4 内功心法:TCPIP协议栈初探2
11.4.1 枯树盘根:系统调用
11.4.2 凝神静态:sockfs文件系统
11.4.3 气沉丹田:sk_buff11.5 临战杂谈
11.5.1 对UDP的错误的认识
11.5.2 事半功倍,调节内核参数4
第 12 章 一个网络一个世界
12.1 You've Got a Mail
12.1.1 Email服务模式
12.1.2 架设Postfix服务器
12.1.3 Email故事的结局
12.2 联接世界的Web应用
12.2.1 Web服务器
12.2.2 数据库
12.2.3 解释型语言
12.2.4 架设Web服务器
12.3 铜墙铁壁真功夫——Linux内核集成的IP信息包过滤系统
12.3.1 iptables
12.3.2 netfilter
12.3.3 实践出真知
12.3.4 小盒子的秘密
12.4 分享文件的乐趣12.4.1 NFS
12.4.2 Samba
12.5 在虚拟与现实之间穿梭——实现安全的连接
12.5.1 VPN实现方式
12.5.2 IPSec VPN
12.5.3 SSL VPN
第 13 章 打通任督二脉
13.1 了解网络驱动
13.1.1 网络设备闲谈
13.1.2 ioctl这把刷子
13.1.3 设备驱动的秘密
13.2 无线风光在险峰
13.2.1 WLAN
13.2.2 Bluetooth
13.2.3 NFC——近距无线通信
13.2.4 谜底
13.3 奇迹是执着创造出来的
13.3.1 从2.4到2.6
13.3.2 从2.6到3.0第 14 章 身在江湖
14.1 C2级安全认证
14.2 Linux的安全问题
14.2.1 黑客入侵
14.2.2 “病毒泛滥”
14.2.3 拒绝服务攻击
14.2.4 小结
14.3 PAM用户认证机制
14.3.1 什么是PAM(可拔插认证模块)
14.3.2 PAM的体系结构
14.3.3 配置PAM
14.3.4 密码映射
14.4 应用PAM API
14.4.1 开发概述
14.4.2 PAM事务
14.4.3 事务属性
14.4.4 用户认证
14.4.5 认证凭证
14.4.6 PAM会话14.4.7 用户认证流程
14.4.8 模块开发
14.4.9 密码的保存
14.5 安全增强系统
14.5.1 主动访问控制DAC
14.5.2 强制访问控制MAC
14.5.3 SELinux——Linux的MAC实现
14.6 结束语
第 15 章 七种武器
15.1 长生剑:fork
15.1.1 从线程说起
15.1.2 古老而充满活力的进程
15.1.3 多进程程序开发
15.1.4 进程间通信的实现
15.2 离别钩:VFS
15.2.1 一切都是文件
15.2.2 一棵有生命的“树”
15.2.3 VFS简介
15.2.4 基本数据结构15.2.5 sockfs
15.3 孔雀翎:mmap(内存映射)
15.3.1 理解mmap
15.3.2 虚拟内存技术
15.3.3 应用mmap
15.4 碧玉刀:epoll(增强IO复用)
15.4.1 C10K问题
15.4.2 epoll的优点
15.4.3 epoll的工作模式
15.4.4 正确使用epoll
15.4.5 用epoll解决C100K问题
15.5 多情环:udev
15.5.1 设计理念
15.5.2 基本构成
15.5.3 配置文件
15.5.4 规则
15.6 霸王枪:LVS
15.6.1 负载均衡
15.6.2 一个中国人的勇气15.6.3 LVS的特点
15.6.4 LVS的工作模式
15.6.5 LVS的负载均衡调度算法
15.7 拳头:module
15.7.1 内核中的Web服务
15.7.2 编写你的第一个module
15.7.3 module与普通程序的不同
15.7.4 module与用户通信
15.7.5 内核加载module的原理
15.8 结束语
第 16 章 谁都可以从头再来——从头开始编译一套Linux系统
16.1 初识工具链——准备环境的必备工具
16.1.1 编译器
16.1.2 连接器
16.1.3 程序库
16.1.4 工具链——破解奇特的四角恋
16.2 准备环境
16.2.1 宿主系统环境
16.2.2 生成工具链的binutils16.2.3 生成工具链的gcc
16.2.4 生成工具链的glibc
16.2.5 解决工具链的一些问题
16.2.6 第二次生成工具链的binutils
16.2.7 第二次生成工具链的gcc
16.2.8 丰富工具链的功能
16.2.9 整理工具链
16.2.10 小结
16.3 生成目标系统的运行环境
16.3.1 准备工作
16.3.2 安装glibc
16.3.3 调整工具链
16.3.4 安装binutils
16.3.5 安装gcc
16.3.6 安装其他基础设施
16.3.7 系统启动脚本
16.3.8 结束语
16.4 定制Linux内核
16.4.1 内核的make参数16.4.2 定制界面
16.4.3 编译与安装
16.5 独立运行
16.5.1 etcfstab文件
16.5.2 使用GRUB配置启动过程
16.6 结束语
第三部分 扩展篇
第 17 章 窈窕淑女君子好逑
17.1 女人心事难捉摸——Linux图形环境
17.1.1 X Window
17.1.2 桌面系统
17.1.3 XOrg
17.2 云想衣裳花想容——Qt与GTK
17.2.1 发展历史
17.2.2 GTK与Qt的比较
17.2.3 大家闺秀Qt
17.2.4 小鸟依人GTK
第 18 章 这里也是鼓乐笙箫
18.1 与多媒体的第一次握手18.1.1 听声
18.1.2 看影
18.1.3 多媒体工作室
18.2 鼓——ffmpeg
18.2.1 羞辱柱与软件许可
18.2.2 多媒体的来龙去脉
18.2.3 家庭成员
18.3 乐——MPlayer与VLC
18.3.1 绿色的MPlayer
18.3.2 浪漫的VLC
18.4 笙——FrameBuffer
18.3.1 原理
18.4.2 设置FrameBuffer
18.4.3 文字倒置滚动
18.5 箫——V4L2与ALSA
18.5.1 V4L2
18.5.2 ALSA
18.6 结束语
第 19 章 团结就是力量19.1 标准的前世今生
19.1.1 一场拆分引发的标准
19.1.2 站在POSIX肩膀上的LSB
19.1.3 工作组
19.1.4 标准化流程
19.2 认证
19.3 工具
19.3.1 LSB SDK
19.3.2 App Checker
19.3.3 Distribution Checker
19.3.4 LSB Navigator
19.3.5 lsb_release的规范定义和实现
19.4 LSB的前世今生1
19.4.1 吃一堑,长一智
19.4.2 “哥只是个传说”
19.4.3 意气风发的LSB5.0
19.5 结束语
附录 我的Linux,我做主
我是前端我是Java开发
我是C++开发
我是PE
我为作者的勇气鼓掌。
对未来,因此值得推荐。另外,现存的大部头技术书还少有采用这种人文态度的,力量,帮助码农成长就是促进时代发展。这本书,正是帮助码农积攒正能量,以应
互联网时代才刚刚开头。虽然存在犹豫和彷徨,但码农一定是改变时代的推动
来。采取互联网时代的人文态度来传播Linux,是一种传播方法与传播内容的共鸣。
值基座,支撑着互联网发展到了今天,宛如一个核心,将互联网的全部价值凝聚起
自由、民主、开放、透明和共享精神的体现。正是这种精神,犹如一个最基本的价
软件(Open-source Software)运动,既依赖于互联网技术的发展,又是互联网
Linux的产生和发展,特别是随之成熟的自由软件(Free Software)和开源
趣,何乐不为?
享精神,是一种互联网时代的人文态度。从具体处看,本书的风格旨在提高读者兴
往大了说,本书作者的人文态度反映我们的时代,具有自由、民主、开放和共
求。
述,以日常例子比喻,不时夹杂文艺调侃,既讲明了技术细节,又娱乐了大众诉
把技术明珠Linux,从神坛上拉下来,作为普世和开放的知识与智慧,用大白话表
吝权威的态度,采取和读者平等的姿态,借用当代一些大众文学作品的语言风格,作为资深码农的本书作者,清楚地感受到社会的改变和码农的需要。他们以不
读书中加强自我意识,再搞点轻松诙谐,已成为一种必要的调剂。
天,以前的积累已经使新码农觉得自己很卑微渺小,再加上现实生活又很累,能在
点压抑。特别是,自从IT技术已发展到自由、民主、开放和共享的互联网时代的今
从上往下地灌输。这种书作为工具书还好,但要读者从头读到尾,则相当单调,有
过去的Linux著作,大多只专注于说清技术细节,文字难免平淡,角度也常常是
他们怎么能写出新意来,直到读过初稿以后……
Linux已有20多年历史,大部头著作一摞一摞。听到作者要写Linux,我真怀疑
序一钱振宇
Windows Live(中国)首席科学家
德国不来梅大学教授、博士生导师
2014年2月12日于北京
编辑:听说写序的这位牛人的父亲是钱骥,两弹一星功勋奖章获得者,我国第
一颗卫星东方红一号方案的总体负责人。是真的吗?
作者:你咋知道的?
编辑:不小心百度了一哈。
序二
选择了IT为业,就选择了紧张而劳碌的生活方式,因为快速变化就是这个行业
的基因。
当你刚刚熟悉视窗,又要去学习Linux ;刚刚适应了客户服务器计算模式,又
要去学习万维网应用;刚刚开发了Java程序,又要去学习.NET编程;刚刚用惯了
Subversion做版本控制,又要去学习GIT;刚刚推出桌面方案,又要学习智能手机
的开发;刚刚掌握企业私有数据中心,又要去学习云计算、虚拟化……总之,在你驾
轻就熟某项技术之时或之前,新的技术就又出现了。为了保持职业的竞争力,你还
得轻装上阵、奋勇学习,直到退休之时(我相信很多人的惯性还会一直延续下
去)。在劳顿的同时,也有学习新知的乐趣,这正是IT行业的魅力所在。
虽然Linux已经有22岁的“高龄”, 本身不再是什么新技术,但其重要性始终
未减,而且新的相关技术不断涌现,如KVM虚拟化软件。在当今云计算年代,因为
Linux是开源软件,其重要性更不断上升。据不完全统计,在公有云端的服务器有
80%之多运行Linux。掌握了Linux,也就掌握了通向云端的入场券。Linux的重要
性毋须赘言。
同为学习,可以一本正经地学,也可以轻松愉快地学。本人读过若干本有关
Linux的书,基本是一本正经地学,趣味不足,权当是工具书在需要的时候去查一
下。听说两位作者要写Linux,也没有期望有所不同。收到初稿后,看着目录眼前便
一亮,循着章节一一读完。这本书可以轻松愉快地学。
在轻松愉快的同时,并不影响这本书的结构的全面性、技术的准确性和内容的
实时性。学习Linux并不仅仅是Linux本身,还包括建构在Linux之上和周边的相关
技术和工具。有了这些软件,才能够把Linux变成解决方案,并解决实际中的各种问
题。这才是最重要的学习,也是最难的学习。这本书不仅涵盖了各个基本技术点,如文件系统、Shell命令等,还系统介绍了许多工具和软件来建构电子邮件、Web应
用等方案。即使对Linux有所了解,也会在这本书中得到新的内容和新的视角。
基于本书的趣味性和技术性,当然还有Linux的重要性,相信其他读者和我一样会喜欢这本书,并在紧张忙碌的生活空隙中精神愉快地读完它,助力于自我的技术
提高和职业发展。
金尊和 博士
IBM公司资深工程师
Sun公司Java JDO专家组成员
前言
有个OS名叫Linux,它的故事耐人追寻。
小小系统,众人追寻,相识相恋,从不伤心……
赵鑫磊:Hi,Jie,有人找我出书了,不过我觉得我在网络这方面有些欠
缺。我知道你在Linux平台上做过不少项目,特别是网络这方面。你能来帮我一
下,我们一起来完成这本书好吗?
Jie Zhang:真的吗?那太棒了,虽然现在有关Linux的书不少,但是我相
信经过这么多年的风风雨雨我一定能写出另一种味道。很乐意跟你合作。
赵鑫磊:太好了,有了你的参与,我们这本书的技术性会更强!
Jie Zhang:Linux无毒、免费和稳定是它备受推崇的原因。
赵鑫磊:无毒、免费和稳定还不够给力啊!我觉得知识的保值性才是最主
要的。在Linux中有些知识几十年都没过时。
Jie Zhang:对,这样的知识的投资回报率很高。学好Linux,面对如
FreeBSD、Solaris等系统,就不犯愁了。
赵鑫磊:看完我们这本书,其他书都是小儿科了。哈哈。
Jie Zhang:你的口气也太大了吧……
赵鑫磊:哈哈,你得抱有这个希望,我们试着在这么做。
Jie Zhang:好吧。不想当厨师的女程序员不是好媳妇儿!
Jie Zhang:那这本书就不是一本工具书了,它是我们多年工作经验积累
下的感悟。不管读者喜欢与否,这种感觉就在那里,不多不少,不离不弃。
赵鑫磊:对,我们这本书不是用于入门,不是工具书。它是传道、授业、解惑的。
Jie Zhang:我觉得还是初中级比较好。曲高和寡,不一定好。初级最
好。
赵鑫磊:我们的角度已经决定了无法定位在初级。我们并不曲高,但我们
也不是初级。我们是传道的!
Jie Zhang:这点我同意。我们要讲述Linux的精髓,而不是简单的入门。
赵鑫磊:读者需要反复地推敲书中的内容。就像很多很牛的大师写科普读
物,简单几句话里却有透彻的大道理。我们分为三大部分写,基础篇、进阶篇
和扩展篇。基础篇能了解Linux的基本特点,进阶篇则从文件系统、进程通讯和
网络等更深层次去挖掘Linux的思想内涵,扩展篇则要给读者打开Linux图形和
多媒体的缤纷世界。不同层次和需求的读者都可以从中找到自己感兴趣的东
西。最重要的是,我们所讲述的每一章,都在谈论机制。
Jie Zhang:你说的机制是指什么?
赵鑫磊:机制就是很难改变的、必须要做的事情。
Jie Zhang:光谈机制还不够,要有实际案例支持,否则看了等于白看。
赵鑫磊:但是你觉得我们书中的内容看了等于白看吗?
Jie Zhang:当然没有白看。因为除了谈机制,我们还有方法和实践进行
论证。
赵鑫磊:终于达成共识了。我们每一章都会介绍很多种机制,甚至这种机
制引入的来龙去脉都会谈到,并且会简洁清楚地介绍一下现行的方法。就这么
干!致谢
赵鑫磊:
首先要感谢我所在的公司——阿里巴巴集团,它给了我一个能成为布道者
的机会,让我成为淘宝技术大学的讲师。更要感谢原图灵的杨海玲编辑,是她
找到我要将我的讲义整理出书,虽然你由于工作原因不能参与本书的出版工
作,但是我很期待我们下次的合作。还要感谢我的妻子和儿子,是你们一直在
我身边支持我,不抱怨我没有时间陪你们,让我能将大把的时间投入到写作之
中。感谢中国Linux公社的网友们,因为你们的鼓励和期盼,让我有了莫大的勇
气来完成这本书。
Jie Zhang:
首先要感谢我的好友卢海峰,本书最初的排版是他一点一点地调整的,很
多图表也是他精心绘制的,我想说有你这样的朋友真好!还要感谢爸妈、老公
和小女,没有你们在我身边一直给我打气,不会有提笔写作的我,也不会有本
书的存在。要感谢的人还有我的朋友曹景海、胡小东、林啸和常雪峰,以及王
小川先生、钱振宇博士和金尊和博士,你们对本书的出版给予了大力的支持。
联系方式
赵鑫磊邮箱:jagen.zhao@gmail.com
Jie Zhang邮箱:jie_joy_zhang@yahoo.com
MagicLinux交流群的群号:41334777
第一部分 基础篇
第 1 章 第一次亲密接触
有一对儿异地的恋人,他们每天在手机上聊天,显示的距离永远都是1648
km。快到年底了,女孩实在受不了这种距离而提出了分手,男孩沉默不语。除夕之
夜,女孩在家中刷新手机,看到男孩距离她只有1.1 km,再刷新,只有0.9 km。她
明白即将要发生什么,含着热泪走向门口……当晚,在隆隆的焰火声中,他们的距离
变成了-5 cm,于是第二天他们还是分手了……
这似乎是个悲剧,不知道你能看出笑点吗?
大多数Linux初学者与Linux之间就好像是异地的恋人,他们之间永远都是
Windows所隔开的距离。久而久之,实在受不了这种距离而最终要彼此离开。少数
人鼓起了勇气,走进Linux并试图完成一次“亲密接触”,结果很多时候是不欢而散
的。
学习和掌握Linux需要一种和谐。这种和谐可能取决于第一次亲密接触时的感觉
是否足够让人激动不已,以及能否历久弥新。到底是什么样的感觉能让人激动不已
是因人而异的,历久弥新更是不尽相同,所以不同的Linux入门资料也会采用不同的
方法以期达到这种效果。
作为本书的最初章节,也希望做点类似的工作,只是方法有点特殊。我们期望
通过本章的内容尽量拉近你和Linux的距离。换句话说,本书并不是为那些完全不了
解Linux的人准备的,你至少应该听说过Linux的名号或者见过别人使用Linux。当
然,不管什么方式都是因人而异的,即便对Linux一无所知的朋友也会通过本章受
益,但是至少你得有成功安装过操作系统的经验。否则的话,你一定是电脑天才。
也许这章的内容只能让你在门外徘徊,如果是这样,你就应该暂时放弃这本书
(不,不要放弃),寻找其他更适合自己的入门资料,然后再继续本书;亦或是这
章的内容能够使你足够威猛到融汇贯通的程度,那是我们始料不及的,或许这是整
本书都无法达到的高度;我们说:合适就好,那样才叫和谐啊……1.1 让Linux入驻我们的电脑
“如果给我一千万,我就能买一栋房子。我有一千万吗?没有。所以我依然没
有房子。如果我有一双翅膀,我就能飞。我有翅膀吗?没有。所以我也没办法飞。
如果给我一台运行着Linux的电脑,我就能玩转Linux。我能拥有一台运行着Linux
的电脑吗?”我说:“这个完全可以有。所以,是的,你能玩转Linux。”
大多数人可能会在Windows上虚拟一个Linux出来,我的建议正好相反。要养成
使用Linux的习惯,显然就要让Linux入驻你的电脑,让它成为你的主要操作系统,然后再虚拟一个Windows出来
1.1.1 我们用Linux的理由
很多人在决定让Linux入驻自己电脑的时候遇到了很大的障碍。我所了解到的大
多数问题是担心没有可以替代的软件。
实际上对于大多数人而言这根本就不是问题,只是他们不知道罢了。但是如果
你买电脑就是用来玩游戏的,那么这本书估计也不适合你。这并不代表本书排斥游
戏玩家,恰恰相反,我本身就是一个超级玩家。我总是认为拿电脑打游戏是十分浪
费资源的,专用的游戏主机更适合干这件事儿,也很便宜。比如一台PS3的价格绝对
比一块超级显卡便宜很多,但是游戏效果绝对是目前最棒的。那么排除了打游戏这
种需求之外,Linux几乎可以满足绝大部分的需求了。
对于现如今不可或缺的浏览器来讲,除了没有IE以外,其他的各种主流浏览器
都有Linux版本,比如Firefox、Chrome、Opera等。有人可能会来抬杠,说Linux
下肯定没有Apple的Safari浏览器,那么抬杠的人就要失望了,因为Safari实际上
是修改自Konqueror这个来自KDE(Linux的一个图形环境,后面会介绍)的浏览
器。其实在Firefox和Chrome还没诞生之前,我最常用的浏览器就是Konqueror
了,只是由于后来它的开发者们被Apple耍了一道,之后便开始没落了。说句题外
话,现在是HTML5大行其道的年代,即便在Windows上,IE也开始不讨好了,Linux
在这方面并不会吃亏。
除了浏览器之外的另外一个重要的领域就是Office软件了。当然MS Office是不可能有的。这方面的首推替代品就是OpenOffice系列了。但是我自身认为
OpenOffice是给老外用的。它的中文本土化做得不如MS Office,对中文排版的处
理上也特别差劲,而且与MS Office兼容性还不好。这可能是Linux无法推广普及的
一大壁垒。但是话又说回来,我们中国有一家十分靠谱的公司,那就是永中科技,它出品的永中Office可以完美地兼容MS Office,完美地处理任何中文排版问题
(总觉得永中应该给我点儿好处费才行)。永中Office采用Java开发,所以可以很
容易地兼容所有Linux版本,而且还是免费给个人用户使用。绝对的自主知识产权,可以很好地满足一下广大愤青们的虚荣心。此外,老品牌的WPS也不甘寂寞,也正在
加紧研发Linux版本,不日就会与大家见面。
对于大多数普通用户来说,上网、打字之外就应该是聊天了。如果你很清高从
不使用QQ的话,那就实在是太好办了,几乎所有开源IM工具都不支持QQ。当然,如
果你跟我一样很三俗,非QQ不用的话,WebQQ是一个非常好的选择。飞信还可以有
libFetion和OpenFetion。唯独阿里旺旺比较麻烦,但是也有一个不伦不类的官方
版本出来,我倒是可以在这里帮大家忽悠一下:童鞋们努努力吧……但是如果我那些
负责开发旺旺的同事们不看这本书就没啥作用了。
如果你还觉得不够,还想看看电影听听歌曲,那就更好办了。其实Windows上
我们使用的大多数免费播放器其真身原本就是为Linux而开发的,比如VLC、MPlayer等。很多播放器,甚至收费的也都只是在它们外面包上一层皮罢了。但是
需要注意的就是你的声卡不能太“高级”了,因为一些特别专业的声卡没有Linux的
驱动。但是显卡很好办,因为AMD和NVIDIA都很重视Linux,只要是还不太老掉牙的
显卡,Linux都能良好地驱动它。
对于一些专业人士,比如视觉设计师们,或许会觉得Linux缺乏专业的设计软
件。这其实也是一种误解。GIMP完全可以胜任Photoshop的工作,Inkscape一点也
不比Illustrator差劲,Cinelerra兼有Premiere和After Effects的功能。不要
忘记,当年卡梅隆导演正是用Linux作为平台完成了《泰坦尼克号》的特效。
当然,Linux除了能做这些Windows能做得很好的事情之外,还能做很多
Windows做不到的事情。对Windows最为致命的打击就是Linux几乎不会感染病毒,至于为什么会这样,本书后面的内容会做详细的介绍。但是就现在来看,你大可以
放心大胆地让Linux去裸奔(其实你想让它穿件衣服也没啥合适的)。再一个就是你可以合理、合法、合乎道德地免费使用Linux,并免费升级到最新版本,更不需要在
安装时输入那25位的(最后一位数码也许已经被狗啃掉了)产品密钥,至于可恶的
激活就能滚多远滚多远好了。Linux对硬件的要求极低,即便是目前最新版本的
Linux,依然能够非常流畅地运行在只能勉强运行Win95的旧电脑上(最多值200
块);然后就是你再也不用担心你的磁盘碎片问题了,因为Linux的磁盘管理方式要
比Windows优秀不知多少倍,所以也不会因此而导致系统越用越慢。这其中的奥妙
本书也是会告诉大家的。其实Linux的好处还有很多,我就不在这里浪费你的宝贵时
间了,当你看完整本书,自然就什么都知道了。反正现在只要你选择了Linux,那就
开启了另一种生活方式。
到目前来看,对于我们来说Windows的唯一救命稻草就只有一个了,那就是网
上银行。这的确是很重要的一块儿领地,也没有任何替代的方案。我的方法就是虚
拟一个Windows出来。这个Windows只用作网银操作,还能有效防病毒,连杀毒软件
都省下了“卡车司机”别来找我麻烦啊
好了,我想我们已经给出了足够多的理由使你可以义无反顾地让Linux入驻你的
电脑。放心,只要你按照我们的方法来做,是不会给你带来任何损失的。
1.1.2 选择哪个发行版
接下来我们将面临一个更为麻烦的问题,就是到底应该选择哪个Linux发行版。
因为Linux的发行版实在太多了,用多如牛毛来形容一点都不夸张。可以想象,在牛
毛中要选择出毛色最正、长短最合适、粗细最均匀的一根是多么纠结的事情啊。我
们现在就要做这件事情,还要做好它!
就目前的情形看,Linux发行版可以分为三个主要的分支:RedHat、Slackware和Debian。每一个分支都拥有一个最具代表性的商业服务器级的发行
版,它们是:Red Hat Enterprise Linux,简称RHEL;SUSE Linux
Enterprise,简称SUSE;Ubuntu Server,简称Ubuntu。
看似好难选择的样子,但实际上也没什么,不管是谁家的Linux发行版,都不会
有本质的区别。因为Linux本身就不是一个完整的系统,它实际上只是一个内核。所
谓的发行版只不过是给这个内核加上一堆应用程序而攒成的系统。而且这些应用程
序很大一部分都是来源于GNU社区,代码都是一样的,能有什么差别呢?虽然本质上没有什么不同,但是不同的发行版在细节上还是有一些差别的。这
主要体现在管理工具的选用上。由于开源软件的绝对自由性,具有相同功能的系统
管理类软件可以有很多种,不同的发行版可能会对某种特性有偏好。有些实力比较
强大的发行商,比如Red Hat,自己也会为开源社区贡献很多这类软件,它的发行
版自然也会首选自家的产品。当然,其他发行版也可以采用Red Hat开发的管理软
件,实际上很多发行版也是这么做的。
前面还说到发行版的分支,但是具体分支的归属并不取决于是否使用相同的系
统管理工具。所谓的分支在软件层面上并没有十分严格的界限,只是这三个分支是
历史最为悠久的发行版,而后续诞生的这些发行版大多都是从修改它们其中一种而
发展起来的。实际上很多到目前为止已经跟其原有分支没有任何关联了,比如SUSE
Linux已经跟Slackware没有任何联系了,但是最初的SUSE Linux是从Slackware
修改而来的,所以现在依然认为它属于Slackware分支。现在,不同的分支之间互
相也有借鉴,取长补短,所以分支概念在当前的发行版中越来越模糊了。现在比较
清晰的是软件安装方法的不同,有些使用rpm,有些使用deb,有些甚至直接采用源
代码。当然,这样的差别只有在使用不同安装方法的发行版之间才能感觉到。在日
常使用中,Linux就是Linux,跟发行版没什么关系。
花费了这么大的篇幅,依然没有讲清楚到底该选择哪个发行版,我感觉有点对
不住各位。那么接下来就解决这个实际问题。大家可能有所察觉,我所列举的这些
发行版有些人根本都没有听说过,现在流行的都是什么Fedora、Ubuntu。的确,如
果你就是想自己装个Linux玩,它们都是很好的选择。但是我们都是实用主义者,同
时还要排除一下个人偏好,所以从选择哪个发行版更适合找到好工作这个角度出发
就比较靠谱了。比较理想的选择应该是——CentOS。
你绝对没看错,也不是我的脑袋让电梯夹了而语无伦次。虽然这之前完全没有
提到过CentOS,但是当你知道它实际上是RHEL的一个克隆之后,就会稍微地理解我
推荐它的原因了。
RHEL由Red Hat发行,可以说系出名门,也是目前被众多品牌厂商支持得最为
完善的Linux发行版。当然,SUSE和Ubuntu也未见得差到哪里,但是RHEL还有另外
一个优势,就是对KVM虚拟机的支持。很多大型互联网公司为了充分利用服务器的硬
件资源,都会大量采用虚拟机技术。而KVM的很多开发和测试工作都是在RHEL上进行的。这也导致了很多大型互联网公司都选择了RHEL作为其主要的服务器系统。既
然RHEL这么优秀且又是大型互联网公司的选择,那么我们直接选择RHEL好了,为什
么要选择它的克隆——CentOS呢?
原因非常简单,RHEL要收费。当然,RHEL也允许免费使用,但是你将得不到任
何系统升级服务,也得不到任何技术支持。RHEL在对外发行的时候采用两种方式:
一种就是收费的二进制方式,一种就是完全免费的源代码方式。CentOS就是利用完
全免费的RHEL的源代码重新编译而成的,免费提供给大家,所以本质上与RHEL没什
么区别。唯一的区别就是更新的频率没有付费的RHEL快。当然,如果你有足够的时
间,也可以使用RHEL的源代码构建自己的发行版,至于是否收费,你自己说了算,给自己的公司用当然也不成问题。
不管怎么样,要想吃Linux这碗饭,CentOS是非常好的选择。在免费的同时可
以体验到大型互联网公司的服务器系统环境。如果有机会去这些公司面试,根据自
己平时的学习经验就可以很好地回答面试官的问题了,而面试这种事儿,“共同语
言”是很重要的。
时刻不要忘记,学习Linux的本质还是要学习它最核心的那些机制。而CentOS
并不会改变这些机制。掌握好了这些机制,对于掌握任何其他Linux发行版,乃至自
己去制作发行版,都将是水到渠成的事情。而在这之前还有希望找到一份较为体面
的工作,何乐而不为呢?
1.1.3 安装系统
到哪里去获得CentOS或RHEL,乃至其他Linux发行版呢?问Google或者百度好
了。我不会像其他书籍那样提供一大堆URL列表,总感觉这样做是在辱没大家的智
商。可能比较麻烦的事情是如何规划磁盘,本书的第3章会深入地探讨这个问题。那
么现在这个阶段只要按照系统默认的安装设置就行了。如果你还想让Linux与
Windows共存,只需要使用分区工具留下几十个GB的未分区的磁盘空间就行了,CentOS的安装程序可以自动使用你特意留下的空间。当然,安装的时候一定要慎
重,看清楚提示,不要做一些蠢事。此外,我不是很建议你的Linux与Windows共
存,还是在虚拟机上运行Windows吧(具体怎么弄我后面会告诉你)。
一个比较好的建议是使用64位版本,毕竟现在已经是21世纪又过了10多年了,老掉牙的32位系统应该在坟墓里歇息了!到本书截稿为止,最新版本的CentOS是
6.4。为了安装方便,最好下载它的DVD镜像,前提是你安装的不是“假宽带”。
为了方便现在身边没有电脑的人能够尽早体验到Linux系统的一些魅力,这里我
们准备了一些截图来讲述一下CentOS 6.4的安装过程,以期能够图文并茂地让你对
Linux有一个好印象。出于成本考虑,当然也是为了帮助你省钱,我不打算使用彩色
图片。但是即便是黑白二色,依然无法掩盖Linux系统的美。不过不要高兴得太早,你若想在安装CentOS 6.4的时候与我所描述的内容相符,那么必须保证你的机器内
存大于628M,因为低于这个要求不会启动图形安装模式。幸运的是,文本安装模式
不支持自定义分区,也不支持自定义软件包,这使得安装过程十分简洁,也造成了
我没得可讲的境地。而不幸的是你也无法得到拥有图形环境的Linux系统。不过我倒
十分希望你有这“下场”,因为在我看来只有坚持使用命令行才能学好Linux。
CentOS 6.4系统镜像有两个,只需要下载第一个镜像就能完成安装。第二个镜
像是一些附加的软件包,基本上就没什么用。因为我们安装新的软件基本上都是
从“云端”下载的,所以第二个镜像你都没有理由下载它。
接下来的步骤就是刻盘、启动和引导了,如果没有问题,应该出现这样的界
面:图 1.1 启动画面
这个界面展示了5个功能让你选,如果1分钟内你选择不出来,它就帮你选。选
谁呢?选第一个,因为99.99%的人都会选这个。其他的功能我就不介绍了,因为当
你成为那万分之一之后,基本上都懒得理我了,我还费什么事呢?
一分钟不用等啦,直接按回车,应该出现这样的界面:
图 1.2 检测安装介质
这是要检测一下安装介质是不是有损坏。对于时间比较宽裕的同学可以测测,测测更健康嘛(第二个镜像就必须得下载了)。如果你认为浪费时间就等于浪费生
命,那就选Skip吧。
不管你是选择检测还是选择跳过,最终你都要进入这个界面:图 1.3 欢迎界面
没啥实际意义,Next继续。图 1.4 安装时语言选择界面
这里是干什么的,大家应该懂的,我是选择母语的。Next继续。图 1.5 键盘布局选择界面
这里是让你选择你的键盘类型,在中国选择美国英语式就行了,别的样式的键
盘估计你不熟悉。默认情况下也就是这样给你选的,所以直接下一步就行了。图 1.6 存储设备选择界面
这个就是让你选择使用的磁盘类型,基本没别的选择,99.9999%的人都不用选
择,就是这个默认的基本存储设备。别的那些东西,估计这辈子你都无缘见到,所
以下一步就行了。图 1.7 主机名设定界面
这里设置主机名,也就是给你的电脑起个名字。要是没啥好名字,用这个默认
的也是不错的。另外,这个地方可以进行一下网络配置,感兴趣的同学可以点开看
看。如果觉得自己还不太靠谱,那就下一步好了。图 1.8 时区选择界面
这里确定你的时区。还要告诉你一个秘密:在这个星球上别的国家是不知道
有“北京时间”的,但是他们都知道有“上海时间”。有些人是不是要自豪一下
呢?图 1.9 管理员密码设定界面
输入管理员密码,尽量弄复杂点。当然,你一定要用你老婆的生日我也没办法
不是?图 1.10 磁盘分区方式选择界面
这里有这么多的选项,我们认为最有用的就是第一项“使用所有空间”了,但
是你现在未必有胆量这样干。所以,如果之前给Linux预留空间了,就选择“使用剩
余空间”,或者使用“创建自定义布局”也行。
“自定义布局”的界面是这样的:图 1.11 自定义分区界面
我们划定的磁盘分区就是上图这样,虽然不是很符合Linux的设计思路,但是操
作起来比较简单。作为初学者就这样好了,反正第3章会告诉你做Linux磁盘分区的
技巧。图 1.12 引导程序安装界面
没什么能让你设置的,下一步就行了。图 1.13 随机软件定制界面
来到这里就是定制你的Linux系统要安装哪些套件。默认的是“Minimal”,只
是装个基本系统。我们推荐你选择“Desktop”,这样你就有图形界面的Linux用
了。下一步就是安装过程了……图 1.14 安装等待界面
你不再有点按“下一步”的机会了,等待的结果就是最后的成功。图 1.15 大功告成
到了这个阶段,Linux已经进驻你的电脑了,重新引导就可以开始享用了!第一
次引导的时候是要进行系统初始化设置的,也是非常简单的,基本上一路“下一
步”就能搞定。
1.1.4 登录系统
Linux与Windows有一个很大的不同就是很有可能你安装的Linux启动之后没有
启动图形用户界面(刚刚安装完CentOS 6.4的人应该不会遇到这种情况)。这个时
候你就必须得输入用户名和密码才能继续使用。即便你的Linux启动了图形界面,也
很少有发行版让你能够自动登录系统。所以,你一定要搞清楚你的用户名和密码。
虽然有人会觉得我这样提醒似乎有些弱智,但是的确有很多人忘记了给自己刚刚安
装的Linux设置了什么密码。尽管本书会告诉你如何在这种情况下找回密码,但是在
现在这个阶段,一旦有这种事情发生,那么你最好还是重新安装吧!Linux的用户被划分为根用户和普通用户两种。其中根用户是系统内置用户,用
户名永远都是root,所以也叫root用户。Linux的root用户与Windows的
administrator用户是一样的,都拥有系统的最高控制权。普通用户一般是用户自
己定义的,所以没有什么特别的权限。大家在使用Windows的时候大多数都会选择
直接使用administrator用户,这是非常不好的习惯,也是Windows下病毒泛滥的
推手之一。在Linux下不要随意使用root用户,因为它的权限大到能够自杀的地
步。所以很多发行版,比如我们推荐的CentOS在图形界面登录时,并不会提示有
root用户存在。要使用root登录,必须明确输入这个用户名。
我们提供这部分内容其实是为另外一些人准备的。当然,你可能就是其中一
员。他们在安装Linux系统的时候,并没有给自己的系统添加任何普通用户,如果
他她不知道还有root的时候,可能死活都登录不了系统。大家不要笑,这样的大有
人在。我在第一次使用Linux的时候就这样,结果反复安装了3遍都没正常进入系
统,最后经“高人”指点才解决问题:_(
当你正常登录Linux系统后,就可以尝试这个对你来说还十分新鲜的玩意儿了。
如果你的电脑没有什么特殊的硬件的话,应该可以上网、聊天、看电影了……1.2 不一样的图形操作
几乎所有Linux的新用户都会认为Linux的图形界面是相当地绚丽又多彩。因为
这毕竟是一种全新的体验,那种超脱Windows俗套的快感就会油然而生。对于刚刚
翻开这本书的人来说,如果对Linux是抱有这样认识的,那就太棒了,因为咱们又多
了一个洗脑的对象了:P。此时此刻,真正的亲密接触就要开始啦……
1.2.1 没有图形的图形
虽然Linux的图形界面美轮美奂,但是有一个秘密却不得不告诉你:Linux本身
是没有图形界面的。不管你信还是不信,事实就是这个样子。这么说的原因并不是
因为Linux只是一个内核,其实所有类UNIX操作系统本身都没有图形用户界面。
那为什么我们能通过图形用户界面来使用Linux或者其他类UNIX操作系统呢?
原因是有一个软件提供了这样的功能。是不是觉得很怪异?如果你有使用DOS和
Windows 3.2 的经验,就一点都不奇怪了。因为那个时候Windows 3.2实际上就是
一个DOS上的软件。而且我们所熟知的图形化操作系统Windows,直到Windows 95
开始才能算得上是真正意义的操作系统。Linux上提供这个功能的软件以前是
XFree86,现在是xorg(官方写法是X.Org,为了方便通常写作xorg)。虽然这两
个软件名字上差别有些大,但实际上是一个软件的不同分支。1992~2004年间就只
有XFree86,且跟Linux内核一样,以GPL许可证发行。但是2004年就发生了变化,XFree86的开发商XFree86? Project公司改变了许可证。这引起了GNU社区的极大
不满,于是从XFree86 4.4 RC2衍生出了xorg。目前几乎所有开源的类Unix操作系
统使用的都是xorg,让XFree86? Project抱着它的XFree86自己慢慢过吧:)
可能有些人会觉得奇怪。因为只听过有人在争论到底是KDE好还是GNOME好,并
没有听说有xorg这东西,而且还有人说Unix的窗口系统是X提供的。那么X和xorg是
什么关系呢?KDE、GNOME跟它们又是什么关系呢?嗯,这些的确是很好的问题,接
下来就解答一下。
首先,X不是什么具体的软件,它是一种协议,跟我们平常所耳熟能详的那些什
么HTTP协议、SOAP协议等是一样的。而xorg则是实现X协议的服务器软件,这跟实现HTTP协议的Apache是相同的概念。大家都知道Apache是可以通过HTTP协议来提
供Web服务的,那么xorg通过X协议来提供什么服务呢?答案是图形用户界面服务。
Apache的客户端请求Apache得到的结果是HTML内容,而xorg的客户端请求xorg的
结果则是向屏幕上画图。它们之间还有一个很大的不同就是Apache只能被动地接受
客户端请求,而xorg还需要主动将当前键盘按键和鼠标位置等信息通知给客户端。
所以,Linux上的那些拥有图形用户界面的软件实际上都是xorg的客户端,它们利
用X协议让xorg在屏幕上画出窗口或通过xorg获得键盘和鼠标事件。当然,为了运
行这些软件也就需要一个前提,xorg这个服务,也就是通常所说的X服务器,必须是
启动的。现代大多数Linux发行版的默认安装都是自动支持图形用户界面的,也就是
说它们会在系统启动之后自动执行xorg。
可能有些人会意识到,如果系统中只有xorg是不可能有任何图形界面供大家使
用的,至少还需要有个X客户端程序。而且这个X客户端程序还有一个专有名称——
窗口管理器,英文叫做Window Manager,简称WM。WM也不是一个具体的软件,而
是一类软件。诸如KDE、GNOME这些就是包括各自的窗口管理器,也有一些单独的窗
口管理器,如FVWM、Openbox、IceWM等。它们控制窗口外观、位置和提供用户去操
作这些窗口程序的方法。所以不同的窗口管理器会有不同的使用习惯。如果你当前
使用的Linux系统没有配置成默认使用图形用户界面的话,可以使用命令:
startx
来启动xorg和默认的WM。对于Cent OS 6.4来说,默认的WM应该是GNOME的
Metacity窗口管理器(KDE的是KWin),而且默认情况下是使用图形用户界面的。
对于那些默认使用图形用户界面的Linux系统,还有一个十分重要的X客户端需
要启动,就是显示管理器,英文叫做Display Manager,简称DM。这个是做什么的
呢?它是专门负责图形界面的用户登录问题的。也就是说,系统启动之后第一个要
启动的X客户端程序就应该是DM,而且没有人能关闭掉它。(你能猜到为什么要这样
吗?)DM也是一类软件,具体的应该是XDM、KDM或GDM等。
好了,有关Linux图形用户界面的介绍到这里就差不多了,更深入的内容我们留
在后面吧。现在我们要谈论另外一个话题,就是Linux怎么会把它的图形界面设计得
这么乱!1.2.2 架构设计
其实Linux系统的图形界面设计还是非常清晰的。让大家觉得乱的原因可能是有
两个:一是我的写作水平有点问题,二是涉及的新鲜事儿太多。我总认为第一点是
主要因素,所以干脆不写了,画个图给大家看看。下图展示了Linux界面的基本结
构,同时提供了Windows图形界面基本结构进行对比。自我感觉画的比说的要好。
图 1.16
当结构清晰的时候,问题随之就会来,不知道你发现问题了没有?最大的问题
就是从结构上看Linux的图形界面效率肯定比Windows的要差。因为Linux需要很多
层的软件互相协作才能实现图形界面,而Windows则相当直接,不拖泥带水的就搞
定了图形界面。在计算机科学领域很少有实践结果与理论预期出现相反结论的情
况,但是,可是,可但是,但可是……小概率事件还是会发生的,偏偏这个就是典型
的一例。众所周知的Mac OS X的图形效果是目前任何操作系统都无法比拟的,自然
也包括Windows的任何版本。而Mac OS X是一种类Unix操作系统,采用的恰恰就是
这种架构。只是Mac OS X的“X协议”与Linux所采用的X协议有很大不同,前者是
二进制的,后者使用的是纯文本。从纯粹学术理论上来讲,纯文本虽然在效率上会
有些损失,但在其他方面会更具优势。这个问题在本书的第4章将会继续探讨,这里
就先说这么多。
正因为Linux的图形界面得益于这种优良的架构设计,虽然在效率上不及MacOS X那样优秀,但是图像效果和功能的丰富程度绝对不会比Windows差,至少它拥
有很多种桌面环境可以选择,可以说每一种都会让你有完全不一样的体验。看惯了
Windows的“老气横秋”,不妨去感受一下Linux的小清新吧!1.3 主流桌面环境
Linux强大的适应性、创新性以及开放性在它的桌面环境方面得到了十分充盈的
展现。目前比较流行的就有GNOME、KDE、XFCE和LXDE,它们并称为Linux图形界面
四杰,个个美轮美奂,风格迥异。它们并不是单纯的单一软件,而是一套软件集
合,比如WM、DM、应用框架库等。最近有传言称Linus Torvalds 大神在
Google+上大骂GNOME3“不能容忍的凌乱”,并改投XFCE的怀抱。不管真假,至少
我认为GNOME3是很考验智商的。其实这玩意没有好坏之分,只是口味不同,自己用
着舒坦的就是最好的,是不是?
Linux之父啊,本书的读者要是不认识他是有些说不过去的。
本书并不准备截图给各位欣赏,原因主要有三:一是印图成本太高,我也是屌
丝一名,知道挣点钱不容易;二是大家可以通过Baidu或Google查询到非常多的截
图,直接在电脑上看知道效果会更好;三是学习Linux最需要亲力亲为持之以恒,我
们不希望浪费你去主动查询资料的好机会。望能够理解我们的良苦用心
1.3.1 KDE初学者的首选
KDE是由德国人Matthias Ettrich于1996年就读于图宾根大学时开始的一个计
划。当时的Unix桌面没有一个应用程序的外观、感受或工作方式与其他程序一样。
于是Matthias Ettrich就建议不仅是创建一套应用程序,而是要创建一个桌面环
境,能让用户拥有相同的外观、感受和工作方式,而且这个桌面应该是非常容易使
用的。他的这个想法得到了很多人的支持,从此KDE计划就诞生了。
可能有人会疑惑,KDE是给Unix的,似乎跟Linux没有什么关系,为什么这本书
要介绍它呢?其实不单单KDE是这样,剩下的三个桌面环境也是这样。甚至在这个星
球上完全针对Linux编写的软件也是并不多的,那些在Linux下能够获得的软件大多
不是针对Linux开发的。它们是针对Unix系统的,而Linux属于类Unix系统,所以
就毫无歉意地坐享了这些成果。这就是Linux的优势,也是大家学习Linux的优势。
学会了Linux,几乎就等同于学会了Unix或类Unix系统,它们在这个星球的应用范
围就从来没有被Windows超越过。本书的内容也是如此,只有少数章节是专门针对
Linux特性所特别设置的,大多数知识都是通用且极具实用价值的。好了,闲话不多
1
1说,我们继续介绍KDE。
追究KDE这个名字的由来是没有实际意义的,但是我们需要知道它是完全采用Qt
程序库(后面的章节会有详细介绍)开发的。由于Qt多舛的命运 ,注定了KDE同样
会拥有风雨飘摇的艰辛历程。
1991年由TrollTech公司开发,于2008年被Nokia所收购,2012年又卖给了Digia公司。曾数次修改授
权方式。
虽然Qt是开放源代码的软件,但是在KDE早期的时候Qt并非是自由软件授权,这与KDE的自由软件授权相冲突,所以很多人会担心惹上版权麻烦,尽量避免使用
KDE,这成为了KDE初期推广的障碍。
很庆幸的是1998年11月之后,Qt程序库所属的Trolltech公司发布了第一份自
由软件许可Q Public License(QPL)的Qt程序库授权。同年不久,KDE Free Qt
基金会 保证:若Trolltech在任意连续12个月内没有发布新的自由版本,那么Qt程
序库将更改为基于BSD许可证的授权进行发布。但是很多人依然争论着,认为QPL授
权与GPL(万恶的“鸡屁儿”)上的某些条款不相容。这导致了Red Hat公司始终无
法将KDE当作默认桌面,而Mandriva Linux则趁此时机凭借KDE席卷了欧洲市场。
就是保证Qt和KDE在任何情况下都是自由软件的组织,最初有TrollTech和KDE开发者共同创立。
直到2000年9月,一个基于GPL协议的Qt程序库发布,大部分用户方才对KDE生
出信心。此时的KDE已经日臻完善,国内的各大Linux发行版都纷纷采用KDE作为其
默认桌面,甚至出现了“阳春白雪 ”这样专门针对KDE的汉化美化套件。
2001年沈阳玳娜软件有限公司为了推动中文Linux的普及,针对Red Hat Linux 7.2推出的一款汉化美
化套件,其中包括中文输入法和KDE的汉化美化部分。属于死在沙滩上的优秀前辈。
2008年是一个非常重要的年景,奥运会第一次在中国召开,Qt升级到了4.0,并且采用了更加宽泛的LGPL授权(仅Qt4以后的版本)。但是KDE的好日子到头了。
Qt4的LGPL授权固然招人喜欢,但是Qt4相对于Qt3做了较大幅度的调整,如果KDE转
投Qt4,则必须做较大改动甚至重写。KDE的开发者们抱着有困难要上,没有困难制
造困难也要上的必死决心毅然地转投Qt4的怀抱。这导致了很长一段时间人们没有新
的KDE版本使用,那些不断放出的KDE4的各种版本几乎个个都是花瓶,中看不中
用。直到KDE 4.2版本的发布,才彻底稳定了下来。于是就在Linux界流传了一段笑
2
2
3
3
4
4话:KDE从能用到不能用再到能用,之后GNOME从能用到不能用。至于GNOME的故事
我们稍后再说,KDE的故事还在继续。
经过Qt3到Qt4转变的这么一折腾,损失大量粉丝是在所难免的了,而祸总是不
单行的。就在KDE4准备发力接受市场的挑战之际,Qt的所属公司Trolltech被大名
鼎鼎的Nokia收购了。原以为能够如虎添翼一下,可万没想到的是Nokia又是一个倒
霉蛋,倒霉到不得不去抱微软的大腿。结果是大腿没等抱稳,就把Qt给弄丢了,出
售给了Digia公司。但是不管怎么样,由于Qt是LGPL授权的,所以它就是属于全人
类的了,我们能够永远都有免费的Qt使用。
Qt其实是一个非常优秀的C++跨平台图形界面开发库,几乎可以媲美Java的跨
平台特性。不同的是Java能够一次编译到处运行,而Qt是可以一次编码到处编译。
也正因为如此,KDE已经被移植到了几乎所有硬件和操作系统平台上。现在的KDE已
经不单单是一个桌面环境,它几乎就是基于Qt开发的程序的庞大集合,是Qt的一个
超级平台。这里拥有功能异常丰富的应用,包括各种跨平台组件、办公套件和开发
套件等,几乎可以找到任何Qt应用的样板。而且从任何角度来看,Qt都是用C++开
发跨平台图形应用的首选程序库,最新的WPS选择它就是非常好的佐证。对于学习和
掌握Qt,KDE是非常理想的平台。
需要注意,如果你根据我们的推荐选择安装了CentOS,KDE是选装部分,需要
在安装的时候选中它才可以,否则就需要根据下一章所介绍的内容去手动安装了。
如果你选择的是SUSE,则默认就可以使用KDE了。我们推荐初学Linux的用户选择
KDE,它的操作习惯与Windows更加接近。
1.3.2 GNOME不可磨灭的经典
在KDE受版权困扰和没有新版可用的时候,陪伴在人们身边的是GNOME桌面环
境。虽然GNOME3使得GNOME从能用变得不能用了,但是GNOME2则依然是不可磨灭的
经典。
GNOME是GNU 网络对象模型环境——The GNU Network Object Model
Environment的英文缩写。它是GNU计划的一部分,开放源码运动的重要组成部分。
目标是基于自由软件,为Unix或者类Unix操作系统构造一个功能完善、操作简单以
及界面友好的桌面环境,它是GNU计划的正式桌面。如果说有那么一个桌面环境是为Linux而生的,那么就非GNOME莫属了,它被现
代的大多数Linux发行版作为默认桌面使用。因为Linux是类Unix的缘故,GNOME虽
出于Linux但胜于Linux,已经能够运行于各种类Unix系统了,所以就有了前面对
GNOME的描述。
GNOME主要是为了当初使用没有采用GPL授权的Qt的KDE而出现的。GIMP
Toolkit(GTK+,本书后面的章节会详细介绍)就成了Qt的替代者,担当GNOME桌
面的基础。GTK+使用LGPL许可证授权,允许链接到此库的软件(例如GNOME的应用
程序)使用任意的许可协议。GNOME的应用程序通常采用GPL许可证授权。
GNOME本身是使用C语言编程的,但并不受限于C这种单一语言。GNOME使用
CORBA(Common Object Request Broker Architecture)让各程序组件能够彼
此协作,而又不需要考虑它们是何种语言所写成的,甚至是在何种系统上执行的都
不用考虑。
GNOME提供了两个东西。一是GNOME桌面环境,一个对最终用户来说符合直觉并
十分吸引人的桌面。GNOME3做到了吸引人,但是我总觉得它不符合我的直觉,也就
是我总是找不到我要找的东西(可能是智商问题)。二是GNOME开发平台,一个能使
开发的应用程序与桌面其他部分集成的可扩展框架。这点GNOME做得相当好,CORBA
就是非常典型的例子。
在GNOME之下还有很多子计划,它们不都是包含在GNOME中一同发布的。一些基
于概念的纯粹实验性的项目,等稳定后会加入GNOME;还有一些是正在完善中,以便
能够直接加入的,例如GNOME存储和D-BUS。
目前的主流发行版,如RHEL、CentOS和Ubuntu等都是以GNOME为默认桌面的,操作手感更像Mac OS X,但是属于完全不同的风格。这是绝对原汁原味的GNU。
1.3.3 XFCE——轻量、简单、高效
KDE和GNOME虽然雍容华贵,但是也恰恰就有些太过“臃容”,对于喜欢“轻
淡”口味或只有“小马力战车”的屌丝们,XFCE是一个相当不错的选择。
XFCE是一个轻量级的Linux或类Unix的桌面系统。XFCE的设计目的就是:快速加载并用来执行程序,且占用系统资源少。从实际的使用效果上看,XFCE也的确做
到了这一点。也正是因为如此,作为一个拥有很长历史(其源自1996年)的桌面环
境,能够在很多U盘Linux中见到它的身影。
XFCE是使用率仅次于KDE和GNOME的桌面环境。各大发行版基本都会将其作为可
选桌面提供。甚至一些发行版,如Xubuntu、SAM Linux Desktop等已经开始将
XFCE作为默认桌面了。
XFCE与GNOME一样,也是基于GTK+开发的,这首先保证了不会有任何授权问
题。另外,XFCE不仅可以作为桌面环境使用,还能够作为程序库来开发第三方程
序,比如文字编辑器Mousepad。
XFCE肯定是没有办法与GNOME和KDE相比的,但是简单和高效是它的特点,如果
你已经修炼成了一个Linux行家里手,那么XFCE将会是你梦寐以求的选择。具体为
什么,读完这本书你就知道了。
1.3.4 LXDE——更轻,同样精悍
如果对小巧精悍的桌面环境很有爱的话,那么LXDE则是另外一个十分值得推荐
的选择。如果你是一个民族主义者,那么一定会十分喜爱LXDE,因为它完全是我们
中国人开发的,虽然他们都是来自台湾省(这是我国领土不可分割的部分)。
LXDE相对于前面三个桌面环境会显得相当地年轻。它在2006年还只是一个文件
管理器,后来才慢慢发展成为一个功能齐全的桌面环境。虽然LXDE是2006年的东
西,但是它对系统的要求却低得惊人,甚至在1999年的老电脑上不用3D加速也能流
畅地运行。所以,在上网本、MID等低功耗移动电脑上拥有比较广泛的应用。这也十
分对得起它的名字—— Lightweight X11 Desktop Environment,轻量级X11桌
面环境,简称LXDE。
LXDE与前面三个桌面环境不同,它没有自己开发WM,而是选用了Openbox做为
默认WM。这种选择使得它不必重新造轮子,还始终能够保持十分轻量。而且
Openbox本身也是十分轻量的。这两者的强强组合,促成了LXDE的无比强大。其实
在Linux世界,你所见到的大多数复杂软件系统,都是这种强强组合的结果,像
KDE、GNOME、XFCE这样的一应俱全的软件套件是非常罕见的。LXDE同样是采用GTK+开发的,由此可见GTK+在开源图形领域的地位是多么地重
要。单从这几方面的应用,几乎就可以让初学者确定到底应该学些什么了。但是我
更加喜欢Qt,至于具体是为什么,也就是萝卜青菜的差别。1.4 返璞归真的命令行
有一种说法,现代计算机不是靠电力驱动,而是靠“鼠标”。多少应用程序的
界面都是需要移动和点击鼠标来执行的。计算机本来的用意是把人类从反复单调的
工作中解放出来,但摆在我们身边的残酷现实是我们每个人每天不得不反复单调地
移动和点击鼠标,以确保养家糊口的工作能够顺利正确地完成。
别叹气,存在另一个世界,那就是命令行,让你暂时远离鼠标。对那些苦哈哈
的程序猿来讲,这也许是另一种情调的工作方式。我们突然之间拥有了另一种意想
不到的收获,例如我想看看用户目录下的文件大小,然后按升序排列产生个报表。
如果用CC++完成这项工作,至少得用好几十行代码,但是用一句命令行就能完成上
面的功能。
du -s | sort -nr > HOMEspace_report.txt
命令行有它的存在价值吧。还有把 Linux 桌面操作录制成一段视频,想起来
就是一件复杂的任务,在Linux上用一句命令就能轻松搞定。
ffmpeg -f x11grab -s wxga -r 25 -i :0.0 -sameq tmpout.mpg
卖个关子,这个命令会在第18章作详细解释。
估计你可能会迫不及待地想要实验一下刚才所提到的命令,但是苦于现在都流
行的图形界面,我们推荐的CentOS默认也进入了图形界面,看来要想做点实验还是
有点难度的。不过不用着急,Linux的老手们一定是要命令行的,所以想通过键盘输
入命令,一个合格的Linux发行版一定会做得十分方便,只是要先搞清楚一些概念。
1.4.1 开始执行命令
用户和系统不是直接打交道的,它们中间有个名字叫shell的联系人。我们从键
盘中输入命令给shell,shell再把它交给操作系统去执行。从哪里开始输入命令呢?当然你可以在字符界面输入命令(暂时先放放,稍后
再看)。Linux系统还提供一个叫终端模拟器的程序。这个程序打开一个窗口,让我
们与shell交流。Linux系统上的各种软件向来是百花齐放,模拟器终端也不例外,例如gnome-terminal、konsole、xterm、rxvt、kvt、nxterm和eterm等,而大
多数Linux发行版会同时支持几种。
使用过Windows操作系统的人,在登录Linux桌面系统后,应该也能轻松地从菜
单中选择启动终端的图标,点击就可以进入终端模拟器。当然你也可以在文件浏览
器中找到叫“konsole”(KDE桌面)或“gnome-terminal”(GNOME桌面)的程序
双击执行以打开终端窗口。更有意思的是你可以打开任意多个窗口,每个窗口给你
一个shell会话。你从中选择了一个窗口开始尝试输入这个命令:
cp etcresolv.conf etcresolv.conf.bak
cp: cannot create regular file 'etcresolv.conf.bak': Permission denied
太欺负人了吧,这么简单的命令都不让偶用。
你注意到没有,shell命令提示符是,这意味着什么?这意味着你是普通用
户,不是超级用户,你没有管理员权限。如果你是拥有管理员权限的root用户,提
示符就变成,你就可以在系统上做增加、删除和修改文件的操作。
1.4.2 文本和图形的切换
方才我们介绍的方法是目前最常用的在桌面环境下执行命令的方法,但是也有
很多有“洁癖”的人喜欢使用纯粹的文本终端,这就需要进行图形和文本切换了,或者干脆就关闭图形界面。我们先搞定前者,后者会在后面的章节做十分详细的介
绍。
要在文本和图形界面之间来回切换非常简单,只需要使用快捷键
~ 来回切换就行,具体什么效果大家可以自己实验,这个地方不同的
Linux发行版会有不同的设定,所以本书就不好做定论。一般代
表图形界面,而剩下的5组快捷键对应5个不同的文本终端,我们推荐的CentOS就是
这种设定。还有的设定是是图形界面,其他6组快捷键是6个不同
的文本终端。一般不建议使用这种方法来操作Linux,除非你有强烈的“洁癖”或遇到有“洁
癖”的系统管理员。因为这种方法你能够使用到的独立文本终端最多只有6个。而前
面介绍的在图形界面中使用终端模拟器的方法,则没有文本终端数量的限制。对于
一个Linux老手来讲,文本终端永远都是多多益善的。很快你们就会有这种感觉了。
1.4.3 基础命令的操作
提及Linux基本命令,先给你讲述一个浪漫的故事。
曾经有个男孩很喜欢一个女孩,可是不敢表白。他想了一个办法,在Linux终端
上输入:
echo “这周六下午2:30,能在如嘉咖啡馆一起喝咖啡吗?” > love.txt
然后回车。接着他找来那张他喜欢的鼓浪屿图片(pic.png),使用命令:
cat pic.png love.txt > pic1.png
重新做了一个图片文件。他鼓起勇气给那个女孩写了封邮件,邮件内容只是:
请查阅附件。
女孩收到邮件,用图片浏览器打开后,看到的只是一张美丽的风景图片,有点
纳闷。但是聪明的她,立刻猜到了那个男孩的用意。她用tail pic1.png,很快发
现了秘密。
tail pic1.png
PNG
IHDRm?tEXtSoftwareAdobe ImageReadyq?
[图片编码内容,一般人无法直接读懂……])'EDDD□□□q□□q^□cDDD□□GDDDDm□y□w□}!“这周六下午2:30,能在
如嘉咖啡馆一起喝咖啡吗?”太妙了,原来学好Linux通过Linux基础命令还可以交女朋友。(用这法注定孤
独一生)加大马力,我们来认识更多的命令吧。不过我们会遇到一个问题,Linux
命令太多了,至少有200多个,怎么记呀。其实谁也记不住这么多命令,剥茧抽丝抓
重点,把重要的和经常使用的搞定了就行。按照它们在系统中所起的作用,我简单
地做了一下分类说明,更为详细的下章还有。见表1-1的内容。
表 1-1
命令 说明
目录和文件处理
mkdir
建立目录
用法:mkdir [OPTION] DIRECTORY...
例: mkdir fangru
ls
列出目录下的内容
用法:ls [OPTION]...[FILE]...
例: ls -al fangru
cd
更换工作目录
用法:cd [DIRECTORY]
例: cd fangru
pwd
显示当前工作目录
用法:pwd
cp
拷贝文件及其目录
用法:cp [OPTION]… SOURCE DEST
例: cp jie.txt jie.bak
mv
移动(重命名)文件
用法:mv [OPTION]…SOURCE DEST
例: mv jieold jienew
rm
删除文件或目录
用法:rm [OPTION]…FILE…
例: rm -rf jie_dir
文本处理
cat
连结文件打印到标准输出
用法:cat [OPTION] [FILE]…
例:cat pic.png love.txt > pic1.png
还记得那个命令行的故事吧?这个命令也常被用来查看小文件的内容
more
查看文件内容,当画面在显示满一页的时候暂停,按空格继续或按Q结束
用法:more [OPTIONS] FILE例: more etcgroup
less
与more类似,但是less允许利用光标键上下卷动文本内容进行浏览
用法: less [OPTIONS] FILE
head
查看文件头部内容
用法:head [OPTION]… [FILE] …
例: head etcgroup
tail
查看文件尾部内容
用法:tail [OPTION] … [FILE] …
例:tail etcgroup
比较常用的一个命令选项是-f,它可以用于跟随文件的增长,显示文件的最新内容。对于
在线监控软件日志非常有帮助
echo
显示一行文本
用法:echo [OPTION] [string]
例:echo HOME
系统管理
ps
强悍的进程查看命令
用法:ps [OPTION]
例:ps –aef
kill
删除执行中的程序或工作
用法:kill [OPTION]
例:kill -9 3154
jobs
通过jobs命令查到后台正在执行的命令的序号(非进程号pid)
用法:jobs
bg
指定号码(非进程号)的命令进程放到后台运行
用法:输入'ctrl+z' 然后输入 'bg'
例:bg
fg
指定号码(非进程号)的命令进程放到前台运行
用法:fg
文件系统
du
查看目录或文件所占用磁盘空间的大小
用法:du [OPTION]……[FILE]……
例:du
df
检查文件系统的磁盘空间占用情况。
用法:df [OPTION]……[FILE]……
例:df
1.4.4 快捷键有位童鞋正在Linux系统上开发一个中文相似度匹配的项目,工作相当努力,已
经达到了废寝忘食的地步,但是使用的TF-IDF 算法的计算速度还是不尽人意。这时
候,他决定先停一停,换换思路,玩玩俄罗斯方块放松一下。突然老板走过来,他
下意识地使用快速隐藏桌面。还好有惊无险,没有被老板发觉在玩
游戏,否则又需要一大堆的解释。老板拍了拍他的肩膀走了过去,随后他用
又恢复了原有功能的显示。
TF-IDF(term frequency-inverse document frequency)是一种用于信息检索与数据挖掘的常用加
权技术。TF-IDF是一种统计方法,用以评估一个字词对于文件集或语料库中的一份文件的重要程度。
举这个好玩的例子可不是让你照着做,而是为了告诉你Linux系统提供了很多快
捷键提高命令行使用的工作效率,减少键盘的敲打以及拼写错误。说几个比较实用
的快捷键,见表1-2所示,其他的你自己去挖掘。
表 1-2
常用快捷键 说明
在文本终端下,使用TAB自动完成命令的输入,或者显示所有的可选
项。超好用!
滚动文本终端输出。终端屏幕上一屏又一屏的提示信息,就可以用它
向上翻滚查看这些信息
回滚文本终端输出
文本终端下关机和重新启动
关闭或重启X Window
a 到正在输入的命令行的首部
5
5e 到正在输入的命令行的尾部
c 终止当前进程
s 停止终端传输
p 上一条执行的命令
n 下一条执行的命令,前提是执行过p
f 在当前命令输入中右移光标一个字符
b 在当前命令输入中左移光标一个字符
f 在当前命令输入中右移光标一个词
b 在当前命令输入中左移光标一个词
k 删除光标后的所有字符
d 删除光标当前的字符
切换不同的程序窗口
访问“开始”菜单
<鼠标左键> 拖曳并移动一个窗口
把当前屏幕的快照存到剪贴板
哈哈,老板键。切换隐藏显示桌面运行程序使用快捷键太爽了!默认情况下,按TAB在bash中是可以自动补齐,但仅能自
动补齐命令名和文件名。可是我们追求的目标是“更快、更高、更强”,那就安装
bash-completion做个增强版的自动补齐吧。使用TAB键自动补齐几乎任何内容,包括参数、文件、目录甚至包名称等。安装方法很简单,下载到的包中包含一个
bash_completion文件,将其放在etc下。在etcbash.bashrc文件里加入可执
行命令(这个操作需要root权限)。
Run bash completion code
if [ -r etcbash_completion ]; then
Source completion code.
. etcbash_completion
fi
1. 更快……
举个例子。淘宝的预发环境中的Linux机器不允许直接登录。需要申请跳板机,通过跳板机才能登录预发机。在跳板机上,我们经常使用ssh 10.232.15.201操作
命令,好麻烦呀。在etchosts中我们加入一行“10.232.15.201
prerelease”。
然后我们使用complete -F _known_hosts ssh告诉ssh需要的主机名。一旦
设置好了,我就可以通过敲[TAB]键完成主机名的输入:ssh p[TAB]。
另外你还可以定制私有命令的补齐功能,不过你需要自己编写shell脚本实现,然后把这个脚本放在etcbash_completion.d下。在随后的章节,我们会学习
shell脚本的编程。在学完之后,希望你会通过编写脚本产生自己的补齐功能。
2. 更高……
有的命令太长,那就把命令缩短。命令别名(alias)就起到这个作用。例如在
SUSE版本中有个命令别名的文件(etcprofile.dalias.bash)。它里面定义
了许多命令别名,例如alias ..='cd ..', 那么在终端上输入“..”就相当于输
入了“cd ..”直接回到上级目录,方便不?3. 更强……
在shell终端上还可以一下子运行多个命令,只需要用分号“;”把各个命令串
起来就行:
[命令1];[命令2];[命令3]
不管执行的命令结果如何,就是勇往直前地冲呀杀呀,把这些命令最终执行
掉。但是有时候,这些命令之间是有关联的,就需要改改这种傻愣愣的工作方式。
我们可以用“”把命令连接起来,只有前一个命令执行成功才执行下一个命令:
[命令1][命令2][命令3]
如果需要等前一个命令执行失败才执行下一个命令,则要使用“||”把命令连
接起来:
[命令1]||[命令2]||[命令3]
哎,使用命令行的技巧还真不少,我们可以考虑出版一本专门讲述Linux命令行
的参考书了:)
1.4.5 错误信息
%boast
bash: fg: %boast: No such job.
当命令执行成功的时候终端屏幕上不显示任何信息,但是当发生错误的时候它
经常会以一定的形式汇报错误。上面我开了一个关于Linux错误信息提示的玩笑。
boast是吹牛的意思。我在终端上敲入“%boast”后,终端返回错误提示“No
such job”,意思是没有这样的工作。不同的命令返回的错误信息格式有所不同,但是经常有如下格式:
命令名: 执行内容: 错误信息
例如: rm jie
给出的错误返回是:
rm: cannot remove 'jie': No such file or directory.
那究竟发生了什么情况?当rm命令要删除jie这个文件,jie这个文件不存在,产生了代号为2的错误。这个错误代号的意思就是找不到相应的文件或目录。错误代
码就被自动翻译成No such file or directory。由于错误代码有限(大约有一百
多种),有可能许多不同问题对应于同一个错误代码,所以理解要执行的命令和错
误信息的关系很重要。得到错误信息,让我欢喜让我忧,喜的是知道发生什么样的
错误,忧的是对错误信息有可能百思不得其解,不知道如何去解决,这时候就得凭
经验了。
errno.h包含一个完整的基本错误代码列表。除此之外,其他一些头文件
(.h)也定义了自己的一些错误代码。代码1列出了系统定义的所有错误代码及错误
描述。
代码1:
include
include
include
int main(int argc, char argv) {
int i = 0;
for(i = 0; i< 256; i++)
printf(errno.%02d is: %s\n, i, strerror(i));
return 0;
}
编译此程序用命令:
gcc -Wall strerror.c
执行程序:.a.out
这个程序的输出有点长,所以就不去浪费纸张了,你自己在电脑上看吧。
1.4.6 联机帮助——man很靠谱
遇到问题寻找帮助能加快解决问题的速度。在Linux系统上,有以下几个途径可
以获得帮助:
1. 遇到问题,男人(man,其实是“手册”的简称)的帮助很靠谱。需要某个
命令或者配置文件的帮助,就在终端输入:
man 命令名
或
man 配置文件
屏幕就会显示对应命令系统的帮助手册。输入“q”退出帮助浏览器。
2. info 和 man 功能相似,但是包含更多的最新信息。
3. 使用“命令名 –help”得到一个简略容易消化的命令帮助。
4. 程序自带README文件或者其他帮助信息文件,例如在usrsharedoc下
的一些手册。
如何在man页中查找信息呢?浏览man页默认的工具是less。less的使用方法很
简单。翻页用Space,查找用反斜杠“”紧跟着正则表达式,用n查找下一个匹配
项,用Shift+n查找前一个匹配项。如果这页里没有你感兴趣的,按Space翻到下
页。更多的操作还是man一下less文档吧。
很多命令的man帮助页中涉及shell命令、系统调用和编程接口等多方面,而这
些内容很可能会拥有相同的名字。例如“printf”,它既是shell命令,又是库函
数。为了能够精确找到你需要的帮助信息,人们为它们进行了分类编号。比如3代表库函数,我们要使用这样的命令才能找到库函数printf的帮助信息:
man 3 printf
否则的话,你得到的帮助信息是shell命令printf的帮助信息。可是man对帮助
信息做了哪些分类,分别都用什么编号来代表的呢?这个问题我们不用管,第3章再
说。当前为了解决这种分类问题我们有一个折中的办法,就是使用“-a”命令选
项,它会把所有跟你给定的命令名有关的帮助信息都列出来。例如:
man -a printf
慢慢看吧,如果觉得当前的信息不是你需要的,按“q”之后会显示另外一个分
类的信息,直到找到自己需要的为止。当然,有些时候你可能一无所获,最大的可
能就是你记错了关键字。
还有,帮助信息中的“SEE ALSO”经常是被遗忘的角落,但是我经常会在这里
发现其他有用的命令或库函数,千万不要放过它。
1.4.7 致命的Linux命令
别以为我是在开玩笑。有些Linux命令轻则造成数据丢失,重则导致系统瘫痪。
你看这位同学漫不经心,以root身份敲入了rm -rf ,强制删除 目录下的所有
文件,这代价可是很惨痛的(相当于系统自杀)。
还有一个很好玩的例子,我用旺旺聊天的形式给你讲述:
小雪2012-08-25 15:28:10: 在你Linux系统上输入这串东西:{ :|:
};:
灰猫2012-08-25 15:28:34: 长得这么怪?
小雪2012-08-25 15:28:41: 试试看看是什么结果。谢了。
灰猫2012-08-25 15:28:44: 不好了。终端一直出现下面的提示:-bash: fork: retry: Resource temporarily unavailable
-bash: fork: retry: Resource temporarily unavailable
-bash: fork: retry: Resource temporarily unavailable
-bash: fork: retry: Resource temporarily unavailable
-bash: fork: retry: Resource temporarily unavailable
-bash: fork: retry: Resource temporarily unavailable
-bash: fork: retry: Resource temporarily unavailable
-bash: fork: retry: Resource temporarily unavailable
-bash: fork: retry: Resource temporarily unavailable
很惨啊。
小雪2012-08-25 15:29:02: 哈哈,真的很惨。
灰猫2012-08-25 15:29:21: Ctrl+C都是不管用的。
小雪2012-08-25 15:29:21: 即便退出这个终端也是没有用的。
灰猫2012-08-25 15:29:31: 最后全都是这个。-bash: pipe error:
Cannot allocate memory -bash: pipe error: Cannot allocate memory
root用户搞不定,因为killall的速度受到了影响,只能重启机器了。
小雪2012-08-25 15:30:15:这就是著名fork炸弹。看来危害不小。
灰猫2012-08-25 15:30:34:别幸灾乐祸了。能告诉我什么原理吗?
小雪2012-08-25 15:31:43:把:{ :|: };写成下面格式你就看懂了
:
{
:|:
};
:
灰猫2012-08-25 15:32:13: 明白了。“:”函数里面定义操作是后台执
行“:”函数重定向到“:”函数,“:”函数的递归调用。小雪2012-08-25 15:32:15: 是滴。系统执行海量的进程直到死亡。
灰猫2012-08-25 15:32:43: 这样的代码不好分析,主要是因为不清
楚“:”是可以做为函数名的。
小雪2012-08-25 15:33:12: Quite right。另外为了防止这个问题的出
现,要限制赋予root权限的用户数量以及单用户的进程数。
灰猫2012-08-25 15:34:12: 哈哈。是的,拥有root权限的用户操作不慎很
容易给系统造成破坏。
故事还没有结束。如何限制用户的进程数呢?我们可以
在etcsecuritylimits.conf文件末尾加入一行:
hard nproc 200
限制用户的进程数为200,但root用户不会受这个限制。
这个命令行还涉及shell脚本编程,我们将在后面的章节来学习。1.5 结束语
我们的第一次亲密接触到此该告一段落了。如果Linux长什么样你依然不知道,那真的实在是抱歉,你太懒了。如果你要问我学习Linux的捷径是什么,我的答案就
是两个字:勤劳。一定要勤动手,才能学好Linux。
Linux与Windows是完全不同的操作系统,拥有着独特的风采和特性。虽然我们
对Linux远不如像Windows那样熟悉和亲切,但是通过本章的亲密接触,或许能够让
你体会到一点Linux所特有的那种“笨拙”的温柔。只要那么一点点就足够了,我想
那已经足够提起你的欲望了。
接下来,我们将会从多个方面、多个角度以及多个层次,与大家共同去探索
Linux到底是什么。
第 2 章 融于心而表于行
时间总是过得那么快,如流水一般哗啦啦地就淌走了一大堆!周遭事事沧桑变
迁,喧哗或耳语中流传的故事已渐模糊,转眼间2014就来了。泰坦尼克号撞冰山都
100+年了,同名的电影也改成3D的了,只是你想看的全都给剪没啦。如果你是未来
的考古学家,我可以自豪地告诉你,我们这个年代电脑早就飞进了平常百姓家。
千万不要以为我在闲扯,Linux与泰坦尼克号这个倒霉蛋是有着千丝万缕的联系
的。具体有什么联系,咱们按下不表,在后面的章节中还会有十分精彩的描述。
很多人会认为Linux是一个年轻的操作系统,至少我本人在很长一段时间内都是
这么认为的。因为它总能紧跟时代潮流,别人有什么它有什么,USB、WiFi、SSD……
突然发现,原来岁月是最大的小偷,在我不经意间,将我的很多东西都已经悄
悄地偷走,青春、激情、自信……我使用Linux已经超过了十五年,而且到本书截稿
时,Linux已经整整22周岁了。
对于计算机产业这个新技术日新月异的行当来说,拥有22年历史且在操作上没
有什么变化的系统不能不算老旧。可是Linux并不是原创,亦或我们说Linux“抄
袭”了别人也不算过分。而正是因为它“抄袭”的对象——Unix更是足够
Niubility的,所以Linux也被称之为类Unix系统。
Unix自1969年诞生至今,已经40多年的历史了。然而,其基本的操作方式和一
些理论基础并没有太大改变,而且最终形成一个强大的Unix文化(本书后面的章节
将做详细介绍)。Linux将这股文化深深地融入到了自己的内心深处,也使得它的很
多行为表现与那个40年前所诞生的系统没有太大差别。
是的,融于心而表于行,这也正是本章的主题。Linux的用法实际上已经超越了
其自身的生命周期,几乎可以说是演绎在现代科技世界中的一部穿越大戏。跟我回
到你出生之前吧!先说明,接下来的所有内容都是基于文本命令行的,图形界面下
如何操作是显而易见的,我们再啰嗦就低估了大家的智商。2.1 多用户多任务分时操作系统
世界上第一台电脑是没有操作系统的,主要是因为太慢而运行不了。由于晶体
管的发明和微程序概念的应用,使得电脑从机械装置变成了真正的电子产品。这
样,系统管理工具和简化硬件操作流程的程序很快就出现了,这成为操作系统的滥
觞。随着电脑速度的提升,充分利用计算资源这种“节能减排”的需求呼之欲出,很快就有了批处理操作系统。但是批处理问题很多,提交的任务不再受到控制,这
显然会让很多人十分恼火。如何能够让人与电脑直接互动又可以“节能减排”,成
为了那个年代的热门话题,那大约是在20世纪60年代初。
很快就有新证据证明人类是这个星球上最聪明的生物,因为有人(具体是谁搞
不清了)提出了分时系统的概念:将大型电脑珍贵的时间资源适当分配在所有使用
者的身上,让所有使用者都有独占整部机器的感觉。依据这个想法,通用电气、麻
省理工学院和贝尔实验室合伙搞起了Multics项目,这是在当时看来最靠谱的分时
系统概念。但是由于太“靠谱”了(真正的多用户多任务分时操作系统),在当时
的技术条件下去完成它实在是吃力,所以最终的命运很悲惨。但是有两个游戏爱好
者,Multics项目的成员Ken Thompson和Dennis Ritchie为了能够有电脑玩游
戏,决定自己给一台闲置的电脑写个操作系统,于是,Unix——一个实用的多用户
多任务分时操作系统——就诞生了(就因为这个故事,我始终保持着经常打游戏的
好习惯)。
我们熟知的Windows XP、Linux、Mac OS X等都是多用户多任务分时操作系
统,可见这个概念一直延续到了今天。它们最显著的特点就是可以让多个人使用同
一台电脑而且不能互相窥探对方的秘密。当你使用电脑的时候可以边听音乐边看新
闻,同时还能跟朋友聊天。只要你觉得你的大脑还能处理得过来,你还能让这台电
脑同时干更多的事情。其实这类操作系统我们完全可以只用“分时”二字简要概述
下来。因为“分时”就像它最初的定义那样:将电脑的时间资源适当分配给所有使
用者身上,让所有使用者有独占机器的感觉。但是如果把“使用者”进行抽象,就
不仅可以代表人,还可以将任务也理解为电脑时间资源的使用者,那么“分时”就
是多用户和多任务的基础和前提。所以,既然是“分时”的,一般都会支持多用户
和多任务。需要注意,我只是说一般都会支持多用户和多任务。为什么呢?因为对于一个
分时系统,支持多任务是其与生俱来的本质,但是如果要支持多用户,则还需要很
多附加的条件,最大的一个问题就是用户的身份问题。要确定哪些用户能够执行何
种操作,这样才能保证系统运行稳定和可靠。只有有效地管理好用户的身份,才能
被称为是多用户的。Linux在这方面的能力是毋庸质疑的,从其诞生的那一天起就是
多用户的,所以它拥有非常良好的用户身份确认机制。Windows其实也具备这样的
能力,某些版本甚至做得比Linux还要好,只是大多数用户都没注意到这个问题。所
以系统读过本书的人如果还需要继续使用Windows,那么请重新考虑你的Windows用
户问题。
一个多用户操作系统,有些时候提供单用户模式是非常必要的。这个主要是在
系统发生故障时,进行故障修复时使用的。所谓单用户模式,就是操作系统不去确
认用户的身份,可以直接让用户进行各种操作。但是有的人可能会担心安全问题,这就像得病后需要吃药一样,都知道是药三分毒,可是病了还得吃,只能是两害相
权取其轻。能够有办法找回数据在大多数时候与冒点安全风险相比要重要得多。2.2 用户的身份
既然Linux从诞生的那一天起就是多用户的,足可见多用户管理是Linux一项多
么重要的功能构成。那么它都管理一些什么呢?简单来说就是管理用户的等级和用
户对文件的访问权。
Linux下的用户等级实际上是非常简单的,就两个等级——root和非root。
root用户在Linux下是拥有至高无上的权利的,也就是说它可以胡作非为。但是比
较幸运的是,只有一个用户是root,它的用户名就是root。而非root用户的权利是
严格受限的,只能访问由root规定的文件。为了比较形象地说明Linux用户的管理
模式,我们提出了这样一个模型……
2.2.1 澡堂子模型
我们把Linux的用户管理方式比喻成一个澡堂子模型,因为这非常形象。所有非
root用户,都只是这个澡堂子的顾客;root用户则是这个澡堂子的服务生;Linux
系统就是这个大澡堂子了(科普一下,人家现在叫洗浴中心)。
去过澡堂子的人都知道,一进门就会有服务生接待你,让你登记并发给你一个
带有号牌的钥匙。这个过程跟root用户给其他用户分配账号是一个道理。登记是向
系统中添加新用户,钥匙是给你登录系统的密码,而号牌上的号码就是你的用户
名。
当你获得钥匙之后,就可以进入更衣室了。女性更衣室什么样我不太清楚,但
是男性的更衣室一般都会有几组大柜子。每个大柜子又由n多的小柜子组成,其中有
一个小柜子是属于你的。怎么找到属于你的柜子呢?看柜子上面的号码!这个号码
与你钥匙号牌上的号码是一致的。你肯定能用这把钥匙打开它,至于能不能打开别
人的柜子我没试过。
这个过程跟我们登录Linux系统的过程十分相似。正确登录后,我们就会拥有一
个自己的文件目录,这个目录一般是home[username],后面的[username]与你
的用户名相同。一般称这个目录为home目录。更衣室的箱子就是你的home目录,里
面可以放入一些你的私人物品,可以保证别人偷不走。当你一切准备就绪,就可以开始沐浴了。但是一般都是一个很大的池子,放屁
撒尿的都有。如果你嫌脏,可以要一个单间,不过需要的花费也是不菲的。这与我
们正常使用Linux系统的道理差不多。只要离开你的home目录,就进入了公共区
间。一般都是只读的,但有少数的位置是能够写入数据的,比如tmp目录。对于这
些可写的地方就需要素质了,无论你是放屁还是撒尿,别人即便看到了也没办法。
但是如果你实在忍受不了别人这样,你可以自己单独使用一台Linux系统,这个花费
也的确是不小的。
即便是在这种轻松的地方,也总是会有倒霉蛋的。我就见过有人把更衣室的那
把钥匙弄丢的。一般这个很麻烦,因为衣物什么的都是锁在你专有的箱子里的,如
果不想让别人偷走,那你在没有钥匙的时候,也应该无法打开(用蛮力,而且别人
不会叫警察除外)。当然,如果你就此竟自离开,我也无言以对;但如果你一筹莫
展,我就告诉你有人能救你。那就是先前给你钥匙的那个服务生。因为他有一把特
别的钥匙,能够打开柜子的后门。其实每一组柜子都有一个大后门,只是服务生是
不会当着你面打开它的。他们会问你都有什么东西,在哪个柜子里。你只要如实描
述,一般都会把东西还给你的。这种情况跟普通用户在使用Linux的过程中忘记了自
己的密码有些类似。只要向root用户申请,就能够变更新的密码。
Linux的用户管理跟这个例子基本上就是差不多的,只是粒度更加细腻一些。如
果你能够理解这个澡堂子模型,那么接下来的内容就很容易理解了,只是它们看起
来更加专业一点罢了。
2.2.2 理解用户角色
由于Linux是一个地道的多用户操作系统,所以对于能在Linux系统中添加n多
的用户一点都不必感到奇怪。至于能添加多少,答案是232-1个。只要你硬盘足够
大,你真想将这么多人名填进你的电脑也没人反对,前提是你真有那么大的耐心并
且还能搞到名册。如果你的朋友或同事想使用你的计算机,而你又不想让他们在不
经意间窥探到你的小秘密,很方便,键盘敲敲打打就能添加一个新用户给他。随便
他折腾,你几乎不用担心有“艳照门”发生在你身上。
当然,对用户这个概念的理解还不能仅限于字面含义。在Linux系统中还有一些
用户是用来完成特定任务的,比如nobody、admin、ftp等。需要注意,在Linux中不管用户名有多么NB,只要不是root,它就一定是普通用户,权利大小都是相同
的。很多资料上说的所谓用户角色的那些概念,尤其是说角色不同权限不同的观点
不是十分精准,很容易造成Linux用户有权限大小的印象。其实所谓的权限,则是不
同的用户所能访问的文件不同而产生的一种假象。而这种假象又不是单独一个用户
的概念能够决定的,还要用到用户组的概念。
什么是用户组呢?可以把它理解为用户的职业。澡堂子里除了客人之外,还有
搓澡的、推背的、揉脚的、烧水的、扫地的……等好多的职业。客人也有职业,但是
没人会问,也没人敢问,所以干脆就都叫客人了。Linux中也是这种情况,比如
nobody、admin、ftp也会有相应的职业,也就是用户组。只是比较巧合的是用户名
和组名相同了。一个人是可以身兼多职的,这个特点放在Linux用户身上也是允许
的,即一个用户可以属于多个用户组。而且还要注意,一个用户至少应该属于一个
用户组。
由于用户组能够在更高的层面来抽象用户所能够访问文件的数量,所以结合不
同的用户组,就能够给每个用户构建出独一无二的文件访问列表,而且不同的用户
之间还能做到交错纵横,有条不紊。在用户之间的协作上和隐私的保护上达到了一
个良好的平衡。这才是用户角色存在的真实目的所在。
虽然用户角色不能跟权限靠上关系,但不同的角色有些时候还是有待遇差别
的。所谓的待遇就是是否拥有密码、home目录以及shell(后面的章节会详细介
绍)这些资源。有些用户的主要任务就是运行某些服务程序以确保安全性的,比如
nobody用户就可以用于Nginx 的工作进程。对于这类的用户一般是不分配密码和
shell 的,甚至home目录也没有。为什么这样做呢?
Nginx是一个高性能的HTTP和反向代理服务器,也是一个IMAPPOP3SMTP代理服务器。它以极强的稳定
性、丰富的功能集、极低的系统资源消耗、灵活多变的配置文件而闻名。
严格说还是分配shell了的,只是分配的是sbinnologin这个特殊的shell,从其命名上看就是阻止你
登录,实际上就是没有任何功能的shell(也可能显示几行声明文字)。
首先,可能会有很多服务程序默认使用这个用户,如果设置了密码,程序就无
法自动使用了;其次,因为不会有人使用这个用户登录系统,也就没有必要分配一
个shell给它,私密的home目录也有些多余。
不设置shell和home目录好理解,但是不设置密码不会引发安全问题吗?答案
1
2
1
2是否定的。
首先,我们一开始就强调,除了root之外,其他用户的权限都一样且非常小;
其次,不同的用户所能访问到的文件是有限制的,而且再加上用户组的限制,这类
用户能够访问的文件进一步受限(具体的内容我们后面在文件管理部分会有更详细
的介绍)。所以,即便不提供密码,使用这类用户登录了系统,也不会对系统的安
全造成严重的威胁。
前面列举的nobody、admin、ftp等都是比较常见的。还有一些差不多这样的用
户或组根本就不是拿来用的,完全是用来占坑的,主要目的是为了兼容。你的系统
中拥有哪些用户和组可以通过查看etcpasswd和etcgroup文件看到,你会发现
真正在用的没几个。
2.2.3 etcpasswd文件查看用户
从这个文件名上看,应该是跟密码有关。的确是这样,只是那已经成为历史
了。现在保存密码的文件是etcshadow,也就是传说中的影子文件,在后面我们
还要详细介绍它。现在我们只需要关心etcpasswd文件,它是用来存放用户基本
信息的。这个文件的部分内容如下:
root:x:0:0:root:root:binbash
bin:x:1:1:bin:bin:sbinnologin
daemon:x:2:2:daemon:sbin:sbinnologin
adm:x:3:4:adm:varadm:sbinnologin
lp:x:4:7:lp:varspoollpd:sbinnologin
sync:x:5:0:sync:sbin:binsync
shutdown:x:6:0:shutdown:sbin:sbinshutdown
halt:x:7:0:halt:sbin:sbinhalt
mail:x:8:12:mail:varspoolmail:sbinnologin
uucp:x:10:14:uucp:varspooluucp:sbinnologin
operator:x:11:0:operator:root:sbinnologin
games:x:12:100:games:usrgames:sbinnologin
gopher:x:13:30:gopher:vargopher:sbinnologin
ftp:x:14:50:FTP User:varftp:sbinnologin
nobody:x:99:99:Nobody::sbinnologin……
pulse:x:497:494:PulseAudio System Daemon:varrunpulse:sbinnologin
gdm:x:42:42::varlibgdm:sbinnologinsshd:x:74:74:Privilege-separated SSH:varemptysshd:sbinnologin
tcpdump:x:72:72:::sbinnologin
jagen:x:500:500:jagen Zhao:homejagen:binbash
文件的每一个行都代表一个用户。换句话说,这个文件有几行你的系统中就拥
有几个用户。每一行由冒号“:”分割成7个字段,其结构如下所示:
用户名:密码:UID:GID:用户全名:home目录:shell
前面所述的那些用户的“待遇”已经全都包含了。比较搞笑的是“密码”字
段,虽然是这么叫的,但是真的没有密码放在这里,有的只是一个字母“x”。
这个文件中比较重要的是UID(User ID)和GID(Group ID),无论是用户还
是用户组,Linux只靠它们来识别。没有人敢说电脑是不识数的,其实它是只认数不
认人的,所以UID和GID都只是一个数字。为了区别不同的用户或用户组,需要保持
它们自身在系统中的唯一性。UID和GID是可以相同的,因为它们代表的是不同的概
念。都为0的UID和GID是Linux系统中比较特殊的,它们分配给root用户和root用
户组。UID和GID是可以通过程序获取的,所以可以通过这个特殊的值来判断是否能
够胡作非为。
虽然系统只区别0和非零的UID或GID,但是在使用习惯上还是进行了一些分段
的。0自然不用说,就是给root的;1~499是属于系统用户的,比如前面提到的那
些待遇比较差的和一些甚至是占坑的就属于这类;500~4294967295是分配给普通
用户的。所以你会发现,你系统中第一个被添加的用户的UID和GID都是500。
2.2.4 etcgroup文件查看组
跟用户组有关的文件就是etcgroup文件了,也就是etcpasswd中GID的来
源。这个文件的部分内容如下所示:
root:x:0:root
bin:x:1:root,bin,daemon
daemon:x:2:root,bin,daemon
sys:x:3:root,bin,adm
adm:x:4:root,adm,daemon
tty:x:5:disk:x:6:root
lp:x:7:daemon,lp
mem:x:8:
kmem:x:9:
wheel:x:10:root
mail:x:12:mail,postfix
uucp:x:14:uucp
man:x:15:
games:x:20:
gopher:x:30:……
fuse:x:490:
gdm:x:42:
sshd:x:74:
tcpdump:x:72:
slocate:x:21:
jagen:x:500:
与etcpasswd类似,同样是每行代表一个用户组,只是这个文件比较简单,被冒号“:”分割成了四个字段。行结构如下所示:
组名:用户组密码:GID:用户组内的用户名
从etcgroup文件的结构可以看出,不但用户有密码,用户组也是有密码的。
那么用户组密码是做什么用的呢?是给用户组管理员用的。不过目前很少有这个机
会要配置用户组管理员,所以本书也不会介绍这方面的内容。与etcpasswd一
样,组密码是存储在etcgshadow文件中。那么这个字段也就是纯粹的“歪
歪”了,它永远都是“x”。
比较怪异的是“用户组内的用户名”这个字段,因为从上述文件中会发现,有
很多组是没有使用这个字段的。而使用这个字段的,则会使用逗号“,”来分割每个
用户名。那么这个字段到底是什么含义呢?前面我们就说过,一个用户是可以身兼
数职的(多个用户组)。那么,只要用户兼职了这个用户组,它的名字就会出现在
这个字段里。那么那些没有使用这个字段的组呢?很显然,就是没有人兼职呗。但
是没有人兼职,并不代表没有人专职。在etcpasswd文件中,某个用户的GID字段
所代表的就是专职用户组。按照Linux中的术语,这叫“初始用户组”;那些兼职的
用户组,就被叫做“支持用户组”。对于专职的用户来讲,是可以不出现在“用户组内的用户名”的这个字段的。使用groups命令可以查看所有的“支持用户组”,而且在“支持用户组”的列表中第一个出现的那个组还有一个称呼,叫“有效用户
组”。至于什么是“有效用户组”,我们将在后面的有关文件和目录的部分再继续
介绍。
2.2.5 管理用户和组
在澡堂子里,服务员很重要的一项工作就给顾客提供服务,而在Linux中,root用户很重要的一个工作就是管理用户和组。所以在很多时候搓澡的和管系统的
是“同行”。
Linux系统为用户和组的增、删、改提供了一些基本的命令。这些命令的作用机
制就是对etcpasswd和etcgroup这两个文件进行增、删、改来完成的。外加一
个etcshadow文件专门用来管理密码。
Linux中添加一个新的用户,可以使用adduser或useradd命令。在一个系统中
拥有两个长得很像且功能类似但又有少许不同的命令时,肯定会是十分很蛋疼的一
件事,因为你会经常把它们弄混。如果你认同这一点,那么adduser和useradd这两
个命令就不仅是蛋疼了,还有点菊花痒痒。为什么呢?因为它们在不同的发行版下
还有差别。比如,在Ubuntu中adduser是一个脚本,而useradd是一个二进制程
序,前者对后者进行了封装,更加智能。但是在CentOS中adduser和useradd完全
相同,前者只是一个符号连接(后面会讲述符号连接的概念)罢了。本来adduser
和useradd长得就很像,在不同的发行版中还有那么微小的差别,这是多么坑爹的
设计啊!幸好这两个命令不是很常用而且也足够简单,还不至于太坑。
useradd在任何Linux发行版都是一样的,所以我们最好牢记的是它,这样我们
使用的经验累积起来会相对容易一些,本书也以它为例。那么,添加一个新用户最
简单的方法,可以用这样的命令(注意,需要root权限):
useradd jagen
这样名为jagen的用户就添加到系统中了。可能你会问,就这么简单吗?就这么
简单。因为系统已经帮我们设定好了很多的默认值了。这包括:创建一个唯一的UID;添加一个与用户名相同的用户组和一个唯一的GID,并将用户设置为该组;
在home目录下创建一个与用户同名的目录;设置shell为binbash。唯一还没有
设置的就是密码了,使用passwd命令可以做到这一点。
当你在命令行下输入passwd命令之后,系统马上就会提示你输入当前的密码。
只有录入了正确的密码之后,才能进行到下一步。这个过程是看不到有回显的,也
就是说你在录入密码的时候光标是不会有任何反映的,不会有类似图形界面
的“”什么的出现。在文本状态下,所有有关密码的操作都是这样,包括使用文本
界面登录的时候。虽然这种方式不允许我们在输入密码时被打断,但是安全性更
好。
当输入正确的密码之后,就会立即提示输入新的密码,然后还要求再次确认一
遍。只有两次输入的密码一致,新的密码才能被接受。那么下次在使用这个用户登
录的时候,就应该使用新的密码了。
刚才的操作只是能够修改自己的密码,如果是root用户,按照我们的澡堂子模
型,是可以给其他用户修改密码的。只要给passwd命令传递要修改的用户名即可,而且是不需要提示输入当前密码的,直接就能录入新的密码。录入新密码的过程也
需要两次,这是为了保证录入正确性的。如果你不是root用户,也可以尝试这种操
作,得到的结果就是被系统拒绝。你虽然可以挑战Linux的底线,但是Linux绝对不
会给你挑战成功的机会。更复杂的,比如修改密码的时效性等更高级的内容,还有
chage命令。
正所谓“人有失手,马有乱蹄”,人要是不犯错误他她就不是人。所以,很难
保证root在添加新用户的时候不犯点错误,比如名字给弄错了。这个时候能有修正
错误的方法将会是很可爱的事情。正好usermod命令就能干这事儿。实际上usermod
并不是为了弥补错误而提供的,因为修正用户的某些细微的配置参数实际上是更为
常见的操作,比如希望使用一个与众不同的shell。
要删除某个用户,可以使用userdel命令。这个命令相当的简单,希望删掉谁
就把谁的用户名写在它后面就行。如果你是root,userdel命令基本上就是你的判
官笔了,“写谁”谁就消失了。此外,它还有一个“-r”命令选项,把用户的home
目录一同删掉。所以这个命令不但会“杀人”,还会“抄家”。root一定要慎用。
为了避免不必要的误伤,也是不要随便使用root用户的理由之一。至于用户组的管理实际上是跟用户很像的,也拥有差不多相同的命令,差别就
是将“user”这个前缀换成“group”,即groupadd、groupmod和groupdel。此
外还有一个用于管理用户组密码的gpasswd,只是它相当的不常用。
如果你对前面介绍的这些命令还有什么疑问,那就千万不要忘记我们在第1章
中介绍的那个“男人”(man),它能够帮助你了解到全部。后面的内容中所出现的
命令我们也不会太多地去讲述具体用法,我们希望你能养成一个好习惯。
2.2.6 夺面双雄——利用sudo假借身份
尼古拉斯·凯奇是我十分喜爱的一位演员。他主演过一部非常著名的电影《夺面
双雄》。影片讲述了FBI高级探员为了得到杀害自己儿子的凶手口中的重大机密,不
惜和凶手做换脸手术,一切尽在计划中却不料发生了意外,当探员变成魔鬼,而凶
手变成天使的时候,以二者遭遇的特殊身份展开的故事。
Linux的用户在执行某些操作的时候,就需要做个“换脸手术”。只是这个过程
不大会出现什么意外,也不可能有电影情节的那般惊心动魄,更不可能出现什么天
使与魔鬼的转变。但是借用一下身份的事情还是要发生的。借用谁的身份呢?答案
是root的,也就是以root身份来执行某些操作。
很早我们就说过,Linux的用户除了root就是普通用户,而且普通用户的权限
非常低,就连向系统中安装软件的权利都没有。很多时候系统管理员为了能让普通
用户具备一点root的特权,省得用户经常来麻烦他们,就可能赋给用户被称为sudo
的特权。
比如etcshadow文件,由于其特殊性,普通用户是不被允许查看其内容的。
但是拥有sudo特权的用户,可以执行以下命令,查看到这个文件的内容:
sudo cat etcshadow
普通用户一旦拥有sudo的特权,几乎就可以胡作非为了,但是需要付出一点代
价。是什么样的代价呢?也不是很大的代价,就是需要在将要执行的命令前冠上
sudo这个前缀(别忘了空格分割),同时被系统提示要求输入密码。这其实对于我
们大多数用户来说,是不算什么麻烦的。可是对某些不怀好意的一小撮人来说,这个小麻烦或许就会让他们一事无成或彻底打消念头。比如某些流氓软件,想悄悄地
进入你的系统,只要你不使用root用户,它就几乎没有办法,即便你拥有sudo特
权,难道系统莫名其妙地让你输入密码你就不会产生怀疑吗?
但是,你现在可能不能立即验证这个功能,因为你现在所使用的这个用户(非
root)未必具备sudo特权。对于桌面版的Linux发行版,比如Ubuntu、Fedora等,它们的设计理念是个人日常应用,比较偏向赋予普通用户相对较为宽泛的权利,所
以在系统的配置中,会有一类基于普通用户的管理员角色,这类角色的用户会被赋
予sudo特权。所以,如果你选择的是这类发行版,那你在系统安装阶段所添加的用
户,基本都是具备sudo权限的。而对于本书所推荐的CentOS这类企业级发行版,它
们的设计理念是企业应用,强调安全可靠,所以在系统的配置中,除非root用户指
定,否则不会有用户具备sudo特权。
虽然使用sudo之后就可以查看到etcshadow文件里面的内容了。但是你不要
打歪主意,密码是不会明文保存的:)
既然选择了CentOS的人现在无法验证刚才的命令,那么利用root用户让某个普
通用户具备sudo特权,不就可以验证了吗?那我们就开始吧。
给某个用户赋予sudo特权,实际上就是更改etcsudoers文件中的内容。这个
文件比较重要的内容如下所示:……
Allow root to run any commands anywhere
root ALL=(ALL) ALL……
Allows people in group wheel to run all commands
%wheel ALL=(ALL) ALL
Same thing without a password
%wheel ALL=(ALL) NOPASSWD: ALL
Allows members of the users group to mount and unmount the
cdrom as root
%users ALL=sbinmount mntcdrom, sbinumount mntcdrom……
在这个文件中,所有以“”开头的行都是注释内容。所以这个文件里的内容绝大多数都是废话,因为只有一行没有以“”开头。那一行的内容就是:
root ALL=(ALL) ALL
它的含义是说root用户可以使用sudo特权以root权限执行任何命令。显然又是
一句废话,root用户有必要运用它的sudo特权吗?但是学着它的样子,自己添加一
行,比如:
jagen ALL=(ALL) ALL
那么jagen用户就可以使用sudo特权以root权限执行任何命令了。
如果需要赋予sudo特权的用户只有少数那么几个,这样单独授权的方式没有什
么问题。但是Linux还支持另外一种授权方法,那就是下面这行:
%wheel ALL=(ALL) ALL
这一行的作用是让wheel用户组的所有用户默认拥有sudo特权。那么当需要给
某个用户授权时,只要将他她加入到wheel用户组即可。这样就省去了频繁修
改etcsudoer文件的麻烦了,管理起来更加方便。默认情况下,这行是被注释掉
的,如果希望开启这个功能,那么就去掉前面“”吧。
sudo还有另外一个更为霸气的功能,就是在下面这一行中:
%wheel ALL=(ALL) NOPASSWD: ALL
同样是给wheel用户组授权,但是关键的是这个NOPASSWD,可以使得不需要输
入密码即可拥有root权限。这个NOPASSWD并不仅仅作用于用户组,对于我们前面所
说的针对单个用户授权的方法也是有效的。我总感觉这个功能有点危险,所以我是
不建议使用的,元芳,你怎么看?
上面所介绍的这些修改,会让拥有sudo特权的用户能够以root权限执行任何命令,很多时候会觉得这个权限给得太过宽松,显然会威胁到管理员的地位。所以做
必要的限制还是合理的。下面的代码能够满足这一需求:
%users ALL=sbinmount mntcdrom, sbinumount mntcdrom
这一行主要描述了users用户组,可以执行:
sudo mount mntcdrom
sudo unmount mntcdrom
这两个命令,其他的都将被Linux系统拒绝。需要注意,这里一定要写明命令的
完全路径,两个命令之间使用逗号“,”分割。显然一个命令一个命令地写是非常
麻烦的,只允许执行这几个命令也是有悖赋予sudo特权的初衷的。但是别着急,sudo还有另外一种写法,可以是这样:
%users ALL=(ALL) ALL,!usrsbinadduser,!usrsbinuseradd
这一行使得users用户组无法使用sudo特权给系统添加新的用户。关键就是在
叹号“!”这里,它表示禁止使用某些命令。
有关sudo的另外一个比较重要的问题是时间间隔问题。在使用的过程中你会发
现,第一次使用sudo,需要输入密码,但是在短时间内再次使用sudo时,则不被要
求输入密码了。这是sudo的一种人性化设置,因为已经验明正身了就没有必要再去
验证。可是不能总是不让你输入密码。因为当你离开电脑,有人趁此时机可能就会
做一些什么“破坏”,那么所有的坏事可就都落在你的头上了。所以sudo会判断两
次操作的间隔,如果间隔时间在5分钟内,就不提示输入密码,超过了,则需要重新
验证。以便降低你的sudo特权被别人乱用的嫌疑。
即便是作为Linux系统的管理员,也是不推荐长期使用root的,所以大部分的
工作是使用普通用户操作的。根据前面的讲述可以简单地推测,管理员也可以通过
普通用户利用sudo特权来管理整个系统。但是使用sudo特权,必须在每个命令前冠
以sudo,这会给管理员的很多工作造成不必要的麻烦。su命令可以解决这个问题。su命令就是做临时用户切换的,默认是切换到root用户。su在做用户切换的时
候也会提示输入密码,但是与sudo需要输入自己的密码不同,su要求输入目标用户
密码,如果是切换到root,那么要求的是root密码。一旦切换完成,就会将当前的
用户转换成目标用户。如果希望再切换回原始用户,可以使用exit命令。
如果不给su命令任何参数,它切换的用户是root用户,同时不会更改当前所在
的目录。比如说你当前所在的目录是homejagen,那么执行完su后,依然是在这
个目录。当给su命令传递一个“-”参数时,即执行“su -”,则会改变当前目录
到目标用户的home目录,也就是root目录下。
如果使用su命令成功切换到root用户下,那么就可以在不知道密码的情况下,切换到任意用户,比如执行“su jagen -”,就会立即切换到jagen用户下,同时
当前目录变更为homejagen。如果要退回root,执行exit。继续退回到原始用
户,继续执行exit。
由此可见,使用su命令,管理员可以任意切换成任何用户,这给管理员在管理
上面带来了很大的方便。当然,普通用户的所谓隐私,在管理员面前就是完全公开
的了。
顺便说一下,拥有sudo特权的用户,是可以通过执行:
sudo su -
命令,直接使用自己的密码切换成root用户的。原理就是root用户使用su命令
切换到任何用户都不提示密码。这显然是不安全的。为了避免这种问题的发生,应
该在etcsudoers文件中明确禁止su被sudo特权执行。
2.2.7 我是谁?
我是谁?英文即who am I?学过哲学的人立即会想到这是一个十分著名的哲学
问题,但是我相信大多数人想到的是成龙的一部电影,因为百度也是这么想的。当
你看完这本书之后,你还应该知道,这是Linux的命令。
我们需要先做一些准备,请以普通用户登录系统,比如我是jagen。然后执行命
令: whoami
jagen
who am i
jagen pts0 2012-12-12 00:02 (:0.0)
who
jagen tty1 2012-12-12 00:02 (:0)
jagen pts0 2012-12-12 00:02 (:0.0)
接着我们使用su命令切换到root用户下再试一下:
whoami
root
who am i
jagen pts0 2012-12-12 00:02 (:0.0)
who
jagen tty1 2012-12-12 00:02 (:0)
jagen pts0 2012-12-12 00:02 (:0.0)
看出区别来了吗?whoami这个命令的结果是不同的,但是who am i和who这两
个指令却有相同的结果(不知各位怎么样,反正我的脑袋快炸了)。也就是说我们
执行的换脸大法,能骗得过whoami,但是骗不过who am i和who。要解释这背后的
运行机制,需要引入另外两个新的概念——实际用户(UID)和有效用户(EUID,即Effective UID)。
所谓的实际用户是指用户登录时所使用的用户,所以在整个登录会话中,实际
用户是不会发生变化的;而有效用户则是指当前执行操作的用户,这个是能够利用
su或sudo命令进行任意切换的,也就是真正决定权限高低的用户。一般情况下,实
际用户和有效用户是相同的,只有发生用户身份切换的时候,才会出现差异。
既然有实际用户和有效用户的差别,也就会有实际用户组和有效用户组的差
别,毕竟用户和用户之间所属的组有差异是一件十分正常的事情。但是,实际用户
组和有效用户组产生差异并不一定是因为切换用户而导致的,具体触发条件后面再
做介绍。而且实际用户和有效用户出现差别,切换用户并不是唯一的触发机制。其
他的触发机制我们同样会放到后面的内容,因为那时会更容易理解。
那么我们现在再回到“我是谁”这个问题上,为什么要问这个问题?对那些经常需要切换用户的系统管理员来说,搞清楚当前使用的是什么身份的用户是一件不
太容易的事情,毕竟切来切去的换做谁都有可能凌乱;对于某些shell脚本,或许需
要特别的用户才能执行,那么就需要利用whoami这个命令来搞清楚执行它的用户是
谁;还有一些shell脚本可能不太喜欢被人“欺骗”,一定要某个特别用户才能执
行,即便是使用su切换的都不行,那么就需要利用who am i这个命令来确认了。总
之,我是谁,从哪里来,一定得搞清楚。2.3 文件和它与权限的关系
千万不要以为前面所介绍的就是“多用户”的全部因素,毕竟在“澡堂子模
型”中,那些只是人的因素。还有一个十分重要的一项,物的因素还没有出现,也
就是那些柜子跟锁。要是一定得与Linux中具体的事务相对应的话,那就是文件和目
录了。目录和文件在为“多用户”系统中能够形成多个用户和平共处的局面立下了
汗马功劳,同时也为其奠定了坚实的基础。接下来我们就看看它们是怎么回事儿
吧。
2.3.1 目录与文件
Linux的目录与文件组织方式与Windows是有很大不同的。Windows会将不同的
磁盘分区划分为C、D、E、F……等盘,但是在Linux下你找不到。难道Linux不支持
磁盘分区吗?不是,它支持。只是磁盘的管理方式不一样,我们后面会详细讲解
Linux的磁盘管理方式,现在我们要知道的是,Linux的文件组织方式是从“”开
始的一棵树,所以“”也被称为根目录。这与在Windows中将磁盘分成一个区很
像,只是Windows的文件是从“C:\”开始的。
至于什么是目录,什么是文件,这些基本概念我们就不必多说了,相信能够懂
得去学习Linux的人是不会不清楚的。在Linux中查看文件和目录的命令是ls,它会
列出当前目录下的所有目录和文件。但是对于第一次使用Linux命令行的用户,可能
真的会搞不清楚哪个是文件,哪个是目录。因为在Windows命令行下也会遇到类似
这样的困扰。究其原因是很难通过名字看出来目录和文件的区别。虽然从名字上看
不出区别,但是从别的地方能看出来也行,比如在Windows下带有“”标记的
行或使用中括号“[ ]”括起来的名称就是目录,其他的则是文件。Linux的方法要
比Windows更高明一些,用颜色区分。一般地,蓝色代表目录,其他颜色代表文
件。其实就通用性来讲,Windows的方法更通用,因为Linux使用颜色来区分,就要
求显示设备必须支持颜色才行。当然,以现代的科技来争论这种通用性是无意义
的,我们很难想像,居然有的显示器不能显示颜色。
其实Linux不仅仅使用颜色来区分文件与目录,还用于区分不同种类的文件。比
如绿色代表可执行文件、青色代表符号连接等。但是这些颜色所代表的文件类型并不一定是这样,具体的还要取决于配置文件etcDIR_COLORS的规定。若想了解如
何修改不同文件类型所对应的颜色,可以请求Linux的那个“男人”来帮忙,具体命
令是:
man dir_colors
通过这个例子可以看出,Linux的联机帮助不仅仅可以查看具体某个命令的使用
方法,还能够查看某个配置文件的配置方法。所以在使用Linux的过程中,一旦遇到
困难,要时刻想到那个能够帮助你的“男人”。
前面说过,Linux使用颜色区分文件类型的方法是有些不太通用的,所以有些极
端的发行版默认就不会提供这种支持,使得很难区分文件和目录。对于这样的系统
则需要给ls命令附加“--color=auto”选项来让它使用颜色来区分文件类型。但是
每次都要附加一个这样复杂的选项,显然会让人不爽。要想像大多数发行版那样,直接ls命令就能够有颜色,可以使用alias命令来创建一个命令别名。具体的命令
如下:
alias ls='ls --color=auto'
这样,执行ls命令,就等同于执行ls --color=auto命令。为了使这个设置永
远都生效,可以将它添加到etcbashrc或home.bashrc文件中。前者
对所有用户有效,而后者仅对用户有效。其实那些默认提供颜色功能的
Linux发行版,也是通过这个方式开启的功能。
注意,上述方法仅对Linux有效,如果期望将上述知识移植到FreeBSD这样的老
牌Unix系统也是可行的,只是ls开启颜色功能的命令选项是“-G”,配置颜色的将
不再是配置文件,而是LSCOLORS环境变量 。如果你无法确定,一定要记得使用
man,其他的知识点基本等效。
有关环境变量的内容我们将在后面的章节做介绍。
对于其他一些操作文件和目录的命令,在第1章中就已经有了一些介绍,它们具
体的执行行为本书就不做过多的介绍了,自己亲自实验一下,要比我码再多的文字
3
3都更加有说服力。我懒得写,你懒得看,皆大欢喜!
其实,使用颜色来区分文件类型,有些时候还是比较初级的。而且万一碰到小
概率事件,显示终端偏偏不能显示颜色,那且不是要一筹莫展?没关系,接下来我
们将要动用真家伙了,搞定了这个,你就完全可以出去跟别人神吹一阵了,这也正
是这本书能够诞生的目的之一^_^。
2.3.2 文件属性和权限
这个真家伙就是文件的属性和权限。这里还需要继续“澡堂子模型”,因为文
件的属性和权限与用户身份一起,共同完成了Linux系统的多用户权限控制。
如果要是细究Linux多用户权限控制的本质,实际上就是让不同的用户能够访问
的文件不同罢了。由于root可以访问任何文件,所以就拥有了至高无上的权利。那
么凭什么规定一个用户能访问哪些文件,而又不能访问哪些文件呢?答案是文件自
己说了算!
既然是文件说了算,那么我们就看看文件是怎么做到的。在Linux系统中,每个
文件都会有一个特定的拥有者(一般是创建它的用户)和所属用户组,这是属于它
的固有属性。文件可以利用这两个固有属性来规定它的拥有者或者其所属用户组内
的用户是否拥有对它的访问权利,即读、写和执行的权利。此外,为了提高适应
性,文件还规定了其他不相关人等,也就是第三个固有属性,对它的读、写和执行
的权利。这三个固有属性和三个权利合起来,就构成了文件的针对系统中所有用户
的访问控制,也就形成了Linux的“澡堂子模型”。
其实如果仔细分析,Linux的这种访问控制特性,能够形成“澡堂子模型”也只
是一种特例罢了。因为只要规定了文件针对用户的读、写和执行权利,可以构建任
何模型。但是最终能够形成这个模型却并不是巧合,而是经过精心设计和经历过历
史考验的,这是一种成功的模型,可以继往开来的模型。当然,或许你有一天能够
设计出比现有“澡堂子”更好的模型。有点扯远了,我们还是回过头来继续看看从
什么地方能查看文件的属性和权限来得实际一些。
使用ls命令的-l选项就能查看,如下所示:……-rwxr-xr-x. 1 root root 27776 Apr 17 2012 arch
lrwxrwxrwx. 1 root root 4 Oct 21 00:19 awk -> gawk
-rwxr ......
作者:[中] 赵鑫磊 [加] Jie Zhang(张洁)
ISBN:978-7-115-35936-0
本书由北京图灵文化发展有限公司发行数字版。版权所有,侵权必究。
您购买的图灵电子书仅供您个人使用,未经授权,不得以任何方式复制和传播
本书内容。
我们愿意相信读者具有这样的良知和觉悟,与我们共同保护知识产权。
如果购买者有侵权行为,我们可能对该用户实施包括但不限于关闭该帐号等维
权措施,并可能追究法律责任。
图灵社区会员 ptpress(libowen@ptpress.com.cn) 专享 尊重版权
序一
序二
前言
致谢
联系方式
第一部分 基础篇
第 1 章 第一次亲密接触
1.1 让Linux入驻我们的电脑
1.1.1 我们用Linux的理由
1.1.2 选择哪个发行版
1.1.3 安装系统
1.1.4 登录系统
1.2 不一样的图形操作
1.2.1 没有图形的图形
1.2.2 架构设计
1.3 主流桌面环境
1.3.1 KDE初学者的首选
1.3.2 GNOME不可磨灭的经典
1.3.3 XFCE——轻量、简单、高效1.3.4 LXDE——更轻,同样精悍
1.4 返璞归真的命令行
1.4.1 开始执行命令
1.4.2 文本和图形的切换
1.4.3 基础命令的操作
1.4.4 快捷键
1.4.5 错误信息
1.4.6 联机帮助——man很靠谱
1.4.7 致命的Linux命令
1.5 结束语
第 2 章 融于心而表于行
2.1 多用户多任务分时操作系统
2.2 用户的身份
2.2.1 澡堂子模型
2.2.2 理解用户角色
2.2.3 etcpasswd文件查看用户
2.2.4 etcgroup文件查看组
2.2.5 管理用户和组
2.2.6 夺面双雄——利用sudo假借身份2.2.7 我是谁?
2.3 文件和它与权限的关系
2.3.1 目录与文件
2.3.2 文件属性和权限
2.3.3 文件连接到底是什么
2.3.4 修改文件的属性和权限
2.3.5 深入文件权限
2.3.6 文件的基本操作
2.3.7 搜索文件
2.3.8 对文件打包压缩
2.4 程序的执行问题
2.4.1 执行程序的方法,以及多任务协调机制
2.4.2 计划任务
2.4.3 守护进程及其作用
2.4.4 全面了解程序信息
2.5 软件的安装方式
2.5.1 从源代码安装软件
2.5.2 利用软件管理工具rpm和dpkg
2.5.3 更酷的线上升级2.6 磁盘的管理方式
2.6.1 Linux的文件系统——甩Windows几条街
2.6.2 磁盘的基本操作
2.6.3 etcfstab文件——决定分区的连接
2.6.4 弹性调整容量——逻辑卷
2.7 解决上网问题
2.7.1 了解IP地址
2.7.2 相关配置文件
2.7.3 安装网卡
2.7.4 手工设定IP地址
2.7.5 自动获取IP地址
2.7.6 固定IP上网方式
2.7.7 ADSL拨号上网方式
2.8 不能割舍的shell
2.8.1 勤勤恳恳的bash
2.8.2 环境变量
2.8.3 bash的配置文件
2.9 文本处理
2.9.1 查看文本内容2.9.2 正则表达式
2.9.3 搜索文本的grep
2.9.4 排序和去重
2.9.5 文件对比命令——diff
2.10 结束语
第 3 章 一棵“树”的奥秘
3.1 Linux的文件组织结构
3.2 基本组织原则
3.3 根文件系统
3.3.1 原则与特性
3.3.2 必备的内容
3.3.3 可选的内容
3.4 子目录
3.4.1 bin目录——shell命令
3.4.2 boot目录——启动过程所需内容
3.4.3 dev目录——设备文件
3.4.4 etc目录——配置文件
3.4.5 home目录——用户专有
3.4.6 lib目录——共享库和内核模块3.4.7 media目录——可移动设备
3.4.8 mnt目录——临时挂接
3.4.9 opt目录——附加软件包
3.4.10 root目录——root专有
3.4.11 sbin目录——必备的系统软件
3.4.12 srv目录——服务进程所需数据
3.4.13 tmp目录——临时文件
3.5 usr目录组织结构
3.5.1 usrbin目录
3.5.2 usrinclude目录
3.5.3 usrlib目录
3.5.4 usrlocal目录
3.5.5 usrsbin目录
3.5.6 usrshare目录
3.5.7 usrshareman目录
3.5.8 usrsharemisc目录
3.6 var目录组织结构
3.6.1 varaccount目录
3.6.2 varcache目录3.6.3 varlib目录
3.6.4 varlock目录
3.6.5 varlog目录
3.6.6 varmail目录
3.6.7 varopt目录
3.6.8 varrun目录
3.6.9 varspool目录
3.6.10 vartmp目录
3.7 结束语
第 4 章 “笨”出来的文化和哲学
4.1 Unix的文化和哲学
4.2 “四大笨”之一:万般皆文本
4.2.1 二进制的烦恼
4.2.2 文本的快乐
4.2.3 文本之于配置文件
4.2.4 文本之于程序组合
4.2.5 文本之于通信协议
4.2.6 硬件也文本
4.3 “四大笨”之二:四处用脚本4.3.1 富饶的脚本语言
4.3.2 为什么不是C
4.3.3 脚本的不足和混合编程
4.3.4 强力胶水
4.3.5 极端的例子
4.3.6 软件的适度规模
4.4 “四大笨”之三:规律无处寻
4.4.1 机制与策略
4.4.2 接口与引擎
4.4.3 不用重新造轮子
4.4.4 内在的支持
4.4.5 沉默是金,吝啬是银
4.5 “四大笨”之四:配置乱生根
4.5.1 什么是不可配的
4.5.2 配置三元素
4.5.3 配置文件
4.5.4 环境变量
4.5.5 命令行选项
4.6 什么样的文化4.6.1 “傻x”的精明
4.6.2 “简单”不简单
4.7 这一切的基础大师的阐释
第 5 章 shell脚本编程
5.1 第一个shell脚本程序
5.2 编程的基本要素
5.2.1 变量
5.2.2 运算
5.2.3 流程控制
5.2.4 自定义函数
5.3 输入和输出
5.3.1 基本的输出
5.3.2 命令行参数
5.3.3 使用read读取文本行
5.3.4 文件描述符
5.3.5 格式化输出
5.4 调试跟踪
5.4.1 空变量问题
5.4.2 缺引号问题5.4.3 隔离问题
5.4.4 echo普通中见“伟大”
5.4.5 “-x”跟踪问题本领高
5.4.6 assert函数
5.4.7 caller命令
5.4.8 trap命令
5.5 高级特性
5.5.1 波浪号“~”
5.5.2 通配符
5.5.3 元字符
5.5.4 转义符
5.5.5 命令替换
5.5.6 运算优先级
5.5.7 文件包含
5.5.8 eval语句
5.5.9 内建命令
5.6 shell脚本编程实战
5.6.1 守护进程的启动脚本
5.6.2 读取数据文件和平滑启动nginx第 6 章 微型语言
6.1 什么是微型语言
6.2 软件管理的RPM
6.2.1 构建你的第一个RPM包
6.2.2 工作原理——分析Spec文件
6.2.3 依赖关系
6.2.4 一个软件多个包
6.2.5 小结
6.3 制作联机帮助文档的Groff
6.3.1 Groff简介
6.3.2 Groff的工作方式
6.3.3 如何制作一份联机帮助文档
6.3.4 导出联机帮助文档
6.3.5 小结
6.4 把文本当数据库的awk
6.4.1 使用方法
6.4.2 基本概念
6.4.3 注释与空白
6.4.4 字符串6.4.5 数值
6.4.6 变量
6.4.7 模式与行为
6.4.8 行为语句
6.4.9 小结
6.5 神奇的计算器dc和bc
6.5.1 历史渊源——最古老的Unix语言dc
6.5.2 dc简介
6.5.3 更为常用的bc
6.5.4 小结
6.6 不为人知的m4
6.6.1 m4的历史
6.6.2 m4的特性
6.6.3 从Hello World开始
6.6.4 工作方式
6.6.5 小结
6.7 结束语
第 7 章 编辑器的纷争
7.1 独步青云的vi7.1.1 我为vi狂
7.1.2 vi的使用
7.1.3 vi的高级功能
7.1.4 跟我一起打造一个IDE
7.2 横刀立马的Emacs
7.2.1 Emacs的来历
7.2.2 Emacs的基本使用
7.2.3 使用Emacs必知必会
7.2.4 Lisp语言
7.2.5 处理中文问题
7.2.6 跟我一起打造一个IDE
7.3 结束语
第 8 章 我是Makefile
8.1 GNU make及其基本用法
8.2 基本概念
8.2.1 第一个Makefile例子
8.2.2 目标、条件和命令
8.2.3 依赖
8.2.4 工作方式8.2.5 基本语法
8.3 认识规则
8.3.1 标准规则
8.3.2 隐式规则
8.3.3 变量
8.3.4 自动变量
8.3.5 模式规则
8.3.6 假目标
8.3.7 路径搜索
8.4 高级特性
8.4.1 文件包含
8.4.2 命令
8.4.3 深入变量
8.4.4 宏与函数
8.4.5 条件指令
8.5 Makefile实战
8.5.1 自动产生依赖
8.5.2 递归式的Makefile
8.5.3 自动产生Makefile8.6 结束语
第二部分 进阶篇
第 9 章 特种文件系统
9.1 日志和ReiserFS
9.1.1 理解日志
9.1.2 ReiserFS——卓越的小文件性能与渺茫的未来
9.1.3 应用实战
9.1.4 小结
9.2 进程文件系统procfs
9.2.1 神秘的9号计划
9.2.2 proc目录
9.2.3 procfs实战
9.2.4 小结
9.3 tmpfs——满足你对“时空”的双重渴望
9.3.1 背景
9.3.2 tmpfs文件系统
9.3.3 tmpfs实战
9.4 devfs和sysfs
9.4.1 devfs的由来9.4.2 进入devfs
9.4.3 sysfs的由来
9.4.4 小结
9.5 其他特种文件系统
9.5.1 RelayFS
9.5.2 debugfs
9.6 结束语
第 10 章 生死与共的“兄弟”
10.1 死心眼儿的BIOS
10.2 小肚鸡肠的MBR(主引导记录)
10.2.1 MBR的结构
10.2.2 磁盘分区表
10.2.3 MBR的功能
10.3 和事佬GRUB(牛B的统一引导加载器)
10.3.1 Bootloader
10.3.2 GRUB的功能
10.3.3 GRUB的工作流程
10.4 唇齿相依的内核启动参数
10.4.1 什么是内核启动参数10.4.2 内核启动参数的格式
10.4.3 常用的内核启动参数
10.5 自力更生的Linux内核
10.5.1 内核引导协议
10.5.2 内核为什么要压缩
10.5.3 startup_32
10.5.4 start_kernel
10.5.5 kernel_init
10.6 及时雨initramfs
10.6.1 寻找init的问题
10.6.2 较早的initrd
10.6.3 为什么选择initramfs
10.7 “生”、“死”永相伴的init进程
10.7.1 名不副实
10.7.2 运行级别
10.7.3 进入运行级别之前
10.7.4 进入运行级别
10.7.5 转换运行级别
10.8 幕后英雄们10.8.1 终端
10.8.2 getty系列命令
10.8.3 Display Manager
10.8.4 伪终端
10.8.5 配置文件
10.9 结束语
第 11 章 独霸网络的“蜘蛛神功”
11.1 功夫理论:网络知识
11.2 “蜘蛛神功”第一层:网络工具
11.2.1 马步:ifconfig
11.2.2 掌法:route
11.2.3 腿功:netstat
11.2.4 眼力:DNS二把刀
11.2.5 身法:tcpdump
11.3 “蜘蛛神功”第二层:套接字
11.4 内功心法:TCPIP协议栈初探2
11.4.1 枯树盘根:系统调用
11.4.2 凝神静态:sockfs文件系统
11.4.3 气沉丹田:sk_buff11.5 临战杂谈
11.5.1 对UDP的错误的认识
11.5.2 事半功倍,调节内核参数4
第 12 章 一个网络一个世界
12.1 You've Got a Mail
12.1.1 Email服务模式
12.1.2 架设Postfix服务器
12.1.3 Email故事的结局
12.2 联接世界的Web应用
12.2.1 Web服务器
12.2.2 数据库
12.2.3 解释型语言
12.2.4 架设Web服务器
12.3 铜墙铁壁真功夫——Linux内核集成的IP信息包过滤系统
12.3.1 iptables
12.3.2 netfilter
12.3.3 实践出真知
12.3.4 小盒子的秘密
12.4 分享文件的乐趣12.4.1 NFS
12.4.2 Samba
12.5 在虚拟与现实之间穿梭——实现安全的连接
12.5.1 VPN实现方式
12.5.2 IPSec VPN
12.5.3 SSL VPN
第 13 章 打通任督二脉
13.1 了解网络驱动
13.1.1 网络设备闲谈
13.1.2 ioctl这把刷子
13.1.3 设备驱动的秘密
13.2 无线风光在险峰
13.2.1 WLAN
13.2.2 Bluetooth
13.2.3 NFC——近距无线通信
13.2.4 谜底
13.3 奇迹是执着创造出来的
13.3.1 从2.4到2.6
13.3.2 从2.6到3.0第 14 章 身在江湖
14.1 C2级安全认证
14.2 Linux的安全问题
14.2.1 黑客入侵
14.2.2 “病毒泛滥”
14.2.3 拒绝服务攻击
14.2.4 小结
14.3 PAM用户认证机制
14.3.1 什么是PAM(可拔插认证模块)
14.3.2 PAM的体系结构
14.3.3 配置PAM
14.3.4 密码映射
14.4 应用PAM API
14.4.1 开发概述
14.4.2 PAM事务
14.4.3 事务属性
14.4.4 用户认证
14.4.5 认证凭证
14.4.6 PAM会话14.4.7 用户认证流程
14.4.8 模块开发
14.4.9 密码的保存
14.5 安全增强系统
14.5.1 主动访问控制DAC
14.5.2 强制访问控制MAC
14.5.3 SELinux——Linux的MAC实现
14.6 结束语
第 15 章 七种武器
15.1 长生剑:fork
15.1.1 从线程说起
15.1.2 古老而充满活力的进程
15.1.3 多进程程序开发
15.1.4 进程间通信的实现
15.2 离别钩:VFS
15.2.1 一切都是文件
15.2.2 一棵有生命的“树”
15.2.3 VFS简介
15.2.4 基本数据结构15.2.5 sockfs
15.3 孔雀翎:mmap(内存映射)
15.3.1 理解mmap
15.3.2 虚拟内存技术
15.3.3 应用mmap
15.4 碧玉刀:epoll(增强IO复用)
15.4.1 C10K问题
15.4.2 epoll的优点
15.4.3 epoll的工作模式
15.4.4 正确使用epoll
15.4.5 用epoll解决C100K问题
15.5 多情环:udev
15.5.1 设计理念
15.5.2 基本构成
15.5.3 配置文件
15.5.4 规则
15.6 霸王枪:LVS
15.6.1 负载均衡
15.6.2 一个中国人的勇气15.6.3 LVS的特点
15.6.4 LVS的工作模式
15.6.5 LVS的负载均衡调度算法
15.7 拳头:module
15.7.1 内核中的Web服务
15.7.2 编写你的第一个module
15.7.3 module与普通程序的不同
15.7.4 module与用户通信
15.7.5 内核加载module的原理
15.8 结束语
第 16 章 谁都可以从头再来——从头开始编译一套Linux系统
16.1 初识工具链——准备环境的必备工具
16.1.1 编译器
16.1.2 连接器
16.1.3 程序库
16.1.4 工具链——破解奇特的四角恋
16.2 准备环境
16.2.1 宿主系统环境
16.2.2 生成工具链的binutils16.2.3 生成工具链的gcc
16.2.4 生成工具链的glibc
16.2.5 解决工具链的一些问题
16.2.6 第二次生成工具链的binutils
16.2.7 第二次生成工具链的gcc
16.2.8 丰富工具链的功能
16.2.9 整理工具链
16.2.10 小结
16.3 生成目标系统的运行环境
16.3.1 准备工作
16.3.2 安装glibc
16.3.3 调整工具链
16.3.4 安装binutils
16.3.5 安装gcc
16.3.6 安装其他基础设施
16.3.7 系统启动脚本
16.3.8 结束语
16.4 定制Linux内核
16.4.1 内核的make参数16.4.2 定制界面
16.4.3 编译与安装
16.5 独立运行
16.5.1 etcfstab文件
16.5.2 使用GRUB配置启动过程
16.6 结束语
第三部分 扩展篇
第 17 章 窈窕淑女君子好逑
17.1 女人心事难捉摸——Linux图形环境
17.1.1 X Window
17.1.2 桌面系统
17.1.3 XOrg
17.2 云想衣裳花想容——Qt与GTK
17.2.1 发展历史
17.2.2 GTK与Qt的比较
17.2.3 大家闺秀Qt
17.2.4 小鸟依人GTK
第 18 章 这里也是鼓乐笙箫
18.1 与多媒体的第一次握手18.1.1 听声
18.1.2 看影
18.1.3 多媒体工作室
18.2 鼓——ffmpeg
18.2.1 羞辱柱与软件许可
18.2.2 多媒体的来龙去脉
18.2.3 家庭成员
18.3 乐——MPlayer与VLC
18.3.1 绿色的MPlayer
18.3.2 浪漫的VLC
18.4 笙——FrameBuffer
18.3.1 原理
18.4.2 设置FrameBuffer
18.4.3 文字倒置滚动
18.5 箫——V4L2与ALSA
18.5.1 V4L2
18.5.2 ALSA
18.6 结束语
第 19 章 团结就是力量19.1 标准的前世今生
19.1.1 一场拆分引发的标准
19.1.2 站在POSIX肩膀上的LSB
19.1.3 工作组
19.1.4 标准化流程
19.2 认证
19.3 工具
19.3.1 LSB SDK
19.3.2 App Checker
19.3.3 Distribution Checker
19.3.4 LSB Navigator
19.3.5 lsb_release的规范定义和实现
19.4 LSB的前世今生1
19.4.1 吃一堑,长一智
19.4.2 “哥只是个传说”
19.4.3 意气风发的LSB5.0
19.5 结束语
附录 我的Linux,我做主
我是前端我是Java开发
我是C++开发
我是PE
我为作者的勇气鼓掌。
对未来,因此值得推荐。另外,现存的大部头技术书还少有采用这种人文态度的,力量,帮助码农成长就是促进时代发展。这本书,正是帮助码农积攒正能量,以应
互联网时代才刚刚开头。虽然存在犹豫和彷徨,但码农一定是改变时代的推动
来。采取互联网时代的人文态度来传播Linux,是一种传播方法与传播内容的共鸣。
值基座,支撑着互联网发展到了今天,宛如一个核心,将互联网的全部价值凝聚起
自由、民主、开放、透明和共享精神的体现。正是这种精神,犹如一个最基本的价
软件(Open-source Software)运动,既依赖于互联网技术的发展,又是互联网
Linux的产生和发展,特别是随之成熟的自由软件(Free Software)和开源
趣,何乐不为?
享精神,是一种互联网时代的人文态度。从具体处看,本书的风格旨在提高读者兴
往大了说,本书作者的人文态度反映我们的时代,具有自由、民主、开放和共
求。
述,以日常例子比喻,不时夹杂文艺调侃,既讲明了技术细节,又娱乐了大众诉
把技术明珠Linux,从神坛上拉下来,作为普世和开放的知识与智慧,用大白话表
吝权威的态度,采取和读者平等的姿态,借用当代一些大众文学作品的语言风格,作为资深码农的本书作者,清楚地感受到社会的改变和码农的需要。他们以不
读书中加强自我意识,再搞点轻松诙谐,已成为一种必要的调剂。
天,以前的积累已经使新码农觉得自己很卑微渺小,再加上现实生活又很累,能在
点压抑。特别是,自从IT技术已发展到自由、民主、开放和共享的互联网时代的今
从上往下地灌输。这种书作为工具书还好,但要读者从头读到尾,则相当单调,有
过去的Linux著作,大多只专注于说清技术细节,文字难免平淡,角度也常常是
他们怎么能写出新意来,直到读过初稿以后……
Linux已有20多年历史,大部头著作一摞一摞。听到作者要写Linux,我真怀疑
序一钱振宇
Windows Live(中国)首席科学家
德国不来梅大学教授、博士生导师
2014年2月12日于北京
编辑:听说写序的这位牛人的父亲是钱骥,两弹一星功勋奖章获得者,我国第
一颗卫星东方红一号方案的总体负责人。是真的吗?
作者:你咋知道的?
编辑:不小心百度了一哈。
序二
选择了IT为业,就选择了紧张而劳碌的生活方式,因为快速变化就是这个行业
的基因。
当你刚刚熟悉视窗,又要去学习Linux ;刚刚适应了客户服务器计算模式,又
要去学习万维网应用;刚刚开发了Java程序,又要去学习.NET编程;刚刚用惯了
Subversion做版本控制,又要去学习GIT;刚刚推出桌面方案,又要学习智能手机
的开发;刚刚掌握企业私有数据中心,又要去学习云计算、虚拟化……总之,在你驾
轻就熟某项技术之时或之前,新的技术就又出现了。为了保持职业的竞争力,你还
得轻装上阵、奋勇学习,直到退休之时(我相信很多人的惯性还会一直延续下
去)。在劳顿的同时,也有学习新知的乐趣,这正是IT行业的魅力所在。
虽然Linux已经有22岁的“高龄”, 本身不再是什么新技术,但其重要性始终
未减,而且新的相关技术不断涌现,如KVM虚拟化软件。在当今云计算年代,因为
Linux是开源软件,其重要性更不断上升。据不完全统计,在公有云端的服务器有
80%之多运行Linux。掌握了Linux,也就掌握了通向云端的入场券。Linux的重要
性毋须赘言。
同为学习,可以一本正经地学,也可以轻松愉快地学。本人读过若干本有关
Linux的书,基本是一本正经地学,趣味不足,权当是工具书在需要的时候去查一
下。听说两位作者要写Linux,也没有期望有所不同。收到初稿后,看着目录眼前便
一亮,循着章节一一读完。这本书可以轻松愉快地学。
在轻松愉快的同时,并不影响这本书的结构的全面性、技术的准确性和内容的
实时性。学习Linux并不仅仅是Linux本身,还包括建构在Linux之上和周边的相关
技术和工具。有了这些软件,才能够把Linux变成解决方案,并解决实际中的各种问
题。这才是最重要的学习,也是最难的学习。这本书不仅涵盖了各个基本技术点,如文件系统、Shell命令等,还系统介绍了许多工具和软件来建构电子邮件、Web应
用等方案。即使对Linux有所了解,也会在这本书中得到新的内容和新的视角。
基于本书的趣味性和技术性,当然还有Linux的重要性,相信其他读者和我一样会喜欢这本书,并在紧张忙碌的生活空隙中精神愉快地读完它,助力于自我的技术
提高和职业发展。
金尊和 博士
IBM公司资深工程师
Sun公司Java JDO专家组成员
前言
有个OS名叫Linux,它的故事耐人追寻。
小小系统,众人追寻,相识相恋,从不伤心……
赵鑫磊:Hi,Jie,有人找我出书了,不过我觉得我在网络这方面有些欠
缺。我知道你在Linux平台上做过不少项目,特别是网络这方面。你能来帮我一
下,我们一起来完成这本书好吗?
Jie Zhang:真的吗?那太棒了,虽然现在有关Linux的书不少,但是我相
信经过这么多年的风风雨雨我一定能写出另一种味道。很乐意跟你合作。
赵鑫磊:太好了,有了你的参与,我们这本书的技术性会更强!
Jie Zhang:Linux无毒、免费和稳定是它备受推崇的原因。
赵鑫磊:无毒、免费和稳定还不够给力啊!我觉得知识的保值性才是最主
要的。在Linux中有些知识几十年都没过时。
Jie Zhang:对,这样的知识的投资回报率很高。学好Linux,面对如
FreeBSD、Solaris等系统,就不犯愁了。
赵鑫磊:看完我们这本书,其他书都是小儿科了。哈哈。
Jie Zhang:你的口气也太大了吧……
赵鑫磊:哈哈,你得抱有这个希望,我们试着在这么做。
Jie Zhang:好吧。不想当厨师的女程序员不是好媳妇儿!
Jie Zhang:那这本书就不是一本工具书了,它是我们多年工作经验积累
下的感悟。不管读者喜欢与否,这种感觉就在那里,不多不少,不离不弃。
赵鑫磊:对,我们这本书不是用于入门,不是工具书。它是传道、授业、解惑的。
Jie Zhang:我觉得还是初中级比较好。曲高和寡,不一定好。初级最
好。
赵鑫磊:我们的角度已经决定了无法定位在初级。我们并不曲高,但我们
也不是初级。我们是传道的!
Jie Zhang:这点我同意。我们要讲述Linux的精髓,而不是简单的入门。
赵鑫磊:读者需要反复地推敲书中的内容。就像很多很牛的大师写科普读
物,简单几句话里却有透彻的大道理。我们分为三大部分写,基础篇、进阶篇
和扩展篇。基础篇能了解Linux的基本特点,进阶篇则从文件系统、进程通讯和
网络等更深层次去挖掘Linux的思想内涵,扩展篇则要给读者打开Linux图形和
多媒体的缤纷世界。不同层次和需求的读者都可以从中找到自己感兴趣的东
西。最重要的是,我们所讲述的每一章,都在谈论机制。
Jie Zhang:你说的机制是指什么?
赵鑫磊:机制就是很难改变的、必须要做的事情。
Jie Zhang:光谈机制还不够,要有实际案例支持,否则看了等于白看。
赵鑫磊:但是你觉得我们书中的内容看了等于白看吗?
Jie Zhang:当然没有白看。因为除了谈机制,我们还有方法和实践进行
论证。
赵鑫磊:终于达成共识了。我们每一章都会介绍很多种机制,甚至这种机
制引入的来龙去脉都会谈到,并且会简洁清楚地介绍一下现行的方法。就这么
干!致谢
赵鑫磊:
首先要感谢我所在的公司——阿里巴巴集团,它给了我一个能成为布道者
的机会,让我成为淘宝技术大学的讲师。更要感谢原图灵的杨海玲编辑,是她
找到我要将我的讲义整理出书,虽然你由于工作原因不能参与本书的出版工
作,但是我很期待我们下次的合作。还要感谢我的妻子和儿子,是你们一直在
我身边支持我,不抱怨我没有时间陪你们,让我能将大把的时间投入到写作之
中。感谢中国Linux公社的网友们,因为你们的鼓励和期盼,让我有了莫大的勇
气来完成这本书。
Jie Zhang:
首先要感谢我的好友卢海峰,本书最初的排版是他一点一点地调整的,很
多图表也是他精心绘制的,我想说有你这样的朋友真好!还要感谢爸妈、老公
和小女,没有你们在我身边一直给我打气,不会有提笔写作的我,也不会有本
书的存在。要感谢的人还有我的朋友曹景海、胡小东、林啸和常雪峰,以及王
小川先生、钱振宇博士和金尊和博士,你们对本书的出版给予了大力的支持。
联系方式
赵鑫磊邮箱:jagen.zhao@gmail.com
Jie Zhang邮箱:jie_joy_zhang@yahoo.com
MagicLinux交流群的群号:41334777
第一部分 基础篇
第 1 章 第一次亲密接触
有一对儿异地的恋人,他们每天在手机上聊天,显示的距离永远都是1648
km。快到年底了,女孩实在受不了这种距离而提出了分手,男孩沉默不语。除夕之
夜,女孩在家中刷新手机,看到男孩距离她只有1.1 km,再刷新,只有0.9 km。她
明白即将要发生什么,含着热泪走向门口……当晚,在隆隆的焰火声中,他们的距离
变成了-5 cm,于是第二天他们还是分手了……
这似乎是个悲剧,不知道你能看出笑点吗?
大多数Linux初学者与Linux之间就好像是异地的恋人,他们之间永远都是
Windows所隔开的距离。久而久之,实在受不了这种距离而最终要彼此离开。少数
人鼓起了勇气,走进Linux并试图完成一次“亲密接触”,结果很多时候是不欢而散
的。
学习和掌握Linux需要一种和谐。这种和谐可能取决于第一次亲密接触时的感觉
是否足够让人激动不已,以及能否历久弥新。到底是什么样的感觉能让人激动不已
是因人而异的,历久弥新更是不尽相同,所以不同的Linux入门资料也会采用不同的
方法以期达到这种效果。
作为本书的最初章节,也希望做点类似的工作,只是方法有点特殊。我们期望
通过本章的内容尽量拉近你和Linux的距离。换句话说,本书并不是为那些完全不了
解Linux的人准备的,你至少应该听说过Linux的名号或者见过别人使用Linux。当
然,不管什么方式都是因人而异的,即便对Linux一无所知的朋友也会通过本章受
益,但是至少你得有成功安装过操作系统的经验。否则的话,你一定是电脑天才。
也许这章的内容只能让你在门外徘徊,如果是这样,你就应该暂时放弃这本书
(不,不要放弃),寻找其他更适合自己的入门资料,然后再继续本书;亦或是这
章的内容能够使你足够威猛到融汇贯通的程度,那是我们始料不及的,或许这是整
本书都无法达到的高度;我们说:合适就好,那样才叫和谐啊……1.1 让Linux入驻我们的电脑
“如果给我一千万,我就能买一栋房子。我有一千万吗?没有。所以我依然没
有房子。如果我有一双翅膀,我就能飞。我有翅膀吗?没有。所以我也没办法飞。
如果给我一台运行着Linux的电脑,我就能玩转Linux。我能拥有一台运行着Linux
的电脑吗?”我说:“这个完全可以有。所以,是的,你能玩转Linux。”
大多数人可能会在Windows上虚拟一个Linux出来,我的建议正好相反。要养成
使用Linux的习惯,显然就要让Linux入驻你的电脑,让它成为你的主要操作系统,然后再虚拟一个Windows出来
1.1.1 我们用Linux的理由
很多人在决定让Linux入驻自己电脑的时候遇到了很大的障碍。我所了解到的大
多数问题是担心没有可以替代的软件。
实际上对于大多数人而言这根本就不是问题,只是他们不知道罢了。但是如果
你买电脑就是用来玩游戏的,那么这本书估计也不适合你。这并不代表本书排斥游
戏玩家,恰恰相反,我本身就是一个超级玩家。我总是认为拿电脑打游戏是十分浪
费资源的,专用的游戏主机更适合干这件事儿,也很便宜。比如一台PS3的价格绝对
比一块超级显卡便宜很多,但是游戏效果绝对是目前最棒的。那么排除了打游戏这
种需求之外,Linux几乎可以满足绝大部分的需求了。
对于现如今不可或缺的浏览器来讲,除了没有IE以外,其他的各种主流浏览器
都有Linux版本,比如Firefox、Chrome、Opera等。有人可能会来抬杠,说Linux
下肯定没有Apple的Safari浏览器,那么抬杠的人就要失望了,因为Safari实际上
是修改自Konqueror这个来自KDE(Linux的一个图形环境,后面会介绍)的浏览
器。其实在Firefox和Chrome还没诞生之前,我最常用的浏览器就是Konqueror
了,只是由于后来它的开发者们被Apple耍了一道,之后便开始没落了。说句题外
话,现在是HTML5大行其道的年代,即便在Windows上,IE也开始不讨好了,Linux
在这方面并不会吃亏。
除了浏览器之外的另外一个重要的领域就是Office软件了。当然MS Office是不可能有的。这方面的首推替代品就是OpenOffice系列了。但是我自身认为
OpenOffice是给老外用的。它的中文本土化做得不如MS Office,对中文排版的处
理上也特别差劲,而且与MS Office兼容性还不好。这可能是Linux无法推广普及的
一大壁垒。但是话又说回来,我们中国有一家十分靠谱的公司,那就是永中科技,它出品的永中Office可以完美地兼容MS Office,完美地处理任何中文排版问题
(总觉得永中应该给我点儿好处费才行)。永中Office采用Java开发,所以可以很
容易地兼容所有Linux版本,而且还是免费给个人用户使用。绝对的自主知识产权,可以很好地满足一下广大愤青们的虚荣心。此外,老品牌的WPS也不甘寂寞,也正在
加紧研发Linux版本,不日就会与大家见面。
对于大多数普通用户来说,上网、打字之外就应该是聊天了。如果你很清高从
不使用QQ的话,那就实在是太好办了,几乎所有开源IM工具都不支持QQ。当然,如
果你跟我一样很三俗,非QQ不用的话,WebQQ是一个非常好的选择。飞信还可以有
libFetion和OpenFetion。唯独阿里旺旺比较麻烦,但是也有一个不伦不类的官方
版本出来,我倒是可以在这里帮大家忽悠一下:童鞋们努努力吧……但是如果我那些
负责开发旺旺的同事们不看这本书就没啥作用了。
如果你还觉得不够,还想看看电影听听歌曲,那就更好办了。其实Windows上
我们使用的大多数免费播放器其真身原本就是为Linux而开发的,比如VLC、MPlayer等。很多播放器,甚至收费的也都只是在它们外面包上一层皮罢了。但是
需要注意的就是你的声卡不能太“高级”了,因为一些特别专业的声卡没有Linux的
驱动。但是显卡很好办,因为AMD和NVIDIA都很重视Linux,只要是还不太老掉牙的
显卡,Linux都能良好地驱动它。
对于一些专业人士,比如视觉设计师们,或许会觉得Linux缺乏专业的设计软
件。这其实也是一种误解。GIMP完全可以胜任Photoshop的工作,Inkscape一点也
不比Illustrator差劲,Cinelerra兼有Premiere和After Effects的功能。不要
忘记,当年卡梅隆导演正是用Linux作为平台完成了《泰坦尼克号》的特效。
当然,Linux除了能做这些Windows能做得很好的事情之外,还能做很多
Windows做不到的事情。对Windows最为致命的打击就是Linux几乎不会感染病毒,至于为什么会这样,本书后面的内容会做详细的介绍。但是就现在来看,你大可以
放心大胆地让Linux去裸奔(其实你想让它穿件衣服也没啥合适的)。再一个就是你可以合理、合法、合乎道德地免费使用Linux,并免费升级到最新版本,更不需要在
安装时输入那25位的(最后一位数码也许已经被狗啃掉了)产品密钥,至于可恶的
激活就能滚多远滚多远好了。Linux对硬件的要求极低,即便是目前最新版本的
Linux,依然能够非常流畅地运行在只能勉强运行Win95的旧电脑上(最多值200
块);然后就是你再也不用担心你的磁盘碎片问题了,因为Linux的磁盘管理方式要
比Windows优秀不知多少倍,所以也不会因此而导致系统越用越慢。这其中的奥妙
本书也是会告诉大家的。其实Linux的好处还有很多,我就不在这里浪费你的宝贵时
间了,当你看完整本书,自然就什么都知道了。反正现在只要你选择了Linux,那就
开启了另一种生活方式。
到目前来看,对于我们来说Windows的唯一救命稻草就只有一个了,那就是网
上银行。这的确是很重要的一块儿领地,也没有任何替代的方案。我的方法就是虚
拟一个Windows出来。这个Windows只用作网银操作,还能有效防病毒,连杀毒软件
都省下了“卡车司机”别来找我麻烦啊
好了,我想我们已经给出了足够多的理由使你可以义无反顾地让Linux入驻你的
电脑。放心,只要你按照我们的方法来做,是不会给你带来任何损失的。
1.1.2 选择哪个发行版
接下来我们将面临一个更为麻烦的问题,就是到底应该选择哪个Linux发行版。
因为Linux的发行版实在太多了,用多如牛毛来形容一点都不夸张。可以想象,在牛
毛中要选择出毛色最正、长短最合适、粗细最均匀的一根是多么纠结的事情啊。我
们现在就要做这件事情,还要做好它!
就目前的情形看,Linux发行版可以分为三个主要的分支:RedHat、Slackware和Debian。每一个分支都拥有一个最具代表性的商业服务器级的发行
版,它们是:Red Hat Enterprise Linux,简称RHEL;SUSE Linux
Enterprise,简称SUSE;Ubuntu Server,简称Ubuntu。
看似好难选择的样子,但实际上也没什么,不管是谁家的Linux发行版,都不会
有本质的区别。因为Linux本身就不是一个完整的系统,它实际上只是一个内核。所
谓的发行版只不过是给这个内核加上一堆应用程序而攒成的系统。而且这些应用程
序很大一部分都是来源于GNU社区,代码都是一样的,能有什么差别呢?虽然本质上没有什么不同,但是不同的发行版在细节上还是有一些差别的。这
主要体现在管理工具的选用上。由于开源软件的绝对自由性,具有相同功能的系统
管理类软件可以有很多种,不同的发行版可能会对某种特性有偏好。有些实力比较
强大的发行商,比如Red Hat,自己也会为开源社区贡献很多这类软件,它的发行
版自然也会首选自家的产品。当然,其他发行版也可以采用Red Hat开发的管理软
件,实际上很多发行版也是这么做的。
前面还说到发行版的分支,但是具体分支的归属并不取决于是否使用相同的系
统管理工具。所谓的分支在软件层面上并没有十分严格的界限,只是这三个分支是
历史最为悠久的发行版,而后续诞生的这些发行版大多都是从修改它们其中一种而
发展起来的。实际上很多到目前为止已经跟其原有分支没有任何关联了,比如SUSE
Linux已经跟Slackware没有任何联系了,但是最初的SUSE Linux是从Slackware
修改而来的,所以现在依然认为它属于Slackware分支。现在,不同的分支之间互
相也有借鉴,取长补短,所以分支概念在当前的发行版中越来越模糊了。现在比较
清晰的是软件安装方法的不同,有些使用rpm,有些使用deb,有些甚至直接采用源
代码。当然,这样的差别只有在使用不同安装方法的发行版之间才能感觉到。在日
常使用中,Linux就是Linux,跟发行版没什么关系。
花费了这么大的篇幅,依然没有讲清楚到底该选择哪个发行版,我感觉有点对
不住各位。那么接下来就解决这个实际问题。大家可能有所察觉,我所列举的这些
发行版有些人根本都没有听说过,现在流行的都是什么Fedora、Ubuntu。的确,如
果你就是想自己装个Linux玩,它们都是很好的选择。但是我们都是实用主义者,同
时还要排除一下个人偏好,所以从选择哪个发行版更适合找到好工作这个角度出发
就比较靠谱了。比较理想的选择应该是——CentOS。
你绝对没看错,也不是我的脑袋让电梯夹了而语无伦次。虽然这之前完全没有
提到过CentOS,但是当你知道它实际上是RHEL的一个克隆之后,就会稍微地理解我
推荐它的原因了。
RHEL由Red Hat发行,可以说系出名门,也是目前被众多品牌厂商支持得最为
完善的Linux发行版。当然,SUSE和Ubuntu也未见得差到哪里,但是RHEL还有另外
一个优势,就是对KVM虚拟机的支持。很多大型互联网公司为了充分利用服务器的硬
件资源,都会大量采用虚拟机技术。而KVM的很多开发和测试工作都是在RHEL上进行的。这也导致了很多大型互联网公司都选择了RHEL作为其主要的服务器系统。既
然RHEL这么优秀且又是大型互联网公司的选择,那么我们直接选择RHEL好了,为什
么要选择它的克隆——CentOS呢?
原因非常简单,RHEL要收费。当然,RHEL也允许免费使用,但是你将得不到任
何系统升级服务,也得不到任何技术支持。RHEL在对外发行的时候采用两种方式:
一种就是收费的二进制方式,一种就是完全免费的源代码方式。CentOS就是利用完
全免费的RHEL的源代码重新编译而成的,免费提供给大家,所以本质上与RHEL没什
么区别。唯一的区别就是更新的频率没有付费的RHEL快。当然,如果你有足够的时
间,也可以使用RHEL的源代码构建自己的发行版,至于是否收费,你自己说了算,给自己的公司用当然也不成问题。
不管怎么样,要想吃Linux这碗饭,CentOS是非常好的选择。在免费的同时可
以体验到大型互联网公司的服务器系统环境。如果有机会去这些公司面试,根据自
己平时的学习经验就可以很好地回答面试官的问题了,而面试这种事儿,“共同语
言”是很重要的。
时刻不要忘记,学习Linux的本质还是要学习它最核心的那些机制。而CentOS
并不会改变这些机制。掌握好了这些机制,对于掌握任何其他Linux发行版,乃至自
己去制作发行版,都将是水到渠成的事情。而在这之前还有希望找到一份较为体面
的工作,何乐而不为呢?
1.1.3 安装系统
到哪里去获得CentOS或RHEL,乃至其他Linux发行版呢?问Google或者百度好
了。我不会像其他书籍那样提供一大堆URL列表,总感觉这样做是在辱没大家的智
商。可能比较麻烦的事情是如何规划磁盘,本书的第3章会深入地探讨这个问题。那
么现在这个阶段只要按照系统默认的安装设置就行了。如果你还想让Linux与
Windows共存,只需要使用分区工具留下几十个GB的未分区的磁盘空间就行了,CentOS的安装程序可以自动使用你特意留下的空间。当然,安装的时候一定要慎
重,看清楚提示,不要做一些蠢事。此外,我不是很建议你的Linux与Windows共
存,还是在虚拟机上运行Windows吧(具体怎么弄我后面会告诉你)。
一个比较好的建议是使用64位版本,毕竟现在已经是21世纪又过了10多年了,老掉牙的32位系统应该在坟墓里歇息了!到本书截稿为止,最新版本的CentOS是
6.4。为了安装方便,最好下载它的DVD镜像,前提是你安装的不是“假宽带”。
为了方便现在身边没有电脑的人能够尽早体验到Linux系统的一些魅力,这里我
们准备了一些截图来讲述一下CentOS 6.4的安装过程,以期能够图文并茂地让你对
Linux有一个好印象。出于成本考虑,当然也是为了帮助你省钱,我不打算使用彩色
图片。但是即便是黑白二色,依然无法掩盖Linux系统的美。不过不要高兴得太早,你若想在安装CentOS 6.4的时候与我所描述的内容相符,那么必须保证你的机器内
存大于628M,因为低于这个要求不会启动图形安装模式。幸运的是,文本安装模式
不支持自定义分区,也不支持自定义软件包,这使得安装过程十分简洁,也造成了
我没得可讲的境地。而不幸的是你也无法得到拥有图形环境的Linux系统。不过我倒
十分希望你有这“下场”,因为在我看来只有坚持使用命令行才能学好Linux。
CentOS 6.4系统镜像有两个,只需要下载第一个镜像就能完成安装。第二个镜
像是一些附加的软件包,基本上就没什么用。因为我们安装新的软件基本上都是
从“云端”下载的,所以第二个镜像你都没有理由下载它。
接下来的步骤就是刻盘、启动和引导了,如果没有问题,应该出现这样的界
面:图 1.1 启动画面
这个界面展示了5个功能让你选,如果1分钟内你选择不出来,它就帮你选。选
谁呢?选第一个,因为99.99%的人都会选这个。其他的功能我就不介绍了,因为当
你成为那万分之一之后,基本上都懒得理我了,我还费什么事呢?
一分钟不用等啦,直接按回车,应该出现这样的界面:
图 1.2 检测安装介质
这是要检测一下安装介质是不是有损坏。对于时间比较宽裕的同学可以测测,测测更健康嘛(第二个镜像就必须得下载了)。如果你认为浪费时间就等于浪费生
命,那就选Skip吧。
不管你是选择检测还是选择跳过,最终你都要进入这个界面:图 1.3 欢迎界面
没啥实际意义,Next继续。图 1.4 安装时语言选择界面
这里是干什么的,大家应该懂的,我是选择母语的。Next继续。图 1.5 键盘布局选择界面
这里是让你选择你的键盘类型,在中国选择美国英语式就行了,别的样式的键
盘估计你不熟悉。默认情况下也就是这样给你选的,所以直接下一步就行了。图 1.6 存储设备选择界面
这个就是让你选择使用的磁盘类型,基本没别的选择,99.9999%的人都不用选
择,就是这个默认的基本存储设备。别的那些东西,估计这辈子你都无缘见到,所
以下一步就行了。图 1.7 主机名设定界面
这里设置主机名,也就是给你的电脑起个名字。要是没啥好名字,用这个默认
的也是不错的。另外,这个地方可以进行一下网络配置,感兴趣的同学可以点开看
看。如果觉得自己还不太靠谱,那就下一步好了。图 1.8 时区选择界面
这里确定你的时区。还要告诉你一个秘密:在这个星球上别的国家是不知道
有“北京时间”的,但是他们都知道有“上海时间”。有些人是不是要自豪一下
呢?图 1.9 管理员密码设定界面
输入管理员密码,尽量弄复杂点。当然,你一定要用你老婆的生日我也没办法
不是?图 1.10 磁盘分区方式选择界面
这里有这么多的选项,我们认为最有用的就是第一项“使用所有空间”了,但
是你现在未必有胆量这样干。所以,如果之前给Linux预留空间了,就选择“使用剩
余空间”,或者使用“创建自定义布局”也行。
“自定义布局”的界面是这样的:图 1.11 自定义分区界面
我们划定的磁盘分区就是上图这样,虽然不是很符合Linux的设计思路,但是操
作起来比较简单。作为初学者就这样好了,反正第3章会告诉你做Linux磁盘分区的
技巧。图 1.12 引导程序安装界面
没什么能让你设置的,下一步就行了。图 1.13 随机软件定制界面
来到这里就是定制你的Linux系统要安装哪些套件。默认的是“Minimal”,只
是装个基本系统。我们推荐你选择“Desktop”,这样你就有图形界面的Linux用
了。下一步就是安装过程了……图 1.14 安装等待界面
你不再有点按“下一步”的机会了,等待的结果就是最后的成功。图 1.15 大功告成
到了这个阶段,Linux已经进驻你的电脑了,重新引导就可以开始享用了!第一
次引导的时候是要进行系统初始化设置的,也是非常简单的,基本上一路“下一
步”就能搞定。
1.1.4 登录系统
Linux与Windows有一个很大的不同就是很有可能你安装的Linux启动之后没有
启动图形用户界面(刚刚安装完CentOS 6.4的人应该不会遇到这种情况)。这个时
候你就必须得输入用户名和密码才能继续使用。即便你的Linux启动了图形界面,也
很少有发行版让你能够自动登录系统。所以,你一定要搞清楚你的用户名和密码。
虽然有人会觉得我这样提醒似乎有些弱智,但是的确有很多人忘记了给自己刚刚安
装的Linux设置了什么密码。尽管本书会告诉你如何在这种情况下找回密码,但是在
现在这个阶段,一旦有这种事情发生,那么你最好还是重新安装吧!Linux的用户被划分为根用户和普通用户两种。其中根用户是系统内置用户,用
户名永远都是root,所以也叫root用户。Linux的root用户与Windows的
administrator用户是一样的,都拥有系统的最高控制权。普通用户一般是用户自
己定义的,所以没有什么特别的权限。大家在使用Windows的时候大多数都会选择
直接使用administrator用户,这是非常不好的习惯,也是Windows下病毒泛滥的
推手之一。在Linux下不要随意使用root用户,因为它的权限大到能够自杀的地
步。所以很多发行版,比如我们推荐的CentOS在图形界面登录时,并不会提示有
root用户存在。要使用root登录,必须明确输入这个用户名。
我们提供这部分内容其实是为另外一些人准备的。当然,你可能就是其中一
员。他们在安装Linux系统的时候,并没有给自己的系统添加任何普通用户,如果
他她不知道还有root的时候,可能死活都登录不了系统。大家不要笑,这样的大有
人在。我在第一次使用Linux的时候就这样,结果反复安装了3遍都没正常进入系
统,最后经“高人”指点才解决问题:_(
当你正常登录Linux系统后,就可以尝试这个对你来说还十分新鲜的玩意儿了。
如果你的电脑没有什么特殊的硬件的话,应该可以上网、聊天、看电影了……1.2 不一样的图形操作
几乎所有Linux的新用户都会认为Linux的图形界面是相当地绚丽又多彩。因为
这毕竟是一种全新的体验,那种超脱Windows俗套的快感就会油然而生。对于刚刚
翻开这本书的人来说,如果对Linux是抱有这样认识的,那就太棒了,因为咱们又多
了一个洗脑的对象了:P。此时此刻,真正的亲密接触就要开始啦……
1.2.1 没有图形的图形
虽然Linux的图形界面美轮美奂,但是有一个秘密却不得不告诉你:Linux本身
是没有图形界面的。不管你信还是不信,事实就是这个样子。这么说的原因并不是
因为Linux只是一个内核,其实所有类UNIX操作系统本身都没有图形用户界面。
那为什么我们能通过图形用户界面来使用Linux或者其他类UNIX操作系统呢?
原因是有一个软件提供了这样的功能。是不是觉得很怪异?如果你有使用DOS和
Windows 3.2 的经验,就一点都不奇怪了。因为那个时候Windows 3.2实际上就是
一个DOS上的软件。而且我们所熟知的图形化操作系统Windows,直到Windows 95
开始才能算得上是真正意义的操作系统。Linux上提供这个功能的软件以前是
XFree86,现在是xorg(官方写法是X.Org,为了方便通常写作xorg)。虽然这两
个软件名字上差别有些大,但实际上是一个软件的不同分支。1992~2004年间就只
有XFree86,且跟Linux内核一样,以GPL许可证发行。但是2004年就发生了变化,XFree86的开发商XFree86? Project公司改变了许可证。这引起了GNU社区的极大
不满,于是从XFree86 4.4 RC2衍生出了xorg。目前几乎所有开源的类Unix操作系
统使用的都是xorg,让XFree86? Project抱着它的XFree86自己慢慢过吧:)
可能有些人会觉得奇怪。因为只听过有人在争论到底是KDE好还是GNOME好,并
没有听说有xorg这东西,而且还有人说Unix的窗口系统是X提供的。那么X和xorg是
什么关系呢?KDE、GNOME跟它们又是什么关系呢?嗯,这些的确是很好的问题,接
下来就解答一下。
首先,X不是什么具体的软件,它是一种协议,跟我们平常所耳熟能详的那些什
么HTTP协议、SOAP协议等是一样的。而xorg则是实现X协议的服务器软件,这跟实现HTTP协议的Apache是相同的概念。大家都知道Apache是可以通过HTTP协议来提
供Web服务的,那么xorg通过X协议来提供什么服务呢?答案是图形用户界面服务。
Apache的客户端请求Apache得到的结果是HTML内容,而xorg的客户端请求xorg的
结果则是向屏幕上画图。它们之间还有一个很大的不同就是Apache只能被动地接受
客户端请求,而xorg还需要主动将当前键盘按键和鼠标位置等信息通知给客户端。
所以,Linux上的那些拥有图形用户界面的软件实际上都是xorg的客户端,它们利
用X协议让xorg在屏幕上画出窗口或通过xorg获得键盘和鼠标事件。当然,为了运
行这些软件也就需要一个前提,xorg这个服务,也就是通常所说的X服务器,必须是
启动的。现代大多数Linux发行版的默认安装都是自动支持图形用户界面的,也就是
说它们会在系统启动之后自动执行xorg。
可能有些人会意识到,如果系统中只有xorg是不可能有任何图形界面供大家使
用的,至少还需要有个X客户端程序。而且这个X客户端程序还有一个专有名称——
窗口管理器,英文叫做Window Manager,简称WM。WM也不是一个具体的软件,而
是一类软件。诸如KDE、GNOME这些就是包括各自的窗口管理器,也有一些单独的窗
口管理器,如FVWM、Openbox、IceWM等。它们控制窗口外观、位置和提供用户去操
作这些窗口程序的方法。所以不同的窗口管理器会有不同的使用习惯。如果你当前
使用的Linux系统没有配置成默认使用图形用户界面的话,可以使用命令:
startx
来启动xorg和默认的WM。对于Cent OS 6.4来说,默认的WM应该是GNOME的
Metacity窗口管理器(KDE的是KWin),而且默认情况下是使用图形用户界面的。
对于那些默认使用图形用户界面的Linux系统,还有一个十分重要的X客户端需
要启动,就是显示管理器,英文叫做Display Manager,简称DM。这个是做什么的
呢?它是专门负责图形界面的用户登录问题的。也就是说,系统启动之后第一个要
启动的X客户端程序就应该是DM,而且没有人能关闭掉它。(你能猜到为什么要这样
吗?)DM也是一类软件,具体的应该是XDM、KDM或GDM等。
好了,有关Linux图形用户界面的介绍到这里就差不多了,更深入的内容我们留
在后面吧。现在我们要谈论另外一个话题,就是Linux怎么会把它的图形界面设计得
这么乱!1.2.2 架构设计
其实Linux系统的图形界面设计还是非常清晰的。让大家觉得乱的原因可能是有
两个:一是我的写作水平有点问题,二是涉及的新鲜事儿太多。我总认为第一点是
主要因素,所以干脆不写了,画个图给大家看看。下图展示了Linux界面的基本结
构,同时提供了Windows图形界面基本结构进行对比。自我感觉画的比说的要好。
图 1.16
当结构清晰的时候,问题随之就会来,不知道你发现问题了没有?最大的问题
就是从结构上看Linux的图形界面效率肯定比Windows的要差。因为Linux需要很多
层的软件互相协作才能实现图形界面,而Windows则相当直接,不拖泥带水的就搞
定了图形界面。在计算机科学领域很少有实践结果与理论预期出现相反结论的情
况,但是,可是,可但是,但可是……小概率事件还是会发生的,偏偏这个就是典型
的一例。众所周知的Mac OS X的图形效果是目前任何操作系统都无法比拟的,自然
也包括Windows的任何版本。而Mac OS X是一种类Unix操作系统,采用的恰恰就是
这种架构。只是Mac OS X的“X协议”与Linux所采用的X协议有很大不同,前者是
二进制的,后者使用的是纯文本。从纯粹学术理论上来讲,纯文本虽然在效率上会
有些损失,但在其他方面会更具优势。这个问题在本书的第4章将会继续探讨,这里
就先说这么多。
正因为Linux的图形界面得益于这种优良的架构设计,虽然在效率上不及MacOS X那样优秀,但是图像效果和功能的丰富程度绝对不会比Windows差,至少它拥
有很多种桌面环境可以选择,可以说每一种都会让你有完全不一样的体验。看惯了
Windows的“老气横秋”,不妨去感受一下Linux的小清新吧!1.3 主流桌面环境
Linux强大的适应性、创新性以及开放性在它的桌面环境方面得到了十分充盈的
展现。目前比较流行的就有GNOME、KDE、XFCE和LXDE,它们并称为Linux图形界面
四杰,个个美轮美奂,风格迥异。它们并不是单纯的单一软件,而是一套软件集
合,比如WM、DM、应用框架库等。最近有传言称Linus Torvalds 大神在
Google+上大骂GNOME3“不能容忍的凌乱”,并改投XFCE的怀抱。不管真假,至少
我认为GNOME3是很考验智商的。其实这玩意没有好坏之分,只是口味不同,自己用
着舒坦的就是最好的,是不是?
Linux之父啊,本书的读者要是不认识他是有些说不过去的。
本书并不准备截图给各位欣赏,原因主要有三:一是印图成本太高,我也是屌
丝一名,知道挣点钱不容易;二是大家可以通过Baidu或Google查询到非常多的截
图,直接在电脑上看知道效果会更好;三是学习Linux最需要亲力亲为持之以恒,我
们不希望浪费你去主动查询资料的好机会。望能够理解我们的良苦用心
1.3.1 KDE初学者的首选
KDE是由德国人Matthias Ettrich于1996年就读于图宾根大学时开始的一个计
划。当时的Unix桌面没有一个应用程序的外观、感受或工作方式与其他程序一样。
于是Matthias Ettrich就建议不仅是创建一套应用程序,而是要创建一个桌面环
境,能让用户拥有相同的外观、感受和工作方式,而且这个桌面应该是非常容易使
用的。他的这个想法得到了很多人的支持,从此KDE计划就诞生了。
可能有人会疑惑,KDE是给Unix的,似乎跟Linux没有什么关系,为什么这本书
要介绍它呢?其实不单单KDE是这样,剩下的三个桌面环境也是这样。甚至在这个星
球上完全针对Linux编写的软件也是并不多的,那些在Linux下能够获得的软件大多
不是针对Linux开发的。它们是针对Unix系统的,而Linux属于类Unix系统,所以
就毫无歉意地坐享了这些成果。这就是Linux的优势,也是大家学习Linux的优势。
学会了Linux,几乎就等同于学会了Unix或类Unix系统,它们在这个星球的应用范
围就从来没有被Windows超越过。本书的内容也是如此,只有少数章节是专门针对
Linux特性所特别设置的,大多数知识都是通用且极具实用价值的。好了,闲话不多
1
1说,我们继续介绍KDE。
追究KDE这个名字的由来是没有实际意义的,但是我们需要知道它是完全采用Qt
程序库(后面的章节会有详细介绍)开发的。由于Qt多舛的命运 ,注定了KDE同样
会拥有风雨飘摇的艰辛历程。
1991年由TrollTech公司开发,于2008年被Nokia所收购,2012年又卖给了Digia公司。曾数次修改授
权方式。
虽然Qt是开放源代码的软件,但是在KDE早期的时候Qt并非是自由软件授权,这与KDE的自由软件授权相冲突,所以很多人会担心惹上版权麻烦,尽量避免使用
KDE,这成为了KDE初期推广的障碍。
很庆幸的是1998年11月之后,Qt程序库所属的Trolltech公司发布了第一份自
由软件许可Q Public License(QPL)的Qt程序库授权。同年不久,KDE Free Qt
基金会 保证:若Trolltech在任意连续12个月内没有发布新的自由版本,那么Qt程
序库将更改为基于BSD许可证的授权进行发布。但是很多人依然争论着,认为QPL授
权与GPL(万恶的“鸡屁儿”)上的某些条款不相容。这导致了Red Hat公司始终无
法将KDE当作默认桌面,而Mandriva Linux则趁此时机凭借KDE席卷了欧洲市场。
就是保证Qt和KDE在任何情况下都是自由软件的组织,最初有TrollTech和KDE开发者共同创立。
直到2000年9月,一个基于GPL协议的Qt程序库发布,大部分用户方才对KDE生
出信心。此时的KDE已经日臻完善,国内的各大Linux发行版都纷纷采用KDE作为其
默认桌面,甚至出现了“阳春白雪 ”这样专门针对KDE的汉化美化套件。
2001年沈阳玳娜软件有限公司为了推动中文Linux的普及,针对Red Hat Linux 7.2推出的一款汉化美
化套件,其中包括中文输入法和KDE的汉化美化部分。属于死在沙滩上的优秀前辈。
2008年是一个非常重要的年景,奥运会第一次在中国召开,Qt升级到了4.0,并且采用了更加宽泛的LGPL授权(仅Qt4以后的版本)。但是KDE的好日子到头了。
Qt4的LGPL授权固然招人喜欢,但是Qt4相对于Qt3做了较大幅度的调整,如果KDE转
投Qt4,则必须做较大改动甚至重写。KDE的开发者们抱着有困难要上,没有困难制
造困难也要上的必死决心毅然地转投Qt4的怀抱。这导致了很长一段时间人们没有新
的KDE版本使用,那些不断放出的KDE4的各种版本几乎个个都是花瓶,中看不中
用。直到KDE 4.2版本的发布,才彻底稳定了下来。于是就在Linux界流传了一段笑
2
2
3
3
4
4话:KDE从能用到不能用再到能用,之后GNOME从能用到不能用。至于GNOME的故事
我们稍后再说,KDE的故事还在继续。
经过Qt3到Qt4转变的这么一折腾,损失大量粉丝是在所难免的了,而祸总是不
单行的。就在KDE4准备发力接受市场的挑战之际,Qt的所属公司Trolltech被大名
鼎鼎的Nokia收购了。原以为能够如虎添翼一下,可万没想到的是Nokia又是一个倒
霉蛋,倒霉到不得不去抱微软的大腿。结果是大腿没等抱稳,就把Qt给弄丢了,出
售给了Digia公司。但是不管怎么样,由于Qt是LGPL授权的,所以它就是属于全人
类的了,我们能够永远都有免费的Qt使用。
Qt其实是一个非常优秀的C++跨平台图形界面开发库,几乎可以媲美Java的跨
平台特性。不同的是Java能够一次编译到处运行,而Qt是可以一次编码到处编译。
也正因为如此,KDE已经被移植到了几乎所有硬件和操作系统平台上。现在的KDE已
经不单单是一个桌面环境,它几乎就是基于Qt开发的程序的庞大集合,是Qt的一个
超级平台。这里拥有功能异常丰富的应用,包括各种跨平台组件、办公套件和开发
套件等,几乎可以找到任何Qt应用的样板。而且从任何角度来看,Qt都是用C++开
发跨平台图形应用的首选程序库,最新的WPS选择它就是非常好的佐证。对于学习和
掌握Qt,KDE是非常理想的平台。
需要注意,如果你根据我们的推荐选择安装了CentOS,KDE是选装部分,需要
在安装的时候选中它才可以,否则就需要根据下一章所介绍的内容去手动安装了。
如果你选择的是SUSE,则默认就可以使用KDE了。我们推荐初学Linux的用户选择
KDE,它的操作习惯与Windows更加接近。
1.3.2 GNOME不可磨灭的经典
在KDE受版权困扰和没有新版可用的时候,陪伴在人们身边的是GNOME桌面环
境。虽然GNOME3使得GNOME从能用变得不能用了,但是GNOME2则依然是不可磨灭的
经典。
GNOME是GNU 网络对象模型环境——The GNU Network Object Model
Environment的英文缩写。它是GNU计划的一部分,开放源码运动的重要组成部分。
目标是基于自由软件,为Unix或者类Unix操作系统构造一个功能完善、操作简单以
及界面友好的桌面环境,它是GNU计划的正式桌面。如果说有那么一个桌面环境是为Linux而生的,那么就非GNOME莫属了,它被现
代的大多数Linux发行版作为默认桌面使用。因为Linux是类Unix的缘故,GNOME虽
出于Linux但胜于Linux,已经能够运行于各种类Unix系统了,所以就有了前面对
GNOME的描述。
GNOME主要是为了当初使用没有采用GPL授权的Qt的KDE而出现的。GIMP
Toolkit(GTK+,本书后面的章节会详细介绍)就成了Qt的替代者,担当GNOME桌
面的基础。GTK+使用LGPL许可证授权,允许链接到此库的软件(例如GNOME的应用
程序)使用任意的许可协议。GNOME的应用程序通常采用GPL许可证授权。
GNOME本身是使用C语言编程的,但并不受限于C这种单一语言。GNOME使用
CORBA(Common Object Request Broker Architecture)让各程序组件能够彼
此协作,而又不需要考虑它们是何种语言所写成的,甚至是在何种系统上执行的都
不用考虑。
GNOME提供了两个东西。一是GNOME桌面环境,一个对最终用户来说符合直觉并
十分吸引人的桌面。GNOME3做到了吸引人,但是我总觉得它不符合我的直觉,也就
是我总是找不到我要找的东西(可能是智商问题)。二是GNOME开发平台,一个能使
开发的应用程序与桌面其他部分集成的可扩展框架。这点GNOME做得相当好,CORBA
就是非常典型的例子。
在GNOME之下还有很多子计划,它们不都是包含在GNOME中一同发布的。一些基
于概念的纯粹实验性的项目,等稳定后会加入GNOME;还有一些是正在完善中,以便
能够直接加入的,例如GNOME存储和D-BUS。
目前的主流发行版,如RHEL、CentOS和Ubuntu等都是以GNOME为默认桌面的,操作手感更像Mac OS X,但是属于完全不同的风格。这是绝对原汁原味的GNU。
1.3.3 XFCE——轻量、简单、高效
KDE和GNOME虽然雍容华贵,但是也恰恰就有些太过“臃容”,对于喜欢“轻
淡”口味或只有“小马力战车”的屌丝们,XFCE是一个相当不错的选择。
XFCE是一个轻量级的Linux或类Unix的桌面系统。XFCE的设计目的就是:快速加载并用来执行程序,且占用系统资源少。从实际的使用效果上看,XFCE也的确做
到了这一点。也正是因为如此,作为一个拥有很长历史(其源自1996年)的桌面环
境,能够在很多U盘Linux中见到它的身影。
XFCE是使用率仅次于KDE和GNOME的桌面环境。各大发行版基本都会将其作为可
选桌面提供。甚至一些发行版,如Xubuntu、SAM Linux Desktop等已经开始将
XFCE作为默认桌面了。
XFCE与GNOME一样,也是基于GTK+开发的,这首先保证了不会有任何授权问
题。另外,XFCE不仅可以作为桌面环境使用,还能够作为程序库来开发第三方程
序,比如文字编辑器Mousepad。
XFCE肯定是没有办法与GNOME和KDE相比的,但是简单和高效是它的特点,如果
你已经修炼成了一个Linux行家里手,那么XFCE将会是你梦寐以求的选择。具体为
什么,读完这本书你就知道了。
1.3.4 LXDE——更轻,同样精悍
如果对小巧精悍的桌面环境很有爱的话,那么LXDE则是另外一个十分值得推荐
的选择。如果你是一个民族主义者,那么一定会十分喜爱LXDE,因为它完全是我们
中国人开发的,虽然他们都是来自台湾省(这是我国领土不可分割的部分)。
LXDE相对于前面三个桌面环境会显得相当地年轻。它在2006年还只是一个文件
管理器,后来才慢慢发展成为一个功能齐全的桌面环境。虽然LXDE是2006年的东
西,但是它对系统的要求却低得惊人,甚至在1999年的老电脑上不用3D加速也能流
畅地运行。所以,在上网本、MID等低功耗移动电脑上拥有比较广泛的应用。这也十
分对得起它的名字—— Lightweight X11 Desktop Environment,轻量级X11桌
面环境,简称LXDE。
LXDE与前面三个桌面环境不同,它没有自己开发WM,而是选用了Openbox做为
默认WM。这种选择使得它不必重新造轮子,还始终能够保持十分轻量。而且
Openbox本身也是十分轻量的。这两者的强强组合,促成了LXDE的无比强大。其实
在Linux世界,你所见到的大多数复杂软件系统,都是这种强强组合的结果,像
KDE、GNOME、XFCE这样的一应俱全的软件套件是非常罕见的。LXDE同样是采用GTK+开发的,由此可见GTK+在开源图形领域的地位是多么地重
要。单从这几方面的应用,几乎就可以让初学者确定到底应该学些什么了。但是我
更加喜欢Qt,至于具体是为什么,也就是萝卜青菜的差别。1.4 返璞归真的命令行
有一种说法,现代计算机不是靠电力驱动,而是靠“鼠标”。多少应用程序的
界面都是需要移动和点击鼠标来执行的。计算机本来的用意是把人类从反复单调的
工作中解放出来,但摆在我们身边的残酷现实是我们每个人每天不得不反复单调地
移动和点击鼠标,以确保养家糊口的工作能够顺利正确地完成。
别叹气,存在另一个世界,那就是命令行,让你暂时远离鼠标。对那些苦哈哈
的程序猿来讲,这也许是另一种情调的工作方式。我们突然之间拥有了另一种意想
不到的收获,例如我想看看用户目录下的文件大小,然后按升序排列产生个报表。
如果用CC++完成这项工作,至少得用好几十行代码,但是用一句命令行就能完成上
面的功能。
du -s | sort -nr > HOMEspace_report.txt
命令行有它的存在价值吧。还有把 Linux 桌面操作录制成一段视频,想起来
就是一件复杂的任务,在Linux上用一句命令就能轻松搞定。
ffmpeg -f x11grab -s wxga -r 25 -i :0.0 -sameq tmpout.mpg
卖个关子,这个命令会在第18章作详细解释。
估计你可能会迫不及待地想要实验一下刚才所提到的命令,但是苦于现在都流
行的图形界面,我们推荐的CentOS默认也进入了图形界面,看来要想做点实验还是
有点难度的。不过不用着急,Linux的老手们一定是要命令行的,所以想通过键盘输
入命令,一个合格的Linux发行版一定会做得十分方便,只是要先搞清楚一些概念。
1.4.1 开始执行命令
用户和系统不是直接打交道的,它们中间有个名字叫shell的联系人。我们从键
盘中输入命令给shell,shell再把它交给操作系统去执行。从哪里开始输入命令呢?当然你可以在字符界面输入命令(暂时先放放,稍后
再看)。Linux系统还提供一个叫终端模拟器的程序。这个程序打开一个窗口,让我
们与shell交流。Linux系统上的各种软件向来是百花齐放,模拟器终端也不例外,例如gnome-terminal、konsole、xterm、rxvt、kvt、nxterm和eterm等,而大
多数Linux发行版会同时支持几种。
使用过Windows操作系统的人,在登录Linux桌面系统后,应该也能轻松地从菜
单中选择启动终端的图标,点击就可以进入终端模拟器。当然你也可以在文件浏览
器中找到叫“konsole”(KDE桌面)或“gnome-terminal”(GNOME桌面)的程序
双击执行以打开终端窗口。更有意思的是你可以打开任意多个窗口,每个窗口给你
一个shell会话。你从中选择了一个窗口开始尝试输入这个命令:
cp etcresolv.conf etcresolv.conf.bak
cp: cannot create regular file 'etcresolv.conf.bak': Permission denied
太欺负人了吧,这么简单的命令都不让偶用。
你注意到没有,shell命令提示符是,这意味着什么?这意味着你是普通用
户,不是超级用户,你没有管理员权限。如果你是拥有管理员权限的root用户,提
示符就变成,你就可以在系统上做增加、删除和修改文件的操作。
1.4.2 文本和图形的切换
方才我们介绍的方法是目前最常用的在桌面环境下执行命令的方法,但是也有
很多有“洁癖”的人喜欢使用纯粹的文本终端,这就需要进行图形和文本切换了,或者干脆就关闭图形界面。我们先搞定前者,后者会在后面的章节做十分详细的介
绍。
要在文本和图形界面之间来回切换非常简单,只需要使用快捷键
Linux发行版会有不同的设定,所以本书就不好做定论。一般
表图形界面,而剩下的5组快捷键对应5个不同的文本终端,我们推荐的CentOS就是
这种设定。还有的设定是
的文本终端。一般不建议使用这种方法来操作Linux,除非你有强烈的“洁癖”或遇到有“洁
癖”的系统管理员。因为这种方法你能够使用到的独立文本终端最多只有6个。而前
面介绍的在图形界面中使用终端模拟器的方法,则没有文本终端数量的限制。对于
一个Linux老手来讲,文本终端永远都是多多益善的。很快你们就会有这种感觉了。
1.4.3 基础命令的操作
提及Linux基本命令,先给你讲述一个浪漫的故事。
曾经有个男孩很喜欢一个女孩,可是不敢表白。他想了一个办法,在Linux终端
上输入:
echo “这周六下午2:30,能在如嘉咖啡馆一起喝咖啡吗?” > love.txt
然后回车。接着他找来那张他喜欢的鼓浪屿图片(pic.png),使用命令:
cat pic.png love.txt > pic1.png
重新做了一个图片文件。他鼓起勇气给那个女孩写了封邮件,邮件内容只是:
请查阅附件。
女孩收到邮件,用图片浏览器打开后,看到的只是一张美丽的风景图片,有点
纳闷。但是聪明的她,立刻猜到了那个男孩的用意。她用tail pic1.png,很快发
现了秘密。
tail pic1.png
PNG
IHDRm?tEXtSoftwareAdobe ImageReadyq?
[图片编码内容,一般人无法直接读懂……])'EDDD□□□q□□q^□cDDD□□GDDDDm□y□w□}!“这周六下午2:30,能在
如嘉咖啡馆一起喝咖啡吗?”太妙了,原来学好Linux通过Linux基础命令还可以交女朋友。(用这法注定孤
独一生)加大马力,我们来认识更多的命令吧。不过我们会遇到一个问题,Linux
命令太多了,至少有200多个,怎么记呀。其实谁也记不住这么多命令,剥茧抽丝抓
重点,把重要的和经常使用的搞定了就行。按照它们在系统中所起的作用,我简单
地做了一下分类说明,更为详细的下章还有。见表1-1的内容。
表 1-1
命令 说明
目录和文件处理
mkdir
建立目录
用法:mkdir [OPTION] DIRECTORY...
例: mkdir fangru
ls
列出目录下的内容
用法:ls [OPTION]...[FILE]...
例: ls -al fangru
cd
更换工作目录
用法:cd [DIRECTORY]
例: cd fangru
pwd
显示当前工作目录
用法:pwd
cp
拷贝文件及其目录
用法:cp [OPTION]… SOURCE DEST
例: cp jie.txt jie.bak
mv
移动(重命名)文件
用法:mv [OPTION]…SOURCE DEST
例: mv jieold jienew
rm
删除文件或目录
用法:rm [OPTION]…FILE…
例: rm -rf jie_dir
文本处理
cat
连结文件打印到标准输出
用法:cat [OPTION] [FILE]…
例:cat pic.png love.txt > pic1.png
还记得那个命令行的故事吧?这个命令也常被用来查看小文件的内容
more
查看文件内容,当画面在显示满一页的时候暂停,按空格继续或按Q结束
用法:more [OPTIONS] FILE例: more etcgroup
less
与more类似,但是less允许利用光标键上下卷动文本内容进行浏览
用法: less [OPTIONS] FILE
head
查看文件头部内容
用法:head [OPTION]… [FILE] …
例: head etcgroup
tail
查看文件尾部内容
用法:tail [OPTION] … [FILE] …
例:tail etcgroup
比较常用的一个命令选项是-f,它可以用于跟随文件的增长,显示文件的最新内容。对于
在线监控软件日志非常有帮助
echo
显示一行文本
用法:echo [OPTION] [string]
例:echo HOME
系统管理
ps
强悍的进程查看命令
用法:ps [OPTION]
例:ps –aef
kill
删除执行中的程序或工作
用法:kill [OPTION]
例:kill -9 3154
jobs
通过jobs命令查到后台正在执行的命令的序号(非进程号pid)
用法:jobs
bg
指定号码(非进程号)的命令进程放到后台运行
用法:输入'ctrl+z' 然后输入 'bg'
例:bg
fg
指定号码(非进程号)的命令进程放到前台运行
用法:fg
文件系统
du
查看目录或文件所占用磁盘空间的大小
用法:du [OPTION]……[FILE]……
例:du
df
检查文件系统的磁盘空间占用情况。
用法:df [OPTION]……[FILE]……
例:df
1.4.4 快捷键有位童鞋正在Linux系统上开发一个中文相似度匹配的项目,工作相当努力,已
经达到了废寝忘食的地步,但是使用的TF-IDF 算法的计算速度还是不尽人意。这时
候,他决定先停一停,换换思路,玩玩俄罗斯方块放松一下。突然老板走过来,他
下意识地使用
游戏,否则又需要一大堆的解释。老板拍了拍他的肩膀走了过去,随后他用
TF-IDF(term frequency-inverse document frequency)是一种用于信息检索与数据挖掘的常用加
权技术。TF-IDF是一种统计方法,用以评估一个字词对于文件集或语料库中的一份文件的重要程度。
举这个好玩的例子可不是让你照着做,而是为了告诉你Linux系统提供了很多快
捷键提高命令行使用的工作效率,减少键盘的敲打以及拼写错误。说几个比较实用
的快捷键,见表1-2所示,其他的你自己去挖掘。
表 1-2
常用快捷键 说明
在文本终端下,使用TAB自动完成命令的输入,或者显示所有的可选
项。超好用!
滚动文本终端输出。终端屏幕上一屏又一屏的提示信息,就可以用它
向上翻滚查看这些信息
文本终端下关机和重新启动
关闭或重启X Window
5
5
把当前屏幕的快照存到剪贴板
动补齐命令名和文件名。可是我们追求的目标是“更快、更高、更强”,那就安装
bash-completion做个增强版的自动补齐吧。使用TAB键自动补齐几乎任何内容,包括参数、文件、目录甚至包名称等。安装方法很简单,下载到的包中包含一个
bash_completion文件,将其放在etc下。在etcbash.bashrc文件里加入可执
行命令(这个操作需要root权限)。
Run bash completion code
if [ -r etcbash_completion ]; then
Source completion code.
. etcbash_completion
fi
1. 更快……
举个例子。淘宝的预发环境中的Linux机器不允许直接登录。需要申请跳板机,通过跳板机才能登录预发机。在跳板机上,我们经常使用ssh 10.232.15.201操作
命令,好麻烦呀。在etchosts中我们加入一行“10.232.15.201
prerelease”。
然后我们使用complete -F _known_hosts ssh告诉ssh需要的主机名。一旦
设置好了,我就可以通过敲[TAB]键完成主机名的输入:ssh p[TAB]。
另外你还可以定制私有命令的补齐功能,不过你需要自己编写shell脚本实现,然后把这个脚本放在etcbash_completion.d下。在随后的章节,我们会学习
shell脚本的编程。在学完之后,希望你会通过编写脚本产生自己的补齐功能。
2. 更高……
有的命令太长,那就把命令缩短。命令别名(alias)就起到这个作用。例如在
SUSE版本中有个命令别名的文件(etcprofile.dalias.bash)。它里面定义
了许多命令别名,例如alias ..='cd ..', 那么在终端上输入“..”就相当于输
入了“cd ..”直接回到上级目录,方便不?3. 更强……
在shell终端上还可以一下子运行多个命令,只需要用分号“;”把各个命令串
起来就行:
[命令1];[命令2];[命令3]
不管执行的命令结果如何,就是勇往直前地冲呀杀呀,把这些命令最终执行
掉。但是有时候,这些命令之间是有关联的,就需要改改这种傻愣愣的工作方式。
我们可以用“”把命令连接起来,只有前一个命令执行成功才执行下一个命令:
[命令1][命令2][命令3]
如果需要等前一个命令执行失败才执行下一个命令,则要使用“||”把命令连
接起来:
[命令1]||[命令2]||[命令3]
哎,使用命令行的技巧还真不少,我们可以考虑出版一本专门讲述Linux命令行
的参考书了:)
1.4.5 错误信息
%boast
bash: fg: %boast: No such job.
当命令执行成功的时候终端屏幕上不显示任何信息,但是当发生错误的时候它
经常会以一定的形式汇报错误。上面我开了一个关于Linux错误信息提示的玩笑。
boast是吹牛的意思。我在终端上敲入“%boast”后,终端返回错误提示“No
such job”,意思是没有这样的工作。不同的命令返回的错误信息格式有所不同,但是经常有如下格式:
命令名: 执行内容: 错误信息
例如: rm jie
给出的错误返回是:
rm: cannot remove 'jie': No such file or directory.
那究竟发生了什么情况?当rm命令要删除jie这个文件,jie这个文件不存在,产生了代号为2的错误。这个错误代号的意思就是找不到相应的文件或目录。错误代
码就被自动翻译成No such file or directory。由于错误代码有限(大约有一百
多种),有可能许多不同问题对应于同一个错误代码,所以理解要执行的命令和错
误信息的关系很重要。得到错误信息,让我欢喜让我忧,喜的是知道发生什么样的
错误,忧的是对错误信息有可能百思不得其解,不知道如何去解决,这时候就得凭
经验了。
errno.h包含一个完整的基本错误代码列表。除此之外,其他一些头文件
(.h)也定义了自己的一些错误代码。代码1列出了系统定义的所有错误代码及错误
描述。
代码1:
include
include
include
int main(int argc, char argv) {
int i = 0;
for(i = 0; i< 256; i++)
printf(errno.%02d is: %s\n, i, strerror(i));
return 0;
}
编译此程序用命令:
gcc -Wall strerror.c
执行程序:.a.out
这个程序的输出有点长,所以就不去浪费纸张了,你自己在电脑上看吧。
1.4.6 联机帮助——man很靠谱
遇到问题寻找帮助能加快解决问题的速度。在Linux系统上,有以下几个途径可
以获得帮助:
1. 遇到问题,男人(man,其实是“手册”的简称)的帮助很靠谱。需要某个
命令或者配置文件的帮助,就在终端输入:
man 命令名
或
man 配置文件
屏幕就会显示对应命令系统的帮助手册。输入“q”退出帮助浏览器。
2. info 和 man 功能相似,但是包含更多的最新信息。
3. 使用“命令名 –help”得到一个简略容易消化的命令帮助。
4. 程序自带README文件或者其他帮助信息文件,例如在usrsharedoc下
的一些手册。
如何在man页中查找信息呢?浏览man页默认的工具是less。less的使用方法很
简单。翻页用Space,查找用反斜杠“”紧跟着正则表达式,用n查找下一个匹配
项,用Shift+n查找前一个匹配项。如果这页里没有你感兴趣的,按Space翻到下
页。更多的操作还是man一下less文档吧。
很多命令的man帮助页中涉及shell命令、系统调用和编程接口等多方面,而这
些内容很可能会拥有相同的名字。例如“printf”,它既是shell命令,又是库函
数。为了能够精确找到你需要的帮助信息,人们为它们进行了分类编号。比如3代表库函数,我们要使用这样的命令才能找到库函数printf的帮助信息:
man 3 printf
否则的话,你得到的帮助信息是shell命令printf的帮助信息。可是man对帮助
信息做了哪些分类,分别都用什么编号来代表的呢?这个问题我们不用管,第3章再
说。当前为了解决这种分类问题我们有一个折中的办法,就是使用“-a”命令选
项,它会把所有跟你给定的命令名有关的帮助信息都列出来。例如:
man -a printf
慢慢看吧,如果觉得当前的信息不是你需要的,按“q”之后会显示另外一个分
类的信息,直到找到自己需要的为止。当然,有些时候你可能一无所获,最大的可
能就是你记错了关键字。
还有,帮助信息中的“SEE ALSO”经常是被遗忘的角落,但是我经常会在这里
发现其他有用的命令或库函数,千万不要放过它。
1.4.7 致命的Linux命令
别以为我是在开玩笑。有些Linux命令轻则造成数据丢失,重则导致系统瘫痪。
你看这位同学漫不经心,以root身份敲入了rm -rf ,强制删除 目录下的所有
文件,这代价可是很惨痛的(相当于系统自杀)。
还有一个很好玩的例子,我用旺旺聊天的形式给你讲述:
小雪2012-08-25 15:28:10: 在你Linux系统上输入这串东西:{ :|:
};:
灰猫2012-08-25 15:28:34: 长得这么怪?
小雪2012-08-25 15:28:41: 试试看看是什么结果。谢了。
灰猫2012-08-25 15:28:44: 不好了。终端一直出现下面的提示:-bash: fork: retry: Resource temporarily unavailable
-bash: fork: retry: Resource temporarily unavailable
-bash: fork: retry: Resource temporarily unavailable
-bash: fork: retry: Resource temporarily unavailable
-bash: fork: retry: Resource temporarily unavailable
-bash: fork: retry: Resource temporarily unavailable
-bash: fork: retry: Resource temporarily unavailable
-bash: fork: retry: Resource temporarily unavailable
-bash: fork: retry: Resource temporarily unavailable
很惨啊。
小雪2012-08-25 15:29:02: 哈哈,真的很惨。
灰猫2012-08-25 15:29:21: Ctrl+C都是不管用的。
小雪2012-08-25 15:29:21: 即便退出这个终端也是没有用的。
灰猫2012-08-25 15:29:31: 最后全都是这个。-bash: pipe error:
Cannot allocate memory -bash: pipe error: Cannot allocate memory
root用户搞不定,因为killall的速度受到了影响,只能重启机器了。
小雪2012-08-25 15:30:15:这就是著名fork炸弹。看来危害不小。
灰猫2012-08-25 15:30:34:别幸灾乐祸了。能告诉我什么原理吗?
小雪2012-08-25 15:31:43:把:{ :|: };写成下面格式你就看懂了
:
{
:|:
};
:
灰猫2012-08-25 15:32:13: 明白了。“:”函数里面定义操作是后台执
行“:”函数重定向到“:”函数,“:”函数的递归调用。小雪2012-08-25 15:32:15: 是滴。系统执行海量的进程直到死亡。
灰猫2012-08-25 15:32:43: 这样的代码不好分析,主要是因为不清
楚“:”是可以做为函数名的。
小雪2012-08-25 15:33:12: Quite right。另外为了防止这个问题的出
现,要限制赋予root权限的用户数量以及单用户的进程数。
灰猫2012-08-25 15:34:12: 哈哈。是的,拥有root权限的用户操作不慎很
容易给系统造成破坏。
故事还没有结束。如何限制用户的进程数呢?我们可以
在etcsecuritylimits.conf文件末尾加入一行:
hard nproc 200
限制用户的进程数为200,但root用户不会受这个限制。
这个命令行还涉及shell脚本编程,我们将在后面的章节来学习。1.5 结束语
我们的第一次亲密接触到此该告一段落了。如果Linux长什么样你依然不知道,那真的实在是抱歉,你太懒了。如果你要问我学习Linux的捷径是什么,我的答案就
是两个字:勤劳。一定要勤动手,才能学好Linux。
Linux与Windows是完全不同的操作系统,拥有着独特的风采和特性。虽然我们
对Linux远不如像Windows那样熟悉和亲切,但是通过本章的亲密接触,或许能够让
你体会到一点Linux所特有的那种“笨拙”的温柔。只要那么一点点就足够了,我想
那已经足够提起你的欲望了。
接下来,我们将会从多个方面、多个角度以及多个层次,与大家共同去探索
Linux到底是什么。
第 2 章 融于心而表于行
时间总是过得那么快,如流水一般哗啦啦地就淌走了一大堆!周遭事事沧桑变
迁,喧哗或耳语中流传的故事已渐模糊,转眼间2014就来了。泰坦尼克号撞冰山都
100+年了,同名的电影也改成3D的了,只是你想看的全都给剪没啦。如果你是未来
的考古学家,我可以自豪地告诉你,我们这个年代电脑早就飞进了平常百姓家。
千万不要以为我在闲扯,Linux与泰坦尼克号这个倒霉蛋是有着千丝万缕的联系
的。具体有什么联系,咱们按下不表,在后面的章节中还会有十分精彩的描述。
很多人会认为Linux是一个年轻的操作系统,至少我本人在很长一段时间内都是
这么认为的。因为它总能紧跟时代潮流,别人有什么它有什么,USB、WiFi、SSD……
突然发现,原来岁月是最大的小偷,在我不经意间,将我的很多东西都已经悄
悄地偷走,青春、激情、自信……我使用Linux已经超过了十五年,而且到本书截稿
时,Linux已经整整22周岁了。
对于计算机产业这个新技术日新月异的行当来说,拥有22年历史且在操作上没
有什么变化的系统不能不算老旧。可是Linux并不是原创,亦或我们说Linux“抄
袭”了别人也不算过分。而正是因为它“抄袭”的对象——Unix更是足够
Niubility的,所以Linux也被称之为类Unix系统。
Unix自1969年诞生至今,已经40多年的历史了。然而,其基本的操作方式和一
些理论基础并没有太大改变,而且最终形成一个强大的Unix文化(本书后面的章节
将做详细介绍)。Linux将这股文化深深地融入到了自己的内心深处,也使得它的很
多行为表现与那个40年前所诞生的系统没有太大差别。
是的,融于心而表于行,这也正是本章的主题。Linux的用法实际上已经超越了
其自身的生命周期,几乎可以说是演绎在现代科技世界中的一部穿越大戏。跟我回
到你出生之前吧!先说明,接下来的所有内容都是基于文本命令行的,图形界面下
如何操作是显而易见的,我们再啰嗦就低估了大家的智商。2.1 多用户多任务分时操作系统
世界上第一台电脑是没有操作系统的,主要是因为太慢而运行不了。由于晶体
管的发明和微程序概念的应用,使得电脑从机械装置变成了真正的电子产品。这
样,系统管理工具和简化硬件操作流程的程序很快就出现了,这成为操作系统的滥
觞。随着电脑速度的提升,充分利用计算资源这种“节能减排”的需求呼之欲出,很快就有了批处理操作系统。但是批处理问题很多,提交的任务不再受到控制,这
显然会让很多人十分恼火。如何能够让人与电脑直接互动又可以“节能减排”,成
为了那个年代的热门话题,那大约是在20世纪60年代初。
很快就有新证据证明人类是这个星球上最聪明的生物,因为有人(具体是谁搞
不清了)提出了分时系统的概念:将大型电脑珍贵的时间资源适当分配在所有使用
者的身上,让所有使用者都有独占整部机器的感觉。依据这个想法,通用电气、麻
省理工学院和贝尔实验室合伙搞起了Multics项目,这是在当时看来最靠谱的分时
系统概念。但是由于太“靠谱”了(真正的多用户多任务分时操作系统),在当时
的技术条件下去完成它实在是吃力,所以最终的命运很悲惨。但是有两个游戏爱好
者,Multics项目的成员Ken Thompson和Dennis Ritchie为了能够有电脑玩游
戏,决定自己给一台闲置的电脑写个操作系统,于是,Unix——一个实用的多用户
多任务分时操作系统——就诞生了(就因为这个故事,我始终保持着经常打游戏的
好习惯)。
我们熟知的Windows XP、Linux、Mac OS X等都是多用户多任务分时操作系
统,可见这个概念一直延续到了今天。它们最显著的特点就是可以让多个人使用同
一台电脑而且不能互相窥探对方的秘密。当你使用电脑的时候可以边听音乐边看新
闻,同时还能跟朋友聊天。只要你觉得你的大脑还能处理得过来,你还能让这台电
脑同时干更多的事情。其实这类操作系统我们完全可以只用“分时”二字简要概述
下来。因为“分时”就像它最初的定义那样:将电脑的时间资源适当分配给所有使
用者身上,让所有使用者有独占机器的感觉。但是如果把“使用者”进行抽象,就
不仅可以代表人,还可以将任务也理解为电脑时间资源的使用者,那么“分时”就
是多用户和多任务的基础和前提。所以,既然是“分时”的,一般都会支持多用户
和多任务。需要注意,我只是说一般都会支持多用户和多任务。为什么呢?因为对于一个
分时系统,支持多任务是其与生俱来的本质,但是如果要支持多用户,则还需要很
多附加的条件,最大的一个问题就是用户的身份问题。要确定哪些用户能够执行何
种操作,这样才能保证系统运行稳定和可靠。只有有效地管理好用户的身份,才能
被称为是多用户的。Linux在这方面的能力是毋庸质疑的,从其诞生的那一天起就是
多用户的,所以它拥有非常良好的用户身份确认机制。Windows其实也具备这样的
能力,某些版本甚至做得比Linux还要好,只是大多数用户都没注意到这个问题。所
以系统读过本书的人如果还需要继续使用Windows,那么请重新考虑你的Windows用
户问题。
一个多用户操作系统,有些时候提供单用户模式是非常必要的。这个主要是在
系统发生故障时,进行故障修复时使用的。所谓单用户模式,就是操作系统不去确
认用户的身份,可以直接让用户进行各种操作。但是有的人可能会担心安全问题,这就像得病后需要吃药一样,都知道是药三分毒,可是病了还得吃,只能是两害相
权取其轻。能够有办法找回数据在大多数时候与冒点安全风险相比要重要得多。2.2 用户的身份
既然Linux从诞生的那一天起就是多用户的,足可见多用户管理是Linux一项多
么重要的功能构成。那么它都管理一些什么呢?简单来说就是管理用户的等级和用
户对文件的访问权。
Linux下的用户等级实际上是非常简单的,就两个等级——root和非root。
root用户在Linux下是拥有至高无上的权利的,也就是说它可以胡作非为。但是比
较幸运的是,只有一个用户是root,它的用户名就是root。而非root用户的权利是
严格受限的,只能访问由root规定的文件。为了比较形象地说明Linux用户的管理
模式,我们提出了这样一个模型……
2.2.1 澡堂子模型
我们把Linux的用户管理方式比喻成一个澡堂子模型,因为这非常形象。所有非
root用户,都只是这个澡堂子的顾客;root用户则是这个澡堂子的服务生;Linux
系统就是这个大澡堂子了(科普一下,人家现在叫洗浴中心)。
去过澡堂子的人都知道,一进门就会有服务生接待你,让你登记并发给你一个
带有号牌的钥匙。这个过程跟root用户给其他用户分配账号是一个道理。登记是向
系统中添加新用户,钥匙是给你登录系统的密码,而号牌上的号码就是你的用户
名。
当你获得钥匙之后,就可以进入更衣室了。女性更衣室什么样我不太清楚,但
是男性的更衣室一般都会有几组大柜子。每个大柜子又由n多的小柜子组成,其中有
一个小柜子是属于你的。怎么找到属于你的柜子呢?看柜子上面的号码!这个号码
与你钥匙号牌上的号码是一致的。你肯定能用这把钥匙打开它,至于能不能打开别
人的柜子我没试过。
这个过程跟我们登录Linux系统的过程十分相似。正确登录后,我们就会拥有一
个自己的文件目录,这个目录一般是home[username],后面的[username]与你
的用户名相同。一般称这个目录为home目录。更衣室的箱子就是你的home目录,里
面可以放入一些你的私人物品,可以保证别人偷不走。当你一切准备就绪,就可以开始沐浴了。但是一般都是一个很大的池子,放屁
撒尿的都有。如果你嫌脏,可以要一个单间,不过需要的花费也是不菲的。这与我
们正常使用Linux系统的道理差不多。只要离开你的home目录,就进入了公共区
间。一般都是只读的,但有少数的位置是能够写入数据的,比如tmp目录。对于这
些可写的地方就需要素质了,无论你是放屁还是撒尿,别人即便看到了也没办法。
但是如果你实在忍受不了别人这样,你可以自己单独使用一台Linux系统,这个花费
也的确是不小的。
即便是在这种轻松的地方,也总是会有倒霉蛋的。我就见过有人把更衣室的那
把钥匙弄丢的。一般这个很麻烦,因为衣物什么的都是锁在你专有的箱子里的,如
果不想让别人偷走,那你在没有钥匙的时候,也应该无法打开(用蛮力,而且别人
不会叫警察除外)。当然,如果你就此竟自离开,我也无言以对;但如果你一筹莫
展,我就告诉你有人能救你。那就是先前给你钥匙的那个服务生。因为他有一把特
别的钥匙,能够打开柜子的后门。其实每一组柜子都有一个大后门,只是服务生是
不会当着你面打开它的。他们会问你都有什么东西,在哪个柜子里。你只要如实描
述,一般都会把东西还给你的。这种情况跟普通用户在使用Linux的过程中忘记了自
己的密码有些类似。只要向root用户申请,就能够变更新的密码。
Linux的用户管理跟这个例子基本上就是差不多的,只是粒度更加细腻一些。如
果你能够理解这个澡堂子模型,那么接下来的内容就很容易理解了,只是它们看起
来更加专业一点罢了。
2.2.2 理解用户角色
由于Linux是一个地道的多用户操作系统,所以对于能在Linux系统中添加n多
的用户一点都不必感到奇怪。至于能添加多少,答案是232-1个。只要你硬盘足够
大,你真想将这么多人名填进你的电脑也没人反对,前提是你真有那么大的耐心并
且还能搞到名册。如果你的朋友或同事想使用你的计算机,而你又不想让他们在不
经意间窥探到你的小秘密,很方便,键盘敲敲打打就能添加一个新用户给他。随便
他折腾,你几乎不用担心有“艳照门”发生在你身上。
当然,对用户这个概念的理解还不能仅限于字面含义。在Linux系统中还有一些
用户是用来完成特定任务的,比如nobody、admin、ftp等。需要注意,在Linux中不管用户名有多么NB,只要不是root,它就一定是普通用户,权利大小都是相同
的。很多资料上说的所谓用户角色的那些概念,尤其是说角色不同权限不同的观点
不是十分精准,很容易造成Linux用户有权限大小的印象。其实所谓的权限,则是不
同的用户所能访问的文件不同而产生的一种假象。而这种假象又不是单独一个用户
的概念能够决定的,还要用到用户组的概念。
什么是用户组呢?可以把它理解为用户的职业。澡堂子里除了客人之外,还有
搓澡的、推背的、揉脚的、烧水的、扫地的……等好多的职业。客人也有职业,但是
没人会问,也没人敢问,所以干脆就都叫客人了。Linux中也是这种情况,比如
nobody、admin、ftp也会有相应的职业,也就是用户组。只是比较巧合的是用户名
和组名相同了。一个人是可以身兼多职的,这个特点放在Linux用户身上也是允许
的,即一个用户可以属于多个用户组。而且还要注意,一个用户至少应该属于一个
用户组。
由于用户组能够在更高的层面来抽象用户所能够访问文件的数量,所以结合不
同的用户组,就能够给每个用户构建出独一无二的文件访问列表,而且不同的用户
之间还能做到交错纵横,有条不紊。在用户之间的协作上和隐私的保护上达到了一
个良好的平衡。这才是用户角色存在的真实目的所在。
虽然用户角色不能跟权限靠上关系,但不同的角色有些时候还是有待遇差别
的。所谓的待遇就是是否拥有密码、home目录以及shell(后面的章节会详细介
绍)这些资源。有些用户的主要任务就是运行某些服务程序以确保安全性的,比如
nobody用户就可以用于Nginx 的工作进程。对于这类的用户一般是不分配密码和
shell 的,甚至home目录也没有。为什么这样做呢?
Nginx是一个高性能的HTTP和反向代理服务器,也是一个IMAPPOP3SMTP代理服务器。它以极强的稳定
性、丰富的功能集、极低的系统资源消耗、灵活多变的配置文件而闻名。
严格说还是分配shell了的,只是分配的是sbinnologin这个特殊的shell,从其命名上看就是阻止你
登录,实际上就是没有任何功能的shell(也可能显示几行声明文字)。
首先,可能会有很多服务程序默认使用这个用户,如果设置了密码,程序就无
法自动使用了;其次,因为不会有人使用这个用户登录系统,也就没有必要分配一
个shell给它,私密的home目录也有些多余。
不设置shell和home目录好理解,但是不设置密码不会引发安全问题吗?答案
1
2
1
2是否定的。
首先,我们一开始就强调,除了root之外,其他用户的权限都一样且非常小;
其次,不同的用户所能访问到的文件是有限制的,而且再加上用户组的限制,这类
用户能够访问的文件进一步受限(具体的内容我们后面在文件管理部分会有更详细
的介绍)。所以,即便不提供密码,使用这类用户登录了系统,也不会对系统的安
全造成严重的威胁。
前面列举的nobody、admin、ftp等都是比较常见的。还有一些差不多这样的用
户或组根本就不是拿来用的,完全是用来占坑的,主要目的是为了兼容。你的系统
中拥有哪些用户和组可以通过查看etcpasswd和etcgroup文件看到,你会发现
真正在用的没几个。
2.2.3 etcpasswd文件查看用户
从这个文件名上看,应该是跟密码有关。的确是这样,只是那已经成为历史
了。现在保存密码的文件是etcshadow,也就是传说中的影子文件,在后面我们
还要详细介绍它。现在我们只需要关心etcpasswd文件,它是用来存放用户基本
信息的。这个文件的部分内容如下:
root:x:0:0:root:root:binbash
bin:x:1:1:bin:bin:sbinnologin
daemon:x:2:2:daemon:sbin:sbinnologin
adm:x:3:4:adm:varadm:sbinnologin
lp:x:4:7:lp:varspoollpd:sbinnologin
sync:x:5:0:sync:sbin:binsync
shutdown:x:6:0:shutdown:sbin:sbinshutdown
halt:x:7:0:halt:sbin:sbinhalt
mail:x:8:12:mail:varspoolmail:sbinnologin
uucp:x:10:14:uucp:varspooluucp:sbinnologin
operator:x:11:0:operator:root:sbinnologin
games:x:12:100:games:usrgames:sbinnologin
gopher:x:13:30:gopher:vargopher:sbinnologin
ftp:x:14:50:FTP User:varftp:sbinnologin
nobody:x:99:99:Nobody::sbinnologin……
pulse:x:497:494:PulseAudio System Daemon:varrunpulse:sbinnologin
gdm:x:42:42::varlibgdm:sbinnologinsshd:x:74:74:Privilege-separated SSH:varemptysshd:sbinnologin
tcpdump:x:72:72:::sbinnologin
jagen:x:500:500:jagen Zhao:homejagen:binbash
文件的每一个行都代表一个用户。换句话说,这个文件有几行你的系统中就拥
有几个用户。每一行由冒号“:”分割成7个字段,其结构如下所示:
用户名:密码:UID:GID:用户全名:home目录:shell
前面所述的那些用户的“待遇”已经全都包含了。比较搞笑的是“密码”字
段,虽然是这么叫的,但是真的没有密码放在这里,有的只是一个字母“x”。
这个文件中比较重要的是UID(User ID)和GID(Group ID),无论是用户还
是用户组,Linux只靠它们来识别。没有人敢说电脑是不识数的,其实它是只认数不
认人的,所以UID和GID都只是一个数字。为了区别不同的用户或用户组,需要保持
它们自身在系统中的唯一性。UID和GID是可以相同的,因为它们代表的是不同的概
念。都为0的UID和GID是Linux系统中比较特殊的,它们分配给root用户和root用
户组。UID和GID是可以通过程序获取的,所以可以通过这个特殊的值来判断是否能
够胡作非为。
虽然系统只区别0和非零的UID或GID,但是在使用习惯上还是进行了一些分段
的。0自然不用说,就是给root的;1~499是属于系统用户的,比如前面提到的那
些待遇比较差的和一些甚至是占坑的就属于这类;500~4294967295是分配给普通
用户的。所以你会发现,你系统中第一个被添加的用户的UID和GID都是500。
2.2.4 etcgroup文件查看组
跟用户组有关的文件就是etcgroup文件了,也就是etcpasswd中GID的来
源。这个文件的部分内容如下所示:
root:x:0:root
bin:x:1:root,bin,daemon
daemon:x:2:root,bin,daemon
sys:x:3:root,bin,adm
adm:x:4:root,adm,daemon
tty:x:5:disk:x:6:root
lp:x:7:daemon,lp
mem:x:8:
kmem:x:9:
wheel:x:10:root
mail:x:12:mail,postfix
uucp:x:14:uucp
man:x:15:
games:x:20:
gopher:x:30:……
fuse:x:490:
gdm:x:42:
sshd:x:74:
tcpdump:x:72:
slocate:x:21:
jagen:x:500:
与etcpasswd类似,同样是每行代表一个用户组,只是这个文件比较简单,被冒号“:”分割成了四个字段。行结构如下所示:
组名:用户组密码:GID:用户组内的用户名
从etcgroup文件的结构可以看出,不但用户有密码,用户组也是有密码的。
那么用户组密码是做什么用的呢?是给用户组管理员用的。不过目前很少有这个机
会要配置用户组管理员,所以本书也不会介绍这方面的内容。与etcpasswd一
样,组密码是存储在etcgshadow文件中。那么这个字段也就是纯粹的“歪
歪”了,它永远都是“x”。
比较怪异的是“用户组内的用户名”这个字段,因为从上述文件中会发现,有
很多组是没有使用这个字段的。而使用这个字段的,则会使用逗号“,”来分割每个
用户名。那么这个字段到底是什么含义呢?前面我们就说过,一个用户是可以身兼
数职的(多个用户组)。那么,只要用户兼职了这个用户组,它的名字就会出现在
这个字段里。那么那些没有使用这个字段的组呢?很显然,就是没有人兼职呗。但
是没有人兼职,并不代表没有人专职。在etcpasswd文件中,某个用户的GID字段
所代表的就是专职用户组。按照Linux中的术语,这叫“初始用户组”;那些兼职的
用户组,就被叫做“支持用户组”。对于专职的用户来讲,是可以不出现在“用户组内的用户名”的这个字段的。使用groups命令可以查看所有的“支持用户组”,而且在“支持用户组”的列表中第一个出现的那个组还有一个称呼,叫“有效用户
组”。至于什么是“有效用户组”,我们将在后面的有关文件和目录的部分再继续
介绍。
2.2.5 管理用户和组
在澡堂子里,服务员很重要的一项工作就给顾客提供服务,而在Linux中,root用户很重要的一个工作就是管理用户和组。所以在很多时候搓澡的和管系统的
是“同行”。
Linux系统为用户和组的增、删、改提供了一些基本的命令。这些命令的作用机
制就是对etcpasswd和etcgroup这两个文件进行增、删、改来完成的。外加一
个etcshadow文件专门用来管理密码。
Linux中添加一个新的用户,可以使用adduser或useradd命令。在一个系统中
拥有两个长得很像且功能类似但又有少许不同的命令时,肯定会是十分很蛋疼的一
件事,因为你会经常把它们弄混。如果你认同这一点,那么adduser和useradd这两
个命令就不仅是蛋疼了,还有点菊花痒痒。为什么呢?因为它们在不同的发行版下
还有差别。比如,在Ubuntu中adduser是一个脚本,而useradd是一个二进制程
序,前者对后者进行了封装,更加智能。但是在CentOS中adduser和useradd完全
相同,前者只是一个符号连接(后面会讲述符号连接的概念)罢了。本来adduser
和useradd长得就很像,在不同的发行版中还有那么微小的差别,这是多么坑爹的
设计啊!幸好这两个命令不是很常用而且也足够简单,还不至于太坑。
useradd在任何Linux发行版都是一样的,所以我们最好牢记的是它,这样我们
使用的经验累积起来会相对容易一些,本书也以它为例。那么,添加一个新用户最
简单的方法,可以用这样的命令(注意,需要root权限):
useradd jagen
这样名为jagen的用户就添加到系统中了。可能你会问,就这么简单吗?就这么
简单。因为系统已经帮我们设定好了很多的默认值了。这包括:创建一个唯一的UID;添加一个与用户名相同的用户组和一个唯一的GID,并将用户设置为该组;
在home目录下创建一个与用户同名的目录;设置shell为binbash。唯一还没有
设置的就是密码了,使用passwd命令可以做到这一点。
当你在命令行下输入passwd命令之后,系统马上就会提示你输入当前的密码。
只有录入了正确的密码之后,才能进行到下一步。这个过程是看不到有回显的,也
就是说你在录入密码的时候光标是不会有任何反映的,不会有类似图形界面
的“”什么的出现。在文本状态下,所有有关密码的操作都是这样,包括使用文本
界面登录的时候。虽然这种方式不允许我们在输入密码时被打断,但是安全性更
好。
当输入正确的密码之后,就会立即提示输入新的密码,然后还要求再次确认一
遍。只有两次输入的密码一致,新的密码才能被接受。那么下次在使用这个用户登
录的时候,就应该使用新的密码了。
刚才的操作只是能够修改自己的密码,如果是root用户,按照我们的澡堂子模
型,是可以给其他用户修改密码的。只要给passwd命令传递要修改的用户名即可,而且是不需要提示输入当前密码的,直接就能录入新的密码。录入新密码的过程也
需要两次,这是为了保证录入正确性的。如果你不是root用户,也可以尝试这种操
作,得到的结果就是被系统拒绝。你虽然可以挑战Linux的底线,但是Linux绝对不
会给你挑战成功的机会。更复杂的,比如修改密码的时效性等更高级的内容,还有
chage命令。
正所谓“人有失手,马有乱蹄”,人要是不犯错误他她就不是人。所以,很难
保证root在添加新用户的时候不犯点错误,比如名字给弄错了。这个时候能有修正
错误的方法将会是很可爱的事情。正好usermod命令就能干这事儿。实际上usermod
并不是为了弥补错误而提供的,因为修正用户的某些细微的配置参数实际上是更为
常见的操作,比如希望使用一个与众不同的shell。
要删除某个用户,可以使用userdel命令。这个命令相当的简单,希望删掉谁
就把谁的用户名写在它后面就行。如果你是root,userdel命令基本上就是你的判
官笔了,“写谁”谁就消失了。此外,它还有一个“-r”命令选项,把用户的home
目录一同删掉。所以这个命令不但会“杀人”,还会“抄家”。root一定要慎用。
为了避免不必要的误伤,也是不要随便使用root用户的理由之一。至于用户组的管理实际上是跟用户很像的,也拥有差不多相同的命令,差别就
是将“user”这个前缀换成“group”,即groupadd、groupmod和groupdel。此
外还有一个用于管理用户组密码的gpasswd,只是它相当的不常用。
如果你对前面介绍的这些命令还有什么疑问,那就千万不要忘记我们在第1章
中介绍的那个“男人”(man),它能够帮助你了解到全部。后面的内容中所出现的
命令我们也不会太多地去讲述具体用法,我们希望你能养成一个好习惯。
2.2.6 夺面双雄——利用sudo假借身份
尼古拉斯·凯奇是我十分喜爱的一位演员。他主演过一部非常著名的电影《夺面
双雄》。影片讲述了FBI高级探员为了得到杀害自己儿子的凶手口中的重大机密,不
惜和凶手做换脸手术,一切尽在计划中却不料发生了意外,当探员变成魔鬼,而凶
手变成天使的时候,以二者遭遇的特殊身份展开的故事。
Linux的用户在执行某些操作的时候,就需要做个“换脸手术”。只是这个过程
不大会出现什么意外,也不可能有电影情节的那般惊心动魄,更不可能出现什么天
使与魔鬼的转变。但是借用一下身份的事情还是要发生的。借用谁的身份呢?答案
是root的,也就是以root身份来执行某些操作。
很早我们就说过,Linux的用户除了root就是普通用户,而且普通用户的权限
非常低,就连向系统中安装软件的权利都没有。很多时候系统管理员为了能让普通
用户具备一点root的特权,省得用户经常来麻烦他们,就可能赋给用户被称为sudo
的特权。
比如etcshadow文件,由于其特殊性,普通用户是不被允许查看其内容的。
但是拥有sudo特权的用户,可以执行以下命令,查看到这个文件的内容:
sudo cat etcshadow
普通用户一旦拥有sudo的特权,几乎就可以胡作非为了,但是需要付出一点代
价。是什么样的代价呢?也不是很大的代价,就是需要在将要执行的命令前冠上
sudo这个前缀(别忘了空格分割),同时被系统提示要求输入密码。这其实对于我
们大多数用户来说,是不算什么麻烦的。可是对某些不怀好意的一小撮人来说,这个小麻烦或许就会让他们一事无成或彻底打消念头。比如某些流氓软件,想悄悄地
进入你的系统,只要你不使用root用户,它就几乎没有办法,即便你拥有sudo特
权,难道系统莫名其妙地让你输入密码你就不会产生怀疑吗?
但是,你现在可能不能立即验证这个功能,因为你现在所使用的这个用户(非
root)未必具备sudo特权。对于桌面版的Linux发行版,比如Ubuntu、Fedora等,它们的设计理念是个人日常应用,比较偏向赋予普通用户相对较为宽泛的权利,所
以在系统的配置中,会有一类基于普通用户的管理员角色,这类角色的用户会被赋
予sudo特权。所以,如果你选择的是这类发行版,那你在系统安装阶段所添加的用
户,基本都是具备sudo权限的。而对于本书所推荐的CentOS这类企业级发行版,它
们的设计理念是企业应用,强调安全可靠,所以在系统的配置中,除非root用户指
定,否则不会有用户具备sudo特权。
虽然使用sudo之后就可以查看到etcshadow文件里面的内容了。但是你不要
打歪主意,密码是不会明文保存的:)
既然选择了CentOS的人现在无法验证刚才的命令,那么利用root用户让某个普
通用户具备sudo特权,不就可以验证了吗?那我们就开始吧。
给某个用户赋予sudo特权,实际上就是更改etcsudoers文件中的内容。这个
文件比较重要的内容如下所示:……
Allow root to run any commands anywhere
root ALL=(ALL) ALL……
Allows people in group wheel to run all commands
%wheel ALL=(ALL) ALL
Same thing without a password
%wheel ALL=(ALL) NOPASSWD: ALL
Allows members of the users group to mount and unmount the
cdrom as root
%users ALL=sbinmount mntcdrom, sbinumount mntcdrom……
在这个文件中,所有以“”开头的行都是注释内容。所以这个文件里的内容绝大多数都是废话,因为只有一行没有以“”开头。那一行的内容就是:
root ALL=(ALL) ALL
它的含义是说root用户可以使用sudo特权以root权限执行任何命令。显然又是
一句废话,root用户有必要运用它的sudo特权吗?但是学着它的样子,自己添加一
行,比如:
jagen ALL=(ALL) ALL
那么jagen用户就可以使用sudo特权以root权限执行任何命令了。
如果需要赋予sudo特权的用户只有少数那么几个,这样单独授权的方式没有什
么问题。但是Linux还支持另外一种授权方法,那就是下面这行:
%wheel ALL=(ALL) ALL
这一行的作用是让wheel用户组的所有用户默认拥有sudo特权。那么当需要给
某个用户授权时,只要将他她加入到wheel用户组即可。这样就省去了频繁修
改etcsudoer文件的麻烦了,管理起来更加方便。默认情况下,这行是被注释掉
的,如果希望开启这个功能,那么就去掉前面“”吧。
sudo还有另外一个更为霸气的功能,就是在下面这一行中:
%wheel ALL=(ALL) NOPASSWD: ALL
同样是给wheel用户组授权,但是关键的是这个NOPASSWD,可以使得不需要输
入密码即可拥有root权限。这个NOPASSWD并不仅仅作用于用户组,对于我们前面所
说的针对单个用户授权的方法也是有效的。我总感觉这个功能有点危险,所以我是
不建议使用的,元芳,你怎么看?
上面所介绍的这些修改,会让拥有sudo特权的用户能够以root权限执行任何命令,很多时候会觉得这个权限给得太过宽松,显然会威胁到管理员的地位。所以做
必要的限制还是合理的。下面的代码能够满足这一需求:
%users ALL=sbinmount mntcdrom, sbinumount mntcdrom
这一行主要描述了users用户组,可以执行:
sudo mount mntcdrom
sudo unmount mntcdrom
这两个命令,其他的都将被Linux系统拒绝。需要注意,这里一定要写明命令的
完全路径,两个命令之间使用逗号“,”分割。显然一个命令一个命令地写是非常
麻烦的,只允许执行这几个命令也是有悖赋予sudo特权的初衷的。但是别着急,sudo还有另外一种写法,可以是这样:
%users ALL=(ALL) ALL,!usrsbinadduser,!usrsbinuseradd
这一行使得users用户组无法使用sudo特权给系统添加新的用户。关键就是在
叹号“!”这里,它表示禁止使用某些命令。
有关sudo的另外一个比较重要的问题是时间间隔问题。在使用的过程中你会发
现,第一次使用sudo,需要输入密码,但是在短时间内再次使用sudo时,则不被要
求输入密码了。这是sudo的一种人性化设置,因为已经验明正身了就没有必要再去
验证。可是不能总是不让你输入密码。因为当你离开电脑,有人趁此时机可能就会
做一些什么“破坏”,那么所有的坏事可就都落在你的头上了。所以sudo会判断两
次操作的间隔,如果间隔时间在5分钟内,就不提示输入密码,超过了,则需要重新
验证。以便降低你的sudo特权被别人乱用的嫌疑。
即便是作为Linux系统的管理员,也是不推荐长期使用root的,所以大部分的
工作是使用普通用户操作的。根据前面的讲述可以简单地推测,管理员也可以通过
普通用户利用sudo特权来管理整个系统。但是使用sudo特权,必须在每个命令前冠
以sudo,这会给管理员的很多工作造成不必要的麻烦。su命令可以解决这个问题。su命令就是做临时用户切换的,默认是切换到root用户。su在做用户切换的时
候也会提示输入密码,但是与sudo需要输入自己的密码不同,su要求输入目标用户
密码,如果是切换到root,那么要求的是root密码。一旦切换完成,就会将当前的
用户转换成目标用户。如果希望再切换回原始用户,可以使用exit命令。
如果不给su命令任何参数,它切换的用户是root用户,同时不会更改当前所在
的目录。比如说你当前所在的目录是homejagen,那么执行完su后,依然是在这
个目录。当给su命令传递一个“-”参数时,即执行“su -”,则会改变当前目录
到目标用户的home目录,也就是root目录下。
如果使用su命令成功切换到root用户下,那么就可以在不知道密码的情况下,切换到任意用户,比如执行“su jagen -”,就会立即切换到jagen用户下,同时
当前目录变更为homejagen。如果要退回root,执行exit。继续退回到原始用
户,继续执行exit。
由此可见,使用su命令,管理员可以任意切换成任何用户,这给管理员在管理
上面带来了很大的方便。当然,普通用户的所谓隐私,在管理员面前就是完全公开
的了。
顺便说一下,拥有sudo特权的用户,是可以通过执行:
sudo su -
命令,直接使用自己的密码切换成root用户的。原理就是root用户使用su命令
切换到任何用户都不提示密码。这显然是不安全的。为了避免这种问题的发生,应
该在etcsudoers文件中明确禁止su被sudo特权执行。
2.2.7 我是谁?
我是谁?英文即who am I?学过哲学的人立即会想到这是一个十分著名的哲学
问题,但是我相信大多数人想到的是成龙的一部电影,因为百度也是这么想的。当
你看完这本书之后,你还应该知道,这是Linux的命令。
我们需要先做一些准备,请以普通用户登录系统,比如我是jagen。然后执行命
令: whoami
jagen
who am i
jagen pts0 2012-12-12 00:02 (:0.0)
who
jagen tty1 2012-12-12 00:02 (:0)
jagen pts0 2012-12-12 00:02 (:0.0)
接着我们使用su命令切换到root用户下再试一下:
whoami
root
who am i
jagen pts0 2012-12-12 00:02 (:0.0)
who
jagen tty1 2012-12-12 00:02 (:0)
jagen pts0 2012-12-12 00:02 (:0.0)
看出区别来了吗?whoami这个命令的结果是不同的,但是who am i和who这两
个指令却有相同的结果(不知各位怎么样,反正我的脑袋快炸了)。也就是说我们
执行的换脸大法,能骗得过whoami,但是骗不过who am i和who。要解释这背后的
运行机制,需要引入另外两个新的概念——实际用户(UID)和有效用户(EUID,即Effective UID)。
所谓的实际用户是指用户登录时所使用的用户,所以在整个登录会话中,实际
用户是不会发生变化的;而有效用户则是指当前执行操作的用户,这个是能够利用
su或sudo命令进行任意切换的,也就是真正决定权限高低的用户。一般情况下,实
际用户和有效用户是相同的,只有发生用户身份切换的时候,才会出现差异。
既然有实际用户和有效用户的差别,也就会有实际用户组和有效用户组的差
别,毕竟用户和用户之间所属的组有差异是一件十分正常的事情。但是,实际用户
组和有效用户组产生差异并不一定是因为切换用户而导致的,具体触发条件后面再
做介绍。而且实际用户和有效用户出现差别,切换用户并不是唯一的触发机制。其
他的触发机制我们同样会放到后面的内容,因为那时会更容易理解。
那么我们现在再回到“我是谁”这个问题上,为什么要问这个问题?对那些经常需要切换用户的系统管理员来说,搞清楚当前使用的是什么身份的用户是一件不
太容易的事情,毕竟切来切去的换做谁都有可能凌乱;对于某些shell脚本,或许需
要特别的用户才能执行,那么就需要利用whoami这个命令来搞清楚执行它的用户是
谁;还有一些shell脚本可能不太喜欢被人“欺骗”,一定要某个特别用户才能执
行,即便是使用su切换的都不行,那么就需要利用who am i这个命令来确认了。总
之,我是谁,从哪里来,一定得搞清楚。2.3 文件和它与权限的关系
千万不要以为前面所介绍的就是“多用户”的全部因素,毕竟在“澡堂子模
型”中,那些只是人的因素。还有一个十分重要的一项,物的因素还没有出现,也
就是那些柜子跟锁。要是一定得与Linux中具体的事务相对应的话,那就是文件和目
录了。目录和文件在为“多用户”系统中能够形成多个用户和平共处的局面立下了
汗马功劳,同时也为其奠定了坚实的基础。接下来我们就看看它们是怎么回事儿
吧。
2.3.1 目录与文件
Linux的目录与文件组织方式与Windows是有很大不同的。Windows会将不同的
磁盘分区划分为C、D、E、F……等盘,但是在Linux下你找不到。难道Linux不支持
磁盘分区吗?不是,它支持。只是磁盘的管理方式不一样,我们后面会详细讲解
Linux的磁盘管理方式,现在我们要知道的是,Linux的文件组织方式是从“”开
始的一棵树,所以“”也被称为根目录。这与在Windows中将磁盘分成一个区很
像,只是Windows的文件是从“C:\”开始的。
至于什么是目录,什么是文件,这些基本概念我们就不必多说了,相信能够懂
得去学习Linux的人是不会不清楚的。在Linux中查看文件和目录的命令是ls,它会
列出当前目录下的所有目录和文件。但是对于第一次使用Linux命令行的用户,可能
真的会搞不清楚哪个是文件,哪个是目录。因为在Windows命令行下也会遇到类似
这样的困扰。究其原因是很难通过名字看出来目录和文件的区别。虽然从名字上看
不出区别,但是从别的地方能看出来也行,比如在Windows下带有“
行或使用中括号“[ ]”括起来的名称就是目录,其他的则是文件。Linux的方法要
比Windows更高明一些,用颜色区分。一般地,蓝色代表目录,其他颜色代表文
件。其实就通用性来讲,Windows的方法更通用,因为Linux使用颜色来区分,就要
求显示设备必须支持颜色才行。当然,以现代的科技来争论这种通用性是无意义
的,我们很难想像,居然有的显示器不能显示颜色。
其实Linux不仅仅使用颜色来区分文件与目录,还用于区分不同种类的文件。比
如绿色代表可执行文件、青色代表符号连接等。但是这些颜色所代表的文件类型并不一定是这样,具体的还要取决于配置文件etcDIR_COLORS的规定。若想了解如
何修改不同文件类型所对应的颜色,可以请求Linux的那个“男人”来帮忙,具体命
令是:
man dir_colors
通过这个例子可以看出,Linux的联机帮助不仅仅可以查看具体某个命令的使用
方法,还能够查看某个配置文件的配置方法。所以在使用Linux的过程中,一旦遇到
困难,要时刻想到那个能够帮助你的“男人”。
前面说过,Linux使用颜色区分文件类型的方法是有些不太通用的,所以有些极
端的发行版默认就不会提供这种支持,使得很难区分文件和目录。对于这样的系统
则需要给ls命令附加“--color=auto”选项来让它使用颜色来区分文件类型。但是
每次都要附加一个这样复杂的选项,显然会让人不爽。要想像大多数发行版那样,直接ls命令就能够有颜色,可以使用alias命令来创建一个命令别名。具体的命令
如下:
alias ls='ls --color=auto'
这样,执行ls命令,就等同于执行ls --color=auto命令。为了使这个设置永
远都生效,可以将它添加到etcbashrc或home
对所有用户有效,而后者仅对用户
Linux发行版,也是通过这个方式开启的功能。
注意,上述方法仅对Linux有效,如果期望将上述知识移植到FreeBSD这样的老
牌Unix系统也是可行的,只是ls开启颜色功能的命令选项是“-G”,配置颜色的将
不再是配置文件,而是LSCOLORS环境变量 。如果你无法确定,一定要记得使用
man,其他的知识点基本等效。
有关环境变量的内容我们将在后面的章节做介绍。
对于其他一些操作文件和目录的命令,在第1章中就已经有了一些介绍,它们具
体的执行行为本书就不做过多的介绍了,自己亲自实验一下,要比我码再多的文字
3
3都更加有说服力。我懒得写,你懒得看,皆大欢喜!
其实,使用颜色来区分文件类型,有些时候还是比较初级的。而且万一碰到小
概率事件,显示终端偏偏不能显示颜色,那且不是要一筹莫展?没关系,接下来我
们将要动用真家伙了,搞定了这个,你就完全可以出去跟别人神吹一阵了,这也正
是这本书能够诞生的目的之一^_^。
2.3.2 文件属性和权限
这个真家伙就是文件的属性和权限。这里还需要继续“澡堂子模型”,因为文
件的属性和权限与用户身份一起,共同完成了Linux系统的多用户权限控制。
如果要是细究Linux多用户权限控制的本质,实际上就是让不同的用户能够访问
的文件不同罢了。由于root可以访问任何文件,所以就拥有了至高无上的权利。那
么凭什么规定一个用户能访问哪些文件,而又不能访问哪些文件呢?答案是文件自
己说了算!
既然是文件说了算,那么我们就看看文件是怎么做到的。在Linux系统中,每个
文件都会有一个特定的拥有者(一般是创建它的用户)和所属用户组,这是属于它
的固有属性。文件可以利用这两个固有属性来规定它的拥有者或者其所属用户组内
的用户是否拥有对它的访问权利,即读、写和执行的权利。此外,为了提高适应
性,文件还规定了其他不相关人等,也就是第三个固有属性,对它的读、写和执行
的权利。这三个固有属性和三个权利合起来,就构成了文件的针对系统中所有用户
的访问控制,也就形成了Linux的“澡堂子模型”。
其实如果仔细分析,Linux的这种访问控制特性,能够形成“澡堂子模型”也只
是一种特例罢了。因为只要规定了文件针对用户的读、写和执行权利,可以构建任
何模型。但是最终能够形成这个模型却并不是巧合,而是经过精心设计和经历过历
史考验的,这是一种成功的模型,可以继往开来的模型。当然,或许你有一天能够
设计出比现有“澡堂子”更好的模型。有点扯远了,我们还是回过头来继续看看从
什么地方能查看文件的属性和权限来得实际一些。
使用ls命令的-l选项就能查看,如下所示:……-rwxr-xr-x. 1 root root 27776 Apr 17 2012 arch
lrwxrwxrwx. 1 root root 4 Oct 21 00:19 awk -> gawk
-rwxr ......
您现在查看是摘要介绍页, 详见PDF附件(8916KB,1057页)。





