树莓派开始,玩转Linux26:仓库大管家
樹莓派開始,玩轉Linux26:倉庫大管家
在前面的章節中,我們已經用到了Linux的文件系統。通過文件系統,可以找到文件、新建文件、刪除文件、讀寫文件。這些高層抽象的用戶操作,完全可以滿足日常需求。但對于Linux程序員和資深用戶來說,只有知道了外部存儲器的組織方式,才能深入Linux系統編程。
1.外部存儲設備:
文件系統的終極目標是把大量數據有組織地放入外部存儲設備中,比如樹莓派的SD卡上。以SD卡作為外部存儲器的計算機并不常見。在非樹莓派的PC上,更常見的外部存儲器是磁盤。外部存儲設備的容量一般也比內存大。它們還可以持久地保存數據,儲存的數據不會隨著斷電而消失。外部存儲器的讀寫速度要比內存慢。道理很簡單,如果外部存儲器讀寫速度比內存還快,那么人們會直接選用外部存儲器來作為主存儲器。
傳統的機械式磁盤在進行隨機讀寫時,效率會比連續讀寫更低。機械式磁盤由多個盤片和磁頭組成,每個盤片上有多個可以存儲數據的磁道。如果讀寫的區域不連續,磁盤需要改變磁頭位置來切換磁道。在進行隨機讀寫時,數據存活的區域可能散布于不同的磁道,因此磁道切換會讓讀寫效率大為降低。因為SD卡沒有類似的機械結構,所以隨機讀寫和連續讀寫的速度差距不像磁盤那么大。
再來看外部存儲器中的數據組織方式。Linux通過文件系統來管理外部存儲器。文件系統有很多種分類。在Linux下常見的有ext2fs、ext3fs和ext4fs。Windows系統采用的是FAT文件系統。NTFS是常用于網絡存儲器的文件系統。每種文件系統都有自己的一套數據管理策略,自然也會各有優缺點。但無論是哪種文件系統,都至少應該有三方面的功能。
(1)通過名字和層級來組織文件,比如文件名和路徑。
(2)提供操作文件的接口,比如查找、新建、刪除、讀取和寫入文件。
(3)提供權限功能,比如文件保護和文件共享。
同一個外部存儲器可以劃分成一個或多個分區(Partition),每個分區可以用一種文件系統格式來管理。以樹莓派為例,在SD卡上燒錄Raspbian鏡像后,SD卡的存儲空間就會劃分成兩個分區。一個空間是啟動分區,采用了FAT32形式的文件系統,啟動分區主要用于開機啟動,空間較小。剩下的空間是主分區,采用了ext4fs形式的文件系統。
2.外部存儲器的掛載:
SD卡上的兩個分區采用了兩種文件系統。但最終在運行的Raspbian上,只會看到一個以根目錄/為起點的文件系統。也就是說,兩個物理分區以某種形式合并到了Linux的文件樹上。我們把這個過程稱為掛載(Mounting),即讓文件樹上的某個目錄和存儲器的物理分區對應起來。這個目錄稱為掛載點(Mounting Point)。從掛載點開始向下的子文件樹,實際上就對應了掛載的物理分區。
Linux系統的掛載信息都保存在文件/etc/fstab中。查看樹莓派中該文件的記錄:
可以看到,樹莓派SD卡的主分區掛載在根目錄/上,而啟動分區掛載在根目錄下的/boot上。這兩棵文件樹有重疊的從屬關系,以根目錄/為起點的文件樹,包括了以/boot為起點的文件樹。這種情況下,Linux以子文件樹優先,把啟動分區掛載在/boot上。主分區的掛載點是根目錄/,但不再包括/boot子文件樹。因此,/boot下的數據都會存放于啟動分區,其他的數據存放于主分區。
一個外部存儲器必須經過掛載,才能加入操作系統的文件樹。也只有加入文件樹后,應用程序才能通過文件系統來訪問外部存儲器中的數據。在樹莓派中插入一個U盤,用fdisk命令可以找到這個U盤。
它會自動掛載到/media下的一個目錄上,例如/media/MyUsbDrive。因此,我們往/media/MyUsbDrive存入的文件,實際上都會存入U盤。如果對系統自動分配的掛載點不滿意,那么可以卸載U盤,再掛載到一個自定義的掛載點。首先,卸載U盤,假如USB設備位于/dev/sda1,那么卸載U盤的命令就是:
然后,設置設備的默認掛載點,默認掛載點的配置文件在/etc/fstab上。使用nano工具來編輯這個文件:
這個文件里的每一行都是一個設備的掛載設置,例如下面這一行:
這里有6個參數,含義如下。
(1)設備名稱。一般是/dev/xxx。
(2)掛載點。對于USB設備默認是/media/xxx。
(3)文件系統格式。例如ext4。
(4)設備參數。例如defaults、noatime。
(5)一個不再使用的參數,通常設置為0。
(6)磁盤檢測設置。1為根文件系統,2為永久掛載磁盤,0為可插拔的移動設備。
掛載完成后,可以用df命令來查詢文件系統的掛載情況:
存儲器開始部分的塊會有一個總的分區表(Partition Table),記錄著存儲器的基本信息,比如塊(Block)的大小、存儲器的編號和可用空間。塊是存儲器的讀寫單元。即使一個文件小于一個塊,它還是會占據這個塊的完整空間。此外,分區表中還逐項記錄每個分區的信息,包括分區的起始位置和大小。隨后的存儲空間劃分成分區。不同的分區可以采用不同的文件系統。
3.ext文件系統:
根據文件系統類型的不同,分區有不同的存儲格式。先來看樹莓派ext4格式的主分區。ext4全稱是第四代拓展文件系統(Fourth ExtendedFile System)。從ext到ext4的文件系統,都是專門為Linux內核開發的。相對于第一代的ext來說,ext4增加了許多高級特征。但這四代操作系統的共同特色是圍繞inode來組織文件。筆者也將圍繞inode來展示ext系列的文件系統,并有意忽略一些高級特征。對于一個ext分區來說,內容可以分為如圖所示的幾個部分。裝有操作系統的ext分區的第一個塊是引導塊(Boot Block)。引導塊中有引導加載程序(Boot Loader),幫助計算機在開機時加載Linux內核。引導加載程序儲存有內核的相關信息,比如內核名稱和內核所在位置。但在樹莓派中,FAT32的啟動分區負責開機啟動。樹莓派的引導加載程序也在啟動分區。因此,樹莓派上的ext主分區并沒有引導塊。
每個ext分區會有一個超級塊(Super Block)。超級塊中記錄著文件組織的信息,包括文件系統的類型、inode的數目、塊的總數和空閑數量等。超級塊對于文件系統來說至關重要。如果超級塊損壞,則會導致整個分區的文件系統損壞。
超級塊后面跟著inode表和數據塊(Data Block)部分。一個inode表中有多個inode。所謂的inode,是描述文件存儲信息的數據結構。文件有一個對應的inode。每個inode有一個唯一的整數編號(InodeNumber)。在Linux下,可以使用命令來查詢文件的inode編號。
一個文件除了自身的數據之外,還會有附屬信息。附屬信息包括文件大小、擁有人、擁有組、修改日期等。這些附屬信息就存在inode中。因此,inode對于文件管理和文件安全都很重要。
除了這些附屬信息,inode還存有文件包含的所有數據塊的位置信息。這些位置信息被稱為指向數據塊的指針。在Linux系統中,一個大文件可以分成幾個數據塊存儲,就好像是分散在各地的龍珠。為了順利地集齊龍珠,我們需要地圖的指引。當Linux想要打開一個文件時,必須先找到文件對應的inode,然后根據inode這張地圖的指引將所有的數據塊收集起來,才能拼湊出一個完整的文件。在Linux中,我們通過解析路徑,根據沿途的目錄文件來找到某個文件。目錄文件的每個條目對應了一個子文件的文件名,以及該文件的inode編號。以/var/test.txt文件的存儲為例,假設其存儲結構如圖所示。當我們輸入代碼$cat/var/test.txt時,Linux將在根目錄文件中找到/var這個目錄文件的inode編號10747905,然后根據inode中指針指向的數據塊合成出/var目錄文件。隨后,Linux重復上述過程,根據/var中text.txt文件的inode編號10749034,找到text.txt的數據。
當寫入一個文件時,Linux會分配一個空白inode給該文件,將其inode編號記入該文件所屬的目錄,然后選取空白的數據塊,讓inode指針指向這些數據塊,并向內存中放入數據。
/var/test.txt相關文件存儲
4.FAT文件系統:
再來看FAT32格式的樹莓派啟動區。正如上面提到的,這個啟動區有一個引導塊,用于在開機時加載Linux內核。引導塊之后是文件分配表(FAT,File Allocation Table)。文件分配表的組織形式和inode不同,但起到了和inode類似的作用。
FAT32是FAT文件系統家族的一員。FAT文件系統其實就是以"文件分配表"的英文簡寫來命名的,由此可見文件分配表對于FAT文件系統的重要性。文件分配表按照順序對應了所有的數據塊。在文件分配表的一條記錄中,說明了同一個文件中下一個數據塊的位置。比如,文件分配表的第2條記錄中記錄了5,這就說明了2號數據塊的下一個數據塊是5號數據塊。當一個數據塊是文件的最后一個數據塊時,它就不再有下一個數據塊了。它在文件分配表中的記錄,也會填寫成固定的0xffff。只要知道了一個文件的起點數據塊位置,就能根據文件分配表找到該文件的所有數據塊。
此外,FAT文件系統還有一個區域專門記錄FAT根目錄信息。其他的子目錄則以文件的形式保持。目錄中的每條記錄對應了一個文件,除了文件名和文件屬性,還記錄了文件的起始數據塊的位置。從根目錄出發,我們可以通過記錄中起始數據塊的位置,配合文件分配表來組裝根目錄下的子目錄和文件。依此類推,我們可以找到整個FAT文件系統的文件。
由此可見,ext的組織形式著眼于文件,因此以inode為主要的中間層。而FAT的組織形式著眼于數據塊,所以以文件分配表為主要的中間層。FAT的文件分配表的記錄總數和數據塊總數相同,可能會很占空間。此外,FAT必須按照順序一個一個找數據塊,沒法像ext那樣從inode中獲得一張完整的地圖。因此,當文件在存儲器上比較零散時,FAT沒法像ext一樣優化讀寫路徑,但由于Windows系統的成功,FAT文件系統的應用依然非常廣泛。
總結
以上是生活随笔為你收集整理的树莓派开始,玩转Linux26:仓库大管家的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: INA282电流采集芯片
- 下一篇: Linux 查看并杀掉tomcat进程