磁盘与LVM管理
06 磁盘与LVM管理
目录
- 硬盘基础概念
- 分区管理:fdisk与parted
- 查看磁盘信息:lsblk与blkid
- 格式化:mkfs
- 挂载与卸载:mount/umount/fstab
- Swap交换空间管理
- LVM逻辑卷管理
- 磁盘空间排查:df与du
- inode排查
- RAID概念简介
- 各发行版默认文件系统差异
- 运维常用命令精选
- 趣味命令专栏
1. 硬盘基础概念
硬盘类型对比
| 类型 | 全称 | 接口 | 速度 | 价格 | 类比 |
|---|---|---|---|---|---|
| SATA HDD | 机械硬盘 | SATA | 100-200 MB/s | 便宜 | 绿皮火车 |
| SATA SSD | 固态硬盘(SATA) | SATA | 500 MB/s | 中等 | 动车 |
| NVMe SSD | 固态硬盘(NVMe) | PCIe | 3000-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
问题:新买了一块硬盘,怎么在上面"划地盘"?
解决:使用 fdisk 或 parted 进行分区。
MBR vs GPT
| 特性 | MBR | GPT |
|---|---|---|
| 最大磁盘 | 2TB | 18EB |
| 最大分区数 | 4个主分区 | 128个分区 |
| 分区表备份 | 无备份 | 有备份 |
| 推荐场景 | 旧系统、小磁盘 | 新系统、大磁盘 |
| 工具 | fdisk | parted / 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
问题:不打开机箱,怎么知道服务器里有几块硬盘、怎么分区的?
解决:使用 lsblk 和 blkid。
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 像可变隔断的教室——支持快照、压缩等高级功能
常用文件系统
| 文件系统 | 最大文件 | 最大卷 | 特点 | 默认使用 |
|---|---|---|---|---|
| ext4 | 16TB | 1EB | 稳定、成熟、兼容性好 | Ubuntu, Debian |
| xfs | 8EB | 8EB | 高性能、擅长大文件 | CentOS 7+, RHEL, 麒麟V10 |
| btrfs | 16EB | 16EB | 快照、压缩、校验 | 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-64GB | 4-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命令 |
|---|---|---|---|
| 创建 | pvcreate | vgcreate | lvcreate |
| 查看(简略) | pvs | vgs | lvs |
| 查看(详细) | pvdisplay | vgdisplay | lvdisplay |
| 扩展 | - | vgextend | lvextend |
| 缩小 | - | vgreduce | lvreduce |
| 删除 | pvremove | vgremove | lvremove |
💡 想一想:LVM扩容后,为什么还要执行
xfs_growfs或resize2fs?答案:
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
💡 想一想:
du和df显示的已用空间不一样,为什么?答案:可能原因: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 0 | 2 | N × 单盘 | 无 | 读写最快 | 临时数据、缓存 |
| RAID 1 | 2 | 单盘容量 | 1盘 | 读快写慢 | 系统盘、重要数据 |
| RAID 5 | 3 | (N-1) × 单盘 | 1盘 | 读快写中 | 通用存储 |
| RAID 6 | 4 | (N-2) × 单盘 | 2盘 | 读快写慢 | 大容量存储 |
| RAID 10 | 4 | N/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 7 | xfs | ✅ 是 | 从ext4转向xfs |
| CentOS 8 / Stream | xfs | ✅ 是 | 延续xfs |
| RHEL 7/8/9 | xfs | ✅ 是 | 企业级标准 |
| Fedora 33+ | btrfs | ❌ 否 | 转向btrfs(实验性) |
| 麒麟V10 | xfs | ✅ 是 | 继承CentOS/RHEL传统 |
| Ubuntu 20.04+ | ext4 | ✅ 是(可选) | 稳定为主 |
| Ubuntu 22.04+ | ext4 | ✅ 可选 | 也支持zfs(实验) |
| Debian 11/12 | ext4 | ✅ 可选 | 最保守的选择 |
| Kali Linux | ext4 | ❌ 否 | 基于Debian |
xfs vs ext4 选择指南
| 场景 | 推荐 | 原因 |
|---|---|---|
| 系统根分区(CentOS/RHEL) | xfs | 发行版默认,优化最好 |
| 系统根分区(Ubuntu/Debian) | ext4 | 发行版默认,工具最成熟 |
| 大文件存储(视频/数据库) | xfs | 大文件性能更好 |
| 大量小文件(邮件/Web) | ext4 | 小文件处理更优 |
| 需要在线缩容 | ext4 | xfs不支持缩容 |
| 数据分区(通用) | 跟随系统默认 | 减少运维复杂度 |
💡 想一想:麒麟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系 | 通用 |
|---|---|---|---|
| 查看磁盘 | lsblk | lsblk | ✅ |
| 分区(MBR) | fdisk | fdisk | ✅ |
| 分区(GPT) | parted | parted | ✅ |
| 格式化为xfs | mkfs.xfs(预装) | mkfs.xfs(需安装xfsprogs) | 命令一致 |
| 格式化为ext4 | mkfs.ext4(预装) | mkfs.ext4(预装) | ✅ |
| 挂载 | mount | mount | ✅ |
| LVM | lvm2(预装) | lvm2(可选安装) | 命令一致 |
| RAID | mdadm(需安装) | mdadm(需安装) | 命令一致 |
| 磁盘空间 | df -h | df -h | ✅ |
| 目录大小 | du -sh | du -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给分区"编门牌号" Swap swapon/swapoff内存不够,硬盘来凑 LVM pvcreate/vgcreate/lvcreate魔法教学楼 空间排查 df -h/du -sh从全局到细节 inode df -i花名册也会用完 RAID mdadm多盘协作保平安