💾 第04课:磁盘与分区

阶段一:文件系统 第4/6课

📚 课程目标

一、磁盘基础知识

1.1 磁盘类型

类型接口设备名特点
HDDSATA/SAS/dev/sda大容量、便宜、慢
SATA SSDSATA/dev/sda中等速度、中价
NVMe SSDPCIe/dev/nvme0n1极快、贵
虚拟磁盘Virtio/SCSI/dev/vda或/dev/sda云服务器常见

📋 设备命名规则

# SATA/SAS磁盘
/dev/sda      # 第一块SCSI/SATA磁盘
/dev/sda1     # 第一块磁盘的第一个分区
/dev/sdb      # 第二块磁盘

# NVMe磁盘
/dev/nvme0n1     # 第一块NVMe磁盘(控制器0,命名空间1)
/dev/nvme0n1p1   # 第一块NVMe的第一个分区

# 虚拟化磁盘
/dev/vda      # Virtio磁盘(KVM虚拟机)
/dev/xvda     # Xen虚拟磁盘

1.2 分区表类型

特性MBR (MS-DOS)GPT (GUID)
最大磁盘2TB18EB (9.4ZB实际)
最大分区数4主分区或3主+1扩展128个(默认)
分区ID1字节类型码GUID
备份仅一份,在磁盘头头部+尾部各一份
启动方式BIOS/LegacyUEFI
工具fdiskgdisk/parted
校验CRC32CRC32 + 签名
新服务器务必使用GPT分区表!MBR的2TB限制是硬限制,无法绕过。UEFI启动也要求GPT。

二、分区管理工具

2.1 查看磁盘与分区

$ lsblk
${OUT_LSBLK}
$ blkid
${OUT_BLKID}
$ df -hT
${OUT_DF}

2.2 fdisk — MBR分区工具

# 交互式分区(MBR磁盘)
sudo fdisk /dev/sdb

# fdisk交互命令:
# m - 帮助
# p - 打印分区表
# n - 新建分区
# d - 删除分区
# t - 修改分区类型
# w - 写入并退出
# q - 不保存退出

# 查看分区信息(非交互)
sudo fdisk -l /dev/sda
${OUT_FDISK}

2.3 gdisk — GPT分区工具

# GPT分区工具,操作与fdisk类似
sudo gdisk /dev/nvme0n1

# gdisk交互命令:
# p - 打印分区表
# n - 新建分区
# d - 删除分区
# t - 修改分区类型码(L查看类型列表)
# w - 写入并退出

# GPT分区类型码:
# EF00 - EFI System Partition
# 8300 - Linux filesystem
# 8200 - Linux swap
# 8E00 - Linux LVM

2.4 parted — 通用分区工具

# 查看所有磁盘分区表
sudo parted -l

# 交互式操作
sudo parted /dev/sdb

# parted命令:
# (parted) print                    # 显示分区表
# (parted) mklabel gpt              # 创建GPT分区表
# (parted) mkpart primary 0% 50%    # 创建分区(0%-50%空间)
# (parted) mkpart primary 50% 100%  # 创建分区(50%-100%空间)
# (parted) rm 1                     # 删除1号分区
# (parted) set 1 boot on            # 设置启动标志
${OUT_PARTED}

三、文件系统创建

3.1 常见文件系统对比

文件系统最大卷最大文件日志适用场景
ext41EB16TB通用,Ubuntu默认
xfs16EB9EBRHEL默认,大文件
btrfs16EB16EB有(CoW)快照、压缩、校验
zfs256万亿ZB16EB有(CoW)数据完整性优先
vfat2TB4GBEFI分区、U盘兼容

3.2 mkfs — 创建文件系统

# 格式化为ext4
sudo mkfs.ext4 /dev/sdb1
# 或指定标签
sudo mkfs.ext4 -L data /dev/sdb1

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

# 格式化EFI分区
sudo mkfs.vfat -F 32 /dev/sda1

# 查看文件系统信息
sudo tune2fs -l /dev/sdb1    # ext4
sudo xfs_info /dev/sdb1     # xfs

四、Swap管理

4.1 Swap分区

# 创建swap分区
sudo mkswap /dev/sdb2
sudo swapon /dev/sdb2

# 验证
swapon --show
free -h

# 关闭swap
sudo swapoff /dev/sdb2

# 永久生效(写入fstab)
echo "/dev/sdb2 none swap sw 0 0" | sudo tee -a /etc/fstab

4.2 Swap文件

# 创建swap文件(更灵活,无需分区)
sudo fallocate -l 2G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile

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

# 调整swappiness(0-100,越低越少用swap)
cat /proc/sys/vm/swappiness
sudo sysctl vm.swappiness=10    # 临时
echo "vm.swappiness=10" | sudo tee -a /etc/sysctl.conf  # 永久

五、磁盘使用分析

$ du -sh /var /usr /home /tmp
${OUT_DU}
# 查看大文件
find / -type f -size +100M 2>/dev/null | head -20

# 查看inode使用
df -i

# ncdu交互式磁盘分析工具
sudo apt install ncdu
sudo ncdu /var

六、SMART磁盘健康监控

# 安装smartmontools
sudo apt install smartmontools

# 查看SMART信息
sudo smartctl -a /dev/sda

# 快速健康检查
sudo smartctl -H /dev/sda

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

# 查看自检结果
sudo smartctl -l selftest /dev/sda
${OUT_SMART}

七、故障排查

❌ 问题:磁盘只读(Read-only file system)

原因:文件系统损坏,内核自动切换为只读保护数据

# 查看dmesg中的错误
dmesg | grep -i "read-only\|error\|remount"

# 修复文件系统(先卸载)
sudo umount /dev/sdb1
sudo fsck -y /dev/sdb1

# 重新挂载为读写
sudo mount -o remount,rw /

❌ 问题:分区表损坏

# 使用testdisk恢复分区表
sudo apt install testdisk
sudo testdisk /dev/sda
# 选择 [Proceed] -> [Intel/EFI GPT] -> [Analyse] -> [Quick Search]

八、练习

📝 练习1:磁盘信息收集

收集以下信息并整理报告:

  1. 系统有哪些磁盘?各磁盘大小?
  2. 分区表类型是MBR还是GPT?
  3. 每个分区使用的文件系统类型?
  4. 各分区的使用率和剩余空间?

📝 练习2:创建swap文件

# 创建1G swap文件
sudo fallocate -l 1G /tmp/swap-test
sudo chmod 600 /tmp/swap-test
sudo mkswap /tmp/swap-test
sudo swapon /tmp/swap-test
free -h
# 验证swap大小增加
sudo swapoff /tmp/swap-test
🏆

成就解锁:磁盘管理员

✅ 理解MBR/GPT分区表

✅ 掌握fdisk/gdisk/parted工具

✅ 学会创建文件系统和swap

✅ 了解SMART健康监控

九、完整分区操作流程

9.1 新磁盘上线完整流程

# 步骤1:确认新磁盘已被识别
lsblk
sudo fdisk -l | grep "Disk /dev"

# 步骤2:创建分区表和分区
sudo parted /dev/sdb mklabel gpt
sudo parted /dev/sdb mkpart primary ext4 0% 100%

# 步骤3:创建文件系统
sudo mkfs.ext4 -L data /dev/sdb1

# 步骤4:创建挂载点
sudo mkdir -p /mnt/data

# 步骤5:获取UUID
blkid /dev/sdb1

# 步骤6:写入fstab实现开机自动挂载
echo 'UUID=你的UUID /mnt/data ext4 defaults,noatime 0 2' | sudo tee -a /etc/fstab

# 步骤7:测试fstab配置
sudo mount -a    # 如果报错说明fstab有误,不会导致无法开机

# 步骤8:验证
df -hT /mnt/data

9.2 fstab第5、6字段详解

dump字段(第5列)

0 = 不需要dump备份,1 = 需要dump备份。现代系统通常全部设0。

fsck顺序字段(第6列)

十、高级磁盘操作

10.1 磁盘性能测试

# 顺序读取测试
sudo hdparm -Tt /dev/sda

# 使用dd测试写入速度(注意:仅粗略测试)
sudo dd if=/dev/zero of=/tmp/test bs=1M count=1024 oflag=direct
sudo rm /tmp/test

# 使用fio精确测试(推荐)
sudo apt install fio
# 随机读测试
sudo fio --name=randread --ioengine=libaio --iodepth=16 \
  --rw=randread --bs=4k --direct=1 --size=512M --numjobs=4 \
  --runtime=30 --group_reporting

10.2 磁盘IO调度器

# 查看当前调度器
cat /sys/block/sda/queue/scheduler
# 输出示例:[mq-deadline] kyber bfq none

# SSD推荐:none或mq-deadline
# HDD推荐:bfq或mq-deadline

# 修改调度器
echo 'none' | sudo tee /sys/block/sda/queue/scheduler

10.3 磁盘TRIM(SSD优化)

# 检查是否支持TRIM
sudo hdparm -I /dev/sda | grep TRIM

# 手动TRIM
sudo fstrim -v /

# 启用定期自动TRIM
sudo systemctl enable fstrim.timer
sudo systemctl start fstrim.timer

10.4 文件系统调优

调优项ext4xfs说明
禁用访问时间noatimenoatime减少写操作
日志模式data=writeback默认性能优先(安全性略降)
预留空间-m 1N/A默认5%预留,大磁盘可降低
inode大小-I 256默认大inode存扩展属性
块大小-b 4096-b size=4096大文件用大块

十一、RAID基础概念

RAID (Redundant Array of Independent Disks) 将多个物理磁盘组合为逻辑单元,提供性能和/或冗余。

级别最少磁盘冗余可用容量特点
RAID 02100%条带化,最快,最危险
RAID 121块盘50%镜像,读快
RAID 531块盘(n-1)/n平衡性能与冗余
RAID 642块盘(n-2)/n双冗余,更安全
RAID 104每组1块50%性能+冗余最佳
# Linux软件RAID (mdadm)
sudo apt install mdadm

# 创建RAID 1
sudo mdadm --create /dev/md0 --level=1 --raid-devices=2 /dev/sdb1 /dev/sdc1

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

# 停止RAID
sudo mdadm --stop /dev/md0
生产环境推荐硬件RAID控制器或使用mdadm软件RAID。LVM+RAID组合是最常见的方案:先RAID提供冗余,再LVM提供灵活性。