记一次Linux虚拟机硬盘空间不足的处理方案

本文介绍了解决Linux虚拟机根目录空间不足的问题,包括使用vmware给虚拟机硬盘扩容的具体步骤,以及如何通过新建分区并挂载来迁移MySQL数据文件,避免了数据丢失。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

记一次Linux虚拟机硬盘空间不足的处理方案


**起因:**公司的服务器是windows的,而我需要一个基于Linux的dev环境,于是用vmvare创建了一个centos7的系统实例,里面安装mysql5.7作为dev环境数据库,安装在根目录,后来由于数据量激增,将根目录塞满了,导致mysql无法继续增加数据。
环境: Centos7-64
目的:解决根目录空间不足问题,并且不损坏任何数据。

  • 自己折腾了一天了,由于水平有限,跳了很多坑。坑就不写了,下面写解决方案。

一. 找到问题

  • 使用命令:df -hT查看当前文件系统各种信息。

    这里显示我的根目录已用100%,这就是我这次遇到的问题所在。

对根目录扩容和对非根目录扩容是两个概念,因为普通目录可以 先杀死目录下进程–>将分区移除挂载–>将分区扩容–>重新挂载–>恢复进程但是根目录不行。根目录里都是系统核心进程。Linux

二. 用vmvare给虚拟机扩容

  • 关闭虚拟机中的centos7的系统实例
  • 右键–设置–参照下图
    这里写图片描述
  • 但是额外分的这部分存储,还没有应用到虚拟的Centos7实例中。

三. 分析

  • df -hT命令可以看到根目录被挂载的分区是:/dev/sda3
  • 使用命令:fdisk -l查看磁盘信息,这里我们重点关注/dev/sda3的system这个属性,我这里是Linux,表示是Linux默认的磁盘管理机制。
    这里写图片描述
  • 观察这一点很重要,据我所知,Linux默认的磁盘管理机制这种没办法直接动态扩容,除非杀死/dev/sda3这个分区的挂载点也就是根目录里面运行的进程。
  • 如果是Linux LVM,恭喜你,非常容易扩容,具体操作自行百度,网上很多,简单的操作几个步骤即可。

鉴于以上分析。很明显,我在不损失任何数据的情况下,没办法对根目录扩容,这时候就准备换个思路。既然是mysql的数据量过大造成根目录满,那我可以新建一个文件夹,然后新建一个分区,将这个分区挂载到这个文件夹上,然后将mysql的数据文件搬过来不就行了。

四. 新建分区,格式化分区,新建文件夹,挂载

  • 使用fdisk /dev/sda命令,然后输入p按回车,展示当前分区列表,输入m按回车,可以查看help操作,一看就懂的。【注意:我这里命令中的/dev/sda是分区名,请不要照抄,自行对号入座
  • 使用n新建分区,分区号默认是当前已有最大分区号+1,分区start,分区end都选默认就行。我这里新建的是sda4分区。【注意:这里的前提是你的主分区或者拓展分区还有空位置
  • 使用w保存你的操作,使用q退出
  • 如果分区顺利建完,可以用fdisk -l看到你刚刚建的分区了
  • 分区格式化:首先,通过df -hT查看分区的文件系统类型,因为我要转移的mysql数据文件来自/dev/sda3分区,它的类型是xfs,所以sda4分区就要使用xfs格式格式化了,格式化命令mkfs -f xfs /dev/sda4
  • 新建文件夹:mkdir /usr/mysql-data,【这里你可以自定义】
  • 挂载:mount /dev/sda4 /usr/mysql-data

五. 将新建的分区,设置为开机自动挂载

  • 查看分区id:ls -l /dev/disk/by-uuid/
  • 修改vim /etc/fstab, 最小码新写一行,如下【uuid请换掉
UUID=4366aadb-6ee8-46cd-8708-b4e2f70b2860 /usr/mysql-data         xfs     defaults        0 0
  • 重启:reboot
  • 使用df -hT查看,可以看到新建的分区挂载到新建的文件夹上了,完美,可以继续下一步

这一节很重要,另外,fstab里面的格式一定要对齐

六. 对mysql的一些操作

  • 通知相关人员,我要暂时关闭mysql
  • 停止mysql:systemctl stop mysqld
  • copy文件:cp -r /var/lib/mysql /usr/mysql-data/mysql
  • 修改/etc/my.cnf文件中的两个属性,如下
[mysqld]
#datadir=/var/lib/mysql
datadir=/usr/mysql-data/mysql
#socket=/var/lib/mysql/mysql.sock
socket=/usr/mysql-data/mysql/mysql.sock

[client]
# 必须改这个,否则mysql server所在的本机器,命令行登不进去
socket=/usr/mysql-data/mysql/mysql.sock
  • 给新的数据目录赋予权限:chown -R mysql /usr/mysql-data
  • 启动mysql:systemctl start mysqld
  • 尝试使用命令行或者navicat等连接mysql查看是否能连接,数据库是否缺失

七. 收尾工作

  • 删除/var/lib/mysql下面的内容:rm -rf /var/lib/mysql/
  • 查看空间:df -hT,看根目录是否有空间了
    这里写图片描述
  • 再次确认无误后,通知相关人员,mysql可以继续使用了。


如果是LVM的,按下列操作

  1. sudo su获取管理员权限
  2. fdisk -l查看当前disk容量
  3. 去vcenter或vmware workstation扩容该虚拟机的某个disk(以VmWare为例)
  4. cat /proc/scsi/scsi查看scsi, 选择Vendor: VMware Model: Virtual disk的;然后重点看Host字段
  5. ls /sys/class/scsi_device/查看scsi device
  6. echo 1 > /sys/class/scsi_device/0\:0\:0\:0/device/rescan重新扫描scsi(0000取决于4和5, 0:0:0:0 —> x,x,bus,unit)
  7. fdisk -l能看到容量已经出来了(若是vCenter,开不开datastore scsi control不影响)
  8. fdisk /dev/sda添加分区
  9. p n p [enter] [enter] w 按顺序依次敲击键盘
  10. fdisk /dev/sda; t 4 8e w(更改分区类型为LVM, 4是刚刚新建的分区编号)按顺序依次敲击键盘
    敲完后会提示:the next reboot or after you run partprobe(8) or kpartx(8)
  11. partprobe通知系统分区表的变化
  12. lvm进入卷管理
  13. pvcreate /dev/sda4创建物理卷(4是刚刚新建的分区编号)
  14. pvdisplay查看物理卷是否创建成功
  15. vgscan查看是否有vg(没有就创建vgcreate rootvg /dev/sda4)
  16. vgextend rootvg /dev/sda4(动态扩展LVM卷组;rootvg来自15,/dev/sda4是新加的分区 )
  17. lvextend -L +30G /dev/mapper/rootvg-lv_root给磁盘分配空间(磁盘名称来自fdisk -l)(没有就创建lvcreate -l 100 -n rootlv rootvg
  18. quit退出lvm
  19. xfs_growfs /dev/mapper/rootvg-lv_root扩容文件系统
  20. df -hfdisk -l查看验证扩容成功


本篇很多名词可能解释的不专业或者错误,望海涵。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值