Linux 磁盘与存储管理完全指南
一份系统化的 Linux 磁盘管理笔记,涵盖从物理结构到高级存储方案的完整知识体系
一、磁盘物理结构
1.1 物理组成
- 主轴马达:带动盘片高速旋转(5400/7200/10000+ RPM)
1.2 逻辑结构
【结构】磁道 (Track)【说明】盘片上的同心圆,最外圈是 0 磁道
【结构】扇区 (Sector)【说明】磁道的最小存储单位,传统 512 字节,新盘 4096 字节(4K 扇区)
【结构】柱面 (Cylinder)【说明】所有盘片上相同半径磁道的集合
【结构】盘面 (Head)【说明】每个盘面对应一个磁头,从 0 开始编号
CHS 寻址:老式模式 (Cylinder/Head/Sector),现代磁盘使用 LBA(逻辑块地址,Linear Block Addressing)
二、磁盘接口与类型
2.1 接口类型
【接口】IDE/PATA【特点】并行传输,已淘汰
【接口】SATA【特点】串行,主流家用盘,支持热插拔
【接口】SCSI【特点】服务器用,多设备高并发
【接口】SAS【特点】SCSI 的串行版,企业级
【接口】NVMe【特点】直连 PCIe,极致低延迟,M.2/U.2 接口
【接口】USB【特点】外置存储
2.2 磁盘类型
- HHD:混合硬盘(小容量 SSD 作缓存 + HDD)
三、Linux 下的磁盘命名规则
3.1 设备文件位置
所有磁盘设备文件位于 /dev/ 目录下。
3.2 命名格式
【前缀】sd【含义】SCSI/SATA/USB/SAS 磁盘【示例】/dev/sda、/dev/sdb1
【前缀】hd【含义】IDE 磁盘(旧)【示例】/dev/hda
【前缀】vd【含义】VirtIO 虚拟磁盘(KVM)【示例】/dev/vda
【前缀】nvme0n1【含义】NVMe 固态硬盘【示例】/dev/nvme0n1p1
命名规则:字母代表磁盘序号(a, b, c…),数字代表分区号(1, 2, 3…)
3.3 查看磁盘信息
# 列出所有块设备lsblk# 查看磁盘详细信息fdisk -l /dev/sda# 查看磁盘属性(型号、序列号、大小)smartctl -i /dev/sda# 需安装 smartmontools# 查看设备 UUID 和文件系统类型blkid
四、磁盘分区基础
4.1 为什么要分区
4.2 分区表类型
MBR(Master Boot Record,主引导记录)
GPT(GUID Partition Table,GUID 分区表)
选择建议:2TB 以下磁盘可用 MBR,2TB 以上或需要 UEFI 启动时建议使用 GPT。
五、分区工具详解
5.1 命令对比
【工具】fdisk【分区表】MBR, GPT【交互方式】交互式菜单【特点】最经典,每个 Linux 都有
【工具】gdisk【分区表】GPT, MBR【交互方式】交互式菜单【特点】fdisk 的 GPT 专版,支持 MBR 修复
【工具】parted【分区表】MBR, GPT【交互方式】命令行/交互式【特点】功能强,支持非交互脚本,可调整分区大小
【工具】sfdisk【分区表】MBR, GPT【交互方式】脚本式【特点】适合批量操作,可备份/恢复分区表
【工具】gparted【分区表】任意【交互方式】GUI【特点】图形化,基于 parted
5.2 fdisk 详细用法
# 进入磁盘管理sudo fdisk /dev/sdb# 常用内部命令(交互模式下)m# 显示帮助p# 打印当前分区表n# 新建分区d# 删除分区t# 修改分区类型w# 保存并退出(真正写入磁盘)q# 不保存退出
操作示例:
sudo fdisk /dev/sdb# 1. 按 g 创建 GPT 分区表,按 o 创建 MBR DOS 表(注意:g/o 会清空所有分区)# 2. 按 n → 默认主分区 → 起始扇区默认 → 结束扇区如 +10G# 3. 按 t → 选择分区 → 输入类型代码(83 for Linux)# 4. 按 w 保存
5.3 gdisk 用法
sudo gdisk /dev/sdc?# 帮助(与 fdisk 不同)n# 新建分区,自动使用 GPT GUIDx# 专家功能(备份/恢复/修改 GUID 等)
5.4 parted 用法(脚本友好)
# 交互式sudo parted /dev/sdb(parted) mklabel gpt# 创建 GPT 分区表(parted) mkpart primary ext4 0% 10G# 创建分区,文件系统类型提示(parted) print# 显示(parted) quit# 一行命令创建分区并格式化(需后续 mkfs)sudo parted /dev/sdb mklabel gpt mkpart primary ext4 1MiB 100%
注意:parted 的 mkpart 只是记录分区类型(名称),真正的文件系统创建需要 mkfs。
5.5 lsblk 与分区内核识别
# 查看分区变化(内核是否已识别)lsblk# 如果修改分区后内核未更新,使用 partprobesudo partprobe /dev/sdb# 或使用 kpartxsudo kpartx -u /dev/sdb
六、创建文件系统(格式化)
6.1 常用命令
【文件系统】ext4【创建命令】mkfs.ext4【示例】sudo mkfs.ext4 /dev/sdb1
【文件系统】xfs【创建命令】mkfs.xfs【示例】sudo mkfs.xfs -f /dev/sdb1
【文件系统】btrfs【创建命令】mkfs.btrfs【示例】sudo mkfs.btrfs /dev/sdb1
【文件系统】swap【创建命令】mkswap【示例】sudo mkswap /dev/sdb2
【文件系统】FAT32【创建命令】mkfs.vfat【示例】sudo mkfs.vfat -F 32 /dev/sdb1
【文件系统】NTFS【创建命令】mkfs.ntfs【示例】sudo mkfs.ntfs /dev/sdb1(需 ntfs-3g)
6.2 高级参数示例
# ext4:指定标签、保留块百分比、inode 比例sudo mkfs.ext4 -L mydata -m 1 -N 1000000 /dev/sdb1# xfs:指定对齐、inode size、标签sudo mkfs.xfs -f -b size=4096 -i size=512 -L data /dev/sdb1# 查看文件系统信息sudo dumpe2fs -h /dev/sdb1# ext2/3/4sudo xfs_info /dev/sdb1# xfs
七、磁盘挂载与使用
7.1 挂载的本质
挂载(Mount)是将一个存储设备(分区、逻辑卷、网络存储等)连接到 Linux 目录树中某个目录的过程。访问该目录即相当于访问存储设备。
7.2 完整挂载流程
物理磁盘 → 分区 (fdisk/gdisk/parted) → 格式化 (mkfs.*) → 挂载 (mount) → 使用
【详细流程】
- ↓ 分区 (fdisk/gdisk/parted)
7.3 临时挂载(手动挂载)
临时挂载使用 mount 命令,重启后失效,常用于测试或一次性使用。
7.3.1 准备工作:查看可用磁盘
# 查看所有磁盘及分区lsblk# 查看磁盘详细信息fdisk -l
7.3.2 创建挂载点
# 挂载点就是一个普通目录sudo mkdir -p /mnt/datasudo mkdir -p /mnt/backup
7.3.3 执行临时挂载
# 基本语法:mount [设备] [挂载点]sudo mount /dev/sdb1 /mnt/data# 指定文件系统类型(自动检测时通常可省略)sudo mount -t ext4 /dev/sdb1 /mnt/data# 带选项挂载(只读)sudo mount -o ro /dev/sdb1 /mnt/data# 挂载 NTFS 分区sudo mount -t ntfs-3g /dev/sdb1 /mnt/data
7.3.4 验证挂载
# 查看所有挂载mount | grep sdb1# 查看磁盘使用情况(带文件系统类型)df -hT# 查看具体挂载点信息df -h /mnt/data
7.3.5 卸载临时挂载
# 通过挂载点卸载sudo umount /mnt/data# 通过设备卸载sudo umount /dev/sdb1# 强制卸载(当设备忙时)sudo umount -l /mnt/data# 懒卸载,稍后自动清理sudo umount -f /mnt/data# 强制卸载
7.3.6 临时挂载完整示例
# 1. 查看设备lsblk# /dev/sdc1 存在但未挂载# 2. 创建挂载点sudo mkdir -p /mnt/usb# 3. 挂载sudo mount /dev/sdc1 /mnt/usb# 4. 验证df -h /mnt/usb# 5. 使用echo ”test” | sudo tee /mnt/usb/test.txt# 6. 卸载sudo umount /mnt/usb
7.4 永久挂载(自动挂载)
永久挂载通过编辑 /etc/fstab 文件实现,重启后仍然有效。
7.4.1 获取设备 UUID(推荐方式)
# 查看所有设备的 UUIDsudo blkid# 查看特定设备sudo blkid /dev/sdb1# 输出: /dev/sdb1: UUID=”a1b2c3d4-5678-90ab-cdef-1234567890ab” TYPE=”ext4”
为什么使用 UUID?设备名(如 /dev/sdb1)可能因硬件变动而改变,UUID 是唯一的,不会变化。
7.4.2 编辑 /etc/fstab
# 备份原文件(推荐)sudo cp /etc/fstab /etc/fstab.bak# 编辑sudo nano /etc/fstab# 或sudo vim /etc/fstab
7.4.3 添加挂载条目
fstab 格式:<设备> <挂载点> <文件系统类型> <挂载选项>
添加示例:
# 数据盘永久挂载UUID=a1b2c3d4-5678-90ab-cdef-1234567890ab /data ext4 defaults,noatime 0 2# 备份盘UUID=b2c3d4e5-6789-01bc-def2-345678901abc /backup ext4 defaults 0 2
7.4.4 验证 fstab 配置
# 挂载所有 fstab 中未挂载的设备(测试配置是否正确)sudo mount -a# 如果没有报错,说明配置正确# 确认挂载成功df -h# 如果报错,检查 fstab 语法sudo mount -a 2>&1# 查看详细错误
7.4.5 永久挂载完整示例
# 1. 查看 UUIDsudo blkid /dev/sdb1# /dev/sdb1: UUID=”abc123-def456-...” TYPE=”ext4”# 2. 创建挂载点sudo mkdir -p /data# 3. 编辑 fstabecho ”UUID=abc123-def456-... /data ext4 defaults 0 2” | sudo tee -a /etc/fstab# 4. 测试挂载sudo mount -a# 5. 验证df -h /datalsblk | grep sdb1
7.5 临时挂载 vs 永久挂载对比
【对比项】临时挂载 (mount)【命令】sudo mount /dev/sdb1 /mnt/data【生效时间】立即生效【重启后】失效,需重新挂载【适用场景】测试、一次性使用、U盘【配置持久性】不持久【卸载】sudo umount /mnt/data
【对比项】永久挂载 (/etc/fstab)【命令】编辑 /etc/fstab 文件【生效时间】重启后生效,或执行 mount -a【重启后】仍然有效,自动挂载【适用场景】服务器数据盘、系统盘、长期使用【配置持久性】持久保存在文件中【卸载】sudo umount + 注释 fstab 条目
7.6 常见挂载选项
【选项】defaults【含义】包含 rw, suid, dev, exec, auto, nouser, async
【选项】noatime【含义】不更新访问时间(提升性能)
【选项】relatime【含义】仅在修改时更新访问时间(默认较新内核)
【选项】ro【含义】只读挂载
【选项】noexec【含义】禁止执行二进制文件(安全)
【选项】user【含义】允许普通用户挂载
【选项】nofail【含义】设备不存在时跳过(避免启动失败,常用于外置盘)
7.7 完整的 /etc/fstab 示例
# <设备> <挂载点> <类型> <选项> # 根分区(普通磁盘)UUID=abc123 / ext4 defaults,noatime 0 1# /home(逻辑卷)UUID=def456 /home xfs defaults 0 2# 数据盘(普通磁盘)UUID=ghi789 /data ext4 defaults 0 2# Swap 分区UUID=jkl012 none swap sw 0 0# Windows 共享(网络存储)//192.168.1.10/share /mnt/nas cifs credentials=/root/.smb,noexec 0 0
7.8 fstab 第 5、6 列详解
第 5 列:dump 备份
【值】0【含义】不备份(推荐,现代系统都用其他备份工具)
【值】1【含义】需要备份
第 6 列:fsck 检查顺序
【值】0【含义】不检查(swap、光盘、网络存储等)
【值】1【含义】第一个检查(只有根目录 / 可以填 1)
【值】2【含义】第二个检查(其他分区都填 2)
根目录 / 必须是 1,其他本地分区填 2,不检查的填 0
7.9 快速记忆
【列】4(选项)【名称】选项【常见值】defaults, ro, noexec【含义】怎么挂载
【列】5(dump)【名称】dump【常见值】0【含义】备份(不用管)
【列】6(pass)【名称】pass【常见值】根是 1,其他是 2,不检查是 0【含义】检查顺序
操作三步走:
八、Swap 分区管理
8.1 创建 Swap
# 方法1:分区作为 swapsudo fdisk /dev/sdc# 创建类型 82 的分区sudo mkswap /dev/sdc1sudo swapon /dev/sdc1# 方法2:文件作为 swap (4G)sudo fallocate -l 4G /swapfilesudo chmod 600 /swapfilesudo mkswap /swapfilesudo swapon /swapfile
8.2 fstab 永久启用
# /etc/fstab/dev/sdc1 none swap sw 0 0# 或/swapfile none swap sw 0 0
8.3 查看 Swap
九、逻辑卷管理(LVM)挂载
9.1 LVM 基本概念
- PV (Physical Volume):物理卷,硬盘或分区
- VG (Volume Group):卷组,多个 PV 组成池
- LV (Logical Volume):逻辑卷,从 VG 切分,相当于分区
9.2 LVM 创建流程
# 创建物理卷sudo pvcreate /dev/sdb1# 创建卷组sudo vgcreate myvg /dev/sdb1# 创建逻辑卷sudo lvcreate -n mylv -L 10G myvg# 格式化逻辑卷sudo mkfs.ext4 /dev/myvg/mylv
9.3 LVM 临时挂载
9.3.1 基本临时挂载
# 创建挂载点sudo mkdir -p /mnt/lvm_data# 临时挂载逻辑卷sudo mount /dev/myvg/mylv /mnt/lvm_data# 或指定文件系统类型sudo mount -t ext4 /dev/myvg/mylv /mnt/lvm_data# 验证挂载df -hT /mnt/lvm_datamount | grep mylv
9.3.2 带选项的临时挂载
# 只读挂载sudo mount -o ro /dev/myvg/mylv /mnt/lvm_data# 禁用执行权限sudo mount -o noexec /dev/myvg/mylv /mnt/lvm_data# 组合选项sudo mount -o noatime,nodiratime /dev/myvg/mylv /mnt/lvm_data
9.3.3 卸载 LVM 临时挂载
# 卸载sudo umount /mnt/lvm_data# 或sudo umount /dev/myvg/mylv
9.3.4 LVM 临时挂载完整示例
# 1. 查看逻辑卷sudo lvs# LV VG Attr LSize# mylv myvg -wi-a----- 10.00g# 2. 创建挂载点sudo mkdir -p /mnt/test# 3. 临时挂载sudo mount /dev/myvg/mylv /mnt/test# 4. 写入测试数据echo ”LVM test data” | sudo tee /mnt/test/test.txt# 5. 查看挂载df -h /mnt/test# 6. 卸载sudo umount /mnt/test
9.4 LVM 永久挂载
9.4.1 使用 UUID(推荐)
# 获取逻辑卷 UUIDsudo blkid /dev/myvg/mylv# /dev/myvg/mylv: UUID=”x1y2z3a4-b5c6-d7e8-f9g0-h1i2j3k4l5m6” TYPE=”ext4”# 编辑 fstabsudo vim /etc/fstab# 添加一行UUID=x1y2z3a4-b5c6-d7e8-f9g0-h1i2j3k4l5m6 /mnt/lvm_data ext4 defaults 0 2
9.4.2 使用设备路径
# 编辑 fstabsudo vim /etc/fstab# 添加(两种写法均可)/dev/myvg/mylv /mnt/lvm_data ext4 defaults 0 2# 或/dev/mapper/myvg-mylv /mnt/lvm_data ext4 defaults 0 2
9.4.3 验证并挂载
# 测试挂载sudo mount -a# 验证df -h /mnt/lvm_datalsblk | grep mylv
9.4.4 LVM 永久挂载完整示例
# 1. 获取 UUIDsudo blkid /dev/myvg/mylv# 输出: /dev/myvg/mylv: UUID=”abc-123-def” TYPE=”xfs”# 2. 创建挂载点sudo mkdir -p /data/lvm# 3. 编辑 fstabecho ”UUID=abc-123-def /data/lvm xfs defaults,noatime 0 2” | sudo tee -a /etc/fstab# 4. 测试sudo mount -a# 5. 验证df -h /data/lvm
9.5 LVM 挂载选项详解
【选项】defaults【说明】默认选项 (rw, suid, dev, exec, auto, nouser, async)【适用场景】一般使用
【选项】noatime【说明】不更新访问时间【适用场景】数据库、高IO场景
【选项】nodiratime【说明】不更新目录访问时间【适用场景】配合 noatime 使用
【选项】noexec【说明】禁止执行程序【适用场景】安全要求高的数据分区
【选项】ro【说明】只读【适用场景】备份盘、归档盘
【选项】nofail【说明】挂载失败不中断启动【适用场景】非关键数据盘
【选项】_netdev【说明】网络设备挂载【适用场景】NFS、iSCSI 等
9.6 LVM 扩容后重新挂载
# 1. 扩展逻辑卷(假设 VG 有空间)sudo lvextend -L +5G /dev/myvg/mylv# 2. 扩展文件系统(在线扩容,无需卸载)# ext4 文件系统sudo resize2fs /dev/myvg/mylv# xfs 文件系统(需要挂载点)sudo xfs_growfs /mnt/lvm_data# 3. 验证扩容df -h /mnt/lvm_data
9.7 LVM 挂载故障处理
# 如果开机时 LVM 未激活sudo vgchange -ay# 检查 LVM 状态sudo lvssudo vgssudo pvs# 手动激活卷组sudo vgchange -ay myvg# 重新挂载sudo mount -a
9.8 完整流程图解
硬盘分区 → 物理卷(PV) → 卷组(VG) → 逻辑卷(LV) → 文件系统 → 挂载点
【各步骤命令】/dev/sdb1 → pvcreate → vgcreate myvg → lvcreate -n mylv → mkfs.ext4 → mount /mnt(池子) (切10G) (格式化) (使用)
扩容时:lvextend -L +5G → 先扩大 LV(房间变大了)resize2fs → 再扩大文件系统(重新装修,真正可用)
9.9 LVM 常见错误
十、添加磁盘后设备不出现的处理
10.1 问题现象
# 物理磁盘已连接,但 lsblk 看不到lsblk# 只能看到原有的 sda,看不到新磁盘 sdb
10.2 常见原因及解决方案
10.2.1 原因一:SCSI 总线未扫描(最常见)
解决方案 - 触发 SCSI 总线扫描:
# 方法1:扫描所有 SCSI 主机(推荐)for host in /sys/class/scsi_host/host*/scan; do echo ”- - -” | sudo tee $host; done# 方法2:使用 rescan-scsi-bus 工具(如果已安装)sudo rescan-scsi-bus.sh# 方法3:重新扫描特定 HBAecho 1 | sudo tee /sys/class/scsi_device/*/device/rescan# 方法4:重启 multipath 服务(如果使用多路径)sudo systemctl restart multipathd
验证:
lsblkdmesg | tail -20# 查看内核日志
10.2.2 原因二:磁盘未格式化或未分区
新磁盘可能没有分区表或文件系统,但 lsblk 仍然应该显示原始设备。
# 检查是否显示为未分区磁盘lsblk -f# 查看文件系统,如果为空说明未格式化# 创建分区sudo fdisk /dev/sdb# 或创建 GPT 分区表sudo parted /dev/sdb mklabel gpt
注意:即使未分区,lsblk 也应该显示 /dev/sdb,只是没有分区子项。
10.2.3 原因三:磁盘未正确连接或硬件故障
# 1. 检查内核日志dmesg | grep -i ”sdb\|scsi\|ata\|error”# 2. 检查系统是否检测到硬件变动sudo dmesg -w# 实时查看,然后插拔磁盘# 3. 查看 PCI 设备lspci | grep -i ”scsi\|sata”# 4. 检查是否被其他系统识别sudo lshw -class disksudo lsscsi -v
10.2.4 原因四:设备已被占用或冲突
# 检查是否有冲突的设备名ls /dev/sd*# 检查设备是否被 multipath 接管ls /dev/mapper/# 检查设备是否被其他服务占用sudo lsof | grep sdb
10.2.5 原因五:udev 规则未触发
# 触发 udev 重新扫描sudo udevadm trigger# 查看 udev 事件sudo udevadm monitor --property# 强制重新加载 udev 规则sudo udevadm control --reload-rulessudo udevadm trigger --subsystem-match=block
10.3 完整排查流程
# 步骤1:检查内核是否识别dmesg | grep -i ”new.*disk\|attached.*scsi\|sd.”dmesg | tail -30# 步骤2:检查 sysfs 是否存在设备文件ls -la /sys/block/ | grep sd# 步骤3:手动触发 SCSI 扫描for host in /sys/class/scsi_host/host*/scan; do echo ”- - -” | sudo tee $hostdone# 步骤4:检查结果lsblkfdisk -l# 步骤5:如果仍不可见,检查硬件sudo lshw -class disksudo lsscsi# 步骤6:重启系统(最后手段,仅排除软件问题)sudo reboot
10.4 虚拟机环境特殊情况
VMware / VirtualBox / KVM
# VMware:重新扫描 SCSI 总线echo 1 | sudo tee /sys/class/scsi_device/*/device/rescan# 或使用工具sudo vmware-toolbox-cmd disk listsudo vmware-toolbox-cmd disk shrink /# KVM VirtIO 磁盘# 检查是否分配了 vd* 设备ls /dev/vd*lsblk# 热插拔 VirtIO 磁盘后,触发扫描echo 1 | sudo tee /sys/bus/pci/rescan
10.5 磁盘出现但无法访问的处理
# 如果磁盘出现在 /dev/ 但 lsblk 不显示# 刷新内核分区表sudo partprobe /dev/sdb# 或使用 blockdevsudo blockdev --rereadpt /dev/sdb# 检查磁盘状态sudo smartctl -i /dev/sdb# 如果磁盘被写保护或只读sudo hdparm -r0 /dev/sdb# 关闭只读
10.6 故障排查命令速查
【命令】lsblk【作用】查看块设备树
【命令】lsblk -f【作用】查看文件系统信息
【命令】fdisk -l【作用】查看磁盘分区表
【命令】lsscsi【作用】查看 SCSI 设备
【命令】dmesg | tail【作用】查看最近内核日志
【命令】dmesg | grep -i sd【作用】查看磁盘相关内核信息
【命令】ls /sys/block/【作用】查看内核识别的块设备
【命令】ls /dev/sd*【作用】查看设备文件
【命令】lshw -class disk【作用】查看磁盘硬件信息
【命令】udevadm trigger【作用】触发 udev 重新扫描
【命令】partprobe【作用】刷新内核分区表
10.7 常见错误信息及解决
【错误信息】No such device【含义】设备不存在【解决方案】检查硬件连接,重新扫描 SCSI
【错误信息】Device not found【含义】设备未找到【解决方案】检查 /dev/ 下是否有设备文件
【错误信息】Device or resource busy【含义】设备忙【解决方案】关闭占用进程或使用 lsof 查找
【错误信息】Invalid argument【含义】参数无效【解决方案】检查设备路径是否正确
【错误信息】I/O error【含义】输入输出错误【解决方案】硬件故障,检查连接线缆
10.8 完整脚本:自动扫描并挂载新磁盘
#!/bin/bash# 自动扫描新磁盘并挂载echo ”=== 扫描新磁盘 ===”# 1. 扫描 SCSI 总线for host in /sys/class/scsi_host/host*/scan; do echo ”- - -” | sudo tee $host > /dev/nulldone# 2. 等待设备识别sleep 2# 3. 显示现有磁盘echo ”=== 当前磁盘列表 ===”lsblk# 4. 识别新磁盘(需要手动指定)read -p ”请输入要挂载的设备名 (如 /dev/sdb1): ” DEVICEread -p ”请输入挂载点 (如 /data): ” MOUNTPOINT# 5. 创建挂载点sudo mkdir -p $MOUNTPOINT# 6. 获取 UUIDUUID=$(sudo blkid -s UUID -o value $DEVICE)# 7. 添加到 fstabecho ”UUID=$UUID $MOUNTPOINT ext4 defaults 0 2” | sudo tee -a /etc/fstab# 8. 挂载sudo mount -aecho ”=== 挂载完成 ===”df -h $MOUNTPOINT
十一、分区表备份与恢复
11.1 MBR 备份
# 备份前512字节(MBR)sudo dd if=/dev/sda of=mbr_backup.img bs=512 count=1# 恢复(危险!)sudo dd if=mbr_backup.img of=/dev/sda bs=512 count=1
11.2 GPT 备份(使用 sgdisk)
# 备份分区表到文件sudo sgdisk -b=gpt_backup.bin /dev/sdb# 恢复sudo sgdisk -l=gpt_backup.bin /dev/sdb
11.3 sfdisk 备份
# 备份分区布局(可读)sudo sfdisk -d /dev/sda > sda_partitions.txt# 恢复sudo sfdisk /dev/sdb < sda_partitions.txt
十二、磁盘性能与健康
12.1 查看 IO 统计
# 实时查看磁盘读写iostat -x 1# 或iotop# 查看磁盘历史负载sar -d 1 3
12.2 SMART 检测
# 查看整体健康状态sudo smartctl -H /dev/sda# 运行短测试sudo smartctl -t short /dev/sda# 查看测试结果sudo smartctl -l selftest /dev/sda# 查看详细属性(包括 Wear Leveling Count for SSD)sudo smartctl -a /dev/sda
12.3 4K 对齐检查
# 查看分区起始扇区是否 8 的倍数sudo fdisk -l /dev/sda# 或sudo parted /dev/sda unit s print# 如果起始 sector 是 2048(典型),则对齐到 1MiB,满足 4K 对齐
十三、常见故障与解决
13.1 "Device or resource busy"
# 查找占用进程lsof /mnt/datafuser -mv /mnt/data# 强制结束并卸载sudo fuser -km /mnt/datasudo umount /mnt/data
13.2 分区表不刷新
sudo partprobe /dev/sdb# 或重启(终极方案)
13.3 修复文件系统
# ext4(卸载后运行)sudo umount /dev/sdb1sudo fsck -y /dev/sdb1# xfssudo xfs_repair /dev/sdb1# 检查坏块sudo badblocks -v /dev/sdb
13.4 扩容分区(在线)
# 1. 扩大分区(假设原分区是 /dev/sda3)sudo growpart /dev/sda 3# 注意:设备名与分区号分开# 2. 刷新内核分区表sudo partprobe /dev/sda# 3. 扩大文件系统(在线,无需卸载)sudo resize2fs /dev/sda3# ext4sudo xfs_growfs /mountpoint# xfs 需要挂载后操作
十四、知识体系总览
磁盘管理├─ 物理结构│ ├─ 磁道/扇区/柱面│ └─ CHS / LBA├─ 接口与类型│ ├─ SATA/SAS/NVMe│ └─ HDD/SSD├─ 分区表│ ├─ MBR (≤2T, 4主分区)│ └─ GPT (≥2T, 128分区)├─ 分区工具│ ├─ fdisk (基础)│ ├─ gdisk (GPT)│ ├─ parted (脚本)│ └─ sfdisk (备份)├─ 格式化│ └─ mkfs.*├─ 挂载│ ├─ 临时挂载 (mount)│ ├─ 永久挂载 (/etc/fstab)│ └─ LVM 挂载 (PV/VG/LV)├─ swap│ ├─ mkswap + swapon│ └─ 文件或分区├─ 高级│ ├─ LVM (弹性)│ └─ RAID (软硬)└─ 运维 ├─ 设备识别 (SCSI扫描/udev) ├─ smartctl (健康) ├─ iostat (性能) └─ fsck (修复)
附录:关键命令速查
挂载相关
sudo mkdir -p /mnt/data# 创建挂载点sudo mount /dev/sdb1 /mnt/data# 临时挂载sudo umount /mnt/data# 卸载sudo mount -a# 挂载所有 fstab 条目
LVM 挂载相关
sudo pvcreate /dev/sdb1# 创建 PVsudo vgcreate myvg /dev/sdb1# 创建 VGsudo lvcreate -n mylv -L 10G myvg# 创建 LVsudo mkfs.ext4 /dev/myvg/mylv# 格式化 LVsudo mount /dev/myvg/mylv /mnt/data# 挂载 LV
设备识别相关
for host in /sys/class/scsi_host/host*/scan; do echo ”- - -” | sudo tee $host; donesudo partprobe /dev/sdb# 刷新分区表sudo udevadm trigger# 触发 udev 扫描sudo blkid# 查看所有 UUID