Skip to content

磁盘管理

本章将介绍 Linux 磁盘管理,包括磁盘分区、文件系统创建、挂载管理、LVM 逻辑卷管理以及磁盘配额等内容。

磁盘概述

存储设备命名

bash
# Linux 存储设备命名规则

# SATA/SAS/USB 硬盘
/dev/sda    # 第一块硬盘
/dev/sdb    # 第二块硬盘
/dev/sda1   # 第一块硬盘的第一个分区

# NVMe 硬盘
/dev/nvme0n1    # 第一块 NVMe 硬盘
/dev/nvme0n1p1  # 第一块 NVMe 硬盘的第一个分区

# 虚拟硬盘
/dev/vda    # Virtio 虚拟硬盘
/dev/xvda   # Xen 虚拟硬盘

# 查看块设备
lsblk
# 输出示例:
# NAME   MAJ:MIN RM  SIZE RO TYPE MOUNTPOINTS
# sda      8:0    0  100G  0 disk
# ├─sda1   8:1    0   50G  0 part /
# └─sda2   8:2    0   50G  0 part /home

# 查看所有块设备
lsblk -a

# 显示文件系统类型
lsblk -f

分区表类型

类型说明最大分区最大磁盘
MBR (MSDOS)传统分区表4 个主分区或 3 主+1 扩展2TB
GPTGUID 分区表128 个主分区18EB

磁盘分区

fdisk - MBR 分区工具

bash
# fdisk - MBR 分区工具

# 查看磁盘分区
sudo fdisk -l
sudo fdisk -l /dev/sda

# 进入分区模式
sudo fdisk /dev/sda

# fdisk 交互命令:
# m - 显示帮助
# p - 显示分区表
# n - 创建新分区
# d - 删除分区
# t - 修改分区类型
# l - 显示分区类型列表
# w - 保存并退出
# q - 不保存退出
# a - 设置启动标志

# 创建分区示例:
# 1. 输入 n 创建新分区
# 2. 选择 p(主分区)或 e(扩展分区)
# 3. 输入分区号
# 4. 输入起始扇区(默认即可)
# 5. 输入结束扇区或大小(如 +50G)
# 6. 输入 w 保存

# 常用分区类型:
# 83 - Linux
# 82 - Linux swap
# 8e - Linux LVM
# fd - Linux RAID

# 非交互式创建分区
sudo fdisk /dev/sda << EOF
n
p
1


+50G
w
EOF

gdisk - GPT 分区工具

bash
# gdisk - GPT 分区工具

# 查看磁盘分区
sudo gdisk -l /dev/sda

# 进入分区模式
sudo gdisk /dev/sda

# gdisk 交互命令:
# ? - 显示帮助
# p - 显示分区表
# n - 创建新分区
# d - 删除分区
# t - 修改分区类型
# l - 显示分区类型列表
# w - 保存并退出
# q - 不保存退出

# 常用 GPT 分区类型:
# 8300 - Linux filesystem
# 8200 - Linux swap
# 8e00 - Linux LVM
# fd00 - Linux RAID
# ef00 - EFI System Partition
# ef02 - BIOS boot partition

parted - 高级分区工具

bash
# parted - 支持多种分区表的分区工具

# 查看分区
sudo parted -l
sudo parted /dev/sda print

# 创建 GPT 分区表
sudo parted /dev/sda mklabel gpt

# 创建 MBR 分区表
sudo parted /dev/sda mklabel msdos

# 创建分区
sudo parted /dev/sda mkpart primary ext4 1MiB 50GiB
sudo parted /dev/sda mkpart primary linux-swap 50GiB 58GiB
sudo parted /dev/sda mkpart primary ext4 58GiB 100%

# 删除分区
sudo parted /dev/sda rm 1

# 设置启动标志
sudo parted /dev/sda set 1 boot on

# 查看剩余空间
sudo parted /dev/sda print free

# 调整分区大小
sudo parted /dev/sda resizepart 1 100GB

# 非交互式操作
sudo parted -s /dev/sda mklabel gpt
sudo parted -s /dev/sda mkpart primary ext4 0% 100%

文件系统

常见文件系统

文件系统说明最大文件最大文件系统
ext4Linux 默认16TB1EB
XFS高性能、大文件8EB8EB
Btrfs现代、快照、压缩16EB16EB
NTFSWindows 兼容16TB256TB
FAT32跨平台兼容4GB2TB

mkfs - 创建文件系统

bash
# mkfs - 创建文件系统

# 创建 ext4 文件系统
sudo mkfs.ext4 /dev/sda1
sudo mkfs -t ext4 /dev/sda1

# 创建 XFS 文件系统
sudo mkfs.xfs /dev/sda1

# 创建 Btrfs 文件系统
sudo mkfs.btrfs /dev/sda1

# 创建 ext4 时指定参数
sudo mkfs.ext4 -L "data" -b 4096 /dev/sda1
# -L: 卷标
# -b: 块大小

# 创建交换分区
sudo mkswap /dev/sda2

# 启用交换分区
sudo swapon /dev/sda2

# 禁用交换分区
sudo swapoff /dev/sda2

# 查看交换分区
swapon -s

文件系统检查

bash
# fsck - 文件系统检查

# 检查文件系统(需要先卸载)
sudo umount /dev/sda1
sudo fsck /dev/sda1

# 检查并自动修复
sudo fsck -y /dev/sda1

# 强制检查
sudo fsck -f /dev/sda1

# 检查特定文件系统
sudo fsck.ext4 /dev/sda1
sudo fsck.xfs /dev/sda1

# 查看文件系统信息
sudo dumpe2fs /dev/sda1 | head -20
sudo xfs_info /dev/sda1

# 调整 ext4 参数
sudo tune2fs -l /dev/sda1          # 查看参数
sudo tune2fs -L "newlabel" /dev/sda1  # 修改卷标
sudo tune2fs -c 50 /dev/sda1       # 设置最大挂载次数
sudo tune2fs -i 30d /dev/sda1      # 设置检查间隔

挂载管理

mount - 挂载文件系统

bash
# mount - 挂载文件系统

# 基本挂载
sudo mount /dev/sda1 /mnt

# 指定文件系统类型
sudo mount -t ext4 /dev/sda1 /mnt

# 指定挂载选项
sudo mount -o rw,noatime /dev/sda1 /mnt

# 只读挂载
sudo mount -o ro /dev/sda1 /mnt

# 挂载 ISO 文件
sudo mount -o loop ubuntu.iso /mnt/iso

# 挂载 NFS 共享
sudo mount -t nfs 192.168.1.100:/share /mnt/nfs

# 挂载 CIFS/SMB 共享
sudo mount -t cifs //192.168.1.100/share /mnt/smb -o user=username

# 挂载 tmpfs(内存文件系统)
sudo mount -t tmpfs -o size=1G tmpfs /mnt/tmp

# 绑定挂载
sudo mount --bind /source /dest

# 查看已挂载的文件系统
mount
df -h

# 查看挂载点
findmnt

umount - 卸载文件系统

bash
# umount - 卸载文件系统

# 卸载
sudo umount /mnt
sudo umount /dev/sda1

# 强制卸载(危险)
sudo umount -f /mnt

# 延迟卸载
sudo umount -l /mnt

# 查看占用挂载点的进程
sudo lsof /mnt
sudo fuser -v /mnt

# 终止占用进程后卸载
sudo fuser -km /mnt
sudo umount /mnt

/etc/fstab 配置

bash
# /etc/fstab - 开机自动挂载配置

# 查看配置
cat /etc/fstab

# 格式:
# <设备>    <挂载点>    <文件系统>    <选项>    <dump>    <fsck>

# 示例:
# /dev/sda1    /           ext4    defaults,noatime    0    1
# /dev/sda2    /home       ext4    defaults            0    2
# /dev/sda3    swap        swap    defaults            0    0
# UUID=xxx     /data       ext4    defaults            0    2

# 常用挂载选项:
# defaults - 默认选项(rw, suid, dev, exec, auto, nouser, async)
# rw/ro    - 读写/只读
# noatime  - 不更新访问时间(提高性能)
# nodiratime - 不更新目录访问时间
# sync/async - 同步/异步 I/O
# noexec   - 不允许执行程序
# nosuid   - 禁用 SUID/SGID
# user     - 允许普通用户挂载
# noauto   - 不自动挂载

# dump 字段:是否被 dump 备份(0 或 1)
# fsck 字段:启动时 fsck 检查顺序(0 不检查,1 根分区,2 其他分区)

# 获取 UUID
sudo blkid /dev/sda1
lsblk -f

# 挂载所有 fstab 中的文件系统
sudo mount -a

# 卸载所有 fstab 中的文件系统
sudo umount -a

# 重新挂载
sudo mount -o remount,rw /mnt

# 验证 fstab 配置
sudo findmnt --verify

LVM 逻辑卷管理

LVM 概念

mermaid
graph TD
    A[物理磁盘 /dev/sda] --> B[物理卷 PV]
    C[物理磁盘 /dev/sdb] --> D[物理卷 PV]
    B --> E[卷组 VG]
    D --> E
    E --> F[逻辑卷 LV1]
    E --> G[逻辑卷 LV2]
    F --> H[文件系统]
    G --> I[文件系统]

物理卷管理

bash
# 创建物理卷
sudo pvcreate /dev/sdb
sudo pvcreate /dev/sdb /dev/sdc

# 查看物理卷
sudo pvdisplay
sudo pvs

# 查看物理卷详细信息
sudo pvdisplay /dev/sdb

# 删除物理卷
sudo pvremove /dev/sdb

# 移动物理卷数据
sudo pvmove /dev/sdb /dev/sdc

卷组管理

bash
# 创建卷组
sudo vgcreate vg01 /dev/sdb /dev/sdc

# 查看卷组
sudo vgdisplay
sudo vgs

# 扩展卷组
sudo vgextend vg01 /dev/sdd

# 缩小卷组
sudo vgreduce vg01 /dev/sdb

# 删除卷组
sudo vgremove vg01

# 重命名卷组
sudo vgrename vg01 vg02

逻辑卷管理

bash
# 创建逻辑卷
sudo lvcreate -L 50G -n lv01 vg01    # 指定大小
sudo lvcreate -l 100%FREE -n lv02 vg01    # 使用全部剩余空间

# 查看逻辑卷
sudo lvdisplay
sudo lvs

# 扩展逻辑卷
sudo lvextend -L +10G /dev/vg01/lv01    # 增加 10G
sudo lvextend -L 60G /dev/vg01/lv01      # 扩展到 60G
sudo lvextend -l +100%FREE /dev/vg01/lv01    # 使用全部剩余空间

# 扩展文件系统
sudo resize2fs /dev/vg01/lv01    # ext4
sudo xfs_growfs /mount/point     # XFS

# 缩小逻辑卷(需要先缩小文件系统)
sudo umount /dev/vg01/lv01
sudo e2fsck -f /dev/vg01/lv01
sudo resize2fs /dev/vg01/lv01 40G
sudo lvreduce -L 40G /dev/vg01/lv01

# 删除逻辑卷
sudo lvremove /dev/vg01/lv01

# 创建快照
sudo lvcreate -L 10G -s -n lv01_snap /dev/vg01/lv01

# 恢复快照
sudo lvconvert --merge /dev/vg01/lv01_snap

# LVM 完整示例
# 1. 创建物理卷
sudo pvcreate /dev/sdb

# 2. 创建卷组
sudo vgcreate vg_data /dev/sdb

# 3. 创建逻辑卷
sudo lvcreate -L 100G -n lv_data vg_data

# 4. 创建文件系统
sudo mkfs.ext4 /dev/vg_data/lv_data

# 5. 挂载
sudo mkdir /data
sudo mount /dev/vg_data/lv_data /data

# 6. 添加到 fstab
echo '/dev/vg_data/lv_data /data ext4 defaults 0 2' | sudo tee -a /etc/fstab

磁盘配额

启用配额

bash
# 安装配额工具
sudo apt install quota    # Debian/Ubuntu
sudo dnf install quota    # RHEL/CentOS

# 启用配额(在 /etc/fstab 中添加选项)
# /dev/sda1    /home    ext4    defaults,usrquota,grpquota    0    2

# 重新挂载
sudo mount -o remount /home

# 创建配额文件
sudo quotacheck -cug /home
sudo quotacheck -augv

# 启用配额
sudo quotaon /home

# 禁用配额
sudo quotaoff /home

设置配额

bash
# edquota - 编辑用户配额
sudo edquota -u username

# 配额文件格式:
# Filesystem    blocks    soft    hard    inodes    soft    hard
# /dev/sda1     1000      50000   60000   100       5000    6000

# blocks/inodes - 当前使用量
# soft - 软限制(超过后警告)
# hard - 硬限制(绝对上限)

# 编辑组配额
sudo edquota -g groupname

# 设置宽限期
sudo edquota -t

# 复制配额设置
sudo edquota -p user1 user2

# 查看配额
sudo repquota /home
sudo repquota -a

# 查看用户配额
quota -u username

磁盘监控

df - 磁盘使用情况

bash
# df - 查看文件系统磁盘使用情况

# 基本用法
df

# 人类可读格式
df -h

# 显示文件系统类型
df -T

# 显示 inode 使用情况
df -i

# 只显示指定类型
df -t ext4

# 排除指定类型
df -x tmpfs

# 显示完整信息
df -a

# 指定显示字段
df --output=source,target,size,used,avail

du - 目录大小

bash
# du - 查看目录或文件大小

# 查看当前目录大小
du -sh .

# 查看子目录大小
du -h --max-depth=1

# 按大小排序
du -h --max-depth=1 | sort -h

# 查看指定目录
du -sh /home/*

# 显示所有文件
du -ah /path

# 排除某些目录
du -sh --exclude="*.log" /var

# 统计总大小
du -csh /home/*

# 查看最大的 10 个目录
du -h --max-depth=1 / | sort -hr | head -10

iostat - I/O 统计

bash
# iostat - I/O 统计(需要安装 sysstat)

# 安装
sudo apt install sysstat

# 查看 I/O 统计
iostat

# 每 2 秒刷新
iostat 2

# 显示扩展统计
iostat -x

# 只显示磁盘
iostat -d

# 只显示 CPU
iostat -c

# 指定设备
iostat -x /dev/sda

# 输出解释:
# tps       - 每秒传输次数
# kB_read/s - 每秒读取 KB
# kB_wrtn/s - 每秒写入 KB
# kB_read   - 总读取 KB
# kB_wrtn   - 总写入 KB

iotop - I/O 监控

bash
# iotop - 交互式 I/O 监控

# 安装
sudo apt install iotop

# 启动
sudo iotop

# 只显示有 I/O 的进程
sudo iotop -o

# 只显示进程(不显示线程)
sudo iotop -P

# 非交互模式
sudo iotop -b -n 1

# 按用户过滤
sudo iotop -u username

# 快捷键:
# 左右箭头 - 排序
# r - 反向排序
# o - 只显示有 I/O 的进程
# p - 进程/线程切换
# a - 累计 I/O
# q - 退出

小结

本章介绍了 Linux 磁盘管理:

内容命令功能
分区fdisk, gdisk, parted磁盘分区
文件系统mkfs, fsck创建和检查文件系统
挂载mount, umount挂载和卸载文件系统
LVMpvcreate, vgcreate, lvcreate逻辑卷管理
配额quota, edquota磁盘配额管理
监控df, du, iostat, iotop磁盘使用监控

常用命令速查

bash
# 分区
sudo fdisk -l                    # 查看分区
sudo fdisk /dev/sda              # 分区操作

# 文件系统
sudo mkfs.ext4 /dev/sda1         # 创建文件系统
sudo fsck /dev/sda1              # 检查文件系统

# 挂载
sudo mount /dev/sda1 /mnt        # 挂载
sudo umount /mnt                 # 卸载

# LVM
sudo pvcreate /dev/sdb           # 创建物理卷
sudo vgcreate vg01 /dev/sdb      # 创建卷组
sudo lvcreate -L 50G -n lv01 vg01    # 创建逻辑卷

# 监控
df -h                            # 磁盘使用
du -sh *                         # 目录大小

下一步

下一章我们将学习 网络配置,了解 Linux 网络配置和管理。