当前位置:文档之家› 虚拟机不重启热添加磁盘扩容方法(修改版)

虚拟机不重启热添加磁盘扩容方法(修改版)

Linux虚拟机不重启热添加磁盘扩容方法
1、应用背景说明
很多Linux系统虚拟机在使用一段时间后,面临空间不够的问题,需要扩容磁盘空间,但是Linux系统虚拟机不像Windows 2008R2系统虚拟机那样,可以直接将虚拟机磁盘配置那增大磁盘的空间,然后进入到系统刷新磁盘控制器即可看到增加的磁盘空间,然后通过扩展分区即可将分区扩大使用。

另外,Linux系统物理机虽然也支持热插拔硬盘,但是物理机中一般很难发现新加的硬盘在哪一个控制器下哪一个通道的哪一个ID号,导致容易加,但是无法精准通过命令扫描掉,但是虚拟机Linux的磁盘的这些信息可以在硬件配置信息那里看到,从而节省了很多麻烦。

虽然Linux系统虚拟机也可直接在原有磁盘配置上增大空间,然后然系统总线重新扫描检测到增大的空间,但是无法直接扩展文件挂载目录,而且增大的磁盘空间虽然能分区但是写入不到系统内核的分区表,导致新建的这个分区无法格式化或者挂载。

综上,一般情况下,都是在linux系统虚拟机配置里直接增加一个新的磁盘,而不是扩大之前的磁盘空间。

注:Windows 2003系统不支持直接扩展分区;
Windows 2008R2及以上系统需要将C、D等分区放在不同的磁盘中,才能直接的扩容,不然只能紧邻剩余空间的分区才能扩容;
2、linux系统要求
系统硬盘最好做了LVM;
因为很多系统应用管理员所看到的是某些目录没有了空间,希望将这些目录所在的文件系统空间增大,以便继续存放文件和数据,而不是另外加一个空目录进来,让应用管理员将后面的数据存放在新的空目录下。

所以综上,系统有做LVM的话更能满足系统管理员的要求。

3、实验环境介绍
一台2个CPU、4G内存的Linux系统,一个50G的磁盘,系统版本CentOS 6.5。

分区如下:
因为系统是basic安装,从上图中可以看到系统有做LVM;
其中磁盘为sda,/boot分区500M,所占为sda1,剩余的磁盘一起做了一个PV,所占为sda2,属于VolGroup这个VG;
在这个VG下有2个LV,一个为lv_root,大小45G,挂载在 /下,另外个LV为lv_swap,大小2G,是交换分区。

4、检查系统的SCSI总线和磁盘信息
首先检查虚拟机磁盘的SCSI号,通过右键点击虚拟机,点击编辑,选择硬盘即可看到,如下:
然后进入到系统,查看SCSI总线信息,如下:
由上图知道这个系统有一个CD-ROM,这里可以看到CD-ROM单独占一个总线,总线号为2,通道Channel号为0,ID号为0,LUN号为0,综上CD-ROM的SCSI信息为 2 0 0 0 ;
其中这个系统只有一个磁盘,显示的是Direct-Access直连,总线号为0,通道Channel号为0,ID号为0,LUN号为0,综上这个SCSI(0:0)Hard disk1的磁盘SCSI信息为0 0 0 0;
5、增加磁盘
根据扩容需求来确定增加磁盘的大小,若需扩容50G,这里则可新增一个50G的硬盘。

右键点编辑虚拟机,增加磁盘。

如下图:
等待任务完成后即表示添加磁盘成功;
在添加磁盘的过程中需要特别注意的是选择SCSI号那里,因为检查原来已有磁盘Hard disk1为SCSI(0:0),这里新增的磁盘就最好选择SCSI(0:1),表示新增的磁盘和原来的磁盘在一个总线下,总线号为0,只是ID号不一样。

注:虚拟机最多有4个磁盘SCSI总线,因为一个SCSI总线最多可以接16个设备,且7号被当成的仲裁总线,所以一个总线可以接15个硬盘,一起最多可以接15*4=60个硬盘,磁盘总线编号分别为SCSI (0:0)——SCSI(0:15),SCSI(1:0)——SCSI(1:15),SCSI(2:0)——SCSI(2:15),SCSI(3:0)——SCSI(3:15),其中SCSI(X:7)不存在,默认是用为仲裁总线;
6、将新增磁盘SCSI信息添加到到系统内核SCSI总线
一般新增的磁盘后,只需要重启系统,然系统重启时扫描硬件信息即可发现新增磁盘,但为了不重启,可直接将之前收集到的磁盘SCSI 信息添加到系统内核SCSI总线,然系统自己扫描发现即可。

添加SCSI信息前如下:系统中只能看到一个磁盘sda
然后添加新增磁盘SCSI信息:
方法一:
命令echo "scsi add-single-device a b c d">/proc/scsi/scsi 其中a表示总线号,b表示通道号,c表示ID号,d表示LUN号,之前的SCSI(0:0)磁盘中第一个0对应的是总线号a,第二个0对应的是ID号c;
请注意,这里不是虚拟机SCSI(0:0)磁盘总线为0,系统的这个硬盘的总线就一定是0,只是对应这里的a,有可能SCSI(0:0)磁盘系统中对应的SCSI信息是 2 0 0 0 ,所以这里要注意;
因为新增的磁盘SCSI(0:1)和SCSI(0:0)磁盘在一个总线上,SCSI (0:0)磁盘的SCSI信息是0 0 0 0,那么磁盘SCSI(0:1)的SCSI 信息就可以推算出来为0 0 1 0;那么对应的a就是0,b就是0,c
就是1,d就是0;
图中新增的磁盘SCSI信息为 0 0 1 0,这个是根据之前的硬盘推算出来的,然后查看系统中就可以看到第二个硬盘了,如下:
其中sdb即为新增的磁盘;
方法2:
首先用命令
grep mpt /sys/class/scsi_host/host?/proc_name知道系统的磁盘总线,即知道host?的?是几,如下图:
可知系统有两个总线,若不清楚新加的磁盘位于哪个总线,可刷新所有总线来发现磁盘,如图总线是host2和host3,然后运行如下命令:echo "- - -" > /sys/class/scsi_host/host2/scan
echo "- - -" > /sys/class/scsi_host/host3/scan
注:若添加的是新总线下的磁盘,如SCSI(1:0)磁盘,虚拟机会增加一个总线和一个磁盘,因为增加了总线,系统会自己扫描发现磁盘,不需要用echo命令写SCSI信息即可自动发现新磁盘。

7、扩容
若需求是想将根分区或者根分区下面的目录扩容,因为根分区是一个LV,所以只需要扩容这个LV即可。

A)先将新的磁盘分区并做LVM标记
B)将磁盘分区做成PV
首先可以看到没做PV前,系统中只有一个PV,即/dev/sda2,做完后系统有了2个PV。

但是这个新建的PV,即/dev/sdb1还没加到VG 里面。

C)将新建的PV加入到VG里面
根据上图可以看到系统的VG名称是VolGroup,为了后面LV能扩容,需要将新建的PV加到这个原来的VG中,而不是单独新建一个VG。

从下图中可以看出原来的VG——VolGroup原本大小是49.51G,加入新的PV后,VolGroup的大小变为99.50G,增加了49.99G。

D)扩容相应的LV
首先根据扩容需求确定扩容的目录所在的LV,然后扩容相对应的LV 即可。

如下图,根分区是挂载在LV——lv_root下的,若需求是扩容根分区,则即可扩容lv_root这个LV即可。

这里根分区是45G,因为VG根据上面算的还剩49.99G,而不是新增磁盘的50G(格式化的inode要占用一定的空间,所以剩余空间要少一点)
相应命令为lvextend –L +49.99G /dev/mapper/VolGroup-lv_root
E)将扩容LV的文件系统大小跟着扩大
虽然根分区对应的LV——lv_root大小扩容了49.99G,但是内部对应的文件系统大小还是原来的45G,这里需要将文件系统也跟着LV一起扩大。

所用命令resize2fs /dev/mapper/VolGroup-lv_root
到这里扩容已基本完成。

相关主题