# 磁盘与分区管理（lsblk、fdisk）

URL: https://caijiao.org/rockylinux/disk-partition
Source: docs/rockylinux/disk-partition.md
Description: 详细介绍 Rocky Linux 中使用 lsblk 和 fdisk 工具进行磁盘和分区管理的方法，包括查看磁盘信息、创建分区、删除分区等操作

在 Rocky Linux 系统中，磁盘和分区管理是系统管理的基础任务之一。正确管理磁盘和分区可以确保系统的存储资源得到合理利用，提高系统性能，防止数据丢失。本教程将详细介绍如何使用 `lsblk` 和 `fdisk` 这两个常用工具来查看、创建、管理磁盘和分区。

## 磁盘管理概述

磁盘管理主要涉及以下几个方面：

1. **识别物理磁盘**：了解系统中安装的物理磁盘
2. **查看磁盘信息**：获取磁盘容量、型号、分区等信息
3. **创建分区**：将物理磁盘划分为多个逻辑分区
4. **管理分区**：修改、删除现有分区
5. **设置分区类型**：为不同用途的分区设置合适的类型

在 Linux 中，存储设备通常以以下方式命名：

- **SATA/SCSI 磁盘**：`/dev/sda`、`/dev/sdb` 等
- **NVMe 磁盘**：`/dev/nvme0n1`、`/dev/nvme1n1` 等
- **虚拟磁盘**：`/dev/vda`、`/dev/vdb` 等
- **分区**：在设备名后添加数字，如 `/dev/sda1`、`/dev/nvme0n1p1` 等

## 查看磁盘信息

### 使用 lsblk 命令

`lsblk`（list block devices）命令用于列出所有块设备的信息，是查看磁盘和分区的首选工具。

#### 基本用法

```bash
# 列出所有块设备
lsblk

# 以列表格式显示
lsblk -l

# 显示详细信息
lsblk -a

# 显示文件系统信息
lsblk -f

# 显示所有者和组信息
lsblk -m

# 以字节为单位显示大小
lsblk -b

# 自定义输出格式
lsblk -o NAME,SIZE,TYPE,MOUNTPOINT
```

#### lsblk 输出解释

当执行 `lsblk` 命令时，输出通常包括以下列：

- **NAME**：设备名称
- **MAJ:MIN**：主设备号和次设备号
- **RM**：是否为可移动设备（1 表示是，0 表示否）
- **SIZE**：设备大小
- **RO**：是否为只读设备（1 表示是，0 表示否）
- **TYPE**：设备类型（disk、part、lvm 等）
- **MOUNTPOINT**：挂载点（如果已挂载）

使用 `-f` 选项时，还会显示：

- **FSTYPE**：文件系统类型
- **LABEL**：文件系统标签
- **UUID**：文件系统唯一标识符
- **MOUNTPOINT**：挂载点

### 使用 fdisk 命令查看磁盘信息

`fdisk` 命令也可以用来查看磁盘分区信息：

```bash
# 查看特定磁盘的分区表
sudo fdisk -l /dev/sda

# 查看所有磁盘的分区表
sudo fdisk -l

# 以字节为单位显示
sudo fdisk -b 512 -l /dev/sda
```

### 使用其他命令查看磁盘信息

```bash
# 查看磁盘空间使用情况
df -h

# 查看磁盘 I/O 统计信息
iostat -d

# 查看当前挂载的文件系统
mount

# 查看磁盘几何信息（较旧的命令）
sudo hdparm -g /dev/sda
```

## 磁盘分区基础

### 分区类型

在 Linux 中，主要有两种分区方案：

1. **MBR（Master Boot Record）**：旧的分区方案

   - 最大支持 2TB 磁盘
   - 最多支持 4 个主分区，或 3 个主分区 + 1 个扩展分区（扩展分区中可以创建多个逻辑分区）

2. **GPT（GUID Partition Table）**：新的分区方案
   - 支持超过 2TB 的磁盘
   - 最多可以创建 128 个分区（具体数量取决于实现）
   - 提供更好的数据完整性检查
   - 支持 UEFI 引导

### 分区标识符

- **MBR 分区类型**：使用十六进制代码表示，如 83（Linux）、82（Linux swap）
- **GPT 分区类型**：使用 GUID 表示，如 EBD0A0A2-B9E5-4433-87C0-68B6B72699C7（Linux 文件系统数据）

## 使用 fdisk 管理分区

`fdisk` 是一个传统的磁盘分区工具，支持 MBR 和 GPT 分区表。

### 进入 fdisk 交互模式

```bash
# 对指定磁盘进行分区操作
sudo fdisk /dev/sdb
```

进入交互模式后，可以使用以下命令：

- **m**：显示帮助信息
- **p**：显示当前分区表
- **n**：创建新分区
- **d**：删除分区
- **t**：更改分区类型
- **w**：保存更改并退出
- **q**：不保存更改并退出
- **g**：创建 GPT 分区表
- **o**：创建 MBR 分区表

### 创建 GPT 分区表

```bash
# 进入 fdisk 交互模式
sudo fdisk /dev/sdb

# 创建 GPT 分区表（输入 g）
Command (m for help): g
Created a new GPT disklabel (GUID: XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX)

# 保存并退出（输入 w）
Command (m for help): w
The partition table has been altered.
Calling ioctl() to re-read partition table.
Syncing disks.
```

### 创建新分区

```bash
# 进入 fdisk 交互模式
sudo fdisk /dev/sdb

# 显示当前分区表（输入 p）
Command (m for help): p

# 创建新分区（输入 n）
Command (m for help): n

# 选择分区类型
Partition type
   p   primary (0 primary, 0 extended, 4 free)
   e   extended (container for logical partitions)
Select (default p): p

# 输入分区号
Partition number (1-4, default 1): 1

# 输入起始扇区（使用默认值）
First sector (2048-41943039, default 2048): Enter

# 输入结束扇区或分区大小
Last sector, +sectors or +size{K,M,G,T,P} (2048-41943039, default 41943039): +10G

# 显示新创建的分区表（输入 p）
Command (m for help): p

# 保存并退出（输入 w）
Command (m for help): w
```

### 更改分区类型

```bash
# 进入 fdisk 交互模式
sudo fdisk /dev/sdb

# 查看分区表（输入 p）
Command (m for help): p

# 更改分区类型（输入 t）
Command (m for help): t

# 选择分区号
Partition number (1-4, default 4): 1

# 输入分区类型代码
# 对于 Linux 文件系统，使用 83（MBR）或默认值（GPT）
# 对于交换分区，使用 82（MBR）或 19（GPT）
Hex code or alias (type L to list all): 82

# 验证更改（输入 p）
Command (m for help): p

# 保存并退出（输入 w）
Command (m for help): w
```

### 删除分区

```bash
# 进入 fdisk 交互模式
sudo fdisk /dev/sdb

# 查看分区表（输入 p）
Command (m for help): p

# 删除分区（输入 d）
Command (m for help): d

# 选择要删除的分区号
Partition number (1-4, default 4): 1

# 确认分区已删除（输入 p）
Command (m for help): p

# 保存并退出（输入 w）
Command (m for help): w
```

### 应用分区表更改

在保存分区表更改后，系统需要重新读取分区表。可以通过以下方法实现：

```bash
# 重新加载分区表
sudo partprobe /dev/sdb

# 或者重启系统（不推荐在生产环境中）
sudo reboot
```

## 高级分区管理

### 创建扩展分区和逻辑分区（MBR）

在 MBR 分区表中，如果需要创建超过 4 个分区，必须使用扩展分区：

```bash
# 进入 fdisk 交互模式
sudo fdisk /dev/sdb

# 创建主分区 1
Command (m for help): n
Select (default p): p
Partition number (1-4, default 1): 1
First sector (2048-41943039, default 2048): Enter
Last sector, +sectors or +size{K,M,G,T,P} (2048-41943039, default 41943039): +10G

# 创建主分区 2
Command (m for help): n
Select (default p): p
Partition number (2-4, default 2): 2
First sector (20973568-41943039, default 20973568): Enter
Last sector, +sectors or +size{K,M,G,T,P} (20973568-41943039, default 41943039): +10G

# 创建主分区 3
Command (m for help): n
Select (default p): p
Partition number (3-4, default 3): 3
First sector (41945088-41943039, default 41945088): Enter
Last sector, +sectors or +size{K,M,G,T,P} (41945088-41943039, default 41943039): +10G

# 创建扩展分区
Command (m for help): n
Select (default e): e
Partition number (4, default 4): 4
First sector (62916608-41943039, default 62916608): Enter
Last sector, +sectors or +size{K,M,G,T,P} (62916608-41943039, default 41943039): Enter

# 在扩展分区中创建逻辑分区
Command (m for help): n
All space for primary partitions is in use.
Adding logical partition 5
First sector (62918656-41943039, default 62918656): Enter
Last sector, +sectors or +size{K,M,G,T,P} (62918656-41943039, default 41943039): +5G

# 创建另一个逻辑分区
Command (m for help): n
Adding logical partition 6
First sector (73402368-41943039, default 73402368): Enter
Last sector, +sectors or +size{K,M,G,T,P} (73402368-41943039, default 41943039): Enter

# 保存并退出
Command (m for help): w
```

### 创建交换分区

交换分区是 Linux 系统中用于虚拟内存的特殊分区：

```bash
# 进入 fdisk 交互模式
sudo fdisk /dev/sdb

# 创建新分区
Command (m for help): n
Select (default p): p
Partition number (1-4, default 1): 1
First sector (2048-41943039, default 2048): Enter
Last sector, +sectors or +size{K,M,G,T,P} (2048-41943039, default 41943039): +4G

# 更改分区类型为交换分区
Command (m for help): t
Partition number (1-4, default 4): 1
# 对于 MBR，使用 82；对于 GPT，输入 L 列出所有类型，然后选择 swap
Hex code or alias (type L to list all): 82

# 保存并退出
Command (m for help): w

# 格式化交换分区
sudo mkswap /dev/sdb1

# 启用交换分区
sudo swapon /dev/sdb1

# 设置开机自动挂载，编辑 /etc/fstab
UUID=$(sudo blkid -s UUID -o value /dev/sdb1)
echo "UUID=$UUID none swap defaults 0 0" | sudo tee -a /etc/fstab
```

### 创建 EFI 系统分区（ESP）

EFI 系统分区在 UEFI 引导的系统中是必需的：

```bash
# 进入 fdisk 交互模式
sudo fdisk /dev/sdb

# 确保使用 GPT 分区表
Command (m for help): g

# 创建 EFI 系统分区
Command (m for help): n
Select (default p): p
Partition number (1-128, default 1): 1
First sector (2048-41943039, default 2048): Enter
Last sector, +sectors or +size{K,M,G,T,P} (2048-41943039, default 41943039): +512M

# 更改分区类型为 EFI 系统分区
Command (m for help): t
Partition number (1-128, default 1): 1
# 输入 L 查看所有类型，然后找到 EFI 类型
Hex code or alias (type L to list all): 1

# 保存并退出
Command (m for help): w

# 格式化 EFI 分区为 FAT32
sudo mkfs.fat -F32 /dev/sdb1
```

## 分区操作注意事项

1. **备份重要数据**：在进行任何分区操作前，确保已备份所有重要数据

2. **小心选择磁盘**：确保对正确的磁盘进行操作，避免意外修改系统磁盘

3. **分区对齐**：确保分区边界正确对齐，特别是对于 SSD 或高级文件系统

4. **使用适当的分区大小**：根据实际需求规划分区大小

5. **考虑使用 LVM**：对于需要灵活管理存储空间的场景，考虑使用 LVM（逻辑卷管理）

6. **理解分区限制**：了解 MBR 和 GPT 分区表的限制

## 常见问题与故障排除

### 无法看到新创建的分区

如果创建分区后无法看到新分区：

```bash
# 重新加载分区表
sudo partprobe /dev/sdb

# 或者使用 partx
sudo partx -u /dev/sdb

# 查看是否已识别新分区
lsblk /dev/sdb
```

### 无法删除分区

如果无法删除分区：

1. 确保分区未被挂载：

   ```bash
   sudo umount /dev/sdb1
   ```

2. 确保没有进程正在使用该分区：

   ```bash
   sudo fuser -m /dev/sdb1
   ```

3. 尝试使用 wipefs 清除分区签名：
   ```bash
   sudo wipefs -a /dev/sdb1
   ```

### 分区表错误

如果遇到分区表错误：

```bash
# 检查并修复分区表
sudo fdisk /dev/sdb
Command (m for help): x  # 专家模式
Command (m for help): b  # 修复分区边界
Command (m for help): r  # 返回主菜单
Command (m for help): w  # 保存更改
```

### 无法格式化分区

如果无法格式化分区：

1. 确保分区已正确创建并识别
2. 检查是否有进程正在使用该分区
3. 尝试使用不同的文件系统类型
4. 检查磁盘是否有硬件问题

## 分区最佳实践

1. **合理规划分区布局**：

   - 为根目录（/）分配足够空间
   - 考虑将 /home、/var、/tmp 等目录放在单独的分区
   - 为交换空间分配适当大小（通常为物理内存的 1-2 倍）

2. **使用 UUID 挂载分区**：使用 UUID 而不是设备名称挂载分区，提高系统稳定性

3. **定期检查磁盘健康状态**：

   ```bash
   sudo smartctl -a /dev/sda
   ```

4. **考虑使用 GPT 分区表**：对于现代系统，特别是大磁盘，推荐使用 GPT 分区表

5. **为服务器设置合理的分区策略**：
   - Web 服务器：单独的 /var/www 分区
   - 数据库服务器：单独的数据分区
   - 邮件服务器：单独的 /var/spool/mail 分区

## 总结

磁盘和分区管理是 Rocky Linux 系统管理的基础技能。本教程详细介绍了如何使用 `lsblk` 和 `fdisk` 工具查看磁盘信息、创建和管理分区。

通过掌握这些工具和技术，您可以有效地管理系统的存储资源，为各种应用程序和服务提供合适的存储空间。在进行任何磁盘操作时，务必小心谨慎，始终备份重要数据，并确保对正确的磁盘和分区进行操作。

对于更复杂的存储管理需求，如动态调整分区大小、创建逻辑卷等，可以考虑学习 LVM（逻辑卷管理）相关知识，它提供了更灵活的存储管理能力。
