自由论坛

标题: 【学习笔记】Linux系统存储结构 [打印本页]

作者: prostar    时间: 2016-3-13 16:26
标题: 【学习笔记】Linux系统存储结构
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








欢迎光临 自由论坛 (http://deva.wicp.net/discuz/) Powered by Discuz! X3.2