# 挂载与自动挂载

URL: https://caijiao.org/rockylinux/mount-and-fstab
Source: docs/rockylinux/mount-and-fstab.md
Description: 详细介绍 Rocky Linux 中的文件系统挂载、自动挂载配置（/etc/fstab）、挂载选项以及各种存储设备的挂载方法

在 Rocky Linux 系统中，挂载（mounting）是将存储设备或分区附加到文件系统树的过程，使其内容可以访问。自动挂载则是通过配置让系统在启动时自动挂载特定的设备。本教程将详细介绍文件系统的挂载方法、/etc/fstab 配置文件的使用以及各种高级挂载选项。

## 挂载基础

### 挂载概念

在 Linux 系统中，所有存储设备都必须挂载到文件系统树中的某个目录（称为挂载点）才能被访问。挂载过程将设备的文件系统与系统的目录树连接起来，使得用户可以像访问普通文件和目录一样访问设备上的数据。

主要概念：

- **挂载点**：文件系统树中的目录，存储设备将挂载到这里
- **设备标识符**：用于标识要挂载的存储设备
- **文件系统类型**：指定设备上使用的文件系统格式
- **挂载选项**：控制设备如何挂载和访问的参数

### 设备标识符

在 Rocky Linux 中，设备可以通过多种方式标识：

1. **设备名称**：如 `/dev/sda1`、`/dev/nvme0n1p1`
2. **UUID**：通用唯一标识符，如 `5f96e737-f0f4-4a81-98b8-bfc24057f7bd`
3. **标签**：文件系统标签，如 `DATA` 或 `BACKUP`
4. **PARTUUID**：分区 UUID（GPT 分区表）

使用 UUID 或标签而不是设备名称可以提高系统的稳定性，因为设备名称可能会在系统重启或硬件更改后发生变化。

### 常用挂载命令

#### 查看当前挂载的文件系统

```bash
# 显示所有已挂载的文件系统
mount

# 以人类可读的格式显示
mount -h

# 显示特定文件系统类型的挂载
mount -t ext4

# 使用 df 命令查看
 df -h
```

#### 挂载存储设备

基本语法：

```bash
mount [选项] 设备 挂载点
```

常用选项：

- `-t 类型`：指定文件系统类型
- `-o 选项`：指定挂载选项
- `-r`：以只读方式挂载
- `-w`：以可写方式挂载（默认）
- `-a`：挂载 /etc/fstab 中所有未挂载的文件系统

## 手动挂载设备

### 创建挂载点

在挂载设备之前，需要创建一个目录作为挂载点：

```bash
# 创建挂载点目录
sudo mkdir -p /mnt/data
```

### 挂载分区

```bash
# 挂载 /dev/sdb1 到 /mnt/data
sudo mount /dev/sdb1 /mnt/data

# 指定文件系统类型挂载
sudo mount -t ext4 /dev/sdb1 /mnt/data

# 以只读方式挂载
sudo mount -r /dev/sdb1 /mnt/data

# 使用 UUID 挂载
sudo mount UUID="5f96e737-f0f4-4a81-98b8-bfc24057f7bd" /mnt/data

# 使用标签挂载
sudo mount LABEL="DATA" /mnt/data
```

### 挂载 ISO 文件

```bash
# 挂载 ISO 文件
sudo mount -o loop /path/to/file.iso /mnt/iso
```

### 挂载 NFS 共享

```bash
# 挂载 NFS 共享
sudo mount -t nfs server:/share /mnt/nfs
```

### 挂载 Windows 共享（CIFS）

```bash
# 安装 cifs-utils
sudo dnf install cifs-utils -y

# 挂载 Windows 共享
sudo mount -t cifs //server/share /mnt/win -o username=user,password=pass

# 更安全的方式（从文件读取凭据）
echo "username=user" > ~/.smbcredentials
echo "password=pass" >> ~/.smbcredentials
chmod 600 ~/.smbcredentials
sudo mount -t cifs //server/share /mnt/win -o credentials=~/.smbcredentials
```

### 卸载设备

```bash
# 卸载指定挂载点
sudo umount /mnt/data

# 卸载指定设备
sudo umount /dev/sdb1

# 强制卸载（谨慎使用）
sudo umount -f /mnt/data

# 懒惰卸载（等待设备不忙时卸载）
sudo umount -l /mnt/data
```

## /etc/fstab 配置文件

`/etc/fstab`（文件系统表）是一个配置文件，用于定义系统启动时自动挂载的文件系统。

### fstab 文件结构

```
# 设备             挂载点           文件系统类型  挂载选项       转储  检查顺序
UUID=xxx          /                ext4          defaults       1     1
/dev/sda2         swap             swap          defaults       0     0
/dev/sdb1         /mnt/data        ext4          defaults       0     2
```

各字段说明：

1. **设备**：要挂载的设备，可以是设备名称、UUID、LABEL 等
2. **挂载点**：文件系统挂载的目录
3. **文件系统类型**：如 ext4、xfs、vfat、swap 等
4. **挂载选项**：控制文件系统如何挂载的选项
5. **转储**：是否使用 dump 工具备份（0=不备份，1=备份）
6. **检查顺序**：fsck 检查顺序（0=不检查，1=首先检查，2=其次检查）

### 查找设备 UUID

```bash
# 使用 blkid 命令查找 UUID
sudo blkid

# 查找特定设备的 UUID
sudo blkid /dev/sdb1

# 查看所有分区的 UUID
ls -la /dev/disk/by-uuid/
```

### 编辑 fstab 文件

```bash
sudo vim /etc/fstab
```

### 添加新的挂载项

示例：

```
# 使用 UUID 挂载 ext4 分区
UUID=5f96e737-f0f4-4a81-98b8-bfc24057f7bd /mnt/data ext4 defaults 0 2

# 使用 LABEL 挂载 NTFS 分区
LABEL=Windows /mnt/windows ntfs-3g defaults,umask=0002 0 0

# 挂载 NFS 共享
server:/share /mnt/nfs nfs defaults 0 0

# 挂载 CIFS 共享
//server/share /mnt/win cifs credentials=/home/user/.smbcredentials,defaults 0 0

# 挂载 tmpfs
none /tmp tmpfs defaults,noatime,mode=1777 0 0
```

### 测试 fstab 配置

在修改 fstab 文件后，应该测试配置是否正确，以避免系统无法启动：

```bash
# 重新挂载所有在 fstab 中定义的文件系统
sudo mount -a

# 检查是否有错误
dmesg | grep mount
```

如果执行 `sudo mount -a` 没有错误输出，则配置正确。

## 常用挂载选项

### 基础挂载选项

| 选项       | 说明                                                     |
| ---------- | -------------------------------------------------------- |
| `defaults` | 使用默认选项（rw, suid, dev, exec, auto, nouser, async） |
| `noauto`   | 不自动挂载                                               |
| `user`     | 允许普通用户挂载                                         |
| `nouser`   | 仅允许 root 用户挂载                                     |
| `ro`       | 只读挂载                                                 |
| `rw`       | 读写挂载                                                 |
| `remount`  | 重新挂载已挂载的文件系统                                 |

### 性能相关选项

| 选项             | 说明                               |
| ---------------- | ---------------------------------- |
| `async`          | 异步 I/O（默认）                   |
| `sync`           | 同步 I/O（更安全但速度较慢）       |
| `noatime`        | 不更新文件访问时间（提高性能）     |
| `nodiratime`     | 不更新目录访问时间                 |
| `relatime`       | 仅在修改时间后更新访问时间         |
| `barrier=0`      | 禁用写屏障（提高性能但降低安全性） |
| `data=writeback` | 数据写入策略（ext4）               |

### 安全相关选项

| 选项      | 说明                                   |
| --------- | -------------------------------------- |
| `nosuid`  | 禁用 setuid 位                         |
| `nodev`   | 禁用设备文件                           |
| `noexec`  | 禁用可执行文件                         |
| `bind`    | 绑定挂载（将一个目录挂载到另一个目录） |
| `private` | 挂载命名空间隔离                       |
| `shared`  | 共享挂载命名空间                       |

### 文件系统特定选项

#### ext4 选项

```
defaults,noatime,nodiratime,errors=remount-ro,barrier=1,data=ordered
```

#### XFS 选项

```
defaults,noatime,nodiratime,attr2,inode64,noquota
```

#### NTFS 选项

```
defaults,umask=0002,uid=1000,gid=1000
```

#### FAT/VFAT 选项

```
defaults,umask=0002,uid=1000,gid=1000,utf8,shortname=mixed
```

## 特殊挂载类型

### 临时文件系统（tmpfs）

tmpfs 是一种基于内存的临时文件系统，速度非常快，但在系统重启后数据会丢失。

```bash
# 手动挂载 tmpfs
sudo mount -t tmpfs -o size=1G tmpfs /mnt/tmp

# 在 fstab 中配置
none /mnt/tmp tmpfs defaults,size=1G,noatime,mode=1777 0 0
```

### 绑定挂载

绑定挂载允许将一个目录或文件挂载到另一个目录。

```bash
# 手动绑定挂载
sudo mount --bind /home/user/data /var/www/html/data

# 在 fstab 中配置
/home/user/data /var/www/html/data none bind 0 0

# 递归绑定挂载
sudo mount --rbind /home/user/data /var/www/html/data
```

### 自动挂载（autofs）

autofs 提供了按需挂载文件系统的功能，当访问挂载点时才自动挂载设备，适用于不经常使用的设备。

#### 安装 autofs

```bash
sudo dnf install autofs -y
```

#### 配置 autofs

1. 编辑主配置文件：

```bash
sudo vim /etc/auto.master
```

添加以下行：

```
/misc   /etc/auto.misc
/net    -hosts
/-      /etc/auto.direct
```

2. 创建直接映射文件：

```bash
sudo vim /etc/auto.direct
```

添加要自动挂载的设备：

```
/mnt/data    -fstype=ext4 :/dev/sdb1
/mnt/iso     -fstype=iso9660,ro,loop :/path/to/file.iso
/mnt/nfs     -fstype=nfs :server:/share
```

3. 启动 autofs 服务：

```bash
sudo systemctl start autofs
sudo systemctl enable autofs
```

### 网络文件系统挂载

#### NFS 挂载选项

```bash
# 基本 NFS 挂载选项
sudo mount -t nfs -o rw,hard,intr,rsize=8192,wsize=8192 server:/share /mnt/nfs

# 在 fstab 中配置
server:/share /mnt/nfs nfs defaults,hard,intr,rsize=8192,wsize=8192 0 0
```

#### CIFS 挂载选项

```bash
# 基本 CIFS 挂载选项
sudo mount -t cifs -o username=user,password=pass,uid=1000,gid=1000 //server/share /mnt/win

# 在 fstab 中配置
//server/share /mnt/win cifs credentials=/home/user/.smbcredentials,uid=1000,gid=1000 0 0
```

## 挂载问题排查

### 设备忙错误

如果尝试卸载设备时遇到 "device is busy" 错误：

```bash
# 查找使用该设备的进程
sudo fuser -m /mnt/data

# 或者
sudo lsof /mnt/data

# 终止使用该设备的进程
sudo fuser -k -m /mnt/data

# 或者使用懒惰卸载
sudo umount -l /mnt/data
```

### fstab 配置错误导致系统无法启动

如果因 fstab 配置错误导致系统无法正常启动，可以：

1. 在引导时进入单用户模式
2. 编辑 fstab 文件修复错误
3. 或者暂时注释掉有问题的行

进入单用户模式的方法：

- 在 GRUB 引导菜单中选择编辑选项
- 在 Linux 内核行末尾添加 `single` 或 `1`
- 按 Ctrl+X 启动

### 文件系统检查失败

如果挂载时出现文件系统错误：

```bash
# 卸载设备（如果已挂载）
sudo umount /dev/sdb1

# 检查并修复文件系统
sudo fsck.ext4 /dev/sdb1
# 或对于 XFS
sudo xfs_repair /dev/sdb1
```

## 最佳实践

1. **使用 UUID 或 LABEL 挂载**：避免因设备名称变化导致的挂载问题

2. **设置适当的挂载选项**：根据文件系统类型和用途选择合适的挂载选项

3. **分离关键目录**：将 /home、/var、/tmp 等目录挂载在单独的分区

4. **备份 fstab 文件**：在修改前备份 /etc/fstab

5. **测试挂载配置**：修改 fstab 后使用 `mount -a` 测试配置

6. **使用自动挂载**：对于不经常使用的设备，考虑使用 autofs

7. **设置正确的权限**：为挂载点设置适当的所有者和权限

8. **监控挂载状态**：定期检查文件系统挂载状态和磁盘空间

## 总结

文件系统挂载和自动挂载配置是 Rocky Linux 系统管理中的重要技能。本教程详细介绍了手动挂载设备、配置 /etc/fstab 实现自动挂载、各种特殊挂载类型以及常见问题的排查方法。

通过正确配置和管理文件系统挂载，您可以确保系统存储资源的合理利用，提高数据访问效率和安全性。在进行任何挂载配置更改时，务必小心谨慎，始终备份重要数据，并在修改后测试配置是否正确，以避免系统启动问题。

对于更高级的存储管理需求，您还可以学习 LVM（逻辑卷管理）和 RAID 等技术，它们提供了更灵活和可靠的存储解决方案。
