国产精品久久久aaaa,日日干夜夜操天天插,亚洲乱熟女香蕉一区二区三区少妇,99精品国产高清一区二区三区,国产成人精品一区二区色戒,久久久国产精品成人免费,亚洲精品毛片久久久久,99久久婷婷国产综合精品电影,国产一区二区三区任你鲁

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

Linux文件系統解析

Linux愛好者 ? 來源:搜狐網 ? 作者:搜狐網 ? 2020-09-16 11:29 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

Linux 中,最直觀、最可見的部分就是文件系統(file system)。下面我們就來一起探討一下關于 Linux 中國的文件系統,系統調用以及文件系統實現背后的原理和思想。這些思想中有一些來源于 MULTICS,現在已經被 Windows 等其他操作系統使用。Linux 的設計理念就是小的就是好的(Small is Beautiful)。雖然 Linux 只是使用了最簡單的機制和少量的系統調用,但是 Linux 卻提供了強大而優雅的文件系統。

Linux文件系統基本概念

Linux 在最初的設計是 MINIX1 文件系統,它只支持 14 字節的文件名,它的最大文件只支持到 64 MB。在 MINIX 1 之后的文件系統是 ext 文件系統。ext 系統相較于 MINIX 1 來說,在支持字節大小和文件大小上均有很大提升,但是 ext 的速度仍沒有 MINIX 1 快,于是,ext 2 被開發出來,它能夠支持長文件名和大文件,而且具有比 MINIX 1 更好的性能。這使他成為 Linux 的主要文件系統。只不過 Linux 會使用VFS曾支持多種文件系統。在 Linux 鏈接時,用戶可以動態的將不同的文件系統掛載倒 VFS 上。

Linux 中的文件是一個任意長度的字節序列,Linux 中的文件可以包含任意信息,比如 ASCII 碼、二進制文件和其他類型的文件是不加區分的。

為了方便起見,文件可以被組織在一個目錄中,目錄存儲成文件的形式在很大程度上可以作為文件處理。目錄可以有子目錄,這樣形成有層次的文件系統,Linux 系統下面的根目錄是/,它通常包含了多個子目錄。字符/還用于對目錄名進行區分,例如/usr/cxuan表示的就是根目錄下面的 usr 目錄,其中有一個叫做 cxuan 的子目錄。

下面我們介紹一下 Linux 系統根目錄下面的目錄名

/bin,它是重要的二進制應用程序,包含二進制文件,系統的所有用戶使用的命令都在這里

/boot,啟動包含引導加載程序的相關文件

/dev,包含設備文件,終端文件,USB 或者連接到系統的任何設備

/etc,配置文件,啟動腳本等,包含所有程序所需要的配置文件,也包含了啟動/停止單個應用程序的啟動和關閉 shell 腳本

/home,本地主要路徑,所有用戶用 home 目錄存儲個人信息

/lib,系統庫文件,包含支持位于 /bin 和 /sbin 下的二進制庫文件

/lost+found,在根目錄下提供一個遺失+查找系統,必須在 root 用戶下才能查看當前目錄下的內容

/media,掛載可移動介質

/mnt,掛載文件系統

/opt,提供一個可選的應用程序安裝目錄

/proc,特殊的動態目錄,用于維護系統信息和狀態,包括當前運行中進程信息

/root,root 用戶的主要目錄文件夾

/sbin,重要的二進制系統文件

/tmp, 系統和用戶創建的臨時文件,系統重啟時,這個目錄下的文件都會被刪除

/usr,包含絕大多數用戶都能訪問的應用程序和文件

/var,經常變化的文件,諸如日志文件或數據庫等

在 Linux 中,有兩種路徑,一種是絕對路徑(absolute path),絕對路徑告訴你從根目錄下查找文件,絕對路徑的缺點是太長而且不太方便。還有一種是相對路徑(relative path),相對路徑所在的目錄也叫做工作目錄(working directory)。

如果/usr/local/books是工作目錄,那么 shell 命令

cpbooksbooks-replica

就表示的是相對路徑,而

cp/usr/local/books/books/usr/local/books/books-replica

則表示的是絕對路徑。

在 Linux 中經常出現一個用戶使用另一個用戶的文件或者使用文件樹結構中的文件。兩個用戶共享同一個文件,這個文件位于某個用戶的目錄結構中,另一個用戶需要使用這個文件時,必須通過絕對路徑才能引用到他。如果絕對路徑很長,那么每次輸入起來會變的非常麻煩,所以 Linux 提供了一種鏈接(link)機制。

舉個例子,下面是一個使用鏈接之前的圖

以上所示,比如有兩個工作賬戶 jianshe 和 cxuan,jianshe 想要使用 cxuan 賬戶下的 A 目錄,那么它可能會輸入/usr/cxuan/A,這是一種未使用鏈接之后的圖。

使用鏈接后的示意如下

現在,jianshe 可以創建一個鏈接來使用 cxuan 下面的目錄了。‘

當一個目錄被創建出來后,有兩個目錄項也同時被創建出來,它們就是.和..,前者代表工作目錄自身,后者代表該目錄的父目錄,也就是該目錄所在的目錄。這樣一來,在 /usr/jianshe 中訪問 cxuan 中的目錄就是../cxuan/xxx

Linux 文件系統不區分磁盤的,這是什么意思呢?一般來說,一個磁盤中的文件系統相互之間保持獨立,如果一個文件系統目錄想要訪問另一個磁盤中的文件系統,在 Windows 中你可以像下面這樣。

兩個文件系統分別在不同的磁盤中,彼此保持獨立。

而在 Linux 中,是支持掛載的,它允許一個磁盤掛在到另外一個磁盤上,那么上面的關系會變成下面這樣

掛在之后,兩個文件系統就不再需要關心文件系統在哪個磁盤上了,兩個文件系統彼此可見。

Linux 文件系統的另外一個特性是支持加鎖(locking)。在一些應用中會出現兩個或者更多的進程同時使用同一個文件的情況,這樣很可能會導致競爭條件(race condition)。一種解決方法是對其進行加不同粒度的鎖,就是為了防止某一個進程只修改某一行記錄從而導致整個文件都不能使用的情況。

POSIX 提供了一種靈活的、不同粒度級別的鎖機制,允許一個進程使用一個不可分割的操作對一個字節或者整個文件進行加鎖。加鎖機制要求嘗試加鎖的進程指定其要加鎖的文件,開始位置以及要加鎖的字節

Linux 系統提供了兩種鎖:共享鎖和互斥鎖。如果文件的一部分已經加上了共享鎖,那么再加排他鎖是不會成功的;如果文件系統的一部分已經被加了互斥鎖,那么在互斥鎖解除之前的任何加鎖都不會成功。為了成功加鎖、請求加鎖的部分的所有字節都必須是可用的。

在加鎖階段,進程需要設計好加鎖失敗后的情況,也就是判斷加鎖失敗后是否選擇阻塞,如果選擇阻塞式,那么當已經加鎖的進程中的鎖被刪除時,這個進程會解除阻塞并替換鎖。如果進程選擇非阻塞式的,那么就不會替換這個鎖,會立刻從系統調用中返回,標記狀態碼表示是否加鎖成功,然后進程會選擇下一個時間再次嘗試。

加鎖區域是可以重疊的。下面我們演示了三種不同條件的加鎖區域。

如上圖所示,A 的共享鎖在第四字節到第八字節進行加鎖

如上圖所示,進程在 A 和 B 上同時加了共享鎖,其中 6 - 8 字節是重疊鎖

如上圖所示,進程 A 和 B 和 C 同時加了共享鎖,那么第六字節和第七字節是共享鎖。

如果此時一個進程嘗試在第 6 個字節處加鎖,此時會設置失敗并阻塞,由于該區域被 A B C 同時加鎖,那么只有等到 A B C 都釋放鎖后,進程才能加鎖成功。

Linux 文件系統調用

許多系統調用都會和文件與文件系統有關。我們首先先看一下對單個文件的系統調用,然后再來看一下對整個目錄和文件的系統調用。

為了創建一個新的文件,會使用到creat方法,注意沒有e。

這里說一個小插曲,曾經有人問 UNIX 創始人 Ken Thompson,如果有機會重新寫 UNIX ,你會怎么辦,他回答自己要把 creat 改成 create ,哈哈哈哈。

這個系統調用的兩個參數是文件名和保護模式

fd=creat("aaa",mode);

這段命令會創建一個名為 aaa 的文件,并根據 mode 設置文件的保護位。這些位決定了哪個用戶可能訪問文件、如何訪問。

creat 系統調用不僅僅創建了一個名為 aaa 的文件,還會打開這個文件。為了允許后續的系統調用訪問這個文件,這個 creat 系統調用會返回一個非負整數, 這個就叫做文件描述符(file descriptor),也就是上面的 fd。

如果在已經存在的文件上調用了 creat 系統調用,那么該文件中的內容會被清除,從 0 開始。通過設置合適的參數,open系統調用也能夠創建文件。

下面讓我們看一看主要的系統調用,如下表所示

為了對一個文件進行讀寫的前提是先需要打開文件,必須使用 creat 或者 open 打開,參數是打開文件的方式,是只讀、可讀寫還是只寫。open 系統調用也會返回文件描述符。打開文件后,需要使用close系統調用進行關閉。close 和 open 返回的 fd 總是未被使用的最小數量。

什么是文件描述符?文件描述符就是一個數字,這個數字標示了計算機操作系統中打開的文件。它描述了數據資源,以及訪問資源的方式。

當程序要求打開一個文件時,內核會進行如下操作

授予訪問權限

在全局文件表(global file table)中創建一個條目(entry)

向軟件提供條目的位置

文件描述符由唯一的非負整數組成,系統上每個打開的文件至少存在一個文件描述符。文件描述符最初在 Unix 中使用,并且被包括 Linux,macOS 和 BSD 在內的現代操作系統所使用。

當一個進程成功訪問一個打開的文件時,內核會返回一個文件描述符,這個文件描述符指向全局文件表的 entry 項。這個文件表項包含文件的 inode 信息,字節位移,訪問限制等。例如下圖所示

默認情況下,前三個文件描述符為STDIN(標準輸入)、STDOUT(標準輸出)、STDERR(標準錯誤)。

標準輸入的文件描述符是 0 ,在終端中,默認為用戶的鍵盤輸入

標準輸出的文件描述符是 1 ,在終端中,默認為用戶的屏幕

與錯誤有關的默認數據流是 2,在終端中,默認為用戶的屏幕。

在簡單聊了一下文件描述符后,我們繼續回到文件系統調用的探討。

在文件系統調用中,開銷最大的就是 read 和 write 了。read 和 write 都有三個參數

文件描述符:告訴需要對哪一個打開文件進行讀取和寫入

緩沖區地址:告訴數據需要從哪里讀取和寫入哪里

統計:告訴需要傳輸多少字節

這就是所有的參數了,這個設計非常簡單輕巧。

雖然幾乎所有程序都按順序讀取和寫入文件,但是某些程序需要能夠隨機訪問文件的任何部分。與每個文件相關聯的是一個指針,該指針指示文件中的當前位置。順序讀取(或寫入)時,它通常指向要讀取(寫入)的下一個字節。如果指針在讀取 1024 個字節之前位于 4096 的位置,則它將在成功讀取系統調用后自動移至 5120 的位置。

Lseek系統調用會更改指針位置的值,以便后續對 read 或 write 的調用可以在文件中的任何位置開始,甚至可以超出文件末尾。

lseek = Lseek ,段首大寫。

lseek 避免叫做 seek 的原因就是 seek 已經在之前 16 位的計算機上用于搜素功能了。

Lseek有三個參數:第一個是文件的文件描述符,第二個是文件的位置;第三個告訴文件位置是相對于文件的開頭,當前位置還是文件的結尾

lseek(intfildes,off_toffset,intwhence);

lseek 的返回值是更改文件指針后文件中的絕對位置。lseek 是唯一從來不會造成真正磁盤查找的系統調用,它只是更新當前的文件位置,這個文件位置就是內存中的數字。

對于每個文件,Linux 都會跟蹤文件模式(常規,目錄,特殊文件),大小,最后修改時間以及其他信息。程序能夠通過stat系統調用看到這些信息。第一個參數就是文件名,第二個是指向要放置請求信息結構的指針。這些結構的屬性如下圖所示。

fstat調用和stat相同,只有一點區別,fstat 可以對打開文件進行操作,而 stat 只能對路徑進行操作。

pipe文件系統調用被用來創建 shell 管道。它會創建一系列的偽文件,來緩沖和管道組件之間的數據,并且返回讀取或者寫入緩沖區的文件描述符。在管道中,像是如下操作

sort

sort 進程將會輸出到文件描述符1,也就是標準輸出,寫入管道中,而 head 進程將從管道中讀入。在這種方式中,sort 只是從文件描述符 0 中讀取并寫入到文件描述符 1 (管道)中,甚至不知道它們已經被重定向了。如果沒有重定向的話,sort 會自動的從鍵盤讀入并輸出到屏幕中。

最后一個系統調用是fcntl,它用來鎖定和解鎖文件,應用共享鎖和互斥鎖,或者是執行一些文件相關的其他操作。

現在我們來關心一下和整體目錄和文件系統相關的系統調用,而不是把精力放在單個的文件上,下面列出了這些系統調用,我們一起來看一下。

可以使用 mkdir 和 rmdir 創建和刪除目錄。但是需要注意,只有目錄為空時才可以刪除。

創建一個指向已有文件的鏈接時會創建一個目錄項(directory entry)。系統調用 link 來創建鏈接,oldpath 代表已有的路徑,newpath 代表需要鏈接的路徑,使用unlink可以刪除目錄項。當文件的最后一個鏈接被刪除時,這個文件會被自動刪除。

使用chdir系統調用可以改變工作目錄。

最后四個系統調用是用于讀取目錄的。和普通文件類似,他們可以被打開、關閉和讀取。每次調用readdir都會以固定的格式返回一個目錄項。用戶不能對目錄執行寫操作,但是可以使用 creat 或者 link 在文件夾中創建一個目錄,或使用 unlink 刪除一個目錄。用戶不能在目錄中查找某個特定文件,但是可以使用rewindir作用于一個打開的目錄,使他能在此從頭開始讀取。

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • Linux
    +關注

    關注

    88

    文章

    11758

    瀏覽量

    219009
  • 文件系統
    +關注

    關注

    0

    文章

    302

    瀏覽量

    20975

原文標題:文件系統:隱匿在 Linux 背后的機制

文章出處:【微信號:LinuxHub,微信公眾號:Linux愛好者】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    明晚8點|睿擎文件系統實戰:從開發到發布全流程解析

    文件操作到鏡像發布,一次直播掌握完整開發流程!在嵌入式系統開發中,文件系統是數據存儲、配置管理和資源訪問的核心基礎。然而在實際開發中,文件操作效率低下、鏡像打包流程復雜、
    的頭像 發表于 11-11 11:53 ?637次閱讀
    明晚8點|睿擎<b class='flag-5'>文件系統</b>實戰:從開發到發布全流程<b class='flag-5'>解析</b>

    【直播預告】下周三晚8點|睿擎文件系統實戰:從開發到發布全流程解析

    文件操作到鏡像發布,一次直播掌握完整開發流程!在嵌入式系統開發中,文件系統是數據存儲、配置管理和資源訪問的核心基礎。然而在實際開發中,文件操作效率低下、鏡像打包流程復雜、
    的頭像 發表于 11-06 18:05 ?1902次閱讀
    【直播預告】下周三晚8點|睿擎<b class='flag-5'>文件系統</b>實戰:從開發到發布全流程<b class='flag-5'>解析</b>

    睿擎派文件系統指南:從開發到發布全流程實踐 | 技術解析

    在嵌入式系統開發中,文件系統扮演著至關重要的角色,它負責數據的持久化存儲、配置文件管理和資源訪問等核心功能。睿擎平臺提供了一套完整的文件系統解決方案,從開發階段的API調用到調試階段的
    的頭像 發表于 11-05 18:13 ?8093次閱讀
    睿擎派<b class='flag-5'>文件系統</b>指南:從開發到發布全流程實踐 | 技術<b class='flag-5'>解析</b>

    如何在 nuc980 上切換到持久文件系統

    我遵循了“NUC980 Linux 4.4 BSP 用戶手冊EN.pdf”文檔,但當我嘗試取消選擇“初始 RAM 文件系統和 RAM 磁盤 (initramfs/initrd) 支持
    發表于 08-29 07:58

    Linux三大主流文件系統解析

    還在為選擇哪個文件系統而糾結?作為一名摸爬滾打多年的運維老鳥,我將用最接地氣的方式,帶你徹底搞懂 Linux 三大主流文件系統的奧秘。
    的頭像 發表于 08-05 17:37 ?1440次閱讀

    Linux系統目錄結構全面剖析

    Linux文件系統采用層次化的目錄結構,這種設計遵循了Unix哲學中的"一切皆文件"原則。理解Linux目錄層次架構對于系統管理員、運維工程
    的頭像 發表于 07-21 17:33 ?776次閱讀

    飛凌嵌入式ElfBoard ELF 1板卡-文件系統之應用開機自啟

    在busybox構建文件系統章節我們已經大概了解,文件系統啟動后執行的第一個用戶進程是init進程,init進程會解析etc/inittab文件,執行inittab中的各個子進程,打開
    發表于 06-26 13:40

    飛凌嵌入式ElfBoard ELF 1板卡-文件系統簡介

    9.1 文件系統概念文件系統通常提供目錄或文件夾用于記錄文件,在很多系統中目錄本身也是文件,在這
    發表于 06-19 17:22

    服務器數據恢復—重裝系統導致XFS文件系統分區丟失的數據恢復案例

    服務器數據恢復環境&故障: 一臺服務器上通過磁盤柜+RAID卡組建的riad5磁盤陣列,服務器上層安裝Linux操作系統,搭建XFS文件系統。服務器上層分配一個LUN,并劃分了兩個分區
    的頭像 發表于 06-12 11:20 ?798次閱讀
    服務器數據恢復—重裝<b class='flag-5'>系統</b>導致XFS<b class='flag-5'>文件系統</b>分區丟失的數據恢復案例

    服務器數據恢復—ocfs2文件系統被格式化為Ext4文件系統的數據恢復案例

    服務器存儲數據恢復環境&故障: 人為誤操作將Ext4文件系統誤裝入一臺服務器存儲上的Ocfs2文件系統數據卷上,導致原Ocfs2文件系統被格式化為Ext4文件系統
    的頭像 發表于 06-10 12:03 ?726次閱讀
    服務器數據恢復—ocfs2<b class='flag-5'>文件系統</b>被格式化為Ext4<b class='flag-5'>文件系統</b>的數據恢復案例

    Linux文件系統打包及鏡像制作,觸覺智能RK3562開發板演示

    本文介紹Linux開發板文件系統打包及鏡像制作的方法,演示Linux文件系統打包及鏡像制作,適用于想將配置好的系統環境打包成鏡像批量燒錄。觸
    的頭像 發表于 04-28 16:45 ?999次閱讀
    <b class='flag-5'>Linux</b><b class='flag-5'>文件系統</b>打包及鏡像制作,觸覺智能RK3562開發板演示

    支持48位尋址!華為開源文件系統EROFS跨入大模型訓練

    的要求。 ? 最近,開源文件系統EROFS在即將到來的Linux 6.15內核周期中進行擴展,以處理更大規模的存儲系統。此次改進旨在使EROFS更適配AI訓練場景及其他大規模數據歸檔需求。 ? 在
    發表于 03-27 01:22 ?1106次閱讀

    從零開始馴服Linux(一):ZYNQ-Linux啟動文件構建全解析

    給大家提供了出廠時使用的根文件系統,在開發板資料盤(A盤)\4_SourceCode\3_Embedded_Linux\資源文件\出廠鏡像相關目錄下有一個名為rootfs.tar.gz的壓縮包
    發表于 03-20 16:48

    如何正確選擇嵌入式文件系統

    Linux嵌入式系統中,文件系統和緩存機制常導致數據存儲穩定性問題。本文通過案例分析原因,對比不同文件系統特性,為開發者提供優化建議,助力提升數據穩定性和
    的頭像 發表于 03-17 11:35 ?1102次閱讀
    如何正確選擇嵌入式<b class='flag-5'>文件系統</b>?

    在stm32cubeprogrammer上燒錄時,取消勾選根文件系統,燒錄后發現sd卡上根文件系統的分區沒有了,為什么?

    在修改了linux內核后,我想只把bootfs燒錄到sd卡上,而不擦除根文件系統的分區。 我在stm32cubeprogrammer上燒錄時,取消勾選根文件系統,燒錄后發現sd卡上根文件系統
    發表于 03-07 06:38