1. 磁盘相关概念基础
(1)存储设备类型
物理磁盘类型
**HDD (机械硬盘)**
- 结构:磁头、盘片、马达
- 接口:SATA(6Gbps)、SAS(12Gbps)
- 优势:大容量、低成本、数据恢复相对容易
- 劣势:速度慢、怕震动、功耗较高
**SSD (固态硬盘)**
- 结构:NAND闪存、控制器
- 接口:SATA(6Gbps)、NVMe(PCIe通道)
- 优势:速度快、抗震、低功耗、静音
- 劣势:价格高、写入寿命有限
**NVMe SSD**
- 接口:PCIe 3.0/4.0/5.0
- 速度:最高可达7000MB/s(PCIe 4.0)
- 形态:M.2、U.2、AIC卡
接口标准对比
# 查看接口类型和速度
$ lspci | grep -i storage
$ lsblk -d -o name,rota,size,type,tran
# 接口速度理论值:
- SATA III: 600MB/s
- SAS 3.0: 1200MB/s
- PCIe 3.0 x4: 4000MB/s
- PCIe 4.0 x4: 8000MB/s
- PCIe 5.0 x4: 16000MB/s
(2)磁盘技术参数
**关键参数解释:**
- **容量**:实际可用容量(厂商计算方式不同)
- **转速**:HDD重要指标(5400/7200/10000/15000 RPM)
- **缓存**:HDD的DRAM缓存(64MB-256MB)
- **IOPS**:每秒输入输出操作数(SSD重要指标)
- **延迟**:响应时间(SSD远低于HDD)
- **TBW**:SSD写入寿命(TB级写入总量)
(3)Linux磁盘设备命名规则
# 设备命名规则
/dev/sd[a-z] # SATA/SAS/USB磁盘
/dev/nvme[0-9]n[0-9] # NVMe磁盘(如:nvme0n1)
/dev/vd[a-z] # 虚拟化环境(KVM/Xen)
/dev/hd[a-z] # 旧IDE接口(现已少见)
/dev/mmcblk[0-9] # SD卡/eMMC存储
# 分区命名
/dev/sda1 # 第一个分区
/dev/nvme0n1p1 # NVMe第一个分区
2. 分区表方案详解
(1)MBR(主引导记录)
MBR结构
**MBR组成(512字节):**
1. 引导代码(446字节)
2. 分区表(64字节,4个主分区)
3. 签名(2字节,0x55AA)
**MBR限制:**
- 最多4个主分区(或3主+1扩展)
- 扩展分区可再分逻辑分区
- 最大磁盘容量:2TB
- 分区信息存储单一位置
MBR分区类型
# 查看分区类型代码
$ fdisk -l /dev/sda
# 常见分区类型代码:
82 Linux swap / Solaris
83 Linux filesystem
8e Linux LVM
fd Linux raid auto
(2)GPT(GUID分区表)
GPT结构
**GPT优势:**
- 支持128个主分区(理论无限)
- 最大磁盘容量:9.4ZB(1ZB=1024EB)
- 分区表备份(磁盘首尾各一份)
- CRC32校验,提高数据完整性
- 使用GUID唯一标识分区
**GPT组成部分:**
1. 保护性MBR(兼容性)
2. 主GPT头
3. 主分区表
4. 实际分区区域
5. 备份分区表
6. 备份GPT头
GPT vs MBR 选择指南
**选择GPT的场景:**
- 磁盘容量 > 2TB
- UEFI启动系统
- 需要超过4个主分区
- 数据安全性要求高
- 现代服务器和工作站
**选择MBR的场景:**
- 旧系统兼容性要求
- 磁盘容量 < 2TB
- BIOS传统启动
- 嵌入式/旧设备
(3)分区方案设计
单磁盘分区方案
# 通用服务器分区方案(50GB磁盘示例)
/ 20G # 根目录
/boot 500M # 引导分区(UEFI需要)
/home 10G # 用户数据
/var 5G # 日志和可变数据
/tmp 2G # 临时文件
swap 2G # 交换分区(物理内存1-2倍)
# 生产数据库服务器方案
/ 50G
/boot 1G
/home 20G
/var/log 20G # 日志独立分区
/data 剩余空间 # 数据库专用
swap 物理内存1~2倍
多磁盘分区方案
**RAID方案:**
- RAID 0: 条带化,性能优先
- RAID 1: 镜像,可靠性优先
- RAID 5: 分布式奇偶校验,平衡型
- RAID 10: 镜像+条带,高性能高可靠
**LVM方案:**
- 物理卷(PV) → 卷组(VG) → 逻辑卷(LV)
- 支持动态扩展、快照、条带化
3. 基础磁盘配置管理
(1)磁盘信息查看
识别和列出磁盘
# 查看所有块设备
$ lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 465.8G 0 disk
├─sda1 8:1 0 512M 0 part /boot/efi
├─sda2 8:2 0 732M 0 part /boot
└─sda3 8:3 0 464.6G 0 part
├─vg-root 253:0 0 50G 0 lvm /
└─vg-home 253:1 0 414.6G 0 lvm /home
# 查看磁盘详细信息
$ fdisk -l
$ parted -l
# 查看磁盘属性和型号
$ hdparm -I /dev/sda
$ smartctl -i /dev/sda
# 查看磁盘使用情况
$ df -hT
Filesystem Type Size Used Avail Use% Mounted on
/dev/mapper/vg-root ext4 50G 20G 28G 42% /
磁盘性能测试
# 测试顺序读写速度
$ dd if=/dev/zero of=/tmp/testfile bs=1G count=1 oflag=direct
$ hdparm -tT /dev/sda
# 使用fio进行专业测试
$ fio --name=randwrite --ioengine=libaio --iodepth=32 \
--rw=randwrite --bs=4k --direct=1 --size=1G --numjobs=4 \
--runtime=60 --group_reporting
# 查看实时IO状态
$ iostat -x 2
$ iotop
(2)磁盘分区操作
使用fdisk(MBR/GPT)
# 对新磁盘进行分区
$ fdisk /dev/sdb
# fdisk常用命令(交互模式)
n # 新建分区
p # 查看分区表
d # 删除分区
t # 更改分区类型
w # 保存并退出
q # 不保存退出
g # 新建GPT分区表
o # 新建MBR分区表
# 分区后需要通知内核
$ partprobe /dev/sdb
$ udevadm settle
使用parted(推荐GPT)
# 创建GPT分区表
$ parted /dev/sdb mklabel gpt
# 创建分区
$ parted /dev/sdb mkpart primary ext4 1MiB 10GiB
$ parted /dev/sdb mkpart primary linux-swap 10GiB 12GiB
$ parted /dev/sdb mkpart primary ext4 12GiB 100%
# 设置分区标志(UEFI启动需要)
$ parted /dev/sdb set 1 boot on
# 查看分区
$ parted /dev/sdb print
# 删除分区
$ parted /dev/sdb rm 1
使用gdisk(GPT专用)
# 交互式GPT分区
$ gdisk /dev/sdb
# 常用命令:
n # 新建分区
p # 查看分区表
d # 删除分区
t # 更改分区类型
w # 保存
x # 专家模式
(3)文件系统创建与管理
常见文件系统对比
**ext4**:Linux默认,稳定成熟
- 最大文件大小:16TB
- 最大文件系统:1EB
- 适合:通用用途
**XFS**:高性能,大文件
- 最大文件大小:8EB
- 最大文件系统:8EB
- 适合:大文件、高并发
**Btrfs**:高级特性
- 快照、压缩、RAID功能
- 适合:桌面、实验环境
**ZFS**:企业级特性
- 数据完整性校验、去重
- 适合:企业存储、NAS
创建文件系统
# 创建ext4文件系统
$ mkfs.ext4 /dev/sdb1
$ mkfs.ext4 -L DATA /dev/sdb1 # 添加卷标
# 创建XFS文件系统
$ mkfs.xfs /dev/sdb2
$ mkfs.xfs -f -L DATABASE /dev/sdb2
# 创建swap分区
$ mkswap /dev/sdb3
$ swapon /dev/sdb3
# 查看文件系统信息
$ blkid /dev/sdb1
$ file -s /dev/sdb1
$ dumpe2fs /dev/sdb1 | head -50 # ext4详细信息
$ xfs_info /dev/sdb2 # XFS详细信息
文件系统检查和修复
# 检查ext2/3/4文件系统
$ fsck /dev/sdb1
$ e2fsck -f /dev/sdb1 # 强制检查
$ e2fsck -y /dev/sdb1 # 自动修复
# 检查XFS文件系统
$ xfs_repair /dev/sdb2
$ xfs_repair -n /dev/sdb2 # 只检查不修复
# 检查前必须卸载
$ umount /dev/sdb1
# 或使用只读模式检查
$ fsck -n /dev/sdb1
# 查看文件系统状态
$ tune2fs -l /dev/sdb1 # ext系列
$ xfs_admin -l /dev/sdb2 # XFS
(4)挂载配置管理
手动挂载
# 创建挂载点
$ mkdir -p /mnt/data
# 临时挂载
$ mount /dev/sdb1 /mnt/data
$ mount -t ext4 /dev/sdb1 /mnt/data
$ mount -o rw,noatime /dev/sdb1 /mnt/data
# 挂载选项说明:
ro/rw # 只读/读写
noatime # 不更新访问时间,提升性能
nodiratime # 不更新目录访问时间
data=ordered # ext4数据写入模式
defaults # 默认选项
自动挂载(/etc/fstab)
# 编辑fstab文件
$ vim /etc/fstab
# fstab配置格式:
# 设备或UUID 挂载点 文件系统 挂载选项 dump fsck
UUID=xxxxxxx /data ext4 defaults 0 2
/dev/sdb1 /backup xfs defaults 0 0
//192.168.1.100/share /mnt/nfs nfs defaults,_netdev 0 0
# 获取UUID
$ blkid /dev/sdb1
$ lsblk -f /dev/sdb1
# 测试fstab配置
$ mount -a
$ systemctl daemon-reload
# 常用挂载选项:
defaults,_netdev # 网络设备,网络就绪后挂载
noauto # 不自动挂载
user # 允许普通用户挂载
nofail # 设备不存在时不报错
x-systemd.automount # systemd自动挂载
卸载操作
# 卸载文件系统
$ umount /mnt/data
# 强制卸载(当有进程占用时)
$ umount -f /mnt/data
$ umount -l /mnt/data # 懒卸载
# 查看挂载点占用进程
$ lsof /mnt/data
$ fuser -m /mnt/data
$ fuser -km /mnt/data # 结束占用进程
(5)磁盘配额管理
启用磁盘配额
# 1. 启用文件系统配额支持
$ mount -o usrquota,grpquota /dev/sdb1 /home
# 2. 初始化配额数据库
$ quotacheck -cug /home
$ quotacheck -avug # 检查所有配额分区
# 3. 启用配额
$ quotaon /home
$ quotaon -avug # 启用所有配额
# 4. 配置自动配额检查
$ vim /etc/fstab
/dev/sdb1 /home ext4 defaults,usrquota,grpquota 0 2
配置用户配额
# 设置用户配额
$ edquota username
# 编辑以下参数:
# blocks soft/hard: 磁盘空间限制(单位:KB)
# inodes soft/hard: 文件数量限制
# 设置配额模板
$ edquota -p template_user username
# 设置组配额
$ edquota -g groupname
# 查看配额
$ quota username
$ repquota -a # 所有用户配额报告
$ quotastats # 配额统计信息
# 复制配额设置
$ edquota -p user1 user2
配额限制示例
# 为用户设置10GB软限制,12GB硬限制
$ setquota -u username 10240000 12288000 0 0 /home
# 为组设置配额
$ setquota -g developers 51200000 61440000 0 0 /home
# 宽限时间设置
$ edquota -t
# 设置空间超限宽限期:7天
# 设置inode超限宽限期:7天
4. 实战案例配置
(1)新磁盘完整配置流程
#!/bin/bash
# 新磁盘配置脚本示例
DISK="/dev/sdb"
MOUNT_POINT="/data"
echo "=== 新磁盘配置开始 ==="
# 1. 查看磁盘信息
echo "1. 检查磁盘..."
fdisk -l $DISK
lsblk $DISK
# 2. 创建GPT分区表
echo "2. 创建GPT分区表..."
parted $DISK mklabel gpt
# 3. 创建分区(使用全部空间)
echo "3. 创建分区..."
parted $DISK mkpart primary xfs 1MiB 100%
# 4. 创建文件系统
echo "4. 创建XFS文件系统..."
mkfs.xfs -f -L DATA ${DISK}1
# 5. 创建挂载点
echo "5. 创建挂载点..."
mkdir -p $MOUNT_POINT
# 6. 获取UUID并配置自动挂载
echo "6. 配置自动挂载..."
UUID=$(blkid ${DISK}1 | awk -F'"' '{print $2}')
echo "UUID=$UUID $MOUNT_POINT xfs defaults 0 2" >> /etc/fstab
# 7. 挂载并验证
echo "7. 挂载并验证..."
mount -a
df -h $MOUNT_POINT
echo "=== 配置完成 ==="
这段自动化配置流程,充分利用了 运维/DevOps 中常用的 shell 脚本技术,大大提升了系统管理员的工作效率。
(2)磁盘故障排查指南
# 磁盘健康检查
$ smartctl -H /dev/sda
$ badblocks -sv /dev/sda
# I/O错误排查
$ dmesg | grep -i error
$ journalctl -k --since="1 hour ago" | grep -i disk
# 性能问题排查
$ iostat -x 1
$ iotop -o
$ vmstat 1
# 文件系统修复
# 1. 进入单用户模式或救援模式
# 2. 卸载问题磁盘
# 3. 运行fsck修复
# 4. 检查日志:/var/log/messages
(3)生产环境最佳实践
**分区设计原则:**
1. /boot单独分区(1GB,ext4)
2. /根分区足够大(至少20GB)
3. 关键目录独立分区(/var, /home, /tmp)
4. swap分区:物理内存1.5-2倍
5. 数据目录单独分区
**性能优化:**
1. SSD使用noatime,nodiratime挂载选项
2. 数据库使用XFS或ext4 with data=writeback
3. 日志目录使用独立分区防止写满
4. 定期清理/tmp和日志文件
**监控告警:**
1. 监控磁盘使用率(>80%告警)
2. 监控磁盘健康状态(SMART)
3. 监控I/O延迟和错误
4. 设置磁盘配额防止滥用
5. 常用命令速查表
(1)磁盘信息类
lsblk # 查看块设备树
fdisk -l # 列出所有磁盘分区
parted -l # 显示分区信息(GPT友好)
blkid # 显示块设备属性
df -hT # 查看文件系统使用情况
du -sh * # 查看目录大小
(2)分区管理类
fdisk /dev/sdX # MBR分区管理
gdisk /dev/sdX # GPT分区管理
parted /dev/sdX # 高级分区工具
sgdisk # 脚本化GPT工具
cfdisk # 图形化分区工具
(3)文件系统类
mkfs.ext4 /dev/sdX1 # 创建ext4文件系统
mkfs.xfs /dev/sdX1 # 创建XFS文件系统
fsck /dev/sdX1 # 检查修复文件系统
tune2fs -l /dev/sdX1 # 显示ext文件系统信息
xfs_info /dev/sdX1 # 显示XFS文件系统信息
(4)挂载管理类
mount /dev/sdX1 /mnt # 挂载文件系统
umount /mnt # 卸载文件系统
findmnt # 显示已挂载文件系统
mount -a # 挂载fstab中所有文件系统