Skip to content

Vagrant 扩容及创建逻辑卷

vagrant 扩容方案解决你的虚拟机硬盘不足问题。


准备工作

用vagrant创建虚拟机时默认是动态分配硬盘,导致虚拟机的硬盘空间只有8G,随着安装的应用越来越多,硬盘容量已明显不足.

本文介绍两种给vagrant虚拟机扩容的方法:

  • 通过VBoxManage工具扩容

  • 通过vagrant插件vagrant-disksize扩容

通过VBoxManage工具扩容

在执行扩容操作前需要将虚拟机关闭.

cd ~/vagrant/mysqlMaster #虚拟机Vagrantfile所在的路径

vagrant halt

将vmbox格式转换为vdi格式

bash
cd ~/VirtualBox\ VMs/

[echoxu@echoxu-linux VirtualBox VMs]$ ls
lnmapZabbix  mysqlMaster  mysqlSlave

[echoxu@echoxu-linux VirtualBox VMs]$ cd mysqlMaster/

[echoxu@echoxu-linux mysqlMaster]$ ls
box-disk001.vmdk  Logs  mysqlMaster.vbox  mysqlMaster.vbox-prev

[echoxu@echoxu-linux mysqlMaster]$ VBoxManage clonehd "box-disk001.vmdk" "box-disk001.vdi" --format vdi
0%...10%...20%...30%...40%...50%...60%...70%...80%...90%...100%
Clone medium created in format 'vdi'. UUID: abedd9c5-ced0-4e79-85ae-43d5dbc729d4

进行扩容

bash
[echoxu@echoxu-linux mysqlMaster]$ VBoxManage modifyhd "box-disk001.vdi" --resize 10240
0%...10%...20%...30%...40%...50%...60%...70%...80%...90%...100%

卸载原来的控制器

存储控制器有IDE、SCSI、SATA三种,根据需要选择控制器类型,我选择的是SATA控制器.

VBoxManage storagectl mysqlMaster --name "SATA" --remove

卸载SCSI、IDE控制器可用如下命令:

VBoxManage storagectl mysqlMaster --name "IDE" --remove

VBoxManage storagectl mysqlMaster --name "SCSI" --remove

上述内容中的mysqlMaster为虚拟机的名称

添加新的控制器

重新添加新的控制器:

VBoxManage storagectl mysqlMaster --name SATA --add sata

添加控制器存储介质

VBoxManage storageattach mysqlMaster --storagectl "SATA" --port 0 --device 0 --type hdd --medium box-disk001.vdi

至此通过VBoxManage工具给vagrant进行扩容就完成了,可通过 “设置—存储–SATA控制器”中查看到硬盘容量(需先选择虚拟机)。 此时ssh登录虚拟机用df -lh查看分区还是8G,所以需要通过fdisk进行分区.

使用fdisk创建逻辑卷

下面是使用fdisk进行操作的详细过程:

  • 新建分区
bash
[echoxu@mysqlSlave ~]$ sudo fdisk /dev/sda
欢迎使用 fdisk (util-linux 2.23.2)。

更改将停留在内存中,直到您决定将更改写入磁盘。
使用写入命令前请三思。


命令(输入 m 获取帮助):p                     #下面显示的是原来的分区信息

磁盘 /dev/sda:16.1 GB, 16106127360 字节,31457280 个扇区
Units = 扇区 of 1 * 512 = 512 bytes
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节
磁盘标签类型:dos
磁盘标识符:0x000d3f90

   设备 Boot      Start         End      Blocks   Id  System
/dev/sda1   *        2048     2099199     1048576   83  Linux
/dev/sda2         2099200    20971519     9436160   8e  Linux LVM

命令(输入 m 获取帮助):n                       #c创建新分区
Partition type:
   p   primary (2 primary, 0 extended, 2 free)
   e   extended
Select (default p): p                        #创建主分区,只能分4个主分区,如果已经有3个主分区,剩下的建议选择扩展分区即按e
分区号 (3,4,默认 3):3                          #创建/dev/sda3,因为已有/dev/sda1和/dev/sda2了
起始 扇区 (20971520-31457279,默认为 20971520):               #扇区开始,选择默认即可
将使用默认值 20971520
Last 扇区, +扇区 or +size{K,M,G} (20971520-31457279,默认为 31457279):+4G     #创建的分区大小
分区 3 已设置为 Linux 类型,大小设为 4 GiB

命令(输入 m 获取帮助):p                         #查看分区结果,显示已创建了/dev/sda3

磁盘 /dev/sda:16.1 GB, 16106127360 字节,31457280 个扇区
Units = 扇区 of 1 * 512 = 512 bytes
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节
磁盘标签类型:dos
磁盘标识符:0x000d3f90

   设备 Boot      Start         End      Blocks   Id  System
/dev/sda1   *        2048     2099199     1048576   83  Linux
/dev/sda2         2099200    20971519     9436160   8e  Linux LVM
/dev/sda3        20971520    29360127     4194304   83  Linux

命令(输入 m 获取帮助):t                                #更改分区类型
分区号 (1-3,默认 3):3                                   #选择将/dev/sda3更改类型为LVM
Hex 代码(输入 L 列出所有代码):8e                  #LVm类型代码
已将分区“Linux”的类型更改为“Linux LVM”

命令(输入 m 获取帮助):w          #将操作写入硬盘
The partition table has been altered!

Calling ioctl() to re-read partition table.

WARNING: Re-reading the partition table failed with error 16: 设备或资源忙.
The kernel still uses the old table. The new table will be used at
the next reboot or after you run partprobe(8) or kpartx(8)
正在同步磁盘。

TIP

通过fdisk执行操作时如果不按w是保存在内存中的,按q取消后分区还是和以前一样,如果按了w分区结果会保存.

  • 让Linux识别创建的新分区

发现刚创建的分区/dev/sda3在linux中并没有被识别出来,因为如下信息中没有显示/dev/sda3相关的信息

bash
[echoxu@mysqlSlave ~]$ ls /dev/sda*
/dev/sda  /dev/sda1  /dev/sda2
  
[echoxu@mysqlSlave ~]$ cat /proc/partitions
major minor  #blocks  name

   8        0   12582912 sda
   8        1    1048576 sda1
   8        2    9436160 sda2
  11        0    1048575 sr0
 253        0    8384512 dm-0
 253        1    1048576 dm-1

让centos识别分区有如下的方法:

1: centos5: 使用partprobe命令

2: centos6及其以后版本: 使用partx,kpartx命令

这里主要将centos6以后的操作方法:

kpartx -l /dev/sda

kpartx -af /dev/sda

partx -a /dev/sda

下面的操作是让linux识别新创建的分区/dev/sda3

bash
[echoxu@mysqlSlave ~]$ sudo kpartx -a /dev/sda        #操作1
device-mapper: reload ioctl on sda1  failed: Device or resource busy
create/reload failed on sda1
device-mapper: reload ioctl on sda2  failed: Device or resource busy
create/reload failed on sda2
device-mapper: reload ioctl on sda3  failed: Device or resource busy
create/reload failed on sda3
[echoxu@mysqlSlave ~]$ sudo partx -a /dev/sda         #操作2
partx: /dev/sda: error adding partitions 1-3

再查看分区结果,新创建的分区已经被linux识别了:

bash
[echoxu@mysqlSlave ~]$ sudo cat /proc/partitions
major minor  #blocks  name

   8        0   15728640 sda
   8        1    1048576 sda1
   8        2    9436160 sda2
   8        3    4194304 sda3
  11        0    1048575 sr0
 253        0    8384512 dm-0
 253        1    1048576 dm-1
[echoxu@mysqlSlave ~]$ sudo ls /dev/sda*
/dev/sda  /dev/sda1  /dev/sda2  /dev/sda3
  • 创建逻辑卷

sudo mkdir /data 创建挂载目录

bash
[echoxu@mysqlSlave ~]$ sudo pvcreate /dev/sda                              #操作1
  Device /dev/sda not found (or ignored by filtering).

[echoxu@mysqlSlave ~]$ sudo pvcreate /dev/sda3                           #操作2
  Physical volume "/dev/sda3" successfully created.

[echoxu@mysqlSlave ~]$ sudo vgcreate myvg /dev/sda3                   #创建Volume group "myvg"
  Volume group "myvg" successfully created

[echoxu@mysqlSlave ~]$ sudo lvcreate -L 3G -n mydata myvg                #创建 Logical volume "mydata"并分配3G空间
  Logical volume "mydata" created.


[echoxu@mysqlSlave ~]$ sudo lvs                        #查看上述的操作是否生效
  LV     VG     Attr       LSize  Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
  root   centos -wi-ao---- <8.00g
  swap   centos -wi-ao----  1.00g
  mydata myvg   -wi-a-----  3.00g

[echoxu@mysqlSlave ~]$ sudo mke2fs -t ext4 /dev/myvg/mydata                        #格式化逻辑卷为ext4文件格式
mke2fs 1.42.9 (28-Dec-2013)
文件系统标签=
OS type: Linux
块大小=4096 (log=2)
分块大小=4096 (log=2)
Stride=0 blocks, Stripe width=0 blocks
196608 inodes, 786432 blocks
39321 blocks (5.00%) reserved for the super user
第一个数据块=0
Maximum filesystem blocks=805306368
24 block groups
32768 blocks per group, 32768 fragments per group
8192 inodes per group
Superblock backups stored on blocks:
        32768, 98304, 163840, 229376, 294912

Allocating group tables: 完成
正在写入inode表: 完成
Creating journal (16384 blocks): 完成
Writing superblocks and filesystem accounting information: 完成

自此LVM逻辑卷已经创建完成.

  • 开机自动挂载新分区

sudo vim /etc/fstab

末尾添加

/dev/myvg/mydata /data ext4 defaults,noatime 0 0

TIP

/dev/myvg/mydata 为逻辑卷名,/data为挂载目录

bash
[echoxu@mysqlSlave ~]$ sudo mount -a                #挂载操作
[echoxu@mysqlSlave ~]$ sudo mount                    #查看挂载是否生效

查看到有这样的一行

/dev/mapper/myvg-mydata on /data type ext4 (rw,noatime,data=ordered)

[echoxu@mysqlSlave data]$ df -lh                           #已经挂载成功了
文件系统                 容量  已用  可用 已用% 挂载点
/dev/mapper/centos-root  8.0G  1.8G  6.3G   23% /
devtmpfs                 234M     0  234M    0% /dev
tmpfs                    245M     0  245M    0% /dev/shm
tmpfs                    245M  4.4M  240M    2% /run
tmpfs                    245M     0  245M    0% /sys/fs/cgroup
/dev/sda1               1014M  170M  845M   17% /boot
home_xujh_ShareFiles     156G  122G   34G   79% /home/xujh/ShareFiles
tmpfs                     49M     0   49M    0% /run/user/1000
tmpfs                     49M     0   49M    0% /run/user/0
/dev/mapper/myvg-mydata  2.9G  9.0M  2.8G    1% /data

通过vagrant插件进行扩容

安装插件

vagrant plugin install vagrant-disksize #可能需要墙出去

安装结果如下:

bash

Installing the 'vagrant-disksize' plugin. This can take a few minutes...
Fetching: vagrant-disksize-0.1.2.gem (100%)
Installed the plugin 'vagrant-disksize (0.1.2)'!

使用国内源进行安装插件

bash
vagrant plugin install --plugin-clean-sources --plugin-source https://gems.ruby-china.com/ 插件名

有两个地方特别需要注意:

--plugin-clean-sources这个参数容易被忽略,官方文档写的也比较模糊,必须在DEBUG模式下才能发现这个参数的作用,就是清理掉 Vagrant 默认使用的 Gems 仓库

--plugin-clean-sources和--plugin-source参数的顺序特别需要注意,必须--plugin-clean-sources在前,--plugin-source在后,才能保证先清理掉默认的 Vagrant 使用的 Gems 仓库,然后添加 RubyChina 镜像仓库。否则顺序反了的话就会把所有仓库全清掉,导致找不到插件仓库

可以使命别名简化每次输入:

bash
alias vagrant-plugin-install='vagrant plugin install --plugin-clean-sources --plugin-source'

下次只用输入: vagrant-plugin-install 插件名 即可安装插件了。

在Vagrantfile中配置插件信息

vim ~/vagrant/mysqlSlave/Vagrantfile

config.vm.box = "centos7.4C"后面添加

config.disksize.size = '15GB'

vagrant-disksize的github地址

vagrant plugin install慢

以下是解决思路:

  • 替换rubygems.orggems.ruby-china.com

  • 是否可以访问https://gems.hashicorp.com/

下面是替换ruby源的方法:

gem -v #查看gem版本

gem sources --add https://gems.ruby-china.com/ --remove https://rubygems.org/ #替换源

gem sources -l #查看源

然后再试试安装,如果不行就检查https://gems.hashicorp.com是否可以访问,还不可以的话只能科学上网了.

WARNING

此插件只能进行扩容不能进行磁盘容量降级,且只能给第一块硬盘扩容.另外对自己做的vbox扩容不了,只兼容官方的vbox.