+++
title = "Linux之旅(二):FHS与目录结构"
date = 2023-07-21

[taxonomies]
tags = ["Linux"]
+++

前言 在Linux世界中，Filesystem Hierarchy Standard（FHS）是一座引导我们进入系统核心的桥梁，它定义了Linux系统中目录结构的规范与作用，为我们提供了一张清晰的地图，指引我们轻松管理和理解系统。本文将深入探讨FHS规范与Linux系统目录结构，解释各个目录的用途与功能，帮助我们更好地理解和利用Linux系统。
<!-- more -->

## 一.认识FHS

FHS是Filesystem Hierarchy Standard（文件系统层次结构标准）的缩写。它是一个定义了Linux系统中目录结构和各个目录作用的规范。FHS规定了Linux系统中各个目录的用途和预期内容，以便确保不同Linux发行版之间的兼容性，并使得用户能够更轻松地理解和管理系统。

FHS规范最初由Linux基金会（Linux Foundation）和自由软件基金会（Free Software Foundation）共同发布，并经过多次修订和更新。该规范不仅对Linux系统本身有用，也适用于其他类UNIX操作系统。

FHS规范定义了一些基本的目录，如/bin、/boot、/dev等，并规定了每个目录的作用和预期内容。这样做有助于系统管理员和开发人员更好地组织和管理文件系统，并使得用户能够更轻松地找到所需的文件和数据。

## 二.常见目录结构

在刚刚由Windows切换至Linux时，往往会对目录感到不解，不知道安装的软件放在哪个目录之下？

以下是对Linux系统目录结构的详细说明：

- **/（根目录）**：
根目录是整个文件系统的起点，包含了系统中所有其他目录和文件。在Linux系统中，根目录被表示为/。
- **/bin（二进制文件）**：
/bin目录存放着一些最基本的系统命令，如ls、cp、mv等，这些命令通常被所有用户使用。
- **/boot（引导文件）**：
/boot目录存放着启动Linux系统所需的引导文件，如内核映像（vmlinuz）、引导加载程序（boot loader）配置文件（如GRUB配置文件）等。
- **/dev（设备文件）**：
/dev目录包含了系统中所有设备的特殊文件，如硬盘、键盘、鼠标等。在Linux中，一切皆文件，设备被抽象为文件，通过/dev目录中的特殊文件来表示。
- **/etc（配置文件）**：
/etc目录包含了系统的配置文件，如网络配置、用户账户信息、服务配置等。这些配置文件通常以纯文本的形式存在，可以由系统管理员进行编辑和修改。
- **/home（用户主目录）**：
/home目录是系统中所有普通用户的主目录所在地，每个用户通常都有一个对应的子目录，用于存放用户的个人文件和数据。
- **/lib（库文件）**：
/lib目录存放着系统所需的共享库文件，这些库文件包含了一些程序运行所需的函数和数据，为程序提供了基本的支持。
- **/mnt（挂载点）**：
/mnt目录用于挂载临时文件系统，如光盘、移动硬盘等。系统管理员可以将其他设备或文件系统挂载到/mnt目录下，以便访问其中的文件和数据。
- **/opt（可选软件包）**：
/opt目录用于存放一些可选的软件包和应用程序，这些软件包通常不属于Linux发行版的默认安装范围，但可以被用户自行安装和管理。
- **/proc（进程信息）**：
/proc目录是一个虚拟的文件系统，包含了系统运行时的各种进程信息和系统状态信息。用户可以通过读取/proc目录中的特殊文件来获取系统信息。
- **/sbin（系统命令）**：
/sbin目录存放着一些系统管理和维护命令，这些命令通常只能由超级用户（root）执行，用于系统的管理和维护。
- **/srv（服务数据）**：
/srv目录用于存放一些服务相关的数据文件，如Web服务器的网站数据、FTP服务器的文件等。每个服务通常都会有一个对应的子目录。
- **/tmp（临时文件）**：
/tmp目录用于存放临时文件和临时数据，这些文件通常在系统重启时会被删除。任何用户都可以在/tmp目录下创建临时文件。
- **/usr（用户程序）**：
/usr目录包含了系统中大部分用户可用的程序和文件，如用户应用程序、共享库文件、文档等。它通常是系统的二级目录，类似于Windows系统中的Program Files目录。
- **/var（可变数据）**：
/var目录用于存放系统运行时产生的可变数据，如日志文件、邮件、缓存文件等。这些数据通常会随着系统的运行而不断变化。

> 注意：NixOS不符合FHS标准！

## 三.分区大小

对各个分区进行容量分配时，需要根据系统的实际需求和用途来进行规划。一般而言在安装引导时可以选择让程序自动分区。

- **根目录（/）**：根目录是整个文件系统的起点，通常会分配较大的空间，以确保系统和应用程序有足够的空间运行。建议分配至少20GB的空间给根目录。
- **/home目录**：/home目录用于存放用户的个人文件和数据，因此需要根据用户数量和存储需求来进行容量分配。一般情况下，建议为每个用户分配至少10GB的空间。
- **/var目录**：/var目录用于存放系统运行时产生的可变数据，如日志文件、邮件、缓存文件等。根据系统的运行情况和日志文件的大小来进行容量分配，一般建议分配10-20GB的空间。
- **/tmp目录**：/tmp目录用于存放临时文件和临时数据，通常不需要分配太大的空间。建议分配至少1-2GB的空间给/tmp目录。
- **/boot目录**：/boot目录存放着启动Linux系统所需的引导文件，通常只需要分配几百MB的空间即可。
- **Swap分区**：Swap分区是一种虚拟内存，用于暂时存放不常用的内存数据。当系统内存不足时，Linux会将一部分内存数据移动到Swap分区中，以避免内存耗尽导致系统崩溃。Swap分区的大小通常与系统内存大小有关，一般建议为系统内存的1.5-2倍。例如，如果系统内存为4GB，则建议设置Swap分区大小为6-8GB。

> 这里特别讲讲Swap分区

Swap分区可以通过以下几种方式实现：

- 交换分区（Swap Partition）：创建一个独立的交换分区，通常是一个专门的分区，用于存放Swap数据。
- 交换文件（Swap File）：创建一个专门的文件用于存放Swap数据，而不是创建独立的分区。这种方式更加灵活，可以根据需要动态调整Swap的大小。
- Swap大小：Swap的大小应该根据系统的内存大小和使用情况来确定，一般建议为系统内存的1.5-2倍。
- Swap分区/文件的位置：Swap分区/文件应该位于较快的存储介质上，以确保交换操作的效率。
Swap的优先级：如果同时存在多个Swap分区/文件，可以通过设置优先级来指定系统使用的Swap空间。

## 四.将 `home` 目录下的文件夹改为英文

可以使用 `xdg-user-dirs-update` 工具来更新用户目录为英文版本。你可以按照以下步骤进行：

1. **编辑用户目录配置文件**：
   打开或创建 `~/.config/user-dirs.dirs` 文件，用文本编辑器编辑它：
   ```bash
   nano ~/.config/user-dirs.dirs
   ```

2. **将目录名称更改为英文**：
   在该文件中，你可以看到类似以下的条目：
   ```bash
   XDG_DESKTOP_DIR="$HOME/桌面"
   XDG_DOWNLOAD_DIR="$HOME/下载"
   XDG_DOCUMENTS_DIR="$HOME/文档"
   XDG_MUSIC_DIR="$HOME/音乐"
   XDG_PICTURES_DIR="$HOME/图片"
   XDG_VIDEOS_DIR="$HOME/视频"
   ```
   将这些路径改为英文，例如：
   ```bash
   XDG_DESKTOP_DIR="$HOME/Desktop"
   XDG_DOWNLOAD_DIR="$HOME/Downloads"
   XDG_DOCUMENTS_DIR="$HOME/Documents"
   XDG_MUSIC_DIR="$HOME/Music"
   XDG_PICTURES_DIR="$HOME/Pictures"
   XDG_VIDEOS_DIR="$HOME/Videos"
   ```

3. **重命名现有的文件夹**：
   手动将 `home` 目录下的文件夹重命名为英文版本：
   ```bash
   mv ~/桌面 ~/Desktop
   mv ~/下载 ~/Downloads
   mv ~/文档 ~/Documents
   mv ~/音乐 ~/Music
   mv ~/图片 ~/Pictures
   mv ~/视频 ~/Videos
   ```

4. **应用更改**：
   完成以上操作后，运行以下命令应用新配置：
   ```bash
   xdg-user-dirs-update
   ```

这样，`home` 目录下的文件夹就会改为英文，并且系统也会正确识别这些新的目录路径。