Linux存储管理:
CPU包含运算器和控制器,另一重要组件RAM内存
磁盘是非常重要的输入输出设备
将各个组件连接在主板上提供总线环境
桥(南北桥)是最为经典的主板处理概念
主板上除了提供控制器Controller这种机制外,还有插槽直接插入槽中的叫做适配器Adapter
磁盘控制器,总线,接口
传统的CPU包含运算器和存储器
memory(RAM)内存
输入输出设备
比如磁盘 非常重要的一种输入输出设备
想要和用户交互需要显示器 键盘
键盘键入数据怎样显示在电脑上 显示器的接口并不是只有vga一种 显示器不一定需要连接到显卡上
IO设备 磁盘鼠标键盘显卡网卡 输入和输出都是数据的输入输出 只要是数据就要被CPU 处理
数据是怎样与CPU联系在一起的 CPU与各个设备都有通信通道叫做总线
总线无法单独存在的 集成在一起成就了所谓的主板 一天有86400s
在主板建构中有一种委托结构 叫做主板芯片组 北桥和南桥
北桥叫做高速芯片组 南桥叫做低速芯片组
硬盘是有一根电源线和一根数据线的
数据线 接在接口上在主板上叫做总线控制器 作用是连接磁盘和南桥 是磁盘的数据传输到低速芯片组 再经高速芯片组处理交给CPU处理
插槽 直接插在插槽中的设备叫做适配器 适配器通过某种总线连接到总线的 这种设备需要断电插拔 否则会导致插拔的瞬间产生较大的电流造成烧毁
磁盘中是绝对真空的 相当于一个金属盒子
里面放有金属盘片 里面有磁头悬臂
磁盘接口的类型:
IDE:并行接口,来源于更早的ATA接口,133Mbps,266Mbps
SCSI:小型计算机系统接口
UltraSCSI320:320Mbps(接口带宽)
UltraSCSI640:640Mbps
窄带控制器:可以提供7个接口
宽带控制器:可以提供15个接口

SATA:Serial ATA,串行接口; 民用较多 串行接口并不一定比并行接口慢
 SATA1,SATA2,SATA3,6Gbps
SAS:串行接口  企业常用
  6Gbps
  可以提供1023个接口

USB:新近出现的一种数据总线控制方式 若干版本更迭 :1.0 1.1 2.0 3.0 3.1
  2.0:60Mbps
  3.0:480Mbps
  3.1:10Gbps

衡量磁盘IO能力的另一个指标:IOPS(每秒内可以完成多少次读写操作,读的操作要远远大于写的操作)
IDE :机械磁盘, 50-100 IOPS

SCSI:机械磁盘, 100-200 IOPS
IDE、SCSI:固态磁盘, 400 IOPS

SATA:机械磁盘, 100IOPS左右
      固态磁盘, 400 IOPS左右

SAS: 机械磁盘, 200IOPS左右
      固态磁盘, 800IOPS左右

PCI-E接口的固态硬盘:
 读的IOPS:400000-800000
 写的iops:50000-100000

普通的x86架构的的主板上的磁盘控制器的接口:
IDE:有2个接口,每个接口接一个主盘和一个从盘;如果有光驱的话,可能减少至3个磁盘+1个光驱;

STAT:4-6个接口;

SCSI:7个接口或15个接口;

SAS:1023-16384个接口;

CPU:控制总线,数据总线,地址总线;
内存的总线FSB前端总线,内存所专有的, 前端总线宽度一般应为CUP的处理频率的一半或者相当。

Linux存储管理(2)
机械磁盘:
术语:
track:磁道,磁头在磁盘表面的运行轨迹的投影;
sector:扇区,512Byte,现在所说的扇区,实际上是平均值;最小管理单元;
culinder:柱面,从某个磁道向所有盘片做投影,所形成的圆柱表面;实际上是由所有盘片上相同位置的磁道组成;
partition:分区,从某个柱面到另一个柱面之间所有的柱面存储空间;
head:磁头,每个盘片每个磁面都有一个磁头,用于数据的读写操作;

磁盘性能的指标:
主轴转速:磁盘每分钟旋转的圈数;
平均寻道时间:磁头从初始位置到确定数据所在磁道到移动到所在磁道的时间;时间越少数据读取速度越快;
缓存:

/dev用于存放硬件设备被映射出的文件,磁盘的设备文件也存放与此;
设备文件:是关联的硬件设备的驱动程序和设备的访问入口;
[root@localhost ~]# ls -l /dev
总用量 0
c(文件类型)rw-rw----. 1(链接数) root(所有者) video(所属组) 10(设备号), 175 1月 20 16:52 agpgart
...
设备号:
major,minor

major:主设备号,区分不同设备的设备类型,用于标明设备所需的驱动程序;
minor:次设备号,在同种类型的设备中的不同设备,用于对设备提供访问入口;

设备类型:
块设备:
以块为基本单位进行随机访问的设备,通常都是用来存储数据的设备;

字符设备:
以字节为基本单位,进行线性访问的设备,通常为处理数据的设备;

设备文件名:
定义方式:最早由此组织IANA(美国国内的一个组织) --> 后来转交给此组织ICANN来命名管理

/dev
IDE:命名方式必须是以hd开头的 hd[a-d]
SCSI|SATA|SAS|USB:sd[a-z]+

RedHat Enterprise Linux 从RHEL6开始,将IDE接口的磁盘也命名为sd*,自此以后所有的磁盘设备被统一命名为sd[a-z]+

设备的引用方式:
1.设备文件名
2.卷标(Volume Lable) 在当前主机内是一般不会改变(特殊情况:如果把一块磁盘拔下装到另一个主机上此主机上的某个磁盘读的卷标与此个磁盘的卷标相同,那么只能有一个能够正常使用;)
3.UUID:全局唯一标识符;Universal Unique IDentifier

mknod命令:
mknod - make block or character special files 创建一个节点设备文件

格式:
mknod [OPTION]... NAME TYPE [MAJOR MINOR]
需要注意的选项:
-m, --mode=MODE:指明权限 如果不使用默认权限为a=rw - umask

如何使用新的磁盘设备?
1.让Linux系统内核识别设备,对设备进行分区;
2.格式化
低级格式化:磁盘初始化,磁道划分;
高级格式化:创建或重建文件系统(只是删除元数据);
3.使用文件系统:
挂载
卸载

为何分区:
1.优化磁盘IO性能;
2.可以实现对某个存储空间的配额限制;
3.进行高速的磁盘问题修复;
4.隔离系统文件和其他应用程序文件;
5.安装多个操作系统;

如何分区?
MBR:整个磁盘空间小于2TB容量,建议使用MBR分区格式
MBR:Master Boot Record ,主引导记录,始于1982年;
MBR其实也是一段数据,默认保存在磁盘的0磁道0扇区中;
分为三部分:
446Bytes:boot loader,引导加载程序;
Windows:NTLDR
Linux:LILO,GRUB(默认)
64Bytes:Partition table,分区表:每16Bytes为一段,表明一个分区的内容,因此,默认最多只有四个分区;
1.最多有四分主分区
分区编号依次为:1 2 3 4
2.想要划分更多的分区数量时,可以将任意一个主分区改成扩展分区,在扩展分区中建立逻辑分区;
逻辑分区的编号默认从5开始,不管前面的4个数字是否都被占用;

     sda1,sda3,sda5

   注意:扩展分区可以没有,最多只能有一个;
  2Bytes:MBR结束标记,55AA;

GPT:整个磁盘空间大于2TB容量,建议使用GPT分区格式:
GUID Partition table,支持128个主分区;
Linux下常用的分区工具:
fdisk:
用于创建和管理MBR分区,对同一块磁盘,最多只能管理15个分区;
gdisk:GNU disk
用于创建和管理GPT分区;

注意:
如果使用fdisk或gdisk命令对于一个已经有分区被挂载的磁盘的剩余空间再次进行分区,即便将分区的结果保存下来,也不会被内核立即识别;

想要让内核识别出此类新建分区,可以采用下列方法:
  1.重启计算机:
  2.强制内核重读分区表:
    partprobe命令
    partx命令

    在RHEL系或CentOS系5|7:
      partprobe -a [device] 使用此命令时不行就去掉 -a试一试
       注意:如果省略了设备名,则表示重读所有磁盘设备的分区表;强烈建议,直接给出指定的磁盘设备名称;

    在RHEL系或CentOS系6|7:
      partx -a [device] 只是告诉Linux内核磁盘映射表信息
      kpartx -af [device] 强制重新构建磁盘分区映射表   此命令不是特别推荐使用

fdisk分区工具:
fdisk - manipulate disk partition table 是操作和创建分区表的菜单类工具

格式:
 fdisk  device

 fdisk -l  [device...]

 选项:
  -l :表示查看之意,如果给出设备名称,则查看指定设备的分区表;否则查看所有磁盘设备文件的分区表;

fdisk device
对于指定设备进行分区管理和操作:
d delete a partition 删除一个分区
l list known partition types 列表分区类型
m print this menu 显示帮助菜单
n add a new partition 创建新分区
p print the partition table 显示分区表
q quit without saving changes 退出不保存修改
t change a partition's system id 修改分区ID
w write table to disk and exit 保存并退出
在fdisk交互式菜单模式中创建分区的过程:
n --> p|e|l-->指明分区的起始扇区(柱面),直接回车使用默认值设置-->分区的结束扇区(柱面),也可以使用+#UNIT直接指定分区大小
如果键入时输入错误可以按住Ctrl+退格键 进行删除
parted命令:高级的分区工具,操作结果实时生效
parted - a partition manipulation program
格式:
parted [options] [device [command [options...]...]]
示例:
~]# parted /dev/sda mkpart logical 103GB 105GB(根据自己所分磁盘情况而定) 创建磁盘分区操作
~]#parted /dev/sda rm 4(磁盘号) 直接就能删除四号磁盘分区

在通电开机状态下添加SCSI接口的磁盘至本服务器,要想使设备被内识别并创建出相应的设备文件,有下列方法:
1.重启计算机;
2.~]#echo "- - -" > /sys/class/scsi_host/host2/scan
强制内核识别在通电状态下热插接的新SCSI接口的磁道设备;

创建文件系统——分区格式化:
格式化:
低级格式化:
划分磁道
高级格式化:
创建文件系统,按照某种特定的标准,将整个分区划分为大小相同的若干小的逻辑编址单元,每个这样的单元,称为块(Block);Windows中称为簇

划分块的标准:
 在Linux的文件系统中,主要的块划分标准就是:每个块包括2^1或2^2或2^3个扇区;即块大小可以使1024字节,2048字节或者4096字节;

注意:
 1.被划分出来得块,每一个块只能存放一个文件的内容,一个文件可以存储在多个块上;
 2.如果在某个分区中,要创建大量的小文件,就将块大小设置的小些,;反之,如果在某个文件中,要创建的都是大文件,就将块设置的大一些;
 3.如果分区的空间较大,可以将块设置的大一些;

FHS——文件系统层级标准
/bin /boot /etc /dev ...

对于数据的管理:
1.平面分类管理(不适合管理磁盘中的文件和数据,适合内存)
遍历数据
2.空间分类管理(层次化)
逻辑编址:创建文件系统实际上就是给分区进行存储空间的逻辑编址;
特点:仅需要有限次且有效的查找即可定位到目标文件;

在一个分区中创建文件系统的步骤:
1.首先,文件系统会将分区划分成大小相等的若干块;
元数据块:
其中主要存放文件的属性:
文件大小、文件权限、文件所有权、文件的时间戳、数据块指针(直接、间接)

存放每个文件的元数据的固定的存储空间,称为index node,简称inode;
在Linux的文件系统中,每个inode大小一般是128Byte;每个inode都有其对应的inode编号;
还有大量的inode可用但是没有存储空间了 这时只能创建空文件 但是任何文件都不能增加内容
inode被消耗完 存储空间还有大量剩余 也不能创建文件了
可以把现有文件的体积扩大 这是两种极端情况
一个inode对应着2^3或2^4个数据块是比较合理的
当inode是一样  他们所处的分区肯定是不一样的

数据块
存放文件中所包含的流式数据的内容;

特殊文件:
只占据元数据块中的inode,而不占数据块;
设备文件:
Block Special
Character Special

 此类文件是将inode中的数据块指针换成了设备号;

符号链接文件:
 Sumbolic Link
 此类文件是将inode中的数据块指针换成了另一个文件的访问路径;

随着磁盘空间越来越大我们划分出来得块的数量也越来越多因此管理难度就越来越大;通过划分块组来解决此问题:

块组:
每个块组中有独立的元数据块和数据块;
存放数据的时候,以块组内的数据优先,如果块组内的数据块数量不够,可以通过文件系统的存储策略来申请多个块组协同存储;

超级块:
主要定义了在整个分区中有多少个块组,及每个块组的边界;
为了防止超级块发生故障导致整个文件系统崩溃,文件系统会自动对超级块进行备份;

为了防止数据不一致(inode等分配完毕进行数据写入的时候发生断电数据并未写入或是写入不完整),在文件系统中引入日志块的概念:
日志块:对于数据的写入操作做日志记录的块;

数据不一致通常是由不洁关机、不洁断电导致;

一个完整的Linux文件系统:
超级块,inode,inode bitmap,block bitmap,data block,journal block

想要查找/var/log/message文件的内容,是怎样的查找过程?

目录:内容是文件名;

每个文件名是文件的特有的标识,每个文件名都对应一个inode;

Linux支持的文件系统:
位于内核空间中的文件系统驱动:/usr/lib/modules/KERNEL-VERSION/kernel/fs/
文件系统可以是内核的一部分,也可以是内核的模块;

位于用户空间中的文件系统管理程序:
通常是各种各样的管理命令(用于调整内核属性);

Linux支持的文件系统:
1.Linux专属的文件系统:
ext系列:ext、ext2、ext3、ext4
ext4特性:
单个分区最大50TB;
单个文件最大64EB;
可以在根分区上设置;
可以在启动分区上设置;
2.xfs:最大分区500TB,...
3.reiserfs:
4.btrfs:技术预览版
5.ISO9660:光盘文件系统
6.FAT:vfat
7.NTFS:默认不支持,但是可以通过调整内核参数以获得支持
8.网络文件系统:NFS、CIFS
9.集群文件系统:gfs2、ocfs2
10.分布式文件系统:
内核级:ceph
用户空间(应用级):mogilefs、moosefs、glusterfs
11.Unix的文件系统:ufs、FFS、JFS、zfs
12.伪文件系统:proc、sys、tmpfs、hugepagefs
并非管理磁盘数据的文件系统,而是管理内存数据的文件系统

对于不同的发行版本的Linux,都有其默认使用的文件系统:
RHEL或CentOS系列:
5:ext3
6:ext4
7:xfs

管理文件系统:
创建文件系统:
使用文件系统(挂载文件系统):
停止使用文件系统(卸载文件系统):
文件系统的监测和修复:

创建文件系统的用户空间工具:
mkfs
mkfs - build a Linux filesystem
mkfs [options] [-t type] [fs-options] device [size]

RHEL或CentOS系发行版中,可以使用mkfs,ext4,mkfs.btrfs,...等工具来代替mkfs创建文件系统;

示例:
]# mkfs -t ext4 /dev/sdb1
]# mkfs.ext4 /dev/sdb2

注意:
1.不要使用磁盘设备名称或扩展分区设备名称作为mkfs命令的参数;
如果使用磁盘设备名称作为mkfs命令的参数,则所有分区都将被删除;
如果使用扩展分区设备作为mkfs命令的参数,则所有的逻辑分区都将被删除;

2.只有主分区和逻辑分区才能使用mkfs命令创建文件系统;

3.如果要创建的目标文件系统是ext系列文件系统,那么可以使用mke2fs命令;
mke2fs
mke2fs - create an ext2/ext3/ext4 filesystem
常用选项:
-b block-size:在创建文件系统时,指定每个块的大小:默认值是4096字节,单位是字节;调整时,只能写1024,2048及4096;
-i bytes-per-inode:在创建文件系统时,指定inode与字节的比率;即:多少个字节创建一个inode,默认值是16384;
-j:创建有日志功能的文件系统,即:ext3
-L new-volume-label:在创建文件系统时指定卷标
-m reserved-blocks-percentage:在创建文件系统时,指定为管理员保留磁盘空间的百分比;默认值是5;
-n:并非真正创建文件系统,而是显示在创建文件系统时所做的操作;
-N number-of-inodes:在创建文件系统时直接指明在此文件系统中创建的inode的数量;
-O [^]feature[,...]:在创建文件系统时,关闭或开启文件系统特性;
-t fs-type:在创建文件系统时,指定文件系统类型

修改ext系列文件系统的卷标:
e2label命令:
e2label - Change the label on an ext2/ext3/ext4 filesystem
e2label device [ new-label ]
注意:如果不加new-label参数,则是查看指定设备的卷标;如果添加了new-label参数,则直接将设备的卷标设置为new-label,而不考虑原来是否有卷标也不考虑原卷标是什么;

修改ext系列文件系统的属性,可以使用tune2fs命令:
tune2fs - adjust tunable filesystem parameters on ext2/ext3/ext4filesystems
在ext2/ext3/ext4文件系统上调整那些可以被调整的参数;
常用选项:
-l:显示超级块的信息;
-j:将ext2文件系统修改调整为ext3文件系统;
-m reserved-blocks-percentage:调整系统预留百分比;
-r reserved-blocks-count:调整文件系统中预留的磁盘空间的块数 ;
-L volume-name:修改卷标;
-O [^]feature[,...]:修改文件系统特性是否开启;

文件系统的监测和修复工具:
fsck:
fsck - check and repair a Linux filesystem
fsck [-ars] [-t fstype] [filesystem...]
常用选项:
-t fstype:指定要检测的文件系统的文件系统类型;
-a:无需交互,自动修复监测到的所有问题;
-r:交互式修复监测到的问题

ext系列文件系统专用的检测修复工具:
e2fsck:
e2fsck - check a Linux ext2/ext3/ext4 file system
e2fsck [-y] [-f] device
常用选项:
-y:在交互式过程中所有的问题都以“yes”来回答;
-f:表示强制检测并修复;即使文件系统处于clean状态也修复;

blkid:显示所有被格式化的文件系统
blkid - locate/print block device attributes 定位显示块设备的属性
常用选项:
-L label:根据指定的卷标进行块设备查找定位;
-U UUID:根据指定的UUID进行块设备的查找定位;

findfs:
findfs - find a filesystem by label or UUID
findfs [LABEL=

swap文件系统:
前提:分区的类型必须是swap类型,即:分区的系统ID必须是82
修改方法:在fdisk的交互模式中,使用t命令将制定的分区类型修改为82即可;
创建swap文件系统:
mkswap命令:
mkswap - set up a Linux swap area
mkswap [options] device [size]

常用选项:
-f, --force: 强制执行;
-L, --label label:设置交换分区的卷标;
-U, --uuid UUID:指定交换分区的UUID,建议让系统自动生成;
示例:
~]# mkswap /dev/sdb3(前提是你得有这个分区!!且文件系统为swap)

利用一个大文件创建交换分区:
 示例:

[root@localhost ~]# dd if=/dev/zero of=/tmp/swapfile bs=1024 count=1024000
记录了1024000+0 的读入
记录了1024000+0 的写出
1048576000字节(1.0 GB)已复制,29.527 秒,35.5 MB/秒
[root@localhost ~]# mkswap /tmp/swapfile
正在设置交换空间版本 1,大小 = 1023996 KiB
无标签,UUID=c77df934-45a4-4575-8046-c75413c0ac8b

使用文件系统——挂载
挂载:
对于Linux系统来说,文件系统只能有一个唯一的一个原初访问入口,次访问入口被称为“根文件系统”;其他所有的文件系统,都必须通过某个特定方式关联至根文件系统或者根文件系统的子目录中,而此关联过程被称为“挂载”;用于根文件系统和其他文件系统的目录,就被称为“挂载点”;

挂载点:mount point,通常是一个目录,该目录在成为挂载点之后,就是其他文件系统的访问入口;如:/boot
 要求:
  1.作为挂载点的目录必须事先存在
  2.作为挂载点的目录应该是没有被使用或不能被其他进程占用的目录,换言之,必须是空闲的目录;
  3.作为挂载点的目录,一旦挂载其他文件系统,则失去原文件系统中的特性;简单说,如果一个目录中有文件名,一旦挂载了其他文件系统,则原来的文件名为不可见,这样的目录中的新的内容是新文件系统中的文件名;这个过程会一直持续到新文件系统被卸载;

完成挂载操作,使用mount命令:
mount - mount a filesystem
mount [-lhV]

mount -a [-fFnrsvw] [-t vfstype] [-O optlist]

mount [-fnrsvw] [-o option[,option]...] device|dir

mount [-fnrsvw] [-t vfstype] [-o options] device dir
常用选项:
-r, --read-only:以只读方式挂载目标文件系统,通常用于光盘挂载;
-w, --rw, --read-write:以可读可写的方式挂载目标文件系统;通常是默认的
-n, --no-mtab:默认情况下所有挂载块设备的操作都会被自动记录在/etc/mtab文件中,如果用了-n,--no-matab选项,则表示即便挂载成功,也不会将改在信息记录在/etc/mtab
-t, --types vfstype:在挂载文件系统时指明文件系统的类型,如果省略该选项,mount命令会通过blkid命令来判断要挂在的目标文件系统的类型;
-L, --label label:通过指定系统的卷标来挂载目标文件系统;
-U, --uuid uuid:通过指定的文件系统的UUID挂载目标文件系统;
-a, --all:根据/etc/fstab文件中指定的文件系统进行自动挂载;
-o, --options opts:在挂载目标文件系统时,可以调整挂载参数选项;
FILESUSTEM INDEPENDENT MOUNT OPTIONS:
sync/async:同步/异步挂载选项;(同步只要数据在内存中被修改会立即同步到文件系统中对数据的可靠性具有保证但消耗IO过多,异步是等到磁盘比较空闲的时候数据才会进行同步)
atime/noatime:文件或目录被访问时,是否更新访问时间戳;
diratime/nodiratime:目录被访问时,是否更新访问时间戳;
ro/rw:是以只读方式,还是以可读可写方式挂在文件系统,相当于-r/-w选项的功能;
dev/nodev:在此文件系统中是否允许创建设备文件
exec/noexec:在此文件系统中是否允许运行程序文件,包括各种二进制文件和各种脚本;
auto/noauto:在挂载此文件系统时是否能够使用-a选项进行挂载;
user/nouser:是否允许普通用户挂载此文件系统;
suid/nosuid:在此文件系统中是否允许程序文件上的SUID和SGID这样的特殊权限生效;
relatime/norelatime:在此文件系统中是否参考inode访问时间来修改其改动时间戳和修改时间戳;
remount:对于目标文件系统无需卸载就可以应用新的挂载选项;
acl:只在ext系列文件系统或xfs文件系统中使用,可以使用文件系统的facl功能;
defaults:默认选项,其中包括:suid,dev,exec,auto,nouser,and async
loop:使用环回设备,将镜像文件当做文件系统挂载至指定的挂载点;
-B, --bind:将某个已经挂载的文件系统绑定至另一个挂载点;
示例: mount -B | --bind mount_point1 mount_point2

示例:

mount /dev/sdb1 /mnt/sdb1

mount -o remount,ro /mnt/sdb1

卸载已经挂载的文件系统:
umount命令:
umount -a [-dflnrv] [-t vfstype] [-O options]
卸载当前已经挂载的文件系统中的所有可卸载的文件系统;
umount [-dflnrv] {dir|device}...
通过指定挂载点或设备名称,卸载指定设备;

挂载光盘:
在虚拟机中,需要保证光盘镜像文件被放入虚拟机的光驱,并且保证虚拟机的光驱处于“已连接”的状态,需要实现创建挂载点(/mnt/cdrom);

mount -r /dev/sr0 /mnt/cdrom

挂载交换分区:
swapon

卸载交换分区:
swapoff

swapon, swapoff - enable/disable devices and files for paging and swapping
-a, --all:自动挂载/etc/fstab文件中被正确定义的所有的交换分区

/etc/fstab文件的格式:(工作面试必考题)
共6个字段,默认使用空白字符(制表符)作为字段分隔符;6个字段的含义分别为:
1.要挂载的设备或文件系统名称,也可以是卷标或UUID
如果使用卷标必须使用:LABEL="label"
如果使用UUID必须使用:UUID="uuid"

2.挂载点:
swap设备或文件无需挂载点,在此字段写swap即可;

3.文件系统类型

4.默认的文件系统挂载选项:想要指定多个选项时使用逗号分隔的列表;
defaults,ro,sync

5.转储频率:
使用dump命令自动备份分区数据的频率;
0:表示不备份
1:每天备份一次
2:每没两天备份一次,即:每隔一天备份一次;

6.自检次序:
0:不自检
1:优先自检,通常仅设置在根文件系统上;
2:次级自检;
...
9:最低优先级自检;

/etc/fstab文件的作用:
在系统启动过程中,会自动挂载文件中所有被正确列出的文件系统;
RAID:Redundant Arrays of Inexpensive Disks,廉价磁盘冗余阵列;
Redundant Arrays of Independent Disks,独立磁盘冗余阵列;

1988年,UC Berkeley提出的"A Case for Redundant Arrays of Inexpensive Disks",旨在将多个相对廉价的IDE接口的磁盘组合成一个"阵列",并不是将磁盘简单的罗列在一起,而是根据特定规则进行组合,从而可以实现提高IO性能,实现磁盘冗余容错,或者此二功能兼具;

RAID的好处:
    提高IO性能:磁盘并行读写机制;
    提高磁盘耐用性:通过磁盘冗余实现容错;

RAID的级别:
    多块磁盘组织在一起的工作方式;

RAID的实现方式:
    基于硬件实现:
        外接式磁盘阵列:通过扩展接口或扩展插槽提供具有RAID功能的适配硬件设备;
        内接式磁盘阵列:主板集成的RAID控制器;

    基于软件模拟实现:
        通过应用程序模拟硬件功能;

RAID的功能级别:
    RAID-0:条带卷,strip
        读写性能提升
        磁盘可用空间:N*min(S1,S1,...)
        磁盘空间利用率:100%
        无容错能力
        至少需要2块磁盘

    RAID-1:镜像卷,mirror
        读性能提升,写性能有所下降;
        磁盘可用空间:1*min(S1,S2,...)
        磁盘利用率:1/N
        具备容错能力
        至少需要2块磁盘

    RAID-2
    ...
    RAID-5:带有奇偶校验信息的条带卷;
        读写性能均提升
        可以磁盘空间:(N-1)*min(S1,S2,...)
        磁盘利用率:(N-1)/N
        具备容错能力
        至少需要3块磁盘

    RAID-6:双重奇偶校验的条带卷;
        读写性能均提升
        可以磁盘空间:(N-2)*min(S1,S2,...)
        磁盘利用率:(N-2)/N
        具备容错能力
        至少需要4块磁盘

RAID的混合级别:
    RAID-10
        读、写性能提升
        具备容错能力
        磁盘利用率:1/2
        至少需要4块磁盘

    RAID-01
        读、写性能提升
        具备容错能力
        磁盘利用率:1/2
        至少需要4块磁盘

    RAID-50
        读、写性能提升
        具备容错能力
        至少需要6块磁盘

    JBOD:Just a Bunch Of Disks,仅仅是一组磁盘;将多块磁盘的空间合并成一个更大的连续的存储空间;有人将此方式称为"跨区";

对于RAID,常用的级别:
    RAID-0, RAID-1, RAID-5, RAID-10, RAID-50,JBOD

CentOS系统上可以提供软件RAID的实现:
    内核中的md(multi devices)模块

    mdadm:模块化的工具;
        mdadm - manage MD devices aka Linux Software RAID

        mdadm [mode]  [options] 

        支持的RAID级别:
            Currently,  Linux  supports  LINEAR md devices, RAID0 (striping), RAID1 (mirroring), RAID4, RAID5, RAID6, RAID10, MULTIPATH, FAULTY, and CONTAINER.

        [mode]:
            创建模式:-C, --create
            装配模式:-A, --assemble
            监控模式:-F, --follow, --monitor
            管理模式:无选项开关
            增长模式:-G, --grow
            混杂模式:-D, -S 

            create, build, or grow:
                -n, --raid-devices=
                    指定参与软RAID的磁盘的数量;
                -l, --level=
                    When used with --create, options are: linear, raid0, 0, stripe, raid1, 1, mirror, raid4, 4, raid5, 5, raid6, 6, raid10, 10,  mul tipath, mp, faulty, container. 
                -x, --spare-devices=
                    指定阵列中空闲的用于自动故障倒换使用的设备数量;
                -c, --chunk=
                    指定条带化级别的RAID中,每个区块(CHUNK)的大小;
                -a, --auto{=yes,md,mdp,part,p}{NN}
                    自动创建目标RAID设备文件;

            Manage mode:
                -a, --add:向阵列中添加新设备;
                -r, --remove:从阵列中移除设备;
                -f, --fail:将设备标记为失效;

            Misc mode:
                -D, --detail:显示阵列信息;
                    通过输出重定向保存阵列的装配记录:
                        mdadm -D --scan >> /etc/mdadm.conf
                -S, --stop:停止阵列功能;

        示例:
            ~]# mdadm -C md0 -n 4 -l 5 -a yes /dev/sdb /dev/sdc /dev/sdd /dev/sde
            ~]# mdadm -S /dev/md0

        查看md设备的信息:
            ~]# mdadm -D 

        保存装配信息:
            ~]# mdadm -D --scan >> /etc/mdadm.conf

        重新装配md阵列:
            ~]# mdadm -A /dev/md0

LVM——Logical Volume Management, 逻辑卷管理器;
LVM2——LVM Version 2
使用纯软件的方式组织一个或多个底层的物理块设备,将他们重新定义为一个逻辑块设备的解决方案;

利用linux内核中dm模块实现;
dm:device mapper,设备映射;

dm模块可以将一个或多个底层设备,按照预期规划组织成特定的形式,从而实现更高级的逻辑磁盘管理方式;

需要用户空间中的命令向dm模块发出系统调用,才可以进行逻辑块设备管理;

使用DM模块实现LVM管理的一般性步骤:
    1.创建并标识物理卷,PV
    2.基于PV创建卷组,即逻辑块设备(VG),同时指定PE的大小;
        注意:一旦卷组创建完成,则PE的大小将固定下来,其值无法再次进行修改;如果想要调整PE大小,只能重新定义卷组;
    3.在已有的卷组中,创建逻辑卷;
    4.需要在逻辑卷中创建文件系统(高级格式化);
    5.挂载;

物理卷的管理:
注意:如果想要让一个基本分区成为物理卷,必须将分区的系统ID修改为8e;

物理卷管理的相关命令:
    pvcreate:将普通的块设备创建为物理卷设备;创建物理卷;
    pvremove:将物理卷设备转变为普通块设备;删除物理卷;
    pvdisplay:显示物理卷的详细信息;
    pvs:显示物理卷的简短信息;
    pvmove:将某个物理卷中的所有被LV占用的PE移动到其他的物理卷中;

卷组管理的相关命令:
    vgcreate
    格式:
        vgcreate [OPTIONS] VolumeGroupName PhysicalDevicePath [PhysicalDevicePath...]

        -s, --physicalextentsize PhysicalExtentSize[bBsSkKmMgGtTpPeE]
            用于指定PE的大小,默认单位为MiB,默认的大小为4MiB;

    vgreduce:从卷组中移除物理卷;
        注意:必须保证被移除的物理卷上没有被占用的PE;如果有,则需要先对物理卷执行pvmove命令,再执行移除操作;
    vgextend:向卷组中添加物理卷;
    vgdisplay:显示卷组的详细信息;
    vgs:显示卷组的简短信息;

逻辑卷管理的相关命令:
    lvcreate:创建逻辑卷
        -L, --size LogicalVolumeSize[bBsSkKmMgGtTpPeE]
            指定逻辑卷的大小,其值不能超出卷组的容量;
        -l, --extents LogicalExtentsNumber[%{VG|PVS|FREE|ORIGIN}]
            在创建逻辑卷时,指定逻辑卷中包含的LE的数量或者某个特定值的百分比;
        -i, --stripes Stripes
            在创建逻辑卷时,以条带的方式创建,并指明在逻辑卷上的条带的数量;
        -n, --name LogicalVolume{Name|Path}
            指明逻辑卷的名称;
        -s, --snapshot OriginalLogicalVolume{Name|Path}
            创建快照卷;
        -p, --permission {r|rw}
            创建逻辑卷时指明此逻辑卷的操作权限;
        -a, --activate {y|ay|n|ey|en|ly|ln}
            -ay:创建逻辑卷的命令执行之后立即激活逻辑卷
            -an:创建逻辑卷的命令执行之后将逻辑卷设置为停用状态;

    lvs:
    lvdisplay:
    lvextend:扩展逻辑卷的物理边界;
        -L [+]SIZE[kKmMgGtT] /PATH/TO/LV

    resize2fs [-f] /PATH/TO/LV

        注意:扩展逻辑卷的空间,可以在线进行;

        扩展逻辑卷的示例:
            ~]# lvextend -L +10G /dev/qhdlink/class18
            ~]# resize2fs -f /dev/qhdlink/class18

    lvreduce:缩减逻辑卷的物理边界;
        lvreduce -L [-]SIZE[kKmMgGtT] /PATH/TO/LV

    resize2fs [-f] /PATH/TO/LV LV_SIZE
        注意:
            1.在缩减逻辑卷空间时,先缩减逻辑边界,再缩减物理边界;
            2.缩减逻辑卷空间前,先卸载并停用逻辑卷,缩减之后,再启用挂载即可;
            3.建议在缩减逻辑卷之前,对文件系统进行检测,以保证数据一致性;

        缩减逻辑卷的示例:
            ~]# umount /mnt/lvm
            ~]# e2fsck /dev/qhdlink/class18
            ~]# resize2fs -f /dev/qhdlink/class18 10G
            ~]# lvchange -an /dev/qhdlink/class18
            ~]# lvreduce -L 10G /dev/qhdlink/class18
            ~]# lvchange -ay /dev/qhdlink/class18
            ~]# mount /dev/qhdlink/class18 /mnt/lvm

逻辑卷的快照:
    快照:其本身也是逻辑卷,可以将其视为做快照的目标逻辑卷的另外一个访问路径;

    快照卷是一种特殊的逻辑卷,在其创建之初,其存储空间并没有任何消耗;只有当原来的逻辑卷中数据发生变化时,才会消耗快照卷空间;

    快照卷中只包含原有逻辑卷中被更改的数据或自生成快照逻辑卷之后快照卷中更改的数据;

    快照卷也可以使用lvextend进行扩容;

    通常来说,快照卷和原卷会共用很多的PE,因此快照卷与原卷就必须在同一VG上;在从快照卷备份数据的过程中,必须要保证,变化的数据文件的总量不能超过快照卷大小;

    创建快照卷:
        lvcreate -L SIZE_SNAPSHOP -s -p r -n LV_NAME_SNAPSHOT /PATH/TO/LV_ORIGIN

        示例:
            ~]# lvcreate -L 5G -s -p r -n snap_class18 /dev/qhdlink/class18
            ~]# mkdir /mnt/snapshot
            ~]# mount /dev/qhdlink/snap_class18 /mnt/snapshot/

            完成数据的备份之后:
            ~]# umount /mnt/snapshot/
            ~]# lvremove /dev/qhdlink/snap_class18
    btrfs:
    文件系统;
    Btree-FS,Better FS,Butter FS
    2007年由Oracle开源,得到IBM,Intel等厂商的支持,其开发目的就是为了替换ext3/4,成为下一代Linux上的标准文件系统;

    在2014那年8月之前,btrfs都是技术预览版(Technical Preview)

    btrfs的特性:
        1.可扩展性:
        2.多物理卷支持;
        3.写时复制的数据更新机制(CoW);
            更新、修改等操作是在复制之后替换指针;
        4.数据及元数据的校验码;
        5.子卷管理;
        6.快照,快照的快照;文件的快照;
        7.透明压缩,隐形压缩;

创建btrfs:
    mkfs.btrfs  |  mkfs -t btrfs
        mkfs.btrfs - create a btrfs filesystem
        格式:
            mkfs.btrfs [OPTIONS] device [device ...]
            常用选项:
                -d|--data :为数据存储指明硬件设备的组织形式:
                    Valid values are raid0, raid1, raid5, raid6, raid10 or single.

                -m|--metadata :为元数据的存储指明硬件设备的组织形式:
                    Valid values are raid0, raid1, raid5, raid6, raid10, single or dup.

                -L|--label :为即将创建的btrfs指定文件系统卷标;

                -O|--features [,...]:指定btrfs文件系统的特;
                    如果想要查看能够提供哪些特性,使用mkfs.btrfs -O list-all查看;

透明压缩功能的支持:
    # mount -o compress={lzo|zlib} DEVICE MOUNT_POINT

btrfs命令:
    btrfs - control a btrfs filesystem
        btrfs  []

        :
            filesystem:
                btrfs-filesystem - control btrfs filesystem
                    btrfs filesystem  
                        df [options] 
                            显示btrfs文件系统的空间使用率;
                        label [|] []
                            查看或设置btrfs文件系统的卷标;
                        resize [:][+/-][kKmMgGtTpPeE]|[:]max 
                            在线修改文件系统的大小;
                        show [--mounted|--all-devices||||

磁盘配额:
文件服务器:通过共享存储空间,让用户能够随时利用网络进行数据存储的服务器;
FTP
HTTP
NFS
Samba
...

磁盘配额主要是针对于这种文件服务器进行的用户磁盘空间的限制而提出的解决方案

磁盘配额的设定对象:
    能够通过网络进行实时写操作的块设备,要求其文件系统必须支持磁盘配额功能;

针对用户账户和组账户进行磁盘配额设定:
    1.用户账户:
        为指定的用户账户设置特定的磁盘使用量:
            1) 磁盘空间使用量
            2) inode节点使用量(文件的数量)
    2.组账户:
        限制指定的组中所有成员的磁盘使用量的总和;

磁盘配额的限制种类:
    soft limit:软限制,警告;
        当用户账户的磁盘使用量达到软配额限制,将会启动宽限期的计时器,在计时器归零之前,用户可以正常使用剩余的磁盘配额容量;一旦计时器倒计时为零,则不允许用户继续使用剩余的配额容量;除非用户将其中的数据删减至软配额限制以下;

    hard limit:硬限制,绝对极限;
        用户存储的数据一旦达到该限制数值,则绝对无法继续使用多余的磁盘空间;因此,这是用户磁盘配额的真正上限;

在正确的设置了配额选项之后,可以创建出一个用于记录用户和组的磁盘使用量的文件;
    aquota.user
    aquota.group

如果想要创建出上述配额文件,需要在指定的文件系统上配置磁盘配额选项:
    usrquota
    grpquota

设置配额选项:
    1.使用命令:
        mount -o usrquota,grpquota DEVICE MOUNT_POINT

    2.写入/etc/fstab文件中:
        DEVICE  MOUNT_POINT     FSTYPE  defaults,usrquota,grpquota 0 0

在设置了正确的配额选项的文件系统上检查并创建配额文件:
    quotacheck
        quotacheck  -  scan  a filesystem for disk usage, create, check and repair quota files
            常用选项:
                -v, --verbose:显示操作过程的详细信息;
                -u, --user:
                -g, --group:
                -c, --create-files:
                -a, --all:

用于编辑配额文件内容的命令:
    edquota
        edquota - edit user quotas
            常用选项:
                -u, --user:
                -g, --group:
                -t, --edit-period:编辑宽限期,默认是7days;
                    可用的时间单位:'seconds',  'minutes', 'hours', and 'days'

开启或关闭指定文件系统上的配额功能:
    quotaon, quotaoff
        quotaon, quotaoff - turn filesystem quotas on and off

        quotaon|quotaoff filesystem...

检查磁盘使用量和配额使用情况:
    quota
        quota - display disk usage and limits

    repquota——查看配额文件的内容,只有root用户才能使用;
        repquota - summarize quotas for a filesystem

注意:root用户不受磁盘配额限制;

Linux系统中常用的压缩和解压缩工具:
压缩:以时间换空间的一种操作;(一般来说是原来的大文件没有了,换来的是压缩后产生的小文件)
压缩的实现:标记+替换 函数就可以理解成一种压缩
压缩比:某个文件在压缩操作之前与压缩操作之后的文件大小的比值
通常来说纯文本类文件压缩比比较大

Linux中常用的压缩工具:
compress/uncompress
会在文件名的后面增加.Z的后缀名称:xxx.Z

gzip/gunzip
会在文件名的后面增加.gz的后缀名称:xxx.gz

bzip2/bunzip2
会在文件名的后面增加.bz2的后缀名称:xxx.bz2

xz/unxz
会在文件名的后面增加.xz的后缀名称:xxx.xz

zip/unzip
会在文件名的后面增加.zip的后缀名称:xxx.zip
注意:保留原文件,并且额外制造出一个压缩包文件

gzip工具:
gzip, gunzip, zcat - compress or expand files
纯文本文件压缩后可以用zcat来查看文件中的内容
常用选项:
-d --decompress --uncompress:解压缩 ,相当于gunzip
-# --fast --best:指定压缩时使用使用的压缩比,有效范围1-9,--fast相当于-1 --best相当于-9,默认是-6;
-c --stdout --to-stdout:将压缩结果输出到标准结果,但并不进行压缩操作

bzip2工具:
bzip2, bunzip2 - a block-sorting file compressor
bzcat - decompresses files to stdout
常用选项:
-d --decompress:解压缩
-k --keep:保留原文件,并且额外制造出一个压缩包文件
-c --stdout:将压缩结果输出到标准结果,但并不进行压缩操作
-1 (or --fast) to -9 (or --best):指定压缩时使用使用的压缩比,有效范围1-9,--fast相当于-1 --best相当于-9,默认是-9

xz工具:
xz, unxz, xzcat, lzma, unlzma, lzcat - Compress or decompress .xz and .lzma files
-d --decompress --uncompress:解压缩
-k --keep:保留原文件,并且额外制造出一个压缩包文件
-c --stdout:将压缩结果输出到标准结果,但并不进行压缩操作
The following table summarises the features of the presets:

                 Preset   DictSize   CompCPU   CompMem   DecMem
                   -0     256 KiB       0        3 MiB    1 MiB
                   -1       1 MiB       1        9 MiB    2 MiB
                   -2       2 MiB       2       17 MiB    3 MiB
                   -3       4 MiB       3       32 MiB    5 MiB
                   -4       4 MiB       4       48 MiB    5 MiB
                   -5       8 MiB       5       94 MiB    9 MiB
                   -6       8 MiB       6       94 MiB    9 MiB
                   -7      16 MiB       6      186 MiB   17 MiB
                   -8      32 MiB       6      370 MiB   33 MiB
                   -9      64 MiB       6      674 MiB   65 MiB

zip工具:
zip - package and compress (archive) files
格式:
zip [options...] [zipfile [file ...]]
-P password 加压缩密码

unzip:
 -l:查看压缩包中的文件列表;

tar命令:归档
tar [OPTION...] [FILE]...
选项:
主选项:
-c, --create:创建档案文件;
-r, --append:向一个已经存在的档案文件的末尾添加新的文件;(不常用)
-t, --list:列表显示一个档案的内容;
-u, --update:仅向档案文件的末尾追加内容比档案文件中的内容更新的文件;(更常用)
-x, --extract, --get:从档案中获取文件,释放文件;
辅助选项:
-f, --file=ARCHIVE:使用档案文件时,用于指明档案文件的选项;
-C, --directory=DIR:在释放档案中的文件时,不是释放到当前目录而是指定一个额外的路径来存放被释放的文件;
-j, --bzip2:主要用于创建档案文件时,选择使用bzip2工具压缩档案文件;
-J, --xz:主要用于创建档案文件时,选择使用xz工具压缩档案文件;
-z, --gzip:主要用于创建档案文件时,选择使用gzip工具压缩档案文件;
-k, --keep-old-files:在释放档案中的文件时,如果目标位置有与档案中同名的文件,则此类文件不释放;保证文件系统中的文件不会被档案中的同名文件覆盖;
--exclude=PATTERN:在释放档案中的文件时,被PATTERN匹配到的文件将不被释放;
-v, --verbose:显示详细过程

注意:
 在使用tar命令时,其后的主选项可以不使用“-”;

vim的末行模式中的查找和替换操作:
/或?进行模式查找;

两种特殊文件:
1.数设备文件:
    mknod
    其元数据中原本用来保存据块指针的位置,存放的是设备号信息;
2.符号链接文件:
    其元数据中原本用来保存数据块指针的位置,存放的是另一个文件的访问路径;

链接文件:
链接:
将文件的元数据部分和数据部分关联起来的过程;
访问一个文件的路径;

硬链接:
    在inode中的数据块指针指向的数据块的链接,称为硬链接;
    也可以解释为:同一个数据块内容的不同数据块指针;
    一个文件的数据内容可以被多个元数据指向,因此可以有多个硬链接;表现为这个文件的数据可以使用不同的路径进行访问;

    硬链接的特点:
        1.不能跨文件系统建立硬链接;
        2.不能对目录建立硬链接;
        3.每次对目标文件建立硬链接,其链接计数会自动增加inode的引用计数;

符号链接(软链接):
    独立的文件;
    用于存储被链接文件的访问路径信息的文件;

    符号链接的特点:
        1.可以跨文件系统建立符号链接;
        2.目录也可以创建符号链接;
        3.通过符号链接查找到被链接文件的数据内容,过程变得更加繁琐;因为需要查找两组路径信息;
            /etc/grub.conf --> /boot/grub/grub2.cfg

ln命令:
    ln - make links between files
    格式:
        ln [OPTION]... [-T] TARGET LINK_NAME   (1st form)
        ln [OPTION]... TARGET                  (2nd form)
        ln [OPTION]... TARGET... DIRECTORY     (3rd form)

    常用选项:
        -s, --symbolic:创建符号链接;如果不加此选项,即为创建硬链接;
        -v, --verbose:显示链接建立的过程;

应用程序发布的版本管理:
将不同版本的应用程序分别存放于不同的目录中,通过符号链接链接至某个版本的应用程序目录,如果新版应用程序出现问题或BUG,只需将符号链接文件链接至以前的某个文档版本,即可实现应用程序回滚;

末行命令中的s命令,是进行替换的命令;s是先查找再根据模式进行替换;

:[address]s/PATTERN/STRING/CONTROL

[address]:地址定界符
    1.如果省略,则表示光标所在行;
    2.#:该数值所代表的行;
    3.$:当前文档的最后一行;$-1表示当前文档的倒数第二行,...
    4.m,n:m和n都表示数字,其含义为从第m行到第n行;
    5.m,+n:m和n都表示数字,其含义为从第m行开始,向后再累计计算n行;7,+3 == 7,10
    6./PATTERN/:被PATTERN匹配到的行;
    7./PATTERN1/,/PATTERN2/:从被PATTERN1匹配到的行开始,到被PATTERN2匹配到的行结束;
    8.%:所有行;

PATTERN:要进行替换的内容必须被PATTERN匹配;
STRING:纯字符串,不识别正则表达式的元字符,替换操作的结果;
CONTROL:
    g:当前行内所有匹配的字符全部替换;
    c:手动控制替换操作;

sed命令:
sed:Stream EDitor,流编辑器
行编辑操作工具;
sed在实施文本文件处理时,是以行为单位对一个或多个文件进行编辑处理;每次sed会处理给定的文件中的一行内容;

sed在处理文件文件时,将正在处理的当前行存储到临时的内存缓存区中,称为"模式空间";所谓的"模式空间"是sed命令的主要工作车间;对于缓存的行,使用给定PATTERN去匹配,如果能匹配成功,则使用相应的Command进行编辑处理;如果匹配不成功,在默认将此类行直接发送至标准输出,而后继续处理下一行,直到文档结尾;

默认情况下,sed所处理的文件的内容都是在内存中完成的,并不会影响磁盘上存放的文件的内容;

sed默认有循环遍历的含义,可以使用sed简化为文件的循环遍历操作;

sed命令:
    sed - stream editor for filtering and transforming text
    格式:
        sed [OPTION]... 'script' [input-file]...
        常用选项:
            -n, --quiet, --silent:对于不能被PATTERN匹配的行,不发往标准输出;
            -e script, --expression=script:多条件编辑;
            -f script-file, --file=script-file:从指定的script-file中读取脚本内容再编辑;
                注意:script-file最好使用绝对路径来指定;
            -i[SUFFIX], --in-place[=SUFFIX]:直接编辑源文件;
            -r, --regexp-extended:可以使sed支持扩展正则表达式;

        script:AddressesCommand
            Addresses:地址定界
                1.空地址:表示对指定文件的所有行进行编辑处理;
                2.单地址:sed对于能够匹配该地址的唯一一行进行处理;
                    #:表示指定行号的那行;
                    /PATTERN/:能够被PATTERN匹配的所有行;
                    $:表示指定文件的最后一行;sed不支持$-1;
                3.地址范围:
                    addr1,addr2:addr1和addr2都表示行号,从addr1行开始到addr2行结束的中继的所有行,包括addr1和addr2;
                    first~step:first和step都数字,从first行开始,以step为步长,所经过的所有行;例如:1~2或2~2
                    addr1,+N:从addr1行开始,向后查找N行,包括addr1行;
                    addr1,~N:从addr1行开始,向后查找addr1*N行,包括addr1行;
                4./PATTERN1/,/PATTERN2/:
                    从被PATTERN1第一次匹配的行开始,到被PATTERN2第一次匹配的行结束;继续向后找第二次匹配的行,第三次匹配的行,...

            Command:
                =:显示被PATTERN匹配的行的行号;
                a \text:在被模式匹配的行之后追加text的内容;支持使用"\n"换行,从而实现追加多行信息;
                i \text:在被模式匹配的行之前插入text的内容;支持使用"\n"换行,从而实现插入多行信息;
                c \text:将被模式匹配的行直接修改为text的内容;支持使用"\n"换行,从而实现修改原内容为多行信息;
                d:在模式空间中删除被模式匹配的行;
                    注意:一般在使用d命令时,不建议使用-n选项;
                p:将模式空间中被模式匹配的行发送到标准输出;
                    注意:一般在使用p命令时,建议使用-n选项;
                w filename:filename可以是一个相对路径,也可以是一个绝对路径;w命令将模式空间中被PATTERN匹配的行,存储到指定的文件中;
                    注意:一般在使用w命令时,建议使用-n选项;
                r filename:filename可以是一个相对路径,也可以是一个绝对路径;r命令将指定的文件内容添加至被PATTERN匹配的行的后面;

                !Command:在模式空间中被PATTERN匹配的行,不执行Command;相反,没有被PATTERN匹配的行,会执行Command;

                s///:查找并替换,分隔符可以随意更换,但必须保持一致;s@@@, s###, s''', ...
                    s/regexp/replacement/[control]
                    regexp:正则表达式,也就是PATTERN,计划查找并替换的内容就是能够被regexp匹配的内容;
                    replacement:要替换的结果,纯字符串;
                        支持后向引用:
                            s/\(string\)/&/
                            s/\(string\)/\1/

            高级编辑命令:
                h:将模式空间中的内容存储到保持空间中,并覆盖保持空间中原有内容;
                H:将模式空间中的内容存储到保持空间中,并追加至原有内容之后;
                g:从保持空间取出数据存储到模式空间中,并覆盖模式空间的原有内容;
                G:从保持空间取出数据存储到模式空间中,并追加至原有内容之后;
                x:将模式空间中的内容与保持空间中的内容交换;
                n:读取被PATTERN匹配到的行的下一行,覆盖到模式空间;
                N:读取被PATTERN匹配到的行的下一行,追加到模式空间;
                D:删除模式空间中的所有行;