内存的扩容相对简单:
虚拟机的内存和 CPU 是可以直接改的:
-
如果你用的是常见的虚拟化软件(比如 VMware、VirtualBox 等):
-
先关闭(关机)虚拟机
-
在虚拟机设置里(Settings)找到 Memory 和 CPU,调整数值即可
-
-
然后重新开机就能用新的内存和 CPU
磁盘的扩容 :
键入 fdisk -l 命令,结果如下:
fdisk -l
磁盘 /dev/sda:53.7 GB, 53687091200 字节,104857600 个扇区
Units = 扇区 of 1 * 512 = 512 bytes
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节
磁盘标签类型:dos
磁盘标识符:0x000981d9
设备 Boot Start End Blocks Id System
/dev/sda1 * 2048 2099199 1048576 83 Linux
/dev/sda2 2099200 41943039 19921920 8e Linux LVM
磁盘 /dev/mapper/centos-root:18.2 GB, 18249416704 字节,35643392 个扇区
Units = 扇区 of 1 * 512 = 512 bytes
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节
磁盘 /dev/mapper/centos-swap:2147 MB, 2147483648 字节,4194304 个扇区
Units = 扇区 of 1 * 512 = 512 bytes
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节
现在的情况是:VMware 虚拟机的磁盘已经从 20G 扩容到大约 50G(实际是 ~53.7G),但是系统里原来的分区 /dev/sda2
(Linux LVM)还是只有大约 20G,没有用到新扩出来的空间。
那么,首先,通过 执行 df -h 命令,观察结果,如果返回结果有:
/dev/mapper/centos-root on / type xfs ...
那么说明:
-
根分区
/
是挂载在/dev/mapper/centos-root
上 -
/dev/mapper/...
是典型的 LVM 设备名
解释一下:
/dev/sda2
分区是 LVM 的 PV
centos
是卷组(VG)
root
是逻辑卷(LV)
LV /dev/centos/root
(= /dev/mapper/centos-root
)挂载到 /
这样就能确认:根分区 /
在 /dev/mapper/centos-root
上,确实是 LVM
2. 扩展分区 /dev/sda2
因为现在多出来的空间在 /dev/sda2
后面,你需要让 /dev/sda2
用到后面的空间。
方法:删除后重建同位置的分区,不会丢数据,执行下述命令
fdisk /dev/sda
然后按以下步骤:
-
输入
p
查看分区表 -
记住
/dev/sda2
的 起始扇区号(Start) -
输入
d
删除分区 2 -
输入
n
新建分区,选择主分区p
,编号 2 -
起始扇区号 一定要和原来一样(默认就会是一样的)
结束扇区直接回车用到磁盘末尾
kpartx -u /dev/sda
输入
t
设置分区类型为8e
(Linux LVM) -
输入
w
保存退出
这样做只修改分区表,不会动分区里的数据。
# 执行上述操作,返回内容为 :
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)
3. 让内核重新识别分区表
通常需要执行 :
partprobe
或者执行 :
kpartx -u /dev/sda
但是我的执行都报错:
[root@localhost ~]# partprobe
Warning: 无法以读写方式打开 /dev/sr0 (只读文件系统)。/dev/sr0 已按照只读方式打开。
[root@localhost ~]# kpartx -u /dev/sda
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
因为 /dev/sda2
正在被 LVM 使用(PV 已经在卷组里激活并挂载),此时 kpartx
或 partprobe
无法强行刷新内核的分区表。
此时最简单、最干净的办法 是 重启系统
重启之后,内核会重新读一次分区表,自然就能识别 /dev/sda2
新的大小。
4. 重启完后,识别扩容的分区,pvresize 命令
我重启后,执行 fdisk -l, 返回内容如下:
[root@localhost ~]# fdisk -l
磁盘 /dev/sda:53.7 GB, 53687091200 字节,104857600 个扇区
Units = 扇区 of 1 * 512 = 512 bytes
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节
磁盘标签类型:dos
磁盘标识符:0x000981d9
设备 Boot Start End Blocks Id System
/dev/sda1 * 2048 2099199 1048576 83 Linux
/dev/sda2 2099200 104857599 51379200 8e Linux LVM
磁盘 /dev/mapper/centos-root:18.2 GB, 18249416704 字节,35643392 个扇区
Units = 扇区 of 1 * 512 = 512 bytes
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节
磁盘 /dev/mapper/centos-swap:2147 MB, 2147483648 字节,4194304 个扇区
Units = 扇区 of 1 * 512 = 512 bytes
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节
现在的情况看上去分区 /dev/sda2
已经成功扩展到全盘(现在 End
是 104857599
,也就是大约 50GB 空间都被它占了)
接着,执行 pvresize XXX 命令,这是由于:
-
/dev/sda2
是 LVM 的物理卷(PV) -
分区虽然变大了,但 LVM 并不知道下面的物理卷已经多了可用空间
-
pvresize /dev/sda2
的作用是:告诉 LVM「现在这个 PV 后面有新空间可以用了」
执行后,LVM 才会把新空间加到卷组里,卷组才会有空闲空间(Free PE)用来扩展逻辑卷(LV)。
简单比喻一下:分区扩容好比「仓库墙打通,多了 30G 空间」。pvresize
是「通知仓库管理员,现在可以把货物放到新空间了」。如果不执行 pvresize
,LVM 只知道原来 20G 空间,后面新增的空间就闲置在那里,根本用不上。
因此:执行 pvresize /dev/sda2 命令
[root@localhost ~]# pvresize /dev/sda2
Physical volume "/dev/sda2" changed
1 physical volume(s) resized or updated / 0 physical volume(s) not resized
-
Physical volume "/dev/sda2" changed
→ 你刚才扩容的/dev/sda2
物理卷已经被成功更新,让 LVM 知道它现在比原来大了。 -
1 physical volume(s) resized or updated / 0 physical volume(s) not resized
→ 总共检查了 1 个 PV(就是/dev/sda2
),成功扩容了 1 个,没有失败的。
5. 把新空间分配给根分区, 让根分区真正用到这部分空间
执行:
lvextend -l +100%FREE /dev/centos/root
xfs_growfs /dev/centos/root
df -h
执行后的返回值如下:
[root@localhost ~]# lvextend -l +100%FREE /dev/centos/root
Size of logical volume centos/root changed from <17.00 GiB (4351 extents) to <47.00 GiB (12031 extents).
Logical volume centos/root successfully resized.
[root@localhost ~]# xfs_growfs /dev/centos/root
meta-data=/dev/mapper/centos-root isize=512 agcount=4, agsize=1113856 blks
= sectsz=512 attr=2, projid32bit=1
= crc=1 finobt=0 spinodes=0
data = bsize=4096 blocks=4455424, imaxpct=25
= sunit=0 swidth=0 blks
naming =version 2 bsize=4096 ascii-ci=0 ftype=1
log =internal bsize=4096 blocks=2560, version=2
= sectsz=512 sunit=0 blks, lazy-count=1
realtime =none extsz=4096 blocks=0, rtextents=0
data blocks changed from 4455424 to 12319744
[root@localhost ~]# df -h
文件系统 容量 已用 可用 已用% 挂载点
devtmpfs 1.9G 0 1.9G 0% /dev
tmpfs 1.9G 0 1.9G 0% /dev/shm
tmpfs 1.9G 12M 1.9G 1% /run
tmpfs 1.9G 0 1.9G 0% /sys/fs/cgroup
/dev/mapper/centos-root 47G 4.0G 44G 9% /
/dev/sda1 1014M 151M 864M 15% /boot
tmpfs 378M 0 378M 0% /run/user/0
注意此时的根目录已经成功扩容到了 47G,那就是执行成功啦
如果你想系统补一下,可以分几块:
-
Linux 文件系统和分区(fdisk, parted, ext4, xfs)
-
LVM(pv, vg, lv)基本原理与常用命令
-
Linux 系统运维(查看日志、扩容、备份)
-
大数据组件安装(CDH、Hive、HDFS)
-
虚拟化基础(VMware、VirtualBox)及磁盘/内存调整