Linux 操作系統原理 — 文件系統 —文件

目錄

文件

文件的構造

在這裏插入圖片描述

文件的構造有多種方式。上圖列出了常用的三種構造方式:

  1. 上圖中的 a 是一種無結構的字節序列,操作系統不關心序列的內容是什麼,操作系統能看到的就是字節(Bytes)。其文件內容的任何含義只在用戶程序中進行解釋。UNIX 和 Windows 都採用這種辦法。把文件看成字節序列提供了最大的靈活性。用戶程序可以向文件中寫任何內容,並且可以通過任何方便的形式命名。操作系統不會爲爲用戶寫入內容提供幫助,當然也不會干擾阻塞你。對於想做特殊操作的用戶來說,後者是十分重要的。所有的 UNIX 版本(包括 Linux 和 OS X)和 Windows 都使用這種文件模型。

  2. 圖 b 表示在文件結構上的第一步改進。在這個模型中,文件是具有固定長度記錄的序列,每個記錄都有其內部結構。把文件作爲記錄序列的核心思想是:讀操作返回一個記錄,而寫操作重寫或者追加一個記錄。

  3. 第三種文件結構如上圖 c 所示。在這種組織結構中,文件由一顆記錄樹構成,記錄樹的長度不一定相同,每個記錄樹都在記錄中的固定位置包含一個key 字段。這棵樹按 key 進行排序,從而可以對特定的 key 進行快速查找。在記錄樹的結構中,可以取出下一個記錄,但是最關鍵的還是根據 key 搜索指定的記錄。如上圖 c 所示,用戶可以讀出指定的 pony 記錄,而不必關心記錄在文件中的確切位置。用戶也可以在文件中添加新的記錄。但是用戶不能決定添加到何處位置,添加到何處位置是由操作系統決定的。

文件的類型

常規文件

常規文件(Regular files):是包含有用戶信息的文件。包括:C 語言元代碼、Shell 腳本、文本文件、圖像文件、二進制的可執行文件等。從常規文件讀取數據或將數據寫入時,內核會根據文件系統的規則執行操作,寫入可能被延遲,記錄日誌或者接受其他操作。一般分爲 ASCII 碼文件或者二進制文件。

ASCII 碼文件

ASCII 碼文件:由文本組成。在一些系統中,每行都會用回車符結束(ASCII 碼是 13,控制字符 CR,轉義字符 \r),另外一些則會使用換行符(ASCII 碼是 10,控制字符 LF,轉義字符 \n),也有系統(比如 Windows)兩者都會使用。ASCII 文件的優點在於顯示 和 打印,還可以用任何文本編輯器進行編輯。進一步來說,如果許多應用程序使用 ASCII 碼作爲輸入和輸出,那麼很容易就能夠把多個程序連接起來,一個程序的輸出可能是另一個程序的輸入,就像管道一樣。

二進制文件

二進制文件:取自早期的 UNIX,儘管從技術上來看這個文件只是字節序列,但是操作系統只有在文件格式正確的情況下才會執行。
在這裏插入圖片描述

這個文件有五個段:文件頭、正文、數據、重定位位和符號表。文件頭以魔數(magic number)開始,表明這個文件是一個可執行文件(以防止意外執行非此格式的文件)。然後是文件各個部分的大小,開始執行的標誌以及一些標誌位。程序本身的正文和數據在文件頭後面,他們被加載到內存中或者重定位會根據重定位位進行判斷。符號表則用於調試(e.g. gdb)

二進制文件的另外一種形式是存檔文件,它由已編譯但沒有鏈接的庫(模塊)組合而成。每個文件都以模塊頭開始,其中記錄了名稱、創建日期、所有者、保護碼和文件大小。和可執行文件一樣,模塊頭也都是二進制數,將它們複製到打印機將會產生亂碼。

所有的操作系統必須至少能夠識別一種文件類型:它自己的可執行文件。以前的 TOPS-20 系統(用於 DECsystem 20)甚至要檢查要執行的任何文件的創建時間,爲了定位資源文件來檢查自動文件創建後是否被修改過。如果被修改過了,那麼就會自動編譯文件。在 UNIX 中,就是在 Shell 中嵌入 make 程序。此時操作系統要求用戶必須採用固定的文件擴展名,從而確定哪個源程序生成哪個二進制文件

什麼是 make 程序?在軟件發展過程中,make 程序是一個自動編譯的工具,它通過讀取稱爲 Makefiles 的文件來自動從源代碼構建可執行程序和庫,該文件指定了如何導出目標程序。儘管集成開發環境和特定語言的編譯器功能也可以用於管理構建過程,但 Make 仍被廣泛使用,尤其是在 UNIX 和類似 UNIX 的操作系統中使用。

當程序從文件中讀寫數據時,請求會轉到內核處理程序(Kernel driver)。如果文件是常規文件,則數據由文件系統驅動程序處理,並且通常存儲在磁盤或其他存儲介質上的某塊區域中,從文件中讀取的數據就是之前在該位置寫入的數據。

當數據讀取或寫入到設備文件時,請求會被設備驅動程序處理。每個設備文件都有一個關聯的編號,該編號標示要使用的設備驅動程序。設備處理數據的工作是它自己的事兒。

設備文件

設備文件:與系統外設相關的,通常在 /dev 下面。分爲塊設備和字符設備。

字符設備文件

字符設備,也稱爲字符特殊文件(Character special file):和輸入/輸出有關,用於串行 I/O 類設備,如:終端、打印機、網絡等。它的行爲類似於管道、串行端口。將字節寫入字符設備可能會導致它在屏幕上顯示,在串行端口上輸出,轉換爲聲音。

塊設備文件

塊設備,也稱爲塊特殊文件(block special file):用於磁盤類設備。它的行爲通常與普通文件相似:它們是字節數組,並且在給定位置讀取的值是最後寫入該位置的值。來自塊設備的數據可以緩存在內存中,並從緩存中讀取;寫入可以被緩衝。塊設備通常是可搜索的,塊設備的概念是,相應的硬件可以一次讀取或者寫入整個塊,例如磁盤上的一個扇區。

目錄文件

目錄(Directories)是管理文件系統結構的系統文件。它是用於在計算機上存儲文,存儲文件的唯一地方。目錄位於分層文件系統中,例如 Linux,MS-DOS 和 UNIX。

和 DOS 等操作系統不同,Linux 操作系統中單獨的文件系統並不是由驅動器號或驅動器名稱(e.g. A:、C: 等)來標識的。相反,和 UNIX 操作系統一樣,Linux 操作系統將獨立的文件系統組合成了一個層次化的樹形結構,並且由一個單獨的實體代表這一文件系統。Linux 將新的文件系統通過一個稱爲 “掛裝” 或 “掛上” 的操作將其掛裝到某個目錄上,從而讓不同的文件系統結合成爲一個整體。

Linux 使用標準的目錄結構,在安裝的時候,安裝程序就已經爲用戶創建了文件系統和完整而固定的目錄結構,並指定了每個目錄的作用和其中的文件類型。

完整的目錄樹可劃分爲小的部分,這些小部分又可以單獨存放在自己的磁盤或分區上。這樣,相對穩定的部分和經常變化的部分可單獨存放在不同的分區中,從而方便備份或系統管理。

在這裏插入圖片描述

Linux 採用的是樹型結構。最上層是根目錄,其他的所有目錄都是從根目錄出發而生成的。在 Linux 中,無論操作系統管理幾個磁盤分區,這樣的目錄樹只有一個。從結構上講,各個磁盤分區上的樹型目錄不一定是並列的。

  • /bin:二進制可執行命令
  • /dev:設備特殊文件
  • /etc:系統管理和配置文件
  • /etc/rc.d:啓動的配置文件和腳本
  • /home:用戶主目錄的基點
  • /lib:標準程序設計庫,又叫動態鏈接共享庫
  • /sbin:系統管理命令,這裏存放的是系統管理員使用的管理程序
  • /tmp:公用的臨時文件存儲點
  • /root:系統管理員的主目錄
  • /mnt:系統提供這個目錄是讓用戶臨時掛載其他的文件系統
  • /lost+found:這個目錄平時是空的,存放系統在非正常關機情況下而留下 “無家可歸” 的文件
  • /proc:虛擬的目錄,是系統內存的映射。可直接訪問這個目錄來獲取系統信息。
  • /var:某些大文件的溢出區,比方說各種服務的日誌文件
  • /usr:最龐大的目錄,要用到的應用程序和文件幾乎都在這個目錄。其中包含:
    • /usr/X11R6:存放 X window 程序的目錄
    • /usr/bin:衆多的應用程序
    • /usr/sbin:root 的一些管理程序
    • /usr/doc:Linux 文檔
    • /usr/include:Linux 下開發和編譯應用程序所需要的頭文件
    • /usr/lib:常用的動態鏈接庫和軟件包的配置文件
    • /usr/man:幫助文檔
    • /usr/src:源代碼,Linux 內核的源代碼就放在 /usr/src/linux 下
    • /usr/local/bin:本地增加的命令
    • /usr/local/lib:本地增加的庫

其他文件

  • 鏈接文件:指向同一個文件或目錄的的文件。
  • 管道(FIFO)文件 : 提供進程建通信的一種方式。
  • 套接字(Socket) 文件: 該文件類型與網絡通信有關。

文件的屬性

在這裏插入圖片描述

文件的操作

  • Create,創建不包含任何數據的文件。調用的目的是表示文件即將建立,並對文件設置一些屬性。
  • Delete,當文件不再需要,必須刪除它以釋放內存空間。爲此總會有一個系統調用來刪除文件。
  • Open,在使用文件之前,必須先打開文件。這個調用的目的是允許系統將屬性和磁盤地址列表保存到主存中,用來以後的快速訪問。
  • Close,當所有進程完成時,屬性和磁盤地址不再需要,因此應關閉文件以釋放表空間。很多系統限制進程打開文件的個數,以此達到鼓勵用戶關閉不再使用的文件。磁盤以塊爲單位寫入,關閉文件時會強制寫入最後一塊,即使這個塊空間內部還不滿。
  • Read,數據從文件中讀取。通常情況下,讀取的數據來自文件的當前位置。調用者必須指定需要讀取多少數據,並且提供存放這些數據的緩衝區。
  • Write,向文件寫數據,寫操作一般也是從文件的當前位置開始進行。如果當前位置是文件的末尾,則會直接追加進行寫入。如果當前位置在文件中,則現有數據被覆蓋,並且永遠消失。
  • Append,使用 append 只能向文件末尾添加數據。
  • Seek,對於隨機訪問的文件,要指定從何處開始獲取數據。通常的方法是用 seek 系統調用把當前位置指針指向文件中的特定位置。seek 調用結束後,就可以從指定位置開始讀寫數據了。
  • Get attributes,進程運行時通常需要讀取文件屬性。
  • Set attributes,用戶可以自己設置一些文件屬性,甚至是在文件創建之後,實現該功能的是 set attributes 系統調用。
  • Rename,用戶可以自己更改已有文件的名字,rename 系統調用用於這一目的。

目錄的操作

  • create,創建目錄,除了目錄項 . 和 … 外,目錄內容爲空。
  • delete,刪除目錄,只有空目錄可以刪除。只包含 . 和 … 的目錄被認爲是空目錄,這兩個目錄項通常不能刪除
  • opendir,目錄內容可被讀取。例如,未列出目錄中的全部文件,程序必須先打開該目錄,然後讀其中全部文件的文件名。與打開和讀文件相同,在讀目錄前,必須先打開文件。
  • closedir,讀目錄結束後,應該關閉目錄用於釋放內部表空間。
  • readdir,系統調用 readdir 返回打開目錄的下一個目錄項。以前也採用 read 系統調用來讀取目錄,但是這種方法有一個缺點:程序員必須瞭解和處理目錄的內部結構。相反,不論採用哪一種目錄結構,readdir 總是以標準格式返回一個目錄項。
  • rename,在很多方面目錄和文件都相似。文件可以更換名稱,目錄也可以。
  • link,鏈接技術允許在多個目錄中出現同一個文件。這個系統調用指定一個存在的文件和一個路徑名,並建立從該文件到路徑所指名字的鏈接。這樣,可以在多個目錄中出現同一個文件。有時也被稱爲硬鏈接(hard link)。
  • unlink,刪除目錄項。如果被解除鏈接的文件只出現在一個目錄中,則將它從文件中刪除。如果它出現在多個目錄中,則只刪除指定路徑名的鏈接,依然保留其他路徑名的鏈接。在 UNIX 中,用於刪除文件的系統調用就是 unlink。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章