2.4 存储管理

Linux针对设备类型对存储设备进行识别,如果是IDE存储设备,在计算机中将被识别为hd,第一个IDE设备会被识别为hda,第二个IDE设备将被识别为hdb,以此类推。如果是SATAUSBSCSI设备,会被识别为sd,以此类推。

对于分区,Linux使用数字来表示。如第一块SATA硬盘的第一个分区为sda1,第二块SATA硬盘的第二个分区为sdb2

 

2.4.1 硬盘分区

传统的MBR分区方式是一块硬盘最多可以分四个主分区。即使硬盘还有剩余空间,也无法再继续分区。无法创建大于2TB的分区。

Sda1

Sda2

Sda3

Sda4

剩余空间

 

传统的MBR分区方式中,如果需要更多的分区,则需要使用在扩展分区中创建逻辑分区的方法来实现。此时可以在扩展分区中划分出多个逻辑分区,所有逻辑分区的总和为扩展分区的大小。逻辑分区一定是以编号5开始的。SATA磁盘的第一个逻辑分区一定为sda5

Sda1

Sda2

Sda3

扩展分区sda4

逻辑分区sda5

逻辑分区sda6

......

 

Command (m for help): m在此输入指令m获得帮助
Command action
   a   toggle a bootable flag切换分区启动标记
   b   edit bsd disklabel编辑bsd磁盘标签
   c   toggle the dos compatibility flag切换dos兼容模式
   d   delete a partition删除分区
   l   list known partition types显示分区类型
   m   print this menu显示帮助菜单
   n   add a new partition新建分区
   o   create a new empty DOS partition table创建新的空分区表
   p   print the partition table显示分区表信息
   q   quit without saving changes不保存退出
   s   create a new empty Sun disklabel创建新的Sun磁盘标签
   t   change a partition's system id修改分区id,可以通过l查看id
   u   change display/entry units修改容量单位,磁柱或扇区
   v   verify the partition table检验分区表
   w   write table to disk and exit保存并退出
   x   extra functionality (experts only)扩展功能

 

 

使用partprobe命令让内核立即读取新的分区表。或partx -a增加了分区,partx -d删除了分区。

[root@instructor ~]# partprobe /dev/sda

GPT分区提供了分区表的冗余以实现分区表的备份与安全。但fdisk命令不支持GPT分区方式,使用Linux的另一个分区工具parted,命令格式为:

parted[选项][磁盘 [命令] ]

 

 

1. 修改分区表类型

[root@instructor ~]# parted /dev/sdb mklabel gpt修改分区表格式
[root@instructor ~]# parted /dev/sdb print查看系统分区表信息

 

2. 创建与删除分区

创建新的分区需要使用parted命令的mkpart指令,语法格式如下:

parted  [磁盘] mkpart  分区类型文件系统类型开始结束

其中,mkpart指令为创建新的分区,分区类型有:primarylogicalextended三种,文件系统类型有:fat16fat32ext2ext3linux-swap等,开始与结束标记区分开始与结束的位置(默认为MB)。

[root@instructor ~]# parted  /dev/sdb  mkpart  primary  ext3  1  1G

上面的命令将创建一个格式为ext3的主分区,从磁盘的第1MB开始分区,到1GB结束。

[root@instructor ~]# parted  /dev/sdb  rm  3(编号)使用rm指令删除分区

除了基本的创建与删除外,利用parted命令还可以进行分区检查、调整分区大小、还原误删除分区等操作。

 

2.4.2 格式化与挂载文件系统

使用mkfs命令来完成格式化操作,其中Linux系统默认文件系统格式为ext4格式。对于交换分区,我们需要使用单独的mkswap命令实现格式化的工作。 

[root@instructor ~]# mkfs.ext4 /dev/sdb5
[root@instructor ~]# mkswap /dev/sdb3

 

挂载可以使用命令或修改系统文件两种方式。第一种方式使用mount命令实现文件系统的挂载。

mount

描述:挂载文件系统

用法:mount [选项] [ -o[选项] ]  设备|目录

选项:-a挂载/etc/fstab文件中所有未挂载的文件系统

-t指定文件系统类型(包括: adfs,  affs, autofs, cifs, coda, coherent, cramfs,

debugfs, devpts, efs, ext, ext2, ext3, ext4, hfs, hfsplus, hpfs, iso9660, jfs,  minix,  msdos, ncpfs,  nfs,  nfs4,  ntfs,  proc,  qnx4, ramfs, reiserfs, romfs, squashfs, smbfs, sysv, tmpfs, ubifs, udf, ufs, umsdos, usbfs, vfat, xenix, xfs, xiafs),默认ext4

-o指定挂载属性,具体属性可参考man帮助手册

第二种方式是修改系统文件/etc/fstab,该文件共计六列,第一列为设备名称或设备标签,第二列为挂载点名称(挂载点为用户自己创建的目录),第三列为文件系统类型,第四列为挂载属性,第五列指定该文件系统是否使用dump进行备份(0表示不备份,1表示每天备份),第六列指定该文件系统在开机后使用fsck程序进行磁盘检测的顺序(根文件系统需要指定为1,其他文件系统一般为2,如果为0,则表示不需要进行磁盘检测)。

/dev/sda6 /123 ext4  defaults 0  0

 

2.4.3 LVM逻辑卷概述

LVMLogical Volume Manager)是基于内核的一种逻辑卷管理器,LVM适合于管理大存储设备,并允许用户动态调整文件系统的大小。LVM的快照功能可以帮助我们快速备份数据。

物理卷(Physical VolumePV):物理卷是LVM最底层概念,是LVM的逻辑存储块,物理卷与磁盘分区是逻辑的对应关系。

卷组(Volume GroupVG):卷组是LVM逻辑概念上的磁盘设备,通过将单个或多个物理卷组合后生成卷组。

物理长度(Physical ExtentPE):物理长度是将物理卷组合为卷组后,所划分的最小存储单位,即逻辑意义上磁盘的最小存储单元。LVM默认PE大小为4MB

逻辑卷(Logical VolumeLV):逻辑卷就是LVM逻辑意义上的分区,我们可以指定从卷组中提取多少容量来创建逻辑卷,最后对逻辑卷格式化并挂载使用。

将分区转换为物理卷的命令是pvcreate,将物理卷组合为卷组的命令是vgcreate,从卷组中提取容量创建逻辑卷的命令是lvcreate。创建完成后可以分别使用pvdisplayvgdisplaylvdisplay查看效果。

1. pvcreate

描述:使用LVM对磁盘或分区进行初始化

用法:pvcreate [选项物理卷 [物理卷...]

2. vgcreate-s指定PE大小

描述:创建卷组

用法:vgcreate [选项卷组名称 物理设备路径 [物理设备路径...]

3. lvcreate

描述:在已存在的卷组中创建逻辑卷

用法:lvcreate [选项卷组名称或路径 [物理卷路径]

选项:-l指定使用多少个卷组中的PE创建逻辑卷,PE容量在创建卷组时已经指定

-L直接指定逻辑卷的容量大小,单位可以是bB)、sS)、kK)、mM)、gG)、tT)、pP)、eE

-n指定逻辑卷名称

[root@instructor ~]# pvcreate /dev/sdb{5,6,7}
[root@instructor ~]# vgcreate -s 8M ceshi_vg1 /dev/sdb{5,6}
[root@instructor ~]# lvcreate -l 40 -n ceshi_lv1 ceshi_vg1 /dev/sdb6

 

指定使用/dev/sdb6这个物理卷的存储空间

 

附:修改分区标签为LVM,即8e

 

2.4.5 修改LVM分区容量

使用lvextend命令调整逻辑卷大小。但lvextend仅调整逻辑卷大小,使用该命令调整完逻辑卷大小后,还需要使用resize2fs命令更新文件系统的大小。

[root@instructor ~]# lvextend -L +100M /dev/mapper/ceshi_vg1-ceshi_lv1
[root@instructor ~]# resize2fs /dev/mapper/ceshi_vg1-ceshi_lv1

 

LVM的卷组也是可以动态调整容量大小的,这是需要使用fdisk创建一个新的分区,并使用pvcreate命令转换为物理卷格式,接着通过vgextend将新的物理卷追加至现有的卷组空间中,最后使用lvextend调整逻辑卷的容量。

[root@instructor ~]# vgextend ceshi_vg1 /dev/sdb7

 

2.4.6 删除LVM分区

使用LVM命令轻松地删除之前创建的物理卷、卷组、逻辑卷。删除的顺序应该与创建时的顺序相反,也就是卸载文件系统、删除逻辑卷、删除卷组、删除物理卷。

[root@instructor ~]# lvremove /dev/mapper/ceshi_vg1-ceshi_lv1
[root@instructor ~]# vgremove ceshi_vg1
[root@instructor ~]# pvremove /dev/sdb{5,6,7}

 

 

2.4.7 RAID磁盘阵列概述

RAIDRedundant Array of Independent Disk)虚拟存储系统。RAID即独立冗余磁盘阵列,其思想是将多块独立的磁盘按不同的方式组合为一个逻辑磁盘,从而提高存储容量,提升存储性能或提供数据备份功能。

RAID分为软件RAID和硬件RAID两类。硬件RAID通常需要有RAID卡,RAID卡本身会有独立的控制部件和内存,所以不会占有系统资源,效率高、性能强。

 

2.4.8 RAID级别

1. RAID 0(不含校验与冗余的条带存储)

多块磁盘组合为RAID 0 后,数据将被分割并分别存储在每块硬盘中,所以能最大地提升存储性能与存储空间,但无法容错,RAID 0 至少需要两块磁盘。

如果一个文件要写入RAID 0 ,则该文件会被分割为多个部分,DATA1DATA2被分别同步存入磁盘1和磁盘2,其他部分依次类推。读取该文件时,将同时从磁盘1和磁盘2中读取数据。

缺点:因为没有校验与备份,两块硬盘中如果有一块磁盘损坏,即磁盘中的任何一个数据损坏将导致整个文件无法读取。

 

2. RAID 1 (不含校验的镜像存储)

多块磁盘组合为RAID 1 后,数据将被同时复制到每块硬盘中,制作这种磁盘阵列至少需要两块硬盘,该级别的RAID只要有一块硬盘可用,即可正常工作,该级别的阵列安全性是最好的,磁盘利用率是最低的。

如果一个 文件要写入RAID 1 ,则该文件会写入磁盘1,同时以复制备份的形式写入磁盘2DATA1DATA2被同时存入磁盘1和磁盘2,其他部分依此类推。RAID 1 写入数据的效率会降低,因为相同数据需要同时写入两块磁盘,但RAID 1 读取数据的效率会提升,因为数据可以同时从两块硬盘读取数据。

缺点:RAID 1 写入效率低下。此外,磁盘的利用率极低,为总空间的一般。

 

3. RAID 2 (位级别的校验式条带存储)

多块磁盘组合为RAID 2 后,数据将以位(bit)为单位同步式分别存储在不同的硬盘上,并采用海明码(海明码是一种具有纠错功能的校验码)对数据进行校验与恢复。

如果一个文件要写入RAID 2 ,则该文件会被分成数据位分别同步写入不同的磁盘中,DATA1DATA2进行海明码运算后再写入校验盘中,其他部分以此类推。拥有校验位的RAID 2 允许三块磁盘中任何一块磁盘损坏,并能够对未损坏的两块磁盘进行运算后还原已损坏磁盘上额数据,从而实现数据恢复的功能。RAID 2 对大量数据的读写具有很高的性能,但对少量数据的读写时性能反而不好,该磁盘阵列至少需要三块硬盘。

 

4. RAID 3 (字节级别的校验式条带存储)

该级别的磁盘阵列可以参考RAID 2 的读写原理,仅数据分割的单位为字节。

 

5. RAID 4 (数据块级别的校验式条带存储)

该级别的磁盘阵列与RAID 2 类似,仅数据分割单位不同。block

 

6. RAID 5 (数据块级别的分布式校验条带存储)

多块磁盘组合为RAID 5 后,数据将以块(block)为单位同步式分别存储在不同的硬盘上,并对数据进行海明码运算,与其他级别不同的是,该级别的海明码会被写入不同的磁盘。

 

7. RAID 10 (镜像与条带存储)

RAID 10 不是独创额一种RAID级别,它由RAID 0 RAID 1 结合而成,RAID 10 继承了RAID 0 的快速与高效,同时也继承了RAID 1 的数据安全,RAID 10 至少需要四块硬盘。RAID 10 通常有两种结构,一种是RAID 0+1 结构,一种是RAID 1+0 结构。如果是RAID 1+0 ,则先使用四块硬盘组合成两个独立的RAID 1 ,然后将两个RAID 1 再组合为一个RAID 0

当数据写入时,首先会以条带的方式同步写入由两个RAID 1 组合而成的RAID 0 中,随后,当数据被写入由具体磁盘组成的RAID 1 时,又可以实现双磁盘镜像功能。

缺点:RAID 10 继承了RAID 0 RAID 1 的优点,但同时也继承了一些缺点,RAID 10 的磁盘利用率很低,只有50%

2.4.9 创建与管理RAID实例

1. 创建硬盘分区

Hex code (type L to list codes): fd格式fdRAID格式

 

2. 创建RAID(本例将分别创建RAID 0 RAID 5

Linux中创建磁盘阵列可以使用mdadm命令,在Centos 6.3中,目前支持的RAID级别有RAID 0 RAID 1RAID 4RAID 5RAID 6RAID 10

 

mdadm

描述:管理linux软件RAID设备

用法:mdadm [模式选项 <RAID设备>

选项:-C创建软件RAIDcreate

-l指定RAID级别(level

-n指定磁盘个数

-x指定备用设备个数

[root@instructor ~]# mdadm -C /dev/md0 -l 0 -n 4 /dev/sdb1 /dev/sdc1 /dev/sdd1 /dev/sde1
[root@instructor ~]# mdadm -C /dev/md5 -l 5 -n 3 -x 1 /dev/sd{b,c,d,e}2
[root@instructor ~]# mdadm --detail /dev/md0查看md0信息

 

 

3. 格式化与挂载

[root@instructor ~]# mkfs.ext4 /dev/md0
[root@instructor ~]# mkfs.ext4 /dev/md5

 

将磁盘阵列设备设置为开机自动挂载项,Centos系统开机会读取磁盘阵列的配置文件/etc/mdadm.conf以启动RAID设备。下面两条命令可以帮助我们快速创建这样的配置文件,DEVICE行代表填写所有磁盘阵列的设备成员名称,ARRAY行描述磁盘阵列具体的基本信息,包括名称、级别、UUID等信息。

[root@instructor ~]# echo "DEVICE /dev/sdb1 /dev/sdb2 /dev/sdc1 /dev/sdc2 /dev/sdd1 /dev/sdd2 /dev/sde1 /dev/sde2" > /etc/mdadm.conf
[root@instructor ~]# mdadm -Evs >> /dev/mdadm.conf
[root@instructor ~]# cat /dev/mdadm.conf 
ARRAY /dev/md/5 level=raid5 metadata=1.2 num-devices=3 UUID=762e0a76:527fd9d4:2e6ff87d:297dfa17 name=instructor.example.com:5
   spares=1   devices=/dev/sdb2,/dev/sdc2,/dev/sdd2,/dev/sde2
ARRAY /dev/md/0 level=raid0 metadata=1.2 num-devices=4 UUID=16eaae13:deb2233a:cf5b1611:b1971321 name=instructor.example.com:0
   devices=/dev/sdb1,/dev/sdc1,/dev/sdd1,/dev/sde1
[root@instructor ~]# echo "/dev/md0 /raid0 ext4 defaults 0 0" >> /etc/fstab 
[root@instructor ~]# echo "/dev/md5 /raid5 ext4 defaults 0 0" >> /etc/fstab

 

2.4.10 RAID性能测试

[root@instructor ~]# time dd if=/dev/zero of=/raid5/1.txt bs=1M count=1500
[root@instructor ~]# time dd if=/dev/zero of=/raid0/1.txt bs=1M count=1500

设备或分区hdparm -t /dev/sd

 

 

 

2.4.11 RAID故障模拟

[root@instructor ~]# mdadm /dev/md5 -f /dev/sdb2
mdadm: set /dev/sdb2 faulty in /dev/md5

注释:使用-f选项(failed)模拟磁盘sdb2的损坏

由于上面做性能测试时已经往RAID 5 中写入了1.5GB的数据,所以使用命令模拟磁盘损坏后,快速查看RAID详细信息可以看出正在使用/dev/sde2重建数据(还原数据),而原来的/dev/sdb2成了损坏的空闲设备。