# 文件系統,第 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`。
## 什么是文件系統?
文件系統是如何在磁盤上組織信息。每當您想要訪問文件時,文件系統都會指示如何讀取文件。這是文件系統的示例圖像。

哇,這讓我們分手了
* 超級塊:此塊包含有關文件系統,大小,上次修改時間,日志,inode 數量和第一個 inode 啟動,數據塊數量和第一個數據塊啟動的元數據。
* Inode:這是關鍵的抽象。 inode 是一個文件。
* 磁盤塊:這些是存儲數據的位置。文件的實際內容
## inode 如何存儲文件內容?

來自[維基百科](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 編程:復習題
- 多線程編程:復習題
- 同步概念:復習題
- 記憶:復習題
- 管道:復習題
- 文件系統:復習題
- 網絡:復習題
- 信號:復習題
- 系統編程笑話