Linux 磁盘扩容实战案例:从问题发现到完美解决

Linux 磁盘扩容实战案例:从问题发现到完美解决

案例背景

某企业服务器根目录 (/) 空间不足,运维人员通过 df -h 发现 /dev/vda1 分区已 100% 占满(99G 已用)。检查发现物理磁盘 /dev/vda 已扩展至 200G,但分区和文件系统未完全扩展,导致 df -hlsblk 输出不一致。本文档记录从问题排查、触发、发现到成功扩容的详细过程,包括具体命令、输入输出及问题原因分析。

初始状态检查

1. 磁盘空间查看

运行以下命令检查磁盘使用情况:

df -h

初始输出:

文件系统        容量  已用  可用 已用% 挂载点
devtmpfs        7.5G     0  7.5G    0% /dev
tmpfs           7.5G     0  7.5G    0% /dev/shm
tmpfs           7.5G  267M  7.2G    4% /run
tmpfs           7.5G     0  7.5G    0% /sys/fs/cgroup
/dev/vda1        99G   99G     0  100% /

分析:根分区 /dev/vda1 已满(99G 已用,0 可用),需扩容。

2. 检查磁盘和分区情况

运行以下命令查看磁盘和分区信息:

lsblk
fdisk -l /dev/vda

输出:

[root@master ~]# lsblk
NAME   MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
vda    253:0    0  200G  0 disk 
└─vda1 253:1    0  100G  0 part /[root@master ~]# fdisk -l /dev/vda
磁盘 /dev/vda:214.7 GB, 214748364800 字节,419430400 个扇区
Units = 扇区 of 1 * 512 = 512 bytes
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节
磁盘标签类型:dos
磁盘标识符:0x000c4c7a设备 Boot      Start         End      Blocks   Id  System
/dev/vda1   *        2048   209715166   104856559+  83  Linux

分析

  • 磁盘 /dev/vda 大小:200GB(214.7 GB)。
  • 分区 /dev/vda1 大小:100GB,挂载点为 /
  • 分区表类型:MBR(dos)。
  • 起始扇区:2048(扩容时必须保持一致)。
  • 分区未使用磁盘全部空间,需扩展分区和文件系统。

3. 检查文件系统类型

运行以下命令确认文件系统类型:

df -Th /

输出:

文件系统       类型     1K-块      已用  可用 已用% 挂载点
/dev/vda1      ext4 103080204 103063820     0  100% /

分析:文件系统为 ext4,后续扩展将使用 resize2fs

问题触发:分区扩展未同步文件系统

触发步骤

为解决磁盘空间不足问题,运维人员尝试扩展 /dev/vda1 分区以使用 /dev/vda 的全部 200G 空间。以下操作触发了 df -hlsblk 不一致的问题:

1. 扩展底层磁盘
  • 操作:在云服务器控制台(如阿里云、AWS)或虚拟机管理器(如 KVM、VMware)将 /dev/vda 从 100G 扩展到 200G。

  • 命令:使系统识别新磁盘大小:

    echo "- - -" > /sys/class/scsi_device/<device>/device/rescan
    

    <device> 替换为实际设备,例如 2:0:0:0,可通过 ls /sys/class/scsi_device/ 查看。)

  • 验证

    lsblk
    

    输出:

    NAME   MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
    vda    253:0    0  200G  0 disk 
    └─vda1 253:1    0  100G  0 part /
    

    分析:磁盘 /dev/vda 已扩展到 200G,但分区 /dev/vda1 仍为 100G。

2. 扩展分区

使用 fdisk 扩展 /dev/vda1 分区:

fdisk /dev/vda

交互过程:

欢迎使用 fdisk (util-linux 2.23.2)。
更改将停留在内存中,直到您决定写入磁盘。
使用写入命令前请谨慎。命令(输入 m 获取帮助): d
选定分区 1命令(输入 m 获取帮助): n
分区类型p   主分区 (0个主分区,0个扩展分区,4空闲)e   扩展分区
选择 (默认 p): p
分区号 (1-4, 默认 1): 1
第一个扇区 (2048-419430399, 默认 2048): 2048
Last sector, +sectors or +size{K,M,G,T,P} (2048-419430399, 默认 419430399): [直接回车]命令(输入 m 获取帮助): p
磁盘 /dev/vda:214.7 GB, 214748364800 字节,419430400 个扇区
...设备 Boot      Start         End      Blocks   Id  System
/dev/vda1            2048   419430399   209714176   83  Linux命令(输入 m 获取帮助): w
分区表已调整。
正在同步磁盘。
3. 使分区表生效

运行以下命令通知内核更新分区表:

partprobe /dev/vda

若提示分区正在使用,则重启:

reboot
4. 验证分区扩展

检查分区是否扩展:

lsblk

输出:

NAME   MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
vda    253:0    0  201G  0 disk 
└─vda1 253:1    0  201G  0 part /

分析:分区 /dev/vda1 已扩展到 201G,但未扩展文件系统。

问题原因

  • 分区扩展完成:通过 fdisk 扩展了 /dev/vda1 分区,lsblk 显示新分区大小(201G)。
  • 文件系统未扩展:文件系统仍基于旧分区大小(99G),未同步到新分区大小,导致 df -h 显示容量未变化。
  • 机制差异lsblk 显示分区大小(底层块设备),而 df -h 显示文件系统大小,两者未同步是常见问题。

问题发现:df -hlsblk 不一致

在完成分区扩展后,运行以下命令发现问题:

df -h
lsblk

输出:

[root@master ~]# df -h
文件系统        容量  已用  可用 已用% 挂载点
devtmpfs        7.5G     0  7.5G    0% /dev
tmpfs           7.5G     0  7.5G    0% /dev/shm
tmpfs           7.5G  5.3M  7.5G    1% /run
tmpfs           7.5G     0  7.5G    0% /sys/fs/cgroup
/dev/vda1        99G   78G   17G   83% /[root@master ~]# lsblk
NAME   MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
vda    253:0    0  201G  0 disk 
└─vda1 253:1    0  201G  0 part /

问题

  • lsblk 显示 /dev/vda1 为 201G,说明分区扩展成功。
  • df -h 显示 /dev/vda1 仍为 99G,说明文件系统未扩展。
    结论:需扩展文件系统以匹配分区大小。

解决方案

1. 备份数据

扩容操作可能导致数据丢失,强烈建议备份:

rsync -a / /mnt/backup

注意:确保备份完整后再继续。

2. 检查文件系统完整ity

在扩展文件系统前,检查 ext4 文件系统:

e2fsck -f /dev/vda1

注意:根分区无法直接卸载,若需检查,进入单用户模式:

init 1
e2fsck -f /dev/vda1
init 5

预期输出:

e2fsck 1.42.9 (28-Dec-2013)
/dev/vda1: clean, 123456/6553600 files, 26211839/26211839 blocks

3. 扩展文件系统

确认文件系统类型:

df -Th / | awk '{print $2}' | tail -n 1

输出:

ext4

扩展 ext4 文件系统:

resize2fs /dev/vda1

预期输出:

resize2fs 1.42.9 (28-Dec-2013)
Resizing the filesystem on /dev/vda1 to 52428544 (4k) blocks.
The filesystem on /dev/vda1 is now 52428544 blocks long.

4. 验证扩容结果

运行以下命令确认扩容效果:

lsblk | grep vda1
df -h / | grep vda1

预期输出:

└─vda1 253:1    0  201G  0 part /
/dev/vda1       201G   78G  123G   39% /

常见问题

  • df -h 未更新,重新挂载:

    mount -o remount /
    df -h
    

    预期输出:

    /dev/vda1       201G   78G  123G   39% /
    
  • resize2fs 报错 The filesystem is already XXXX blocks long

    • 文件系统已自动扩展,重新挂载即可。

5. 解决 yum 安装问题(附加)

尝试安装 cloud-utils-growpart 时,遇到 RPM 数据库错误:

错误:db5 错误(11) 来自 dbenv->open:资源暂时不可用
错误:无法使用 db5 - 资源暂时不可用 (11) 打开 Packages 索引

解决步骤

  1. 删除 RPM 锁文件:

    rm -f /var/lib/rpm/__db*
    
  2. 重建 RPM 数据库:

    rpm --rebuilddb
    

    预期输出:

    [无错误输出]
    
  3. 清理 yum 缓存:

    yum clean all
    
  4. 安装 cloud-utils-growpart

    yum install -y cloud-utils-growpart
    

    预期输出:

    Installed:cloud-utils-growpart.x86_64 0.31-1.el7
    Complete!
    

使用 growpart 扩展分区(可选)

growpart /dev/vda 1
resize2fs /dev/vda1

预期输出:

CHANGED: partition=1 start=2048 old: size=209713119 end=209715167 new: size=419426303 end=419430399

注意事项

  • 备份优先:任何磁盘操作前必须备份数据。

  • 起始扇区:重建分区时,起始扇区必须为 2048,否则数据会丢失。

  • 分区表类型:本案例为 MBR 分区表,若为 GPT,建议使用 parted

    parted /dev/vda
    
  • 云服务器:确保磁盘已在云平台控制台扩展。

  • 文件系统缓存:若 df -h 未更新,重新挂载:

    mount -o remount /
    
  • 救援模式:若误操作导致系统无法启动,使用 Live CD/USB 修复。

总结

通过 df -hlsblk 发现分区扩展未同步文件系统的问题,确认问题源于使用 fdisk 扩展分区后未执行文件系统扩展。使用 resize2fs 扩展 ext4 文件系统,最终使根分区容量从 99G 扩展到 201G,解决了空间不足问题。文档详细记录了命令、输入输出、问题原因及解决步骤,确保运维人员可安全复现扩容操作。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/906453.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

深入解析FramePack:高效视频帧打包技术原理与实践

摘要 本文深入探讨FramePack技术在视频处理领域的核心原理&#xff0c;解析其在不同场景下的应用优势&#xff0c;并通过OpenCV代码示例演示具体实现方法&#xff0c;为开发者提供可落地的技术解决方案。 目录 1. FramePack技术背景 2. 核心工作原理剖析 3. 典型应用场景 …

RVTools 官网遭入侵,被用于分发携带 Bumblebee 恶意软件的篡改安装包

VMware 环境报告工具 RVTools 的官方网站遭黑客入侵&#xff0c;其安装程序被植入恶意代码。安全研究人员 Aidan Leon 发现&#xff0c;从该网站下载的受感染安装程序会侧加载一个恶意 DLL 文件&#xff0c;经确认是已知的 Bumblebee 恶意软件加载器。 官方回应与风险提示 RV…

mysql故障排查与环境优化

一、mysql运行原理 mysql的运行分为三层 客户端和连接服务 核心服务功能&#xff08;sql接口、缓存的查询、sql的分析和优化以及部分内置函数的执行等。&#xff09; 存储引擎层&#xff08;负责mysql中数据的存储和提取。&#xff09; 二、示例 1、实验环…

Codex与LangChain结合的智能代理架构:重塑软件开发的未来

🔥「炎码工坊」技术弹药已装填! 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 引言:当代码生成遇见智能决策 想象以下场景: 凌晨三点:你需要紧急修复一个遗留系统的内存泄漏漏洞,但代码注释缺失且逻辑复杂; 产品经理需求变更:要求在24小时内将现有…

【开源Agent框架】CAMEL:角色扮演+任务分解

一、项目概览:重新定义智能体协作范式 CAMEL(Communicative Agents for “Mind” Exploration of Large Language Model Society)是由camel-ai社区开发的开源多智能体框架,致力于探索智能体的规模法则(Scaling Laws)。该项目通过构建包含百万级智能体的复杂社会系统,研…

第32节:基于ImageNet预训练模型的迁移学习与微调

1. 引言 在深度学习领域,迁移学习(Transfer Learning)已经成为解决计算机视觉任务的重要方法,特别是在数据量有限的情况下。其中,基于ImageNet数据集预训练的模型因其强大的特征提取能力而被广泛应用于各种视觉任务。本文将详细介绍迁移学习的概念、ImageNet预训练模型的特…

celery独立部署接入数据库配置

目录结构&#xff1a; config下配置&#xff1a; __init__: import os import sys sys.path.append(os.getcwd()) from celery import CeleryappCelery(celeryTester) # 创建一个Celery实例&#xff0c;名字自定义 app.config_from_object(config.celery_config) # 从celery_…

攻防世界-题目名称-文件包含

进入环境 看到 include()&#xff0c;想到文件包含&#xff0c;用php伪协议 /?filenamephp://filter/readconvert.base64-encode/resourceflag.php do not hack!猜测可能是黑名单检测的敏感字符 输入单个字符串/?filenamebase64 还是显示do not hack&#xff01; 构造payl…

MySQL高频面试八连问(附场景化解析)

文章目录 "为什么订单查询突然变慢了&#xff1f;"——从这个问题开始说起一、索引的生死时速&#xff08;必考题&#xff01;&#xff09;二、事务的"套娃"艺术三、锁机制的相爱相杀四、存储引擎的抉择五、慢查询的破案技巧六、分页的深度优化七、高可用架…

Android 中 自定义生成的 APK/AAR 文件名称

在 Kotlin DSL 中&#xff0c;可以通过配置 build.gradle.kts 文件来自定义生成的 APK 或 AAR 文件名称。 1、自定义 APK 名称 在模块的 build.gradle.kts 中通过修改 applicationVariants.all 配置来实现。 android {......applicationVariants.all {outputs.all {val df …

《从零开始:Spring Cloud Eureka 配置与服务注册全流程》​

关于Eureka的学习&#xff0c;主要学习如何搭建Eureka&#xff0c;将order-service和product-service都注册到Eureka。 1.为什么使用Eureka? 我在实现一个查询订单功能时&#xff0c;希望可以根据订单中productId去获取对应商品的详细信息&#xff0c;但是产品服务和订单服…

鸿蒙开发进阶:深入解析ArkTS语言特性与高性能编程实践

一、前言 在鸿蒙生态蓬勃发展的当下&#xff0c;开发者对于高效、优质的应用开发语言需求愈发迫切。ArkTS 作为鸿蒙应用开发的核心语言&#xff0c;在继承 TypeScript 优势的基础上&#xff0c;进行了诸多优化与扩展&#xff0c;为开发者带来了全新的编程体验。本文将深入剖析…

ARM-Linux 完全入门

1.准备部分 1.1 虚拟机安装 准备VMware软件、ubuntu系统镜像安装过程 VMware安装 破解&#xff08;自己百度破解码&#xff0c;多试几个网址&#xff0c;会有能用的&#xff09;Ubuntu安装 配置联网 桥接 虚拟机Ubuntu系统必须能连接到外网&#xff0c;不然不能更新软件安装…

深度学习驱动下的目标检测技术:原理、算法与应用创新(三)

五、基于深度学习的目标检测代码实现 5.1 开发环境搭建 开发基于深度学习的目标检测项目&#xff0c;首先需要搭建合适的开发环境&#xff0c;确保所需的工具和库能够正常运行。以下将详细介绍 Python、PyTorch 等关键开发工具和库的安装与配置过程。 Python 是一种广泛应用于…

致敬经典 << KR C >> 之打印输入单词水平直方图和以每行一个单词打印输入 (练习1-12和练习1-13)

1. 前言 不知道有多少同学正在自学C/C, 无论你是一个在校学生, 还是已经是上班族. 如果你想从事或即将从事软件开发这个行业, C/C都是一个几乎必须要接触的系统级程序开发语言. 虽然现在有Rust更安全的系统级编程语言作为C/C的替代, 但作为入门, C应该还是要好好学的. C最早由B…

【Leetcode 每日一题】3355. 零数组变换 I

问题背景 给定一个长度为 n n n 的整数数组 n u m s nums nums 和一个二维数组 q u e r i e s queries queries&#xff0c;其中 q u e r i e s [ i ] [ l i , r i ] queries[i] [l_i, r_i] queries[i][li​,ri​]。 对于每个查询 q u e r i e s [ i ] queries[i] quer…

[java八股文][Java虚拟机面试篇]垃圾回收

什么是Java里的垃圾回收&#xff1f;如何触发垃圾回收&#xff1f; 垃圾回收&#xff08;Garbage Collection, GC&#xff09;是自动管理内存的一种机制&#xff0c;它负责自动释放不再被程序引用的对象所占用的内存&#xff0c;这种机制减少了内存泄漏和内存管理错误的可能性…

ubuntu服务器版启动卡在start job is running for wait for...to be Configured

目录 前言 一、原因分析 二、解决方法 总结 前言 当 Ubuntu 服务器启动时&#xff0c;系统会显示类似 “start job is running for wait for Network to be Configured” 或 “start job is running for wait for Plymouth Boot Screen Service” 等提示信息&#xff0c;并且…

Android 手写签名功能详解:从原理到实践

Android 手写签名功能详解 1. 引言2. 手写签名核心实现&#xff1a;SignatureView 类3. 交互层实现&#xff1a;MainActivity 类4. 布局与配置5. 性能优化与扩展方向 1. 引言 在电子政务、金融服务等移动应用场景中&#xff0c;手写签名功能已成为提升用户体验与业务合规性的关…

【nRF9160 常用prj.conf配置与AT指令介绍】

参考资料&#xff1a; 技术讨论&#xff1a;Q群&#xff1a;542294007 nRF91 NCS SDK安装工具与SDK安装包等常用软件下载地址 云盘下载&#xff1a;pan.olib.cn 一、nRF9160 常用prj.conf配置介绍 nRF9160通过prj.conf配置网络模式为&#xff1a;CAT-M模式 CONFIG_LTE_NETWOR…