Linux 系统磁盘挂载完全指南

2019-04-10 Linux 运维

前言

在 Linux 系统运维中,磁盘管理是最基础也是最重要的技能之一。无论是新服务器上线、磁盘扩容,还是数据盘挂载,都离不开磁盘分区、格式化和挂载操作。本文将详细介绍 Linux 下磁盘管理的完整流程,涵盖 fdisk 分区、ext4/xfs 格式化、fstab 配置以及 UUID 挂载等核心内容。

1. 磁盘基础概念

1.1 磁盘命名规则

在 Linux 中,磁盘设备通常遵循以下命名规则:

  • IDE 硬盘:/dev/hda, /dev/hdb ...
  • SATA/SCSI/SAS 硬盘:/dev/sda, /dev/sdb ...
  • NVMe SSD:/dev/nvme0n1, /dev/nvme1n1 ...
  • 虚拟磁盘:/dev/vda, /dev/vdb ...

其中:

  • sd = SCSI disk(如今泛指所有 SATA/SAS 硬盘)
  • a, b, c ... 表示第几块磁盘
  • 1, 2, 3 ... 表示第几个分区

1.2 分区表类型

分区表类型 最大磁盘 最大分区数 说明
MBR 2TB 4 个主分区 传统分区表,兼容性好
GPT 18EB 128+ 分区 新型分区表,支持大磁盘

2. 查看磁盘信息

在操作磁盘之前,先确认当前系统的磁盘状态:

# 查看所有磁盘和分区
lsblk

# 查看磁盘详细信息
fdisk -l

# 查看磁盘使用情况
df -h

# 查看块设备属性
blkid

示例输出:

NAME   MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sda      8:0    0  100G  0 disk
├─sda1   8:1    0    1G  0 part /boot
└─sda2   8:2    0   99G  0 part /
sdb      8:16   0  500G  0 disk

说明:sdb 是一块 500G 的新磁盘,尚未分区,我们将对其进行操作。

3. 使用 fdisk 进行分区

fdisk 是 Linux 下最常用的分区工具,适用于 MBR 分区表。

3.1 fdisk 基本操作

# 对 /dev/sdb 进行分区
fdisk /dev/sdb

进入 fdisk 交互界面后,常用命令如下:

命令 说明
m 显示帮助菜单
p 打印当前分区表
n 新建分区
d 删除分区
t 修改分区类型
w 保存并退出
q 不保存退出

3.2 创建新分区的完整步骤

Command (m for help): n          # 新建分区
Partition type:
   p   primary (0 primary, 0 extended, 4 free)
   e   extended
Select (default p): p            # 选择主分区
Partition number (1-4, default 1): 1   # 分区号
First sector (2048-1048575999, default 2048):  # 回车使用默认值
Last sector, +sectors or +size{K,M,G,T,P} (2048-1048575999, default 1048575999): +100G

Command (m for help): n          # 再创建一个分区
Partition number (2-4, default 2): 2
First sector (209717248-1048575999, default 209717248):
Last sector, +sectors or +size{K,M,G,T,P} (209717248-1048575999, default 1048575999):  # 回车使用剩余空间

Command (m for help): p          # 查看分区表
Command (m for help): w          # 保存并退出

3.3 使用 parted 处理 GPT 分区表

对于大于 2TB 的磁盘,需要使用 parted 工具:

parted /dev/sdb

# parted 交互命令
(parted) mklabel gpt              # 创建 GPT 分区表
(parted) mkpart primary ext4 0% 100G   # 创建第一个分区
(parted) mkpart primary ext4 100G 100%  # 创建第二个分区
(parted) print                    # 查看分区表
(parted) quit                     # 退出

4. 磁盘格式化

分区创建完成后,需要将分区格式化为特定的文件系统。

4.1 ext4 文件系统

ext4 是 Linux 最常用的文件系统,稳定可靠:

# 查看 mkfs 支持的文件系统
mkfs -t ext4 /dev/sdb1

# 或者使用 ext4 专用命令
mkfs.ext4 /dev/sdb1

# 格式化时指定卷标
mkfs.ext4 -L data /dev/sdb1

# 查看格式化后的信息
tune2fs -l /dev/sdb1

ext4 常用调优参数:

# 禁用文件系统自检(减少启动时间)
tune2fs -c 0 -i 0 /dev/sdb1

# 启用 dir_index 特性(加速大目录查找)
tune2fs -O dir_index /dev/sdb1

4.2 XFS 文件系统

XFS 是高性能日志文件系统,适合大文件和高并发场景:

# 安装 xfs 工具(如未安装)
yum install xfsprogs   # CentOS/RHEL
apt install xfsprogs   # Ubuntu/Debian

# 格式化 XFS
mkfs.xfs /dev/sdb2

# 查看 XFS 信息
xfs_info /dev/sdb2

# 调整 XFS 参数(需要在挂载后)
xfs_admin -L data /dev/sdb2   # 设置卷标

4.3 ext4 vs XFS 对比

特性 ext4 XFS
最大文件系统 1EB 8EB
最大文件 16TB 8EB
碎片整理 e4defrag xfs_fsr
适合场景 通用、启动盘 大文件、高并发
在线扩容 支持 支持
在线缩容 不支持 不支持

5. 手动挂载磁盘

5.1 mount 命令基础

# 创建挂载点
mkdir -p /data

# 挂载 ext4 分区
mount -t ext4 /dev/sdb1 /data

# 挂载 XFS 分区
mount -t xfs /dev/sdb2 /data2

# 查看挂载情况
mount | grep sdb
df -h | grep sdb

5.2 挂载选项详解

mount 命令支持多种选项,通过 -o 参数指定:

# 常用挂载选项
mount -o rw,noatime,nodiratime /dev/sdb1 /data
选项 说明
rw 读写模式
ro 只读模式
noatime 不更新访问时间(提升性能)
nodiratime 不更新目录访问时间
noexec 不允许执行二进制文件
nosuid 忽略 SUID 权限
nodev 不解释字符或块设备
usrquota 启用用户磁盘配额
grpquota 启用组磁盘配额

6. 配置 /etc/fstab 实现开机自动挂载

手动挂载在重启后会失效,需要配置 /etc/fstab 实现自动挂载。

6.1 fstab 文件格式

/etc/fstab 每行定义一个挂载点,包含 6 个字段:

<device>  <mount_point>  <filesystem>  <options>  <dump>  <pass>
字段 说明
device 设备路径或 UUID
mount_point 挂载点目录
filesystem 文件系统类型(ext4, xfs 等)
options 挂载选项(defaults, noatime 等)
dump 是否备份(0=不备份,1=备份)
pass fsck 检查顺序(0=不检查,1=优先,2=次优先)

6.2 使用设备路径挂载(不推荐)

# 编辑 fstab
vim /etc/fstab

# 添加如下行
/dev/sdb1    /data    ext4    defaults,noatime    0    2
/dev/sdb2    /data2   xfs     defaults,noatime    0    2

警告:使用 /dev/sdX 路径的风险在于,当系统中有多块磁盘时,设备名可能因启动顺序变化而改变,导致挂载错误。

6.3 使用 UUID 挂载(推荐)

UUID(Universally Unique Identifier)是文件系统的唯一标识符,不会因设备名变化而改变。

查看分区的 UUID

# 方法一:使用 blkid
blkid

# 方法二:查看 by-uuid 目录
ls -l /dev/disk/by-uuid/

# 方法三:使用 tune2fs(ext 系列)
tune2fs -l /dev/sdb1 | grep UUID

# 方法四:使用 xfs_admin(XFS)
xfs_admin -u /dev/sdb2

示例输出:

/dev/sdb1: UUID="a1b2c3d4-e5f6-7890-abcd-ef1234567890" TYPE="ext4"
/dev/sdb2: UUID="b2c3d4e5-f6a7-8901-bcde-f12345678901" TYPE="xfs"

使用 UUID 配置 fstab

# 编辑 fstab
vim /etc/fstab

# 添加如下行(使用 UUID)
UUID=a1b2c3d4-e5f6-7890-abcd-ef1234567890    /data    ext4    defaults,noatime    0    2
UUID=b2c3d4e5-f6a7-8901-bcde-f12345678901    /data2   xfs     defaults,noatime    0    2

6.4 验证 fstab 配置

在重启前务必验证配置是否正确,避免系统无法启动:

# 重新挂载所有 fstab 中的文件系统(验证配置)
mount -a

# 检查是否有报错
echo $?

# 查看当前挂载情况
df -h

# 如果有问题,立即修复 fstab
vim /etc/fstab

重要:如果 mount -a 报错,必须先修复再重启!错误的 fstab 可能导致系统进入紧急模式(emergency mode)。

7. 交换分区(Swap)挂载

如需添加 swap 分区,也可以将其加入 fstab:

# 查看当前 swap
swapon -s
free -h

# 创建 swap 分区后(假设为 /dev/sdb3)
mkswap /dev/sdb3

# 启用 swap
swapon /dev/sdb3

# 加入 fstab 实现开机自动启用
echo "UUID=$(blkid -s UUID -o value /dev/sdb3) none swap sw 0 0" >> /etc/fstab

8. 故障排查

8.1 磁盘不显示

# 重新扫描 SCSI 总线(无需重启)
echo "- - -" > /sys/class/scsi_host/host0/scan

# 检查是否识别到磁盘
lsblk
fdisk -l

8.2 分区后设备不显示

# 让内核重新读取分区表
partprobe /dev/sdb

# 或使用
partx -a /dev/sdb

8.3 无法挂载:wrong fs type

# 检查文件系统类型是否正确
blkid /dev/sdb1

# 确认内核支持该文件系统
cat /proc/filesystems | grep ext4
cat /proc/filesystems | grep xfs

# 如不支持,加载内核模块
modprobe ext4
modprobe xfs

8.4 fstab 错误导致无法启动

如果错误配置 fstab 后已经重启且系统无法启动:

  1. 在 GRUB 启动界面按 e 编辑启动项
  2. 在 linux 行末尾添加 init=/bin/bash
  3. 按 Ctrl+x 启动进入单用户模式
  4. 重新挂载根文件系统为可写:mount -o remount,rw /
  5. 修复 fstab:vim /etc/fstab
  6. 重启:reboot

9. 最佳实践总结

  1. 始终使用 UUID 而非设备路径:避免设备名变化导致的问题
  2. 格式化前备份重要数据:磁盘操作有风险,操作前确认
  3. 配置 fstab 后先 mount -a 测试:避免重启失败
  4. 合理选择文件系统:系统盘用 ext4,数据盘大文件场景用 XFS
  5. 添加 noatime 选项:减少不必要的磁盘写入,提升性能
  6. 定期检查磁盘健康:使用 smartctl 检查磁盘 SMART 信息
  7. 预留空间:避免将分区填满,建议保留 5-10% 空间
# 检查磁盘健康状态
smartctl -a /dev/sdb

# 查看 inode 使用情况
df -i

# 查看磁盘 IO 统计
iostat -x 1 5

10. 总结

本文详细介绍了 Linux 系统磁盘管理的完整流程,从磁盘分区(fdisk/parted)、文件系统格式化(ext4/XFS),到手动挂载和 fstab 自动挂载配置。关键要点:

  • 使用 fdisk 进行 MBR 分区,parted 进行 GPT 分区
  • ext4 通用稳定,XFS 适合大文件和高并发
  • 务必使用 UUID 而非设备路径配置 fstab
  • 配置 fstab 后先用 mount -a 验证再重启
  • 掌握基本故障排查方法,避免操作失误导致系统故障

通过以上步骤,你可以安全、高效地管理 Linux 服务器的磁盘资源。