-- 存储(storage) 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: 创建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