|
linux存储模式
五层:
应用程序 cp
虚拟文件系统 VFS 挂载
文件系统 格式化
设备驱动 ext4.so
物理卷 dd
物理卷:
如硬盘或分区:
硬盘接口:
IDE,SATA,SCSI,SAS;
设备驱动:
要使用对应的文件系统需要对应的模块。
如ext4
lsmod |grep ext4
如ntfs
linux内核支持,但redhat内核没有加上对应的功能
解决方法:
1,重编内核,加上ntfs支持
2,用第三方软件(如ntfs-3g),加上此功能
文件系统:
有对应的驱动模块,就可以格式化成对应的文件系统
如
mkfs.ext4 /dev/sdax
虚拟文件系统层(VFS):
先提一个问题:我能不在把ext4文件系统里的一个文件cp到ntfs文件系统里呢?
答案:可以.
那么也就是说开发人员开发一个cp命令要支持所有的文件系统,如果出现一个新的文件系统,开发人员需要去修改cp命令的源代码。这样效率低下。
实际情况是:cp命令源代码不需要修改,就是因为有虚拟文件系统层(VFS)。
应用层:
在文件系统上任何操作的命令都是应用层,如ls,cp,mv等
===============================================================
dd - convert and copy a file
msdos 446+64(分区表)+2=512 MBR
gpt
1,备份mbr(master boot record主引导记录)
dd if=/dev/sda of=/backup/mbr.backup bs=1 count=512
删除mbr dd if=/dev/zero of=/dev/sda bs=1 count=512
就会发现fdisk -l 看不到分区,一重启系统就启不来了
恢复:dd if=/backup/mbr.backup of=/dev/sda
2,备份整个硬盘
dd if=/dev/sda of=/dev/sdb --把/dev/sda的数据备份到/dev/sdb
恢复:dd if=/dev/sdb of=/dev/sda
dd if=/dev/sda of=/backup/full.backup --把/dev/sda的数据备份成一个文件
恢复:dd if=/backup/full.backup of=/dev/sda
3,备份软盘
dd if=/dev/fd0 of=/backup/fd0.backup bs=1 count=1440
恢复:dd if=/backup/fd0.backup of=/dev/fd0
4,从光盘拷贝iso镜像 (把iso镜像文件需要刻录软件如nero把它刻录到光盘)
dd if=/dev/cdrom of=/xxx.iso
5,从内存里拷贝资料到磁盘
dd if=/dev/mem of=/backup/mem.bin
特殊应用:
6,销毁磁盘数据
dd if=/dev/urandom of=/dev/sda --随机数填充磁盘
7,修复硬盘,当硬盘长时间不使用
dd if=/dev/sda of=/dev/sda
8,raw设备(裸设备)或者lvm数据迁移等
--讲udev时会讲
裸设备 (没有格式化成文件系统的设备,优势就是跳过文件系统层,提高性能效率)
稀疏文件
# dd if=/dev/zero of=test bs=1M count=1 seek=4000000
# ll test -h
-rw-r--r-- 1 root root 3.9T Sep 17 16:41 test
# du -s test
1024 test
# dd if=/dev/zero of=test1 bs=1M count=1 seek=17000000
dd: failed to truncate to 17825792000000 bytes in output file `test1': File too large
--在ext4下,单个文件最大大小为16T,再大的话就会报错
单个文件16T是在ext4文件系统默认的block size=4096的情况下,如果块大小为1024,那么单个文件最大大小为4T
用dd备份,干掉,恢复分区表
skip为跳过input(也就是if后接的设备)
seek为跳过output(也就是of后接的设备)
446+64+2=512 分区表447-510
1,备份分区表
dd if=/dev/sda of=/backup/partition.bak bs=1 count=64 skip=446
2,干掉分区表
dd if=/dev/zero of=/dev/sda bs=1 count=64 seek=446
3,恢复分区表
dd if=/backup/partition.bak of=/dev/sda bs=1 count=64 seek=446
===================================================================
gpt 没有主分区,扩展分区,逻辑扩展分区的概念,支持单个分区最大超过2TB
msdos 有主分区,扩展分区,逻辑扩展分区的概念
BIOS (Basic input and output system)
EFI/UEFI (Extensible Firmware Interface)
P primary主分区
E extend扩展分区
L logical逻辑扩展分区
4P
3P+1E(N个L)
-----------------------------------
fdisk (只能分msdos分区)
parted (可以分msdos和gpt分区)
如何确定你现在的磁盘使用的是哪此分区类型(msdos或gpt)?
# parted /dev/sda
GNU Parted 2.1
Using /dev/sda
Welcome to GNU Parted! Type 'help' to view a list of commands.
(parted) print
Model: ATA ST3500312CS (scsi)
Disk /dev/sda: 500GB
Sector size (logical/physical): 512B/512B
Partition Table: msdos --这里就可以看到类型
这两种分区格式怎么转换?
(parted) mklabel gpt --在parted里输入这样的命令去转换
Warning: Partition(s) on /dev/sda are being used.
Ignore/Cancel? --宿主机千W不要输入Ignore(表示忽略警告,直接干掉系统磁盘里的所有内容),输入Cancel取消或者ctrl+c取消
(parted) mklabel msdos
--注意,不要在正在使用磁盘时做转换(当然你如果不需要当前硬盘的数据的话,也可以直接对使用磁盘做转换),如果你要做转换可以在以下几种情况去做(先备份数据)
1,rescue模式
2,把磁盘接到另一台linux,另一台启动并使用parted /dev/sdb来做转换
3,对一个新加的还未使用的硬盘可以直接做转换
4,在安装系统时,在分区那一步,可以按ctrl+alt+F2切换(vmware这么做,如果是kvm,按图形界面上面的sendkey里选择ctrl+alt+F2)到文本模式,再使用parted来转换
(parted) help
(parted) mkpart
Partition type? [logical]? --因为我现在是msdoc分区,所以才会有此选项;gpt分区无此选项
File system type? [ext2]? ext4 --这是标识此分区的格式化类型,但其它可以随便写的,以你最终格式化的格式为主
Start? 278GB
End? 279GB
(parted) quit
# ls /dev/sda16 --刚分完的区,我这里用ls查不到设备文件,那么就无法对其格式化
ls: cannot access /dev/sda16: No such file or directory
# partx -a /dev/sda --使用此命令(注意后面接的是硬盘名,不是分区名)
# ls /dev/sda16 --能看到此设备名就表示OK了(特殊情况如果还不能看到设备名,则需要reboot你的操作系统)
/dev/sda16
能看到设备后,就可以格式化挂载使用了
======================================================================
硬件存储--》硬raid--》通过iscsi或光纤网络共享给服务器--》分区(lvm可选)--》格式化--》mount使用
raid redundant arrays of inexpensive disks
简单来说,raid就是把多个磁盘组成一个磁盘组(为了提高IO性能和数据高可用)
硬raid 生产环境用这个,使用raid卡来做的磁盘阵列
软raid 使用软件做的磁盘阵列,实现应用没什么价值,这里用于教学说明原理
raid级别
常见的raid5,raid10
raid 0 读写性能佳,坏了其中一块,数据挂掉,可靠性低(stripe条带化),磁盘利用率100%
A B
1234
1 2
3 4
raid 1 镜像备份(mirror),同一份资料完整的保存在多个磁盘上,写的性能不佳,可靠性高,读的性能还行,磁盘利用率50%
A B
1234
1 1
2 2
3 3
4 4
raid 10 先做raid 1 再做raid 0
abc
disk 0 disk 1 raid 1
a a
disk 2 disk 3 raid 1
b b
disk 4 disk 5 raid 1
c c
坏掉disk 0后:
读写性
另外五块都可以读写
安全性:
另五块中,只有坏掉disk 1 整个raid才会挂掉,概率为1/5
raid 01 先做raid 0 再做raid 1
abc abc
raid 0 raid 0
disk 0 disk 3
a a
disk 1 disk 4
b b
disk 2 disk 5
c c
坏掉disk 0后:
读写性:
还有三块可以读写
安全性:
另外五块中3,4,5坏掉任意一块,则整个raid挂掉。概率为3/5
raid 10和 raid01就安全可靠性上来说还是raid10好点,读写性能一样,磁盘利用率一样
raid 5
由多块磁盘做raid 5,磁盘利用率为n-1/n, 其中一块放校验数据,允许坏一块盘,数据可以利用校验值来恢复
disk 1 disk 2 disk 3
数据 数据 校验
检验 数据 数据
数据 检验 数据
raid 5 和 raid 10
3d + 1 2d+2d
1,利用率(成本)
3/4 1/2
2,安全性
坏掉一块的情况,raid5就不能再坏了
raid10只有当和坏掉的那块同为raid1组里的时候,才会整个坏掉,概率1/3
3,读写性能
raid 5对大文件读写好点 olap(联机分析处理)
raid 10对小文件读写好点 oltp(联机事务处理)
=============================================
使用vmware或者kvm直接在线加9个1G大小的硬盘
linear 线型
stripe 条带
mirror 镜像
mdadm - manage MD devices aka Linux Software
RAID
创建raid 0
[root@raid ~]# mdadm --create /dev/md0 --level=0 --raid-devices=2 /dev/sdb /dev/sdc
mdadm: array /dev/md0 started.
创建过程中可以用另一终端cat /proc/mdstat 去查看正在创建的状态信息
[root@raid ~]# mkfs.ext4 /dev/md0
[root@raid ~]# mount /dev/md0 /mnt/
[root@raid ~]# df -h |grep mnt
/dev/md0 2.0G 36M 1.9G 2% /mnt
[root@raid ~]# cat /proc/mdstat
Personalities : [raid0]
md0 : active raid0 sdc[1] sdb[0]
2097024 blocks 64k chunks
unused devices: <none>
创建raid 1
[root@raid ~]# mdadm --create /dev/md1 --level=1 --raid-devices=2 /dev/sdd /dev/sde
mdadm: array /dev/md1 started.
[root@raid ~]# mkfs.ext4 /dev/md1
[root@raid ~]# mount /dev/md1 /media/
[root@raid ~]# df -h |grep md
/dev/md0 2.0G 36M 1.9G 2% /mnt
/dev/md1 1008M 18M 940M 2% /media
创建raid5
[root@raid ~]# mdadm --create /dev/md5 --level=5 --raid-devices=4 /dev/sdf /dev/sdg /dev/sdh /dev/sdi
mdadm: array /dev/md5 started.
[root@raid ~]# watch cat /proc/mdstat --这里监控一下它们盘之间的数据同步;等它们同步完毕再进行下面的格式化
[root@raid ~]# mkfs.ext4 /dev/md5
[root@raid ~]# mount /dev/md5 /misc/
[root@raid ~]# df -h |grep md
/dev/md0 2.0G 36M 1.9G 2% /mnt --raid 0利用率为100%
/dev/md1 1008M 18M 940M 2% /media --raid 1利用率为50%
/dev/md5 3.0G 69M 2.8G 3% /misc --raid 5利用率为n-1/n,在这里就是3/4
--验证raid0
在做raid0的两个盘上查看io情况
例:
终端1:iostat 2 两秒一次查看所有的盘上的IO情况
终端2: dd if=/dev/zero of=/mnt/aaa bs=1M count=1000
可以看到两个盘上都有写的io,并且/dev/sdb和/dev/sdc的IO一样,总和才等于/dev/md0的IO;验证了raid0的功能(条带)
--验证raid1
在做raid1的两个盘上查看io情况
例:
终端1:iostat 2 两秒一次查看所有的盘上的IO情况
终端2: dd if=/dev/zero of=/media/aaa bs=1M count=1000
可以看到两个盘上都有写的io,并且/dev/sdd和/dev/sde的IO一样,并且也等于/dev/md1的IO;验证了raid1的功能(镜像)
--验证raid5
在做raid5的四个盘上查看io情况
例:
终端1:iostat 2 两秒一次查看所有的盘上的IO情况
终端2: dd if=/dev/zero of=/misc/aaa bs=1M count=1000
可以看到四个盘上都有写的io,并且/dev/sdf,/dev/sdg,/dev/sdh,/dev/sdi四个盘的IO总和为/dev/md5的IO的4/3;验证了raid5的功能(n-1/n)
实际速度比较应该为:raid0>raid5>raid1或不做raid
===========================================================
--raid的启停
[root@raid ~]# vim /etc/mdadm.conf --手动编写raid的配置文件,此文件不存在,要手动建立,并写上
DEVICES /dev/sdb /dev/sdc /dev/sdd /dev/sde /dev/sdf /dev/
sdg /dev/sdh /dev/sdi --把做了raid的分区写上来。或者写成DEVICES /dev/sd[bcdefghi]。但不能写成DEVICES /dev/sd{b,c,d,e,f,g,h,i}
[root@raid ~]# mdadm --detail --scan >> /etc/mdadm.conf
--扫描当前raid的信息,并追加到配置文件里
# cat /etc/mdadm.conf
DEVICES /dev/sdb /dev/sdc /dev/sdd /dev/sde /dev/sdf /dev/sdg /dev/sdh /dev/sdi
ARRAY /dev/md0 level=raid0 num-devices=2 metadata=0.90 UUID=84209045:9c03c4cb:7f755b8d:cc471294
ARRAY /dev/md1 level=raid1 num-devices=2 metadata=0.90 UUID=4e62fdc1:6c2a652f:fb72c05d:356d5c76
ARRAY /dev/md5 level=raid5 num-devices=4 metadata=0.90 UUID=c3c1f37b:9fba8a89:a711dc6c:01a5ddb3
--如果你不做上面这步,重启系统,raid会不能自动被认到(在rhel6里测试为重启后名字会变)。所以做完的raid都需要扫描并存放信息
停止raid设备
先umount 已经挂载的raid设备
[root@raid ~]# umount /mnt/
[root@raid ~]# umount /media/
[root@raid ~]# umount /misc/
然后使用命令停止
[root@raid ~]# mdadm --stop /dev/md0
mdadm: stopped /dev/md0
[root@raid ~]# mdadm --stop /dev/md1
mdadm: stopped /dev/md1
[root@raid ~]# mdadm --stop /dev/md5
mdadm: stopped /dev/md5
启动raid设备
1,有/etc/mdadm.conf配置文件的情况下
[root@raid ~]# mdadm -A /dev/md0
mdadm: /dev/md0 has been started with 2 drives.
[root@raid ~]# mdadm -A /dev/md1
mdadm: /dev/md1 has been started with 2 drives.
[root@raid ~]# mdadm -A /dev/md5
mdadm: /dev/md5 has been started with 4 drives.
[root@raid ~]# cat /proc/mdstat --再查看,就有信息了,并且raid里的数据还在
2,没有配置文件的情况下,手动把设备名写上就可以了
[root@raid ~]# mdadm -A /dev/md0 /dev/sd{b,c}
mdadm: /dev/md0 has been started with 2 drives.
[root@raid ~]# mdadm -A /dev/md1 /dev/sd{d,e}
mdadm: /dev/md1 has been started with 2 drives.
[root@raid ~]# mdadm -A /dev/md5 /dev/sd{f,g,h,i}
mdadm: /dev/md5 has been started with 4 drives.
3,如果连设备名都不知道,可以去查看每个设备的raid信息,使用uuid把raid设备重新组合
[root@raid ~]# mdadm -E /dev/sdf
/dev/sdf:
Magic : a92b4efc
Version : 0.90.00
UUID : b091e16b:f8df9671:465755db:c640595b --UUID,同一个raid里每个磁盘查看的都是这个值
Creation Time : Sat May 7 11:23:52 2011
Raid Level : raid5
Used Dev Size : 1048512 (1024.11 MiB 1073.68 MB)
Array Size : 3145536 (3.00 GiB 3.22 GB)
Raid Devices : 4
Total Devices : 4
Preferred Minor : 5
Update Time : Sat May 7 11:42:09 2011
State : clean
Active Devices : 4
Working Devices : 4
Failed Devices : 0
Spare Devices : 0
Checksum : facef367 - correct
Events : 2
Layout : left-symmetric
Chunk Size : 64K
Number Major Minor RaidDevice State
this 0 8 80 0 active sync /dev/sdf
0 0 8 80 0 active sync /dev/sdf
1 1 8 96 1 active sync /dev/sdg
2 2 8 112 2 active sync /dev/sdh
3 3 8 128 3 active sync /dev/sdi
[root@raid ~]# mdadm -A --uuid=b091e16b:f8df9671:465755db:c640595b /dev/md5
mdadm: /dev/md5 has been started with 4 drives.
--上面组合后的名字可以随意写,甚至是不存在的一个名字,相当于是重新组合
=================================================================
软raid的热插拔实验
模拟raid中其中一块盘故障
[root@raid ~]# mdadm /dev/md5 --fail /dev/sdf
mdadm: set /dev/sdf faulty in /dev/md5
--使用--fail对raid中其中一块盘打一个fail标记
[root@raid ~]# cat /proc/mdstat
Personalities : [raid0] [raid1] [raid6] [raid5] [raid4]
md5 : active raid5 sdf[4](F) sdi[3] sdh[2] sdg[1]--有个F标记
3145536 blocks level 5, 64k chunk, algorithm 2 [4/3] [_UUU]
md1 : active raid1 sdd[0] sde[1]
1048512 blocks [2/2] [UU]
md0 : active raid0 sdb[0] sdc[1]
2097024 blocks 64k chunks
[root@raid ~]# mdadm /dev/md5 --remove /dev/sdf
mdadm: hot removed /dev/sdf
--热移除故障磁盘
[root@raid ~]# mdadm /dev/md5 --add /dev/sdj --增加一块新的磁盘上去
mdadm: re-added /dev/sdj
--刚增加完后,机器负载较高,因为现在它在对新盘同步数据
[root@raid ~]# cat /proc/mdstat
Personalities : [raid0] [raid1] [raid6] [raid5] [raid4]
md5 : active raid5 sdj[4] sdi[3] sdh[2] sdg[1]
3145536 blocks level 5, 64k chunk, algorithm 2 [4/3] [_UUU]
[=====>...............] recovery = 29.2% (307840/1048512) finish=0.0min speed=153920K/sec --这里可以看到在同步中
md1 : active raid1 sdd[0] sde[1]
1048512 blocks [2/2] [UU]
md0 : active raid0 sdb[0] sdc[1]
2097024 blocks 64k chunks
--同步完成后,查看数据还在
---------------------
把raid设备挂载到/mnt目录
# mysql_install_db --datadir=/mnt --user=mysql
# mysqld_safe --datadir=/mnt/ --user=mysql &
然后使用mysql进入,插入一些数据,再进行热插拔实验,在这个过程中都可以进入大批量insert操作,不受影响(只受负载影响,因为同步raid数据时也要占用负载)
=================================================================
删除raid
1,umount
2,
[root@raid ~]# mdadm /dev/md5 --fail /dev/sdf --remove /dev/sdf
mdadm: set /dev/sdf faulty in /dev/md5
mdadm: hot removed /dev/sdf
[root@raid ~]# mdadm /dev/md5 --fail /dev/sdg --remove /dev/sdg
mdadm: set /dev/sdg faulty in /dev/md5
mdadm: hot removed /dev/sdg
[root@raid ~]# mdadm /dev/md5 --fail /dev/sdh --remove /dev/sdh
mdadm: set /dev/sdh faulty in /dev/md5
mdadm: hot removed /dev/sdh
[root@raid ~]# mdadm /dev/md5 --fail /dev/sdi --remove /dev/sdi
mdadm: set /dev/sdi faulty in /dev/md5
mdadm: hot removed /dev/sdi
3,
[root@raid ~]# mdadm --stop /dev/md5
mdadm: stopped /dev/md5
4,
直接用fdisk删除分区
或者
用下面命令擦除superblock
[root@raid ~]# mdadm --misc --zero-superblock /dev/sdf
[root@raid ~]# mdadm --misc --zero-superblock /dev/sdg
[root@raid ~]# mdadm --misc --zero-superblock /dev/sdh
[root@raid ~]# mdadm --misc --zero-superblock /dev/sdi
--把上面的四个盘再做成raid 10
方法一:
# mdadm --create /dev/md10 --level=10 --raid-devices=4 /dev/sd[fghi]
方法二:
先把两个做成两组raid1
再把这两组做成raid0
--做完raid10后把配置文件/etc/mdadm.conf里的raid信息的那几行删除,再重新用下面的命令扫描一下
mdadm --detail --scan >> /etc/mdadm.conf
===================================================================
docs.redhat.com
LVM 逻辑卷管理 logical volume manager
--参考下面的文档
# ls /share/soft/soft/pdf/redhat_5_zh/Red_Hat_Enterprise_Linux-5-Cluster_Logical_Volume_Manager-zh-CN.pdf
pv physical volume(物理卷) 把实际分区或设备划为pv , pv是lvm物理标记
vg volume group (卷组) 把pv组合成vg,相当于组合成lvm能够使用一个大硬盘
lv logical volume (逻辑卷) 实际可以使用的lvm的设备,相当是把vg划分成可用的分区
pe physical extend (物理扩展)vg组成的最小单位,默认是4M,vg最大支持65535个pe,相当于是block
block devices --> PV --> VG --> LV (线型,条带,镜像) --> 格式化 --->挂载使用
做成lvm的优势:
1,可以灵活变动大小
2,可以自定义设备名(物理卷也可以改名,使用udev)
3,可以做线型(linear),条带(stripe),镜像(mirror)
4,可以做lvm快照
1,划分pv
[root@raid ~]# pvcreate /dev/md0
Physical volume "/dev/md0" successfully created
[root@raid ~]# pvcreate /dev/md1
Physical volume "/dev/md1" successfully created
[root@raid ~]# pvcreate /dev/md10
Physical volume "/dev/md10" successfully created
查看相关信息的命令 pvscan pvdisplay pvs
删除pv的命令 pvremove /dev/md10
[root@raid ~]# pv
pvchange pvcreate pvmove pvresize pvscan
pvck pvdisplay pvremove pvs pv.sh
2,划分vg
[root@raid ~]# vgcreate vg01 /dev/md10
Volume group "vg01" successfully created
[root@raid ~]# vgextend vg01 /dev/md0
Volume group "vg01" successfully extended
[root@raid ~]# vgextend vg01 /dev/md1
Volume group "vg01" successfully extended
--补充:vgcreate -s 指定PE的大小
查看相关信息的命令vgscan vgdisplay vgs
# vgs
VG #PV #LV #SN Attr VSize VFree
vg01 3 0 0 wz--n- 4.99G 4.99G
[root@raid ~]# vgreduce vg01 /dev/md0
Removed "/dev/md0" from volume group "vg01"
--vgreduce跟vgextend是相反的,是在vg里移除pv
移除vg的命令是vgremove,它是和vgcreate相反
3,把vg划分为逻辑卷(线性卷linear)
[root@raid ~]# lvcreate -L 1000M -n lv01 vg01 --L指定大小,n指定lv的名字
Logical volume "lv01" created
[root@raid ~]# lvcreate -l 250 -n lv02 vg01 --l指定PE的个数,n指定lv的名字
Logical volume "lv02" created
=======================
[root@raid ~]# lvcreate -L 1001M -n lv03 vg01 --指定为1001M,它会自动做成1004M,要是PE的倍数
Rounding up size to full physical extent 1004.00 MB
Logical volume "lv03" created
=======================
[root@raid ~]# ls /dev/vg01/ -l
lrwxrwxrwx 1 root root 21 May 7 14:14 lv01 -> /dev/mapper/vg01-lv01
lrwxrwxrwx 1 root root 21 May 7 14:15 lv02 -> /dev/mapper/vg01-lv02
[root@raid ~]# ls /dev/mapper/ -l
brw-rw---- 1 root disk 253, 0 May 7 14:14 vg01-lv01
brw-rw---- 1 root disk 253, 1 May 7 14:15 vg01-lv02
[root@raid ~]# mkfs.ext4 /dev/vg01/lv01
[root@raid ~]# mkfs.ext4 /dev/vg01/lv02
[root@raid ~]# mount /dev/vg01/lv01 /mnt/
[root@raid ~]# mount /dev/vg01/lv02 /media/
[root@raid ~]# df -h | tail -4
/dev/mapper/vg01-lv01
985M 18M 918M 2% /mnt
/dev/mapper/vg01-lv02
985M 18M 918M 2% /media
[root@raid ~]# echo '12345' > /mnt/1
[root@raid ~]# echo '678910' > /media/2
查看的相关参数为lvscan lvdisplay
[root@raid ~]# lvscan
ACTIVE '/dev/vg01/lv01' [1000.00 MB] inherit
ACTIVE '/dev/vg01/lv02' [1000.00 MB] inherit
移除lv使用lvremove
完全删除lvm,就要先lvremove,再vgremove,最后pvremove
=============================================================
[root@raid ~]# vgs
VG #PV #LV #SN Attr VSize VFree
vg01 3 2 0 wz--n- 4.99G 3.04G
[root@raid ~]# lvcreate -l 50%VG -n lv03 vg01 --创建lv03,大小为vg01的一半
[root@raid ~]# lvcreate -l 100%FREE -n lv04 vg01 --把剩下的所有空间都分配给新创建的lv04
[root@raid ~]# lvs --使用lvs验证
LV VG Attr LSize Origin Snap% Move Log Copy% Convert
lv01 vg01 -wi-ao 1000.00M
lv02 vg01 -wi-ao 1000.00M
lv03 vg01 -wi-a- 2.49G
lv04 vg01 -wi-a- 556.00M
=================================================
使用lvremove把上面的四个卷给移除,再来创建条状卷
[root@raid ~]# lvremove vg01 --移除四个卷
Do you really want to remove active logical volume lv01? [y/n]: y
Logical volume "lv01" successfully removed
Do you really want to remove active logical volume lv02? [y/n]: y
Logical volume "lv02" successfully removed
Do you really want to remove active logical volume lv03? [y/n]: y
Logical volume "lv03" successfully removed
Do you really want to remove active logical volume lv04? [y/n]: y
Logical volume "lv04" successfully removed
Volume group "lv01" not found
当您创建条状逻辑卷时,请使用 lvcreate 命令的 -i 参数指定条带的数目。这取决于逻辑卷要进行条带
化的物理卷数目。条带的数目不能超过卷组中物理卷的数目(除非使用 --alloc anywhere 参数)
如果构成逻辑卷的基本物理设备的大小不同,条状卷的最大容量由最小的基本设备决定。例如,在有两
个分支条状卷中,其容量最大为较小设备的两倍。在有三个分支的条状卷中,其容量是最小设备的三倍
。
条带卷的大小由最小的PV和创建命令的-i参数(条带数)来决定
以这个为例
PV VG Fmt Attr PSize PFree
/dev/md0 vg01 lvm2 a-- 2.00g 2.00g
/dev/md1 vg01 lvm2 a-- 1020.00m 1020.00m
/dev/md10 vg01 lvm2 a-- 2.00g 2.00g
1,因为我这有三个PV,所以用-i 3实现三个条带;那么最大大小为1020*3=3060M
--创建条带卷
# lvcreate -L 3060M -i3 -n stripe_lv_01 vg01
Logical volume "stripe_lv_01" created
可以对其格式化,再用dd和iostat来做测试(但测试的结果比较复杂,因为我是几种不同的raid做的条带卷)
===========================================
镜像卷
当您创建一个镜像卷时,您可使用 lvcreate 命令的 -m 参数来指定数据的备份数目。指定 -m1 生成一
个镜像,也就是生成两个文件系统副本:一个线性逻辑卷加上一个副本。同样的,指定 -m2 会生成两
个镜像,也就是生成三个文件系统副本。
镜像卷的大小由最小的PV和副本数(也就是-m后接的数字)来决定
以这个为例
PV VG Fmt Attr PSize PFree
/dev/md0 vg01 lvm2 a-- 2.00g 2.00g
/dev/md1 vg01 lvm2 a-- 1020.00m 1020.00m
/dev/md10 vg01 lvm2 a-- 2.00g 2.00g
1,如果-m 1,那么他会选md0和md10这两个来做镜像,所以最大大小为2G
2,如果-m 2,那么他会选这三个一起来做,最大大小为1020M
3,不能-m 3或者更大;因为我这里只有三个PV
--以下面的为例
# pvs
PV VG Fmt Attr PSize PFree
/dev/sdb13 vg01 lvm2 a- 964.00M 964.00M
/dev/sdb14 vg01 lvm2 a- 964.00M 964.00M
/dev/sdb15 vg01 lvm2 a- 964.00M 964.00M
# vgs
VG #PV #LV #SN Attr VSize VFree
vg01 3 0 0 wz--n- 2.82G 2.82G
8,再次创建镜像卷,成功创建
# lvcreate -n lv_mirror -L 300M -m 1 vg01
Logical volume "lv_mirror" created
# ls /dev/mapper/
control vg01-lv_mirror_mimage_0 vg01-lv_mirror_mlog
vg01-lv_mirror vg01-lv_mirror_mimage_1
格式化这个镜像卷,并挂载
# mkfs.ext3 /dev/mapper/vg01-lv_mirror
# mount /dev/mapper/vg01-lv_mirror /media/
# df -h
/dev/mapper/vg01-lv_mirror
291M 11M 266M 4% /media
测试镜像卷可用性
# echo 123 > /media/123
# cat /media/123
123
破坏其中一个物理卷。
# dd if=/dev/zero of=/dev/sdb13
或者
# mkfs.ext3 /dev/sdb13
pvs 检测出有物理卷被损坏,找不到uuid
但数据仍然可以正常访问
# cat /media/123
123
可以对其格式化,再用dd和iostat来做测试(但测试的结果比较复杂,因为我是几种不同的raid做的条带卷)
关于三种卷之间的转换
--把线性卷转化成镜像卷
lvconvert -m 1 vg01/lv_linear --速度较慢
--把镜像卷转化成线性卷
lvconvert -m 0 vg01/lv_mirror --速度较快
实现总结:
1,如果物理做了raid10,那么就可以不做条带和镜像卷了,只有线性卷就可以了
2,如果物理没做raid,那么你希望提高IO性能或高可用,则可以使用条带或镜像卷
============================================================
lv的扩容
1,先考虑vg是否还有空间去扩容,如果没有,那么要先扩容vg,使用vgextend
2,
[root@raid ~]# lvextend -L 1.5g /dev/vg01/lv01
Extending logical volume lv01 to 1.50 GB
Logical volume lv01 successfully resized
下面两种写法也可以
[root@dns ~]# lvextend -L +500M /dev/vg01/lv01
[root@dns ~]# lvextend -l +125 /dev/vg01/lv01
[root@raid ~]# df -h
/dev/mapper/vg01-lv01
985M 18M 918M 2% /mnt--查看已经挂载的大小,没有变化
3,
[root@raid ~]# resize2fs /dev/vg01/lv01 --再使用这个命令去在线同步
resize2fs 1.39 (29-May-2006)
Filesystem at /dev/vg01/lv01 is mounted on /mnt; on-line resizing required
Performing an on-line resize of /dev/vg01/lv01 to 393216 (4k) blocks.
The filesystem on /dev/vg01/lv01 is now 393216 blocks long.
[root@raid ~]# df -h
/dev/mapper/vg01-lv01
1.5G 18M 1.4G 2% /mnt --再次查看,已经挂载的lv扩大了,并且数据没有影响
===================================
lv的缩小
做缩小操作之前,都要去验证查看一下数据的大小,缩小时不要缩到比已经存在的数据量还要小(数据库内的表空间缩小也是一样要先查看已有数据大小)
[root@raid ~]# resize2fs /dev/vg01/lv01 1g --这样去缩小的话,报错已经mount了
resize2fs 1.39 (29-May-2006)
Filesystem at /dev/vg01/lv01 is mounted on /mnt; on-line resizing required
On-line shrinking from 393216 to 262144 not supported.
[root@raid ~]# umount /mnt/
[root@raid ~]# resize2fs /dev/vg01/lv01 1g --umount后再使用resize2fs命令,要求先去e2fsck检测
resize2fs 1.39 (29-May-2006)
Please run 'e2fsck -f /dev/vg01/lv01' first.
[root@raid ~]# e2fsck -f /dev/vg01/lv01
e2fsck 1.39 (29-May-2006)
Pass 1: Checking inodes, blocks, and sizes
Pass 2: Checking directory structure
Pass 3: Checking directory connectivity
Pass 4: Checking reference counts
Pass 5: Checking group summary information
/dev/vg01/lv01: 12/192000 files (8.3% non-contiguous), 10517/393216 blocks
[root@raid ~]# resize2fs /dev/vg01/lv01 1g --检测后再使用resize2fs命令缩小,并挂载查看大小是否缩小
resize2fs 1.39 (29-May-2006)
Resizing the filesystem on /dev/vg01/lv01 to 262144 (4k) blocks.
The filesystem on /dev/vg01/lv01 is now 262144 blocks long.
[root@raid ~]# lvscan
ACTIVE '/dev/vg01/lv01' [1.50 GB] inherit --但这里查看的还是1.5g
ACTIVE '/dev/vg01/lv02' [1000.00 MB] inherit
[root@raid ~]# lvreduce -L 1g /dev/vg01/lv01 --所以lvreduce也要做
WARNING: Reducing active logical volume to 1.00 GB
THIS MAY DESTROY YOUR DATA (filesystem etc.)
Do you really want to reduce lv01? [y/n]: y
Reducing logical volume lv01 to 1.00 GB
Logical volume lv01 successfully resized
[root@raid ~]# lvscan
ACTIVE '/dev/vg01/lv01' [1.00 GB] inherit --OK
ACTIVE '/dev/vg01/lv02' [1000.00 MB] inherit
[root@raid ~]# mount /dev/vg01/lv01 /mnt/
[root@raid ~]# df -h
/dev/mapper/vg01-lv02
985M 18M 918M 2% /media --缩小了
====================================================================
lvm 快照功能 snapshot
1,快照创建的速度非常快,不需要停止生产环境
2,快照的大小是存储差异数据,或是快照时间点的状态,不需要和lv同大小
3,它可以用于一些特殊的情况,比如数据库备份,或者批量复制虚拟机(不关闭虚拟机的情况下,克隆是需要关闭或暂停虚拟机的),虚拟机做快照等
实验:
[root@raid ~]# dd if=/dev/zero of=/media/10m bs=1M count=10
[root@raid ~]# dd if=/dev/zero of=/media/20m bs=1M count=20
[root@raid ~]# dd if=/dev/zero of=/media/30m bs=1M count=30
[root@raid ~]# ls /media/ -l
total 61532
-rw-r--r-- 1 root root 10485760 May 7 15:18 10m
-rw-r--r-- 1 root root 20971520 May 7 15:18 20m
-rw-r--r-- 1 root root 31457280 May 7 15:18 30m
drwx------ 2 root root 16384 May 7 14:17 lost+found
[root@raid ~]# lvcreate -s -L 100m -n snap01 /dev/vg01/lv02 --L参数指定的大小不是快照大小,它类似于一个快照存活的时间(由源的改变来定义存活时间的长短。源增加多少,这个100M‘时间‘就会被使用多少,源删除,这个100M时间只会被增加一点点,因为删除只记录它的一个innode失效。但注意,快照的内容不会跟着改变。
Logical volume "snap01" created
[root@raid ~]# ls /dev/vg01/snap01
/dev/vg01/snap01
[root@raid ~]# mkdir /snap
[root@raid ~]# mount /dev/vg01/snap01 /snap/
[root@raid ~]# ls /snap/ --快照的内容
10m 20m 30m lost+found
[root@raid ~]# dd if=/dev/zero of=/media/50m bs=1M count=50
--在源目录加一个50M的文件
[root@raid ~]# ls /snap/ --快照的内容不会跟着变
10m 20m 30m lost+found
[root@raid ~]# lvs
LV VG Attr LSize Origin Snap% Move Log Copy% Convert
lv01 vg01 -wi-ao 1.00G
lv02 vg01 owi-ao 1000.00M
snap01 vg01 swi-ao 100.00M lv02 50.48 --但是这个snap%会发现由几乎为0变化到50%
--下面再可以继续做试验:
1,在源删除一个文件,再使用lvs查看 %snap只会增加一点点
2,当%snap用完了100%,则快照失效。umount和mount快照都会出问题
3, 快照的内容不会跟着源改变
[root@raid ~]# lvremove /dev/vg01/snap01 --快照的移除
Do you really want to remove active logical volume snap01? [y/n]: y
Logical volume "snap01" successfully removed
|
|