运维笔记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的建立很简单,销毁也很简单,下面介绍几个销毁时需要的参数
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的效果。
- 运维笔记15 (磁盘加锁,软raid的创建和使用)
- 在Linux下使用RAID(三):用两块磁盘创建RAID 1
- Linux运维笔记-文档总结-RAID磁盘阵列和磁盘配额总结与实现
- [Redhat学习笔记]:软RAID创建的方式以及分析。(手把手教你做RAID)
- linux软RAID的创建和维护
- Megacli创建磁盘raid过程
- 磁盘(常见的raid组合)
- Linux下使用mdadm创建和管理软raid
- Linux下使用mdadm创建和管理软raid
- linux创建软raid和lvm的顺序
- 软RAID和硬RAID的区别
- 什么是RAID? 硬RAID 和软RAID的区别是什么?
- 应用Btrfs管理磁盘,应用mdadm管理磁盘(softraid),使用raid卡管理磁盘
- 在Linux下使用RAID(四):创建RAID 5
- 基于raid和lvm的gentoo安装笔记(一)
- 磁盘管理之软RAID!
- 1.5 linux创建和管理软RAID
- Linux 创建和管理软RAID实例
- SpringMVC+Spring+Mybati+Maven+Mysql整合
- js关闭窗口时触发事件方法
- 5款最常用的Android测试框架
- Android 版本号和版本名称
- Source Insight Add and Remove Project Files
- 运维笔记15 (磁盘加锁,软raid的创建和使用)
- .aspx和.cs之间的区别
- Java虚拟机工具之堆栈跟踪工具jstack检测输入等待
- Shell输入/输出重定向
- PHP 获取指定URL页面中的所有链接
- jstat打印后参数解释
- 编译android 源码相关文章
- 教育能改变吗
- java.lang.ClassCastException: com.sun.proxy.$Proxy27 cannot be cast to com.bbk.n002.service.Question