diff --git a/notes/Linux.md b/notes/Linux.md
index 135467a7..40729a2f 100644
--- a/notes/Linux.md
+++ b/notes/Linux.md
@@ -1,53 +1,62 @@
* [一、常用操作以及概念](#一常用操作以及概念)
+ * [快捷键](#快捷键)
* [求助](#求助)
* [关机](#关机)
* [PATH](#path)
- * [运行等级](#运行等级)
* [sudo](#sudo)
- * [GNU](#gnu)
* [包管理工具](#包管理工具)
* [发行版](#发行版)
* [VIM 三个模式](#vim-三个模式)
-* [二、分区](#二分区)
+ * [GNU](#gnu)
+ * [开源协议](#开源协议)
+* [二、磁盘](#二磁盘)
+ * [HDD](#hdd)
+ * [磁盘接口](#磁盘接口)
* [磁盘的文件名](#磁盘的文件名)
+* [三、分区](#三分区)
* [分区表](#分区表)
* [开机检测程序](#开机检测程序)
+* [四、文件系统](#四文件系统)
+ * [分区与文件系统](#分区与文件系统)
+ * [组成](#组成)
+ * [文件读取](#文件读取)
+ * [磁盘碎片](#磁盘碎片)
+ * [block](#block)
+ * [inode](#inode)
+ * [目录](#目录)
+ * [日志](#日志)
* [挂载](#挂载)
-* [三、文件](#三文件)
- * [文件权限概念](#文件权限概念)
- * [文件属性以及权限的修改](#文件属性以及权限的修改)
- * [目录的权限](#目录的权限)
- * [文件默认权限](#文件默认权限)
* [目录配置](#目录配置)
+* [五、文件](#五文件)
+ * [文件属性](#文件属性)
* [文件时间](#文件时间)
* [文件与目录的基本操作](#文件与目录的基本操作)
+ * [修改权限](#修改权限)
+ * [文件默认权限](#文件默认权限)
+ * [目录的权限](#目录的权限)
+ * [链接](#链接)
* [获取文件内容](#获取文件内容)
* [指令与文件搜索](#指令与文件搜索)
-* [四、磁盘与文件系统](#四磁盘与文件系统)
- * [文件系统的组成](#文件系统的组成)
- * [inode](#inode)
- * [目录的 inode 与 block](#目录的-inode-与-block)
- * [实体链接与符号链接](#实体链接与符号链接)
-* [五、压缩与打包](#五压缩与打包)
+* [六、压缩与打包](#六压缩与打包)
* [压缩](#压缩)
* [打包](#打包)
-* [六、Bash](#六bash)
+* [七、Bash](#七bash)
* [特性](#特性)
* [变量操作](#变量操作)
* [指令搜索顺序](#指令搜索顺序)
* [数据流重定向](#数据流重定向)
-* [七、管线指令](#七管线指令)
+* [八、管线指令](#八管线指令)
* [提取指令](#提取指令)
* [排序指令](#排序指令)
* [双向输出重定向](#双向输出重定向)
* [字符转换指令](#字符转换指令)
* [分区指令](#分区指令)
-* [八、正则表达式](#八正则表达式)
+* [九、正则表达式](#九正则表达式)
* [grep](#grep)
* [printf](#printf)
* [awk](#awk)
-* [九、进程管理](#九进程管理)
+* [十、进程管理](#十进程管理)
* [查看进程](#查看进程)
* [进程状态](#进程状态)
* [SIGCHLD](#sigchld)
@@ -55,7 +64,7 @@
* [waitpid()](#waitpid)
* [孤儿进程](#孤儿进程)
* [僵死进程](#僵死进程)
-* [十、I/O 复用](#十io-复用)
+* [十一、I/O 复用](#十一io-复用)
* [概念理解](#概念理解)
* [I/O 模型](#io-模型)
* [select poll epoll](#select-poll-epoll)
@@ -68,6 +77,12 @@
# 一、常用操作以及概念
+## 快捷键
+
+- Tab:命令和文件名补全;
+- Ctrl+C:中断正在运行的程序;
+- Ctrl+D:结束键盘输入(End Of File,EOF)
+
## 求助
### 1. --help
@@ -78,7 +93,7 @@
man 是 manual 的缩写,将指令的具体信息显示出来。
-当执行 man date 时,有 DATE(1) 出现,其中的数字代表指令的类型,常用的数字及其类型如下:
+当执行`man date`时,有 DATE(1) 出现,其中的数字代表指令的类型,常用的数字及其类型如下:
| 代号 | 类型 |
| :--: | -- |
@@ -90,26 +105,30 @@ man 是 manual 的缩写,将指令的具体信息显示出来。
info 与 man 类似,但是 info 将文档分成一个个页面,每个页面可以进行跳转。
+### 4. doc
+
+/usr/share/doc 存放着软件的一整套说明文件。
+
## 关机
-### 1. sync
+### 1. who
+
+在关机前需要先使用 who 命令查看有没有其它用户在线。
+
+### 2. sync
为了加快对磁盘文件的读写速度,位于内存中的文件数据不会立即同步到磁盘上,因此关机之前需要先进行 sync 同步操作。
-### 2. shutdown
+### 3. shutdown
```html
-# /sbin/shutdown [-krhc] [时间] [警告讯息]
--k : 不会关机,只是发送警告讯息,通知所有在线的用户
+# shutdown [-krhc] 时间 [信息]
+-k : 不会关机,只是发送警告信息,通知所有在线的用户
-r : 将系统的服务停掉后就重新启动
-h : 将系统的服务停掉后就立即关机
-c : 取消已经在进行的 shutdown 指令内容
```
-### 3. 其它关机指令
-
-reboot、halt、poweroff。
-
## PATH
可以在环境变量 PATH 中声明可执行文件的路径,路径之间用 : 分隔。
@@ -118,19 +137,43 @@ reboot、halt、poweroff。
/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/dmtsai/.local/bin:/home/dmtsai/bin
```
-## 运行等级
-
-- 0:关机模式
-- 1:单用户模式(可用于破解 root 密码)
-- 2:无网络支持的多用户模式
-- 3:有网络支持的多用户模式(文本模式,工作中最常用的模式)
-- 4:保留,未使用
-- 5:有网络支持的 X-windows 多用户模式(桌面)
-- 6:重新引导系统,即重启
-
## sudo
-使用 sudo 允许一般用户使用 root 可执行的命令,只有在 /etc/sudoers 配置文件中添加的用户才能使用该指令。
+sudo 允许一般用户使用 root 可执行的命令,不过只有在 /etc/sudoers 配置文件中添加的用户才能使用该指令。
+
+## 包管理工具
+
+RPM 和 DPKG 为最常见的两类软件包管理工具。RPM 全称为 Redhat Package Manager,最早由 Red Hat 公司制定实施,随后被 GNU 开源操作系统接受并成为很多 Linux 系统 (RHEL) 的既定软件标准。与 RPM 进行竞争的是基于 Debian 操作系统 (UBUNTU) 的 DEB 软件包管理工具 DPKG,全称为 Debian Package,功能方面与 RPM 相似。
+
+YUM 基于 RPM,具有依赖管理功能,并具有软件升级的功能。
+
+## 发行版
+
+Linux 发行版是 Linux 内核及各种应用软件的集成版本。
+
+| 基于的包管理工具 | 商业发行版 | 社区发行版 |
+| :--: | :--: | :--: |
+| DPKG | Ubuntu | Debian |
+| RPM | Red Hat | Fedora / CentOS |
+
+## VIM 三个模式
+
+- 一般指令模式(Command mode):VIM 的默认模式,可以用于移动游标查看内容;
+- 编辑模式(Insert mode):按下 "i" 等按键之后进入,可以对文本进行编辑;
+- 指令列模式(Bottom-line mode):按下 ":" 按键之后进入,用于保存退出等操作。
+
+
+
+在指令列模式下,有以下命令用于离开或者保存文件。
+
+| 命令 | 作用 |
+| :--: | :--: |
+| :w | 写入磁盘|
+| :w! | 当文件为只读时,强制写入磁盘。到底能不能写入,与用户对该文件的权限有关 |
+| :q | 离开 |
+| :q! | 强制离开不保存 |
+| :wq | 写入磁盘后离开 |
+| :wq!| 强制写入磁盘后离开 |
## GNU
@@ -140,50 +183,64 @@ GNU 计划,译为革奴计划,它的目标是创建一套完全自由的操
- 再复制的自由;
- 改进此程序,并公开发布改进的自由。
-## 包管理工具
+## 开源协议
-RPM 和 DPKG 为最常见的两类软件包管理工具。RPM 全称为 Redhat Package Manager,最早由 Red Hat 公司制定实施,随后被 GNU 开源操作系统接受并成为很多 Linux 系统 (RHEL) 的既定软件标准。与 RPM 进行竞争的是基于 Debian 操作系统 (UBUNTU) 的 DEB 软件包管理工具- DPKG,全称为 Debian Package,功能方面与 RPM 相似。
+- [Choose an open source license](https://choosealicense.com/)
+- [如何选择开源许可证?](http://www.ruanyifeng.com/blog/2011/05/how_to_choose_free_software_licenses.html)
-YUM 基于 RPM 包管理工具,具有依赖管理功能,并具有软件升级的功能。
+# 二、磁盘
-## 发行版
+## HDD
-Linux 发行版是 Linux 内核及各种应用软件的集成版本。
+[Decoding UCS Invicta – Part 1](https://blogs.cisco.com/datacenter/decoding-ucs-invicta-part-1)
-| 基于的包管理工具 | 商业发行版 | 社区发行版 |
-| --- | --- | --- |
-| DPKG | Ubuntu | Debian |
-| RPM | Red Hat | Fedora / CentOS |
+Hard Disk Drives(HDD) 俗称硬盘,具有以下结构:
-## VIM 三个模式
+1. 盘面(Platter):一个硬盘有多个盘面;
+2. 磁道(Track):盘面上的圆形带状区域,一个盘面可以有多个磁道;
+3. 扇区(Track Sector):磁道上的一个弧段,一个磁道可以有多个扇区,它是最小的物理储存单位,目前主要有 512 bytes 与 4 K 两种大小;
+4. 磁头(Head):与盘面非常接近,能够将盘面上的磁场转换为电信号(读),或者将电信号转换为盘面的磁场(写);
+5. 制动手臂(Actuator arm):用于在磁道之间移动磁头;
+6. 主轴(Spindle):使整个盘面转动。
-- 一般指令模式(Command mode):进入 VIM 的默认模式,可以用于移动游标查看内容;
-- 编辑模式(Insert mode):按下 "i" 等按键之后进入,可以对文本进行编辑;
-- 指令列模式(Bottom-line mode):按下 ":" 按键之后进入,用于保存退出等操作。
+
-
+## 磁盘接口
-在指令列模式下,有以下命令用于离开或者保存文件。
+### 1. IDE
-| 命令 | 作用 |
-| :--: | -- |
-| :w | 写入磁盘|
-| :w! | 当文件为只读时,强制写入磁盘。到底能不能写入,与用户对该文件的权限有关 |
-| :q | 离开 |
-| :q! | 强制离开不保存 |
-| :wq | 写入磁盘后离开 |
-| :wq!| 强制写入磁盘后离开 |
+IDE(ATA)全称 Advanced Technology Attachment,接口速度最大为 133MB/s,因为并口线的抗干扰性太差,且排线占用空间较大,不利电脑内部散热,已逐渐被 SATA 所取代。
-# 二、分区
+
+
+### 2. SATA
+
+SATA 全称 Serial ATA,也就是使用串口的 ATA 接口,因抗干扰性强,且对数据线的长度要求比 ATA 低很多,支持热插拔等功能,SATA-II 的接口速度为 300MiB/s,而新的 SATA-III 标准可达到 600MiB/s 的传输速度。SATA 的数据线也比 ATA 的细得多,有利于机箱内的空气流通,整理线材也比较方便。
+
+
+
+### 3. SCSI
+
+SCSI 全称是 Small Computer System Interface(小型机系统接口),经历多代的发展,从早期的 SCSI-II,到目前的 Ultra320 SCSI 以及 Fiber-Channel(光纤通道),接口型式也多种多样。SCSI 硬盘广为工作站级个人电脑以及服务器所使用,因此会使用较为先进的技术,如碟片转速 15000rpm 的高转速,且资料传输时 CPU 占用率较低,但是单价也比相同容量的 ATA 及 SATA 硬盘更加昂贵。
+
+
+
+### 4. SAS
+
+SAS(Serial Attached SCSI)是新一代的 SCSI 技术,和 SATA 硬盘相同,都是采取序列式技术以获得更高的传输速度,可达到 6Gb/s。此外也透过缩小连接线改善系统内部空间等。
+
+
## 磁盘的文件名
-Linux 中每个硬件都被当做一个文件,包括磁盘。常见磁盘的文件名如下:
+Linux 中每个硬件都被当做一个文件,包括磁盘。磁盘以磁盘接口类型进行命名,常见磁盘的文件名如下:
-- SCSI/SATA/USB 磁盘:/dev/sd[a-p]
- IDE 磁盘:/dev/hd[a-d]
+- SATA/SCSI/SAS 磁盘:/dev/sd[a-p]
-其中文件名后面的序号的确定与磁盘插入的顺序有关,而与磁盘所插入的插槽位置无关。
+其中文件名后面的序号的确定与系统侦测到磁盘的顺序有关,而与磁盘所插入的插槽位置无关。
+
+# 三、分区
## 分区表
@@ -193,17 +250,19 @@ Linux 中每个硬件都被当做一个文件,包括磁盘。常见磁盘的
MBR 中,第一个扇区最重要,里面有主要开机记录(Master boot record, MBR)及分区表(partition table),其中 MBR 占 446 bytes,分区表占 64 bytes。
-分区表只有 64 bytes,最多只能存储 4 个分区,这 4 个分区为主分区(Primary)和扩展分区(Extended)。其中扩展分区只有一个,它将其它空间用来记录分区表,因此通过扩展分区可以分出更多分区,这些分区称为逻辑分区。
+分区表只有 64 bytes,最多只能存储 4 个分区,这 4 个分区为主分区(Primary)和扩展分区(Extended)。其中扩展分区只有一个,它将其它扇区用来记录分区表,因此通过扩展分区可以分出更多分区,这些分区称为逻辑分区。
Linux 也把分区当成文件,分区文件的命名方式为:磁盘文件名 + 编号,例如 /dev/sda1。注意,逻辑分区的编号从 5 开始。
### 2. GPT
-不同的磁盘有不同的扇区大小,例如 512 bytes 和最新磁盘的 4 k。GPT 为了兼容所有磁盘,在定义扇区上使用逻辑区块地址(Logical Block Address, LBA)。
+不同的磁盘有不同的扇区大小,例如 512 bytes 和最新磁盘的 4 k。GPT 为了兼容所有磁盘,在定义扇区上使用逻辑区块地址(Logical Block Address, LBA),LBA 默认大小为 512 bytes。
-GPT 第 1 个区块记录了 MBR,紧接着是 33 个区块记录分区信息,并把最后的 33 个区块用于对分区信息进行备份。
+GPT 第 1 个区块记录了 MBR,紧接着是 33 个区块记录分区信息,并把最后的 33 个区块用于对分区信息进行备份。这 33 个区块第一个为 GPT 表头纪录,这个部份纪录了分区表本身的位置与大小和备份分区的位置,同时放置了分区表的校验码 (CRC32),操作系统可以根据这个校验码来判断 GPT 是否正确。若有错误,可以使用备份分区进行恢复。
-GPT 没有扩展分区概念,都是主分区,最多可以分 128 个分区。
+GPT 没有扩展分区概念,都是主分区,每个 LAB 可以分 4 个分区,因此总共可以分 4 * 32 = 128 个分区。
+
+MBR 不支持 2.2 TB 以上的硬盘,GPT 则最多支持到 233 TB = 8 ZB。
@@ -211,29 +270,120 @@ GPT 没有扩展分区概念,都是主分区,最多可以分 128 个分区
### 1. BIOS
-BIOS 是开机的时候计算机执行的第一个程序,这个程序知道可以开机的磁盘,并读取磁盘第一个扇区的 MBR,由 MBR 执行其中的开机管理程序,这个开机管理程序会加载操作系统的核心文件。
+BIOS(Basic Input/Output System,基本输入输出系统),它是一个固件(嵌入与硬件中的软件),BIOS 程序存放在断电后内容不会丢失的只读内存中。
-MBR 中的开机管理程序提供以下功能:选单、载入核心文件以及转交其它开机管理程序。转交这个功能可以用来实现了多重引导,只需要将另一个操作系统的开机管理程序安装在其它分区的启动扇区上,在启动 MBR 中的开机管理程序时,就可以选择启动当前的操作系统或者转交给其它开机管理程序从而启动另一个操作系统。
+BIOS 是开机的时候计算机执行的第一个程序,这个程序知道可以开机的磁盘,并读取磁盘第一个扇区的 MBR,由 MBR 执行 MBR 中的开机管理程序,这个开机管理程序会加载操作系统的核心文件。
-安装多重引导,最好先安装 Windows 再安装 Linux。因为安装 Windows 时会覆盖掉 MBR,而 Linux 可以选择将开机管理程序安装在 MBR 或者其它分区的启动扇区,并且可以设置开机管理程序的选单。
+
+
+MBR 中的开机管理程序提供以下功能:选单、载入核心文件以及转交其它开机管理程序。转交这个功能可以用来实现了多重引导,只需要将另一个操作系统的开机管理程序安装在其它分区的启动扇区上,在启动 MBR 中的开机管理程序时,就可以通过选单选择启动当前的操作系统或者转交给其它开机管理程序从而启动另一个操作系统。
+
+下图中,第一扇区的 MBR 中的开机管理程序提供了两个选单:M1、M2,M1 指向了 Windows 操作系统,而 M2 指向其它分区的启动扇区,里面包含了另外一个开机管理程序,提供了一个指向 Linux 的选单。
+安装多重引导,最好先安装 Windows 再安装 Linux。因为安装 Windows 时会覆盖掉 MBR,而 Linux 可以选择将开机管理程序安装在 MBR 或者其它分区的启动扇区,并且可以设置开机管理程序的选单。
+
### 2. UEFI
-UEFI 相比于 BIOS 来说功能更为全面,也更为安全。
+BIOS 不可以读取 GPT 分区表,而 UEFI 可以。
+
+# 四、文件系统
+
+## 分区与文件系统
+
+对分区进行格式化是为了在分区上建立文件系统。一个分区通常只能格式化为一个文件系统,但是磁盘阵列等技术可以将一个分区格式化为多个文件系统。
+
+## 组成
+
+
+
+最主要的几个组成部分如下:
+
+1. inode:一个文件占用一个 inode,记录文件的属性,同时记录此文件的内容所在的 block 编号;
+2. block:记录文件的内容,文件太大时,会占用多个 block。
+
+除此之外还包括:
+
+1. superblock:记录文件系统的整体信息,包括 inode 和 block 的总量、使用量、剩余量,以及文件系统的格式与相关信息等;
+2. block bitmap:记录 block 是否被使用的位域;
+
+## 文件读取
+
+对于 Ext2 文件系统,当要读取一个文件的内容时,先在 inode 中去查找文件内容所在的所有 block,然后把所有 block 的内容读出来。
+
+
+
+而对于 FAT 文件系统,它没有 inode,每个 block 中存储着下一个 block 的编号。
+
+
+
+## 磁盘碎片
+
+指一个文件内容所在的 block 过于分散。
+
+## block
+
+在 Ext2 文件系统中所支持的 block 大小有 1K,2K 及 4K 三种,不同的大小限制了单个文件和文件系统的最大大小。
+
+| 大小 | 1KB | 2KB | 4KB |
+| :---: | :---: | :---: | :---: |
+| 最大单一文件 | 16GB | 256GB | 2TB |
+| 最大文件系统 | 2TB | 8TB | 16TB |
+
+一个 block 只能被一个文件所使用,未使用的部分直接浪费了。因此如果需要存储大量的小文件,那么最好选用比较小的 block。
+
+## inode
+
+inode 具体包含以下信息:
+
+- 权限 (read/write/excute);
+- 拥有者与群组 (owner/group);
+- 容量;
+- 建立或状态改变的时间 (ctime);
+- 最近一次的读取时间 (atime);
+- 最近修改的时间 (mtime);
+- 定义文件特性的旗标 (flag),如 SetUID...;
+- 该文件真正内容的指向 (pointer)。
+
+inode 具有以下特点:
+
+- 每个 inode 大小均固定为 128 bytes (新的 ext4 与 xfs 可设定到 256 bytes);
+- 每个文件都仅会占用一个 inode。
+
+inode 中记录了文件内容所在的 block 编号,但是每个 block 非常小,一个大文件随便都需要几十万的 block。而一个 inode 大小有限,无法直接引用这么多 block 编号。因此引入了间接、双间接、三间接引用。间接引用是指,让 inode 记录的引用 block 块当成 inode 用来记录引用信息。
+
+
+
+## 目录
+
+建立一个目录时,会分配一个 inode 与至少一个 block。block 记录的内容是目录下所有文件的 inode 编号以及文件名。可以看出文件的 inode 本身不记录文件名,文件名记录在目录中,因此新增文件、删除文件、更改文件名这些操作与目录的 w 权限有关。
+
+## 日志
+
+如果突然断电,那么文件系统会发生错误,例如断电前只修改了 block bitmap,而还没有将数据真正写入 block 中。
+
+ext3/ext4 文件系统引入了日志功能,可以利用日志来修复文件系统。
## 挂载
-挂载利用目录作为分区的进入点,也就是说,进入目录之后就可以读取分区的数据。
+挂载利用目录作为文件系统的进入点,也就是说,进入目录之后就可以读取文件系统的数据。
-
+## 目录配置
-# 三、文件
+为了使不同 Linux 发行版本的目录结构保持一致性,Filesystem Hierarchy Standard (FHS) 规定了 Linux 的目录结构。最基础的三个目录如下:
-## 文件权限概念
+- / (root, 根目录)
+- /usr (unix software resource):所有系统默认软件都会安装到这个目录;
+- /var (variable):存放系统或程序运行过程中的数据文件。
-把用户分为三种:文件拥有者、群组以及其它人,对不同的用户有不同的文件权限。
+
+
+# 五、文件
+
+## 文件属性
+
+用户分为三种:文件拥有者、群组以及其它人,对不同的用户有不同的文件权限。
使用 ls 查看一个文件时,会显示一个文件的信息,例如 `drwxr-xr-x. 3 root root 17 May 6 00:14 .config`,对这个信息的解释如下:
@@ -253,24 +403,102 @@ UEFI 相比于 BIOS 来说功能更为全面,也更为安全。
9 位的文件权限字段中,每 3 个为一组,共 3 组,每一组分别代表对文件拥有者、所属群组以及其它人的文件权限。一组权限中的 3 位分别为 r、w、x 权限,表示可读、可写、可执行。
-## 文件属性以及权限的修改
+## 文件时间
-### 1. 修改文件所属群组
+1. modification time (mtime):文件的内容更新就会更新;
+2. status time (ctime):文件的状态(权限、属性)更新就会更新;
+3. access time (atime):读取文件时就会更新。
+
+## 文件与目录的基本操作
+
+### 1. ls
+
+列出文件或者目录的信息,目录的信息就是其中包含的文件。
```html
-# chgrp [-R] groupname dirname/filename
--R:递归修改
+# ls [-aAdfFhilnrRSt] file|dir
+-a :列出全部的文件
+-d :仅列出目录本身
+-l :以长数据串行列出,包含文件的属性与权限等等数据
```
-### 2. 修改文件拥有者
+### 2. cd
-不仅可以修改文件拥有者,也可以修改文件所属群组。
+更换当前目录。
+
+```
+cd [相对路径或绝对路径]
+```
+
+### 3. mkdir
+
+创建目录。
+
+```
+# mkdir [-mp] 目录名称
+-m :配置目录权限
+-p :递归创建目录
+```
+
+### 4. rmdir
+
+删除目录,必须为空。
```html
-# chown [-R] 用户名:群组名 dirname/filename
+rmdir [-p] 目录名称
+-p :递归删除目录
```
-### 3. 修改权限
+### 5. touch
+
+更新文件时间或者建立新文件。
+
+```html
+# touch [-acdmt] filename
+-a : 更新 atime
+-c : 更新 ctime,若该文件不存在则不建立新文件
+-m : 更新 mtime
+-d : 后面可以接更新日期而不使用当前日期,也可以使用 --date="日期或时间"
+-t : 后面可以接更新时间而不使用当前时间,格式为[YYYYMMDDhhmm]
+```
+
+### 6. cp
+
+复制文件。
+
+如果源文件有两个以上,则目的文件一定要是目录才行。
+
+```html
+cp [-adfilprsu] source destination
+-a :相当于 -dr --preserve=all 的意思,至于 dr 请参考下列说明
+-d :若来源文件为链接文件,则复制链接文件属性而非文件本身
+-i :若目标文件已经存在时,在覆盖前会先询问
+-p :连同文件的属性一起复制过去
+-r :递归持续复制
+-u :destination 比 source 旧才更新 destination,或 destination 不存在的情况下才复制
+--preserve=all :除了 -p 的权限相关参数外,还加入 SELinux 的属性, links, xattr 等也复制了
+```
+
+### 7. rm
+
+删除文件。
+
+```html
+# rm [-fir] 文件或目录
+-r :递归删除
+```
+
+### 8. mv
+
+移动文件。
+
+```html
+# mv [-fiu] source destination
+# mv [options] source1 source2 source3 .... directory
+-f : force 强制的意思,如果目标文件已经存在,不会询问而直接覆盖
+```
+
+## 修改权限
可以将一组权限用数字来表示,此时一组权限的 3 个位当做二进制数字的位,从左到右每个位的权值为 4、2、1,即每个权限对应的数字权值为 r : 4、w : 2、x : 1。
@@ -303,82 +531,54 @@ UEFI 相比于 BIOS 来说功能更为全面,也更为安全。
# chmod a+w .bashrc
```
+## 文件默认权限
+
+- 文件默认权限:文件默认没有可执行权限,因此为 666,也就是 -rw-rw-rw- 。
+- 目录默认权限:目录必须要能够进入,也就是必须拥有可执行权限,因此为 777 ,也就是 drwxrwxrwx。
+
+可以通过 umask 设置或者查看文件的默认权限,通常以掩码的形式来表示,例如 002 表示其它用户的权限去除了一个 2 的权限,也就是写权限,因此建立新文件时默认的权限为 -rw-rw-r--。
+
## 目录的权限
文件名不是存储在一个文件的内容中,而是存储在一个文件所在的目录中。因此,拥有文件的 w 权限并不能对文件名进行修改。
目录存储文件列表,一个目录的权限也就是对其文件列表的权限。因此,目录的 r 权限表示可以读取文件列表;w 权限表示可以修改文件列表,具体来说,就是添加删除文件,对文件名进行修改;x 权限可以让该目录成为工作目录,x 权限是 r 和 w 权限的基础,如果不能使一个目录成为工作目录,也就没办法读取文件列表以及对文件列表进行修改了。
-## 文件默认权限
-
-- 文件默认权限:文件默认没有可执行权限,因此为 666,也就是 -rw-rw-rw- 。
-- 目录默认权限:目录必须要能够进入,也就是必须拥有可执行权限,因此为 777 ,也就是 drwxrwxrwx。
-
-可以通过 umask 设置或者查看文件的默认权限,通常以掩码的形式来表示,例如 002 表示其它用户的权限去除了一个 2 的权限,也就是写权限,因此建立新文件时默认的权限为 -rw-rw-r-- 。
-
-## 目录配置
-
-为了使不同 Linux 发行版本的目录结构保持一致性,Filesystem Hierarchy Standard (FHS) 规定了 Linux 的目录结构。最基础的三个目录如下:
-
-- / (root, 根目录)
-- /usr (unix software resource):所有系统默认软件都会安装到这个目录;
-- /var (variable):存放系统或程序运行过程中的数据文件。
-
-
-
-## 文件时间
-
-1. modification time (mtime):文件的内容更新就会更新;
-2. status time (ctime):文件的状态(权限、属性)更新就会更新;
-3. access time (atime):读取文件时就会更新。
-
-## 文件与目录的基本操作
-
-### 1. ls
-
-列出文件或者目录的信息,目录的信息就是其中包含的文件。
+## 链接
```html
-# ls [-aAdfFhilnrRSt] file|dir
--a :列出全部的文件
--d :仅列出目录本身
--l :以长数据串行列出,包含文件的属性与权限等等数据
+# ln [-sf] source_filename dist_filename
+-s :默认是 hard link,加 -s 为 symbolic link
+-f :如果目标文件存在时,先删除目标文件
```
-### 2. cp
+### 1. 实体链接
-复制操作。
+它和普通文件类似,实体链接文件的 inode 都指向源文件所在的 block 上,也就是说读取文件直接从源文件的 block 上读取。
-如果源文件有两个以上,则目的文件一定要是目录才行。
+删除任意一个条目,文件还是存在,只要引用数量不为 0。
+
+有以下限制:不能跨越 File System、不能对目录进行链接。
```html
-cp [-adfilprsu] source destination
--a :相当于 -dr --preserve=all 的意思,至于 dr 请参考下列说明
--d :若来源文件为链接文件,则复制链接文件属性而非文件本身
--i :若目标文件已经存在时,在覆盖前会先询问
--p :连同文件的属性一起复制过去
--r :递归持续复制
--u :destination 比 source 旧才更新 destination,或 destination 不存在的情况下才复制
---preserve=all :除了 -p 的权限相关参数外,还加入 SELinux 的属性, links, xattr 等也复制了
+# ln /etc/crontab .
+# ll -i /etc/crontab crontab
+34474855 -rw-r--r--. 2 root root 451 Jun 10 2014 crontab
+34474855 -rw-r--r--. 2 root root 451 Jun 10 2014 /etc/crontab
```
-### 3. rm
+### 2. 符号链接
-移除操作。
+符号链接文件保存着源文件所在的绝对路径,在读取时会定位到源文件上,可以理解为 Windows 的快捷方式。
+
+当源文件被删除了,链接文件就打不开了。
+
+可以为目录建立链接。
```html
-# rm [-fir] 文件或目录
--r :递归删除
-```
-
-### 4. mv
-
-移动操作。
-
-```html
-# mv [-fiu] source destination
-# mv [options] source1 source2 source3 .... directory
--f : force 强制的意思,如果目标文件已经存在,不会询问而直接覆盖
+# ll -i /etc/crontab /root/crontab2
+34474855 -rw-r--r--. 2 root root 451 Jun 10 2014 /etc/crontab
+53745909 lrwxrwxrwx. 1 root root 12 Jun 23 22:31 /root/crontab2 -> /etc/crontab
```
## 获取文件内容
@@ -398,15 +598,15 @@ cp [-adfilprsu] source destination
### 3. more
-可以一页一页查看文件内容,和文本编辑器类似。
+和 cat 不同的是它可以一页一页查看文件内容,比较适合大文件的查看。
### 4. less
-和 more 类似。
+和 more 类似,但是多了一个向前翻页的功能。
### 5. head
-可以取得文件前几行。
+取得文件前几行。
```html
# head [-n number] filename
@@ -419,20 +619,7 @@ cp [-adfilprsu] source destination
### 7. od
-可以以字符或者十六进制的形式显示二进制文件。
-
-### 8. touch
-
-修改文件时间或者建立新文件。
-
-```html
-# touch [-acdmt] filename
--a : 更新 atime
--c : 更新 ctime,若该文件不存在则不建立新文件
--m : 更新 mtime
--d : 后面可以接更新日期而不使用当前日期,也可以使用 --date="日期或时间"
--t : 后面可以接更新时间而不使用当前时间,格式为[YYYYMMDDhhmm]
-```
+以字符或者十六进制的形式显示二进制文件。
## 指令与文件搜索
@@ -508,85 +695,9 @@ example: find . -name "shadow*"
-perm /mode :搜索权限包含任一 mode 的文件
```
-# 四、磁盘与文件系统
-## 文件系统的组成
-对分区进行格式化是为了在分区上建立文件系统。一个分区通常只能格式化为一个文件系统,但是磁盘阵列等技术可以将一个分区格式化为多个文件系统,因此只有文件系统能被挂载,而分区不能被挂载。
-
-文件系统有以下三个结构:
-
-1. superblock:记录文件系统的整体信息,包括 inode 和 block 的总量、使用量、剩余量,以及文件系统的格式与相关信息等;
-2. inode:一个文件占用一个 inode,记录文件的属性,同时记录此文件的内容所在的 block 号码;
-3. block:记录文件的内容,文件太大时,会占用多个 block。
-
-
-
-当要读取一个文件的内容时,先在 inode 中去查找文件内容所在的所有 block,然后把所有 block 的内容读出来。
-
-磁盘碎片是指一个文件内容所在的 block 过于分散。
-
-## inode
-
-Ext2 文件系统支持的 block 大小有 1k、2k 和 4k 三种,不同的 block 大小限制了单一文件的大小。而每个 inode 大小是固定为 128 bytes。
-
-inode 中记录了文件内容所在的 block,但是每个 block 非常小,一个大文件随便都需要几十万的 block。而一个 inode 大小有限,无法直接引用这么多 block。因此引入了间接、双间接、三间接引用。间接引用是指,让 inode 记录的引用 block 块当成 inode 用来记录引用信息。
-
-
-
-inode 具体包含以下信息:
-
-- 该文件的存取模式 (read/write/excute);
-- 该文件的拥有者与群组 (owner/group);
-- 该文件的容量;
-- 该文件建立或状态改变的时间 (ctime);
-- 最近一次的读取时间 (atime);
-- 最近修改的时间 (mtime);
-- 定义文件特性的旗标 (flag),如 SetUID...;
-- 该文件真正内容的指向 (pointer)。
-
-## 目录的 inode 与 block
-
-建立一个目录时,会分配一个 inode 与至少一个 block。block 记录的内容是目录下所有文件的 inode 编号以及文件名。可以看出文件的 inode 本身不记录文件名,文件名记录在目录中,因此新增文件、删除文件、更改文件名这些操作与目录的 w 权限有关。
-
-## 实体链接与符号链接
-
-```html
-# ln [-sf] source_filename dist_filename
--s :默认是 hard link,加 -s 为 symbolic link
--f :如果目标文件存在时,先删除目标文件
-```
-
-### 1. 实体链接
-
-它和普通文件类似,实体链接文件的 inode 都指向源文件所在的 block 上,也就是说读取文件直接从源文件的 block 上读取。
-
-删除任意一个条目,文件还是存在,只要引用数量不为 0。
-
-有以下限制:不能跨越 File System、不能对目录进行链接。
-
-```html
-# ln /etc/crontab .
-# ll -i /etc/crontab crontab
-34474855 -rw-r--r--. 2 root root 451 Jun 10 2014 crontab
-34474855 -rw-r--r--. 2 root root 451 Jun 10 2014 /etc/crontab
-```
-
-### 2. 符号链接
-
-符号链接文件保存着源文件所在的绝对路径,在读取时会定位到源文件上,可以理解为 Windows 的快捷方式。
-
-当源文件被删除了,链接文件就打不开了。
-
-可以为目录建立链接。
-
-```html
-# ll -i /etc/crontab /root/crontab2
-34474855 -rw-r--r--. 2 root root 451 Jun 10 2014 /etc/crontab
-53745909 lrwxrwxrwx. 1 root root 12 Jun 23 22:31 /root/crontab2 -> /etc/crontab
-```
-
-# 五、压缩与打包
+# 六、压缩与打包
## 压缩
@@ -671,7 +782,7 @@ $ tar [-z|-j|-J] [xv] [-f 已有的 tar 文件] [-C 目录] ==解压缩
| 查 看 | tar -jtv -f filename.tar.bz2 |
| 解压缩 | tar -jxv -f filename.tar.bz2 -C 要解压缩的目录 |
-# 六、Bash
+# 七、Bash
可以通过 Shell 请求内核提供服务,Bash 正是 Shell 的一种。
@@ -753,7 +864,7 @@ $ echo ${array[1]}
$ find /home -name .bashrc > list 2>&1
```
-# 七、管线指令
+# 八、管线指令
管线是将一个命令的标准输出作为另一个命令的标准输入,在数据需要经过多个步骤的处理之后才能得到我们想要的内容时就可以使用管线。在命令之间使用 | 分隔各个管线命令。
@@ -907,7 +1018,7 @@ $ split [-bl] file PREFIX
- PREFIX :分区文件的前导名称
```
-# 八、正则表达式
+# 九、正则表达式
## grep
@@ -1006,7 +1117,7 @@ bin 1
daemon 2
```
-# 九、进程管理
+# 十、进程管理
## 查看进程
@@ -1129,7 +1240,7 @@ options 参数主要有 WNOHANG 和 WUNTRACED 两个选项,WNOHANG 可以使 w
要消灭系统中大量的僵死进程,只需要将其父进程杀死,此时所有的僵死进程就会变成孤儿进程,从而被 init 所收养,这样 init 就会释放所有的僵死进程所占有的资源,从而结束僵死进程。
-# 十、I/O 复用
+# 十一、I/O 复用
## 概念理解
@@ -1150,7 +1261,7 @@ I/O Multiplexing 又被称为 Event Driven I/O,它可以让单个进程具有
同步异步是获知 I/O 完成的方式,同步需要时刻关心 I/O 是否已经完成,异步无需主动关心,在 I/O 完成时它会收到通知。
-
+
### 1. 同步-阻塞
@@ -1425,3 +1536,14 @@ poll 没有最大描述符数量的限制,如果平台支持应该采用 poll
- [Linux process states](https://idea.popcount.org/2012-12-11-linux-process-states/)
- [GUID Partition Table](https://en.wikipedia.org/wiki/GUID_Partition_Table)
- [详解 wait 和 waitpid 函数](https://blog.csdn.net/kevinhg/article/details/7001719)
+- [IDE、SATA、SCSI、SAS、FC、SSD 硬盘类型介绍](https://blog.csdn.net/tianlesoftware/article/details/6009110)
+- [Akai IB-301S SCSI Interface for S2800,S3000](http://www.mpchunter.com/s3000/akai-ib-301s-scsi-interface-for-s2800s3000/)
+- [Parallel ATA](https://en.wikipedia.org/wiki/Parallel_ATA)
+- [ADATA XPG SX900 256GB SATA 3 SSD Review – Expanded Capacity and SandForce Driven Speed](http://www.thessdreview.com/our-reviews/adata-xpg-sx900-256gb-sata-3-ssd-review-expanded-capacity-and-sandforce-driven-speed/4/)
+- [Decoding UCS Invicta – Part 1](https://blogs.cisco.com/datacenter/decoding-ucs-invicta-part-1)
+- [硬盘](https://zh.wikipedia.org/wiki/%E7%A1%AC%E7%9B%98)
+- [Difference between SAS and SATA](http://www.differencebetween.info/difference-between-sas-and-sata)
+- [BIOS](https://zh.wikipedia.org/wiki/BIOS)
+- [File system design case studies](https://www.cs.rutgers.edu/\~pxk/416/notes/13-fs-studies.html)
+- [Programming Project #4](https://classes.soe.ucsc.edu/cmps111/Fall08/proj4.shtml)
+- [FILE SYSTEM DESIGN](http://web.cs.ucla.edu/classes/fall14/cs111/scribe/11a/index.html)
diff --git a/pics/014fbc4d-d873-4a12-b160-867ddaed9807.jpg b/pics/014fbc4d-d873-4a12-b160-867ddaed9807.jpg
new file mode 100644
index 00000000..39c003ce
Binary files /dev/null and b/pics/014fbc4d-d873-4a12-b160-867ddaed9807.jpg differ
diff --git a/pics/075e1977-7846-4928-96c8-bb5b0268693c.jpg b/pics/075e1977-7846-4928-96c8-bb5b0268693c.jpg
new file mode 100644
index 00000000..b8b100a0
Binary files /dev/null and b/pics/075e1977-7846-4928-96c8-bb5b0268693c.jpg differ
diff --git a/pics/50831a6f-2777-46ea-a571-29f23c85cc21.jpg b/pics/50831a6f-2777-46ea-a571-29f23c85cc21.jpg
new file mode 100644
index 00000000..4a3f798b
Binary files /dev/null and b/pics/50831a6f-2777-46ea-a571-29f23c85cc21.jpg differ
diff --git a/pics/6729baa0-57d7-4817-b3aa-518cbccf824c.jpg b/pics/6729baa0-57d7-4817-b3aa-518cbccf824c.jpg
new file mode 100644
index 00000000..7035f001
Binary files /dev/null and b/pics/6729baa0-57d7-4817-b3aa-518cbccf824c.jpg differ
diff --git a/pics/83185315-793a-453a-a927-5e8d92b5c0ef.jpg b/pics/83185315-793a-453a-a927-5e8d92b5c0ef.jpg
new file mode 100644
index 00000000..cb83edea
Binary files /dev/null and b/pics/83185315-793a-453a-a927-5e8d92b5c0ef.jpg differ
diff --git a/pics/924914c0-660c-4e4a-bbc0-1df1146e7516.jpg b/pics/924914c0-660c-4e4a-bbc0-1df1146e7516.jpg
new file mode 100644
index 00000000..5bb29598
Binary files /dev/null and b/pics/924914c0-660c-4e4a-bbc0-1df1146e7516.jpg differ
diff --git a/pics/BSD_disk.png b/pics/BSD_disk.png
new file mode 100644
index 00000000..48b0e0e8
Binary files /dev/null and b/pics/BSD_disk.png differ
diff --git a/pics/f0574025-c514-49f5-a591-6d6a71f271f7.jpg b/pics/f0574025-c514-49f5-a591-6d6a71f271f7.jpg
new file mode 100644
index 00000000..66a2ecbe
Binary files /dev/null and b/pics/f0574025-c514-49f5-a591-6d6a71f271f7.jpg differ
diff --git a/pics/f9f2a16b-4843-44d1-9759-c745772e9bcf.jpg b/pics/f9f2a16b-4843-44d1-9759-c745772e9bcf.jpg
new file mode 100644
index 00000000..b6a0ba79
Binary files /dev/null and b/pics/f9f2a16b-4843-44d1-9759-c745772e9bcf.jpg differ
diff --git a/pics/inode_with_signatures.jpg b/pics/inode_with_signatures.jpg
new file mode 100644
index 00000000..518ba5ac
Binary files /dev/null and b/pics/inode_with_signatures.jpg differ