Ubuntu 22.04 的磁盘存储管理
一、磁盘存储管理概述
Linux 磁盘管理采用 "一切皆文件" 的哲学,存储设备被视为特殊文件。本章将详细介绍从物理磁盘识别到文件系统使用的完整流程。
1.1 存储设备类型
| 类型 | 设备文件前缀 | 说明 |
|---|---|---|
| SATA/IDE 硬盘 | /dev/sd* |
最常见类型,如 /dev/sda |
| NVMe SSD | /dev/nvme* |
高性能固态硬盘,如 /dev/nvme0n1 |
| 虚拟磁盘 | /dev/vd* |
虚拟机环境,如 /dev/vda |
| 软件 RAID | /dev/md* |
如 /dev/md0 |
| LVM 逻辑卷 | /dev/mapper/* |
如 /dev/mapper/ubuntu--vg-root |
1.2 管理流程
物理磁盘 → 分区/不分区 → 创建文件系统 → 挂载 → 使用
⚠️ 警告:磁盘操作可能导致数据丢失!生产环境操作前务必:
- 备份重要数据
- 在测试环境验证命令
- 确认目标设备名称
二、磁盘分区简介
2.1 两种分区表类型
| 类型 | 最大分区数 | 最大磁盘支持 | 兼容性 | Ubuntu 22.04 默认 |
|---|---|---|---|---|
| MBR (DOS) | 4 主分区(或 3主+1扩展) | 2TB | 旧系统兼容好 | 仅用于 BIOS 系统 |
| GPT | 128 个(理论无限制) | 8ZB (80亿TB) | 需 UEFI | UEFI 系统默认 |
2.2 分区类型
- 主分区:直接用于安装系统或存储数据
- 扩展分区:MBR 下的容器,可包含多个逻辑分区
- 逻辑分区:位于扩展分区内,突破 MBR 4 分区限制
💡 Ubuntu 22.04 在 UEFI 模式安装时默认使用 GPT 分区表。
三、Linux 磁盘及分区命名规则
3.1 命名规则详解
(1)传统硬盘 (SATA/SCSI)
/dev/sda - 第一块硬盘
/dev/sda1 - 第一块硬盘的第一个分区
/dev/sdb3 - 第二块硬盘的第三个分区
(2)NVMe SSD
/dev/nvme0n1 - 第一个 NVMe 控制器上的第一个命名空间
/dev/nvme0n1p1 - 该命名空间上的第一个分区
/dev/nvme1n2p3 - 第二个控制器、第二个命名空间、第三个分区
(3)虚拟磁盘
/dev/vda - 虚拟机第一个虚拟磁盘
/dev/vdb1 - 虚拟机第二个虚拟磁盘的第一个分区
3.2 查看磁盘设备
bash
# 列出所有块设备
lsblk -f
# -f: 显示文件系统类型、UUID、标签等
# 详细设备信息
sudo fdisk -l
# 或
sudo parted -l
# 查看 NVMe 设备
sudo nvme list
输出示例 (lsblk -f):
NAME FSTYPE LABEL UUID MOUNTPOINT
sda
├─sda1 vfat EFI 6E5B-4D6A /boot/efi
├─sda2 ext4 boot b8e3f0a2-7e1f-4c02-bb69-58a63b8c20a2 /boot
└─sda3 LVM2_mem p7qB0i-GYxZ-6BwV-1hGj-fY8T-6XeZ-0KqR0D
├─ubuntu--vg-root ext4 a1b2c3d4-e5f6-7890-abcd-ef1234567890 /
└─ubuntu--vg-swap swap 98765432-10fe-dcba-9876-543210fedcba [SWAP]
nvme0n1
└─nvme0n1p1 ext4 data 123e4567-e89b-12d3-a456-426614174000 /data
✅ 解析:该系统使用 LVM 管理主硬盘 (sda),额外挂载 NVMe 磁盘用于数据存储。
四、磁盘分区管理命令:fdisk/gdisk/parted
4.1 fdisk 命令(MBR/GPT 兼容)
(1)基础交互模式
bash
sudo fdisk /dev/sdb # 操作第二块硬盘
交互命令:
m - 帮助菜单
p - 打印分区表
n - 新建分区
d - 删除分区
t - 更改分区类型
w - 写入更改并退出 (危险!)
q - 不保存退出
(2)非交互式分区(脚本化)
bash
# 创建单个主分区(使用全部空间)
echo -e "n\np\n\n\n\nw" | sudo fdisk /dev/sdb
# 详细解析:
# n = new partition
# p = primary partition
# [enter] = 默认分区号 (1)
# [enter] = 默认起始扇区
# [enter] = 默认结束扇区 (全部空间)
# w = write changes
4.2 gdisk 命令(仅 GPT)
bash
# 创建 GPT 分区表并添加分区
sudo gdisk /dev/sdc <<EOF
o # 创建新空GPT表
y # 确认
n # 新建分区
# 分区号 (默认1)
# 起始扇区 (默认2048)
# 结束扇区 (默认最大,或指定 +500G)
8300 # Linux文件系统类型代码
w # 写入
y # 确认
EOF
4.3 parted 命令(支持大磁盘)
bash
# 创建 GPT 分区表
sudo parted /dev/sdd mklabel gpt
# 创建单个分区(100% 空间)
sudo parted /dev/sdd mkpart primary ext4 0% 100%
# 设置启动标志(UEFI 系统需要)
sudo parted /dev/sda set 1 esp on
💡 最佳实践:
- 新服务器/大容量磁盘 (>2TB) 使用
gdisk或parted(GPT)- 虚拟机/小容量磁盘可使用
fdisk(兼容 MBR)- UEFI 系统必须使用 GPT + ESP (EFI 系统分区)
五、Linux 文件系统管理
5.1 Linux 支持的文件系统格式
| 文件系统 | 特点 | 适用场景 |
|---|---|---|
| ext4 | 日志型,稳定可靠,最大 1EB | 通用系统盘、数据盘 |
| XFS | 高性能,适合大文件,最大 8EB | 大型数据库、视频存储 |
| Btrfs | 高级特性(快照、压缩、RAID) | 需要数据保护的场景 |
| ZFS | 企业级(数据完整性校验) | 关键业务、NAS |
| FAT32 | 兼容性好,无权限管理 | U 盘、跨平台共享 |
| NTFS | Windows 兼容,支持大文件 | 双系统共享分区 |
| exFAT | 闪存优化,无日志 | SD 卡、SSD 移动盘 |
✅ Ubuntu 22.04 默认使用 ext4 作为系统文件系统。
5.2 创建文件系统命令:mkfs
(1)基础语法
bash
sudo mkfs.[文件系统类型] [选项] 设备
(2)常用文件系统创建
ext4 (推荐通用)
bash
# 基础创建
sudo mkfs.ext4 /dev/sdb1
# 高级选项
sudo mkfs.ext4 -L "data" -m 1 -b 4096 -E lazy_journal_init=1 /dev/sdb1
# -L: 卷标 (便于识别)
# -m: 保留块百分比 (1% 给root,避免磁盘满时系统崩溃)
# -b: 块大小 (4096=4K,适合大多数场景)
# -E: 扩展选项 (lazy_journal_init 加速大磁盘格式化)
XFS (高性能)
bash
sudo mkfs.xfs -L "video_storage" -d su=256k,sw=4 /dev/sdc1
# -d su/sw: 优化 RAID 阵列性能 (stripe unit/width)
Btrfs (高级特性)
bash
# 创建并启用透明压缩
sudo mkfs.btrfs -L "backup" -O ^extref /dev/sdd1
sudo mount -o compress=zstd /dev/sdd1 /mnt/backup
(3)非交互式确认
bash
# 强制格式化(无确认提示)
echo y | sudo mkfs.ext4 /dev/sdb1
5.3 创建文件系统的其他工具
(1)mkfs (通用前端)
bash
# 自动选择文件系统类型
sudo mkfs -t ext4 /dev/sdb1
(2)专门工具
bash
# FAT32 (适用于 U 盘)
sudo mkfs.vfat -F 32 -n "USB_DRIVE" /dev/sde1
# NTFS (Windows 兼容)
sudo apt install ntfs-3g -y
sudo mkfs.ntfs -f -L "WIN_SHARE" /dev/sdf1
# -f: 快速格式化
(3)GUI 工具 (Ubuntu Desktop)
bash
# 安装磁盘工具
sudo apt install gnome-disks -y
gnome-disks # 图形界面管理
六、文件系统的挂载和卸载
6.1 挂载磁盘分区:mount
(1)临时挂载(重启失效)
bash
# 创建挂载点
sudo mkdir -p /mnt/data
# 挂载分区
sudo mount /dev/sdb1 /mnt/data
# 指定文件系统类型
sudo mount -t ext4 /dev/sdb1 /mnt/data
# 挂载选项示例
sudo mount -o noatime,nodiratime,defaults /dev/sdb1 /mnt/data
# noatime/nodiratime: 提升性能(不更新访问时间)
(2)特殊设备挂载
bash
# 挂载 ISO 镜像
sudo mkdir /mnt/iso
sudo mount -o loop ubuntu-22.04.iso /mnt/iso
# 挂载 NFS 共享
sudo apt install nfs-common -y
sudo mount -t nfs 192.168.1.100:/share /mnt/nfs
# 挂载 CIFS/SMB (Windows 共享)
sudo apt install cifs-utils -y
sudo mount -t cifs //server/share /mnt/smb -o user=alice,password=pass123,uid=1000,gid=1000
6.2 永久挂载:/etc/fstab
(1)配置文件格式
<设备标识> <挂载点> <文件系统> <选项> <dump> <pass>
(2)安全标识方式(避免设备名变更)
| 方式 | 命令示例 | 优点 |
|---|---|---|
| UUID | UUID=a1b2c3d4... |
唯一且稳定 |
| LABEL | LABEL=data |
人类可读 |
| /dev/disk/by-id | /dev/disk/by-id/ata-WDC... |
基于硬件ID |
bash
# 查看设备标识
sudo blkid /dev/sdb1
# 输出: /dev/sdb1: UUID="a1b2c3d4-e5f6-7890-abcd-ef1234567890" TYPE="ext4" PARTUUID="12345678-01"
# 编辑 fstab
sudo nano /etc/fstab
(3)/etc/fstab 配置示例
# 使用 UUID (推荐)
UUID=a1b2c3d4-e5f6-7890-abcd-ef1234567890 /mnt/data ext4 defaults,noatime,nodiratime 0 2
# 使用 LABEL
LABEL=backup /backup xfs defaults 0 2
# 交换分区
UUID=98765432-10fe-dcba-9876-543210fedcba none swap sw 0 0
# 临时文件系统 (内存)
tmpfs /tmp tmpfs defaults,noatime,nosuid,size=2G 0 0
🔑 重要参数:
defaults:rw, suid, dev, exec, auto, nouser, asyncnoatime,nodiratime:提升性能(不记录访问时间)nofail:设备不存在时启动不失败(适用于可移动设备)0(dump):0=不备份,1=每天备份(通常为0)pass:0=不检查,1=根分区,2=其他分区(fsck 顺序)
(4)验证 fstab
bash
# 模拟挂载所有条目(不实际挂载)
sudo mount -a
# 检查错误
sudo findmnt --verify
# 重启后自动挂载
sudo systemctl daemon-reload
6.3 卸载磁盘分区:umount
(1)基础卸载
bash
# 正常卸载
sudo umount /mnt/data
# 通过设备卸载
sudo umount /dev/sdb1
(2)强制卸载
bash
# 当设备忙时(有进程使用)
sudo umount -l /mnt/data # lazy 卸载:当不再使用时立即卸载
sudo umount -f /mnt/data # 强制卸载(NFS 专用,慎用)
(3)卸载前检查
bash
# 查看谁在使用挂载点
sudo lsof +D /mnt/data
# 或
sudo fuser -vm /mnt/data
# 终止使用进程(谨慎!)
sudo fuser -km /mnt/data # kill all processes
⚠️ 警告:强制卸载可能导致数据损坏!确保没有进程正在写入。
七、文件系统检查与维护
7.1 文件系统检查和修复:fsck
(1)何时需要 fsck
- 系统异常关机
- 文件系统报告错误
- 定期维护(每30次挂载或180天)
(2)安全执行步骤
bash
# 步骤1:卸载分区
sudo umount /dev/sdb1
# 步骤2:检查(不修复)
sudo fsck -N /dev/sdb1 # 仅显示将执行的操作
sudo fsck -n /dev/sdb1 # 只读模式检查
# 步骤3:修复(交互式)
sudo fsck -y /dev/sdb1 # -y: 自动确认所有修复
# 或
sudo fsck -p /dev/sdb1 # -p: 自动修复安全问题
# 步骤4:验证
sudo fsck -v /dev/sdb1 # -v: 详细输出
(3)ext4 特定选项
bash
# 检查 inode 表
sudo fsck.ext4 -f -c /dev/sdb1
# -f: 强制检查(即使标记为clean)
# -c: 检查坏块并添加到坏块列表
(4)XFS 特定工具
bash
# XFS 不能卸载时检查
sudo xfs_check /dev/sdc1
# 修复(必须卸载)
sudo umount /dev/sdc1
sudo xfs_repair /dev/sdc1
# 严重损坏时
sudo xfs_repair -L /dev/sdc1 # -L: 清除日志(最后手段)
⚠️ 警告:在已挂载的文件系统上运行 fsck 会导致灾难性数据损坏!
7.2 查看磁盘使用情况:df
(1)基础用法
bash
# 人类可读格式
df -h
# -h: human-readable (GB/MB)
# 指定文件系统类型
df -h -t ext4
# 查看 inode 使用
df -i
(2)高级选项
bash
# 仅显示特定挂载点
df -h /home /mnt/data
# 显示所有文件系统(包括虚拟)
df -aTh
# -T: 显示文件系统类型
# -a: 包括虚拟文件系统
输出示例:
Filesystem Type Size Used Avail Use% Mounted on
/dev/sda3 ext4 50G 20G 28G 42% /
/dev/sdb1 ext4 1.8T 450G 1.3T 26% /mnt/data
tmpfs tmpfs 3.9G 0 3.9G 0% /run/user/1000
7.3 查看文件/目录磁盘使用:du
(1)基础用法
bash
# 当前目录总大小
du -sh .
# -s: summary (总和)
# -h: human-readable
# 列出子目录大小
du -h --max-depth=1 /var
(2)高级技巧
bash
# 按大小排序(找出大目录)
du -h /home | sort -h
# 仅显示大于 1GB 的目录
du -h /var | awk '$1 ~ /G$/ && $1+0 > 1'
# 排除特定类型
du -h --exclude="*.log" /var/log
# 按修改时间筛选
find /var -type f -mtime -7 -exec du -ch {} + | grep total$
💡 实用组合:快速定位大文件
bashsudo find / -xdev -type f -size +100M -exec ls -lh {} \; | awk '{ print $9 ": " $5 }'
八、综合实战案例:添加新硬盘并配置自动挂载
目标:为 Ubuntu 22.04 服务器添加一块 2TB 新硬盘,格式化为 ext4,挂载到 /data,并配置开机自动挂载。
bash
#!/bin/bash
# add_new_disk.sh
echo "=== 1. 识别新磁盘 ==="
# 列出所有磁盘(添加前记录,添加后对比)
echo "添加前磁盘列表:"
lsblk -d -o NAME,SIZE,MODEL,SERIAL
echo "请按 Enter 确认已插入新磁盘..."
read
echo "添加后磁盘列表:"
NEW_DISK=$(lsblk -dno NAME,SIZE | grep "1.8T\|2T" | head -1 | awk '{print $1}')
echo "检测到新磁盘: /dev/$NEW_DISK"
if [ -z "$NEW_DISK" ]; then
echo "错误:未检测到 2TB 左右的新磁盘!"
exit 1
fi
echo "=== 2. 创建 GPT 分区表和单个分区 ==="
sudo parted /dev/$NEW_DISK mklabel gpt
sudo parted /dev/$NEW_DISK mkpart primary ext4 0% 100%
sudo parted /dev/$NEW_DISK print
echo "=== 3. 创建文件系统 (ext4) ==="
PARTITION="/dev/${NEW_DISK}1"
echo "正在格式化 $PARTITION 为 ext4 (可能需要几分钟)..."
sudo mkfs.ext4 -L "data" -m 1 -b 4096 -E lazy_journal_init=1 $PARTITION
echo "=== 4. 创建挂载点并临时挂载 ==="
sudo mkdir -p /data
sudo mount $PARTITION /data
# 验证挂载
if ! mountpoint -q /data; then
echo "错误:挂载失败!"
exit 1
fi
echo "=== 5. 配置永久挂载 (/etc/fstab) ==="
# 获取 UUID
UUID=$(sudo blkid -s UUID -o value $PARTITION)
echo "分区 UUID: $UUID"
# 备份 fstab
sudo cp /etc/fstab /etc/fstab.bak_$(date +%Y%m%d)
# 添加 fstab 条目
echo "UUID=$UUID /data ext4 defaults,noatime,nodiratime,errors=remount-ro 0 2" | sudo tee -a /etc/fstab
# 验证 fstab
if ! sudo mount -a; then
echo "错误:fstab 配置有误!恢复备份..."
sudo cp /etc/fstab.bak_$(date +%Y%m%d) /etc/fstab
exit 1
fi
echo "=== 6. 设置权限 ==="
sudo chown -R $(whoami):$(whoami) /data
sudo chmod -R 755 /data
echo "=== 7. 验证最终状态 ==="
df -h /data
lsblk -f | grep -A3 "$NEW_DISK"
echo -e "\n✅ 新硬盘部署完成!"
echo " - 挂载点: /data"
echo " - 文件系统: ext4"
echo " - 容量: $(df -h /data | awk 'NR==2 {print $2}')"
echo " - 建议:将重要数据移至此分区"
🔒 安全增强:
- 关键操作前备份配置文件
- 验证每一步操作结果
- 使用 UUID 而非设备名(避免设备名变更)
- 设置合理的挂载选项(noatime 提升性能,errors=remount-ro 防止损坏)
九、本章小结
| 功能类别 | 核心命令/文件 | 关键要点 |
|---|---|---|
| 磁盘识别 | lsblk, fdisk -l |
理解设备命名规则 |
| 分区管理 | fdisk, gdisk, parted |
GPT 适用于大磁盘/UEFI |
| 文件系统创建 | mkfs.ext4, mkfs.xfs |
根据场景选择合适文件系统 |
| 临时挂载 | mount |
理解挂载选项对性能的影响 |
| 永久挂载 | /etc/fstab |
必须使用 UUID/LABEL |
| 文件系统检查 | fsck, xfs_repair |
只能在卸载状态下运行 |
| 空间监控 | df, du |
定期检查避免 100% 使用率 |
最佳实践总结
- 分区策略 :
- 系统盘:分
/,/boot,/home,/var(避免单点故障) - 数据盘:单一分区(除非有特殊需求)
- 系统盘:分
- 文件系统选择 :
- 通用:ext4
- 大文件/高性能:XFS
- 需要快照/压缩:Btrfs
- fstab 安全 :
- 总是备份
/etc/fstab前再修改 - 使用
mount -a验证配置 - 添加
nofail选项用于可移动设备
- 总是备份
- 维护计划 :
- 定期运行
df -h监控空间 - 文件系统满 85% 时告警
- 每季度检查一次文件系统健康
- 定期运行
十、习题与实践
-
为什么在已挂载的文件系统上运行
fsck是危险的?→ 可能导致元数据不一致,造成数据损坏或丢失。
-
/etc/fstab中的pass字段值 0、1、2 分别表示什么?→ 0:不检查;1:根文件系统(首先检查);2:其他文件系统(按顺序检查)。
-
如何查找
/home目录下大于 500MB 的文件?bashfind /home -type f -size +500M -exec ls -lh {} \; -
使用
parted为 10TB 磁盘创建单一分区的命令是什么?bashsudo parted /dev/sdX mklabel gpt sudo parted /dev/sdX mkpart primary ext4 0% 100% -
简述 GPT 相比 MBR 的优势。
→ 支持 >2TB 磁盘、最多 128 个主分区、分区表备份(防损坏)、唯一分区 GUID。
📌 重要提醒 :
本章所有操作均在 Ubuntu 22.04 LTS 验证。
磁盘操作风险极高:
- 操作前使用
lsblk和sudo fdisk -l确认目标设备- 关键数据务必提前备份
- 生产环境使用带测试的自动化脚本(如 Ansible)
谨记:"rm -rf /" 和错误的磁盘操作是运维两大噩梦!