安全的动态磁盘策略
软件RAID技术
RAID0/RAID1/RAID5
RAID技术产生的背景
普通的IDE硬盘速度不够快,性能不够稳定,不能应用于企业级的关键任务
高效并且稳定可靠的SCSI硬盘价格昂贵,中小企业承受不起
RAID(Redundant Array of Inexpensive/Independent Disks),即廉价/独立磁盘冗余陈列(或简称磁盘陈列),它的出现,可以让我们把普通的IDE硬盘组成快速安全可靠的存储设备。
RAID原理
RAID是一种把多块独立的硬盘按不同方式组合起来的形成一个磁盘组,从而提拱比单个硬盘更高的存储性能和提供数据冗余的技术。不同的组织方式成为RAID级别(RAID Level)
数据冗余的功能是在用户数据一旦发生损坏后,利用冗余信息可以使损坏数据得以恢复,从而保障了用户数据的安全性。
在用户看起来,组成磁盘就像是一个硬盘,对磁盘陈列的操作与单个硬盘一模一样。
RAID级别
目前共有0-6共7种基本的RAID级别
常用RAID级别是level 0,level 1,level 5
需要RAID控制器(一种PC适配器)来管理硬盘
Linux内核可以模拟RAID控制器,用来管理硬盘,但只支持级别0,1,4,5
RAID0
RAID0又称为Striping
RAID0能过把连续的数据访问分散到多个磁盘上来提高存储性能,这样,数据请求就可以被多个磁盘并行的执行,每个磁盘执行属于它的自己的那部分数据请求。这种数据上的并行操作可以充分利用总线的带宽,显著提高磁盘整体存取性。
RAID1又称为Mirror或Mirroring,它的宗旨是最大限度的保证用户数据的可用性和可修复性。
RAID1的操作方式是把用户写入磁盘的数据百分之百的自动复制到另外的一个磁盘上。
RAID5不对存储的数据进行备份,而是把数据和相对应的奇偶校验存储到组成RAID5的各个磁盘上,并且奇偶校验信息和相对应的数据分别存储于不同的磁盘上。当RAID5的一个磁盘数据发生损坏后,利用剩下的数据和相应的奇偶校验信息去恢复被损坏的数据。
RAID 0+1
是RAID 0 RAID 1的组合形式,也称为RAID 10
Linux中的软件RAID
使用Linux内核实现的软件RAID控制器
需要内核支持
需要相应的应用软件(raidtools)创建管理RAID设备
软件RAID设备文件名:
/dev/mdN(N=0,1,2...)
软件RAID设备可以当分区来待,需要格式化后挂载
#mkfs.ext3 /dev/md1
#mount /dev/md1 /opt
RAID创建过程
添加硬盘
RAID设备的成员是硬盘分区,需要先对硬盘分区,分区不能同一个物理硬盘上
安装raidtools
raidtools中包含有RAID创建管理工具和默认的示范性配置文件
编写配置文件/etc/raidtab
可以从raidtools中的示范配置文件里复制
创建RAID设备
例:#mkraid /dev/md0
查看当前硬盘
[root@www ~]# df
[root@www ~]# fdisk -l /dev/sda
[root@www ~]# rpm -q raidtools确认软件包是否安装好
[root@server ~]# fdisk /dev/sda
Raidtools现在也改为mdadm
构建raid 0
首先增加两块硬盘
fdisk -l /dev/sdb查看硬盘
fdisk -l /dev/sdc
fdisk /dev/sdb创建硬盘分区
fdisk /dev/sdc
用默认的文件来改
cp /usr/share/doc/raidtools-1.00.3/raid0.conf.sample /etc/raidtab
vi /etc/raidtab 编辑,构建raid 0
raiddev /dev/md0
device /dev/sdb1组成md0的第一个分区
device /dev/sdc1组成md0的第二个分区
mkraid /dev/md0创建raid设备
mkfs.ext3 /dev/md0格式化raid设备
mount /dev/md0 /opt
cp /etc/hosts /opt
ls /opt
vi /etc/fstab写进fstab
/dev/md0 /opt ext3 defaults 0 0
构建raid 1
umount /opt
raidstop /dev/md0
cp /usr/share/doc/raidtools-1.00.3/raid1.conf.sample /etc/raidtab
vi /etc/raidtab 编辑,构建raid 0
raiddev /dev/md1
device /dev/sdb1组成md1的第一个分区
device /dev/sdc1组成md1的第二个分区
mkraid /dev/md1创建raid设备
mkfs.ext3 /dev/md1
vi /etc/fstab写进fstab
/dev/md1 /opt ext3 defaults 0 0
mount /dev/md1 /opt
cp /etc/services /opt考一个文件进去
ls /opt
df
如何恢复?
lsraid -A -a /dev/md1 查看两个磁盘有没有损坏
raidsetfaulty –help用软件来模拟硬盘出问题
raidsetfaulty /dev/md1 /dev/sdb1
lsraid -A -a /dev/md1 查看两个磁盘有没有损坏
可以看到/dev/sdb1己经坏了
但是ls /opt还存在我们先考的文件
cat /opt/services也可以读出来
可是没有文件损坏,此时所有的风险都是由/dev/sdc1来承担的,如果它也坏了,就再不能不恢复了
raidhotadd /dev/md1 /dev/sdd1增加一个分区到md1
lsraid -A -a /dev/md1此时会看到一个冗余的磁盘
more /proc/stat可以看到修复过程
raidhotremove /dev/md1 /dev/sdb1删掉坏掉的磁盘
lsraid -A -a /dev/md1可以看到/dev/sdb1没有了
现在我们利用磁盘冗余技术来自动恢复
umount /opt
raidstop /dev/md1
在配置文件里加一个冗余磁盘
raiddev /dev/md0
raid-level 1
nr-raid-disks 2
nr-spare-disks 1
chunk-size 4
device /dev/sdb1
raid-disk 0
device /dev/sdc1
raid-disk 1
device /dev/sdd1加上这个就不需要人工干预,它会自动恢复
spare-disk 0
umount /opt
raidstop /dev/md1
构建raid 5
man raidtab
至少要3个硬盘
fdisk /dev/sdd 对第三块硬盘分区
cp /usr/share/doc/raidtools-1.00.3/rai5d1.conf.sample /etc/raidtab
vi /etc/raidtab 编辑,构建raid 5
raiddev /dev/md5
device /dev/sdb1组成md5的第一个分区
device /dev/sdc1组成md5的第二个分区
device /dev/sdd1组成md5的第三个分区
mkraid -R /dev/md5
more /proc/mdstat这个命令反应的是内核里的状态
mkfs.ext3 /dev/md5
vi /etc/fstab写进fstab
/dev/md5 /opt ext3 defaults 0 0
mount /dev/md5 /opt
ls /opt
lsraid -A -a /dev/md5
如果其中一个硬盘坏掉了,可以一个新的分区来恢复
硬盘大小,是总的2/3
目前raid 5 用的比较多
如果需要把根分区也挂载到raid设备上,需要把根分区的ls -l /boot
提出来,因为raid设备无位对内核定位
因为linux启动的时候是用vi /etc/grub.conf来加载内核文件的
root (hd0,0)可以看到是过通过hd0来定位的
df -lh
umount /opt
raidstop /dev/md0
more /proc/mdstat
结合raid 0,raid 1来做磁盘阵列
LVM逻辑卷管理技术
PV/VG/LV
LVM技术产生的背景
企业日益变化的存贮需求使得传统的磁盘分区存储显得不够灵活。
磁盘分区存储
/home /var /
100M 100M 1G
100M 100M 50M
/dev/sda1 /dev/sda2 /dev/sda3
PV(physical Volume)
pvcreate /dev/sda1 /dev/sda2 /dev/sda3
将物理卷合成一个大的设备
vgcreate vg0 /dev/sda1 /dev/sda2
200M 50M
/dev/sda1 /dev/sda2 /dev/sda3
VG(Volume Group)
lvcreate -n data -L 10M vg0
LV(Logical Volume)
e2fsadm -L +10M /dev/vg0/data增加空间
vgextend vg0 /dev/sda3增加卷组
pvmove /dev/sda1 [/dev/sdb1]
分区后
t 进行格式转换
L查看转换的码
8e转换linux lvm
/dev/sda5 463 483 168682 8e Linux LVM
/dev/sda6 484 500 136552 8e Linux LVM
/dev/sda7 501 522 176714+ 8e Linux LVM
pvcreate /dev/sda[5-7] 创建物理卷
vgscan 会自动产生配置的数据库和配置文件
vgcreate vg0 /dev/sda5 /dev/sda6创建卷组
vgdisplay vg0显示创建卷组属性
lvcreate -n data -L 10M vg0创建逻辑卷
mkfs.ext3 /dev/vg0/data 格式化逻辑卷
[root@server ~]# mount /dev/vg0/data /mnt 挂载
[root@server ~]# cp /etc/services /mnt考一个文件到/mnt下
[root@server ~]# ls /mnt
lvdisplay /dev/vg0/data
vgdisplay vg0
Alloc PE / Size 3 / 12.00 Mb可见分了三个扩展块,虽然我们分的是10M,但是每个扩展块是PE Size 4.00 MB 所以总共是 LV Size 12.00 MB
[root@server ~]# lvcreate -n test -L 20M vg0 表示的建一个新的逻辑卷,大小为20M
[root@server ~]# lvcreate -n test -l 5 vg0用l表示是5个扩展块
[root@server ~]# mkfs.ext3 /dev/vg0/test
[root@server ~]# lvscan查看目前有多少逻辑卷可以使用
ACTIVE '/dev/vg0/data' [12.00 MB] inherit
ACTIVE '/dev/vg0/test' [20.00 MB] inherit
[root@server ~]# mount /dev/vg0/data /mnt如果逻辑卷data不够用了,我们可以增加
[root@server ~]# df -lh
在FC6中没有e2fsadm,调整逻辑卷的空间需要用三条命令来实现
e2fsck /dev/vg0/data
lvextend -L +100M /dev/vg0/data
resize2fs /dev/vg0/data
[root@server ~]# e2fsck /dev/vg0/data
[root@server ~]# lvextend -L +30M /dev/vg0/data逻辑卷增加30M,如果前面是-号则减少30M
[root@server ~]# e2fsck -f /dev/vg0/data
[root@server ~]# resize2fs /dev/vg0/data
[root@server ~]# mount /dev/vg0/data /mnt
[root@server ~]# df -lh
vgdisplay vg0可以看到己分配的多了几个扩展块Alloc PE / Size 16 / 64.00 MB
[root@server ~]# ls /mnt可以看到原有的数据还在
我们系统没有启动,它就自动的增加在了大小,并且原来的数据还存在,实现了动态存储
[root@server ~]# pvscan查看所有逻辑卷都是用pvcreate初始化的物理卷
[root@server ~]# vgextend vg0 /dev/sda7将/dev/sda7加到vg0来
[root@server ~]# vgdisplay vg0
[root@server ~]# lvscan查看所有物理卷
[root@server ~]# pvmove /dev/sda5这个过程将把物理卷的数据重新分配到其它的物理卷上
[root@server ~]# vgreduce vg0 /dev/sda5真正移开
[root@server ~]# pvscan这时可以看到 PV /dev/sda5 lvm2 [164.73 MB是自由的,这时我们可以用fdisk来转换类型,随意处置了
[root@server ~]# vgdisplay vg0
如何更改 PE Size 4.00 MB
[root@server ~]# vgcreate -s 8M vg1 /dev/sda5
[root@server ~]# vgdisplay vg1
可以看到 PE Size 8.00 MB,加-s就可以改变PE大小
[root@server ~]# lvcreate -n data -l 2 vg1这里指定逻辑块的数量,来乖以PE大小,就是你最后分配逻辑卷的大小
[root@server ~]# ls /dev/vg?
[root@server ~]# lvdisplay vg1
[root@server ~]# lvcreate –help
lvcreate -s|--snapshot这个参数可以来备份数据,可以数据同步问题,只能使用一次,并且在负载不是很重的时候使用,如果很重,则会拖慢你系统的速度。
[root@server ~]# lvcreate -s -l 8 -n snap /dev/vg0/data
[root@server ~]# mount /dev/vg0/snap /opt是一种快照,我们没有格式化也没有分区
[root@server ~]# rm /mnt/services
[root@server ~]# ls /opt我们删掉父卷中的数据,/opt里的数据还是不变
[root@server ~]# umount /opt
[root@server ~]# cp /etc/hosts /mnt
[root@server ~]# ls /mnt
hosts lost+found
[root@server ~]# mount /dev/vg0/snap /mnt
[root@server ~]# ls /mnt可以看到/mnt保留了前面一次的快照
如何停止逻辑卷的使用?
Lvscan
然后依次删除
lvremove /dev/vg0/snap
lvremove /dev/vg0/data
lvremove /dev/vg0/test
lvremove /dev/vg1/data
vgscan
vgremove vg0
vgchange -an vg1 不要活动
vgchange -ay vg1激活
vgremove vg1
pvscan
tail /var/log/messages如果逻辑卷出现什么问题,可以查看系统日志,一般它会现在/var/log/messages里面
vi /etc/rc.sysinit可以看到,只要我们建立好逻辑卷,并挂载到非根目录,系统启动时,会自动找到
df -lh
如何让根分区支持lvm设备
首先要让内核启动时就要认识lvm设备
ls -l /boot/initrd-2.6.25-14.fc9.i686.img 内核在启动时会加载一个虚拟磁盘镜相文件,内核启动的时候只能这个文件里面加载驱动程序
如何你希望将根分区作为lvm设备挂载的话,你就需要在虚拟磁盘镜相文件中包含进你的LVM设备以及LVM的驱动模块
lvmcreate_initrd
会生成ls /boot/initrd-lvm-XXX.gz
要将上面这个文件写进vi /boot/grub.conf就可以了
vgcreate vg0 /dev/sdb1 /dev/sdb2
lvcreate -n data -l 2 vg0
lvmcreate_initrd
gunzip /boot/initrd-lvm-XXX.gz -c > initrd-lvm
file initrd-lvm
mount initrd-lvm /mnt/cdrom/ -o loop
ls /mnt/cdrom可以看到lvm的驱动程序和共享库
整合RAID和LVM的磁盘存储策略
综合应用案例
要求:使用三个硬盘存储数据,保证数据安全性的同时还能让磁盘根据需要动态的缩放
/dev/sdb1 /dev/sdc1 /dev/sdd1
vg
/ /home /var
采用raid 5技术,并把所有的分区移到lvm设备上
fdisk /dev/sdb
p对/dev/sdb进行分区,首柱面和尾柱面都采用默认值
t进行转换
L fd
w保存退出
后面两个/dev/sdc1 /dev/sdd1均按上面操作
cp /usr/share/doc/raidtools-1.00.3/rai5d1.conf.sample /etc/raidtab
vi /etc/raidtab 编辑,构建raid 5
raiddev /dev/md0
device /dev/sdb1组成md0的第一个分区
device /dev/sdc1组成md0的第二个分区
device /dev/sdd1组成md0的第三个分区
fdisk -l /dev/sd[bcd]
mkraid -R /dev/md0
more /proc/mdstat这个命令反应的是内核里的状态
pvcreate /dev/md0
vgcreate vg /dev/md0
vgdisplay vg
lvcreate -n home -l 250 vg
lvcreate -n var -l 250 vg
mkfs.ext3 /dev/vg/home
mkfs.ext3 /dev/vg/var
mkdir /mnt/home
mkdir /mnt/var
mount /dev/vg/home /mnt/home
mount /dev/vg/var /mnt/var
cp -a /home/* /mnt/home/
cp -a /var/* /mnt/var/
df -lh
vi /etc/fstab
/dev/vg/home /home ext3 defaults 0 0
/dev/vg/var /var ext3 defaults 0 0
vi /etc/rc.sysinit
/raid
加上raidstart /dev/md0
确认无误reboot
df确认是否是用的lvm设备
这时我们可以把/dev/sda1中的home var目录删掉
mount /dev/sda1 /mnt
ls /mnt
rm -rf /mnt/var/*
rm -rf /mnt/home/*
umount /home
e2fsadm -l +250 /dev/vg/home 扩展块数量 -L则是容量大小
df -lh 可以看到被动态的缩放了
如何将根分区移植到逻辑卷上去?
只要把Linux启动的模块,库和相关的设备驱动文件全部放到这个启动文件的虚拟磁盘镜像文件,就可以将系统启动时将根作为逻辑卷来挂载
ls -l /boot/initrd-2.6.25-14.fc9.i686.img
lvcreate -n root -l 250 vg
mkfs.ext3 /dev/vg/root
umount /mnt
mount /dev/vg/root /mnt
cd /
ls
tmp proc不需要移植var home目录己移植好了
mkdir tmp proc var home
mkdir misc opt mnt initrd
cp -a bin dev etc lib sbin root usr /mnt
暂时将boot目录存入在原来的地方如果把boot目录放在逻辑卷上,内核是无法认识的
因为在Linux启动之前,内核是无法找到逻辑卷设备的,而且也认不出raid设备
ctr+z挂起
然后bg在后台接着运行
ls -l /boot/initrd-2.6.25-14.fc9.i686.img
mkinitrd
lsmod
mkinitrd /boot/initrd-lvm-$(uname -r).img $(uname -r)
或使用lvmcreate_initrd
file /boot/initrd-lvm-2.6.25-14.fc9.i686.img 确认这个文件是gzip格式的,我们需要解开
cd /boot/
mv initrd-lvm-2.6.25-14.fc9.i686.img initrd-lvm-2.6.25-14.fc9.i686.img.gz
gunzip initrd-lvm-2.6.25-14.fc9.i686.img.gz
mount initrd-lvm-2.6.25-14.fc9.i686.img /opt -o loop
cp -a /dev/lvm dev/
cp -a /dev/vg dev/
ls dev
cp /dev/sd[abcd] dev
cp /dev/sd[abcd]1 dev
ls dev
ls
more linuxrc
#raidautorum /dev/md0
raidstart /dev/md0
vgscan
vgchange -a y
#mount -o defaults –ro -t ext3 /dev/root /sysroot
mount -o defaults –ro -t ext3 /dev/vg/root /sysroot
cp /sbin/vgscan bin/
cp /sbin/vgchange bin/
cp /sbin/raidstart bin/
ldd /sbin/ vgscan检查少了那些库然后考到这里来
ldd /sbin/vgchange
ldd /sbin/ raidstart
cp /etc/raidtab etc
umount /opt
initrd-lvm-2.6.25-14.fc9.i686.img这个己被改过了
gzip initrd-lvm-2.6.25-14.fc9.i686.img -c >initrd-lvm-2.6.25-14.fc9.i686.img.gz
vi /boot/grub/grub.conf 让它知道要加载上面的镜像文件
4 yy 然后移下来按p
default=1
title Fedora LVM
root (hd0,0)
kernel /boot/vmlinuz-2.6.25-14.fc9.i686 ro root=/dev/vg/root
initrd /boot/initrd-lvm-2.6.25-14.fc9.i686.img.gz
然后保存退出
vi /opt/boot/fstab
/dev/vg/root / ext3 defaults 1 1
wq
reboot
df 可以看到根分区/己挂载到/dev/vg/root
但是不管怎么/boot目录永远要放在物理硬盘上
fdisk -l /dev/sda
mount /dev/sda1 /mnt
cd /mnt
ls root
df -lh
在根文件系统上构建lvm就成功了
/dev/vg/root /dev/vg/home /dev/vg/var都是建在vg卷组上,而vg卷组又建在raid设备上这样
能保存数据的安全,而且能保证root home var能随机应变的缩放,达到动态存储的需求。