跳转到内容

磁盘管理

Linux 磁盘管理常用操作速查。

磁盘信息查看

查看磁盘使用情况

bash
df -TH              # 查看所有挂载文件系统的信息(-T 显示类型,-H 人类可读)
df -h /             # 只看根分区

查看磁盘设备

bash
lsblk               # 树状显示所有块设备
lsblk -f            # 同时显示文件系统类型和 UUID
lsblk -d -o NAME,ROTA,SIZE,MODEL   # 只看磁盘(不含分区),含 ROTA/大小/型号

区分 SSD 和机械硬盘(HDD)

使用 lsblkROTA(rotational)字段判断:

bash
lsblk -d -o NAME,ROTA,SIZE,MODEL
ROTA 值含义
0SSD(固态硬盘,非旋转设备)
1HDD(机械硬盘,旋转设备)
bash
# 示例输出
NAME    ROTA SIZE MODEL
sda        0 500G Samsung SSD 870   # SSD(ROTA=0)
sdb        1   2T WDC WD20EZRX      # 机械硬盘(ROTA=1)

ROTA 的含义

ROTA(rotational)字面意思是"是否旋转"。SSD 没有机械旋转部件所以是 0,机械硬盘有转轴所以是 1。这是最通用的判断方法。

其他判断方式:

bash
# 直接读取内核属性(0 = SSD,1 = HDD)
cat /sys/block/sda/queue/rotational

磁盘分区

查看分区表

bash
fdisk -l                # 列出所有磁盘的分区信息
fdisk -l /dev/sdb       # 查看指定磁盘

使用 fdisk 分区(MBR)

交互式操作,适合 2TB 以下的磁盘:

bash
fdisk /dev/sdb
操作说明
n新建分区
p选择主分区(primary)
e选择扩展分区(extended)
t修改分区类型
L列出所有分区类型代码
8eLinux LVM 类型
83Linux 默认类型
d删除分区
p打印当前分区表
w保存并退出
q不保存退出

使用 parted 分区(GPT)

适合 2TB 以上的磁盘:

bash
parted /dev/sdb
bash
# 常用命令
(parted) mklabel gpt              # 创建 GPT 分区表
(parted) mkpart primary 0% 100%   # 创建一个占满整盘的分区
(parted) print                     # 查看分区表
(parted) quit                      # 退出

一键分区(非交互)

bash
# GPT 分区表,创建一个占满整盘的分区
parted -s /dev/sdb mklabel gpt
parted -s /dev/sdb mkpart primary 0% 100%

格式化

bash
# XFS(CentOS/RHEL 默认,适合大文件)
mkfs.xfs /dev/sdb1

# ext4(Ubuntu 默认,兼容性好)
mkfs.ext4 /dev/sdb1

# 指定标签
mkfs.xfs -L data /dev/sdb1
mkfs.ext4 -L data /dev/sdb1

XFS vs ext4 怎么选?

  • XFS:大文件性能好,支持在线扩容(不能缩容),CentOS/RHEL 默认
  • ext4:兼容性最好,支持扩容和缩容,Ubuntu 默认
  • 一般选 XFS 即可,除非有缩容需求

挂载与卸载

临时挂载

bash
mount /dev/sdb1 /mnt/data           # 挂载
umount /mnt/data                    # 卸载(用挂载点)
umount /dev/sdb1                    # 卸载(用设备名)

# 指定文件系统类型
mount -t xfs /dev/sdb1 /mnt/data

开机自动挂载

编辑 /etc/fstab

bash
# 设备路径        挂载点        文件系统   选项      dump  fsck
/dev/sdb1       /mnt/data     xfs      defaults   0     0

更推荐用 UUID(设备名可能变化,UUID 不会):

bash
# 先查看 UUID
blkid /dev/sdb1
# /dev/sdb1: UUID="a1b2c3d4-xxxx" TYPE="xfs"

# 写入 fstab
UUID=a1b2c3d4-xxxx  /mnt/data  xfs  defaults  0  0

修改 fstab 前先验证

bash
# 检查语法是否正确(不实际挂载,只做 dry-run)
mount -a -o nofail

写错 fstab 可能导致开机无法启动,务必先验证。

LVM 逻辑卷管理

LVM 提供灵活的磁盘管理,支持动态扩容。

基本概念

物理磁盘 (PV) → 卷组 (VG) → 逻辑卷 (LV) → 文件系统

常用操作

bash
# === PV(物理卷)===
pvcreate /dev/sdb1              # 创建物理卷
pvdisplay                       # 查看物理卷
pvremove /dev/sdb1              # 删除物理卷

# === VG(卷组)===
vgcreate vg_data /dev/sdb1      # 创建卷组
vgdisplay                       # 查看卷组
vgextend vg_data /dev/sdc1      # 扩展卷组(加入新磁盘)
vgreduce vg_data /dev/sdc1      # 缩减卷组(移除磁盘)

# === LV(逻辑卷)===
lvcreate -L 50G -n lv_data vg_data        # 创建 50G 逻辑卷
lvcreate -l 100%FREE -n lv_data vg_data   # 创建占满剩余空间的逻辑卷
lvdisplay                                  # 查看逻辑卷
lvextend -L +10G /dev/vg_data/lv_data     # 扩容 10G
lvreduce -L -5G /dev/vg_data/lv_data      # 缩容 5G(谨慎操作)

# === 扩容后需要扩展文件系统 ===
xfs_growfs /mnt/data            # XFS 扩容(只能扩不能缩)
resize2fs /dev/vg_data/lv_data  # ext4 扩容

完整示例:服务器添加新硬盘

方式一:直接分区挂载

bash
# 1. 查看新磁盘
fdisk -l

# 2. 分区
fdisk /dev/sdb
# n → p → 回车 → 回车 → w

# 3. 格式化
mkfs.xfs /dev/sdb1

# 4. 创建挂载点并挂载
mkdir -p /mnt/data
mount /dev/sdb1 /mnt/data

# 5. 设置开机自动挂载
blkid /dev/sdb1    # 获取 UUID
echo 'UUID=your-uuid  /mnt/data  xfs  defaults  0  0' >> /etc/fstab
mount -a -o nofail  # 验证 fstab

方式二:使用 LVM(推荐)

bash
# 1. 分区并设为 LVM 类型
fdisk /dev/sdb
# n → p → 回车 → 回车 → t → 8e → w

# 2. 创建物理卷
pvcreate /dev/sdb1

# 3. 创建卷组
vgcreate vg_data /dev/sdb1

# 4. 创建逻辑卷(占满全部空间)
lvcreate -l 100%FREE -n lv_data vg_data

# 5. 格式化
mkfs.xfs /dev/vg_data/lv_data

# 6. 挂载
mkdir -p /mnt/data
mount /dev/vg_data/lv_data /mnt/data

# 7. 设置开机自动挂载
blkid /dev/vg_data/lv_data
echo 'UUID=your-uuid  /mnt/data  xfs  defaults  0  0' >> /etc/fstab
mount -a -o nofail

常见问题

卸载时提示 device is busy

bash
# 查看谁在占用
lsof /mnt/data
fuser -mv /mnt/data

# 强制卸载(确保无人使用后)
umount -f /mnt/data

磁盘空间满了但 du 显示没满

可能是已删除文件仍被进程占用:

bash
# 查看已删除但仍被占用的文件
lsof | grep deleted

# 重启占用进程即可释放空间

基于 MIT 许可发布