本文詳解了Linux中的檔案系統,包括inode、軟連接,硬鏈接、動靜態庫,
目錄
一、理解檔案系統
二、inode
三、硬鏈接和軟連接
1.硬鏈接
2.軟連接
四、動態庫和靜態庫
1. 靜態庫與動態庫的概念
2.靜態庫
3.動態庫
4.使用外部庫
5.庫檔案名稱和引入庫的名稱
一、理解檔案系統
使用ls -l的時候看到的除了看到檔案名,還看到了檔案元資料,

每行包含7列,分別是:
- 模式
- 硬鏈接數
- 檔案所有者
- 組
- 大小
- 最后修改時間
- 檔案名
ls -l讀取存盤在磁盤上的檔案資訊,然后顯示出來

除了通過這種方式來讀取,還有一個stat命令能夠看到更多資訊,

下面對其中幾個資訊進行解釋,
二、inode
下圖為磁盤檔案系統圖(內核記憶體映像會有所不同),

磁盤是典型的塊設備,硬碟磁區被劃分為一個個的block,一個block的大小是由格式化的時候確定的,并且不可以更改,例如mke2fs的-b選項可以設定block大小為1024、2048或4096位元組,而上圖中啟動塊(Boot Block)的大小是確定的,
Block Group:ext2檔案系統會根據磁區的大小劃分為數個Block Group,而每個Block Group都有著相同的結構組成,
超級塊(Super Block):存放檔案系統本身的結構資訊,記錄的資訊主要有:bolck 和 inode的總量,未使用的block和inode的數量,一個block和inode的大小,最近一次掛載的時間,最近一次寫入資料的時間,最近一次檢驗磁盤的時間等其他檔案系統的相關資訊,Super Block的資訊被破壞,整個檔案系統結構就被破壞了,
GDT(Group Descriptor Table):塊組描述符,描述塊組屬性資訊,
塊位圖(Block Bitmap):Block Bitmap中記錄著Data Block中哪個資料塊已經被占用,哪個資料塊沒有被占用,
inode位圖(inode Bitmap):每個bit表示一個inode是否空閑可用,
inode節點表:存放檔案屬性,如:檔案大小,所有者,最近修改時間等.
資料區:存放檔案內容,
將屬性和資料分開存放實際上是如何作業的呢?我們通過touch一個新檔案來看看如何作業,


創建一個新檔案主要有一下4個操作:
1. 存盤屬性
內核先找到一個空閑的i節點(這里是1056022),內核把檔案資訊記錄到其中,
2. 存盤資料
該檔案需要存盤在三個磁盤塊,內核找到了三個空閑塊:300,500,800,將內核緩沖區的第一塊資料復制到300,下一塊復制到500,以此類推,
3. 記錄分配情況
檔案內容按順序300,500,800存放,內核在inode上的磁盤分布區記錄了上述塊串列,
4. 添加檔案名到目錄
新的檔案名test.c,linux內核將入口(1056022,test.c)添加到目錄檔案,檔案名和inode之間的對應關系將檔案名和檔案的內容及屬性連接起來,
它們是怎樣來連接的呢?
三、硬鏈接和軟連接
1.硬鏈接
真正找到磁盤上檔案的并不是檔案名,而是inode, 在linux中可以讓多個檔案名對應于同一個inode,
ln test.c def
ls -1i


我們可以看到,test.c和def的鏈接狀態完全相同,他們被稱為指向檔案的硬鏈接,內核記錄了這個連接數,inode 1056022 的硬連接數為2,
2.軟連接
硬鏈接是通過inode參考另外一個檔案,軟鏈接是通過名字參考另外一個檔案,
ln -s test.c def2
ls -1i


另外,這里的

Access 最后訪問時間
Modify 檔案內容最后修改時間
Change 屬性最后修改時間
四、動態庫和靜態庫
1. 靜態庫與動態庫的概念
靜態庫(.a):程式在編譯鏈接的時候把庫的代碼鏈接到可執行檔案中,程式運行的時候將不再需要靜態庫
動態庫(.so):程式在運行的時候才去鏈接動態庫的代碼,多個程式共享使用庫的代碼,
一個與動態庫鏈接的可執行檔案僅僅包含它用到的函式入口地址的一個表,而不是外部函式所在目標檔案的整個機器碼
在可執行檔案開始運行以前,外部函式的機器碼由作業系統從磁盤上的該動態庫中復制到記憶體中,這個程序稱為動態鏈接(dynamic linking)
動態庫可以在多個程式間共享,所以動態鏈接使得可執行檔案更小,節省了磁盤空間,作業系統采用虛擬記憶體機制允許物理記憶體中的一份動態庫被要用到該庫的所有行程共用,節省了記憶體和磁盤空間,
2.靜態庫
生成靜態庫:
ar -rc libmymath.a add.o sub.o
查看靜態庫中的目錄串列:
ar -tv libmymath.a
t:列出靜態庫中的檔案
v:verbose 詳細資訊
gcc main.c -L. -lmymath
-L 指定庫路徑
-l 指定庫名
庫搜索路徑:
從左到右搜索-L指定的目錄,
由環境變數指定的目錄:(LIBRARY_PATH)
由系統指定的目錄:/usr/lib/usr/local/lib
3.動態庫
生成動態庫:
shared: 表示生成共享庫格式
fPIC:產生位置無關碼(position independent code)
庫名規則:libxxx.so
gcc -fPIC -c sub.c add.c
gcc -shared -o libmymath.so*.o
ls add.c add.h add.o libmymath.so main.c sub.c sub.h sub.o
使用動態庫:
編譯選項
l:鏈接動態庫,只要庫名即可(去掉lib以及版本號)
L:鏈接庫所在的路徑.
gcc main.o -o main –L. -lhello
運行動態庫 :
1、拷貝.so檔案到系統共享庫路徑下, 一般指/usr/lib
2、更改LD_LIBRARY_PATH
export LD_LIBRARY_PATH=.
gcc main.c -lmymath
3、ldconfig 配置/etc/ld.so.conf.d/,ldconfig更新
cat /etc/ld.so.conf.d/bit.conf
ldconfig
4.使用外部庫
系統中其實有很多庫,它們通常由一組互相關聯的用來完成某項常見作業的函式構成,比如用來處理螢屏顯示情況的函式(ncurses庫)
gcc -Wall calc.c -o calc -lm
-lm表示要鏈接libm.so或者libm.a庫檔案
5.庫檔案名稱和引入庫的名稱
如:libc.so -> c庫,去掉前綴lib,去掉后綴.so,.a
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/340607.html
標籤:其他
上一篇:2021年中國高校大資料挑戰賽-智能運維中的例外檢測與趨勢預測-A題思路1028版
下一篇:TCP回顯程式中的小細節
