日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > linux >内容正文

linux

文件名为空linux,文件系统:隐匿在Linux背后的机制

發(fā)布時(shí)間:2024/7/23 linux 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 文件名为空linux,文件系统:隐匿在Linux背后的机制 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

原標(biāo)題:文件系統(tǒng):隱匿在Linux背后的機(jī)制

在 Linux 中,最直觀、最可見的部分就是 文件系統(tǒng)(file system) 。下面我們就來一起探討一下關(guān)于 Linux 中國(guó)的文件系統(tǒng),系統(tǒng)調(diào)用以及文件系統(tǒng)實(shí)現(xiàn)背后的原理和思想。這些思想中有一些來源于 MULTICS,現(xiàn)在已經(jīng)被 Windows 等其他操作系統(tǒng)使用。Linux 的設(shè)計(jì)理念就是 小的就是好的(Small is Beautiful) 。雖然 Linux 只是使用了最簡(jiǎn)單的機(jī)制和少量的系統(tǒng)調(diào)用,但是 Linux 卻提供了強(qiáng)大而優(yōu)雅的文件系統(tǒng)。

Linux 文件系統(tǒng)基本概念

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

Linux 中的文件是一個(gè)任意長(zhǎng)度的字節(jié)序列,Linux 中的文件可以包含任意信息,比如 ASCII 碼、二進(jìn)制文件和其他類型的文件是不加區(qū)分的。

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

下面我們介紹一下 Linux 系統(tǒng)根目錄下面的目錄名

/bin ,它是重要的二進(jìn)制應(yīng)用程序,包含二進(jìn)制文件,系統(tǒng)的所有用戶使用的命令都在這里

/boot ,啟動(dòng)包含引導(dǎo)加載程序的相關(guān)文件

/dev ,包含設(shè)備文件,終端文件,USB 或者連接到系統(tǒng)的任何設(shè)備

/etc ,配置文件,啟動(dòng)腳本等,包含所有程序所需要的配置文件,也包含了啟動(dòng)/停止單個(gè)應(yīng)用程序的啟動(dòng)和關(guān)閉 shell 腳本

/home ,本地主要路徑,所有用戶用 home 目錄存儲(chǔ)個(gè)人信息

/lib ,系統(tǒng)庫文件,包含支持位于 /bin 和 /sbin 下的二進(jìn)制庫文件

/lost+found ,在根目錄下提供一個(gè)遺失+查找系統(tǒng),必須在 root 用戶下才能查看當(dāng)前目錄下的內(nèi)容

/media ,掛載可移動(dòng)介質(zhì)

/mnt ,掛載文件系統(tǒng)

/opt ,提供一個(gè)可選的應(yīng)用程序安裝目錄

/proc ,特殊的動(dòng)態(tài)目錄,用于維護(hù)系統(tǒng)信息和狀態(tài),包括當(dāng)前運(yùn)行中進(jìn)程信息

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

/sbin ,重要的二進(jìn)制系統(tǒng)文件

/tmp , 系統(tǒng)和用戶創(chuàng)建的臨時(shí)文件,系統(tǒng)重啟時(shí),這個(gè)目錄下的文件都會(huì)被刪除

/usr ,包含絕大多數(shù)用戶都能訪問的應(yīng)用程序和文件

/var ,經(jīng)常變化的文件,諸如日志文件或數(shù)據(jù)庫等

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

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

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

則表示的是絕對(duì)路徑。

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

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

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

使用鏈接后的示意如下

現(xiàn)在,jianshe 可以創(chuàng)建一個(gè)鏈接來使用 cxuan 下面的目錄了。‘

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

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

兩個(gè)文件系統(tǒng)分別在不同的磁盤中,彼此保持獨(dú)立。

而在 Linux 中,是支持 掛載 的,它允許一個(gè)磁盤掛在到另外一個(gè)磁盤上,那么上面的關(guān)系會(huì)變成下面這樣

掛在之后,兩個(gè)文件系統(tǒng)就不再需要關(guān)心文件系統(tǒng)在哪個(gè)磁盤上了,兩個(gè)文件系統(tǒng)彼此可見。

Linux 文件系統(tǒng)的另外一個(gè)特性是支持 加鎖(locking) 。在一些應(yīng)用中會(huì)出現(xiàn)兩個(gè)或者更多的進(jìn)程同時(shí)使用同一個(gè)文件的情況,這樣很可能會(huì)導(dǎo)致 競(jìng)爭(zhēng)條件(race condition) 。一種解決方法是對(duì)其進(jìn)行加不同粒度的鎖,就是為了防止某一個(gè)進(jìn)程只修改某一行記錄從而導(dǎo)致整個(gè)文件都不能使用的情況。

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

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

在加鎖階段,進(jìn)程需要設(shè)計(jì)好加鎖失敗后的情況,也就是判斷加鎖失敗后是否選擇阻塞,如果選擇阻塞式,那么當(dāng)已經(jīng)加鎖的進(jìn)程中的鎖被刪除時(shí),這個(gè)進(jìn)程會(huì)解除阻塞并替換鎖。如果進(jìn)程選擇非阻塞式的,那么就不會(huì)替換這個(gè)鎖,會(huì)立刻從系統(tǒng)調(diào)用中返回,標(biāo)記狀態(tài)碼表示是否加鎖成功,然后進(jìn)程會(huì)選擇下一個(gè)時(shí)間再次嘗試。

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

如上圖所示,A 的共享鎖在第四字節(jié)到第八字節(jié)進(jìn)行加鎖

如上圖所示,進(jìn)程在 A 和 B 上同時(shí)加了共享鎖,其中 6 - 8 字節(jié)是重疊鎖

如上圖所示,進(jìn)程 A 和 B 和 C 同時(shí)加了共享鎖,那么第六字節(jié)和第七字節(jié)是共享鎖。

如果此時(shí)一個(gè)進(jìn)程嘗試在第 6 個(gè)字節(jié)處加鎖,此時(shí)會(huì)設(shè)置失敗并阻塞,由于該區(qū)域被 A B C 同時(shí)加鎖,那么只有等到 A B C 都釋放鎖后,進(jìn)程才能加鎖成功。

Linux 文件系統(tǒng)調(diào)用

許多系統(tǒng)調(diào)用都會(huì)和文件與文件系統(tǒng)有關(guān)。我們首先先看一下對(duì)單個(gè)文件的系統(tǒng)調(diào)用,然后再來看一下對(duì)整個(gè)目錄和文件的系統(tǒng)調(diào)用。

為了創(chuàng)建一個(gè)新的文件,會(huì)使用到 creat 方法,注意沒有 e 。

這里說一個(gè)小插曲,曾經(jīng)有人問 UNIX 創(chuàng)始人 Ken Thompson,如果有機(jī)會(huì)重新寫 UNIX ,你會(huì)怎么辦,他回答自己要把 creat 改成 create ,哈哈哈哈。

這個(gè)系統(tǒng)調(diào)用的兩個(gè)參數(shù)是文件名和保護(hù)模式

lseek( intfildes, off_toffset, intwhence);

lseek 的返回值是更改文件指針后文件中的絕對(duì)位置。lseek 是唯一從來不會(huì)造成真正磁盤查找的系統(tǒng)調(diào)用,它只是更新當(dāng)前的文件位置,這個(gè)文件位置就是內(nèi)存中的數(shù)字。

對(duì)于每個(gè)文件,Linux 都會(huì)跟蹤文件模式(常規(guī),目錄,特殊文件),大小,最后修改時(shí)間以及其他信息。程序能夠通過 stat 系統(tǒng)調(diào)用看到這些信息。第一個(gè)參數(shù)就是文件名,第二個(gè)是指向要放置請(qǐng)求信息結(jié)構(gòu)的指針。這些結(jié)構(gòu)的屬性如下圖所示。

fstat 調(diào)用和 stat 相同,只有一點(diǎn)區(qū)別,fstat 可以對(duì)打開文件進(jìn)行操作,而 stat 只能對(duì)路徑進(jìn)行操作。

pipe 文件系統(tǒng)調(diào)用被用來創(chuàng)建 shell 管道。它會(huì)創(chuàng)建一系列的 偽文件 ,來緩沖和管道組件之間的數(shù)據(jù),并且返回讀取或者寫入緩沖區(qū)的文件描述符。在管道中,像是如下操作

sort

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

最后一個(gè)系統(tǒng)調(diào)用是 fcntl ,它用來鎖定和解鎖文件,應(yīng)用共享鎖和互斥鎖,或者是執(zhí)行一些文件相關(guān)的其他操作。

現(xiàn)在我們來關(guān)心一下和整體目錄和文件系統(tǒng)相關(guān)的系統(tǒng)調(diào)用,而不是把精力放在單個(gè)的文件上,下面列出了這些系統(tǒng)調(diào)用,我們一起來看一下。

系統(tǒng)調(diào)用

描述

s = mkdir(path,mode)

創(chuàng)建一個(gè)新的目錄

s = rmdir(path)

移除一個(gè)目錄

s = link(oldpath,newpath)

創(chuàng)建指向已有文件的鏈接

s = unlink(path)

取消文件的鏈接

s = chdir(path)

改變工作目錄

dir = opendir(path)

打開一個(gè)目錄讀取

s = closedir(dir)

關(guān)閉一個(gè)目錄

dirent = readdir(dir)

讀取一個(gè)目錄項(xiàng)

rewinddir(dir)

回轉(zhuǎn)目錄使其在此使用

可以使用 mkdir 和 rmdir 創(chuàng)建和刪除目錄。但是需要注意,只有目錄為空時(shí)才可以刪除。

創(chuàng)建一個(gè)指向已有文件的鏈接時(shí)會(huì)創(chuàng)建一個(gè) 目錄項(xiàng)(directory entry) 。系統(tǒng)調(diào)用 link 來創(chuàng)建鏈接,oldpath 代表已有的路徑,newpath 代表需要鏈接的路徑,使用 unlink 可以刪除目錄項(xiàng)。當(dāng)文件的最后一個(gè)鏈接被刪除時(shí),這個(gè)文件會(huì)被自動(dòng)刪除。

使用 chdir 系統(tǒng)調(diào)用可以改變工作目錄。

最后四個(gè)系統(tǒng)調(diào)用是用于讀取目錄的。和普通文件類似,他們可以被打開、關(guān)閉和讀取。每次調(diào)用 readdir 都會(huì)以固定的格式返回一個(gè)目錄項(xiàng)。用戶不能對(duì)目錄執(zhí)行寫操作,但是可以使用 creat 或者 link 在文件夾中創(chuàng)建一個(gè)目錄,或使用 unlink 刪除一個(gè)目錄。用戶不能在目錄中查找某個(gè)特定文件,但是可以使用 rewindir 作用于一個(gè)打開的目錄,使他能在此從頭開始讀取。

責(zé)任編輯:

總結(jié)

以上是生活随笔為你收集整理的文件名为空linux,文件系统:隐匿在Linux背后的机制的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。