# Linux 文件系统概述

URL: https://caijiao.org/linux/file-system/overview
Source: docs/linux/file-system/overview.md
Description: 全面介绍Linux文件系统的基本概念、工作原理和主要组件，包括文件系统类型、挂载机制和层次化结构。

文件系统是操作系统用于管理和存储数据的机制，它定义了数据如何组织、存储和访问。Linux 支持多种文件系统类型，每种都有其特定的用途和特点。

## 文件系统基本概念

### 文件系统的定义
文件系统是操作系统用来管理磁盘或分区上文件的方法和数据结构，它负责：

- 文件的存储和检索
- 文件和目录的命名规则
- 文件属性的维护（如权限、所有权、时间戳）
- 磁盘空间的管理和分配
- 文件的访问控制

### Linux 文件系统特点

#### 层次化结构
Linux 使用单一的层次化目录结构，以根目录 `/` 开始，所有其他目录都从根目录分支。

#### 一切皆文件
Linux 遵循"一切皆文件"的哲学，包括：
- 普通文件
- 目录
- 设备文件
- 管道和套接字
- 符号链接

#### 挂载机制
Linux 使用挂载机制将不同的分区和设备附加到文件系统树中。

## Linux 支持的文件系统类型

### 磁盘文件系统

#### ext2, ext3, ext4
- **ext2**：第二代扩展文件系统，无日志
- **ext3**：在 ext2 基础上添加了日志功能
- **ext4**：当前主流的 Linux 文件系统，支持更大的文件和分区，更快的性能

```bash
# 创建 ext4 文件系统
sudo mkfs.ext4 /dev/sdb1
```

#### XFS
- 高性能 64 位文件系统
- 适合处理大文件和大容量存储
- 常用于企业级应用和高性能计算

```bash
# 创建 XFS 文件系统
sudo mkfs.xfs /dev/sdb1
```

#### Btrfs (B-tree File System)
- 新一代文件系统，支持高级功能
- 特性：快照、校验和、增量备份、RAID 支持
- 仍在积极开发中

```bash
# 创建 Btrfs 文件系统
sudo mkfs.btrfs /dev/sdb1
```

#### ZFS
- 企业级文件系统，具有强大的数据完整性和存储功能
- 特性：数据校验和、快照、复制、RAID-Z
- 在某些发行版中需要单独安装

```bash
# 在 Ubuntu 上安装 ZFS
sudo apt install zfsutils-linux
# 创建 ZFS 文件系统
sudo zpool create data /dev/sdb1
```

### 虚拟文件系统

#### procfs
- 虚拟文件系统，提供内核和进程信息的接口
- 挂载在 `/proc` 目录
- 不占用实际磁盘空间

```bash
# 查看 CPU 信息
cat /proc/cpuinfo
# 查看内存使用情况
cat /proc/meminfo
```

#### sysfs
- 挂载在 `/sys` 目录
- 提供内核设备树的接口
- 用于设备管理和配置

#### tmpfs
- 临时文件系统，存储在内存中
- 挂载在 `/tmp` 和 `/run` 目录
- 系统重启后数据丢失

### 网络文件系统

#### NFS (Network File System)
- 允许不同计算机之间共享文件系统
- 基于 TCP/IP 协议

```bash
# 安装 NFS 客户端
sudo apt install nfs-common
# 挂载 NFS 共享
sudo mount server:/share /mnt
```

#### SMB/CIFS
- Windows 使用的网络文件共享协议
- Linux 通过 Samba 支持

```bash
# 安装 Samba 客户端
sudo apt install cifs-utils
# 挂载 SMB 共享
sudo mount -t cifs //server/share /mnt -o username=user,password=pass
```

## Linux 文件系统层次结构

### 根目录结构
Linux 文件系统层次标准 (FHS) 定义了主要目录的用途：

- **/**：根目录，所有其他目录的起点
- **/bin**：基本命令二进制文件
- **/boot**：引导加载程序文件和内核
- **/dev**：设备文件
- **/etc**：系统配置文件
- **/home**：用户主目录
- **/lib**：共享库文件
- **/media**：可移动媒体挂载点
- **/mnt**：临时挂载点
- **/opt**：可选软件包
- **/proc**：进程信息虚拟文件系统
- **/root**：root 用户主目录
- **/run**：运行时数据
- **/sbin**：系统管理命令
- **/srv**：服务数据
- **/sys**：系统设备和内核信息虚拟文件系统
- **/tmp**：临时文件
- **/usr**：用户程序和数据
- **/var**：可变数据（日志、缓存等）

## 文件系统管理工具

### 分区和格式化工具

#### fdisk/gdisk
```bash
# 列出所有磁盘和分区
sudo fdisk -l
# 编辑磁盘分区表
sudo fdisk /dev/sdb
```

#### parted
```bash
# 启动交互式分区工具
sudo parted /dev/sdb
```

#### mkfs 系列工具
```bash
# 格式化分区为指定文件系统
sudo mkfs.ext4 /dev/sdb1
sudo mkfs.xfs /dev/sdb2
sudo mkfs.btrfs /dev/sdb3
```

### 挂载和卸载

```bash
# 挂载文件系统
sudo mount /dev/sdb1 /mnt/data

# 使用特定选项挂载
sudo mount -t ext4 -o rw,noatime /dev/sdb1 /mnt/data

# 卸载文件系统
sudo umount /mnt/data
# 或
sudo umount /dev/sdb1
```

### 自动挂载
通过 `/etc/fstab` 配置文件实现系统启动时自动挂载：

```bash
# 编辑 fstab 文件
sudo nano /etc/fstab

# 添加类似以下的行
/dev/sdb1   /mnt/data   ext4    defaults    0   2
```

### 文件系统检查和修复

```bash
# 检查并修复 ext 文件系统
sudo fsck.ext4 /dev/sdb1

# 检查并修复 XFS 文件系统
sudo xfs_repair /dev/sdb1

# 扫描所有文件系统（通常在启动时自动运行）
sudo fsck -A
```

## 文件系统性能

### 性能调优

#### 挂载选项优化
```bash
# 在 /etc/fstab 中添加性能优化选项
/dev/sdb1   /mnt/data   ext4    defaults,noatime,discard    0   2
```

#### 文件系统特定优化
```bash
# ext4 优化
sudo tune2fs -o journal_data_writeback /dev/sdb1

# XFS 优化
sudo xfs_info /dev/sdb1
```

### 监控文件系统

```bash
# 查看磁盘使用情况
df -h

# 查看 inode 使用情况
df -i

# 查看磁盘 I/O 性能
iostat -x

# 查看文件系统统计信息
sudo dumpe2fs -h /dev/sdb1
```

## 文件系统安全

### 文件系统加密

#### LUKS (Linux Unified Key Setup)
```bash
# 加密分区
sudo cryptsetup luksFormat /dev/sdb1
# 打开加密分区
sudo cryptsetup open /dev/sdb1 encrypted_data
# 创建文件系统
sudo mkfs.ext4 /dev/mapper/encrypted_data
# 挂载
sudo mount /dev/mapper/encrypted_data /mnt/encrypted
```

#### fscrypt
- 支持对特定目录或文件进行加密
- 不需要加密整个分区

### 数据备份
```bash
# 使用 rsync 备份
sudo rsync -avz /source /backup

# 使用 tar 创建归档
tar -czvf backup.tar.gz /source
```

通过本教程，您应该已经了解了 Linux 文件系统的基本概念、类型和管理方法。文件系统是 Linux 系统的核心组件之一，深入理解它对于系统管理和故障排除至关重要。
