磁盘与LVM管理

瑞克 0 阅读 linux服务

06 磁盘与LVM管理


目录

  1. 硬盘基础概念
  2. 分区管理:fdisk与parted
  3. 查看磁盘信息:lsblk与blkid
  4. 格式化:mkfs
  5. 挂载与卸载:mount/umount/fstab
  6. Swap交换空间管理
  7. LVM逻辑卷管理
  8. 磁盘空间排查:df与du
  9. inode排查
  10. RAID概念简介
  11. 各发行版默认文件系统差异
  12. 运维常用命令精选
  13. 趣味命令专栏

1. 硬盘基础概念

硬盘类型对比

类型全称接口速度价格类比
SATA HDD机械硬盘SATA100-200 MB/s便宜绿皮火车
SATA SSD固态硬盘(SATA)SATA500 MB/s中等动车
NVMe SSD固态硬盘(NVMe)PCIe3000-7000 MB/s较贵高铁

生活类比

🏫 类比

  • SATA HDD(机械硬盘):像老式文件柜——便宜、容量大,但找文件慢(磁头需要物理移动)
  • SSD(固态硬盘):像电子文件柜——贵一点,但找文件瞬间完成(没有机械运动)
  • NVMe SSD:像5G网络的电子文件柜——走高速通道(PCIe),速度飞快

设备命名规则

/dev/sda    —— 第一块SATA/SCSI硬盘
/dev/sda1   —— 第一块硬盘的第1个分区
/dev/sdb    —— 第二块硬盘
/dev/nvme0n1    —— 第一块NVMe硬盘
/dev/nvme0n1p1  —— NVMe硬盘的第1个分区
/dev/vda    —— 虚拟机硬盘(KVM/QEMU)

💡 想一想:为什么NVMe硬盘的设备名是 nvme0n1 而不是 sda

答案:NVMe使用PCIe总线,走的是不同于SATA的硬件通道,所以内核用不同的命名方式来区分。


2. 分区管理:fdisk与parted

问题:新买了一块硬盘,怎么在上面"划地盘"?

解决:使用 fdiskparted 进行分区。

MBR vs GPT

特性MBRGPT
最大磁盘2TB18EB
最大分区数4个主分区128个分区
分区表备份无备份有备份
推荐场景旧系统、小磁盘新系统、大磁盘
工具fdiskparted / gdisk

生活类比

🏗️ 装修类比:分区就像给毛坯房隔房间——fdisk/parted是"隔墙工具",格式化是"装修",挂载是"搬进去住"。

fdisk —— 经典分区工具(MBR)

# 查看当前分区
sudo fdisk -l

# 对/dev/sdb进行分区(交互式)
sudo fdisk /dev/sdb
# 常用命令:
# n - 新建分区
# p - 查看分区表
# d - 删除分区
# w - 保存退出
# q - 不保存退出
# t - 修改分区类型

# 示例:创建一个50GB的主分区
# 输入: n → p → 1 → Enter → +50G → w

parted —— 支持GPT的现代分区工具

# 查看分区信息
sudo parted -l

# 对/dev/sdb进行GPT分区(交互式)
sudo parted /dev/sdb
# (parted) mklabel gpt              # 创建GPT分区表
# (parted) mkpart primary ext4 0% 100%   # 创建分区
# (parted) print                    # 查看
# (parted) quit

# 非交互式创建分区
sudo parted /dev/sdb mklabel gpt
sudo parted /dev/sdb mkpart primary ext4 0% 50%
sudo parted /dev/sdb mkpart primary ext4 50% 100%
sudo parted /dev/sdb print

各发行版分区工具

工具RHEL系Debian系说明
fdisk预装预装MBR分区
parted预装预装GPT分区
gdisk需安装需安装GPT专用,交互友好
# 安装gdisk
sudo yum install -y gdisk         # RHEL系
sudo apt install -y gdisk         # Debian系

💡 想一想:什么时候用fdisk,什么时候用parted?

答案:磁盘大于2TB或需要GPT分区表时用parted/gdisk;小磁盘或旧系统用fdisk即可。现在推荐统一用parted。


3. 查看磁盘信息:lsblk与blkid

问题:不打开机箱,怎么知道服务器里有几块硬盘、怎么分区的?

解决:使用 lsblkblkid

lsblk —— 树形显示磁盘和分区

$ lsblk
NAME                  MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sda                     8:0    0  100G  0 disk
├─sda1                  8:1    0    1G  0 part /boot
├─sda2                  8:2    0   99G  0 part
│ ├─centos-root       253:0    0   50G  0 lvm  /
│ ├─centos-swap       253:1    0    4G  0 lvm  [SWAP]
│ └─centos-home       253:2    0   45G  0 lvm  /home
sdb                     8:16   0  500G  0 disk
└─sdb1                  8:17   0  500G  0 part /data

blkid —— 查看分区的UUID和文件系统类型

$ sudo blkid
/dev/sda1: UUID="a1b2c3d4-..." TYPE="xfs"
/dev/sda2: UUID="e5f6g7h8-..." TYPE="LVM2_member"
/dev/mapper/centos-root: UUID="i9j0k1l2-..." TYPE="xfs"
/dev/sdb1: UUID="m3n4o5p6-..." TYPE="ext4"

💡 提示:UUID是分区的全局唯一标识,比设备名(如/dev/sda1)更可靠——因为重启后设备名可能变化,但UUID永远不变。在fstab中推荐使用UUID。


4. 格式化:mkfs

问题:分好区了,怎么让Linux能"读写"这个分区?

解决:格式化——为分区创建文件系统。

生活类比

📐 教室类比

  • ext4 像标准的方格教室——布局传统,兼容性好
  • xfs 像多功能报告厅——擅长处理大文件,性能好
  • btrfs 像可变隔断的教室——支持快照、压缩等高级功能

常用文件系统

文件系统最大文件最大卷特点默认使用
ext416TB1EB稳定、成熟、兼容性好Ubuntu, Debian
xfs8EB8EB高性能、擅长大文件CentOS 7+, RHEL, 麒麟V10
btrfs16EB16EB快照、压缩、校验Fedora (默认)
swap--交换空间,不是文件系统所有发行版

格式化命令

# 格式化为ext4
sudo mkfs.ext4 /dev/sdb1

# 格式化为xfs
sudo mkfs.xfs /dev/sdb1

# 格式化为xfs并强制覆盖
sudo mkfs.xfs -f /dev/sdb1

# 格式化为btrfs
sudo mkfs.btrfs /dev/sdb1

# 格式化swap分区
sudo mkswap /dev/sdb2

各发行版格式化工具安装

# ext4工具(通常预装)
# xfs工具
sudo yum install -y xfsprogs      # RHEL系
sudo apt install -y xfsprogs      # Debian系

# btrfs工具
sudo yum install -y btrfs-progs   # RHEL系
sudo apt install -y btrfs-progs   # Debian系

💡 想一想:ext4和xfs应该怎么选?

答案:个人桌面/小服务器选ext4(兼容性好,工具成熟);企业级/大文件存储选xfs(性能更好,支持在线扩容)。CentOS 7+默认用xfs是有道理的。


5. 挂载与卸载:mount/umount/fstab

问题:格式化好了,怎么使用这个分区?

解决:挂载——把分区"连接"到目录树。

生活类比

🚪 门牌号类比:挂载就像给教室编门牌号——分区是物理教室,挂载点是门牌号。/data 门牌号指向sdb1这块"教室"。

临时挂载

# 创建挂载点
sudo mkdir -p /data

# 挂载分区
sudo mount /dev/sdb1 /data

# 查看挂载信息
mount | grep sdb1
# 输出:/dev/sdb1 on /data type ext4 (rw,relatime)

# 卸载(确保没有程序正在使用该目录)
sudo umount /data
# 如果提示"target is busy",先找出占用者:
lsof +D /data
fuser -mv /data

永久挂载:/etc/fstab

# 编辑fstab
sudo vim /etc/fstab

fstab格式:

# 设备                  挂载点     类型   选项           dump  fsck
UUID=a1b2c3d4-...       /boot      xfs    defaults       0     0
UUID=e5f6g7h8-...       /          xfs    defaults       0     0
UUID=m3n4o5p6-...       /data      ext4   defaults       0     0
/dev/mapper/centos-swap swap       swap   defaults       0     0
字段说明
设备推荐使用UUID(blkid查看)
挂载点目录路径
类型文件系统类型(ext4, xfs, swap等)
选项defaults=rw,suid,dev,exec,auto,nouser,async
dump是否备份(0=不备份)
fsck开机检查顺序(0=不检查,1=根分区,2=其他分区)

常用挂载选项

选项说明
defaults默认选项集合
ro只读挂载
noexec禁止执行该分区上的程序(安全措施)
noatime不更新文件访问时间(提升性能)
usrquota启用用户磁盘配额

验证fstab

# ⚠️ 修改fstab后务必测试,否则可能导致系统无法启动!
sudo mount -a              # 按fstab挂载所有设备
df -h                      # 确认挂载成功

# 如果mount -a报错,立即检查fstab!
# 常见错误:UUID写错、挂载点不存在、文件系统类型不对

⚠️ 严重警告:fstab写错可能导致系统无法启动!修改前务必备份:sudo cp /etc/fstab /etc/fstab.bak

💡 想一想:为什么fstab推荐用UUID而不是/dev/sda1?

答案:因为添加新硬盘或改变硬盘顺序后,/dev/sda可能变成/dev/sdb,但UUID永远不变,所以更可靠。


6. Swap交换空间管理

问题:内存不够用了,程序被系统杀掉了,怎么办?

解决:配置Swap交换空间——用硬盘空间模拟内存。

生活类比

📚 书桌类比:物理内存是书桌(快但有限),Swap是旁边的书架(慢但大)。书桌放不下的书先放书架,需要时再拿回来。

Swap大小建议

物理内存推荐Swap大小说明
< 2GB内存的2倍小内存必须有Swap
2-8GB与内存等大普通服务器
8-64GB4-8GB大内存可以少一些
> 64GB可选大内存服务器可以不用

创建Swap分区

# 方法一:使用分区作为Swap
sudo mkswap /dev/sdb2
sudo swapon /dev/sdb2
# 永久生效需写入fstab:
echo "UUID=xxx  swap  swap  defaults  0  0" | sudo tee -a /etc/fstab

# 方法二:使用文件作为Swap(更灵活)
sudo dd if=/dev/zero of=/swapfile bs=1M count=4096    # 创建4GB文件
sudo chmod 600 /swapfile                               # 设置权限
sudo mkswap /swapfile                                  # 格式化
sudo swapon /swapfile                                  # 启用

# 永久生效
echo "/swapfile  swap  swap  defaults  0  0" | sudo tee -a /etc/fstab

Swap管理命令

# 查看Swap使用情况
free -h
# 输出:
#               total    used    free    shared  buff/cache  available
# Mem:          7.8Gi   2.1Gi   3.2Gi    128Mi      2.5Gi      5.2Gi
# Swap:         4.0Gi     0B    4.0Gi

swapon --show
cat /proc/swaps

# 调整Swap使用策略(swappiness)
# 值越大,越积极使用Swap;值越小,越倾向于使用物理内存
cat /proc/sys/vm/swappiness       # 默认值60
sudo sysctl vm.swappiness=10      # 临时调整
echo "vm.swappiness=10" | sudo tee -a /etc/sysctl.conf   # 永久生效

# 关闭Swap(慎用,可能触发OOM Killer)
sudo swapoff -a

💡 想一想:Swap能不能替代真正的物理内存?

答案:不能。Swap速度比内存慢几百倍(即使NVMe也比内存慢),大量使用Swap会导致系统严重卡顿("抖动"现象)。Swap只是应急方案,根本解决方案是加内存。


7. LVM逻辑卷管理

问题:分区空间不够了,但硬盘又没有多余的分区,怎么办?

解决:使用LVM——一种可以动态调整大小的"虚拟磁盘"技术。

生活类比

🏫 魔法教学楼类比

  • PV(物理卷):实际的"砖块"——真实的硬盘或分区
  • VG(卷组):用砖块建成的"教学楼整体"——所有物理卷汇聚成的存储池
  • LV(逻辑卷):教学楼里的"教室"——从VG中划分出来的虚拟分区
  • 扩容:教室不够大?从教学楼的公共区域多隔一些空间进来!
┌──────────────────────────────────────────┐
│           VG (卷组: vg_data)              │
│  ┌─────────┐  ┌─────────┐               │
│  │ LV(home) │  │ LV(data) │  ← 可以动态调整大小 │
│  │  50GB   │  │  200GB  │               │
│  └─────────┘  └─────────┘               │
│                                          │
│     空闲空间: 250GB(可用于扩容任何LV)     │
│                                          │
├──────────────────────────────────────────┤
│ PV1 (/dev/sda2)  │ PV2 (/dev/sdb1)      │
│    200GB         │    300GB             │
└──────────────────────────────────────────┘

LVM核心操作

第一步:创建物理卷(PV)

# 查看现有PV
sudo pvs
sudo pvdisplay

# 创建PV(可以是整块硬盘或分区)
sudo pvcreate /dev/sdb1
sudo pvcreate /dev/sdc

第二步:创建卷组(VG)

# 查看现有VG
sudo vgs
sudo vgdisplay

# 创建VG
sudo vgcreate vg_data /dev/sdb1

# 向VG中添加新的PV(扩容VG)
sudo vgextend vg_data /dev/sdc

第三步:创建逻辑卷(LV)

# 查看现有LV
sudo lvs
sudo lvdisplay

# 创建LV(指定大小)
sudo lvcreate -L 100G -n lv_data vg_data

# 创建LV(使用VG全部剩余空间)
sudo lvcreate -l 100%FREE -n lv_backup vg_data

# 创建LV(使用VG的50%空间)
sudo lvcreate -l 50%VG -n lv_project vg_data

第四步:格式化并挂载LV

# 格式化
sudo mkfs.xfs /dev/vg_data/lv_data      # CentOS/RHEL推荐xfs
sudo mkfs.ext4 /dev/vg_data/lv_data     # Ubuntu/Debian推荐ext4

# 挂载
sudo mkdir -p /data
sudo mount /dev/vg_data/lv_data /data

# 写入fstab永久挂载
echo "/dev/vg_data/lv_data  /data  xfs  defaults  0  0" | sudo tee -a /etc/fstab

LV扩容(LVM最强大的功能)

# 查看VG剩余空间
sudo vgs

# 扩容LV(增加50GB)
sudo lvextend -L +50G /dev/vg_data/lv_data

# 扩容LV(使用VG全部剩余空间)
sudo lvextend -l +100%FREE /dev/vg_data/lv_data

# ⚠️ 扩容LV后,还需要扩展文件系统才能真正使用新空间!
# xfs扩容
sudo xfs_growfs /data                    # xfs只能扩大不能缩小

# ext4扩容
sudo resize2fs /dev/vg_data/lv_data      # ext4可以扩大也可以缩小

LV缩容(谨慎操作!)

# ⚠️ xfs不支持缩容!只有ext4支持。
# 缩容步骤(ext4):
sudo umount /data
sudo e2fsck -f /dev/vg_data/lv_data     # 检查文件系统
sudo resize2fs /dev/vg_data/lv_data 50G  # 缩小文件系统到50G
sudo lvreduce -L 50G /dev/vg_data/lv_data  # 缩小LV
sudo mount /dev/vg_data/lv_data /data

完整LVM操作示例

# 场景:新装了一块500G硬盘/dev/sdc,创建LVM并挂载到/data

# 1. 创建PV
sudo pvcreate /dev/sdc

# 2. 创建VG
sudo vgcreate vg_data /dev/sdc

# 3. 创建LV(先用200G)
sudo lvcreate -L 200G -n lv_data vg_data

# 4. 格式化并挂载
sudo mkfs.xfs /dev/vg_data/lv_data
sudo mkdir -p /data
sudo mount /dev/vg_data/lv_data /data
echo "/dev/vg_data/lv_data /data xfs defaults 0 0" | sudo tee -a /etc/fstab

# 5. 后来空间不够了,扩容!
sudo lvextend -L +100G /dev/vg_data/lv_data
sudo xfs_growfs /data

# 6. 再加一块硬盘继续扩展VG
sudo pvcreate /dev/sdd
sudo vgextend vg_data /dev/sdd
sudo lvextend -l +100%FREE /dev/vg_data/lv_data
sudo xfs_growfs /data

LVM命令速查表

操作PV命令VG命令LV命令
创建pvcreatevgcreatelvcreate
查看(简略)pvsvgslvs
查看(详细)pvdisplayvgdisplaylvdisplay
扩展-vgextendlvextend
缩小-vgreducelvreduce
删除pvremovevgremovelvremove

💡 想一想:LVM扩容后,为什么还要执行 xfs_growfsresize2fs

答案:lvextend 只扩大了"容器"(LV),但"容器里的格局"(文件系统)还没变。xfs_growfs/resize2fs 是让文件系统感知到新空间。就像教室隔墙拆了,但里面的桌椅还没重新摆放。


8. 磁盘空间排查:df与du

问题:服务器报"磁盘空间不足",怎么找出是哪个目录占用了空间?

解决:使用 df 看全局,使用 du 看细节。

df —— 磁盘使用概览

$ df -h
Filesystem               Size  Used Avail Use% Mounted on
/dev/mapper/centos-root   50G   42G  8.0G  85% /
devtmpfs                 3.9G     0  3.9G   0% /dev
tmpfs                    3.9G     0  3.9G   0% /dev/shm
/dev/sda1               1014M  178M  837M  18% /boot
/dev/mapper/centos-home   45G   28G   17G  63% /home
/dev/mapper/vg_data-lv   200G  150G   50G  76% /data

常用选项:

df -h                    # 人类可读的单位(GB/MB)
df -i                    # 查看inode使用情况(后面详讲)
df -hT                   # 同时显示文件系统类型
df -h /data              # 只看某个挂载点

du —— 深入查看目录大小

# 查看当前目录各子目录大小
du -sh *
# 输出示例:
# 2.3G    backup
# 156M    logs
# 12K     scripts
# 45G     data

# 查看指定目录
du -sh /var/log

# 查看前10大目录
du -sh /var/* | sort -rh | head -10

# 递归查看到第2层
du -h --max-depth=2 /data | sort -rh | head -20

# 只看目录不看文件
du -h --max-depth=1 /data | sort -rh

磁盘空间排查实战

# 场景:/分区使用率已达90%,如何排查?

# 第一步:看全局
df -h /
# /dev/mapper/centos-root  50G  45G  5G  90% /

# 第二步:找大目录
du -sh /* 2>/dev/null | sort -rh | head -10
# 25G   /var
# 10G   /usr
# 5G    /opt
# 3G    /home

# 第三步:深入/var
du -sh /var/* | sort -rh | head -10
# 20G   /var/log
# 3G    /var/lib
# 1G    /var/cache

# 第四步:深入/var/log
du -sh /var/log/* | sort -rh | head -10
# 15G   /var/log/journal
# 3G    /var/log/nginx
# 1G    /var/log/messages

# 第五步:解决问题
# 清理journal日志
sudo journalctl --vacuum-size=1G
# 清理旧nginx日志
sudo find /var/log/nginx -name "*.gz" -mtime +30 -delete
# 截断大日志文件(不删除文件,只清空内容)
sudo truncate -s 0 /var/log/nginx/access.log

💡 想一想dudf 显示的已用空间不一样,为什么?

答案:可能原因:1)有文件被删除但进程仍持有文件句柄(空间未释放);2)df显示的是文件系统的分配空间,du统计的是实际文件大小。用 lsof +L1 可以查看已删除但未释放的文件。

已删除但未释放空间的排查

# 查找被删除但仍被进程占用的文件
lsof +L1
# 或者
lsof | grep deleted

# 解决方法:重启持有该文件的进程
kill -HUP <PID>
# 或
systemctl restart <服务名>

9. inode排查

问题:df -h 显示磁盘空间充足,但创建文件时报"No space left on device"?

解决:可能是 inode耗尽 了。

生活类比

📋 花名册类比:inode就像学生的花名册——每个文件需要一个inode条目。如果花名册用完了(小文件太多),即使教室还有空位(磁盘空间充足),也不能再安排新学生(创建新文件)了。

什么是inode?

  • 每个文件/目录在Linux中都有一个inode(索引节点)
  • inode存储文件的元信息:权限、所有者、时间戳、数据块位置
  • 文件系统在创建时就确定了inode总数
  • 每个文件消耗一个inode,与文件大小无关
# 查看inode使用情况
df -i
# 输出:
# Filesystem              Inodes  IUsed   IFree IUse% Mounted on
# /dev/mapper/centos-root 3276800 3100000 176800  95% /
# 95%的inode已用完!

# 找出哪个目录的文件最多(inode最多)
sudo find / -xdev -printf '%h\n' | sort | uniq -c | sort -rn | head -20

# 或者
for i in /*; do echo $i; find $i | wc -l; done | sort -rn | head -20

# 常见的inode杀手:
# - /var/spool/postfix/maildrop(邮件队列堆积)
# - /tmp(临时文件未清理)
# - /var/lib/php/sessions(PHP会话文件)
# - 大量小日志文件

inode问题解决

# 清理邮件队列
sudo find /var/spool/postfix/maildrop -type f -delete

# 清理PHP过期会话
sudo find /var/lib/php/sessions -type f -mtime +1 -delete

# 清理tmp目录(谨慎!)
sudo find /tmp -type f -mtime +7 -delete

💡 想一想:一个空文件占不占inode?占不占磁盘空间?

答案:空文件占1个inode(因为它是文件系统中的一个条目),但几乎不占数据块空间(只有目录项的少量字节)。这就是为什么小文件太多会耗尽inode而不一定耗尽空间。


10. RAID概念简介

问题:一块硬盘坏了数据就全丢了,怎么防止这种灾难?

解决:使用RAID——多块硬盘协同工作,提供冗余保护。

生活类比

📝 作业备份类比

  • RAID 0 = 一份作业撕成两半,分两个书包放——速度快但任一书包丢了就全完了
  • RAID 1 = 作业复印两份,放两个书包——安全但浪费空间
  • RAID 5 = 三份作业加一份校验码——允许丢一份后恢复
  • RAID 10 = 先复印再分条——既安全又快

RAID级别对比

级别最少磁盘可用容量容错读写性能适用场景
RAID 02N × 单盘读写最快临时数据、缓存
RAID 12单盘容量1盘读快写慢系统盘、重要数据
RAID 53(N-1) × 单盘1盘读快写中通用存储
RAID 64(N-2) × 单盘2盘读快写慢大容量存储
RAID 104N/2 × 单盘1盘/组读写都快数据库、高性能

使用mdadm创建软件RAID

# 安装mdadm
sudo yum install -y mdadm         # RHEL系
sudo apt install -y mdadm         # Debian系

# 创建RAID 1(镜像)
sudo mdadm --create /dev/md0 --level=1 --raid-devices=2 /dev/sdb /dev/sdc

# 创建RAID 5
sudo mdadm --create /dev/md1 --level=5 --raid-devices=3 /dev/sdb /dev/sdc /dev/sdd

# 查看RAID状态
cat /proc/mdstat
sudo mdadm --detail /dev/md0

# 格式化并使用
sudo mkfs.xfs /dev/md0
sudo mount /dev/md0 /raid_data

# 保存RAID配置
sudo mdadm --detail --scan | sudo tee -a /etc/mdadm.conf    # RHEL系
sudo mdadm --detail --scan | sudo tee -a /etc/mdadm/mdadm.conf  # Debian系

模拟磁盘故障

# 标记一块盘为故障
sudo mdadm --manage /dev/md0 --fail /dev/sdc

# 移除故障盘
sudo mdadm --manage /dev/md0 --remove /dev/sdc

# 添加新盘替换
sudo mdadm --manage /dev/md0 --add /dev/sde
# 自动重建中...
cat /proc/mdstat    # 查看重建进度

💡 想一想:软件RAID和硬件RAID有什么区别?

答案:软件RAID由操作系统管理(mdadm),免费但消耗CPU;硬件RAID由专用RAID卡管理,性能好、不消耗CPU,但需要额外购买硬件。生产环境通常使用硬件RAID。


11. 各发行版默认文件系统差异

对比总表

发行版默认文件系统默认LVM说明
CentOS 7xfs✅ 是从ext4转向xfs
CentOS 8 / Streamxfs✅ 是延续xfs
RHEL 7/8/9xfs✅ 是企业级标准
Fedora 33+btrfs❌ 否转向btrfs(实验性)
麒麟V10xfs✅ 是继承CentOS/RHEL传统
Ubuntu 20.04+ext4✅ 是(可选)稳定为主
Ubuntu 22.04+ext4✅ 可选也支持zfs(实验)
Debian 11/12ext4✅ 可选最保守的选择
Kali Linuxext4❌ 否基于Debian

xfs vs ext4 选择指南

场景推荐原因
系统根分区(CentOS/RHEL)xfs发行版默认,优化最好
系统根分区(Ubuntu/Debian)ext4发行版默认,工具最成熟
大文件存储(视频/数据库)xfs大文件性能更好
大量小文件(邮件/Web)ext4小文件处理更优
需要在线缩容ext4xfs不支持缩容
数据分区(通用)跟随系统默认减少运维复杂度

💡 想一想:麒麟V10为什么选择xfs而不是ext4?

答案:麒麟V10基于CentOS/RHEL技术路线,继承了xfs作为默认文件系统的选择。xfs在企业级场景下表现更好——支持更大的文件和分区,在线扩容性能优异。


12. 运维常用命令精选

以下是磁盘与存储管理的日常必备操作速查。

磁盘健康检查

# 查看硬盘SMART信息(需要smartmontools)
sudo yum install -y smartmontools      # RHEL系
sudo apt install -y smartmontools      # Debian系

sudo smartctl -a /dev/sda              # 查看完整信息
sudo smartctl -H /dev/sda              # 快速健康检查
# 输出:SMART overall-health self-assessment test result: PASSED

# 运行短自检(约2分钟)
sudo smartctl -t short /dev/sda

# 运行长自检(可能需要数小时)
sudo smartctl -t long /dev/sda

磁盘IO性能测试

# 安装fio
sudo yum install -y fio           # RHEL系
sudo apt install -y fio           # Debian系

# 随机读测试
sudo fio --name=randread --ioengine=libaio --direct=1 --bs=4k \
  --numjobs=4 --size=1G --rw=randread --runtime=60 --group_reporting

# 顺序写测试
sudo fio --name=seqwrite --ioengine=libaio --direct=1 --bs=1m \
  --numjobs=1 --size=1G --rw=write --runtime=60 --group_reporting

# 简单的dd测试(不精确但方便)
dd if=/dev/zero of=/tmp/testfile bs=1M count=1024 oflag=direct

LVM快速诊断

# 一键查看所有LVM信息
echo "=== PV ===" && pvs && echo "=== VG ===" && vgs && echo "=== LV ===" && lvs

# 或者使用更详细的显示
sudo pvdisplay && sudo vgdisplay && sudo lvdisplay

# 查看VG剩余空间百分比
vgs -o vg_name,vg_size,vg_free --units g

磁盘空间巡检脚本

#!/bin/bash
# 磁盘巡检脚本:自动报告磁盘和inode使用情况

echo "========== 磁盘使用报告 =========="
echo "日期:$(date '+%Y-%m-%d %H:%M:%S')"
echo ""

echo "--- 磁盘空间 ---"
df -hT | awk 'NR==1 || $6 > 80 {print}'
# 只显示表头和使用率>80%的行

echo ""
echo "--- inode使用 ---"
df -iT | awk 'NR==1 || $6 > 80 {print}'

echo ""
echo "--- 各目录空间占用TOP10 ---"
du -sh /* 2>/dev/null | sort -rh | head -10

echo ""
echo "--- 大文件TOP20(>100MB) ---"
find / -xdev -type f -size +100M -exec ls -lh {} \; 2>/dev/null | \
  awk '{print $5, $9}' | sort -rh | head -20

echo "=================================="

各发行版磁盘命令对照总表

操作RHEL系Debian系通用
查看磁盘lsblklsblk
分区(MBR)fdiskfdisk
分区(GPT)partedparted
格式化为xfsmkfs.xfs(预装)mkfs.xfs(需安装xfsprogs)命令一致
格式化为ext4mkfs.ext4(预装)mkfs.ext4(预装)
挂载mountmount
LVMlvm2(预装)lvm2(可选安装)命令一致
RAIDmdadm(需安装)mdadm(需安装)命令一致
磁盘空间df -hdf -h
目录大小du -shdu -sh

13. 趣味命令专栏

磁盘管理也可以很有趣!

📊 ncdu —— 交互式磁盘空间分析器

# 安装
sudo yum install -y ncdu          # RHEL系(需EPEL)
sudo apt install -y ncdu          # Debian系

# 运行(可以像文件管理器一样浏览目录大小)
ncdu /
# 用方向键浏览,Enter进入目录,d删除,q退出
# 比 du -sh 直观100倍!

🎨 neofetch —— 终端系统信息卡片

# 安装
sudo yum install -y neofetch      # RHEL系(需EPEL)
sudo apt install -y neofetch      # Debian系

# 运行
neofetch
# 输出漂亮的ASCII Logo和系统信息,包括磁盘使用情况!
# 每种发行版有不同的Logo,可以收集看看。

💾 baobab —— 图形化磁盘使用分析

# 安装
sudo apt install -y baobab        # Debian系
sudo yum install -y baobab        # RHEL系

# 运行(需要图形界面)
baobab
# 用彩色饼图展示磁盘空间使用,非常直观!
# 适合给同学们演示磁盘空间分布。

📐 bc —— 终端计算器

# 交互式计算
bc
# 输入:
# 1024*1024*1024
# 1073741824
# 
# 2^10
# 1024
#
# scale=2; 500/3
# 166.66

# 磁盘单位换算
echo "scale=2; 500*1024/1000" | bc
# 输出:512.00  (500GB = 512GiB? 来算算看!)

# 计算磁盘RAID 5可用容量
echo "scale=2; (4-1)*500" | bc
# 输出:1500  (4块500G盘做RAID5,可用1500G)

🗂️ tree —— 以树形结构显示目录

# 安装
sudo yum install -y tree          # RHEL系
sudo apt install -y tree          # Debian系

# 查看目录结构
tree /etc/lvm
# 输出:
# /etc/lvm
# ├── archive
# │   ├── centos_00000.vg
# │   └── centos_00001.vg
# ├── backup
# │   └── centos
# ├── lvm.conf
# └── profile
#     └── cache-mq.profile

# 限制深度
tree -L 2 /var

# 只显示目录
tree -d /opt

# 显示文件大小
tree -sh /data

🔄 dd —— 磁盘拷贝与测试

# 创建指定大小的测试文件
dd if=/dev/zero of=/tmp/testfile bs=1M count=100
# 创建了一个100MB的文件

# 测试磁盘写入速度
dd if=/dev/zero of=/tmp/testfile bs=1M count=1024 oflag=direct 2>&1
# 输出最后一行:1073741824 bytes (1.1 GB) copied, 2.3 s, 467 MB/s

# 备份分区表
sudo dd if=/dev/sda of=/tmp/sda-mbr.bak bs=512 count=1

# 安全擦除磁盘(慎用!)
sudo dd if=/dev/urandom of=/dev/sdX bs=4M status=progress
# ⚠️ 这个命令会永久擦除磁盘数据,无法恢复!

🎲 hexdump —— 查看文件的十六进制内容

# 查看MBR(前512字节)
sudo hexdump -C /dev/sda | head -32

# 查看文件头部
hexdump -C /bin/ls | head -16
# 可以看到ELF文件头!就像用显微镜观察文件的"细胞结构"。

本章小结

主题核心命令一句话记忆
硬盘类型SATA/SSD/NVMe绿皮车/动车/高铁
分区fdisk / parted给硬盘"隔房间"
查看磁盘lsblk / blkid硬盘的"全家福"
格式化mkfs.ext4 / mkfs.xfs给分区"装修"
挂载mount / fstab给分区"编门牌号"
Swapswapon / swapoff内存不够,硬盘来凑
LVMpvcreate/vgcreate/lvcreate魔法教学楼
空间排查df -h / du -sh从全局到细节
inodedf -i花名册也会用完
RAIDmdadm多盘协作保平安