运维笔记15 (磁盘加锁,软raid的创建和使用)

来源:互联网 发布:韩春雨方舟子知乎 编辑:程序博客网 时间:2024/05/22 08:12

概述:

本篇文章主要讲解些对硬盘的操作,有对硬盘安全考虑的磁盘加锁,还有对硬盘的速度,可靠考虑的raid(独立冗余磁盘阵列),这个raid分为软raid和硬raid,硬raid只需要raid卡的支持,然后在bios中进行一些设置就可以使用了,但我们为了演示(主要是没钱。。。),或者说告诉大家在没有硬raid时该怎么办,我们这次将软raid。

1.磁盘加锁(cryptsetup)

磁盘加锁使用的是一种设备映射关系,我们用它来把一个设备映射成另外一个设备,然后对这个新的设备进行操作,并进行加密,这样就不会使我们的原设备直接被使用,从而达到一种安全的效果。但是将这个设备映射时又需要密码。

用于磁盘加密的命令是cryptsetup(这个crypt其实就有加密的意思),这个命令有很多参数,但是我们基本不需要刻意记忆,需要用到的时候直接查询help就可以,这里介绍几个常用的参数。

[root@foundation3 ~]# cryptsetup --help
open <device> [--type <type>] [<name>] - open device as mapping <name>#将设备映射到另一个设备上close <name> - close device (remove mapping)<span style="white-space:pre"></span>      #关闭这个映射设备
luksFormat <device> [<new key file>] - formats a LUKS device<span style="white-space:pre"></span>      #将设备做成luks加密格式luksAddKey <device> [<new key file>] - add key to LUKS device<span style="white-space:pre"></span>      #添加密码文件,用于自动挂载加密设备
<span style="white-space:pre"></span>luksRemoveKey <device> [<key file>] - removes supplied key or key file from LUKS device #去掉密码,但是你的数据也被毁了
对磁盘加密这种操作属于危险操作,毕竟一不小心错误操作输入了不知道的密码,你原本的数据可就不保了,这也是这种加密的风格,加密与数据共存,想打开加密,那么数据就报废。下面画一个加密的流程图。

想要创建一个加密的磁盘,先要清空这个磁盘上的东西,因为最后需要格式化,每当不适用设备的时候,不仅要卸载设备,还要关闭掉设备映射文件,否则下次再使用设备会有问题(如果出现这种情况只要再关删除一次设备映射文件即可)。

实际操作:

[root@foundation3 ~]# cryptsetup luksFormat /dev/sdb4 WARNING!========This will overwrite data on /dev/sdb4 irrevocably.Are you sure? (Type uppercase yes): YESEnter passphrase: Verify passphrase: 
这里有一点需要注意的,就是这个Are you sure后面,一定要是大写的YES,要不然他不会加密


[root@foundation3 ~]# cryptsetup open /dev/sdb4 moEnter passphrase for /dev/sdb4: 
这时就把/dev/sdb4映射到另一个设备上了

[root@foundation3 ~]# ls /dev/mapper/control  mo
现在如果想操作这个设备就要对/dev/mapper/mo进行操作了。

[root@foundation3 ~]# mkfs.vfat /dev/mapper/mo mkfs.fat 3.0.20 (12 Jun 2013)unable to get drive geometry, using default 255/63
对其格式化,上面的数据已经全没有了,然后就可以使用了。

[root@foundation3 ~]# mount /dev/mapper/mo /mnt/[root@foundation3 ~]# touch /mnt/file{1..3}[root@foundation3 ~]# ls /mnt/file1  file2  file3
现在我们卸载设备并删除映射文件

[root@foundation3 ~]# umount /mnt/[root@foundation3 ~]# cryptsetup close mo
这样就卸载完成了

当下次需要使用的时候,比如讲刚才那个U盘再插到电脑上时如果我们直接挂载

   Device Boot      Start         End      Blocks   Id  System/dev/sdb4   *         256    30529535    15264640    c  W95 FAT32 (LBA)

根据这里显示有一个U盘,设备文件是/dev/sdb4,我们把他挂载试试。

[root@foundation3 ~]# mount /dev/sdb4 /mnt/mount: unknown filesystem type 'crypto_LUKS'
发现不可以,无法识别这个设备的类型,只能识别这个设备的映射。所以现在进行映射

[root@foundation3 ~]# cryptsetup open /dev/sdb4  moEnter passphrase for /dev/sdb4: 
这样就可以使用了。


假如我们感觉这个加密太麻烦了,我们想去掉加密怎么办

[root@foundation3 ~]# cryptsetup close mo[root@foundation3 ~]# cryptsetup luksRemoveKey /dev/sdb4 Enter passphrase to be deleted: WARNING!========This is the last keyslot. Device will become unusable after purging this key.Are you sure? (Type uppercase yes): 

他已经提醒我们了,就算我们自己知道密码,你去掉这个key后硬盘也不可用了,需要重新格式化。所以先备份好文件吧。

如果你想让一个加密的设备开机自动挂载,那么就需要编辑一个配置文件,/etc/crypttab,打开这个文件发现其实是空的,我们man 5 crypttab了解到只需天三列就可以。分别是:

解密后可使用的名字  原设备文件 存密码的文件

mo    /dev/sdb4    path(任意路径)

然后将这个映射磁盘的挂载信息写入/etc/fstab,切记是映射磁盘的路径,也就是本文中的/dev/mapper/mo。

2.raid(独立冗余磁盘阵列)

先介绍一些有关raid的基础知识,raid可以通过一些技术将多个小的磁盘整合成为一个较大的磁盘设备,而这个较大的磁盘功能不仅是存储,还有数据保护,提升读写速度等功能。根据阵列组成的不同,整合后的磁盘有不同的功能,下面一一来说一下。

raid0:将一份数据切成两块,分别同时存到两块磁盘中,这样就提升了硬盘的写入速度,举个例子,以前一秒钟一块盘可以写入10MB数据,两块盘同时写入的话,一分钟就可写入20MB数据,这样你明白raid0为什么提高读写入速率了吧。但是如果一块硬盘坏掉了怎么办,那就哔了,缺哪一块因硬盘都数据都无法使用了。

raid1:是一种出于安全的方法,也是有钱人的做法,将一份数据存入两块硬盘中,也就是两个硬盘的数据是一模一样的,如果一块硬盘坏了,另一个可以立刻顶上去。raid1的存储性能不太好,但是读取性能还是可以的,这是因为数据在不同的磁盘上,如果多个进程在读取同一条数据时,raid会自行取得最佳的读取平衡。

raid0+1,raid1+0:就是将raid0的快速和raid1的安全结合在一起,只是两种的组合方式稍有不同,raid01是先做raid0再做raid1。如下图


每组中分别是一个raid0,组间是raid1的关系,但是如果一块损坏了,比如左1,需要修复时,首先要看左2,找到是哪部分损坏,再看右1,右2的哪个是他的备份,也就是说一块损坏要动用其他三块,所以企业中常用的还是下面介绍的raid10


做变两个组成raid1存储完全一样的数据,右边也是,但是左右两组都不能独立出来,必须共同工作才能读存数据,这次假如左1坏了,那么他只需要请求左2即可。只影响自己的备份盘。

raid5:与raid0有相似之处,但是更安全一点,它又加入了一个校验盘,保证数据安全,当一块盘坏掉的时候,可以根据校验盘,和剩余的盘计算出来坏掉盘上的数据,读取速度和raid0有一拼,但是写入速度很受硬件制约,因为写入时需要计算校验码。总之raid5也是一个既能保证安全又能提升性能的不错选择。

亲手创建软raid:

在linux下可以通过mdadm这个命令来创建软raid而且不用我们有很多块硬盘,这个命令可以把一个分区就当成raid的一个基本单位,省钱又省时。

在创建之前我们先做好准备工作,分出四个区,每个分区各1G,用fdisk命令。

Disk /dev/vdb: 10.7 GB, 10737418240 bytes, 20971520 sectorsUnits = sectors of 1 * 512 = 512 bytesSector size (logical/physical): 512 bytes / 512 bytesI/O size (minimum/optimal): 512 bytes / 512 bytesDisk label type: dosDisk identifier: 0x1278e24b   Device Boot      Start         End      Blocks   Id  System/dev/vdb1            2048     2099199     1048576   83  Linux/dev/vdb2         2099200     4196351     1048576   83  Linux/dev/vdb3         4196352     6293503     1048576   83  Linux/dev/vdb4         6293504    16779263     5242880    5  Extended/dev/vdb5         6295552     8392703     1048576   83  Linux
我们分出了4个1G的分区分别是/dev/vdb1,/dev/vdb2,/dev/vdb3,/dev/vdb5,其中vdb4为扩展分区。

现在介绍一下mdadm命令,刚才讲了那么多raid的基础,如果没有接触过的小伙伴可能会有点害怕,这个raid这么厉害,创建起来会不会很难,其实不然,反而很简单,我下面介绍几个常用的参数,你就可以自己手动创建raid0,raid1,raid01,raid10,raid5这些了。

mdadm 

-C<设备名字>  创建模式

-lraid等级,0,1,5之类的

-n使用的磁盘或者分区块数

-a是否自动生成raid设备

-x作为备份的磁盘数量,如果某块磁盘坏了可以立刻补充上去。不用手动操作

raid0:

[root@station ~]# mdadm -C /dev/md0 -n 2 -l 0 -a yes /dev/vdb1 /dev/vdb2 mdadm: Defaulting to version 1.2 metadatamdadm: array /dev/md0 started.[root@station ~]# cat /proc/mdstat Personalities : [raid0] md0 : active raid0 vdb2[1] vdb1[0]      2096128 blocks super 1.2 512k chunks      unused devices: <none>
通过上面的命令就很简单的建立好了raid0,通过查看/proc/mdstat可以看到,已经生效,接下俩我们思考一下,raid0是将数据一分为2存储,那么操作系统看到的raid设备也就是/dev/md0是多大呢?这就要涉及到raid对磁盘的利用率,两个1G的磁盘组成raid0利用率100%,所以md0是2G。我们来证明一下:

<span style="font-size:18px;">Disk /dev/md0: 2146 MB, 2146435072 bytes, 4192256 sectorsUnits = sectors of 1 * 512 = 512 bytesSector size (logical/physical): 512 bytes / 512 bytesI/O size (minimum/optimal): 524288 bytes / 1048576 bytes</span>

raid1:

raid1由于是两块一样的盘,一块作为主盘,另一块作为镜像,所以创建时有一个同步的过程


通过这个动图我们可以看到这个同步的过程,再计算一下,这个md0操作系统认为他是多大呢,因为有一块作为镜像使用了,所以只有可怜的50%,证明如下:

Disk /dev/md0: 1073 MB, 1073152000 bytes, 2096000 sectorsUnits = sectors of 1 * 512 = 512 bytesSector size (logical/physical): 512 bytes / 512 bytesI/O size (minimum/optimal): 512 bytes / 512 bytes

raid5:

通过下面这张动图我们也可以看到raid5的校验盘建立过程,而且切记,raid5至少要3块盘。


raid5有一块盘作为校验盘所以那块无法进行数据存储,故3块盘会有1块不能使用,所以操作系统识别md0为2G,证明如下。

Disk /dev/md0: 2145 MB, 2145386496 bytes, 4190208 sectorsUnits = sectors of 1 * 512 = 512 bytesSector size (logical/physical): 512 bytes / 512 bytesI/O size (minimum/optimal): 524288 bytes / 1048576 bytes


亲手销毁raid:

raid的建立很简单,销毁也很简单,下面介绍几个销毁时需要的参数

mdadm 

-f|--fail 使raid上的一块磁盘或分区坏掉(软件模拟,并不是真的坏掉)

-r拔掉那块坏掉的硬盘|或分区

-a这个-a不是上面创建模式的-a,这里-a用于添加一块磁盘

--misc --zero-superblock覆盖做过软raid磁盘上的超级块,否则无法删除干净。

我们先建立一个三块磁盘的raid1,其中有1块作为备份盘。我们还是先来看下效果

Personalities : [raid0] [raid1] [raid6] [raid5] [raid4]md0 : active raid1 vdb3[2](S) vdb2[1] vdb1[0]      1048000 blocks super 1.2 [2/2] [UU]unused devices: <none>
可以看到vdb3后面有个(S),代表闲置备份盘的意思。

现在我们故意弄坏一块


可以看到vdb1被弄坏后vdb3立刻补充上去,当作vdb1。


现在我们想让这些分区回到以前的样子,销毁刚才做的实验。

<span style="font-size:18px;">[root@station ~]# mdadm /dev/md0 -r /dev/vdb1 mdadm: hot removed /dev/vdb1 from /dev/md0</span>

拔掉坏了的硬盘vdb1

将剩下的都弄坏

[root@station ~]# mdadm /dev/md0 -f /dev/vdb2mdadm: set /dev/vdb2 faulty in /dev/md0[root@station ~]# mdadm /dev/md0 -f /dev/vdb3mdadm: set device faulty failed for /dev/vdb3:  Device or resource busy
可以看到最多弄到还剩一块,也就是弄坏也要有个限度,起码要保证数据的完整。

[root@station ~]# mdadm -S /dev/md0 mdadm: stopped /dev/md0
停用md0设备

这还不够,现在要把之前的vdb1,vdb2,vdb3上的超级块数据抹掉,因为上面可能还记录着一些raid的信息,如果不去掉,下次重启,raid设备会重新出现。

[root@station ~]# mdadm --misc --zero-superblock /dev/vdb1 /dev/vdb2 /dev/vdb3

这样就彻底删掉了raid设备。


raid其实是很复杂的功能,但是用起来却很简单,我们以后工作的话,遇到的肯定是硬raid比较多,到时候只用在bios设置几下就可以了,更是方便,但是要确定radi也是需要驱动的,驱动程序不对,很可能发挥不出raid的效果。




2 0