# 文件系统，第 1 部分：简介

> 原文：<https://github.com/angrave/SystemProgramming/wiki/File-System%2C-Part-1%3A-Introduction>

## 导航/术语

## 设计一个文件系统！你的设计目标是什么？

文件系统的设计是一个难题，因为我们希望满足许多高级设计目标。一份不完整的理想目标清单包括：

*   可靠且强大（要考虑硬件故障或由于意外断电造成的写入不完整）
*   访问（安全）控制
*   账号和权限分配
*   索引和搜索
*   版本控制和备份功能
*   加密
*   自动压缩
*   高性能（例如内存缓存）
*   有效使用存储空间，数据去重

并非所有文件系统本身都支持所有这些目标。例如，许多文件系统不会自动压缩使用频率很低的文件

## 什么是`.`，`..`和`...`？

在标准的 unix 文件系统中：

*   `.`代表当前目录

*   `..`代表父目录

*   `...`不是任何目录的有效表示（这不是祖父目录）。但是可以把它当成磁盘上的一个文件名字。

## 什么是绝对和相对路径？

绝对路径是从目录树的“根节点”开始的路径。相对路径是从目录树中当前位置开始的路径。

## 有什么相对和绝对路径的例子？

如果从主目录开始（简称“〜”），那么`Desktop/cs241`将是一个相对路径。它的绝对路径对应可能类似于`/Users/[yourname]/Desktop/cs241`。

## 如何简化`a/b/../c/./`这个路径？

请记住，`..`表示“父文件夹”，`.`表示“当前文件夹”。

示例：`a/b/../c/./`

*   第 1 步：`cd a`（在 a 中）
*   第 2 步：`cd b`（在 a / b 中）
*   第 3 步：`cd ..`（在 a 中，因为..表示'父文件夹'）
*   第 4 步：`cd c`（在 a / c 中）
*   第 5 步：`cd .`（在/ c 中，因为。表示'当前文件夹'）

因此，该路径可以简化为`a/c`。

## 什么是文件系统？

文件系统是扮演这在磁盘上组织信息的角色。每当您想要访问文件时，文件系统都会指示如何读取文件。这是文件系统的示例图像。

![](img/d5c232c0012ccdb9ff8c9e79b2429cb9.jpg)

让我们细看一下上面那个图

*   super block：此块包含有关文件系统，大小，上次修改时间，日志，inode 数量和第一个 inode 启动，数据块数量和第一个数据块启动的元数据。
*   Inode：这是关键的抽象。 inode 是一个文件。
*   磁盘块：这些是存储数据的位置。文件的实际内容。

## inode 如何存储文件内容？

![](img/1e5467473b254a4f5bb8d50f0f58ed17.jpg)

来自[维基百科](http://en.wikipedia.org/wiki/Inode)：

> 在 Unix 风格的文件系统中，索引节点（非官方地称为inode）是用于表示文件系统对象的数据结构，该文件系统对象可以是各种事物之一，包括文件或目录。每个 inode 都存储文件系统对象数据的属性和磁盘块位置。文件系统对象属性可以包括操纵元数据（例如，改变，访问，修改时间），以及所有者和授权数据（例如，组ID，用户ID，授权）。

要读取文件的前几个字节，请按照第一个间接块指针指向第一个间接块并读取前几个字节，写入是相同的过程。如果你想读取整个文件，继续读取direct block，直到你用完为止（我们将讨论一些间接块）

> “计算机科学中的所有问题都可以通过另一层次的间接解决。” - 大卫惠勒

## 为什么要使磁盘块与内存页面大小相同？

为了支持虚拟内存，我们可以在内存中填充内容。

## 我们想为每个文件存储哪些信息？

*   文件名
*   文件大小
*   创建时间，上次修改，上次访问
*   权限
*   文件路径
*   校验
*   文件数据（inode）

## 传统权限是什么：当前用户-当前组-其他 文件权限？

一些常见的文件权限包括：

*   755：`rwx r-x r-x`

当前用户：`rwx`，当前组：`r-x`，其他：`r-x`

当前用户可以读，写和执行。组和其他人只能阅读和执行。

*   644：`rw- r-- r--`

当前用户：`rw-`，当前组：`r--`，其他：`r--`

当前用户可以读写。当前组和其他人只能阅读。

## 每个角色的常规文件的3个权限位是什么？

*   读（最重要的位）

*   写（第2位）

*   执行（最低有效位）

## “644”“755”是什么意思？

这些是八进制格式的权限示例（基数 8）。每个八进制数字对应不同的角色（用户，组，世界）。

我们可以按如下方式读取八进制格式的权限：

*   644 - R / W 用户权限，R 组权限，R 世界权限

*   755 - R / W / X 用户权限，R / X 组权限，R / X 世界权限

## 你可以在每个间接表中存储多少个指针？

作为一个有效的例子，假设我们将磁盘划分为 4KB 块，并且我们想要寻址最多 2 ^ 32 个块。

最大磁盘大小为 4KB * 2 ^ 32 = 16TB（记住 2 ^ 10 = 1024）

磁盘块可以存储 4KB / 4B（每个指针需要 32 位）= 1024 个指针。每个指针指的是一个 4KB 磁盘块 - 因此您可以参考最多 1024 * 4KB = 4MB 的数据

对于相同的磁盘配置，双间接块存储 1024 个指向 1024 个间接表的指针。因此，双间接块可以指代最多 1024 * 4MB = 4GB 的数据。

类似地，三重间接块可以指代最多 4TB 的数据。

[转到文件系统：第 2 部分](https://github.com/angrave/SystemProgramming/wiki/File-System,-Part-2:-Files-are-inodes-(everything-else-is-just-data...))