Linux系统中所有的硬件设备都是通过文件的方式来表现和使用的,我们将这些文件称为设备文件,在Linux下的/dev目录中有大量的设备文件,根据设备文件的不同,又分为字符设备文件和块设备文件。
字符设备文件的存取是以字符流的方式来进行的,一次传送一个字符。常见的有打印机,终端(TTY)、绘图仪和磁带设备等等,字符设备文件有时也被称为“raw” 设备文件。
块设备文件是以数据块的方式来存取的,最常见的设备就是磁盘。系统通过块设备文件存取数据的时候,先从内存中的buffer中读或写数据。而不是直接传送数据到物理磁盘。这种方式有效的提高了磁盘的I/O性能。
  下面既是我们此次所学到的在Linux下进行存储管理的一些操作及命令:

  RAID:
    IDE
    SCSI


    RAID的功能:
        提高IO能力:
          使用多个磁盘实现并行读写;
          磁盘条带化,chunk
    提高耐用性:
        依靠磁盘冗余实现
        即使磁盘发生故障或损坏,也不会影响数据;

  RAID的实现方式:
      硬件实现:
          通过硬件RAID控制器或适配器,将所需的磁盘组织成RAID,而后安装OS;
          BIOS程序

      软件模拟实现
          操作系统通过系统调用的方式模拟RAID实现;

  RAID的操作级别:
    RAID0:
        提升IO性能,条带卷,strip
            至少两块磁盘,没有冗余容错能力,没有存储空间浪费,要求每个磁盘必须提供相同大小的存储空间。
    RAID1:镜像卷,mirror
        提供高可用性
            需要两块磁盘
            先将数据存入主盘,然后再将数据存入从盘;
            写入效率较低,略微提高读效率,磁盘空间的整体利用率为50%,有冗余容错能力
    ...
    RAID4:
        用多块磁盘进行异或运算,得到校验值,并且使用专门的一块磁盘存放校验值;即使一块磁盘损坏,也不会丢失数据;检验盘IO压力巨大,很容易形成性能瓶颈;  
    RAID5:
        多块磁盘进行循环冗余检验,将校验值随机分配到不同磁盘的条带中;读、写IO性能均明显提升,又不会出现性能瓶颈
        磁盘利用率=(n-1)/n * 100%
        冗余容错,,
        至少需要3块磁盘
    RAID6:
        多块磁盘进行两轮循环冗余校验,将校验值随机分配到两个不同磁盘的条带中;
        读写IO性能均明显提升,又不会出现性能瓶颈
        最多运行两块磁盘出现故障或损坏依然不会数据流式
        代价就是增加了计算校验值的时间;
    RAID7:

  RAID混合级别:
    RAID01:
        先做RAID0,再做RAID1
    RAID10:
      先做RAID1,再做RAID0
    RAID50:
    RAID7:可以理解为一个存储计算机,自带操作系统已经相应的管理工具,可以独立运行。

    JBOD:仅仅就是一组磁盘;
        将多块磁盘的存储空间连接到一起,顺序存放数据;

  在CentOS上实现软RAID:
    内核提供一个md的模块(multi disks,multi devices)
    用户空间需要mdadm的工具,来设置和修改md内核模块的参数;

  mdadm:模式化工具
      mdadm [mode] <raiddevice> [option...] <component device>
          模式包括:
              创建模式:-C
                  -n #:使用#块磁盘创建RAID设备
                  -l #:指示RAID的级别
                  -a {yes|no}:允许系统或不允许系统自动创建md设备文件;
                  -c CHUNK_SIZE:指定CHUNK大小
                  -x #:指定在阵列中空闲磁盘的数量
              装配模式:-A
              管理模式:-a, -r, -f
              杂项:
                  -D --scan
                      显示RAID设备的详细信息
                mdadm -D --scan > /etc/mdadm.conf
                该配置文件用于RAID设备的再次装配
                -S:停止RAID的设备

LVM2
  Logical Volume Manager,逻辑卷管理器,Version 2
  IBM

  使用纯软件的方式组织一个或多个底层的块设备,将它们从新定义为一个逻辑快设备的解决方案;;

  利用内核中的dm模块实现:
      dm:device mapper ,设备映射表
      dm模块可以将一个或多个底层块设备组织成一个逻辑块设备;
      用户空间中的相应命令来向dm模块发出系统调用,就可以完成后逻辑快设备的管理;

      逻辑块设备统一存放在/dev/dn-#

      使用DM机制实现LVM管理的步骤:
        1.创建并表示物理卷,PV
        2.基于PV创建卷组,逻辑块设备,创建的卷组的同时指定PE的大小;
            注意:一旦PE大小被指定,就不允许更改;
        3.在已经创建的卷组中创建逻辑卷
        4.在逻辑卷中创建文件系统(高级格式化)
        5.挂载

  物理卷的管理操作:
      pvcreate:创建物理卷
      pvdisplay:显示物理卷的详细信息
      pvs:显示物理卷的简单信息
      pvremove:删除物理卷
      pvmove:将某个物理卷中的所有的PE移动到其他物理卷中;

  卷组的管理操作:
      vgcreate:创建卷组
          -s #{kKmMgG}:指定PE的大小,如果省略该选项,默认的PE为4M;
      vgremove:删除卷组
      vgextend:扩展卷组容量,将新的pv添加到卷组中;
      vgreduce:缩减卷组容量,将pv从卷组中移除;在做此操作之前,应该先使用pvmove,保证被移除的pv上没有被占用的PE
      vgdisplay:显示卷组的详细信息
        vgs:显示卷组的简短信息


  逻辑卷的管理操作:
      lvcreate:创建逻辑卷
          -L LV_SIZE

      lvremove:移除逻辑卷
      lvdisplay:显示逻辑卷的详细信息
      lvs:显示逻辑卷的简短信息
      lvchange:修改LV的状态
          -ay:激活逻辑卷
          -an:停用逻辑卷
      lvextend:扩展逻辑卷的空间,
          注意:一定要先扩展逻辑卷的物理边界,再扩展逻辑卷的逻辑边界;
          使用ext系列文件系统的时候,resize2fs命令扩展逻辑边界;
      lvreduce:缩减逻辑卷的空间
          注意:先缩减逻辑卷的逻辑边界,再缩减逻辑卷的物理边界;
          使用ext系列文件系统的时候,resize2fs命令缩减逻辑边界;

  为了更方便的使用逻辑卷,为/dev/dm-#设备创建了两个符号链接文件;

    /dev/mapper/VG_NAME-LV_NAME --> ../dm-#
    /dev/VG_NAME/LV_NAME --> ../dm-#


逻辑卷的快照:
    快照,本身也是一种逻辑卷;目标逻辑卷的另外一个访问路径。

    快照是特殊的逻辑卷,它是在生成快照时存在的逻辑卷的准确拷贝
    对于需要备份或者复制的现有数据集临时拷贝以及其它操作来说,快照是最合适的选择。
    快照只有在它们和原来的逻辑卷不同时才会消耗空间。
        在生成快照时会分配给它一定的空间,但只有在原来的逻辑卷或者快照有所改变才会使用这些空间
        当原来的逻辑卷中有所改变时,会将旧的数据复制到快照中。
        快照中只含有原来的逻辑卷中更改的数据或者自生成快照后的快照中更改的数据
        也可以使用lvextend扩展快照卷。

    快照就是将当时的系统信息记录下来,就好像照相一般,若将来有任何数据改动了,则原始数据会被移动到快照区,没有改动的区域则由快照区和文件系统共享。

    由于快照区与原本的LV共用很多PE的区块,因此快照去与被快照的LV必须要要在同一个VG上!系统恢复的时候的文件数量不能高于快照区的实际容量。

快照逻辑卷
  lvcreate -L SNAPSHOT_SIZE -s -p r -n SNAPSHOT_NAME /PATH/TO/ORIGIN_LVM
    -L SIZE:指定快照逻辑卷的大小
    -s:创建一个快照逻辑卷
    -p r:创建处理的逻辑卷是只读权限
    -n SNAPSHOT_NAME:指定快照逻辑卷的名称

三个命令:
    df命令:
        df - report file system disk space usage
        df [OPTION]... [FILE]...
            -h, --human-readble:单位转换
            -l, --local:只显示本地文件系统,不显示网络文件系统
            -i, --inodes:显示inode使用状态
            -T, --print-type:显示文件系统类型
            -P, --portability:使用POSIX输出格式,更易于阅读


    du命令:
        du - estimate file space usage
        du [OPTION]... [FILE]...
            -s, sumary,:显示整个目录汇总的文件大小
            -h, human-readble:单位转换

    dd命令:convert and copy a file
        dd [OPERAND]...
    dd OPTION

    常见的OPERAND:
            dd if=/PATH/FROM/SRC of=/PATH/TO/DEST
            bs=BYTES:block size, 复制单元大小
            count=N:复制多少个bs
            of=FILE:写到所命名的文件而不是到标准输出
            if=FILE:从所命名文件读取而不是从标准输入
            ibs=BYTES:一次读size个byte
            obs=BYTES:一次写size个byte
            skip=BLOCKS:从开头忽略blocks个ibs大小的块
            seek=BLOCKS:从开头忽略blocks个obs大小的块
            conv=conversion[,conversion...]:用指定的参数转换文件。
            转换参数:
                ascii:转换EBCDIC为ASCII。
                ebcdic:转换ASCII为EBCDIC。
                block:把每一行转换为长度为cbs的记录,不足部分用空格填充。
                unblock:使每一行的长度都为cbs,不足部分用空格填充。
                lcase:把大写字符转换为小写字符。
                ucase:把小写字符转换为大写字符。
                swab:交换输入的每对字节。
                noerror:读取出错时继续读取。
                notrunc:不截短输出文件。
                sync:把每个输入块填充到ibs个字节,不足部分用空(NULL)字符补齐

    磁盘拷贝:
        ~]# dd if=/dev/sda of=/dev/sdb
    备份MBR:
        ~]# dd if=/dev/sda of=/tmp/mbr.bak bs=512 count=1
    破坏MBR中的bootloader:
        ~]# dd if=/dev/zero of=/dev/sda bs=64 count=1 seek=446
    有二进制文件fileA,size>2K。现在想从第64个字节位置开始读取,需要读取的大小是128Byts。又有fileB, 想把上面读取到的128Bytes写到第32个字节开始的位置,替换128Bytes,请问如何实现?
        ~]# dd if=fileA of=fileB bs=1 count=128 skip=63 seek=31 conv=notrunc
    备份:
        将本地的/dev/sdx整盘备份到/dev/sdy
            ~]# dd if=/dev/sdx of=/dev/sdy将本地的/dev/sdx整盘备份到/dev/sdy
        将/dev/sdx全盘数据备份到指定路径的p_w_picpath文件
            ~]# dd if=/dev/sdx of=/path/to/p_w_picpath
        备份/dev/sdx全盘数据,并利用gzip工具进行压缩,保存到指定路径
            ~]# dd if=/dev/sdx | gzip >/path/to/p_w_picpath.gz

    恢复:
        将备份文件恢复到指定盘
            ~]# dd if=/path/to/p_w_picpath of=/dev/sdx
        将压缩的备份文件恢复到指定盘
            ~]# gzip -dc /path/to/p_w_picpath.gz | dd of=/dev/sdx

    拷贝内存资料到硬盘
        将内存里的数据拷贝到root目录下的mem.bin文件
            ~]# dd if=/dev/mem of=/root/mem.bin bs=1024

    从光盘拷贝iso镜像
        拷贝光盘数据到root文件夹下,并保存为cd.iso文件
            ~]# dd if=/dev/cdrom of=/root/cd.iso

    销毁磁盘数据
        利用随机的数据填充硬盘,在某些必要的场合可以用来销毁数据。执行此操作以后,/dev/sda1将无法挂载,创建和拷贝操作无法执行。
            ~]# dd if=/dev/urandom of=/dev/sda1

    得到最恰当的block size
        通过比较dd指令输出中所显示的命令执行时间,即可确定系统最佳的block size大小
            ~]# dd if=/dev/zero bs=1024 count=1000000 of=/root/1Gb.file
            ~]# dd if=/dev/zero bs=2048 count=500000 of=/root/1Gb.file
            ~]# dd if=/dev/zero bs=4096 count=250000 of=/root/1Gb.file
            ~]# dd if=/dev/zero bs=8192 count=125000 of=/root/1Gb.file

    测试硬盘读写速度
        通过上两个命令输出的执行时间,可以计算出测试硬盘的读/写速度
            ~]# dd if=/root/1Gb.file bs=64k | dd of=/dev/null
            ~]# dd if=/dev/zero of=/root/1Gb.file bs=1024 count=1000000

    修复硬盘
        当硬盘较长时间(比如1,2年)放置不使用后,磁盘上会产生消磁点。当磁头读到这些区域时会遇到困难,并可能导致I/O错误。当这种情况影响到硬盘的第一个扇区时,可能导致硬盘报废。上边的命令有可能使这些数据起死回生。且这个过程是安全,高效的。
            ~]# dd if=/dev/sda of=/dev/sda