# Linux 磁盘管理

URL: https://caijiao.org/linux/file-system/disk-management
Source: docs/linux/file-system/disk-management.md
Description: 详细介绍Linux磁盘管理的核心概念和工具，包括分区、格式化、挂载、LVM逻辑卷管理以及RAID配置等实用技术。

磁盘管理是 Linux 系统管理中的重要组成部分，涉及磁盘分区、格式化、挂载以及存储资源的优化和监控。有效的磁盘管理可以提高系统性能，确保数据安全，并合理分配存储资源。

## 磁盘基础

### 磁盘类型

#### 物理磁盘
- **HDD (Hard Disk Drive)**：传统机械硬盘
- **SSD (Solid State Drive)**：固态硬盘，无机械部件，读写速度快
- **NVMe SSD**：基于 PCIe 接口的高速固态硬盘

#### 虚拟磁盘
- 在虚拟化环境中的磁盘，如虚拟机的虚拟硬盘

### 磁盘命名

Linux 系统中磁盘的命名规则：

- **IDE 磁盘**：以 `hd` 开头，如 `hda`, `hdb`
- **SATA/SCSI/USB 磁盘**：以 `sd` 开头，如 `sda`, `sdb`
- **NVMe 磁盘**：以 `nvme` 开头，如 `nvme0n1`
- **分区**：在磁盘名后添加数字，如 `sda1`, `sda2`

```bash
# 查看系统中的磁盘和分区
lsblk
# 或
fdisk -l
```

## 磁盘分区

### 分区表类型

#### MBR (Master Boot Record)
- 支持最大 2TB 磁盘
- 最多 4 个主分区，或 3 个主分区+1个扩展分区
- 传统分区表格式，兼容性好

#### GPT (GUID Partition Table)
- 支持大于 2TB 的磁盘
- 最多支持 128 个分区
- 提供更好的错误检测和恢复机制
- 适合 UEFI 引导模式

### 分区工具

#### fdisk
传统的磁盘分区工具，适用于 MBR 分区表。

```bash
# 启动 fdisk 交互式分区工具
sudo fdisk /dev/sda

# 常用命令：
# p - 显示分区表
# n - 创建新分区
# d - 删除分区
# t - 更改分区类型
# w - 保存更改并退出
# q - 退出不保存
```

#### gdisk
GPT 版本的 fdisk，用于 GPT 分区表。

```bash
# 启动 gdisk 交互式分区工具
sudo gdisk /dev/sda

# 常用命令与 fdisk 类似
```

#### parted
功能更强大的分区工具，支持 MBR 和 GPT，可用于脚本。

```bash
# 启动 parted 交互式工具
sudo parted /dev/sda

# 常用命令：
# print - 显示分区信息
# mklabel gpt - 创建 GPT 分区表
# mkpart primary 0% 100% - 创建主分区
# quit - 退出

# 非交互式操作
sudo parted /dev/sda mklabel gpt
sudo parted /dev/sda mkpart primary ext4 0% 20GiB
```

### 创建分区的步骤

1. **选择分区工具**
2. **创建分区表**
3. **创建分区**
4. **设置分区类型**
5. **保存更改**

## 磁盘格式化

### 文件系统类型

格式化是在分区上创建文件系统的过程，常用的 Linux 文件系统包括：

- **ext4**：最常用的 Linux 文件系统
- **XFS**：高性能 64 位文件系统
- **Btrfs**：新一代文件系统，支持高级功能
- **FAT32/NTFS**：用于与 Windows 系统兼容

### 格式化工具

#### mkfs 系列命令

```bash
# 格式化分区为 ext4
sudo mkfs.ext4 /dev/sda1

# 格式化分区为 XFS
sudo mkfs.xfs /dev/sda1

# 格式化分区为 Btrfs
sudo mkfs.btrfs /dev/sda1

# 格式化分区为 FAT32
sudo mkfs.vfat -F 32 /dev/sda1

# 格式化分区为 NTFS
sudo mkfs.ntfs /dev/sda1
```

#### 格式化选项

```bash
# 创建带有卷标的 ext4 文件系统
sudo mkfs.ext4 -L "DataVolume" /dev/sda1

# 创建 XFS 文件系统，优化大文件
sudo mkfs.xfs -d agcount=16 /dev/sda1
```

## 磁盘挂载

### 挂载基础

挂载是将文件系统连接到 Linux 目录树的过程。

#### 临时挂载

```bash
# 创建挂载点
sudo mkdir /mnt/data

# 挂载分区
sudo mount /dev/sda1 /mnt/data

# 使用特定选项挂载
sudo mount -t ext4 -o rw,noatime /dev/sda1 /mnt/data
```

常用挂载选项：
- `ro`/`rw`：只读/读写挂载
- `noatime`/`nodiratime`：不更新访问时间
- `defaults`：使用默认选项（rw, suid, dev, exec, auto, nouser, async）
- `noexec`：禁止在挂载分区上执行程序
- `user`：允许普通用户挂载

#### 永久挂载
通过编辑 `/etc/fstab` 文件实现系统启动时自动挂载：

```bash
# 备份 fstab 文件
sudo cp /etc/fstab /etc/fstab.bak

# 编辑 fstab 文件
sudo nano /etc/fstab
```

添加类似以下的行：
```
/dev/sda1   /mnt/data   ext4    defaults,noatime    0   2
```

fstab 文件格式：
1. 设备标识符（UUID 或设备路径）
2. 挂载点
3. 文件系统类型
4. 挂载选项
5. dump 选项（通常为 0）
6. fsck 顺序（根分区为 1，其他为 2，不检查为 0）

#### 使用 UUID 挂载
推荐使用 UUID 而非设备路径，因为 UUID 是唯一的：

```bash
# 查看分区的 UUID
sudo blkid /dev/sda1

# 在 fstab 中使用 UUID
UUID=12345678-1234-1234-1234-123456789012   /mnt/data   ext4    defaults    0   2
```

### 卸载文件系统

```bash
# 卸载分区
sudo umount /mnt/data
# 或
sudo umount /dev/sda1

# 强制卸载（谨慎使用）
sudo umount -f /mnt/data
```

## 磁盘空间管理

### 查看磁盘空间

```bash
# 查看所有文件系统的磁盘空间使用情况
df -h

# 查看 inode 使用情况
df -i

# 查看目录大小
du -h /path/to/directory

# 查看大文件
find / -type f -size +100M -exec ls -lh {} \; 2>/dev/null
```

### 磁盘空间优化

#### 清理临时文件

```bash
# 清理临时目录
sudo rm -rf /tmp/*
sudo rm -rf /var/tmp/*

# 清理旧日志文件
sudo find /var/log -name "*.gz" -delete
sudo journalctl --vacuum-time=7d  # 保留7天的系统日志
```

#### 查找大目录

```bash
# 查找占用空间最大的前10个目录
du -h --max-depth=1 / | sort -hr | head -10
```

## 逻辑卷管理 (LVM)

### LVM 简介
LVM（Logical Volume Manager）提供了更灵活的磁盘空间管理方式，允许动态调整分区大小。

### LVM 基本概念
- **物理卷 (PV)**：物理磁盘或分区
- **卷组 (VG)**：由多个 PV 组成的逻辑单元
- **逻辑卷 (LV)**：从 VG 中分配的空间，可以格式化并挂载

### LVM 操作

#### 创建 LVM 分区

```bash
# 创建物理卷
sudo pvcreate /dev/sda1 /dev/sdb1

# 查看物理卷信息
sudo pvdisplay

# 创建卷组
sudo vgcreate myvg /dev/sda1 /dev/sdb1

# 查看卷组信息
sudo vgdisplay

# 创建逻辑卷
sudo lvcreate -L 20G -n mylv myvg

# 查看逻辑卷信息
sudo lvdisplay

# 格式化逻辑卷
sudo mkfs.ext4 /dev/myvg/mylv

# 挂载逻辑卷
sudo mount /dev/myvg/mylv /mnt/data
```

#### 管理 LVM 空间

```bash
# 扩展卷组（添加新的物理卷）
sudo vgextend myvg /dev/sdc1

# 扩展逻辑卷
sudo lvextend -L +10G /dev/myvg/mylv
# 或使用全部可用空间
sudo lvextend -l +100%FREE /dev/myvg/mylv

# 调整文件系统大小以匹配逻辑卷
sudo resize2fs /dev/myvg/mylv  # 对于 ext4
sudo xfs_growfs /dev/myvg/mylv  # 对于 XFS

# 减少逻辑卷（先备份数据！）
sudo umount /mnt/data
sudo e2fsck -f /dev/myvg/mylv
sudo resize2fs /dev/myvg/mylv 15G
sudo lvreduce -L 15G /dev/myvg/mylv
sudo mount /dev/myvg/mylv /mnt/data
```

## 软件 RAID

### RAID 级别

- **RAID 0**：条带化，提高性能，无冗余
- **RAID 1**：镜像，提供冗余，读写性能提升
- **RAID 5**：分布式奇偶校验，至少需要 3 个磁盘
- **RAID 6**：双重奇偶校验，至少需要 4 个磁盘
- **RAID 10**：RAID 1+0，结合镜像和条带化

### 使用 mdadm 创建 RAID

```bash
# 安装 mdadm
sudo apt install mdadm  # Debian/Ubuntu
sudo dnf install mdadm  # Fedora/CentOS

# 创建 RAID 1
sudo mdadm --create /dev/md0 --level=1 --raid-devices=2 /dev/sda1 /dev/sdb1

# 创建 RAID 5
sudo mdadm --create /dev/md0 --level=5 --raid-devices=3 /dev/sda1 /dev/sdb1 /dev/sdc1

# 查看 RAID 状态
sudo mdadm --detail /dev/md0
cat /proc/mdstat

# 格式化并挂载 RAID
sudo mkfs.ext4 /dev/md0
sudo mount /dev/md0 /mnt/raid

# 保存 RAID 配置
sudo mdadm --detail --scan | sudo tee -a /etc/mdadm/mdadm.conf
sudo update-initramfs -u
```

### RAID 维护

```bash
# 标记磁盘为故障
sudo mdadm /dev/md0 --fail /dev/sda1

# 移除故障磁盘
sudo mdadm /dev/md0 --remove /dev/sda1

# 添加新磁盘
sudo mdadm /dev/md0 --add /dev/sda1
```

## 磁盘监控与维护

### 磁盘健康监控

#### 使用 smartmontools
```bash
# 安装 smartmontools
sudo apt install smartmontools  # Debian/Ubuntu
sudo dnf install smartmontools  # Fedora/CentOS

# 查看磁盘 SMART 信息
sudo smartctl -a /dev/sda

# 运行磁盘自检
sudo smartctl -t long /dev/sda
# 查看自检结果
sudo smartctl -l selftest /dev/sda
```

### 磁盘性能测试

```bash
# 使用 hdparm 测试读取速度
sudo hdparm -t /dev/sda

# 使用 dd 测试读写速度
sudo dd if=/dev/zero of=/tmp/testfile bs=1G count=1 oflag=direct  # 写入测试
sudo dd if=/tmp/testfile of=/dev/null bs=1G count=1 iflag=direct  # 读取测试
rm /tmp/testfile
```

### 文件系统检查

```bash
# 卸载文件系统后检查
sudo umount /dev/sda1
sudo fsck.ext4 /dev/sda1

# 检查 XFS 文件系统
sudo xfs_repair /dev/sda1  # 通常不需要卸载
```

## 常见问题与解决方案

### 磁盘满了

```bash
# 查找大文件
du -h --max-depth=2 / | sort -hr | head -20

# 清理包缓存
sudo apt clean  # Debian/Ubuntu
sudo dnf clean all  # Fedora/CentOS

# 删除旧的内核文件（谨慎操作）
sudo apt autoremove --purge  # Debian/Ubuntu
```

### 挂载失败

```bash
# 检查 /etc/fstab 语法
sudo mount -a

# 检查文件系统
sudo fsck /dev/sda1

# 尝试以只读模式挂载
sudo mount -o ro /dev/sda1 /mnt/data
```

### LVM 空间不足

```bash
# 检查卷组可用空间
sudo vgdisplay myvg

# 添加新磁盘到卷组
sudo pvcreate /dev/sdd1
sudo vgextend myvg /dev/sdd1
sudo lvextend -l +100%FREE /dev/myvg/mylv
sudo resize2fs /dev/myvg/mylv
```

通过本教程，您应该已经了解了 Linux 磁盘管理的核心概念和常用工具。有效的磁盘管理对于维护系统性能和数据安全至关重要。无论是分区、格式化、挂载，还是使用 LVM 和 RAID 等高级功能，都需要谨慎操作，特别是在处理重要数据时。
