# Linux基础技术笔记

> 作者：zning（https://ning.ae） · 发布：2018/08/28 23:44 下午 (UTC+8) · 原文：https://zning.me/15354710502028.html

最近需要学习一些基础知识，有一些是新东西，有一些是旧东西。这样正好把旧东西系统的整理一遍，然后归纳下。新东西做一做笔记以便以后使用。

> 本文以RHEL\SLES\CentOS为主要运维环境

## Linux系统安装及基本操作

1. Linux中将硬盘、分区等设备均表示为文件：`/dev/sda5`。其中，`/dev/`表示硬件设备文件所在目录，`hd`表示IDE设备，`sd`表示SCSI设备，硬盘序号以`a,b,c,...`为表示，分区序号以`1,2,3,...`为表示。
2. 硬盘和分区的结构
    ![](media/15354710502028/15360438430625.jpg)
	1. PC主机中的第1个SCSI硬盘表示为sda；
	2. SCSI硬盘中的4个主分区可表示为sda1至sda4；
	3. 扩展分区只用于容纳逻辑分区，并不建立文件系统，因此也不能直接向扩展分区中保存文件和目录；
	4. 逻辑分区的编号始终从5开始，因为1～4已经预留给主分区和扩展分区使用；
	5. 由于设备号的限制，使用mbr最多只能有15个分区；
	6. 硬盘的最小单位是512 sector(扇区)，第一个扇区中的前446的byte(字节)是MBR主引导记录，后面的64字节是DPT（磁盘分区表），DPT中的每个分区占用16个字节，所以最多只能4个分区（4 or 3+1）。但现实中4个分区往往不能满足，所以就引用了扩展分区，在扩展分区中就可以新建逻辑分区，而逻辑分区的分区表是存放在扩展分区的空间中的。最后2个字节是Magic Number ，主要检验MBR的有效性。

1. Linux中默认使用的文件系统类型：EXT3，第三代扩展(Extend)文件系统; SWAP，交换文件系统。Linux支持的文件系统类型：FAT16/32、NTFS、XFS、JFS、...
    * EXT3文件系统保持有磁盘存取记录的日志数据，便于数据恢复、保持系统运行的稳定性    
    * 相较Windows系统的NTFS、FAT32等文件系统而言，ext3的读写效率和稳定性、故障恢复性能等要更好一些，特别是对于服务器主机来说    
    * 一般建议将交换分区(swap)的大小设置为物理内存的1.5～2倍，例如对于拥有256MB物理内存的主机，其交换分区的大小建议设置为512MB。如果服务器的物理内存足够大（如8G以上），甚至可以不设置交换分区（虽然不建议这么做）    
    * 而XFS和JFS文件系统多用于商业版本的UNIX操作系统中，具有出色的性能表现

1. YaST（英语：Yet another Setup Tool），它是一套以RPM为基础的操作系统安装与设置工具，也是openSUSE Linux发行版的主要特性之一，而且由Novell派生出商业发行版本。它的特性主要在于，可以设置很多系统的各个部分。它也是United Linux公司的一部分，不过这家公司目前已停止营业。第一套含有YaST的SuSE发行版于1996年5月发行。在GNU通用公共许可证底下，YaST已由Novell制作成一套自由软件。YaST2是一套管理与维护工具，用来管理SUSE Linux安装部分。它允许管理员安装软件、设置硬件、安装网络与服务器，甚至更多。

    命令：`yast`(命令行)和`yast2`(图形界面)

1. 目录结构为树形结构，安装以光盘、U盘引导，以及网络存储器方式。
2. **图形->字符：**Ctrl+Alt+F[1-6]; 
   **VMware环境下：**Ctrl+Alt+Shift+F[1-6]；
   **字符->字符：**Alt+F[1-6]；
   **字符->图形：**Alt+F7
4. 重启 (命令需要root权限执行)：

    ```
    shutdown -r now
    shutdown -r +15 "Warning: System will reboot after 15 mins."
    reboot
    ```

6. 关机 (命令需要root权限执行)：

    ```
    shutdown -h now
    halt
    halt -p
    ```
7. **Ctrl+D：**一个特殊的二进制值，表示EOF，作用相当于在终端中输入exit。

## Linux命令、管理文件与目录

7. **Linux命令的分类：**
    * 内部命令：属于Shell解释器的一部分
    * 外部命令：独立于Shell解释器之外的程序文件

8. **命令格式：**`命令字 [选项] [参数]`。

9. **命令行编辑的几个辅助操作：**
    *     Tab键：自动补齐
    *     反斜杠“\”：强制换行
    *     Ctrl+U：清空至行首
    *     Ctrl+K：清空至行尾
    *     Ctrl+L：清屏
    *     Ctrl+C：取消本次命令编辑

10. **内部命令help：**查看Bash内部命令的帮助信息

11. **命令的“--help” 选项：**适用于大多数外部命令 

12. **使用man命令阅读手册页：**使用“↑”、“↓”方向键滚动文本，使用Page Up和Page Down键翻页，按Q或q键退出阅读环境、按“/”键后查找内容

13. 使用`info`命令阅读信息页

14. **Bash-3.1 中l默认包括56条内部指令：**
    ```
       bash,  :,  ., [, alias, bg, bind, break, builtin, cd, command, compgen,
       complete, continue, declare, dirs, disown, echo,  enable,  eval,  exec,
       exit,  export,  fc,  fg, getopts, hash, help, history, jobs, kill, let,
       local, logout, popd, printf, pushd, pwd, read, readonly,  return,  set,
       shift,  shopt,  source,  suspend,  test,  times,  trap,  type, typeset,
       ulimit, umask, unalias, unset,  wait
    ```

1. `|`**管道：**将前面命令的屏幕输出结果作为后面命令的处理对象（输入）。
2. `>`**重定向输出：**将正常输出结果保存到`>`后指定的文件中。
3. **目录操作命令：**pwd、cd、ls、mkdir、du；
4. **文件操作命令：**touch、file、cp、rm、mv、which、find、ln；
5. **文件内容操作命令：**cat、more、less；head、tail、wc、grep；
6. **归档及压缩命令：**gzip、bzip2、tar；
7. **pwd命令用途：**查看工作目录（Print Working Directory）
8. **cd命令用途：**切换工作目录（Change Directory）格式：cd  [目录位置]
9. **注意：**在Linux系统中，目录属于一种特殊的文件，因此对文件进行操作的许多命令也可以用于目录操作。
10. **绝对路径：**以`/`开始的路径，表示从Linux目录结构的最顶点算起；
11. **相对路径：**不`/`开始的路径，可以相对于当前目录、父目录、其他用户的目录等作为起始点，使用形式如下：1）直接使用文件名/目录名；2）以 “.” 或 “..” 开始的路径；3）以 “~用户名” 的形式开始的路径。
12. cd命令指定短横线“-”作为参数时(`cd -`)，表示切换到前一次（执行cd命令前）所在的工作目录。
13. 命令行如果打错，直接按`Ctrl+C`即可取消（不仅可以终止命令哦~），在下一行重新撰写即可。（好像也进不了history记录中？）
14. **ls命令**
    用途：列表（List）显示目录内容 
    格式：ls  [选项]...  [目录或文件名]
    常用命令选项：
    -l ：以长格式显示
    -a：显示所有子目录和文件的信息，包括隐藏文件
    -d：显示目录本身的属性
    -A：类似于“-a”，但不显示“.”和“..”目录的信息
    -h：以更易读的字节单位（K、M等）显示信息
    -R：递归显示内容
    --color：以颜色区分不同类型文件
    ![](media/15354710502028/15359620734901.jpg)

14. **mkdir命令**
    用途：创建新的目录（Make Directory） 
    格式：mkdir  [-p]  [/路径/]目录名
    * 较常用到的选项为“-p”，该命令用于创建嵌套的多层目录结构
    * 若不使用“-p”选项，则只能在已经存在的目录中创建其他子目录

15. **du命令**
    用途：统计目录及文件的空间占用情况（estimate file space usage）
    格式：du  [选项]...  [目录或文件名]
    常用命令选项：
    -a：统计时包括所有的文件，而不仅仅只统计目录 
    -h：以更易读的字节单位（K、M等）显示信息
    -s：只统计每个参数所占用空间总的大小
    * du命令的“-s”、“-h”选项通常结合在一起使用，以统计指定文件夹总占用空间的大小

16. **touch命令**
    用途：新建空文件，或更新文件时间标记
    格式：touch  文件名…

17. **file命令**
    用途：查看文件类型
    格式：file  文件名…

17. **cp命令**
    用途：复制（Copy）文件或目录
    格式：cp  [选项]...  源文件或目录…  目标文件或目录
    常用命令选项：
    -r：递归复制整个目录树
    -p：保持源文件的属性不变
    -f：强制覆盖目标同名文件或目录
    -i：需要覆盖文件或目录时进行提醒

18. **rm命令**
    用途：删除（Remove）文件或目录
    格式：rm  [选项]...  文件或目录
    常用命令选项：
    -f：强行删除文件或目录，不进行提醒
    -i：删除文件或目录时提醒用户确认
    -r：递归删除整个目录树
    * 使用“rm -rf 目录名”的形式可以不经提示即直接删除整个目录树，应慎用

19. **mv命令**
    用途：移动（Move）文件或目录
    格式：mv  [选项]...  源文件或目录…  目标文件或目录
    * 若如果目标位置与源位置相同，则相当于改名
    * 若需要移动的是多个文件或目录时，则目标必须是目录

20. **which命令**
    用途：查找Linux命令文件并显示所在的位置
    格式：which  命令或程序名
    * 搜索范围由 PATH 环境变量指定
    * 执行“echo $PATH”可以查看PATH变量指定的内容

21. **find命令**
    用途：用于查找文件或目录
    格式：find  [查找范围]  [查找条件]
    常用查找条件：
    -name：按文件名称查找
    -size：按文件大小查找
    -user：按文件属主查找
    -type：按文件类型查找
    * 缺省查找范围时，将使用当前目录作为查找范围
    * find查找工具的相关用法，主要包括：
        1. 按名称查找：关键字为`-name`，根据目标文件的部分名称查找，允许使用“*”及“?”通配符。
        2. 按文件大小查找：关键字为`-size`，根据目标文件的大小进行查找，一般使用“+”、“-”号设置超过或小于指定的大小作为查找条件。常用的容量单位包括k（注意是小写）、M、G。
        3. 按文件属主查找：关键字为`-user`，根据文件是否属于目标用户进行查找。
        4. 按文件类型查找：关键字为`-type`，根据文件的类型进行查找，这里的类型指的是普通文件（f）、目录（d）、块设备文件（b）、字符设备文件（c）等。块设备指的是成块读取数据的设备（如硬盘、内存等），而字符设备指的是按单个字符读取数据的设备（如键盘、鼠标等） 

1. **ln命令**
    用途：为文件或目录建立链接（Link） （Windows下的快捷方式，macOS下的替身）
    格式：ln  [-s]  源文件或目录…  链接文件或目标目录
    常用命令选项:
    -s：建立符号链接文件（省略此项则建立硬链接）
    关于链接文件：
    * 符号链接：指向原始文件所在的路径，又称为软链接
    * 硬链接：指向原始文件对应的数据存储位置，不能为目录建立硬链接文件，硬链接与原始文件必须位于同一分区（文件系统）中。

23. **cat命令**
    用途：显示出文件的全部内容

24. **more命令**
    用途：全屏方式分页显示文件内容
    交互操作方法：
    *      按Enter键向下逐行滚动
    *      按空格键向下翻一屏、按b键向上翻一屏
    *      按q键退出

25. **less命令**
    用途：与more命令相同，但扩展功能更多
    交互操作方法：与more命令基本类似，但个别操作会有些出入

    * more命令结合管道操作使用时（例如：ls -R /etc | more）无法向上翻页，但less命令可以
    * 在分页阅读界面中，到文件末尾时more命令会自动退出，less命令不会
    * more和less都可以用于分页查看文本内容，具体使用哪一个看用户习惯

26. **head命令**
    用途：查看文件开头的一部分内容（默认为10行）
    格式：head -n 文件名
    
27. **tail命令**
    用途：查看文件结尾的少部分内容（默认为10行）
    格式：tail -n 文件名；tail -f  文件名
    * tail命令结合“-f”选项使用时，可以用于跟踪日志文件末尾的内容变化，实时显示更新的日志内容

28. **wc命令**
    用途：统计文件中的单词数量（Word Count）等信息 
    格式：wc  [选项]...  目标文件...
    常用命令选项：
    -l：统计行数
    -w：统计单词个数 
    -c：统计字节数
    * wc命令未指定选项时，默认相当于”-lwc“，会同时统计行数、单词数、字节数（含空格、回车鞥符合）

29. **grep命令**
    用途：在文件中查找并显示包含指定字符串的行
    格式：grep  [选项]...  查找条件  目标文件
    常用命令选项：
    -i：查找时忽略大小写
    -v：反转查找，输出与查找条件不相符的行 
    查找条件设置：
    *     要查找的字符串以双引号括起来
    *     “^……”表示以……开头，“……$”表示以……结尾
    *     “^$”表示空行

30. **gzip命令、bzip2命令**
    用途：制作压缩文件、解开压缩文件
    格式：gzip  [-9]  文件名...
    bzip  [-9]  文件名...
    gzip  -d  .gz格式的压缩文件
    bzip2  -d  *.bz2格式的压缩文件
    常用命令选项：
    -9：表示高压缩比，多在创建压缩包时用
    -d：用于解开已经压缩过的文件
    *     gzip和bzip2命令使用的压缩算法有一定区别，但命令使用格式基本类似，通常认为bzip2的压缩效率要更好一些
    *     这两个命令工具通常并不单独使用，而是与tar命令结合起来使用

31. **tar命令**
    用途：制作归档文件、释放归档文件
    格式：tar  [选项]...  归档文件名  源文件或目录
                  tar  [选项]...  归档文件名  [-C 目标目录]
    常用命令选项
    -c：创建 .tar 格式的包文件
    -x：解开.tar格式的包文件
    -v：输出详细信息
    -f：表示使用归档文件
    -p：打包时保留原始文件及目录的权限
    -t：列表查看包内的文件
    -C：解包时指定释放的目标文件夹
    -z：调用gzip程序进行压缩或解压
    -j：调用bzip2程序进行压缩或解压

    *     制作归档文件的意思是将许多零散的文件做成一个包（可以压缩，也可以不压缩）
    *     小写字母“-p”选项用于保持原始文件权限等信息，大写字母“-P”选项用于保持原始文件的绝对路径，参考“man tar”帮助
    *     使用tar命令时，选项前的“-”号引导字符可以省略
    *     在实际的备份工作中，通常在归档的同时也会将包文件进行压缩（见下页），以便节省磁盘空间，

32. **vi/vim编辑器**
    三种工作模式：
    
    1. 命令模式：启动vi编辑器后默认进入命令模式，该模式中主要完成如光标移动、字符串查找，以及删除、复制、粘贴文件内容等相关操作
    2. 输入模式：该模式中主要的操作就是录入文件内容，可以对文本文件正文进行修改、或者添加新的内容。处于输入模式时，vi编辑器的最后一行会出现“-- INSERT --”的状态提示信息
    3. 末行模式：该模式中可以设置vi编辑环境、保存文件、退出编辑器，以及对文件内容进行查找、替换等操作。处于末行模式时，vi编辑器的最后一行会出现冒号“:”提示符
    
    不同模式间切换：
    
    ![](media/15354710502028/15359634981452.jpg)

33. 命令模式中的基本操作

    * 光标移动
    
    | 操作类型     | 操作键               | 功能                   |
    | ------------ | -------------------- | ---------------------- |
    | 光标方向移动 | ↑、↓、←、→           | 上、下、左、右         |
    | 翻页         | Page Down或Ctrl+F    | 向下翻动一整页内容     |
    | 翻页         | Page Up或Ctrl+B      | 向上翻动一整页内容     |
    | 行内快速跳转 | Home键或“ ^ ”、数字“0” | 跳转至行首             |
    | 行内快速跳转 | End键或“$”键         | 跳转到行尾             |
    | 行间快速跳转 | 1G或者gg             | 跳转到文件的首行       |
    | 行间快速跳转 | G                    | 跳转到文件的末尾行     |
    | 行间快速跳转 | #G                   | 跳转到文件中的第#行    |
    | 行号显示     | :set nu              | 在编辑器中显示行号     |
    | 行号显示     | :set   nonu          | 取消编辑器中的行号显示 |
    
    * 复制、粘贴、删除
    
    | 操作类型 | 操作键 | 功能                                 |
    | -------- | ------ | ------------------------------------ |
    | 删除     | x或Del | 删除光标处的单个字符                 |
    | 删除     | dd     | 删除当前光标所在行                   |
    | 删除     | #dd    | 删除从光标处开始的#行内容            |
    | 删除     | d^     | 删除当前光标之前到行首的所有字符     |
    | 删除     | d$     | 删除当前光标处到行尾的所有字符       |
    | 复制     | yy     | 复制当前行整行的内容到剪贴板         |
    | 复制     | #yy    | 复制从光标处开始的#行内容            |
    | 粘贴     | p      | 将缓冲区中的内容粘贴到光标位置处之后 |
    | 粘贴     | P      | 粘贴到光标位置处之前                 |

    * 文件内容查找
    
    | 操作键 | 功能                             |
    | ------ | -------------------------------- |
    | /word  | 从上而下在文件中查找字符串“word” |
    | ?word  | 从下而上在文件中查找字符串“word” |
    | n      | 定位下一个匹配的被查找字符串     |
    | N      | 定位上一个匹配的被查找字符串     |

    * 撤销编辑及保存退出
    
    | 操作键 | 功能                                                         |
    | ------ | ------------------------------------------------------------ |
    | u      | 按一次取消最近的一次操作<br>多次重复按u键，恢复已进行的多步操作 |
    | U      | 用于取消对当前行所做的所有编辑                               |
    | ZZ     | 保存当前的文件内容并退出vi编辑器                             |
    
34. 末行模式中的基本操作
    
    * 保存文件及退出vi编辑器 
    
    | 功能           | 命令               | 备注                           |
    | -------------- | ------------------ | ------------------------------ |
    | 保存文件       | :w                 |                                |
    | 保存文件       | :w   /root/newfile | 另存为其它文件                 |
    | 退出vi         | :q                 | 未修改退出                     |
    | 退出vi         | :q!                | 放弃对文件内容的修改，并退出vi |
    | 保存文件退出vi | :wq                |                                |

    * 打开新文件或读入其他文件内容

    | 命令                  | 功能                         |
    | --------------------- | ---------------------------- |
    | :e   ~/install.log    | 打开新的文件进行编辑         |
    | :r   /etc/filesystems | 在当前文件中读入其他文件内容 |

    * 文件内容替换
    
    | 命令               | 功能                                                      |
    | ------------------ | --------------------------------------------------------- |
    | :s   /old/new      | 将当前行中查找到的第一个字符“old”   串替换为“new”         |
    | :s   /old/new/g    | 将当前行中查找到的所有字符串“old”   替换为“new”           |
    | :#,#   s/old/new/g | 在行号“#,#”范围内替换所有的字符串“old”为“new”             |
    | :%   s/old/new/g   | 在整个文件范围内替换所有的字符串“old”为“new”              |
    | :s   /old/new/c    | 在替换命令末尾加入c命令，将对每个替换动作提示用户进行确认 |

## 安装与管理应用

35. 应用程序与系统命令的关系
    1. 文件位置
        * 系统命令：一般在/bin和/sbin目录中，或为Shell内部指令
        * 应用程序：通常在/usr/bin和/usr/sbin目录中
    2. 主要用途
        * 系统命令：完成对系统的基本管理工作，例如IP配置工具
        * 应用程序：完成相对独立的其他辅助任务，例如网页浏览器
    3. 适用环境
        * 系统命令：一般只在字符操作界面中运行
        * 应用程序：根据实际需要，有些程序可在图形界面中运行
    4. 运行格式
        * 系统命令：一般包括命令字、命令选项和命令参数
        * 应用程序：通常没有固定的执行格式

1. 典型应用程序的目录结构

    | 文件类型                         | 保存目录       |
    | -------------------------------- | -------------- |
    | 普通执行程序文件                 | /usr/bin       |
    | 服务器执行程序文件和管理程序文件 | /usr/sbin      |
    | 应用程序配置文件                 | /etc           |
    | 日志文件                         | /var/log       |
    | 应用程序文档文件                 | /usr/share/doc |
    | 应用程序手册页文件               | /usr/share/man |

2. 常见的软件包封装类型

    | 封装类型             | 说明                                                         |
    | -------------------- | ------------------------------------------------------------ |
    | rpm软件包            | 扩展名为“.rpm”                                               |
    | deb软件包            | 扩展名为“.deb”                                               |
    | 源代码软件包         | 一般为“.tar.gz”、“.tar.bz2”等格式的压缩包   包含程序的原始代码 |
    | 提供安装程序的软件包 | 在压缩包内提供install.sh、setup等安装程序   或以“.bin”格式的单个执行文件提供 |
    | 绿色免安装的软件包   | 在压缩包内提供已编译好的执行程序文件   解开压缩包后的文件即可直接使用 |

3. RPM Package Manager。由Red Hat公司提出，被众多Linux发行版所采用。可以建立统一的数据库文件，详细记录软件包安装、卸载等变化信息，能够自动分析软件包依赖关系。 
    RPM软件包素材参考：http://rpmfind.net 
    一般命名格式：
    ![](media/15354710502028/15360306191183.jpg)
    * RPM软件包格式是Red Hat公司首先提出并使用的，目前广泛应用在各类Linux发行版本中
    * 其中硬件平台通常为“i386”、“i586”、“i686”或“noarch”（不区分硬件架构）等
    * 有些软件包的文件名中还会增加所适用的操作系统信息，例如“wget-1.10.2-7.el5.i386.rpm”

    主要功能：
    
    1. 查询RPM软件、包文件的相关信息
    2. 安装、升级、卸载RPM软件包
    3. 维护RPM数据库信息
    * rpm命令还可以对RPM软件包的文件信息进行验证，需要用到“-V”选项
    * rpm命令还可以导入软件包的公钥文件以便验证包文件的完整性，需要用到“--import”选项

4. 查询RPM软件信息
    **查询已安装的RPM软件信息**
    格式：rpm  -q子选项
    用法：结合不同的子选项 完成不同查询
     -qa：查看系统中已安装的所有RPM软件包列表
     -qi：查看指定软件的详细信息
     -ql：查询指定软件包所安装的目录、文件列表 
     -qc：仅显示指定软件包安装的配置文件
     -qd：仅显示指定软件包安装的文档文件
    **查询未安装的RPM包文件**
    格式：rpm  -qp[子选项]  RPM包文件
    用法：结合不同的子选项 完成不同查询
     -qpi：通过.rpm包文件查看该软件的详细信息
     -qpl：查看.rpm安装包内所包含的目录、文件列表
     -qpc：查看.rpm安装包内包含的配置文件列表
     -qpd：查看.rpm安装包内包含的文档文件列表
    **查询文件/目录属于哪个RPM软件**
    格式：rpm  -qf  文件或目录名

    - 使用“-q”选项时实际上调用了“/usr/bin/rpmquery”程序完成查询工作
    - 对于“-qa”查询选项，命令参数（即软件包名）是非必须的；一般查询时，软件名不需要指定版本号
    - 软件包查询主要包括两种情况：1）查询系统中已经安装的软件包信息；2）查询尚未安装的RPM包文件的信息
    - 查询已安装的软件时使用“-q…”选项，而查询未安装的包文件时使用“-qp…”选项，多了一个“p”（表示packages，包）
    - 两类查询操作中，“-i”、”-l”、”-c”、“-d”等选项的含义是相同的

    ![](media/15354710502028/15361082865171.jpg)

    ![](media/15354710502028/15361084282836.jpg)

5. 安装、升级、卸载RPM软件包 

    **安装或升级RPM软件**
    格式：rpm  [选项]  RPM包文件...
    用法：不同选项适用于不同情况
     -i：安装一个新的rpm软件包
     -U：升级某个rpm软件，若原本未装，则进行安装
     -F：更新某个rpm软件，若原本未装，则放弃安装
    **卸载指定的RPM软件**
    格式：rpm  -e  软件名
    **辅助选项**
    --force：强制安装所指定的rpm软件包
    --nodeps：安装、升级或卸载软件时，忽略依赖关系 
    -h：以“#”号显示安装的进度
    -v：显示安装过程中的详细信息 
    - --force 辅助选项主要应用于以下两种情况：
        1. 缺失某个软件包的文件时，需要进行覆盖安装以找回丢失文件
        2. 安装一个比现有软件版本陈旧的软件包（多为测试用途）
    - 当安装、卸载软件包时，提示缺少依赖包无法进行时，如果仍要继续执行，应结合 --nodeps 选项而不是 --force 选项
    - 在安装新的软件包时，通常使用”-ivh”组合选项来获得更加友好的屏幕提示信息 
    - “warning:……NOKEY……”的警告信息是由于没有导入RedHat提供的公钥所致，但并不影响安装效果，可以忽略，如果需要导入公钥文件，可以参考如下步骤（以后从RHEL5光盘中安装软件时，就不会再出现警告提示了）：

        ```
        [root@localhost ~]# cd /media/cdrom
        [root@localhost cdrom]# rpm --import RPM-GPG-KEY-redhat-release
        ```

    - 在系统中不存在被升级的软件包时，升级命令的功能等同于安装命令

    ![](media/15354710502028/15361085437489.jpg)
    ![](media/15354710502028/15361088188678.jpg)

6. 解决软件包依赖关系

    **安装有依赖关系的多个软件时**
    - 被依赖的软件包需要先安装
    - 同时指定多个.rpm包文件进行安装

    **卸载有依赖关系的多个软件时**
    - 依赖其他程序的软件包需要先卸载
    - 同时指定多个软件名进行卸载

    **忽略依赖关系**
    - 结合“--nodeps”选项，但可能导致软件异常

        ![](media/15354710502028/15361089033718.jpg)
    - 如果需要同时安装相互依赖的数十个.rpm软件包，可以结合Shell通配符“*”同时指定这些文件作为参数

7. 维护RPM数据库

    当RPM数据库损坏时，需要进行数据库重建
    格式：rpm --rebuilddb 或者  rpm --initdb
    - 当RPM数据库发生损坏，Linux系统无法自动完成修复时，可能将导致无法正常安装、卸载rpm软件包

9. 在图形界面中管理RPM包  

    **图形界面中的“添加/删除软件”**
    - 依赖于YUM（Yellow dog Updater，Modified）机制
    - 调用yum命令工具进行软件更新
    
    **使用“添加/删除软件”工具的条件**
    - 能够访问互联网中的YUM源服务器
        - 若使用默认源，需有合法的安装序列号和服务订阅号
    - 在局域网内构建本地的YUM源服务器
        - 参考《Linux实用技术阅读手册》第一章
    
    注：
    - YUM（Yellow dog Updater，Modified，修订版的黄狗升级器）
    - 使用RHEL5系统光盘中的软件包可以构建自己的YUM源服务器，具体请参阅《Linux实用技术阅读手册》

10. 源代码编译概述

    **使用源代码安装软件的优点**
    * 获得最新的软件版本，及时修复bug
    * 根据用户需要，灵活定制软件功能
    
    **应用场合举例**
    * 安装较新版本的应用程序时 
        *  自由软件的最新版本大都以源码的形式最先发布
    * 当前安装的程序无法满足需要时  
        *  编译安装可由用户自行修改、定制功能
    * 需要为应用程序添加新的功能时 
        *  用户可以重新配置、自由修改源代码，加入新的功能

    **Tarball 封包**
    * .tar.gz 和 .tar.bz2 格式居多
    * 软件素材参考：http://sourceforge.net 
    
    **完整性校验**
    * md5sum校验工具
        *  计算MD5校验和，并与官方提供的值相比较，判断是否一致
    
    **确认源代码编译环境**
    需安装支持 C/C++程序语言的 编译器
    *      gcc-4.1.1-52.el5、gcc-c++-4.1.1-52.el5 
    *      make-3.81-1.1.i386 ……

    
    ![](media/15354710502028/15361093748650.jpg)    
    注：
    * 对于下载回来的软件包文件，如果MD5校验和与官方提供的不一致，则说明该软件包在网络传输过程中可能被非法改动过
    * 对于校验和不一致的软件包，应尽量不要使用，以免带来病毒、木马等不安全因素
    * 源代码编译环境十分重要，“工欲善其事，必先利其器”，没有一个好工具是不行的
    * 在实际编译安装软件的操作中，大多数情况是通过 make 来自动调用gcc或g++进行工作，无需用户手动执行gcc等命令

10. 源码编译安装的基本过程

    **解包 —— tar**
    - 解包、释放出源代码文件
        *  习惯上将软件包释放到 /usr/src/ 目录
        *  解包后的源代码文件位置：
           /usr/src/软件名-版本号/
    注：
    - 软件包释放至哪个目录并无硬性限制，例如用户也可以释放至 /usr/local/src/ 目录或者其他目录下，编译安装结束后，源码包目录可以选择删除
    - 释放出的软件源代码目录中，configure脚本文件将用于下一步的配置工作

    **配置 —— ./configure**
    - 针对当前系统、软件环境，配置好安装参数
        * 需将工作目录切换到软件源码所在目录
        * 使用源码目录中的 configure 脚本
        * 执行“./configure --help” 可以查看帮助
        * 典型的配置选项：
        *  --prefix=软件安装目录(若不指定任何配置选项，将采用默认值)

    注：

    * 不同的应用程序其配置参数会存在区别，因此学会使用“./configure --help”非常重要（“./”表示当前目录）
    * 用户应用程序习惯上安装到“/usr/local/软件名”文件夹中
    * 编译过程中如果出现错误，通常是由于缺少依赖软件包所致
    * 根据软件大小不同，配置过程可能会需要不同的时间

    **编译 —— 执行make命令**
    - 将源代码文件变为二进制的可执行程序

    **安装 —— 执行make install命令**
    - 将编译好的程序文件复制到系统中

    注：
    - 这两个步骤可以合写为一行：make && make install
    - “make && make inistall”操作中，“&&”符号表示只有当前一条命令执行成功以后，才会执行后边的命令
    - configure 一般是位于软件包目录中的可执行脚本文件

    **验证已编译安装完成的程序**
    - 查看安装后的软件目录、了解软件程序的使用方法
    - 可使用axel软件进行验证

## 用户和文件权限
 
 1. 用户和组帐号概述
 
    Linux基于用户身份对资源访问进行控制
    
    用户帐号：
    *  超级用户：即root用户，非执行管理任务时不建议使用root用户登录系统。root用户的UID的固定值为0、root组帐号的GID号为固定值0 
    *  普通用户：普通用户帐号一般只在用户自己的宿主目录中有完全权限
    *  程序用户：用于维持系统或某个程序的正常运行，一般不允许登录到系统。例如：bin、daemon、ftp、mail等
    
    组帐号：
    *  基本组(私有组)
    *  附加组（公共组）
    
    UID和GID：
    *  UID（User Identity，用户标识号）
    *  GID（Group Identify，组标识号）

    注：
    * 1~499的UID、GID默认保留给程序用户使用，普通用户/组使用的UID、GID号在500～60000之间

 2. 用户帐号文件 —— `passwd`
 
    用于保存用户的帐号基本信息。文件位置：/etc/passwd，每一行对应一个用户的帐号记录

    *  字段1：用户帐号的名称
    *  字段2：用户密码字串或者密码占位符“x”
    *  字段3：用户帐号的UID号
    *  字段4：所属基本组帐号的GID号
    *  字段5：用户全名
    *  字段6：宿主目录
    *  字段7：登录Shell信息

    注：

    * 基于系统运行和管理需要，所有用户都可以访问passwd文件中的内容，但是只有root用户才能进行更改
    * 在早期的UNIX操作系统中，用户帐号的密码信息是保存在passwd文件中的，不法用户可以很容易的获取密码字串并进行暴力破解，因此存在一定的安全隐患
    * 后来经改进后，将密码转存入专门的shadow文件中（见下页）并严格控制全新，而passwd文件中仅保留密码占位符“x” 
    * 一般不可登陆的用户，可能是特定应用程序所创建的账户，来执行特定的程序。例如某些计划任务等。

 3. 用户帐号文件 —— `shadow`
 
     用于保存密码字串、密码有效期等信息，文件位置：/etc/shadow，每一行对应一个用户的密码记录

    *  字段1：用户帐号的名称
    *  字段2：加密的密码字串信息
    *  字段3：上次修改密码的时间
    *  字段4：密码的最短有效天数，默认值为0
    *  字段5：密码的最长有效天数，默认值为99999
    *  字段6：提前多少天警告用户口令将过期，默认值为7
    *  字段7：在密码过期之后多少天禁用此用户
    *  字段8：帐号失效时间，默认值为空
    *  字段9：保留字段（未使用）
    
    注：

    * 默认只有root用户能够读取文件中的内容，并且不允许root直接编辑该文件中的内容
    * 上次修改密码的时间，表示从1970年01月01日算起到最近一次修改密码时间隔的天数 

4. 添加用户帐号 - `useradd`命令
    格式：`useradd  [选项]...  用户名`

    常用命令选项

    * -u：指定 UID 标记号
    * -d：指定宿主目录，缺省为 /home/用户名
    * -e：指定帐号失效时间
    * -g：指定用户的基本组名（或UID号）
    * -G：指定用户的附加组名（或GID号）
    * -m：为用户建立并初始化宿主目录
    * -s：指定用户的登录Shell

5. 用户帐号的初始配置文件

    文件来源

    * 新建用户帐号时，从 /etc/skel 目录中复制而来

    主要的用户初始配置文件

    * ~/.bash_profile：用户每次登录时执行
    * ~/.bashrc：每次进入新的Bash环境时执行
    * ~/.bash_logout：用户每次退出登录时执行
 
    注：

    * 这些文件可以便于我们安排一些自动运行的后台管理任务，例：.bashrc文件中默认设置了一些命令别名
    * 在Shell脚本编写时，将可以充分利用这些文件减轻系统管理员的负担
    * 默认情况下，用户宿主目录下的初始配置文件只对当前用户有效，而全局配置文件对所有用户有效

6. 设置/更改用户口令 - `passwd`命令

    格式：`passwd  [选项]...  用户名`

    常用命令选项

    * -d：清空用户的密码，使之无需密码即可登录
    * -l：锁定用户帐号
    * -S：查看用户帐号的状态（是否被锁定） 
    * -u：解锁用户帐号

    注：

    * “未设置密码”的用户帐号尚未完成初始化，处于不可登录状态，这与“空密码”的情况（已经为用户设置密码，但密码字串为空）是不同的： “未设置密码”的用户将被禁止登录系统，而拥有“空密码”的用户是可以在本地终端登录的
    * 普通用户也可以使用passwd命令，但只能更改自己的密码，密码要求有一定的复杂性（如不要直接使用英文单词，长度保持在6位以上），否则系统可能拒绝进行设置
    * 被锁定的帐号也将无法登录系统

7. 修改用户帐号的属性 - `usermod`命令

    格式：`usermod  [选项]...  用户名`

    常用命令选项

    * -l：更改用户帐号的登录名称
    * -L：锁定用户账户
    * -U：解锁用户账户

    以下选项与`useradd`命令中的含义相同
    *  -u、-d、-e、-g、-G、-s

    注：

    * usermod有两个选项“-L”、“-U”，分别用于锁定、解锁用户帐号，这两个选项与passwd命令的“-l”、“-u”选项作用基本相同，只不过大小写存在区别 

8. 删除用户帐号 - `userdel`命令

    格式：`userdel  [-r]  用户名`

    添加 -r 选项时，表示连用户的宿主目录一并删除

    注：
    * 当系统中的某个用户帐号已经不再需要使用时，可以使用userdel命令将该用户帐号删除
    * 使用userdel命令需要指定帐号名称作为参数，添加“-r”选项时可以将该用户的宿主目录一并删除。

9. 组帐号文件 —— `group`、`gshadow`

    与用户帐号文件相类似

    * /etc/group：保存组帐号基本信息
    * /etc/gshadow：保存组帐号的密码信息
    
    注：

    * 与组帐号相关的配置文件也有2个，分别是/etc/group、/etc/gshadow，/etc/gshadow文件的应用极少
    * group文件内的最后一个字段中列出属于该组的用户成员（一般不包括基本组对应的用户帐号），多个成员之间以逗号“,”分隔

10. 添加组帐号 - `groupadd`命令

    格式：`groupadd  [-g GID]  组帐号名`
    
    注：

    * 使用`groupadd`命令可以添加一个组帐号，需要指定GID号时，可以使用“-g”选项

11. 添加、删除组成员  - `gpasswd`命令

    用途：设置组帐号密码（极少用）、添加/删除组成员

    格式：gpasswd  [选项]...  组帐号名

    常用命令选项

    * -a：向组内添加一个用户
    * -d：从组内删除一个用户成员
    * -M：定义组成员列表，以逗号分隔
    
    注：

    * 使用“-M”选项时可以为指定组帐号定义成员列表（注意：会覆盖原有组成员），需要添加多个用户到指定的组中时非常方便

12. `groupdel`命令

    格式：`groupdel  组帐号名`
    
    注：

    * 删除组帐号后，从/etc/group文件中将查不到相应的记录

13. 用户和组帐号查询

    `id`命令

    * 用途：查询用户身份标识
    * 格式：`id  [用户名]`

    `groups`命令

    * 用途:查询用户所属的组
    * 格式：`groups  [用户名]`

    `finger`命令
    * 用途：查询用户帐号的详细信息
    * 格式：`finger  [-l]  [用户名]`

    `users`、`w` 、`who`命令
    * 用途：查询已登录到主机的用户信息

14. 图形化的用户和组管理工具

    注：Linux `init` 相关命令：

    ```
    init 0 #关机
    inti 1 #单用户模式
    init 2 #多用户，不能使用NFS
    init 3 #完全多用户(标准运行命令行)
    init 4 #安全模式
    init 5 #图形化
    init 6 #重启（千万不要把initdefault设置为6）
    
    # 可通过查看/etc/rc.d/中的rc*.d的文件夹对比理解
    ```
    
    (略）

15. 文件/目录的权限和归属

    访问权限

    * 读取：允许查看文件内容、显示目录列表
    * 写入：允许修改文件内容，允许在目录中新建、移动、删除文件或子目录
    * 可执行：允许运行程序、切换目录

    归属（所有权）

    * 属主：拥有该文件或目录的用户帐号
    * 属组：拥有该文件或目录的组帐号

    ![](media/15354710502028/15361289711206.jpg)

    注：
    * “-rw-r—r--”部分的第一个字符表示文件类型，可以是d(目录)、b(块设备文件)、c(字符设备文件)，减号“-”（普通文件）、字母“l”（软链接文件）等
    * 其余部分指定了文件的访问权限
    * 在表示属主、属组内用户或其他用户对该文件的访问权限时，主要使用了四种不同的权限字符： r    可读 ；w   可写 ；x   可执行 ；-   无权限 
    * r、w、x、- 权限字符还可分别表示为8进制数字4、2、1、0

16. 设置文件/目录的权限

    **chmod命令**

    格式1：chmod   [ugoa]  [+-=]  [rwx]  文件或目录... 

    * u、g、o、a 分别表示属主、属组、其他用户、所有用户 
    * +、-、= 分别表示增加、去除、设置权限
    * [rwx]对应的权限字符

    格式2：chmod nnn 文件或目录...

    常用命令选项

    * -R：递归修改指定目录下所有文件、子目录的权限

    注:

    * “nnn”为需要设置的具体权限值，如“755”、“644”等

17. 设置文件/目录的归属 - chown命令

    格式：
    ```
    chown  属主   文件或目录
    
    chown  :属组  文件或目录
    
    chown  属主:属组  文件或目录
    ```
    
    常用命令选项：
    
    * -R：递归修改指定目录下所有文件、子目录的归属
    
    注：
    
    * 需要设置文件或者目录的归属时，可以通过chown、chgrp命令进行
    * chown命令既可以修改属主，也可以修改属组，而chgrp命令只用于修改属组信息，因此chgrp并不常用。

18. 使用附加权限

    **SET位权限**

    主要用途：
    *  为可执行（有 x 权限的）文件设置，权限字符为“s”
    *  其他用户执行该文件时，将拥有属主或属组用户的权限

    SET位权限类型：
    *  SUID：表示对属主用户增加SET位权限
    *  SGID：表示对属组内的用户增加SET位权限

    应用示例：/usr/bin/passwd

    ![](media/15354710502028/15361313232362.jpg)

    Q: 普通用户并没有权限修改“/etc/shadow”文件，那为什么可以修改自己的登录密码呢？
    
    A: 这是因为：passwd命令程序被设置了SUID权限，普通用户在执行该命令时临时获得相当于属主用户（root）的权限
    
    注意：
    * 不要轻易为可执行文件设置SET位权限，特别是对于那些属主、属组是root的执行程序，使用SET位权限时更应该慎重。例如，若为vim编辑器程序设置SUID权限，将导致普通用户也可以使用vim编辑器修改系统中的任何配置文件

    **粘滞位权限（Sticky）**
    
    主要用途：
    *  为公共目录（例如，权限为777的）设置，权限字符为“t”
    *  用户不能删除该目录中其他用户的文件
    
    应用示例：/tmp、/var/tmp
    
    ![](media/15354710502028/15361314231587.jpg)
    注意：
    * 由于系统及服务程序运行的需要， Linux提供了/tmp、/var/tmp等临时目录，允许任意用户、程序写入数据
    * 然而试想一下，若任意一个普通用户都能够删除系统服务运行中使用的临时文件，将造成什么后果？
    * 设置粘滞位以后，正好可以保持一种动态的平衡：允许各用户在目录中任意写入、删除数据，但是禁止随意删除其他用户的数据 

19. 设置SET位、粘滞位权限

    **使用权限字符**
    *  chmod  ug±s  可执行文件...
    *  chmod  o±t  目录名...
    
    **使用权限数字**
    *  chmod  mnnn  可执行文件...
    *  m为4时，对应SUID，2对应SGID，1对应粘滞位，可叠加
    
    注意：

    * SET位标记字符为“s”，若使用8进制数字形式，则SUID对应为“4”、SGID对应为“2”
    * 在权限模式中可采用“nnnn”的形式时，如“4755”表示设置SUID权限、“6755”表示同时设置SUID、SGID权限
    * 以为 /bin/touch 命令设置SUID权限为例进行演示，普通用户使用该命令创建测试文件，比较新建文件的属主变化
    * 注意：为普通文件（无执行权限的）设置SET位权限从语法上虽然也可行，但没有实际意义（标记字符将变为大写字母“S”）
    * 通过实例操作演示，展示粘滞位的作用，例如：由普通用户1在 /tmp 目录中尝试删除 普通用户2的文件，对比是否设置粘滞位的区别
    * 注意：为普通文件或者用户本没有写入权限的目录设置粘滞位语法上也是可行的，但没有实际意义（标记字符将变为大写字母“T”）

## 磁盘和文件系统
 
1. 确认系统中的磁盘设备

    fdisk命令
    
    格式：`fdisk  -l  [磁盘设备]`

    注意：

    * 新挂接的硬盘可能未包含任何分区（ Disk /dev/sdb doesn't contain a valid partition table ）
    * 对于已有的分区，将通过列表的方式输出以下信息：
        * Device：分区的设备文件名称。
        * Boot：是否是引导分区，是则有“*”标识。
        * Start：该分区在硬盘中的起始位置（柱面数）。
        * End：该分区在硬盘中的结束位置（柱面数）。
        * Blocks：分区的大小，以Blocks（块）为单位，默认的块大小为1024字节。
        * Id：分区类型的ID标记号，对于EXT3分区为83，LVM分区为8e。
        * System：分区类型
    * 注意分区类型的概念在windows中是没有的，分区类型与文件系统类型应一致，这样管理磁盘文件系统时才不容易引起混乱。

2. 规划硬盘中的分区

    fdisk命令

    用途：在交互式的操作环境中管理磁盘分区

    格式：fdisk  [磁盘设备]

    交互模式中的常用指令
    * m：查看操作指令的帮助信息
    * p：列表查看分区信息
    * n：新建分区
    * d：删除分区
    * t：变更分区类型
    * w：保存分区设置并退出
    * q：放弃分区设置并退出

    注意：

    * 在非交互式模式中可以执行“fdisk -l /dev/sdb”查看磁盘sdb的分区情况，而在进入“fdisk /dev/sdb”交互式模式后中只需要按p键即可

    **硬盘规划示例**
    * 为主机新增一块80GB的SCSI硬盘
    * 对该硬盘进行分区：
        *  划分2个主分区，各20GB，剩余空间作为扩展分区
        *  在扩展分区中建立2个逻辑分区，容量分别为2GB、10GB
        *  将第1个逻辑分区的类型改为swap
        *  确认分区设置情况，保存退出
    * 使用partprobe探测硬盘分区的变化

3. 在分区中创建文件系统

    **mkfs命令**

    用途：Make Filesystem，创建文件系统（格式化）

    格式：mkfs -t 文件系统类型 分区设备

    注：
    
    * 将新硬盘分好区以后，还需要对分区进行格式化（即创建文件系统），并挂载到Linux系统中的指定目录下，然后才能用于存储文件、目录等数据
    * 首先来看一下如何格式化一个分区，在Linux系统中，格式化分区的主要命令工具为mkfs

    ![](media/15354710502028/15361589831631.jpg)

    **mkswap命令**
    
    用途：Make Swap，创建交换文件系统
    
    格式：mkswap 分区设备
    
    注：
    
    * 在Linux系统中，SWAP分区的作用类似于Windows系统中“虚拟内存”，可以在一定程度上缓解物理内存不足的情况
    * 如果系统没有SWAP交换分区，或者现有交换分区的容量不够用，可以通过mkswap命令创建交换文件系统以增加虚拟内存
    * 交换分区空间的启用、停用需要使用swapon、swapoff命令，free命令可以查看物理内存、交换空间的使用情况
    * swap可以衡量系统内存是否足够的一个标尺：如果swap开始使用的话，说明系统内存是吃紧的。应及时进行硬件维护
    * “swapon -s”命令也可查看交换分区的使用情况
    
    ![](media/15354710502028/15361590555837.jpg)
4. 挂载、卸载文件系统

    **mount命令**
    
    用途：挂载文件系统、ISO镜像到指定文件夹
    
    格式：
    * mount  [ -t 类型 ]  存储设备  挂载点目录
    * mount  -o loop  ISO镜像文件  挂载点目录
    
    **umount命令**
    
    用途：卸载已挂载的文件系统
    
    格式：
    * umount  存储设备位置
    * umount  挂载点目录
    
    **硬盘分区挂载、卸载示例**

    * 建立挂载点目录：/mailbox 
    * 挂载分区设备：/dev/sdb1
    * 访问分区设备：
        *  挂载点目录/mailbox中创建文件进行测试
        *  查看/mailbox目录中的内容 
    * 查看已挂载分区的使用情况（df -hT）
    * 卸载分区设备：/dev/sdb1
    
    **光盘设备挂载、卸载示例**

    * 建立挂载点目录：/media/cdrom 
    * 挂载光盘设备：/dev/cdrom或/dev/hdc
    * 访问光盘设备：
        *   查看挂载点目录/media/cdrom中的内容
    * 卸载光盘设备：/dev/cdrom

    **光驱托盘操作**
    
    * 弹出光驱：eject
    * 收回光驱：eject -t

    **ISO镜像文件挂载示例**

    ![](media/15354710502028/15361595187886.jpg)

    
    注：
    
    * 存储设备是指：硬盘分区、U盘、光盘设备等
    * 文件系统类型通常可以省略；存储设备为对应分区的设备文件名，如“/dev/sdb1”；挂载点为用户指定用于挂载的目录
    * 介绍umount命令两种卸载方式的区别，建议学员使用卸载挂载点的方式，这是因为同一设备可能被挂载到多个目录
    * 使用mount命令时，”-t 类型“的选项通常可以省略，大多数Linux系统能够自动识别对应的文件系统类型
    * 在Linux系统中，U盘设备被模拟成SCSI设备，因此与挂载普通SCSI硬盘中的分区并没有明显区别 
    * 光盘设备文件一般对应为 /dev/hdc，习惯上通过 /dev/cdrom 来访问该设备
    * eject命令需要光盘驱动器硬件的支持，对大多数PC上的光盘驱动器有效，对笔记本电脑上的光盘驱动器可能无效

5. 设置文件系统的自动挂载
 
     /etc/fstab配置文件 
    * 包含了需要开机后自动挂载的文件系统记录

    设置自动挂载示例
    * 每次重新开机后，能够自动完成挂载
        *  将/dev/sdb1分区挂载到/mailbox目录

    注：
    
    * 系统中的“/etc/fstab”文件可以视为mount命令的配置文件
    * 分别介绍配置记录中6个字段的含义，重点强调前3个字段（决定挂载的关键部分），后面的3个字段简单介绍即可
        *     第四字段：挂载参数，即mount命令“-o”选项后可使用的参数，如defaults、rw等
        *     第五字段：表示文件系统是否需要dump备份（dump是一个备份工具），一般设为1时表示需要，设为0时将被dump所忽略
        *     第六字段：该数字用于决定在系统启动时进行磁盘检查的顺序，0不进行检查，1优先，2其次。对于根分区应设为1，其它分区设为2
    * 在/etc/fstab文件中正确设置了相应分区的自动挂载记录以后，手动挂载、卸载该分区时，仅需指定设备名、挂载点中的任意一个作为参数即可，例如，执行“mount /dev/sdb1”或者“umount /mailbox”都可以完成卸载
    * mount命令不带任何选项、参数时，可以显示当前系统中已经挂载的文件系统信息

6. LVM概述 

    **Logical Volume Manager，逻辑卷管理**

    * 屏蔽了底层磁盘布局，便于动态调整磁盘容量
    * 需要注意：
        *  /boot分区用于存放引导文件，不能应用LVM机制

    **LVM机制的基本概念**

    * PV（Physical Volume，物理卷） 
        *  整个硬盘，或使用fdisk等工具建立的普通分区
        *  包括许多默认4MB大小的PE（Physical Extent，基本单元）

    * VG（Volume Group，卷组） 
        *  一个或多个物理卷组合而成的整体

    * LV（Logical Volume，逻辑卷）
        *  从卷组中分割出的一块空间，用于建立文件系统

    ![](media/15354710502028/15361598520057.jpg)    

    释义：
    
    1. 物理卷，以/dev/sdb1、/dev/sdc1、/dev/sdd1、/dev/sde1 为例
    2. 卷组，画一个矩形框圈住 /dev/sdb1、/dev/sdc1、/dev/sdd1 这3个物理卷作为一个整体，即示意卷组
    3. 逻辑卷，擦去矩形框内的3个物理卷名（表示磁盘底层布局是透明的，划分逻辑卷时无需知道具体由哪些物理卷组成），从卷组矩形框划出2块小空间，作为2个独立的逻辑卷

7. LVM的管理命令 

    | 功能            | 物理卷管理 | 卷组管理  | 逻辑卷管理 |
    | --------------- | ---------- | --------- | ---------- |
    | Scan       扫描 | pvscan     | vgscan    | lvscan     |
    | Create    建立  | pvcreate   | vgcreate  | lvcreate   |
    | Display   显示  | pvdisplay  | vgdisplay | lvdisplay  |
    | Remove  删除    | pvremove   | vgremove  | lvremove   |
    | Extend   扩展   |            | vgextend  | lvextend   |

    **主要命令的用法**

    * pvcreate  设备名
    * vgcreate  卷组名  物理卷名1 物理卷名2
    * lvcreate   -L  大小  -n  逻辑卷名  卷组名
    * lvextend  -L  +大小  /dev/卷组名/逻辑卷名  

    注：
    
    * LVM管理对应的程序文件分别以“pv”、“vg”、“lv”开头
    * 介绍最常用的几个命令：
        1. pvcreate用于将分区或整个硬盘转换成物理卷，主要是添加LVM属性信息并划分PE存储单位。该命令需要使用分区或硬盘设备名作为参数
        2. vgcreate用于将一个或多个物理卷创建为一个卷组，第一个命令参数指定定义的新卷组名称，其后依次指定需要加入到该卷组的物理卷作为参数 
        3. lvcreate用于从指定的卷组中分割空间，以创建新的逻辑卷。需要指定逻辑卷大小、名称及所在的卷组名作为参数 
        4. lvextend用于动态扩展逻辑卷的空间，当目前使用的逻辑卷空间不足时，可以从所在卷组中分割额外的空间进行扩展 

8. LVM应用示例 

    **需求描述**
    
    公司的邮件服务器由于用户数量众多，邮件存储需要大量的空间，考虑到动态扩容的需要，计划增加两块SCSI硬盘并构建LVM逻辑卷，挂载到“/mail”目录专门用于存放邮件数据
    
    **推荐步骤**
    
    PV → VG → LV → 格式化，挂载使用文件系统
    
    ![](media/15354710502028/15361602038934.jpg)    
    创建LVM文件系统的基本过程（3个步骤，先PV，再VG，最后LV）：
    
    1. 每块硬盘均规划为1个主分区，并转换为物理卷
    2. 组合这两个物理卷，创建名为mail_store的卷组
    3. 在该卷组中创建名为mail的逻辑卷
    4. 创建ext3文件系统，并挂载到/mail目录

    **操作流程**

    1. 转化物理卷

        * 使用fdisk命令规划两个分区，类型设置为“8e”
            *  /dev/sdb1、/dev/sdc1
        * 使用pvcreate命令转换上述分区为物理卷

        ![](media/15354710502028/15361603609950.jpg)

        注：
        
        * 使用fdisk命令分区以后，应执行“partprobe”命令重新检测分区表，或者重新启动系统
        * 文件系统类型标识”8e“表示该分区用于” Linux LVM “
        * 也可以执行“pvcreate /dev/sdb1 /dev/sdc1”命令一次性转换2个物理卷

    1. 创建卷组
        * 使用vgcreate命令创建卷组mail_store
            *  新建一个名为“mail_store”的卷组，包括两个物理卷：/dec/sdb1、/dev/sdc1
        
            ![](media/15354710502028/15361604374499.jpg)
    1. 创建逻辑卷
        * 使用lvcreate命令创建逻辑卷 mail 
            *  从卷组mail_store上划出60GB空间
        * 使用mkfs命令创建ext3文件系统
         ![](media/15354710502028/15361605257612.jpg)
        
        注：
        
        * “-L”选项用于指定逻辑卷分区的容量大小，”-n“选项用于指定逻辑卷的名称
        * 按上述操作创建逻辑卷后，系统会自动建立”/dev/卷组名/逻辑卷名“的逻辑卷设备文件，即 /dev/mail_store/mail 

    **为逻辑卷扩容**
    
    * 使用lvextend命令为逻辑卷 mail扩充容量
        *  从卷组 mail_store 上再划出10GB给逻辑卷mail
    * 使用resize2fs命令更新系统识别的文件系统大小

    ![](media/15354710502028/15361606032594.jpg)

    注：
    
    * 重新调整LVM分区容量以后，需要使用resize2fs命令更新大小，而不是使用“partprobe”命令
    * 讲解完本页以后，切换到虚拟机环境，演示实现LVM逻辑卷管理机制的完整过程
    * 强调：不建议对逻辑卷进行缩减容量操作，因为这非常容易造成现有数据的损坏（通常不得不重新格式化文件系统），若确实需要减少逻辑卷容量时，可以使用lvreduce命令，按“y”确认后可以减少磁盘容量。例如：

        ```
        [root@localhost ~]# lvreduce -L -2G /dev/web_document/benet
        Do you really want to reduce benet? [y/n]: y
        ```

## 进程和计划任务

1. 引导流程总览

    ![](media/15354710502028/15361607804087.jpg)
    
    注：
    
    * 系统启动的过程应按照逻辑流程顺序进行讲解，说明启动过程中各部分的功能和作用，使学员对整个流程有一个总的认识
    * 从INIT进程获得系统控制权开始，即进入初始化过程
    * 运行终端程序“/sbin/mingetty”后，将等待用户进行登录（登录过程由“/bin/login”程序负责验证）

2. INIT进程与配置文件

    **INIT进程**
    
    * 由Linux内核加载运行 /sbin/init 程序
    * 是系统中第一个进程，PID（进程标记）号永远为1
    * 配置文件：/etc/inittab
    
    ![](media/15354710502028/15361609086153.jpg)
    
    注：
    
    * 在引导Linux系统的过程中，“/sbin/init”是内核第一个加载的程序，因此init进程对应的PID号永远为“1”
    * init进程启动后会启动其它程序，生成新的进程，这些由init启动的进程称之为init进程的子进程，而init进程是这些进程的父进程
    * 同样的这些子进程有可能启动其它程序生成新的进程，这些子进程与新进程之间也互为父子进程关系

3. inittab文件的结构

    ![](media/15354710502028/15361610640133.jpg)
    
    | 字段      | 说明                                    |
    | --------- | --------------------------------------- |
    | id        | 用于在inittab文件中唯一标识一个配置记录 |
    | runlevels | 用于指定该记录在哪些运行级别中运行      |
    | action    | 用于描述记录将执行哪种类型的动作        |
    | process   | 用于设置启动进程所执行的命令            |
    
    注：
    
    * id，也称标记字段，由1～4个字符组成，用以区别于其他行的配置，所以id标记字段必须是唯一的
    * runlevels，运行级别字段，用于指定该记录在哪些运行级别中运行，取值数字0~6，后面会对其进行详细解释
    * action ，动作类型字段，动作类型字段描述了该行配置所对应的操作类别，一般为固定值，较常用的类型如下：
        * initdefault：设置初始化系统后默认进入的运行级别
        * sysinit：设置系统初始化的操作脚本
        * wait：init进程将等待该行配置所对应的脚本操作完成后，再继续执行其他操作
        * ctrlaltdel：设置当用户按下Ctrl+Alt+Delete组合键后的操作
        * powerfail：设置当系统收到断电信号（使用不间断电源）时采取何种动作
        * powerokwait：设置当系统收到恢复供电信号时采取何种动作
        * respawn：一旦该行配置所对应的进程被终止，则重新启动该进程
    * process，程序或脚本字段，此字段用于指定该行配置所对应的实际操作，可以是具体的命令、脚本程序等
    
    * Action行为：
        * respawn		启动并监视第4项指定的process，若process终止则重启它
        * wait		执行第4项指定的process，并等待它执行完毕
        * once		执行第4项指定的process
        * boot		不论在哪个执行等级，系统启动时都会运行第4项指定的process
        * bootwait		不论在哪个执行等级，系统启动时都会运行第4项指定的process，且一直等它执行完备
        * off		关闭任何动作，相当于忽略该配置行
        * ondemand		进入ondemand执行等级时，执行第4项指定的process
        * initdefault		系统启动后进入的执行等级，该行不需要指定process
        * sysinit		不论在哪个执行等级，系统会在执行boot 及bootwait之前执行第4项指定的process
        * powerwait		当系统的供电不足时执行第4项指定的 process，且一直等它执行完毕
        * powerokwait		当系统的供电恢复正常时执行第4项指定的process，且一直等它执行完毕
        * powerfailnow	当系统的供电严重不足时执行第4项指定的process
        * ctrlaltdel		当用户按下【Ctrl+Alt+Del】时执行的操作
        * kbrequest		当用户按下特殊的组合键时执行第4项指定的process，此组合键需在keymaps文件定义

4. 其他系统初始化文件

    * /etc/rc.d/rc.sysinit
        * 由init进程调用执行
        * 完成设置网络、主机名、加载文件系统等初始化工作 
    * /etc/rc.d/rc脚本文件
        * 由init进程调用执行
        * 根据指定的运行级别, 加载或终止相应的系统服务
    * /etc/rc.local脚本文件
        * 由rc脚本调用执行
        * 保存用户定义的需开机后自动执行的命令
    
    在初始化过程中运行的三个脚本文件所承担的角色：
    
    * rc.sysinit脚本：是init进程所调用的系统初始化脚本，文件全称是/etc/rc.d/rc.sysinit，rc.sysinit脚本主要完成包括设置网络、主机名、加载文件系统、设置时钟等一系列初始化工作（例如检查并启用磁盘配额功能就是在该脚本中完成的） 。
    * rc脚本：同样由init进程进行调用，文件全称是/etc/rc.d/rc。rc脚本通过指定不同的级别参数分别加载及终止不同的系统服务，进入到相应的系统运行级别。
    * rc.local脚本：是一个额外的启动控制文件， 文件全称是/etc/rc.d/rc.local。rc.local脚本通常由rc脚本在最后进行加载，其作用主要是为管理员自行设置启动命令提供一种途径，通常都将一些需要随系统启动的命令和脚本添加到该文件中。

5. Linux系统的运行级别

    * 运行级别
        * 指运行Linux系统的不同模式
        * 每种模式对应不同的服务程序组合
    * 默认的7种运行级别
        * 0：关机状态
        * 1：单用户模式
        * 2：字符界面的多用户模式（不支持网络）
        * 3：字符界面的完整多用户模式
        * 4：未分配使用
        * 5：图形界面的多用户模式
        * 6：重新启动
    
    注：
    
    * Linux系统在运行时，采用的每一种服务搭配称之为“运行级别”
    * 运行级别类似于Windows系统中的正常启动、安全模式、带网络支持的安全模式……等概念
    * 不同的运行级别使用了不同的服务程序组合，也类似于”套餐“的概念

    **调整默认运行级别**
    * 修改 /etc/inittab 文件中的 initdefault 配置行

    ![](media/15354710502028/15361614603860.jpg)

    **查看运行级别**
    * 使用runlevel命令，分别显示：
        *  切换前的运行级别、当前运行级别

    **临时切换运行级别**
    * 使用init命令结合 0-6 的运行级别参数

    ![](media/15354710502028/15361615248351.jpg)

    注：
    
    * 输出结果中分别包含切换前的级别和目前的级别，如果之前未切换过运行级别，第一列将显示“N” 
    * 使用init程序命令切换运行级别，只要使用与运行级别相对应的数字（0~6）作为命令参数即可 

6. 系统服务的启动控制

    **查看系统服务的启动状态**
    
    格式：
    * chkconfig --list
    * chkconfig --list 服务名称
    
    服务脚本位置：/etc/init.d → /etc/rc.d/init.d

    注：
    * 可以适当介绍系统服务的含义、/etc/init.d/目录中各种服务脚本，以及系统服务名称的特点（以字母“d”结尾，表示Daemon，守护进程）
    * /etc/init.d 是一个符号链接，目标为 /etc/rc.d/init.d ，通过这两个目录都可以找到系统服务对应的脚本文件

    **设置系统服务的启动状态**
    
    格式：chkconfig  --level  级别列表 服务名  on|off
    
    chkconfig命令与“--level ”选项配合使用时，可以设置指定服务在指定的运行级别中的启动状态 ：
    * 运行级别列表：可以是235、 35、5等等形式 
    * 服务名称：注意名称要正确，如果忘记了可查看/etc/init.d/目录下的脚本名
    * On|off：启动或关闭启动状态

7. 程序与进程的关系

    **程序**
    * 保存在硬盘、光盘等介质中的可执行代码和数据
    * 是静态保存的代码
    
    **进程**
    * 在CPU及内存中运行的程序代码
    * 是动态执行的代码
    * 父、子进程：每个进程可以创建一个或多个进程

    例如：提供Web服务的httpd程序，当有大量用户同时访问web页面时，httpd程序可能会创建多个进程来提供服务

8. 查看进程信息

    **ps命令**

    用途：查看静态的进程统计信息

    格式：
    * ps aux
    * ps -elf

    常用命令选项
    *  a：显示当前终端下的所有进程信息
    *  u：使用以用户为主的格式输出进程信息
    *  x：显示当前用户在所有终端下的进程信息 
    *  -e：显示系统内的所有进程信息
    *  -l：使用长格式显示进程信息
    *  -f：使用完整的格式显示进程信息

    注：
    
    * 使用ps命令工具时，要注意选项前是否有”-“引导符，例如”e“和”-e”选项的含义是有区别的
    * ps命令结合“aux”选项使用时，将显示系统中所有的进程信息：PID：该进程在系统中的数字ID号，在当前系统中是唯一的；%CPU：CPU占用百分比；%MEM：内存占用百分比
    * ps命令结合“-elf”选项使用时，将以长格式显示系统中所有的进程信息，包含更丰富的内容（其中PPID列表示进程的父进程的PID号）

    **top命令**
    
    用途：查看动态的进程排名信息
    
    * 从用途上对比ps、top两个命令的不同。
    * top工具的命令按键：P、M、N、h、q：
        * 按P键根据CPU占用情况对进程列表进行排序 
        * 按M键根据内存占用情况进行排序
        * 按N键根据启动时间进行排序
        * 按h键可以获得top程序的在线帮助信息
        * 按q键可以正常退出top程序
        * 使用空格键可以强制更新进程状态显示

    **pgrep命令**
    
    用途：根据特定条件查询进程PID信息
    
    常用命令选项：
    *  -l：列出进程的名称
    *  -U：根据进程所属的用户名进行查找
    *  -t：根据进程所在的终端进行查找

    ![](media/15354710502028/15361621502522.jpg)
    **pstree命令**

    用途：以树型结构显示各进程间的关系
    
    常用命令选项：
    *  -p：列出进程的PID号
    *  -u：列出进程对应的用户名
    *  -a：列出进程对应的完整命令

    ![](media/15354710502028/15361622170356.jpg)

9. 进程的不同启动方式

    **手工启动**
    * 前台启动：用户输入命令，直接执行程序
    * 后台启动：在命令行尾加入“&”符号
    
    **调度启动**
    * 使用at命令，设置在某个特定的时间，执行一次任务
    * 使用crontab命令，设置按固定的周期（如每天、每周等）重复执行预先计划好的任务
    
    注：
    
    * 调度启动有两种方式，at命令可设置任务定时启动执行，crontab可实现任务的周期性执行

10. 进程的前后台调度

    * Ctrl+Z 组合键
        * 将当前进程挂起，即调入后台并停止执行
    * jobs命令
        * 查看处于后台的任务列表
    * fg命令
        * 将处于后台的进程恢复到前台运行，需指定任务序号

    ![](media/15354710502028/15361623626610.jpg)

11. 终止进程的运行

    * Ctrl+C组合键
        * 中断正在执行的命令
    * kill、killall命令
        * kill用于终止指定PID号的进程
        * killall用于终止指定名称的所有进程
        * -9 选项用于强制终止

    注：
    
    * 若该进程已经无法响应终止信号，则可以结合“-9”选项强行杀死进程
    * 强制终止进程时可能会导致程序运行的部分数据丢失，因此不得以时不要轻易使用“-9”选项

    **pkill命令**
    
    用途：根据特定条件终止相应的进程
    
    常用命令选项：
    *  -U：根据进程所属的用户名终止相应进程
    *  -t：根据进程所在的终端终止相应进程

    ![](media/15354710502028/15361624653335.jpg)
12. 计划任务管理

    **at命令**
    * 在指定的日期、时间点自动执行预先设置的一些命令操作，属于一次性计划任务
    * 服务脚本名称：/etc/init.d/atd
    * 设置格式：at  [HH:MM]  [yyyy-mm-dd]

    注：
    
    * 使用at命令设置的任务只在指定时间点执行一次，若只指定时间则表示当天的该时间，若只指定日期则表示该日期的当前时间
    * 可以在at交互环境中输入多条命令，最后按Ctrl＋D组合键提交
    * 对应的系统服务atd必须已经运行，否则可能会出现错误提示：Can't open /var/run/atd.pid to signal atd. No atd running?

    **crontab命令**

    * 按照预先设置的时间周期（分钟、小时、天……）重复执行用户指定的命令操作，属于周期性计划任务
    * 服务脚本名称：/etc/init.d/crond
    * 主要设置文件
        *  全局配置文件，位于文件：/etc/crontab 
        *  系统默认的设置，位于目录：/etc/cron.*/
        *  用户定义的设置，位于文件：/var/spool/cron/用户名

    **管理cron计划任务**
    * 编辑计划任务：crontab  -e  [-u  用户名]
    * 查看计划任务：crontab  -l  [-u  用户名]
    * 删除计划任务：crontab  -r  [-u  用户名]

    注：
    
    * 启用周期性任务有一个前提条件，即对应的系统服务crond必须已经运行
    * 全局配置和系统默认配置中的内容一般不需要用户去修改，用户只需设置/var/spool/cron/目录下与本帐号同名的文件即可，接下来介绍如何设置用户自己的计划任务（翻下页）
    * 用户只需执行“crontab -e”命令后会自动调用文本编辑器（默认为vi）并打开“/var/spool/cron/用户名”文件，无需手动指定文件位置

    **crontab任务的配置格式**

    ![](media/15354710502028/15361627538751.jpg)

    | 字段 | 说明                                       |
    | ---- | ------------------------------------------ |
    | 分钟 | 取值为从0到59之间的任意整数                |
    | 小时 | 取值为从0到23之间的任意整数                |
    | 日期 | 取值为从1到31之间的任意整数                |
    | 月份 | 取值为从1到12之间的任意整数                |
    | 星期 | 取值为从0到7之间的任意整数，0或7代表星期日 |
    | 命令 | 要执行的命令或程序脚本                     |

    **时间数值的特殊表示方法**
    * *	   表示该范围内的任意时间
    * ,    表示间隔的多个不连续时间点
    * -	   表示一个连续的时间范围
    * /	   指定间隔的时间频率
    
    **应用示例**
    * 0  17  *  *  1-5		周一到周五每天17:00 
    * 30  8  *  *  1,3,5	每周一、三、五的8点30分
    * 0  8-18/2  *  *  *	8点到18点之间每隔2小时
    * 0  *  */3  *  *		每隔3天

    注：
    * 前面5个字段用于指定任务重复执行的时间规律，第6个字段用于指定具体的任务内容
    * crontab任务配置记录中，所设置的命令在“分钟+小时+日期+月份+星期”都满足的条件下才会运行
    * 由于crontab计划任务的使用频率比较高，因此牢牢记住配置记录的格式是非常有必要的
    * 除了“*”，还可以使用减号“-”、逗号“，”、斜杠“/”与数字构成表达式来表示复杂的时间关系：
        * 使用减号“-”可以表示一个连续的时间范围，如“1-4”表示整数1,2,3,4
        * 使用逗号“,”可以表示一个间隔的不连续范围，如“3, 4, 6, 8”
        * 斜杠符号“/”可以用来指定间隔频率，如在日期字段中的“*/3”表示每隔3天

    **crontab应用示例**
    
    示例1（root用户）
    * 每天早上7:50自动开启sshd服务，22点50时关闭
    * 每隔5天清空一次FTP服务器公共目录/var/ftp/pub
    * 每周六的7:30时，重新启动httpd服务
    * 每周一、三、五的17:30时，打包备份/etc/httpd目录
    
    ```
    [root@localhost ~]# crontab -e
    50 7 * * *  /sbin/service sshd start
    50 22 * * *  /sbin/service sshd stop
    0 * */5 * *  /bin/rm -rf /var/ftp/pub/*
    30 7 * * 6  /sbin/service httpd restart
    30 17 * * 1,3,5  /bin/tar jcvf httpdconf.tar.bz2 /etc/httpd 
    ```
    
    示例2（jerry用户）
    
    * 每周日晚上23:55时将“/etc/passwd”文件的内容复制到宿主目录中，保存为pwd.txt文件 
    
    ```
    [root@localhost ~]# crontab -e -u jerry 
    55 23 * * 7  /bin/cp /etc/passwd /home/jerry/pwd.txt 
    ```

    示例3
    * root用户查看自己的计划任务列表
    * 查看并删除jerry用户设置的计划任务

    ![](media/15354710502028/15361631110229.jpg)

## 系统故障分析与排查

1. 修复MBR扇区故障

2. 修复GRUB引导故障

3. /etc/inittab文件丢失

4. /etc/fstab文件丢失

5. 遗忘root用户的密码

6. 软件包类故障
    1. rpm数据库损坏

    2. 缺少*.so类文件

7. 修复损坏的文件系统

8. 磁盘资源耗尽故障

9. 无法卸载已挂载的设备

10. 检测硬盘中的坏道

11. 系统性能监控
    1. 查看CPU负载

    2. 查看内存使用情况

    3. 磁盘I/O性能监控
