云服务器磁盘扩容案例和相关知识汇总

2025-06-21 15:22:00
丁国栋
原创 192
摘要:本文记录云服务器磁盘扩容案例和相关知识汇总。

云服务器磁盘扩容案例和相关知识汇总

案例1:根分区扩容

云服务器的根文件系统对应的磁盘在云服务商控制台进行了扩容,从100GB扩容到了500GB。通过 lsblk 命令执行结果发现硬盘大小已经从原来的100GB变为500GB。

# lsblk
NAME   MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sr0     11:0    1   17M  0 rom
vda    254:0    0  500G  0 disk
└─vda1 254:1    0  100G  0 part /
# df -Th
Filesystem     Type      Size  Used Avail Use% Mounted on
udev           devtmpfs  3.8G     0  3.8G   0% /dev
tmpfs          tmpfs     770M  1.7M  769M   1% /run
/dev/vda1      ext4      493G  102G  371G  22% /
tmpfs          tmpfs     3.8G   24K  3.8G   1% /dev/shm
tmpfs          tmpfs     5.0M     0  5.0M   0% /run/lock
tmpfs          tmpfs     770M     0  770M   0% /run/user/0
#

由上文可见硬盘设备名是vda,对应分区名是vda1。/dev/vda1 是ext4文件系统, 现在需要把vda1的空间大小扩容从100GB到vda的最大容量即500GB。

1. 检查当前磁盘和分区情况

lsblk
fdisk -l /dev/vda
df -hT
  • 确认 /dev/vda 已扩容到 500GB,但 /dev/vda1 仍为 100GB。
  • 确认文件系统类型为 ext4

2. 安装 growpart(如果未安装)

# CentOS/RHEL:
yum install -y cloud-utils-growpart
# Ubuntu/Debian:
apt-get install -y cloud-guest-utils

growpart 用于调整分区大小。

3. 扩展分区 /dev/vda1 到最大可用空间

growpart /dev/vda 1
  • 此命令会将 /dev/vda1 扩展到 /dev/vda 的最大可用空间(500GB)。
  • 如果报错 "no tools available to resize disk",可能需要先卸载分区(不建议在线操作,建议先做快照)。

其他方式


parted /dev/sda print # 查看变化
parted /dev/sda resizepart 1 100% # 调整分区
resize2fs /dev/sda1 # 调整文件系统

4. 重新加载分区表

这个命令可能并没有,如果没有可以忽略(因为lsblk已经识别到硬盘大小是500GB了)。

partprobe /dev/vda

这个命令是让内核识别新的分区表,避免重启。

5. 扩展 ext4 文件系统

resize2fs /dev/vda1
  • 此命令会将 ext4 文件系统扩展到 /dev/vda1 的完整大小。

6. 验证扩容是否成功

df -h
lsblk
  • 检查 /dev/vda1 是否已显示为 500GB(或接近 500GB,因为文件系统会有少量开销)。

案例2:数据盘扩容

一个云服务器的数据盘 /dev/vdc 原来是2TB,整块磁盘是lvm的一个pv,这个pv用于VG vg_data。vg_data对应创建了LV lv_data。现在LV lv_data空间不足,需要扩容。

一般有两种方案:

  1. 扩容原来的硬盘 /dev/vdc (推荐)
  2. 增购一个新的硬盘,加入到已有的lvm中

方案一:扩容原有硬盘 /dev/vdc

操作步骤

  1. 云控制台扩容硬盘

    # 1. 在云控制台将/dev/vdc从2TB扩容到目标容量(如4TB)
    # 2. 重启服务器或重新扫描磁盘
  2. 扫描磁盘变更

    # 查看当前磁盘大小(未刷新)
    fdisk -l /dev/vdc
    # 重新扫描SCSI总线
    echo 1 > /sys/class/block/vdc/device/rescan
    # 或使用rescan-scsi-bus.sh(需安装scsi-target-utils)
  3. 调整物理卷

    # 扩展物理卷
    pvresize /dev/vdc
    # 验证
    pvdisplay /dev/vdc
  4. 扩展逻辑卷

    # 查看可用空间
    vgdisplay vg_data
    # 扩展逻辑卷(扩展到全部空间或指定大小)
    lvextend -l +100%FREE /dev/vg_data/lv_data
    # 或指定具体容量
    lvextend -L +1T /dev/vg_data/lv_data
  5. 扩展文件系统

    # 如果是ext4文件系统
    resize2fs /dev/vg_data/lv_data
    # 如果是xfs文件系统
    xfs_growfs /mount/point
    # 验证
    df -h

优点

  1. 管理简单:单磁盘管理,无多盘复杂性
  2. 性能稳定:无需跨盘数据分布
  3. 成本可能更低:云厂商大容量单价通常更低
  4. 无数据迁移:原有数据布局不变

缺点

  1. 需要重启/扫描:可能需要重启或特殊操作才能识别新容量
  2. 有单点风险:单磁盘故障会导致整个VG不可用
  3. 扩展上限:受单盘最大容量限制
  4. 业务中断:可能需要卸载文件系统操作

方案二:新增硬盘加入LVM

操作步骤

  1. 云控制台添加新盘

    # 1. 购买新数据盘(如2TB)
    # 2. 挂载到服务器,识别为/dev/vdd
  2. 创建物理卷

    # 创建PV
    pvcreate /dev/vdd
    # 验证
    pvdisplay /dev/vdd
  3. 扩展卷组

    # 将新PV加入现有VG
    vgextend vg_data /dev/vdd
    # 验证
    vgdisplay vg_data
  4. 扩展逻辑卷

    # 查看可用空间
    vgdisplay vg_data
    # 扩展LV
    lvextend -l +100%FREE /dev/vg_data/lv_data
  5. 扩展文件系统

    # 同方案一,根据文件系统类型选择命令
    resize2fs /dev/vg_data/lv_data
    # 或
    xfs_growfs /mount/point

优点

  1. 无需扩容原盘:避免原盘扩容风险
  2. 扩展灵活:可多盘扩展,突破单盘限制
  3. 在线扩展:通常无需重启
  4. 性能提升:多盘可配置条带化提升性能
  5. 风险分散:多盘降低单点故障影响

缺点

  1. 管理复杂:多盘管理更复杂
  2. 成本可能更高:多小盘总价可能高于单大盘
  3. 性能不均衡:新增盘性能可能不同
  4. 依赖LVM:LVM故障影响所有盘
  5. 盘符限制:可能受设备名数量限制

对比建议

维度 方案一(扩容原盘) 方案二(新增盘)
复杂度
风险
成本 可能较低 可能较高
性能 稳定 可提升
扩展性 有限
业务影响 可能需重启

推荐方案

短期解决:使用方案二,新增一个同规格硬盘,风险最小,操作最快。

长期规划

  1. 如果数据增长可预测,使用方案一扩容到足够容量
  2. 如果对性能有要求,使用方案二并配置条带化
  3. 如果对可用性要求高,使用方案二并保持多盘

重要注意事项

  1. 备份优先

    # 操作前必须备份
    rsync -av /data/ /backup/
    # 或创建LVM快照
    lvcreate -L 10G -s -n lv_data_snap /dev/vg_data/lv_data
  2. 文件系统检查

    # 扩展前先检查
    e2fsck -f /dev/vg_data/lv_data
    # 或
    xfs_repair /dev/vg_data/lv_data
  3. 操作后验证

    lsblk
    vgdisplay
    lvdisplay
    df -h
  4. 更新fstab:确保fstab使用UUID而非设备名



Linux 中 /etc/fstab 文件详解

/etc/fstab (文件系统表) 是 Linux 系统中一个重要的配置文件,用于定义系统启动时自动挂载的文件系统信息。它包含了磁盘分区、挂载点、文件系统类型以及挂载选项等信息。

文件格式概述

/etc/fstab 文件由若干行组成,每行定义一个文件系统的挂载信息。每行通常包含6个字段,字段之间用空格或制表符分隔:

<设备> <挂载点> <文件系统类型> <挂载选项> <dump备份标志> <fsck检查顺序>

各字段详细解释

1. 设备 (Device)

指定要挂载的存储设备或分区,可以是以下形式之一:

  • 设备文件名:如 /dev/sda1/dev/nvme0n1p2
  • UUID:如 UUID=123e4567-e89b-12d3-a456-426614174000 (推荐使用,更稳定)
  • LABEL:如 LABEL=ROOT
  • 网络设备:如 server:/share (NFS) 或 //server/share (CIFS)

示例:

/dev/sda1       # 使用设备路径
UUID=123...456  # 使用UUID
LABEL=DATA      # 使用卷标

2. 挂载点 (Mount Point)

指定文件系统的挂载目录,必须是已存在的目录路径。

示例:

/               # 根分区
/home           # 家目录分区
/mnt/data       # 数据分区

3. 文件系统类型 (Filesystem Type)

指定分区或设备的文件系统类型,常见的有:

  • ext4ext3ext2 - Linux 常用文件系统
  • xfs - 高性能文件系统
  • btrfs - 高级功能文件系统
  • vfatfat32 - Windows FAT 文件系统
  • ntfs - Windows NTFS 文件系统
  • swap - 交换分区
  • nfs - 网络文件系统
  • cifs - SMB/CIFS (Windows 共享)
  • auto - 自动检测文件系统类型

示例:

ext4    # 标准Linux文件系统
ntfs    # Windows NTFS分区
nfs     # 网络文件系统

4. 挂载选项 (Mount Options)

定义挂载时的各种选项,多个选项用逗号分隔。常见选项包括:

常用选项

  • defaults - 相当于 rw,suid,dev,exec,auto,nouser,async
  • rw / ro - 读写或只读挂载
  • noexec - 禁止执行该分区上的程序
  • exec - 允许执行程序
  • nosuid - 忽略 setuid 和 setgid 位
  • nodev - 不解释设备文件
  • sync / async - 同步/异步 I/O
  • atime / noatime - 是否更新文件访问时间
  • relatime - 优化访问时间更新
  • discard - 启用 TRIM (SSD优化)
  • nofail - 设备不存在时不报错

文件系统特定选项

  • uid= / gid= - 指定挂载的所有者 (用于FAT/NTFS)
  • umask= / fmask= / dmask= - 权限掩码
  • credentials= - SMB/CIFS 认证文件

示例:

defaults,noatime    # 默认选项+不更新访问时间
rw,nosuid,nodev,noexec  # 安全限制较多的挂载
user,noauto         # 允许用户挂载,但不自动挂载

5. dump 备份标志

控制 dump 工具是否备份该文件系统:

  • 0 - 禁用备份 (大多数文件系统应设为0)
  • 1 - 启用备份 (通常只对根文件系统设为1)

在 Linux 的 /etc/fstab 中,dump 是一个历史悠久的备份工具,用于文件系统的增量备份。虽然现代系统较少直接使用 dump,但它的配置选项仍保留在 /etc/fstab 中。

6. fsck 检查顺序

控制启动时 fsck 检查文件系统的顺序:

  • 0 - 不检查
  • 1 - 优先检查 (通常设为根文件系统)
  • 2+ - 次要检查 (其他文件系统)

示例 fstab 条目

# 设备/分区           挂载点      类型    选项                  dump fsck
UUID=123...456      /           ext4    defaults,noatime     0    1
UUID=abc...def      /home       ext4    defaults,relatime    0    2
UUID=987...654      none        swap    sw                   0    0
/dev/sdb1           /mnt/data   ntfs    rw,user,uid=1000     0    0
server:/share       /mnt/nfs    nfs     defaults,_netdev     0    0
//server/share      /mnt/smb    cifs    credentials=/etc/smbpass.txt 0 0

真实例子1

# /etc/fstab: static file system information.
#
# Use 'blkid' to print the universally unique identifier for a
# device; this may be used with UUID= as a more robust way to name devices
# that works even if disks are added and removed. See fstab(5).
#
# <file system> <mount point>   <type>  <options>       <dump>  <pass>
# / was on /dev/ubuntu-vg/ubuntu-lv during curtin installation
/dev/disk/by-id/dm-uuid-LVM-MWwFTaBxyft4dnO9bt1pKvMoKDslt6OFim1WDYU0SI439mdmpbSHTM3zLLFsNaBJ / ext4 defaults 0 1
# /boot was on /dev/nvme0n1p2 during curtin installation
/dev/disk/by-uuid/541ac6c9-38c5-4c8f-b7bc-5c936139b9cc /boot ext4 defaults 0 1
# /boot/efi was on /dev/nvme0n1p1 during curtin installation
/dev/disk/by-uuid/0946-8CB4 /boot/efi vfat defaults 0 1
/swap.img       none    swap    sw      0       0

真实例子2

# CLOUD_IMG: This file was created/modified by the Cloud Image build process
UUID=a50a23a3-d964-4dfb-96e3-2536bdc8898e       /        ext4   discard,errors=remount-ro       0 1
UUID=cf077612-a959-4240-9014-ec9faae34ee8       /data    ext4   defaults        0 2
UUID=F3C9-4183  /boot/efi       vfat    umask=0077      0 1

完整行解析:

UUID=a50a23a3-d964-4dfb-96e3-2536bdc8898e / ext4 discard,errors=remount-ro 0 1
部分 说明
UUID=a50a23a3-d964-4dfb-96e3-2536bdc8898e 指定要挂载的设备(通过唯一UUID标识)
/ 挂载目标路径(根目录)
ext4 文件系统类型(ext4)
discard,errors=remount-ro 挂载选项(多个选项用逗号分隔)
0 是否用 dump 备份(0表示不备份)
1 是否用 fsck 检查磁盘顺序(1表示优先检查)

关键部分详解:

1. UUID=...(设备标识)

  • 作用:通过唯一的UUID(而非设备名如 /dev/vda1)标识磁盘分区,避免设备名变化(如从 vda1 变成 vdb1)导致系统无法启动。
  • 查看UUID

    blkid /dev/vda1

    ls -l /dev/disk/by-uuid/

2. discard(挂载选项)

  • 作用:启用TRIM功能,适用于SSD磁盘,可提升性能并延长寿命。
  • 注意:如果是传统HDD,无需此选项。

3. errors=remount-ro(挂载选项)

  • 作用:如果文件系统出现错误,自动以只读(read-only)模式重新挂载,防止数据损坏。
  • 替代方案
    • errors=panic:直接触发内核崩溃(极端情况使用)。
    • errors=continue:忽略错误(不推荐)。

4. 0 1(fsck和dump设置)

  • 第一个数字 0
    • 表示是否用 dump 工具备份(0=不备份,1=备份)。
  • 第二个数字 1
    • 表示 fsck 在启动时的检查优先级(1=根分区优先检查,2=其他分区,0=不检查)。

特殊注意事项

  1. 网络文件系统:应添加 _netdev 选项,确保网络就绪后再挂载
  2. 交换分区:挂载点为 none,类型为 swap,选项为 sw
  3. 用户挂载:添加 user 选项允许非root用户挂载
  4. 自动挂载noauto 选项可防止启动时自动挂载
  5. 安全考虑:对于不可信的文件系统,考虑使用 nosuid,nodev,noexec

应用更改

修改 /etc/fstab 后,可以执行以下命令测试并应用更改:

# 测试fstab是否有语法错误
sudo mount -a
# 重新挂载所有文件系统
sudo mount -o remount /

最佳实践

  1. 尽可能使用 UUID 而非设备路径 (/dev/sdX),因为设备名可能变化
  2. 对 SSD 考虑添加 discard 选项启用 TRIM
  3. 对频繁读取的文件系统考虑 noatimerelatime
  4. 对不需要执行程序的分区使用 noexec
  5. 备份原始的 fstab 文件后再修改

通过正确配置 /etc/fstab,可以优化系统性能、增强安全性并确保文件系统在启动时正确挂载。


如果磁盘是虚拟机磁盘,从虚拟机管理器中扩容磁盘后,虚拟机操作系统没有识别到,此时可以执行echo 1 > /sys/class/block/sda/device/rescan来触发内核重新扫描该设备的 SCSI 总线,检测存储设备的变化(如新增的磁盘空间、分区等)。/sys/class/block/sda/device/rescan 是 Linux 系统中一个特殊的虚拟文件,用于触发 SCSI 设备的重新扫描操作。

如果要扩容的磁盘没有分区,即是直接将磁盘格式化为文件系统(mkfs.ext4 /dev/sda),此时只需要执行 resize2fs /dev/sda 即可完成文件系统的扩容。

发表评论
博客分类