# 文件系统,第 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`。
## 什么是文件系统?
文件系统是如何在磁盘上组织信息。每当您想要访问文件时,文件系统都会指示如何读取文件。这是文件系统的示例图像。
![](https://img.kancloud.cn/d1/0b/d10b8f4f1b4c064185eecdcdf77e6ec1_631x418.jpg)
哇,这让我们分手了
* 超级块:此块包含有关文件系统,大小,上次修改时间,日志,inode 数量和第一个 inode 启动,数据块数量和第一个数据块启动的元数据。
* Inode:这是关键的抽象。 inode 是一个文件。
* 磁盘块:这些是存储数据的位置。文件的实际内容
## inode 如何存储文件内容?
![](https://img.kancloud.cn/fd/d4/fdd407ce33261ec886c55c31ed7faa5e_1379x870.jpg)
来自[维基百科](http://en.wikipedia.org/wiki/Inode):
> _ 在 Unix 风格的文件系统中,索引节点(非正式地称为 inode)是用于表示文件系统对象的数据结构,该文件系统对象可以是各种事物之一,包括文件或目录。每个 inode 都存储文件系统对象数据的属性和磁盘块位置。文件系统对象属性可以包括操纵元数据(例如,改变,访问,修改时间),以及所有者和许可数据(例如,组 ID,用户 ID,许可)。_
要读取文件的前几个字节,请按照第一个间接块指针指向第一个间接块并读取前几个字节,写入是相同的过程。如果你想读取整个文件,继续阅读直接块,直到你的大小用完(我们将讨论一些间接块)
> “计算机科学中的所有问题都可以通过另一层次的间接解决。” - 大卫惠勒
## 为什么要使磁盘块与内存页面大小相同?
为了支持虚拟内存,我们可以在内存中填充内容。
## 我们想为每个文件存储哪些信息?
* 文件名
* 文件大小
* 创建时间,上次修改,上次访问
* 权限
* 文件路径
* 校验
* 文件数据(inode)
## 传统权限是什么:用户 - 组 - 文件的其他权限?
一些常见的文件权限包括:
* 755:`rwx r-x r-x`
user:`rwx`,组:`r-x`,其他:`r-x`
用户可以读,写和执行。小组和其他人只能阅读和执行。
* 644:`rw- r-- r--`
user:`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...))
- UIUC CS241 系统编程中文讲义
- 0. 简介
- #Informal 词汇表
- #Piazza:何时以及如何寻求帮助
- 编程技巧,第 1 部分
- 系统编程短篇小说和歌曲
- 1.学习 C
- C 编程,第 1 部分:简介
- C 编程,第 2 部分:文本输入和输出
- C 编程,第 3 部分:常见问题
- C 编程,第 4 部分:字符串和结构
- C 编程,第 5 部分:调试
- C 编程,复习题
- 2.进程
- 进程,第 1 部分:简介
- 分叉,第 1 部分:简介
- 分叉,第 2 部分:Fork,Exec,等等
- 进程控制,第 1 部分:使用信号等待宏
- 进程复习题
- 3.内存和分配器
- 内存,第 1 部分:堆内存简介
- 内存,第 2 部分:实现内存分配器
- 内存,第 3 部分:粉碎堆栈示例
- 内存复习题
- 4.介绍 Pthreads
- Pthreads,第 1 部分:简介
- Pthreads,第 2 部分:实践中的用法
- Pthreads,第 3 部分:并行问题(奖金)
- Pthread 复习题
- 5.同步
- 同步,第 1 部分:互斥锁
- 同步,第 2 部分:计算信号量
- 同步,第 3 部分:使用互斥锁和信号量
- 同步,第 4 部分:临界区问题
- 同步,第 5 部分:条件变量
- 同步,第 6 部分:实现障碍
- 同步,第 7 部分:读者编写器问题
- 同步,第 8 部分:环形缓冲区示例
- 同步复习题
- 6.死锁
- 死锁,第 1 部分:资源分配图
- 死锁,第 2 部分:死锁条件
- 死锁,第 3 部分:餐饮哲学家
- 死锁复习题
- 7.进程间通信&amp;调度
- 虚拟内存,第 1 部分:虚拟内存简介
- 管道,第 1 部分:管道介绍
- 管道,第 2 部分:管道编程秘密
- 文件,第 1 部分:使用文件
- 调度,第 1 部分:调度过程
- 调度,第 2 部分:调度过程:算法
- IPC 复习题
- 8.网络
- POSIX,第 1 部分:错误处理
- 网络,第 1 部分:简介
- 网络,第 2 部分:使用 getaddrinfo
- 网络,第 3 部分:构建一个简单的 TCP 客户端
- 网络,第 4 部分:构建一个简单的 TCP 服务器
- 网络,第 5 部分:关闭端口,重用端口和其他技巧
- 网络,第 6 部分:创建 UDP 服务器
- 网络,第 7 部分:非阻塞 I O,select()和 epoll
- RPC,第 1 部分:远程过程调用简介
- 网络复习题
- 9.文件系统
- 文件系统,第 1 部分:简介
- 文件系统,第 2 部分:文件是 inode(其他一切只是数据...)
- 文件系统,第 3 部分:权限
- 文件系统,第 4 部分:使用目录
- 文件系统,第 5 部分:虚拟文件系统
- 文件系统,第 6 部分:内存映射文件和共享内存
- 文件系统,第 7 部分:可扩展且可靠的文件系统
- 文件系统,第 8 部分:从 Android 设备中删除预装的恶意软件
- 文件系统,第 9 部分:磁盘块示例
- 文件系统复习题
- 10.信号
- 过程控制,第 1 部分:使用信号等待宏
- 信号,第 2 部分:待处理的信号和信号掩码
- 信号,第 3 部分:提高信号
- 信号,第 4 部分:信号
- 信号复习题
- 考试练习题
- 考试主题
- C 编程:复习题
- 多线程编程:复习题
- 同步概念:复习题
- 记忆:复习题
- 管道:复习题
- 文件系统:复习题
- 网络:复习题
- 信号:复习题
- 系统编程笑话