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 查看磁盘设备
# 列出所有块设备lsblk -f# -f: 显示文件系统类型、UUID、标签等# 详细设备信息sudofdisk-l# 或sudoparted-l# 查看 NVMe 设备sudonvme 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)基础交互模式
sudofdisk/dev/sdb# 操作第二块硬盘交互命令:
m - 帮助菜单 p - 打印分区表 n - 新建分区 d - 删除分区 t - 更改分区类型 w - 写入更改并退出 (危险!) q - 不保存退出(2)非交互式分区(脚本化)
# 创建单个主分区(使用全部空间)echo-e"n\np\n\n\n\nw"|sudofdisk/dev/sdb# 详细解析:# n = new partition# p = primary partition# [enter] = 默认分区号 (1)# [enter] = 默认起始扇区# [enter] = 默认结束扇区 (全部空间)# w = write changes4.2 gdisk 命令(仅 GPT)
# 创建 GPT 分区表并添加分区sudogdisk /dev/sdc<<EOF o # 创建新空GPT表 y # 确认 n # 新建分区 # 分区号 (默认1) # 起始扇区 (默认2048) # 结束扇区 (默认最大,或指定 +500G) 8300 # Linux文件系统类型代码 w # 写入 y # 确认 EOF4.3 parted 命令(支持大磁盘)
# 创建 GPT 分区表sudoparted/dev/sdd mklabel gpt# 创建单个分区(100% 空间)sudoparted/dev/sdd mkpart primary ext40%100%# 设置启动标志(UEFI 系统需要)sudoparted/dev/sdaset1esp 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)基础语法
sudomkfs.[文件系统类型][选项]设备(2)常用文件系统创建
ext4 (推荐通用)
# 基础创建sudomkfs.ext4 /dev/sdb1# 高级选项sudomkfs.ext4 -L"data"-m1-b4096-Elazy_journal_init=1/dev/sdb1# -L: 卷标 (便于识别)# -m: 保留块百分比 (1% 给root,避免磁盘满时系统崩溃)# -b: 块大小 (4096=4K,适合大多数场景)# -E: 扩展选项 (lazy_journal_init 加速大磁盘格式化)XFS (高性能)
sudomkfs.xfs -L"video_storage"-dsu=256k,sw=4/dev/sdc1# -d su/sw: 优化 RAID 阵列性能 (stripe unit/width)Btrfs (高级特性)
# 创建并启用透明压缩sudomkfs.btrfs -L"backup"-O ^extref /dev/sdd1sudomount-ocompress=zstd /dev/sdd1 /mnt/backup(3)非交互式确认
# 强制格式化(无确认提示)echoy|sudomkfs.ext4 /dev/sdb15.3 创建文件系统的其他工具
(1)mkfs (通用前端)
# 自动选择文件系统类型sudomkfs-t ext4 /dev/sdb1(2)专门工具
# FAT32 (适用于 U 盘)sudomkfs.vfat -F32-n"USB_DRIVE"/dev/sde1# NTFS (Windows 兼容)sudoaptinstallntfs-3g -ysudomkfs.ntfs -f -L"WIN_SHARE"/dev/sdf1# -f: 快速格式化(3)GUI 工具 (Ubuntu Desktop)
# 安装磁盘工具sudoaptinstallgnome-disks -y gnome-disks# 图形界面管理六、文件系统的挂载和卸载
6.1 挂载磁盘分区:mount
(1)临时挂载(重启失效)
# 创建挂载点sudomkdir-p /mnt/data# 挂载分区sudomount/dev/sdb1 /mnt/data# 指定文件系统类型sudomount-t ext4 /dev/sdb1 /mnt/data# 挂载选项示例sudomount-o noatime,nodiratime,defaults /dev/sdb1 /mnt/data# noatime/nodiratime: 提升性能(不更新访问时间)(2)特殊设备挂载
# 挂载 ISO 镜像sudomkdir/mnt/isosudomount-o loop ubuntu-22.04.iso /mnt/iso# 挂载 NFS 共享sudoaptinstallnfs-common -ysudomount-t nfs192.168.1.100:/share /mnt/nfs# 挂载 CIFS/SMB (Windows 共享)sudoaptinstallcifs-utils -ysudomount-t cifs //server/share /mnt/smb -ouser=alice,password=pass123,uid=1000,gid=10006.2 永久挂载:/etc/fstab
(1)配置文件格式
<设备标识> <挂载点> <文件系统> <选项> <dump> <pass>(2)安全标识方式(避免设备名变更)
| 方式 | 命令示例 | 优点 |
|---|---|---|
| UUID | UUID=a1b2c3d4... | 唯一且稳定 |
| LABEL | LABEL=data | 人类可读 |
| /dev/disk/by-id | /dev/disk/by-id/ata-WDC... | 基于硬件ID |
# 查看设备标识sudoblkid /dev/sdb1# 输出: /dev/sdb1: UUID="a1b2c3d4-e5f6-7890-abcd-ef1234567890" TYPE="ext4" PARTUUID="12345678-01"# 编辑 fstabsudonano/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
# 模拟挂载所有条目(不实际挂载)sudomount-a# 检查错误sudofindmnt --verify# 重启后自动挂载sudosystemctl daemon-reload6.3 卸载磁盘分区:umount
(1)基础卸载
# 正常卸载sudoumount/mnt/data# 通过设备卸载sudoumount/dev/sdb1(2)强制卸载
# 当设备忙时(有进程使用)sudoumount-l /mnt/data# lazy 卸载:当不再使用时立即卸载sudoumount-f /mnt/data# 强制卸载(NFS 专用,慎用)(3)卸载前检查
# 查看谁在使用挂载点sudolsof+D /mnt/data# 或sudofuser-vm /mnt/data# 终止使用进程(谨慎!)sudofuser-km /mnt/data# kill all processes⚠️警告:强制卸载可能导致数据损坏!确保没有进程正在写入。
七、文件系统检查与维护
7.1 文件系统检查和修复:fsck
(1)何时需要 fsck
- 系统异常关机
- 文件系统报告错误
- 定期维护(每30次挂载或180天)
(2)安全执行步骤
# 步骤1:卸载分区sudoumount/dev/sdb1# 步骤2:检查(不修复)sudofsck-N /dev/sdb1# 仅显示将执行的操作sudofsck-n /dev/sdb1# 只读模式检查# 步骤3:修复(交互式)sudofsck-y /dev/sdb1# -y: 自动确认所有修复# 或sudofsck-p /dev/sdb1# -p: 自动修复安全问题# 步骤4:验证sudofsck-v /dev/sdb1# -v: 详细输出(3)ext4 特定选项
# 检查 inode 表sudofsck.ext4 -f -c /dev/sdb1# -f: 强制检查(即使标记为clean)# -c: 检查坏块并添加到坏块列表(4)XFS 特定工具
# XFS 不能卸载时检查sudoxfs_check /dev/sdc1# 修复(必须卸载)sudoumount/dev/sdc1sudoxfs_repair /dev/sdc1# 严重损坏时sudoxfs_repair -L /dev/sdc1# -L: 清除日志(最后手段)⚠️警告:在已挂载的文件系统上运行 fsck 会导致灾难性数据损坏!
7.2 查看磁盘使用情况:df
(1)基础用法
# 人类可读格式df-h# -h: human-readable (GB/MB)# 指定文件系统类型df-h -t ext4# 查看 inode 使用df-i(2)高级选项
# 仅显示特定挂载点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/10007.3 查看文件/目录磁盘使用:du
(1)基础用法
# 当前目录总大小du-sh.# -s: summary (总和)# -h: human-readable# 列出子目录大小du-h --max-depth=1/var(2)高级技巧
# 按大小排序(找出大目录)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 -execdu-ch{}+|greptotal$💡实用组合:快速定位大文件
sudofind/ -xdev -type f -size +100M -execls-lh{}\;|awk'{ print $9 ": " $5 }'
八、综合实战案例:添加新硬盘并配置自动挂载
目标:为 Ubuntu 22.04 服务器添加一块 2TB 新硬盘,格式化为 ext4,挂载到/data,并配置开机自动挂载。
#!/bin/bash# add_new_disk.shecho"=== 1. 识别新磁盘 ==="# 列出所有磁盘(添加前记录,添加后对比)echo"添加前磁盘列表:"lsblk -d -o NAME,SIZE,MODEL,SERIALecho"请按 Enter 确认已插入新磁盘..."readecho"添加后磁盘列表:"NEW_DISK=$(lsblk -dno NAME,SIZE|grep"1.8T\|2T"|head-1|awk'{print $1}')echo"检测到新磁盘: /dev/$NEW_DISK"if[-z"$NEW_DISK"];thenecho"错误:未检测到 2TB 左右的新磁盘!"exit1fiecho"=== 2. 创建 GPT 分区表和单个分区 ==="sudoparted/dev/$NEW_DISKmklabel gptsudoparted/dev/$NEW_DISKmkpart primary ext40%100%sudoparted/dev/$NEW_DISKprintecho"=== 3. 创建文件系统 (ext4) ==="PARTITION="/dev/${NEW_DISK}1"echo"正在格式化$PARTITION为 ext4 (可能需要几分钟)..."sudomkfs.ext4 -L"data"-m1-b4096-Elazy_journal_init=1$PARTITIONecho"=== 4. 创建挂载点并临时挂载 ==="sudomkdir-p /datasudomount$PARTITION/data# 验证挂载if!mountpoint -q /data;thenecho"错误:挂载失败!"exit1fiecho"=== 5. 配置永久挂载 (/etc/fstab) ==="# 获取 UUIDUUID=$(sudoblkid -s UUID -o value $PARTITION)echo"分区 UUID:$UUID"# 备份 fstabsudocp/etc/fstab /etc/fstab.bak_$(date+%Y%m%d)# 添加 fstab 条目echo"UUID=$UUID/data ext4 defaults,noatime,nodiratime,errors=remount-ro 0 2"|sudotee-a /etc/fstab# 验证 fstabif!sudomount-a;thenecho"错误:fstab 配置有误!恢复备份..."sudocp/etc/fstab.bak_$(date+%Y%m%d)/etc/fstabexit1fiecho"=== 6. 设置权限 ==="sudochown-R$(whoami):$(whoami)/datasudochmod-R755/dataecho"=== 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 的文件?find/home -type f -size +500M -execls-lh{}\;使用
parted为 10TB 磁盘创建单一分区的命令是什么?sudoparted/dev/sdX mklabel gptsudoparted/dev/sdX mkpart primary ext40%100%简述 GPT 相比 MBR 的优势。
→ 支持 >2TB 磁盘、最多 128 个主分区、分区表备份(防损坏)、唯一分区 GUID。
📌重要提醒:
本章所有操作均在Ubuntu 22.04 LTS验证。
磁盘操作风险极高:
- 操作前使用
lsblk和sudo fdisk -l确认目标设备- 关键数据务必提前备份
- 生产环境使用带测试的自动化脚本(如 Ansible)
谨记:“rm -rf /” 和错误的磁盘操作是运维两大噩梦!