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