Ubuntu入门学习教程,从入门到精通, Ubuntu 22.04 的磁盘存储管理(10)

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 管理流程

复制代码
物理磁盘 → 分区/不分区 → 创建文件系统 → 挂载 → 使用

⚠️ 警告:磁盘操作可能导致数据丢失!生产环境操作前务必:

  1. 备份重要数据
  2. 在测试环境验证命令
  3. 确认目标设备名称

二、磁盘分区简介

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) 使用 gdiskparted (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, async
  • noatime,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$

💡 实用组合:快速定位大文件

bash 复制代码
sudo 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 "   - 建议:将重要数据移至此分区"

🔒 安全增强

  1. 关键操作前备份配置文件
  2. 验证每一步操作结果
  3. 使用 UUID 而非设备名(避免设备名变更)
  4. 设置合理的挂载选项(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% 使用率

最佳实践总结

  1. 分区策略
    • 系统盘:分 /, /boot, /home, /var(避免单点故障)
    • 数据盘:单一分区(除非有特殊需求)
  2. 文件系统选择
    • 通用:ext4
    • 大文件/高性能:XFS
    • 需要快照/压缩:Btrfs
  3. fstab 安全
    • 总是备份 /etc/fstab 前再修改
    • 使用 mount -a 验证配置
    • 添加 nofail 选项用于可移动设备
  4. 维护计划
    • 定期运行 df -h 监控空间
    • 文件系统满 85% 时告警
    • 每季度检查一次文件系统健康

十、习题与实践

  1. 为什么在已挂载的文件系统上运行 fsck 是危险的?

    → 可能导致元数据不一致,造成数据损坏或丢失。

  2. /etc/fstab 中的 pass 字段值 0、1、2 分别表示什么?

    → 0:不检查;1:根文件系统(首先检查);2:其他文件系统(按顺序检查)。

  3. 如何查找 /home 目录下大于 500MB 的文件?

    bash 复制代码
    find /home -type f -size +500M -exec ls -lh {} \;
  4. 使用 parted 为 10TB 磁盘创建单一分区的命令是什么?

    bash 复制代码
    sudo parted /dev/sdX mklabel gpt
    sudo parted /dev/sdX mkpart primary ext4 0% 100%
  5. 简述 GPT 相比 MBR 的优势。

    → 支持 >2TB 磁盘、最多 128 个主分区、分区表备份(防损坏)、唯一分区 GUID。

📌 重要提醒

本章所有操作均在 Ubuntu 22.04 LTS 验证。
磁盘操作风险极高

  • 操作前使用 lsblksudo fdisk -l 确认目标设备
  • 关键数据务必提前备份
  • 生产环境使用带测试的自动化脚本(如 Ansible)

谨记:"rm -rf /" 和错误的磁盘操作是运维两大噩梦!

相关推荐
大聪明-PLUS2 小时前
Linux 网络虚拟化技术的演进
linux·嵌入式·arm·smarc
半桔2 小时前
【高并发架构】从 0 到亿,从单机部署到 K8s 编排:高并发架构的 8 级演进之路
linux·云原生·容器·架构·kubernetes
2501_909800812 小时前
Java IO框架
java·学习·io框架
●VON2 小时前
双重修炼:如何兼顾专业学习与博客创作的 2025 复盘
学习·von·25年度总结
脏脏a2 小时前
【Linux】从 fork 到进程终止:写时拷贝细节与常见退出方式
linux·运维·服务器·进程终止
大聪明-PLUS6 小时前
面向开发者的实用 GNU/Linux 命令(第二部分)
linux·嵌入式·arm·smarc
做cv的小昊10 小时前
计算机图形学:【Games101】学习笔记05——着色(插值、高级纹理映射)与几何(基本表示方法)
笔记·opencv·学习·计算机视觉·图形渲染·几何学
车载测试工程师10 小时前
CAPL学习-CAN相关函数-统计API函数
网络·网络协议·学习·capl·canoe
sorry#10 小时前
top简单使用
linux·运维