云计算百科
云计算领域专业知识百科平台

服务器磁盘扩容、数据丢失怎么办?一文吃透 Linux 分区 / 软 RAID/LVM 全实操

CentOS7运维实战:Linux硬盘分区、GPT、软RAID、LVM全解

前言

运维日常高频难题:超大磁盘无法分区、磁盘空间无法灵活扩容、硬盘损坏数据丢失。本文完整梳理MBR/GPT分区区别、gdisk、parted分区实操、mdadm软RAID阵列、LVM逻辑卷弹性管理、磁盘空间不足3类故障排查、永久挂载配置,全部命令基于CentOS7环境,逐条可复制执行,附带实操报错与解决思路。

一、Linux硬盘分区管理

1.1 GPT与MBR分区方案对比

  • MBR分区
    仅支持最大2TiB磁盘,最多15个分区,无分区备份,磁盘损坏极易丢失分区表,老旧BIOS兼容。
  • GPT分区
    UEFI标准分区格式,8字节扇区计数,最大支持18ZiB磁盘;默认支持128个分区;分区表多份冗余备份,自带CRC校验,损坏可自动修复,是大容量硬盘首选。
  • 1.2 GPT分区表结构

    • LBA0 保护性MBR:存放引导程序,标记0xEE标识GPT磁盘,防止老旧工具误篡改分区。
    • LBA1 GPT表头:记录分区表位置、备份地址、CRC校验码,用于分区损坏校验恢复。
    • LBA2~LBA33:分区条目区,32个LBA,每个LBA4组条目,合计128组分区记录,单条分区记录128字节。

    注意:理论128个分区,日常超过120个易出现格式化异常。

    1.3 gdisk 工具(GPT专属分区工具)

    适用:2T以上磁盘GPT分区管理

    基础语法

    [root@server~ 20:10:05]# gdisk [ -l ] 磁盘设备名

    (1)查看磁盘分区表

    [root@server~ 20:10:12]# gdisk -l /dev/sdb
    GPT fdisk (gdisk) version 0.8.10

    Partition table scan:
    MBR: MBR only
    BSD: not present
    APM: not present
    GPT: not present

    ***************************************************************
    Found invalid GPT and valid MBR; converting MBR to GPT format
    in memory.
    ***************************************************************

    Disk /dev/sdb: 41943040 sectors, 20.0 GiB
    Logical sector size: 512 bytes
    Disk identifier (GUID): 1038836E-C6BD-48D3-A490-8FFF2133146B
    Partition table holds up to 128 entries
    First usable sector is 34, last usable sector is 41943006
    Partitions will be aligned on 2048-sector boundaries
    Total free space is 41942973 sectors (20.0 GiB)

    Number Start (sector) End (sector) Size Code Name

    (2)MBR转GPT分区

    [root@server~ 20:10:30]# gdisk /dev/sdb
    GPT fdisk (gdisk) version 0.8.10

    Partition table scan:
    MBR: MBR only
    BSD: not present
    APM: not present
    GPT: not present

    ***************************************************************
    Found invalid GPT and valid MBR; converting MBR to GPT format
    in memory. THIS OPERATION IS POTENTIALLY DESTRUCTIVE! Exit by
    typing 'q' if you don't want to convert your MBR partitions
    to GPT format!
    ***************************************************************

    # 输入?查看全部指令
    Command (? for help): ?
    b back up GPT data to a file
    c change a partition's name
    d delete a partition
    i show detailed information on a partition
    l list known partition types
    n add a new partition
    o create a new empty GUID partition table (GPT)
    p print the partition table
    q quit without saving changes
    r recovery and transformation options (experts only)
    s sort partitions
    t change a partition's type code
    v verify disk
    w write table to disk and exit
    x extra functionality (experts only)
    ? print this menu

    # o 清空重建GPT分区表
    Command (? for help): o
    This option deletes all partitions and creates a new protective MBR.
    Proceed? (Y/N): Y

    # p查看分区表
    Command (? for help): p
    Disk /dev/sdb: 41943040 sectors, 20.0 GiB
    Logical sector size: 512 bytes
    Disk identifier (GUID): 99FE6E5F-8316-428D-BA81-D824C786CC43
    Partition table holds up to 128 entries
    First usable sector is 34, last usable sector is 41943006
    Partitions will be aligned on 2048-sector boundaries
    Total free space is 41942973 sectors (20.0 GiB)

    Number Start (sector) End (sector) Size Code Name

    # w保存退出,q放弃修改
    Command (? for help): w
    Final checks complete. About to write GPT data. THIS WILL OVERWRITE EXISTING
    PARTITIONS!!
    Do you want to proceed? (Y/N): Y
    OK; writing new GUID partition table (GPT) to /dev/sdb.
    The operation has completed successfully.

    (3)新建GPT分区

    [root@server~ 20:11:25]# gdisk /dev/sdb
    GPT fdisk (gdisk) version 0.8.10
    Partition table scan:
    MBR: protective
    BSD: not present
    APM: not present
    GPT: present
    Found valid GPT with protective MBR; using GPT.

    Command (? for help): n
    Partition number (1-128, default 1): 回车
    First sector (34-41943006, default = 2048) or {+-}size{KMGTP}: 回车
    Last sector (2048-41943006, default = 41943006) or {+-}size{KMGTP}: +2G
    Current type is 'Linux filesystem'

    # L查看分区类型编码
    Hex code or GUID (L to show codes, Enter = 8300): L
    0700 Microsoft basic data 0c01 Microsoft reserved 2700 Windows RE
    3000 ONIE boot 3001 ONIE config 4100 PowerPC PReP boot
    4200 Windows LDM data 4201 Windows LDM metadata 7501 IBM GPFS
    7f00 ChromeOS kernel 7f01 ChromeOS root 7f02 ChromeOS reserved
    8200 Linux swap 8300 Linux filesystem 8301 Linux reserved
    8302 Linux /home 8400 Intel Rapid Start 8e00 Linux LVM
    a500 FreeBSD disklabel a501 FreeBSD boot a502 FreeBSD swap
    a503 FreeBSD UFS a504 FreeBSD ZFS a505 FreeBSD Vinum/RAID
    a580 Midnight BSD data a581 Midnight BSD boot a582 Midnight BSD swap
    a583 Midnight BSD UFS a584 Midnight BSD ZFS a585 Midnight BSD Vinum
    a800 Apple UFS a901 NetBSD swap a902 NetBSD FFS
    a903 NetBSD LFS a904 NetBSD concatenated a905 NetBSD encrypted
    a906 NetBSD RAID ab00 Apple boot af00 Apple HFS/HFS+
    af01 Apple RAID af02 Apple RAID offline af03 Apple label
    af04 AppleTV recovery af05 Apple Core Storage be00 Solaris boot
    bf00 Solaris root bf01 Solaris /usr & Mac Z bf02 Solaris swap
    bf03 Solaris backup bf04 Solaris /var bf05 Solaris /home
    bf06 Solaris alternate se bf07 Solaris Reserved 1 bf08 Solaris Reserved 2
    bf09 Solaris Reserved 3 bf0a Solaris Reserved 4 bf0b Solaris Reserved 5
    c001 HP-UX data c002 HP-UX service ea00 Freedesktop $BOOT
    eb00 Haiku BFS ed00 Sony system partitio ed01 Lenovo system partit
    Press the <Enter> key to see more codes:回车
    ef00 EFI System ef01 MBR partition scheme ef02 BIOS boot partition
    fb00 VMWare VMFS fb01 VMWare reserved fc00 VMWare kcore crash p
    fd00 Linux RAID

    # 回车默认Linux文件系统8300
    Hex code or GUID (L to show codes, Enter = 8300): 回车
    Changed type of partition to 'Linux filesystem'

    # 查看分区
    Command (? for help): p
    Disk /dev/sdb: 41943040 sectors, 20.0 GiB
    Logical sector size: 512 bytes
    Disk identifier (GUID): 1A3D170A-56FC-4655-8B9C-01E1B89294FE
    Partition table holds up to 128 entries
    First usable sector is 34, last usable sector is 41943006
    Partitions will be aligned on 2048-sector boundaries
    Total free space is 37748669 sectors (18.0 GiB)

    Number Start (sector) End (sector) Size Code Name
    1 2048 4196351 2.0 GiB 8300 Linux filesystem

    (4)修改分区名称、查看详情、删除分区

    # 修改分区名
    [root@server~ 20:12:10]# gdisk /dev/sdb
    Command (? for help): c
    Using 1
    Enter name: data01
    Command (? for help): p
    Number Start (sector) End (sector) Size Code Name
    1 2048 4196351 2.0 GiB 8300 data01

    # 查看分区详细信息
    Command (? for help): i
    Using 1
    Partition GUID code: 0FC63DAF-8483-4772-8E79-3D69D8477DE4 (Linux filesystem)
    Partition unique GUID: 19AE5CDC-1AB2-4EBA-B9E2-AE9E7BF42653
    First sector: 2048 (at 1024.0 KiB)
    Last sector: 4196351 (at 2.0 GiB)
    Partition size: 4194304 sectors (2.0 GiB)
    Attribute flags: 0000000000000000
    Partition name: 'data01'

    # 删除分区
    Command (? for help): d
    Using 1
    Command (? for help): p
    Number Start (sector) End (sector) Size Code Name
    Command (? for help): w
    Do you want to proceed? (Y/N): Y

    1.4 wipefs 清除磁盘标识

    作用:清空磁盘分区表、文件系统标记,用于磁盘初始化

    # 查看磁盘文件系统/分区标记
    [root@server~ 20:12:50]# wipefs /dev/sdb
    # 安全清空全部标记
    [root@server~ 20:12:58]# wipefs -a /dev/sdb
    # 强制清空(不推荐,仅紧急使用)
    [root@server~ 20:13:05]# wipefs -fa /dev/sdb

    1.5 parted 通用分区工具(兼容MBR/GPT,支持交互式+脚本免交互)

    交互式操作

    [root@server~ 20:13:20]# parted /dev/sdb
    GNU Parted 3.1
    Using /dev/sdb
    Welcome to GNU Parted! Type 'help' to view a list of commands.
    (parted) help
    align-check TYPE N check partition N for TYPE(min|opt) alignment
    help [COMMAND] print general help, or help on COMMAND
    mklabel,mktable LABEL-TYPE create a new disklabel (partition table)
    mkpart PART-TYPE [FS-TYPE] START END make a partition
    name NUMBER NAME name partition NUMBER as NAME
    print [devices|free|list,all|NUMBER] display the partition table, available devices,
    free space, all found partitions, or a particular partition
    quit exit program
    rescue START END rescue a lost partition near START and END
    resizepart NUMBER END resize partition NUMBER
    rm NUMBER delete partition NUMBER
    select DEVICE choose the device to edit
    disk_set FLAG STATE change the FLAG on selected device
    disk_toggle [FLAG] toggle the state of FLAG on selected device
    set NUMBER FLAG STATE change the FLAG on partition NUMBER
    toggle [NUMBER [FLAG]] toggle the state of FLAG on partition NUMBER
    unit UNIT set the default unit to UNIT
    version display the version number and copyright
    information of GNU Parted

    # 查看分区表
    (parted) print
    Model: VMware, VMware Virtual S (scsi)
    Disk /dev/sdb: 21.5GB
    Sector size (logical/physical): 512B/512B
    Partition Table: gpt
    Disk Flags:
    Number Start End Size File system Name Flags

    # 设定单位MiB
    (parted) unit MiB

    # 切换MBR(msdos)分区表
    (parted) mklabel msdos
    Warning: The existing disk label on /dev/sdb will be destroyed and all data on this disk will be lost. Do you want to continue?
    Yes/No? y
    (parted) print
    Partition Table: msdos

    # 创建主分区
    (parted) mkpart
    Partition type? primary/extended? primary
    File system type? [ext2]? xfs
    Start? 1
    End? 2049
    (parted) print
    Number Start End Size Type File system Flags
    1 1.00MiB 2049MiB 2048MiB primary xfs

    # 扩容分区
    (parted) resizepart 1 4097
    (parted) print
    Number Start End Size Type File system Flags
    1 1.00MiB 4097MiB 4096MiB primary xfs

    # 删除分区
    (parted) rm 1
    (parted) print

    免交互脚本操作

    # 改为MBR分区表
    [root@server~ 20:14:10]# parted /dev/sdb mklabel msdos
    Yes/No? y
    # 查看分区
    [root@server~ 20:14:18]# parted /dev/sdb unit MiB print
    # 创建2G主分区
    [root@server~ 20:14:26]# parted /dev/sdb unit MiB mkpart primary 1 2049
    # 扩容分区
    [root@server~ 20:14:35]# parted /dev/sdb unit MiB resizepart 1 5121
    # 删除分区
    [root@server~ 20:14:42]# parted /dev/sdb rm 1

    parted管理GPT磁盘

    # 切换GPT分区表
    [root@server~ 20:15:00]# parted /dev/sdb mklabel gpt
    Yes/No? y
    (parted) unit MiB
    (parted) mkpart
    Partition name? []? data01
    File system type? [ext2]? xfs
    Start? 1
    End? 2049
    (parted) print
    Number Start End Size File system Name Flags
    1 1.00MiB 2049MiB 2048MiB xfs data01

    二、文件系统永久挂载 /etc/fstab

    环境准备

    [root@server~ 20:15:30]# parted /dev/sdb mklabel gpt
    Yes/No? y
    [root@server~ 20:15:38]# parted /dev/sdb unit MiB mkpart data01 xfs 1 2049
    [root@server~ 20:15:46]# mkfs.xfs /dev/sdb1
    # 已有文件系统强制格式化
    [root@server~ 20:15:52]# mkfs.xfs -f /dev/sdb1

    /etc/fstab 六字段详解

  • 设备:UUID/设备名(推荐UUID,设备名易变动)
  • 挂载点:必须存在空目录
  • 文件系统:xfs/ext4等
  • 挂载参数:defaults通用默认参数
  • dump备份:0=不备份,1=备份
  • fsck自检:xfs固定0;根ext4填1,其他ext4填2
  • 实操配置

    # 查看分区UUID
    [root@server~ 20:16:10]# blkid /dev/sdb1
    /dev/sdb1: UUID="f5c35f10-0274-45af-b044-73694989fe01" TYPE="xfs" PARTLABEL="data01" PARTUUID="432d7d79-1a08-4429-bf38-7ab1444a0ab9"
    [root@server~ 20:16:18]# mkdir /data01
    [root@server~ 20:16:25]# vim /etc/fstab
    # 末尾追加
    UUID="f5c35f10-0274-45af-b044-73694989fe01" /data01 xfs defaults 0 0

    # 生效挂载
    [root@server~ 20:16:35]# mount /data01
    # 验证
    [root@server~ 20:16:42]# df -h /data01
    # 取消永久挂载:删除fstab对应行即可

    三、磁盘空间不足3类经典故障排查

    场景1:大文件占用空间爆满

    # 模拟塞满磁盘
    [root@server~ 20:17:00]# dd if=/dev/zero of=/myapp-1/etc/bigfile bs=1M count=2000
    # 查找超大文件
    [root@server~ 20:17:10]# find /myapp-1/ -size +100M
    [root@server~ 20:17:18]# du -s /myapp-1/* |sort -n |tail -2
    # 删除释放空间
    [root@server~ 20:17:26]# rm -f /myapp-1/etc/bigfile

    场景2:文件删除但进程占用,空间不释放

    原因:文件已删除,但进程持续占用句柄,空间不回收

    # 查找已删除占用文件
    [root@server~ 20:17:45]# lsof |grep delete |grep /myapp-1
    # 杀掉占用进程PID
    [root@server~ 20:17:52]# kill 对应PID
    # 稳妥清理:优先>清空文件,再删除
    [root@server~ 20:18:00]# > /myapp-1/etc/bigfile

    场景3:小文件过多,inode耗尽

    df-h空间充足,但无法新建文件,df-i查看inode占满

    # 查看inode使用量
    [root@server~ 20:18:15]# df -hi /myapp-2
    # 方案1:批量删除无用小文件
    [root@server~ 20:18:22]# rm -f /myapp-2/file-0*
    # 方案2:打包合并小文件释放inode

    四、RAID磁盘阵列详解与mdadm软RAID实操

    4.1 RAID基础概念

    • 硬RAID:独立阵列卡,不占用CPU,性能稳定,企业生产首选
    • 软RAID:mdadm软件实现,占用CPU,零成本,学习测试使用

    4.2 主流RAID等级对照表

    RAID级别最小磁盘数容错能力空间利用率读性能写性能适用场景
    RAID0 2 100% 极高 极高 临时高速缓存,不存重要数据
    RAID1 2 单盘损坏 50% 一般 核心数据、系统盘
    RAID5 3 单盘损坏 (n-1)/n 中高 一般 普通业务文件服务器
    RAID6 4 双盘损坏 (n-2)/n 偏低 大容量归档存储
    RAID10 4 每组单盘损坏 50% 极高 数据库、高并发业务

    4.3 mdadm 软RAID实操

    前置安装

    [root@server~ 20:19:00]# yum install -y mdadm

    实操1:RAID0 创建、查看、删除

    # 创建/dev/md0 RAID0,2块磁盘
    [root@server~ 20:19:10]# mdadm –create /dev/md0 –level 0 –raid-devices 2 /dev/sd{b,c}
    # 查看阵列概览
    [root@server~ 20:19:18]# cat /proc/mdstat
    # 详细信息
    [root@server~ 20:19:25]# mdadm –detail /dev/md0
    # 格式化挂载
    [root@server~ 20:19:32]# mkfs.xfs /dev/md0
    [root@server~ 20:19:40]# mkdir /raid/raid0 && mount /dev/md0 /raid/raid0

    # 删除RAID0
    [root@server~ 20:19:50]# umount /raid/raid0
    [root@server~ 20:19:58]# mdadm –stop /dev/md0
    [root@server~ 20:20:05]# mdadm –zero-superblock /dev/sd{b,c}
    # 限制:RAID0无法扩容、无法故障降级

    实操2:RAID1 镜像阵列、热备、故障恢复

    # 创建RAID1
    [root@server~ 20:20:20]# mdadm –create /dev/md1 –level 1 –raid-devices 2 /dev/sd{b,c}
    # 添加热备盘
    [root@server~ 20:20:30]# mdadm –add /dev/md1 /dev/sdd
    # 模拟磁盘故障
    [root@server~ 20:20:40]# mdadm –fail /dev/md1 /dev/sdc
    # 移除坏盘
    [root@server~ 20:20:48]# mdadm –remove /dev/md1 /dev/sdc
    # 销毁阵列
    [root@server~ 20:20:55]# umount /raid/raid1 && mdadm –stop /dev/md1 && mdadm –zero-superblock /dev/sd{b..d}

    实操3:RAID5 扩容、故障重建

    # 4块磁盘创建RAID5
    [root@server~ 20:21:10]# mdadm –create /dev/md5 –level 5 –raid-devices 4 /dev/sd{b..e}
    # 添加热备盘
    [root@server~ 20:21:20]# mdadm –add /dev/md5 /dev/sdf
    # 模拟故障替换磁盘
    [root@server~ 20:21:30]# mdadm –fail /dev/md5 /dev/sdb && mdadm –remove /dev/md5 /dev/sdb
    # RAID5在线扩容
    [root@server~ 20:21:40]# mdadm –add /dev/md5 /dev/sdb /dev/sdg
    [root@server~ 20:21:48]# mdadm –grow /dev/md5 –raid-devices 5
    # 文件系统扩容
    [root@server~ 20:21:58]# xfs_growfs /raid/raid5
    # 阵列销毁
    [root@server~ 20:22:05]# umount /raid/raid5 && mdadm –stop /dev/md5 && mdadm –zero-superblock /dev/sd{b..g}

    五、LVM逻辑卷管理(弹性扩容缩容核心)

    5.1 核心层级

    PV物理卷 → VG卷组(存储池) → LV逻辑卷(挂载使用)

    • PV:磁盘/分区初始化LVM标识
    • VG:多个PV合并为统一大容量存储池
    • LV:从VG划分空间,可随时扩容、缩容、快照

    5.2 基础创建流程

    # 1、创建PV
    [root@server~ 20:22:30]# pvcreate /dev/sd{b,c,d}
    [root@server~ 20:22:38]# pvs && pvdisplay

    # 2、创建VG卷组
    [root@server~ 20:22:45]# vgcreate webapp /dev/sdb
    [root@server~ 20:22:52]# vgcreate dbapp /dev/sd{c,d}
    [root@server~ 20:22:58]# vgs && vgdisplay

    # 3、创建LV逻辑卷
    [root@server~ 20:23:05]# lvcreate -n webapp01 -L 5G webapp
    [root@server~ 20:23:12]# lvcreate -n data01 -L 25G dbapp
    [root@server~ 20:23:18]# lvs && lvdisplay

    # 4、格式化挂载
    [root@server~ 20:23:25]# mkfs.xfs /dev/webapp/webapp01
    [root@server~ 20:23:32]# mount /dev/webapp/webapp01 /usr/share/nginx/html

    5.3 VG卷组扩容、缩容

    # VG扩容,新增磁盘加入卷组
    [root@server~ 20:23:45]# vgextend webapp /dev/sd{c,d}

    # VG缩容,迁移数据后移除PV
    [root@server~ 20:23:55]# pvmove /dev/sdb
    [root@server~ 20:24:02]# vgreduce webapp /dev/sdb

    5.4 LV逻辑卷扩容、缩容

    # LV扩容+自动刷新XFS文件系统
    [root@server~ 20:24:15]# lvextend -rL 20G /dev/webapp/webapp01

    # EXT4离线缩容流程
    [root@server~ 20:24:25]# umount /usr/share/nginx/html
    [root@server~ 20:24:32]# e2fsck -f /dev/webapp/webapp01
    [root@server~ 20:24:40]# resize2fs /dev/webapp/webapp01 10G
    [root@server~ 20:24:48]# lvreduce -L 10G /dev/webapp/webapp01
    [root@server~ 20:24:55]# mount /dev/webapp/webapp01 /usr/share/nginx/html
    # XFS不支持缩容,仅可扩容

    5.5 LVM快照备份

    # 创建快照(容量不小于原LV)
    [root@server~ 20:25:10]# lvcreate -s -n webapp01-snap1 -L 10G /dev/webapp/webapp01
    # 挂载快照查看历史数据
    [root@server~ 20:25:18]# mount /dev/webapp/webapp01-snap1 /webapp/snap/

    5.6 LVM RAID逻辑卷

    # 创建RAID1逻辑卷
    [root@server~ 20:25:30]# lvcreate –type raid1 -n webapp01 -L 15G webapp
    # 故障磁盘修复替换
    [root@server~ 20:25:40]# vgreduce –removemissing webapp –force
    [root@server~ 20:25:48]# vgextend webapp /dev/sdd
    [root@server~ 20:25:55]# lvconvert –repair /dev/webapp/webapp01

    5.7 全套删除清理

    [root@server~ 20:26:10]# umount /usr/share/nginx/html
    [root@server~ 20:26:18]# lvremove /dev/webapp/webapp01
    [root@server~ 20:26:25]# vgremove webapp dbapp
    [root@server~ 20:26:32]# pvremove /dev/sd{b..d}

    总结

  • 大于2T磁盘统一使用GPT+gdisk分区,日常快速分区用parted;
  • 重要数据选RAID1/RAID10,大容量存储选RAID5/6,临时高速存储用RAID0;
  • LVM是扩容刚需:XFS只扩容、EXT4可离线缩容,快照适合临时数据备份;
  • 永久挂载优先UUID写入fstab,磁盘爆满优先排查大文件、删除残留句柄、inode耗尽三类问题。
  • 赞(0)
    未经允许不得转载:网硕互联帮助中心 » 服务器磁盘扩容、数据丢失怎么办?一文吃透 Linux 分区 / 软 RAID/LVM 全实操
    分享到: 更多 (0)

    评论 抢沙发

    评论前必须登录!