当前位置: 移动技术网 > 科技>操作系统>Linux > Linux - 通过LVM对磁盘进行动态扩容

Linux - 通过LVM对磁盘进行动态扩容

2019年03月29日  | 移动技术网科技  | 我要评论
Linux系统中如何挂载磁盘? 如何支持磁盘空间的动态扩容? LVM技术是做什么的? 本篇文章手把手教你用两种方式挂载磁盘, 欢迎交流^_^ ...

1 lvm是什么

1.1 概念解释

lvm(logical volume manager), 逻辑卷管理, 是一种将一至多个硬盘的分区在逻辑上进行组合, 当成一个大硬盘来使用.

当硬盘空间不足时, 可以动态地添加其它硬盘的分区到已有的卷组中 —— 磁盘空间的动态管理.

1.2 为什么用lvm

lvm通常用于装备大量磁盘的系统, 比如服务器中的磁盘阵列.

但lvm同样适用于仅有一、两块硬盘的小系统.

1.2.1 不使用lvm时的扩容思路

传统的文件系统是基于分区的, 一个文件系统对应一个分区, 这种方式比较直观, 但不易改变:

(1) 不同的分区相互独立, 单独的文件不能跨分区存储, 容易出现硬盘的利用率不均衡;

(2) 当一个文件系统/分区装满时, 是不能对其进行扩容的, 只能采用重新分区/建立文件系统, 重新分区会丢失数据, 就要:

① 做数据的迁移和备份;
② 或者把分区中的数据移到另一个更大的分区中;
③ 或者采用符号连接的方式使用其它分区的空间 —— 都非常麻烦;

(3) 如果要把硬盘上的多个分区合并在一起使用, 只能采用重新分区的方式, —— 需要做好数据的备份与恢复.

1.2.2 使用lvm时的扩容思路

使用lvm时技术时, 情况有所不同:

(1) 硬盘的多个分区由lvm统一管理为卷组, 可以很轻松地加入或移走某个分区 —— 也就是扩大或减小卷组的可用容量, 充分利用硬盘空间;

(2) 文件系统建立在逻辑卷上, 而逻辑卷可以根据需要改变大小(在卷组容量范围内)以满足要求;

(3) 文件系统建立在lvm上, 可以跨分区存储访问, 更加方便;

强烈建议对拥有多个磁盘的系统, 使用lvm管理磁盘.

1.3 名词解释

pv(physical volume): 物理卷, 处于lvm最底层, 可以是物理硬盘或者分区;

pp(physical extend): 物理区域, pv中可以用于分配的最小存储单元, 可以在创建pv的时候指定, 如1m, 2m, 4m, 8m…..组成同一vg中所有pv的pe大小应该相同;

vg(volume group): 卷组, 建立在pv之上, 可以含有一个到多个pv;

lv(logical volume): 逻辑卷, 建立在vg之上, 相当于原来分区的概念, 不过大小可以动态改变.

2 普通的挂载磁盘方法

2.1 创建分区的主要操作

(1) 查看分区情况 - fdisk -l

[root@localhost ~]# fdisk -l

disk /dev/sda: 299.0 gb, 298999349248 bytes         # 磁盘/dev/sda
255 heads, 63 sectors/track, 36351 cylinders
units = cylinders of 16065 * 512 = 8225280 bytes
sector size (logical/physical): 512 bytes / 512 bytes
i/o size (minimum/optimal): 512 bytes / 512 bytes
disk identifier: 0x4d69fe0e

   device boot      start         end      blocks   id  system
/dev/sda1   *           1          26      204800   83  linux       # 分为2个区, sda1
partition 1 does not end on cylinder boundary.
/dev/sda2              26       36352   291785728   8e  linux lvm   # sda2

# 磁盘/dev/sdb没有分区
disk /dev/sdb: 4000.0 gb, 3999999721472 bytes
255 heads, 63 sectors/track, 486305 cylinders
units = cylinders of 16065 * 512 = 8225280 bytes
sector size (logical/physical): 512 bytes / 512 bytes
i/o size (minimum/optimal): 512 bytes / 512 bytes
disk identifier: 0x00000000

......

(2) 查看已有磁盘 - lsblk

[root@localhost ~]# lsblk 
name                       maj:min rm   size ro type mountpoint
sda                          8:0    0 278.5g  0 disk 
├─sda1                       8:1    0   200m  0 part /boot
└─sda2                       8:2    0 278.3g  0 part 
  └─volgroup-logvol (dm-0) 253:0    0   1.9t  0 lvm  /      # lvm类型的分区
sdb                          8:32   0   3.7t  0 disk        # 还没有分区的新磁盘

(3) 对新磁盘进行分区 - fdisk /dev/sdb

[root@localhost ~]# fdisk /dev/sdb 
device contains neither a valid dos partition table, nor sun, sgi or osf disklabel
building a new dos disklabel with disk identifier 0xf91f8c4c.
changes will remain in memory only, until you decide to write them.
after that, of course, the previous content won't be recoverable.

warning: invalid flag 0x0000 of partition table 4 will be corrected by w(rite)

warning: the size of this disk is 4.0 tb (4000225165312 bytes).
dos partition table format can not be used on drives for volumes
larger than (2199023255040 bytes) for 512-byte sectors. use parted(1) and guid 
partition table format (gpt).


warning: dos-compatible mode is deprecated. it's strongly recommended to
         switch off the mode (command 'c') and change display units to
         sectors (command 'u').

command (m for help): n             # n 表示新建分区
command action
   e   extended
   p   primary partition (1-4)
p                                   # p 表示分区类型为主分区, 主分区只有1-4种选择
partition number (1-4): 1           # 主分区的编号
first cylinder (1-486333, default 1):   # 开始扇区号, 直接回车, 使用默认值1
using default value 1

# 结束扇区号, 使用默认值 --- 这里只加载了新磁盘的一半(2t), 所以还需要再次创建分区/dev/sdb2使用剩下的一半.
last cylinder, +cylinders or +size{k,m,g} (1-267349, default 267349):   
using default value 267349

command (m for help):  w            #  将上述设置写入分区表并退出
the partition table has been altered!

calling ioctl() to re-read partition table.
syncing disks.

(4) 再次查看分区情况 - fdisk -l

多出来一个/dev/sdb1的区, 这个1就是之前主分区之后指定的分区编号.

[root@localhost ~]# fdisk -l 

disk /dev/sda: 299.0 gb, 298999349248 bytes
255 heads, 63 sectors/track, 36351 cylinders
units = cylinders of 16065 * 512 = 8225280 bytes
sector size (logical/physical): 512 bytes / 512 bytes
i/o size (minimum/optimal): 512 bytes / 512 bytes
disk identifier: 0x4d69fe0e

   device boot      start         end      blocks   id  system
/dev/sda1   *           1          26      204800   83  linux
partition 1 does not end on cylinder boundary.
/dev/sda2              26       36352   291785728   8e  linux lvm

# /dev/sdb磁盘: 
disk /dev/sdb: 4000.0 gb, 3999999721472 bytes
255 heads, 63 sectors/track, 486305 cylinders
units = cylinders of 16065 * 512 = 8225280 bytes
sector size (logical/physical): 512 bytes / 512 bytes
i/o size (minimum/optimal): 512 bytes / 512 bytes
disk identifier: 0x8f3043b5

# 多出来的分区/dev/sdb1
   device boot      start         end      blocks   id  system
/dev/sdb1               1      267349  2147480811   83  linux

......

(5) 查看当前分区表中的分区信息 - cat /proc/partitions

[root@localhost ~]# cat /proc/partitions 
major minor  #blocks  name

   8        0   291991552  sda
   8        1      204800  sda1
   8        2   291785728  sda2
   8       32  3906249728  sdb      # 添加的新磁盘
   8       33  2147480811  sdb1     # 创建的新分区
 253        0  2046660608  dm-0

如果创建完之后,cat /proc/partitions 查看不到对应的分区, 使用 parprobe 刷新命令即可:

[root@localhost ~]# partprobe /dev/sdc

2.2 格式化新分区

(1) 格式化新分区 - mkfs -t

这里建议将新分区格式化为ext4文件类型, 还有ext2, ext3等文件类型, 区别请参考博客 .

[root@localhost ~]# mkfs -t ext4 /dev/sdb1
mke2fs 1.41.12 (17-may-2010)
filesystem label=
os type: linux
block size=4096 (log=2)
fragment size=4096 (log=2)
stride=0 blocks, stripe width=0 blocks
134217728 inodes, 536870202 blocks
26843510 blocks (5.00%) reserved for the super user
first data block=0
maximum filesystem blocks=4294967296
16384 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, 2654208, 
        4096000, 7962624, 11239424, 20480000, 23887872, 71663616, 78675968, 
        102400000, 214990848, 512000000

writing inode tables:  8874/16384

(2) 等待一小会后, 将出现下述提示, 说明格式化完成:

writing inode tables: done                            
creating journal (32768 blocks): done
writing superblocks and filesystem accounting information:  done

this filesystem will be automatically checked every 26 mounts or
180 days, whichever comes first.  use tune2fs -c or -i to override.

2.3 挂载新分区

(1) 创建目录, 并将 /dev/sdb1挂在到该目录下:

[root@localhost /]# mkdir data && cd /data
[root@localhost data]# mount /dev/sdc1 /data1

(2) 查看挂载是否成功:

[root@localhost data]# df -l
filesystem                   1k-blocks       used  available use% mounted on
/dev/mapper/volgroup-logvol  286901696   18601728  253726196   7% /
tmpfs                         66020980          0   66020980   0% /dev/shm
/dev/sda1                       495844      33476     436768   8% /boot

# 挂载成功: 
/dev/sdb1                   2113784984     202776 2006208168   1% /data

2.4 设置开机自动挂载

编辑文件 /etc/fstab:

[root@localhost data]# vim /etc/fstab

# 文件内容如下: 
# /etc/fstab
# created by anaconda on wed sep 12 10:41:40 2018
#
# accessible filesystems, by reference, are maintained under '/dev/disk'
# see man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
/dev/mapper/volgroup-logvol  /                     ext4    defaults        1 1
/dev/sdb1                    /data                 ext4    defaults        1 1
uuid=22b1d425-d050-43c3-a735-06d48bbb9051 /boot    ext4    defaults        1 2 
tmpfs                        /dev/shm              tmpfs   defaults        0 0
devpts                       /dev/pts              devpts  gid=5,mode=620  0 0
sysfs                        /sys                  sysfs   defaults        0 0
proc                         /proc                 proc    defaults        0 0

3 lvm方式挂载磁盘 - 推荐

3.1 查看磁盘容量信息

[root@localhost ~]# df -h
filesystem               size  used  avail  use%  mounted on
/dev/mapper/vg-logvol    1.9t  1.8t    61g   97%  /          # lvm卷组-逻辑卷
tmpfs                     63g     0    63g    0%  /dev/shm
/dev/sda1                485m   40m   421m    9%  /boot

3.2 查看磁盘扇区信息

[root@localhost ~]# fdisk -l

disk /dev/sda: 299.0 gb, 298999349248 bytes         # 磁盘/dev/sda
255 heads, 63 sectors/track, 36351 cylinders
units = cylinders of 16065 * 512 = 8225280 bytes
sector size (logical/physical): 512 bytes / 512 bytes
i/o size (minimum/optimal): 512 bytes / 512 bytes
disk identifier: 0x4d69fe0e

   device boot      start         end      blocks   id  system
/dev/sda1   *           1          26      204800   83  linux       # 分为2个区, sda1
partition 1 does not end on cylinder boundary.
/dev/sda2              26       36352   291785728   8e  linux lvm   # lvm类型的sda2

# 新添加的磁盘/dev/sdb, 没有分区
disk /dev/sdb: 4000.0 gb, 3999999721472 bytes
255 heads, 63 sectors/track, 486305 cylinders
units = cylinders of 16065 * 512 = 8225280 bytes
sector size (logical/physical): 512 bytes / 512 bytes
i/o size (minimum/optimal): 512 bytes / 512 bytes
disk identifier: 0x00000000

# lvm格式的卷组信息: 
disk /dev/mapper/volgroup-logvol: 4294 mb, 4294967296 bytes
255 heads, 63 sectors/track, 522 cylinders
units = cylinders of 16065 * 512 = 8225280 bytes
sector size (logical/physical): 512 bytes / 512 bytes
i/o size (minimum/optimal): 512 bytes / 512 bytes
disk identifier: 0x00000000

3.3 创建分区

[root@localhost ~]# fdisk /dev/sdb
device contains neither a valid dos partition table, nor sun, sgi or osf disklabel
building a new dos disklabel with disk identifier 0x5b3d66ba.
changes will remain in memory only, until you decide to write them.
after that, of course, the previous content won't be recoverable.

warning: invalid flag 0x0000 of partition table 4 will be corrected by w(rite)

warning: the size of this disk is 4.0 tb (3999999721472 bytes).
dos partition table format can not be used on drives for volumes
larger than (2199023255040 bytes) for 512-byte sectors. use parted(1) and guid 
partition table format (gpt).


warning: dos-compatible mode is deprecated. it's strongly recommended to
         switch off the mode (command 'c') and change display units to
         sectors (command 'u').

command (m for help): n         # 添加分区
command action
   e   extended
   p   primary partition (1-4)
p                               # 添加主分区
partition number (1-4): 1       # 1号主分区, 即/dev/sdb1
first cylinder (1-486305, default 1):               
using default value 1
last cylinder, +cylinders or +size{k,m,g} (1-267349, default 267349): 486305
value out of range.
last cylinder, +cylinders or +size{k,m,g} (1-267349, default 267349): 
using default value 267349

command (m for help): n         # 继续添加分区
command action
   e   extended
   p   primary partition (1-4)
p
partition number (1-4): 2       # 2号主分区, 即/dev/sdc2
first cylinder (267350-486305, default 267350): 
using default value 267350
last cylinder, +cylinders or +size{k,m,g} (267350-486305, default 486305): 
using default value 486305

command (m for help): p         # 打印分区信息: 

disk /dev/sdb: 4000.0 gb, 3999999721472 bytes
255 heads, 63 sectors/track, 486305 cylinders
units = cylinders of 16065 * 512 = 8225280 bytes
sector size (logical/physical): 512 bytes / 512 bytes
i/o size (minimum/optimal): 512 bytes / 512 bytes
disk identifier: 0x5b3d66ba

   device boot      start         end      blocks   id  system
/dev/sdb1               1      267349  2147480811   83  linux
/dev/sdb2          267350      486305  1758764070   83  linux

command (m for help): t         # 转换类型
partition number (1-4): 1
partition number (1-4): 1           # 修改/dev/sdb1为linux lvm类型: 
hex code (type l to list codes): l  # 查看可用类型: 

 0  empty           24  nec dos         81  minix / old lin bf  solaris        
 1  fat12           39  plan 9          82  linux swap / so c1  drdos/sec (fat-
 2  xenix root      3c  partitionmagic  83  linux           c4  drdos/sec (fat-
 3  xenix usr       40  venix 80286     84  os/2 hidden c:  c6  drdos/sec (fat-
 4  fat16 <32m      41  ppc prep boot   85  linux extended  c7  syrinx         
 5  extended        42  sfs             86  ntfs volume set da  non-fs data    
 6  fat16           4d  qnx4.x          87  ntfs volume set db  cp/m / ctos / .
 7  hpfs/ntfs       4e  qnx4.x 2nd part 88  linux plaintext de  dell utility   
 8  aix             4f  qnx4.x 3rd part 8e  linux lvm       df  bootit         
 9  aix bootable    50  ontrack dm      93  amoeba          e1  dos access     
 a  os/2 boot manag 51  ontrack dm6 aux 94  amoeba bbt      e3  dos r/o        
 b  w95 fat32       52  cp/m            9f  bsd/os          e4  speedstor      
 c  w95 fat32 (lba) 53  ontrack dm6 aux a0  ibm thinkpad hi eb  beos fs        
 e  w95 fat16 (lba) 54  ontrackdm6      a5  freebsd         ee  gpt            
 f  w95 ext'd (lba) 55  ez-drive        a6  openbsd         ef  efi (fat-12/16/
10  opus            56  golden bow      a7  nextstep        f0  linux/pa-risc b
11  hidden fat12    5c  priam edisk     a8  darwin ufs      f1  speedstor      
12  compaq diagnost 61  speedstor       a9  netbsd          f4  speedstor      
14  hidden fat16 <3 63  gnu hurd or sys ab  darwin boot     f2  dos secondary  
16  hidden fat16    64  novell netware  af  hfs / hfs+      fb  vmware vmfs    
17  hidden hpfs/ntf 65  novell netware  b7  bsdi fs         fc  vmware vmkcore 
18  ast smartsleep  70  disksecure mult b8  bsdi swap       fd  linux raid auto
1b  hidden w95 fat3 75  pc/ix           bb  boot wizard hid fe  lanstep        
1c  hidden w95 fat3 80  old minix       be  solaris boot    ff  bbt            
1e  hidden w95 fat1
hex code (type l to list codes): 8e     # 修改为8e, 即linux lvm类型
changed system type of partition 1 to 8e (linux lvm)

command (m for help): t
partition number (1-4): 2               # 修改/dev/sdc2为linux lvm类型
hex code (type l to list codes): 8e
changed system type of partition 2 to 8e (linux lvm)

command (m for help): p                 # 再次查看相关信息: 

disk /dev/sdc: 4000.0 gb, 3999999721472 bytes
255 heads, 63 sectors/track, 486305 cylinders
units = cylinders of 16065 * 512 = 8225280 bytes
sector size (logical/physical): 512 bytes / 512 bytes
i/o size (minimum/optimal): 512 bytes / 512 bytes
disk identifier: 0x5b3d66ba

   device boot      start         end      blocks   id  system
/dev/sdb1               1      267349  2147480811   8e  linux lvm   # id已改变
/dev/sdb2          267350      486305  1758764070   8e  linux lvm

command (m for help): w                 # 保存并退出
the partition table has been altered!   # 修改成功

calling ioctl() to re-read partition table.
syncing disks.

3.4 创建物理卷

[root@localhost ~]# pvcreate /dev/sdb1
  physical volume "/dev/sdb1" successfully created
[root@localhost ~]# pvcreate /dev/sdb2
  physical volume "/dev/sdb2" successfully created

3.5 扩展卷组

# 查看已有卷组, 发现该卷组就是需要扩容的卷组, 就不必再次创建卷组, 而是直接扩展卷组即可: 
[root@localhost ~]# vgs
  vg       #pv #lv #sn attr   vsize vfree
  volgroup   2   2   0 wz--n- 1.91t    0 

# 扩展卷组: 
[root@localhost ~]# vgextend volgroup /dev/sdb1
  volume group "volgroup" successfully extended
[root@localhost ~]# vgextend volgroup /dev/sdb2
  volume group "volgroup" successfully extended

说明: 如果出现下述无法挂载物理磁盘到卷组中的信息, 说明这块物理磁盘已经挂载了, 需要先卸载, 然后再执行创建分区+卷组的操作:

[root@localhost /]# vgextend volgroup /dev/sdb1 
  no physical volume label read from /dev/sdb1
  physical volume /dev/sdb1 not found
  can't open /dev/sdb1 exclusively.  mounted filesystem?
  unable to add physical volume '/dev/sdb1' to volume group 'volgroup'.

3.6 扩展逻辑卷

# 扩展逻辑卷, 即扩容: 
[root@localhost ~]# lvextend -l +100%free /dev/mapper/volgroup-logvol 
  extending logical volume lv_root to 5.54 tib
  logical volume lv_root successfully resized

# 上述命令是将所有的空闲空间都扩容到逻辑卷中, 也可指定扩容的大小: 
lvextend -l +100g /dev/mapper/volgroup-logvol 

3.7 查看磁盘卷组信息

[root@localhost ~]# lsblk 
name                        maj:min rm   size ro  type  mountpoint
sda                           8:0    0 278.5g  0  disk  
├─sda1                        8:1    0   500m  0  part  /boot
└─sda2                        8:2    0   278g  0  part  
  ├─volgroup-logvol (dm-0)  253:0    0   5.6t  0  lvm   /
sdb                           8:16   0   1.6t  0  disk  
└─sdb1                        8:17   0   1.6t  0  part  
  └─volgroup-logvol (dm-0)  253:0    0   5.6t  0  lvm   /
sdc                           8:32   0   3.7t  0  disk  
├─sdc1                        8:33   0     2t  0  part  
│ └─volgroup-logvol (dm-0)  253:0    0   5.6t  0  lvm   /
└─sdc2                        8:34   0   1.7t  0  part  
  └─volgroup-logvol (dm-0)  253:0    0   5.6t  0  lvm   /

3.8 调整文件系统的大小

# centos 7重新读取磁盘大小: 
[root@localhost ~]# xfs_growfs /dev/mapper/volgroup-logvol 
xfs_growfs: /dev/mapper/volgroup-logvol is not a mounted xfs filesystem

# centos 6.5重新读取磁盘大小: 
# ext4格式, resize2fs会遍历整个磁盘, 速度比较慢, 但是不影响读写数据, 可以令其在后台运行. 
[root@localhost ~]# resize2fs /dev/mapper/volgroup-logvol 
resize2fs 1.41.12 (17-may-2010)
filesystem at /dev/mapper/volgroup-logvol is mounted on /; on-line resizing required
old desc_blocks = 122, new_desc_blocks = 355
performing an on-line resize of /dev/mapper/volgroup-lv_root to 1487098880 (4k) blocks.

# 等了差不多20分钟, 出来了下面这货: 
 the filesystem on /dev/mapper/volgroup-logvol is now 1487098880 blocks long.
 
# 赶紧看下扩容成果吧: 
[root@localhost ~]#   df -h
filesystem                    size  used avail use%  mounted on
/dev/mapper/volgroup-logvol   5.5t  1.8t  3.5t  34%  /          # 扩容成功
tmpfs                          63g     0   63g   0%  /dev/shm
/dev/sda1                     485m   40m  421m   9%  /boot

3.9 附录 - 创建卷组

对应 [3.5] 节的扩展卷组, 如果卷组不存在, 则需要创建之. 下述volgroup是卷组名称.

vgcreate volgroup /dev/sdb1
# 创建逻辑卷, 名称为: mylv. (操作系统中将产生: /dev/volgroup/mylv目录)
# 将当前卷组中的100g空间分配到逻辑卷中
lvcreate -l 100g volgroup -n mylv
# 或将当前卷组中的所有空闲空间全都分配到逻辑卷中:  
lvcreate -l +100%free volgroup -n mylv

# 格式化逻辑卷组: 
mkfs -t ext4 /dev/volgroup/mylv

# 挂载卷组到指定目录下, 如果是挂载到根目录, 则无需向/etc/fstab文件中添加启动项. 
mount -t ext4 /dev/volgroup/mylv /data

参考资料

linux的lvm详解

linux 下挂载硬盘的方法

linux磁盘管理、新增磁盘、分区、挂载

版权声明

作者: ma_shoufeng(马瘦风)

出处: 博客园

您的支持是对博主的极大鼓励, 感谢您的阅读.

本文版权归博主所有, 欢迎转载, 但请保留此段声明, 并在文章页面明显位置给出原文链接, 否则博主保留追究相关人员法律责任的权利.

如您对本文有疑问或者有任何想说的,请点击进行留言回复,万千网友为您解惑!

相关文章:

验证码:
移动技术网