服务器硬盘扩容之新加硬盘扩容到现有路径下
前言
服务器在运行了一段时间,发现硬盘不太够用,需要扩容,如果业务对扩容的新硬盘的路径没有特殊的要求,直接使用mount来挂载,用完之后再取消挂载就好了。
但是如果服务器的业务已经在某个路径下写入大量的文件了,导致该路径下的硬盘空间不太够用,这时候就不能使用 mount 来挂载新硬盘了。
一、扩展新硬盘
如果是物理机,直接插入新的硬盘开机。
如果是虚拟机,则需要修改虚拟机的硬盘容量,或者添加新的硬盘,这里直接添加新的硬盘后开机。
二、新硬盘扩容
添加新硬盘后,开机后看下硬盘情况:
bash
[root@localhost ~]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 500G 0 disk
├─sda1 8:1 0 1G 0 part /boot
└─sda2 8:2 0 499G 0 part
├─centos-root 253:0 0 550G 0 lvm /
├─centos-swap 253:1 0 7.9G 0 lvm [SWAP]
└─centos-home 253:2 0 441.1G 0 lvm /home
sdb 8:16 0 500G 0 disk
└─sdb1 8:17 0 500G 0 part
└─centos-root 253:0 0 550G 0 lvm /
sdc 8:32 0 300G 0 disk
sr0 11:0 1 4.4G 0 rom
[root@localhost ~]#
可以看到有一块 300G 的新的硬盘 sdc 类型为 disk
硬盘的顺序是依次递增的,比如我这台服务器,之前有两块硬盘,sda、sdb,所以新加一块盘就自动命名成 sdc 了。
然后看下现有磁盘占用情况:
bash
[root@localhost ~]# df -Th
Filesystem Type Size Used Avail Use% Mounted on
devtmpfs devtmpfs 48G 0 48G 0% /dev
tmpfs tmpfs 48G 0 48G 0% /dev/shm
tmpfs tmpfs 48G 13M 48G 1% /run
tmpfs tmpfs 48G 0 48G 0% /sys/fs/cgroup
/dev/mapper/centos-root xfs 550G 107G 444G 20% /
/dev/sda1 xfs 1014M 195M 820M 20% /boot
/dev/mapper/centos-home xfs 441G 365G 77G 83% /home
overlay overlay 441G 365G 77G 83% /home/docker/overlay2/50bc564248af9b92ff6563786859386222b0f58b1c51b61bfd11c5fe89de248a/merged
overlay overlay 441G 365G 77G 83% /home/docker/overlay2/106ebdf7de31dc8cced4589ae2cb556fba66738b5ea7607c0e9e616ea3ba2ce7/merged
overlay overlay 441G 365G 77G 83% /home/docker/overlay2/e93e294076637bd7ee82f70cfeaf1d82708504668201dba622a4b9b22bc1864f/merge
可以看到 /home 路径下空闲磁盘已经不多了,但是由于业务的复杂性,有些路径又不能随便移动,所以这里要把新加的硬盘容量扩容到 /home 下。
2.1 新增分区
操作步骤如下,操作分 3 步:
bash
[root@localhost ~]# fdisk /dev/sdc
Welcome to fdisk (util-linux 2.23.2).
Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.
Device does not contain a recognized partition table
Building a new DOS disklabel with disk identifier 0x870ff563.
Command (m for help): m
Command action
a toggle a bootable flag
b edit bsd disklabel
c toggle the dos compatibility flag
d delete a partition
g create a new empty GPT partition table
G create an IRIX (SGI) partition table
l list known partition types
m print this menu
n add a new partition
o create a new empty DOS partition table
p print the partition table
q quit without saving changes
s create a new empty Sun disklabel
t change a partition's system id
u change display/entry units
v verify the partition table
w write table to disk and exit
x extra functionality (experts only)
Command (m for help): n
Partition type:
p primary (0 primary, 0 extended, 4 free)
e extended
Select (default p): p
Partition number (1-4, default 1):
First sector (2048-629145599, default 2048):
Using default value 2048
Last sector, +sectors or +size{K,M,G} (2048-629145599, default 629145599):
Using default value 629145599
Partition 1 of type Linux and of size 300 GiB is set
Command (m for help): t
Selected partition 1
Hex code (type L to list all codes): 8e
Changed type of partition 'Linux' to 'Linux LVM'
Command (m for help): w
The partition table has been altered!
Calling ioctl() to re-read partition table.
Syncing disks.
[root@localhost ~]#
首先是知道新硬盘的盘符为 sdc,这是在上一步已经确认过的。接着直接操作新建分区
- Command (m for help): 输入
n来触发新建分区:add a new partition,输入 m 来看帮助信息; - Select (default p) :提示主分区还是扩展分区,这里默认主分区,可以输入
p也可以什么都不输入,直接回车; - Partition number (1-4, default 1): 分区号,默认1 ,这里直接回车;
- First sector (2048-629145599, default 2048): 起始扇区直接默认即可;
- Last sector, +sectors or +size{K,M,G}: 起始扇区直接默认即可;
Partition 1 of type Linux and of size 300 GiB is set,可以看到 新建了一个300G的分区; - t change a partition's system id:修改分区ID,如果有需要的话可以操作,我这里默认1,也没有改。
- Hex code (type L to list all codes): 修改分区格式,
8e是将分区类型Linux改成Linux LVM,以至于后续扩容可以使用; - Command (m for help): w 这是将修改写入分区表;
接着执行 partprobe 让内核同步分区信息。
此时可以看下磁盘情况:
bash
[root@localhost ~]# lsblk -l
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 500G 0 disk
sda1 8:1 0 1G 0 part /boot
sda2 8:2 0 499G 0 part
centos-root 253:0 0 550G 0 lvm /
centos-swap 253:1 0 7.9G 0 lvm [SWAP]
centos-home 253:2 0 441.1G 0 lvm /home
sdb 8:16 0 500G 0 disk
sdb1 8:17 0 500G 0 part
centos-root 253:0 0 550G 0 lvm /
sdc 8:32 0 300G 0 disk
sdc1 8:33 0 300G 0 part
sr0 11:0 1 4.4G 0 rom
[root@localhost ~]#
可以看到新增了一个 sdc1 的分区,容量大小刚好是新硬盘容量 300G;
2.2 格式化新建分区
在指定的磁盘分区 /dev/sdc1 上创建一个 ext4 格式的文件系统(即格式化分区为 ext4 格式)。
bash
[root@localhost ~]# mkfs.ext4 /dev/sdc1
mke2fs 1.42.9 (28-Dec-2013)
Filesystem label=
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
Stride=0 blocks, Stripe width=0 blocks
19660800 inodes, 78642944 blocks
3932147 blocks (5.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=2227175424
2400 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
Allocating group tables: done
Writing inode tables: done
Creating journal (32768 blocks): done
Writing superblocks and filesystem accounting information: done
[root@localhost ~]#
命令各部分含义:
mkfs:是 "make filesystem" 的缩写,用于在磁盘分区上创建文件系统(格式化分区)。.ext4:指定创建的文件系统类型为 ext4(Linux 系统中最常用的高性能日志文件系统,支持大分区、大文件,稳定性和兼容性较好)。/dev/sdc1:表示要格式化的磁盘分区,其中:sdc是磁盘设备名(通常表示第三块 SCSI/SATA 硬盘,sda 是第一块,sdb 是第二块)。1表示该磁盘的第一个分区。
执行结果解析:输出信息详细描述了文件系统的创建过程和参数:
- 基础信息 :
mke2fs 1.42.9:使用 mke2fs 工具(mkfs.ext4 的底层实现),版本为 1.42.9。
Filesystem label=:未设置文件系统标签(可通过 -L 参数指定,如 mkfs.ext4 -L mydisk /dev/sdc1)。
OS type: Linux:文件系统用于 Linux 系统。 - 块和碎片大小 :
Block size=4096:数据块大小为 4096 字节(4KB),是 ext4 的默认值,影响文件存储效率(小文件多可设小,大文件多可设大)。
Fragment size=4096:碎片大小(针对小文件的存储单位)与块大小一致。 - 存储容量 :
19660800 inodes:创建了约 1966 万个 inode(用于存储文件元信息,如权限、大小、位置等)。
78642944 blocks:总数据块数量约 7864 万个,按 4KB / 块计算,总容量约 300GB(78642944 × 4KB ≈ 300GB)。
3932147 blocks (5.00%) reserved:保留 5% 的块给超级用户(root),确保系统在磁盘满时仍能运行关键程序。 - 超级块(Superblock) :
超级块是文件系统的核心元数据(记录分区大小、inode 数量等),此处列出了超级块的备份位置(如 32768、98304 等块地址),用于文件系统损坏时恢复。 - 创建过程:
依次完成 "分配组表""写入 inode 表""创建日志(journal)""写入超级块和账户信息",最终提示 done 表示文件系统创建成功。
2.3 合并分区
使用 lvm 先新建物理卷,注意要处理的 硬盘分区为 sdc1
bash
[root@localhost ~]# lvm
lvm> pvcreate /dev/sdc1
WARNING: ext4 signature detected on /dev/sdc1 at offset 1080. Wipe it? [y/n]: y
Wiping ext4 signature on /dev/sdc1.
Physical volume "/dev/sdc1" successfully created.
lvm> vgextend centos /dev/sdc1
Volume group "centos" successfully extended
lvm>
lvm> vgdisplay -v
--- Volume group ---
VG Name centos
System ID
Format lvm2
。。。。
--- Physical volumes ---
PV Name /dev/sda2
PV UUID JcpGKD-9SyA-UGcJ-9VaP-UAqz-Hv85-Xhw3eH
PV Status allocatable
Total PE / Free PE 127743 / 0
PV Name /dev/sdb1
PV UUID 5GUm6J-dPQf-kk1E-Niy0-A7YO-7jyv-bMLykF
PV Status allocatable
Total PE / Free PE 127999 / 0
PV Name /dev/sdc1
PV UUID xEHpIT-c4HQ-DQXO-6LjW-7P5C-999A-sC8wCP
PV Status allocatable
Total PE / Free PE 76799 / 76799
注意最后的这个物理卷:/dev/sdc1 空闲容量为 76799 后面扩容要用到这个数;
接下来将系统盘/dev/mapper/centos-home与 sdc1 的76799 空余容量合并.
bash
lvm> lvextend -l+76799 /dev/mapper/centos-home
Size of logical volume centos/home changed from <441.12 GiB (112926 extents) to 741.11 GiB (189725 extents).
Logical volume centos/home successfully resized.
lvm>
lvm> quit
Exiting.
[root@localhost ~]#
根据自己的需要将新的物理机扩容到哪个系统分区下,我这里是 /dev/mapper/centos-home,可以看到扩容成功了。
最后将文件系统进行扩容,让系统识别,输入命令:xfs_growfs /dev/mapper/centos-home
bash
[root@localhost ~]# xfs_growfs /dev/mapper/centos-home
meta-data=/dev/mapper/centos-home isize=512 agcount=4, agsize=28909056 blks
= sectsz=512 attr=2, projid32bit=1
= crc=1 finobt=0 spinodes=0
data = bsize=4096 blocks=115636224, imaxpct=25
= sunit=0 swidth=0 blks
naming =version 2 bsize=4096 ascii-ci=0 ftype=1
log =internal bsize=4096 blocks=56463, version=2
= sectsz=512 sunit=0 blks, lazy-count=1
realtime =none extsz=4096 blocks=0, rtextents=0
data blocks changed from 115636224 to 194278400
[root@localhost ~]#
接着再次查看系统磁盘占用情况:
bash
[root@localhost ~]# df -h
Filesystem Size Used Avail Use% Mounted on
devtmpfs 48G 0 48G 0% /dev
tmpfs 48G 0 48G 0% /dev/shm
tmpfs 48G 21M 48G 1% /run
tmpfs 48G 0 48G 0% /sys/fs/cgroup
/dev/mapper/centos-root 550G 107G 444G 20% /
/dev/sda1 1014M 195M 820M 20% /boot
/dev/mapper/centos-home 741G 365G 377G 50% /home
可以看到 /home 目录已扩容成功,新增了 300G;