且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

Linux磁盘管理之LVM2 逻辑卷管理工具

更新时间:2022-02-04 00:55:40

一、LVM的基本概念

    LVM(Logical Volume Manager,逻辑卷管理器)是Linux下对磁盘分区进行管理的一种机制。LVM是建立在磁盘分区与文件系统之上的一个逻辑层。其主要特点是可以动态的在不重新分区的情况下调整分区大小,比如当业务数据快要占满磁盘时,这时需要增加硬盘,LVM就可以将新增的硬盘空间直接扩展到原来的磁盘分区上。

    LVM在centos 6以后升级为LVM2,但是查看其帮助文档还是通过“man lvm”来实现。

    LVM除了在动态扩容方面有优势,还有快照功能,可以瞬间备份某一时刻的文件。

二、LVM中的术语

    物理卷:(Physical Volume,PV),指硬盘分区或者从逻辑上看与硬盘分区类似的设备。

    卷组:( Volume Group,VG),类似与非LVM系统上的物理硬盘,一个LVM卷组由一个或多个PV组成。

    逻辑卷:(Logical Volume,LV),类似于非LVM系统上的硬盘分区,LV建立在VG上,可以在LV上面创建文件系统。

    PE(Physical Extent,PE),PV中可以分配的最小存储单元。PE大小可以指定(默认为4M)

    LE(Logical Extent,LE),LV中可以分配的最小单元。同一个卷组中LE与PE的大小是一样的,且一一对应。

    下图清楚的说明了LVM各自组成部分之间的对应关系。

Linux磁盘管理之LVM2 逻辑卷管理工具



三、LVM创建与管理

    首先,建议各位在使用时,现在测试机上面测试好再进行操作。

    我这里新添加了一块硬盘为/dev/sdc,分为5个区,其中/dev/sdc4为扩展分区,此次将对/dev/sdc1、/dev/sdc2、/dev/sdc3、/dev/sdc5操作。

1、lvm管理命令中的查看命令

    # 此处放在前面说是因为在创建之后需要进行查看验证,此处不做演示,后面实战中会演示其功能

    a、pv(物理卷)查看工具

        pvs [device]用于查看当前pv,可指定设备查看

        pvdisplay [device]查看pv的详细信息,可指定设备查看

    b、vg(卷组)查看工具

        vgs [device]用于查看当前vg,可指定设备查看

        vgdisplay [device]用于查看当前vg的详细信息,可指定设备查看

    c、lv(逻辑卷)查看工具

        lvs [device]用于查看当前lv,可指定设备查看

        lvdisplay [device]用于查看当前lv的详细信息,可指定设备查看

2、创建与删除pv

创建PV

    pvcreate /dev/DEVICE

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
# pvcreate /dev/sdc{1,2,3,5}
  Physical volume "/dev/sdc1" successfully created
  Physical volume "/dev/sdc2" successfully created
  Physical volume "/dev/sdc3" successfully created
  Physical volume "/dev/sdc5" successfully created
 
  # 查看当前系统上所有的pv
 
# pvs
  PV         VG   Fmt  Attr PSize PFree
  /dev/sdc1       lvm2 ---  2.00g 2.00g
  /dev/sdc2       lvm2 ---  3.00g 3.00g
  /dev/sdc3       lvm2 ---  4.00g 4.00g
  /dev/sdc5       lvm2 ---  6.00g 6.00g
 
  #查看每个pv的详细信息
 
# pvdisplay 
  "/dev/sdc5" is a new physical volume of "6.00 GiB"
  --- NEW Physical volume ---
  PV Name               /dev/sdc5
  VG Name               
  PV Size               6.00 GiB
  Allocatable           NO
  PE Size               0   
  Total PE              0
  Free PE               0
  Allocated PE          0
  PV UUID               o9mAZH-XW6M-B3qe-UUbG-62Xs-i10j-7kWJrs
    
  "/dev/sdc1" is a new physical volume of "2.00 GiB"
  --- NEW Physical volume ---
  PV Name               /dev/sdc1
  VG Name               
  PV Size               2.00 GiB
  Allocatable           NO
  PE Size               0   
  Total PE              0
  Free PE               0
  Allocated PE          0
  PV UUID               f1S5ly-SjTw-SeJP-lRQ6-INWD-wSTP-VZbKgf
    
  "/dev/sdc3" is a new physical volume of "4.00 GiB"
  --- NEW Physical volume ---
  PV Name               /dev/sdc3
  VG Name               
  PV Size               4.00 GiB
  Allocatable           NO
  PE Size               0   
  Total PE              0
  Free PE               0
  Allocated PE          0
  PV UUID               u0JyWo-DQ0j-YmVQ-BlQl-mADE-CUHO-Z8vHZW
    
  "/dev/sdc2" is a new physical volume of "3.00 GiB"
  --- NEW Physical volume ---
  PV Name               /dev/sdc2
  VG Name               
  PV Size               3.00 GiB
  Allocatable           NO
  PE Size               0   
  Total PE              0
  Free PE               0
  Allocated PE          0
  PV UUID               e2bWFM-cSc8-3rf2-v0q2-xiBC-63fc-acbdsC

删除pv(注意:如果在使用的pv不能直接移除,需要使用pvmove命令将其数据移除完毕后在用pvremove移除)

    pvremove /dev/DEVICE

1
2
3
4
5
6
7
8
9
10
11
12
13
# pvremove /dev/sdc1
  Labels on physical volume "/dev/sdc1" successfully wiped
# pvs
  PV         VG   Fmt  Attr PSize PFree
  /dev/sdc2       lvm2 ---  3.00g 3.00g
  /dev/sdc3       lvm2 ---  4.00g 4.00g
  /dev/sdc5       lvm2 ---  6.00g 6.00g
# pvremove /dev/sdc2
  Labels on physical volume "/dev/sdc2" successfully wiped
# pvs
  PV         VG   Fmt  Attr PSize PFree
  /dev/sdc3       lvm2 ---  4.00g 4.00g
  /dev/sdc5       lvm2 ---  6.00g 6.00g

3、VG管理工具

创建VG:

    vgcreate  [-s #[kKmMgGtTpPeE]] VolumeGroupName  PhysicalDevicePath [PhysicalDevicePath...]

    -s:指定PE大小(默认为4M)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
# vgcreate vg0 /dev/sdc{1,2,3,5}
  Volume group "vg0" successfully created
  #查看系统上所有的vg
# vgs
  VG   #PV #LV #SN Attr   VSize  VFree 
  vg0    4   0   0 wz--n- 14.98g 14.98g
  #查看每个vg的详细信息
# vgdisplay 
  --- Volume group ---
  VG Name               vg0
  System ID             
  Format                lvm2
  Metadata Areas        4
  Metadata Sequence No  1
  VG Access             read/write
  VG Status             resizable
  MAX LV                0
  Cur LV                0
  Open LV               0
  Max PV                0
  Cur PV                4
  Act PV                4
  VG Size               14.98 GiB
  PE Size               4.00 MiB
  Total PE              3836
  Alloc PE / Size       0 / 0   
  Free  PE / Size       3836 / 14.98 GiB
  VG UUID               p69GZ4-VGNi-IOaO-FGZp-csIy-713y-mwJyjg

扩展VG:

    vgextend  VolumeGroupName  PhysicalDevicePath [PhysicalDevicePath...]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# pvs
  PV         VG   Fmt  Attr PSize PFree
  /dev/sdc1  vg0  lvm2 a--  2.00g 2.00g
  /dev/sdc2  vg0  lvm2 a--  3.00g 3.00g
  /dev/sdc3  vg0  lvm2 a--  4.00g 4.00g
  /dev/sdc5  vg0  lvm2 a--  6.00g 6.00g
# pvcreate /dev/sdc6
  Physical volume "/dev/sdc6" successfully created
# pvs
  PV         VG   Fmt  Attr PSize PFree
  /dev/sdc1  vg0  lvm2 a--  2.00g 2.00g
  /dev/sdc2  vg0  lvm2 a--  3.00g 3.00g
  /dev/sdc3  vg0  lvm2 a--  4.00g 4.00g
  /dev/sdc5  vg0  lvm2 a--  6.00g 6.00g
  /dev/sdc6  vg0  lvm2 a--  2.00g 2.00g
# vgs
  VG   #PV #LV #SN Attr   VSize  VFree 
  vg0    4   0   0 wz--n- 14.98g 14.98g
# vgextend vg0 /dev/sdc6
  Volume group "vg0" successfully extended
# vgs
  VG   #PV #LV #SN Attr   VSize  VFree 
  vg0    5   0   0 wz--n- 16.98g 16.98g

缩减VG:

    # 注意在做缩减时,如果pv中有数据,必须先执行pvmove将数据移走后移除,此步骤不可少。此处为演示环境,所以没有数据。

    vgreduce  VolumeGroupName  PhysicalDevicePath [PhysicalDevicePath...]

1
2
3
4
5
6
7
8
# vgs
  VG   #PV #LV #SN Attr   VSize  VFree 
  vg0    5   0   0 wz--n- 16.98g 16.98g
# vgreduce vg0 /dev/sdc6 
  Removed "/dev/sdc6" from volume group "vg0"
# vgs
  VG   #PV #LV #SN Attr   VSize  VFree 
  vg0    4   0   0 wz--n- 14.98g 14.98g

删除VG:

    vgremove [VolumeGroupName...]

1
2
3
4
5
6
# vgs
  VG   #PV #LV #SN Attr   VSize  VFree 
  vg0    4   0   0 wz--n- 14.98g 14.98g
# vgremove vg0 
  Volume group "vg0" successfully removed
# vgs

4、LV管理工具

    lv在缩减时必须注意每一个步骤不能出错,凡是有关数据的操作一定要100%确认后在执行。

创建lv:

    # 注意:lv是基于vg的,而vg是基于pv的所以此处在创建lv时首先需要查看vg大小能不能容下你要创建的lv,不能则需要扩展。

    lvcreate -L #[mMgGtT] -n NAME VolumeGroup

        -L:指定lv大小 

        -n:指定lv名字

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
# vgs
  VG   #PV #LV #SN Attr   VSize  VFree 
  vg0    4   0   0 wz--n- 14.98g 14.98g
# lvcreate -L 10G -n lv0 vg0
WARNING: xfs signature detected on /dev/vg0/lv0 at offset 0. Wipe it? [y/n]: y
  Wiping xfs signature on /dev/vg0/lv0.
  Logical volume "lv0" created.
# lvs
  LV   VG   Attr       LSize  Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
  lv0  vg0  -wi-a----- 10.00g                                                    
# lvdisplay 
  --- Logical volume ---
  LV Path                /dev/vg0/lv0
  LV Name                lv0
  VG Name                vg0
  LV UUID                FJ1TAj-oauO-oaol-k6yg-V5jE-BBF3-XsZeQs
  LV Write Access        read/write
  LV Creation host, time localhost.localdomain, 2016-03-17 21:08:26 +0800
  LV Status              available
  # open                 0
  LV Size                10.00 GiB
  Current LE             2560
  Segments               3
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     8192
  Block device           253:0

删除lv:

    # 注意:移除lv时也要先将其中数据移除

    lvremove /dev/VG_NAME/LV_NAME

1
2
3
4
# lvremove /dev/vg0/lv0 
Do you really want to remove active logical volume lv0? [y/n]: y
  Logical volume "lv0" successfully removed
# lvs

扩展lv:

    # lv在扩展时可以动态扩展,所以不需要卸载文件系统

    # 此处需要先建立文件系统并挂载

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
# lvs
  LV   VG   Attr       LSize  Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
  lv0  vg0  -wi-a----- 10.00g                                                    
 
# mkfs.ext4 /dev/vg0/lv0 
mke2fs 1.42.9 (28-Dec-2013)
Filesystem label=
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
Stride=0 blocks, Stripe width=0 blocks
655360 inodes, 2621440 blocks
131072 blocks (5.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=2151677952
80 block groups
32768 blocks per group, 32768 fragments per group
8192 inodes per group
Superblock backups stored on blocks: 
32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632
Allocating group tables: done                            
Writing inode tables: done                            
Creating journal (32768 blocks): done
Writing superblocks and filesystem accounting information: done 
 
# mount /dev/vg0/lv0 /backup/
 
# df -hT
Filesystem          Type      Size  Used Avail Use% Mounted on
/dev/sda2           xfs        40G  180M   40G   1% /
devtmpfs            devtmpfs  475M     0  475M   0% /dev
tmpfs               tmpfs     489M     0  489M   0% /dev/shm
tmpfs               tmpfs     489M  6.9M  483M   2% /run
tmpfs               tmpfs     489M     0  489M   0% /sys/fs/cgroup
/dev/sda3           xfs        20G  2.6G   18G  13% /usr
/dev/md127          ext4      9.8G   37M  9.2G   1% /raid
/dev/sda1           xfs       497M  138M  359M  28% /boot
tmpfs               tmpfs      98M     0   98M   0% /run/user/0
/dev/mapper/vg0-lv0 ext4      9.8G   37M  9.2G   1% /backup

a、扩展lv

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
# df -hT
Filesystem          Type      Size  Used Avail Use% Mounted on
/dev/sda2           xfs        40G  180M   40G   1% /
devtmpfs            devtmpfs  475M     0  475M   0% /dev
tmpfs               tmpfs     489M     0  489M   0% /dev/shm
tmpfs               tmpfs     489M  6.9M  483M   2% /run
tmpfs               tmpfs     489M     0  489M   0% /sys/fs/cgroup
/dev/sda3           xfs        20G  2.6G   18G  13% /usr
/dev/md127          ext4      9.8G   37M  9.2G   1% /raid
/dev/sda1           xfs       497M  138M  359M  28% /boot
tmpfs               tmpfs      98M     0   98M   0% /run/user/0
/dev/mapper/vg0-lv0 ext4      9.8G   37M  9.2G   1% /backup
# lvextend -L 11G /dev/vg0/lv0 
# df -hT
Filesystem          Type      Size  Used Avail Use% Mounted on
/dev/sda2           xfs        40G  180M   40G   1% /
devtmpfs            devtmpfs  475M     0  475M   0% /dev
tmpfs               tmpfs     489M     0  489M   0% /dev/shm
tmpfs               tmpfs     489M  6.9M  483M   2% /run
tmpfs               tmpfs     489M     0  489M   0% /sys/fs/cgroup
/dev/sda3           xfs        20G  2.6G   18G  13% /usr
/dev/md127          ext4      9.8G   37M  9.2G   1% /raid
/dev/sda1           xfs       497M  138M  359M  28% /boot
tmpfs               tmpfs      98M     0   98M   0% /run/user/0
/dev/mapper/vg0-lv0 ext4      9.8G   37M  9.2G   1% /backup

此时查看并未扩展成功,因为lvm逻辑上扩展了,需要扩展文件系统

b、扩展文件系统

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# resize2fs /dev/vg0/lv0 
resize2fs 1.42.9 (28-Dec-2013)
Filesystem at /dev/vg0/lv0 is mounted on /backup; on-line resizing required
old_desc_blocks = 2, new_desc_blocks = 2
The filesystem on /dev/vg0/lv0 is now 2883584 blocks long.
# df -hT
Filesystem          Type      Size  Used Avail Use% Mounted on
/dev/sda2           xfs        40G  180M   40G   1% /
devtmpfs            devtmpfs  475M     0  475M   0% /dev
tmpfs               tmpfs     489M     0  489M   0% /dev/shm
tmpfs               tmpfs     489M  6.9M  483M   2% /run
tmpfs               tmpfs     489M     0  489M   0% /sys/fs/cgroup
/dev/sda3           xfs        20G  2.6G   18G  13% /usr
/dev/md127          ext4      9.8G   37M  9.2G   1% /raid
/dev/sda1           xfs       497M  138M  359M  28% /boot
tmpfs               tmpfs      98M     0   98M   0% /run/user/0
/dev/mapper/vg0-lv0 ext4       11G   41M   11G   1% /backup

再次查看,成功扩展到11G !

缩减lv:

    # 缩减lv时必须卸载兵器需要先缩减文件系统,然后在缩减lvm,另外缩减时必须先对系统进行检查,查看是否能够缩减且缩减后的容量能容下所存在的数据。

a、卸载

查看挂载点文件及其内容

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# df -hT
Filesystem          Type      Size  Used Avail Use% Mounted on
/dev/sda2           xfs        40G  180M   40G   1% /
devtmpfs            devtmpfs  475M     0  475M   0% /dev
tmpfs               tmpfs     489M     0  489M   0% /dev/shm
tmpfs               tmpfs     489M  6.9M  483M   2% /run
tmpfs               tmpfs     489M     0  489M   0% /sys/fs/cgroup
/dev/sda3           xfs        20G  2.6G   18G  13% /usr
/dev/md127          ext4      9.8G   37M  9.2G   1% /raid
/dev/sda1           xfs       497M  138M  359M  28% /boot
tmpfs               tmpfs      98M     0   98M   0% /run/user/0
/dev/mapper/vg0-lv0 ext4       11G   41M   11G   1% /backup
 
# ls /backup/
issue  lost+found
 
# cat issue 
\S
Kernel \r on an \m
Mage Education Learning Services
http://www.magedu.com
# test lvreduce

卸载

1
2
3
4
5
6
7
8
9
10
11
12
# umount /backup/
# df -hT
Filesystem     Type      Size  Used Avail Use% Mounted on
/dev/sda2      xfs        40G  180M   40G   1% /
devtmpfs       devtmpfs  475M     0  475M   0% /dev
tmpfs          tmpfs     489M     0  489M   0% /dev/shm
tmpfs          tmpfs     489M  6.9M  483M   2% /run
tmpfs          tmpfs     489M     0  489M   0% /sys/fs/cgroup
/dev/sda3      xfs        20G  2.6G   18G  13% /usr
/dev/md127     ext4      9.8G   37M  9.2G   1% /raid
/dev/sda1      xfs       497M  138M  359M  28% /boot
tmpfs          tmpfs      98M     0   98M   0% /run/user/0

b、检查设备

1
2
3
4
5
6
7
8
# e2fsck -f /dev/vg0/lv0 
e2fsck 1.42.9 (28-Dec-2013)
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/vg0/lv0: 12/720896 files (0.0% non-contiguous), 88277/2883584 blocks

c、缩减文件系统大小

1
2
3
4
# resize2fs /dev/vg0/lv0 5G
resize2fs 1.42.9 (28-Dec-2013)
Resizing the filesystem on /dev/vg0/lv0 to 1310720 (4k) blocks.
The filesystem on /dev/vg0/lv0 is now 1310720 blocks long.

d、缩减lvm大小

1
2
3
4
5
6
# lvreduce -L 5G /dev/vg0/lv0 
  WARNING: Reducing active logical volume to 5.00 GiB
  THIS MAY DESTROY YOUR DATA (filesystem etc.)
Do you really want to reduce lv0? [y/n]: y
  Size of logical volume vg0/lv0 changed from 11.00 GiB (2816 extents) to 5.00 GiB (1280 extents).
  Logical volume lv0 successfully resized.

e、挂载并查看数据

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# mount /dev/vg0/lv0 /backup/
[root@localhost ~]# df -hT
Filesystem          Type      Size  Used Avail Use% Mounted on
/dev/sda2           xfs        40G  180M   40G   1% /
devtmpfs            devtmpfs  475M     0  475M   0% /dev
tmpfs               tmpfs     489M     0  489M   0% /dev/shm
tmpfs               tmpfs     489M  6.9M  483M   2% /run
tmpfs               tmpfs     489M     0  489M   0% /sys/fs/cgroup
/dev/sda3           xfs        20G  2.6G   18G  13% /usr
/dev/md127          ext4      9.8G   37M  9.2G   1% /raid
/dev/sda1           xfs       497M  138M  359M  28% /boot
tmpfs               tmpfs      98M     0   98M   0% /run/user/0
/dev/mapper/vg0-lv0 ext4      4.8G   33M  4.5G   1% /backup
# ls /backup/
issue  lost+found
# cat /backup/issue 
\S
Kernel \r on an \m
Mage Education Learning Services
http://www.magedu.com
# test lvreduce

缩减完毕,但是还是在这提醒一下各位,缩减是非常危险的操作,一定要确保万无一失的情况下进行,数据是无价的!!!

快照(snapshot):

    # 快照是lvm的一个特点,他可以快速的备份某一时刻的状态,并将其保存主要是用作在线备份

    # 注意两点:

      1)快照其实也是一个逻辑卷  

      2)快照只能对逻辑卷LVM进行备份,并且只能对同一个卷组的逻辑卷进行备

      3)快照卷复制的只是一个metadata(元数据)

    # 快照卷的核心技术

        写时复制(copy-on-write,COW):因为快照卷复制的是元数据,所以指向的data block与源

数据的相同,当有写操作对原有数据进行操作时,此时不会先写到元数据中,会把要写的数据复制到快照卷中一份,然后再对源数据进行更改,这就是写时复制。

Linux磁盘管理之LVM2 逻辑卷管理工具

命令:

    快照卷的大小可以根据公司的数据量所决定,比如两小时内复制完毕,取一下平常两小时所写的磁盘空间。

    lvcreate -L #[mMgGtT] -p r -s -n snapshot_lv_name original_lv_name

        -p r:指定快照卷为只读

        -s:创建快照卷

        -n:指定快照卷名字

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
# lvcreate -L 2G -p r -s -n snap_lv1 /dev/vg0/lv0
  Logical volume "snap_lv1" created.
 
# mount /dev/vg0/snap_lv1 /bak/
mount/dev/mapper/vg0-snap_lv1 is write-protected, mounting read-only
 
# df -hT
Filesystem               Type      Size  Used Avail Use% Mounted on
/dev/sda2                xfs        40G  180M   40G   1% /
devtmpfs                 devtmpfs  475M     0  475M   0% /dev
tmpfs                    tmpfs     489M     0  489M   0% /dev/shm
tmpfs                    tmpfs     489M  6.9M  483M   2% /run
tmpfs                    tmpfs     489M     0  489M   0% /sys/fs/cgroup
/dev/sda3                xfs        20G  2.6G   18G  13% /usr
/dev/md127               ext4      9.8G   37M  9.2G   1% /raid
/dev/sda1                xfs       497M  138M  359M  28% /boot
tmpfs                    tmpfs      98M     0   98M   0% /run/user/0
/dev/mapper/vg0-lv0      ext4      4.8G   33M  4.5G   1% /backup
/dev/mapper/vg0-snap_lv1 ext4      4.8G   33M  4.5G   1% /bak
 
# ls /backup/
issue  lost+found
 
# ls /bak
issue  lost+found
 
# diff /backup/issue /bak/issue 
 
# echo "test snap">>/backup/issue
 
# diff /backup/issue /bak/issue 
8d7
test snap

此处可以使用diff命令发现快照卷中的数据并未改变


好,对于lvm的管理就到这里了,最后在啰嗦一遍,所有对数据的操作都必须确保无误,可以请同事帮忙来看一下,以免造成不可挽回的错误。










本文转自 赵大鑫 51CTO博客,原文链接:http://blog.51cto.com/xinzong/1752345,如需转载请自行联系原作者