本文档全面介绍了服务器磁盘管理的完整流程,包括磁盘分区、文件系统格式化、挂载配置以及性能优化和数据安全最佳实践。

目录


磁盘管理基础

查看磁盘列表

方法一:使用 fdisk

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 查看所有磁盘和分区
sudo fdisk -l

# 示例输出
Disk /dev/vda: 107.4 GB, 107374182400 bytes, 209715200 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk label type: dos
Disk identifier: 0x000cbc62

Device Boot Start End Blocks Id System
/dev/vda1 * 2048 209715166 104856559+ 83 Linux

Disk /dev/vdb: 536.9 GB, 536870912000 bytes, 1048576000 sectors

方法二:使用 lsblk

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 以树状结构显示块设备
lsblk

# 示例输出
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
vda 253:0 0 100G 0 disk
└─vda1 253:1 0 100G 0 part /
vdb 253:16 0 500G 0 disk
└─vdb1 253:17 0 500G 0 part /data

# 仅显示磁盘,不显示分区
lsblk -d

# 以人类可读格式显示
lsblk -o NAME,SIZE,TYPE,MOUNTPOINT,FSTYPE

方法三:使用 df

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 查看已挂载的文件系统
df -lh

# 示例输出
Filesystem Size Used Avail Use% Mounted on
devtmpfs 12G 0 12G 0% /dev
tmpfs 12G 0 12G 0% /dev/shm
tmpfs 12G 34M 12G 1% /run
tmpfs 12G 0 12G 0% /sys/fs/cgroup
/dev/vda1 100G 4.7G 96G 5% /
/dev/vdb1 493G 12G 456G 3% /data

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

# 显示 inode 使用情况
df -i

方法四:使用 ls /dev

1
2
3
4
5
# 查看所有磁盘设备
ls -l /dev/vd*

# 查看所有磁盘和分区
ls -l /dev/sd*

磁盘分区工具对比

工具 支持磁盘大小 分区数量 分区表类型 适用场景
fdisk < 2TB 最多 4 个主分区 MBR 传统磁盘,小容量磁盘
parted > 2TB 最多 128 个主分区 GPT 大容量磁盘,UEFI 启动
gdisk > 2TB 最多 128 个主分区 GPT 大容量磁盘,MBR 转 GPT
cfdisk < 2TB 最多 4 个主分区 MBR 交互式分区,界面友好

磁盘分区操作

使用 fdisk 分区

基本分区操作

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 进入 fdisk 交互模式
sudo fdisk /dev/vdb

# 交互式命令说明
n # 创建新分区
p # 创建主分区 (primary)
e # 创建扩展分区 (extended)
l # 创建逻辑分区 (logical)
w # 保存并退出
q # 退出不保存
d # 删除分区
m # 显示帮助
p # 打印分区表
t # 修改分区类型
a # 切换启动标志

自动化分区脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#!/bin/bash
# 自动分区脚本
DISK="/dev/vdb"

# 创建分区
sudo fdisk $DISK << EOF
n
p
1


w
EOF

# 等待分区创建完成
sleep 2

# 格式化分区
sudo mkfs -t ext4 ${DISK}1

echo "分区完成: ${DISK}1"

使用 parted 分区

parted 基本操作

1
2
3
4
5
6
7
8
9
10
# 进入 parted 交互模式
sudo parted /dev/vdb

# 交互式命令说明
mklabel gpt # 创建 GPT 分区表
mklabel msdos # 创建 MBR 分区表
mkpart primary 0% 100% # 创建主分区
rm 1 # 删除分区 1
print # 打印分区表
quit # 退出

parted 自动化脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#!/bin/bash
# 使用 parted 自动分区
DISK="/dev/vdb"

# 创建 GPT 分区表
sudo parted -s $DISK mklabel gpt

# 创建分区(使用 100% 空间)
sudo parted -s $DISK mkpart primary 0% 100%

# 设置分区标志
sudo parted -s $DISK set 1 boot on

# 打印分区表
sudo parted $DISK print

echo "分区完成"

使用 gdisk 分区

gdisk 基本操作

1
2
3
4
5
6
7
8
9
10
11
# 进入 gdisk 交互模式
sudo gdisk /dev/vdb

# 交互式命令说明
n # 创建新分区
p # 打印分区表
w # 保存并退出
q # 退出不保存
d # 删除分区
t # 修改分区类型
l # 列出分区类型

MBR 转 GPT

1
2
3
4
5
6
7
8
# 使用 gdisk 将 MBR 转换为 GPT
sudo gdisk /dev/sda

# 在 gdisk 中输入
r # 进入恢复/转换模式
g # 将 MBR 转换为 GPT
w # 保存并退出
y # 确认写入

文件系统格式化

ext4 文件系统

ext4 特点

  • 稳定性高:经过长期验证,稳定性好
  • 兼容性好:几乎所有 Linux 发行版都支持
  • 性能均衡:在各种场景下都有良好的性能表现
  • 支持大文件:支持最大 16TB 的文件和 1EB 的文件系统

ext4 格式化命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# 基本格式化
sudo mkfs.ext4 /dev/vdb1

# 带标签格式化
sudo mkfs.ext4 -L data /dev/vdb1

# 设置块大小(默认 4096)
sudo mkfs.ext4 -b 4096 /dev/vdb1

# 设置 inode 大小(默认 256)
sudo mkfs.ext4 -I 512 /dev/vdb1

# 调整预留空间(默认 5%)
sudo mkfs.ext4 -m 1 /dev/vdb1

# 禁用日志(不推荐)
sudo mkfs.ext4 -O ^has_journal /dev/vdb1

# 快速格式化(不清理数据区)
sudo mkfs.ext4 -E lazy_itable_init=1 /dev/vdb1

xfs 文件系统

xfs 特点

  • 高性能:特别适合大文件和高并发场景
  • 在线扩展:支持在线扩展文件系统大小
  • 快速格式化:格式化速度比 ext4 快
  • 适合大容量磁盘:适合 1TB 以上的磁盘

xfs 格式化命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 基本格式化
sudo mkfs.xfs /dev/vdb1

# 带标签格式化
sudo mkfs.xfs -L data /dev/vdb1

# 设置块大小(默认 4096)
sudo mkfs.xfs -b size=4096 /dev/vdb1

# 设置日志大小(默认 256M)
sudo mkfs.xfs -l size=512m /dev/vdb1

# 设置 inode 大小(默认 512)
sudo mkfs.xfs -i size=1024 /dev/vdb1

# 禁用日志(不推荐)
sudo mkfs.xfs -l lazy-count=1 /dev/vdb1

btrfs 文件系统

btrfs 特点

  • 快照功能:支持创建文件系统快照
  • 压缩功能:支持透明压缩
  • 校验和:自动校验数据完整性
  • 在线扩展和收缩:支持在线调整文件系统大小
  • 多设备支持:支持 RAID 配置

btrfs 格式化命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 基本格式化
sudo mkfs.btrfs /dev/vdb1

# 带标签格式化
sudo mkfs.btrfs -L data /dev/vdb1

# 启用压缩
sudo mkfs.btrfs -c zstd /dev/vdb1

# 设置块大小
sudo mkfs.btrfs -s 4096 /dev/vdb1

# 多设备 RAID
sudo mkfs.btrfs -d raid1 /dev/vdb1 /dev/vdb2

文件系统选择建议

不同场景的文件系统选择

场景 推荐文件系统 说明
系统盘 ext4 稳定性好,兼容性佳
数据盘 xfs 性能好,适合大文件
数据库 xfs/ext4 根据数据库类型选择
虚拟化 xfs 支持大文件和高性能
备份存储 ext4/btrfs 稳定性优先
媒体存储 xfs 大文件性能好
开发测试 btrfs 快照功能方便

选择建议

  1. 系统盘:推荐使用 ext4,稳定性好,兼容性佳
  2. 数据盘:推荐使用 xfs,性能好,适合大文件
  3. 数据库:MySQL 推荐 ext4,PostgreSQL 推荐 xfs
  4. 虚拟化:推荐使用 xfs,支持大文件和高性能
  5. 备份存储:推荐使用 ext4 或 btrfs,稳定性优先

挂载配置

临时挂载

基本挂载命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# 基本挂载
sudo mount /dev/vdb1 /data

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

# 以只读方式挂载
sudo mount -o ro /dev/vdb1 /data

# 以读写方式挂载
sudo mount -o rw /dev/vdb1 /data

# 挂载时禁用访问时间更新
sudo mount -o noatime /dev/vdb1 /data

# 挂载时禁用更新时间更新
sudo mount -o nodiratime /dev/vdb1 /data

# 挂载时同时禁用访问时间和更新时间
sudo mount -o noatime,nodiratime /dev/vdb1 /data

挂载选项说明

选项 说明 适用场景
noatime 禁用访问时间更新 高性能场景
nodiratime 禁用目录访问时间更新 性能优化
relatime 相对访问时间更新 平衡性能和兼容性
async 异步写入 性能优先
sync 同步写入 数据安全优先
defaults 默认选项 一般用途

永久挂载

使用 UUID 挂载

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 查看磁盘 UUID
sudo blkid /dev/vdb1

# 输出示例
/dev/vdb1: UUID="99cfbb8f-0441-4469-a8fd-e85f8d2a2100" TYPE="ext4"

# 编辑 /etc/fstab
sudo vi /etc/fstab

# 添加以下行
UUID=99cfbb8f-0441-4469-a8fd-e85f8d2a2100 /data ext4 defaults,noatime 0 0

# 测试 fstab 配置
sudo mount -a

# 查看挂载结果
df -lh

使用设备名称挂载

1
2
3
4
5
# 编辑 /etc/fstab
sudo vi /etc/fstab

# 添加以下行(不推荐,设备名称可能变化)
/dev/vdb1 /data ext4 defaults,noatime 0 0

挂载选项示例

1
2
3
4
5
6
7
8
# 高性能挂载选项
UUID=99cfbb8f-0441-4469-a8fd-e85f8d2a2100 /data ext4 defaults,noatime,nodiratime 0 0

# 数据安全挂载选项
UUID=99cfbb8f-0441-4469-a8fd-e85f8d2a2100 /data ext4 defaults,noatime,data=journal 0 0

# 数据库挂载选项
UUID=99cfbb8f-0441-4469-a8fd-e85f8d2a2100 /data ext4 defaults,noatime,nobarrier 0 0

挂载选项优化

性能优化挂载选项

1
2
3
4
5
6
7
8
9
10
11
# 基础性能优化
noatime,nodiratime

# 进阶性能优化
noatime,nodiratime,nobarrier

# 数据库专用优化
noatime,nodiratime,nobarrier,commit=1

# 高并发优化
noatime,nodiratime,nobarrier,commit=10,readahead=4096

安全挂载选项

1
2
3
4
5
6
7
8
# 基础安全
noexec,nosuid,nodev

# 进阶安全
noexec,nosuid,nodev,noatime

# 完整安全
noexec,nosuid,nodev,noatime,nodiratime

挂载选项组合

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 通用高性能
defaults,noatime,nodiratime,nobarrier

# 数据库高性能
defaults,noatime,nodiratime,nobarrier,commit=1

# Web 服务器
defaults,noatime,nodiratime

# 备份存储
defaults,noatime,data=journal

# 多媒体存储
defaults,noatime,readahead=8192

磁盘性能优化

I/O 调度器配置

查看当前 I/O 调度器

1
2
3
4
5
6
# 查看所有磁盘的 I/O 调度器
cat /sys/block/*/queue/scheduler

# 查看特定磁盘的 I/O 调度器
cat /sys/block/vda/queue/scheduler
cat /sys/block/vdb/queue/scheduler

I/O 调度器类型

调度器 说明 适用场景
noop 简单队列,适合 SSD SSD、虚拟化
deadline 保证请求响应时间 数据库、虚拟化
cfq 完全公平队列,适合机械硬盘 传统机械硬盘
mq-deadline 多队列 deadline 多队列 SSD
none 无调度器,适合 NVMe NVMe SSD

修改 I/O 调度器

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 临时修改(重启后失效)
echo noop | sudo tee /sys/block/vdb/queue/scheduler

# 永久修改(GRUB 配置)
sudo vi /etc/default/grub

# 修改 GRUB_CMDLINE_LINUX 行
GRUB_CMDLINE_LINUX="elevator=deadline"

# 更新 GRUB
sudo update-grub

# 重启生效
sudo reboot

不同场景的 I/O 调度器选择

场景 推荐调度器 说明
SSD noop 简单队列,减少延迟
NVMe none 无调度器,直接访问
数据库 deadline 保证响应时间
虚拟化 mq-deadline 多队列优化
机械硬盘 cfq 完全公平队列

挂载参数优化

SSD 优化参数

1
2
3
4
5
# SSD 专用挂载选项
UUID=99cfbb8f-0441-4469-a8fd-e85f8d2a2100 /data ext4 defaults,noatime,discard 0 0

# NVMe 专用挂载选项
UUID=99cfbb8f-0441-4469-a8fd-e85f8d2a2100 /data xfs defaults,noatime,nodiscard 0 0

数据库优化参数

1
2
3
4
5
# MySQL 优化参数
UUID=99cfbb8f-0441-4469-a8fd-e85f8d2a2100 /data ext4 defaults,noatime,nobarrier,commit=1 0 0

# PostgreSQL 优化参数
UUID=99cfbb8f-0441-4469-a8fd-e85f8d2a2100 /data xfs defaults,noatime,nobarrier 0 0

Web 服务器优化参数

1
2
3
4
5
# Web 服务器优化参数
UUID=99cfbb8f-0441-4469-a8fd-e85f8d2a2100 /data ext4 defaults,noatime,nodiratime 0 0

# 静态资源服务器
UUID=99cfbb8f-0441-4469-a8fd-e85f8d2a2100 /data xfs defaults,noatime,readahead=8192 0 0

SSD 性能优化

TRIM/DISCARD 配置

1
2
3
4
5
6
7
8
9
10
11
12
13
# 挂载时启用 TRIM
UUID=99cfbb8f-0441-4469-a8fd-e85f8d2a2100 /data ext4 defaults,noatime,discard 0 0

# 定期 TRIM(不使用 discard 选项时)
sudo vi /etc/cron.weekly/trim

# 添加以下内容
#!/bin/bash
fstrim -v /
fstrim -v /data

# 赋予执行权限
sudo chmod +x /etc/cron.weekly/trim

SSD 优化建议

  1. 启用 TRIM:定期清理未使用的块
  2. 减少写入:使用 noatime 减少元数据写入
  3. 预留空间:保留 10% 的空间用于垃圾回收
  4. 避免碎片:定期检查文件系统碎片

云服务器磁盘配置

阿里云磁盘配置

阿里云磁盘类型

磁盘类型 性能特点 适用场景 推荐文件系统
云效盘 高 IOPS,低延迟 数据库、中间件 xfs
云盘 性价比高 通用场景 ext4/xfs
SSD 云盘 高性能 高性能需求 xfs
ESSD 极致性能 极致性能需求 xfs

阿里云磁盘优化

1
2
3
4
5
6
7
8
# 阿里云 SSD 云盘优化
UUID=99cfbb8f-0441-4469-a8fd-e85f8d2a2100 /data xfs defaults,noatime,nodiratime 0 0

# 阿里云 ESSD 优化
UUID=99cfbb8f-0441-4469-a8fd-e85f8d2a2100 /data xfs defaults,noatime,nobarrier,commit=1 0 0

# 阿里云云效盘优化
UUID=99cfbb8f-0441-4469-a8fd-e85f8d2a2100 /data ext4 defaults,noatime,nobarrier 0 0

腾讯云磁盘配置

腾讯云磁盘类型

磁盘类型 性能特点 适用场景 推荐文件系统
普通云硬盘 性价比高 通用场景 ext4
SSD 云硬盘 高性能 高性能需求 xfs
高性能云硬盘 极致性能 极致性能需求 xfs

腾讯云磁盘优化

1
2
3
4
5
# 腾讯云 SSD 云硬盘优化
UUID=99cfbb8f-0441-4469-a8fd-e85f8d2a2100 /data xfs defaults,noatime,nodiratime 0 0

# 腾讯云高性能云硬盘优化
UUID=99cfbb8f-0441-4469-a8fd-e85f8d2a2100 /data xfs defaults,noatime,nobarrier,commit=1 0 0

AWS 磁盘配置

AWS 磁盘类型

磁盘类型 性能特点 适用场景 推荐文件系统
gp2 通用 SSD 通用场景 xfs
io1 高性能 SSD 高性能需求 xfs
st1 热存储 HDD 大数据量 xfs
sc1 冷存储 HDD 低成本 ext4

AWS 磁盘优化

1
2
3
4
5
# AWS gp2 优化
UUID=99cfbb8f-0441-4469-a8fd-e85f8d2a2100 /data xfs defaults,noatime,nodiratime 0 0

# AWS io1 优化
UUID=99cfbb8f-0441-4469-a8fd-e85f8d2a2100 /data xfs defaults,noatime,nobarrier,commit=1 0 0

数据安全与故障排查

数据备份策略

自动备份脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#!/bin/bash
# 自动备份脚本
BACKUP_DIR="/backup"
DATA_DIR="/data"
DATE=$(date +%Y%m%d)
TIME=$(date +%H%M%S)
BACKUP_NAME="backup_${DATE}_${TIME}"

# 创建备份目录
sudo mkdir -p ${BACKUP_DIR}/${BACKUP_NAME}

# 备份数据
sudo rsync -avz --delete ${DATA_DIR}/ ${BACKUP_DIR}/${BACKUP_NAME}/

# 清理旧备份(保留 7 天)
find ${BACKUP_DIR} -type d -mtime +7 -exec rm -rf {} \;

# 记录日志
echo "$(date): Backup completed - ${BACKUP_NAME}" >> ${BACKUP_DIR}/backup.log

定时备份配置

1
2
3
4
5
6
7
8
9
# 编辑 crontab
sudo crontab -e

# 添加定时备份任务
# 每天凌晨 2 点执行备份
0 2 * * * /path/to/backup.sh

# 每小时执行一次增量备份
0 * * * * /path/to/incremental_backup.sh

磁盘健康检查

SMART 检查

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 安装 smartmontools
sudo apt-get install smartmontools

# 启用 SMART
sudo smartctl -s on /dev/vdb

# 查看 SMART 信息
sudo smartctl -a /dev/vdb

# 检查磁盘健康状态
sudo smartctl -H /dev/vdb

# 运行自检
sudo smartctl -c /dev/vdb
sudo smartctl -t long /dev/vdb

# 查看自检结果
sudo smartctl -l selftest /dev/vdb

磁盘性能测试

1
2
3
4
5
6
7
8
9
10
11
# 写入测试
sudo dd if=/dev/zero of=/data/testfile bs=1M count=1024 conv=fdatasync

# 读取测试
sudo dd if=/data/testfile of=/dev/null bs=1M

# 随机 I/O 测试
sudo fio -filename=/data/testfile -direct=1 -rw=randrw -bs=4k -size=1G -numjobs=4 -runtime=60 -group_reporting -name=randtest

# 安装 fio
sudo apt-get install fio

常见问题排查

问题 1:磁盘空间不足

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 查看磁盘空间使用情况
df -lh

# 查看目录大小
du -sh /data/*

# 查看大文件
find /data -type f -size +1G -exec ls -lh {} \;

# 清理日志文件
sudo journalctl --vacuum-time=7d
sudo rm -rf /var/log/*.old

# 清理临时文件
sudo rm -rf /tmp/*

问题 2:磁盘读写慢

1
2
3
4
5
6
7
8
9
10
11
# 查看磁盘 I/O 使用情况
iostat -x 1

# 查看进程 I/O
iotop

# 查看磁盘队列深度
cat /sys/block/vdb/queue/nr_requests

# 调整 I/O 调度器
echo deadline > /sys/block/vdb/queue/scheduler

问题 3:磁盘挂载失败

1
2
3
4
5
6
7
8
9
10
11
# 检查磁盘是否存在
ls -l /dev/vdb*

# 检查文件系统
sudo fsck /dev/vdb1

# 手动挂载
sudo mount -t ext4 /dev/vdb1 /data

# 检查 fstab 配置
sudo mount -a

问题 4:磁盘只读

1
2
3
4
5
6
7
8
9
# 重新挂载为读写
sudo mount -o remount,rw /data

# 检查文件系统
sudo fsck /dev/vdb1

# 查看系统日志
sudo dmesg | grep -i error
sudo journalctl -xe

总结

本文档全面介绍了服务器磁盘管理的完整流程,包括:

1. 磁盘管理基础

  • 查看磁盘列表:使用 fdisklsblkdf 等命令
  • 磁盘分区工具对比fdiskpartedgdisk 的特点和适用场景

2. 磁盘分区操作

  • 使用 fdisk 分区:交互式和自动化分区
  • 使用 parted 分区:支持大容量磁盘
  • 使用 gdisk 分区:MBR 转 GPT

3. 文件系统格式化

  • ext4 文件系统:稳定性好,兼容性佳
  • xfs 文件系统:高性能,适合大文件
  • btrfs 文件系统:快照功能,支持压缩
  • 文件系统选择建议:根据不同场景选择合适的文件系统

4. 挂载配置

  • 临时挂载:基本挂载命令和选项
  • 永久挂载:使用 UUID 和设备名称
  • 挂载选项优化:性能优化和安全挂载选项

5. 磁盘性能优化

  • I/O 调度器配置:不同场景选择合适的调度器
  • 挂载参数优化:针对不同场景的优化参数
  • SSD 性能优化:TRIM/DISCARD 配置和优化建议

6. 云服务器磁盘配置

  • 阿里云磁盘配置:不同磁盘类型的优化建议
  • 腾讯云磁盘配置:磁盘类型和优化建议
  • AWS 磁盘配置:磁盘类型和优化建议

7. 数据安全与故障排查

  • 数据备份策略:自动备份脚本和定时备份配置
  • 磁盘健康检查:SMART 检查和性能测试
  • 常见问题排查:磁盘空间不足、读写慢、挂载失败、只读等问题的解决方案

通过掌握这些知识,你可以有效地管理服务器磁盘,提高系统性能和数据安全性。