1.了解磁盤的物理結(jié)構(gòu)
磁盤計算機上唯一的一個機械設(shè)備,同時它還是外設(shè)
機械磁盤很便宜,雖然效率會慢一些,所以企業(yè)一般使用機械磁盤,因為便宜
磁盤不僅僅外設(shè),還是一個機械設(shè)備(盤片、磁頭),所以磁盤一定非常慢


盤片:一片兩面,有一摞盤片

磁頭:一面一個磁頭
一個磁頭負責一面的讀取

馬達比如說剃須刀,或者手機的震動等
所以盤片就可以 以順時針的方式高速旋轉(zhuǎn)
同時在磁頭位置也存在一個馬達,控制磁頭左右來回擺動
磁頭是共進退的,要不一塊過去,要不就一塊不去
磁盤盤片上有無數(shù)個基本單元,每一個基本單元按照特定的空間排布好的,每一個單元就是磁鐵
南極表示1,北極表示0,
向磁盤寫入:把北極改成南極 (N->S)對內(nèi)容做磁化
刪除磁盤數(shù)據(jù):把數(shù)據(jù)從南極設(shè)置為北極 (S->N)
這樣就可以完成微觀上 一個比特位的讀和寫
磁頭本質(zhì)上 是對數(shù)據(jù)做寫入和讀取,更改基本元素的南北極,讀取南北極
磁盤的具體物理存儲結(jié)構(gòu)

整體結(jié)構(gòu)

抽象的一面結(jié)構(gòu)

磁盤中存儲的基本單元是扇區(qū),一般扇區(qū)的大小為512字節(jié)或者4KB字節(jié)
一般磁盤所有的扇區(qū)都是512字節(jié)大小
同半徑的所有的扇區(qū)即為磁道
在一面上,如何在硬件上定位一個扇區(qū)?
1.先定位在哪一個磁道—由半徑?jīng)Q定

2.再確定在該磁道,在哪一個扇區(qū),根據(jù)扇區(qū)的編號,來定位一個扇區(qū)
所以首先要定位哪一個面

磁頭是共進退的,半徑相同的每一個面上的磁道共同在抽象上就會形成一個柱面
只需要確定用哪一個磁頭讀取,磁頭的編號就表示哪一個面
所以定位任意一個扇區(qū),需要確定 磁頭head 、柱面 cylinder、扇區(qū) sector 即CHS定位法
普通文件中包含屬性和數(shù)據(jù),都可以看做數(shù)據(jù)(0,1),占用一個或者多個扇區(qū),來進行自己的數(shù)據(jù)存儲
既然能用CHS定位為任意一個扇區(qū),就能定位任意多個扇區(qū),從而將文件從硬件角度進行讀取或者寫入
2.邏輯抽象
OS內(nèi)部是不是直接使用CHS地址?不是
第一點:因為OS是軟件,磁盤是硬件,硬件定位一個地址,用的是CHS,但是如果OS直接用了這個地址,萬一硬件改變,OS也要發(fā)生變化,所以O(shè)S要和硬件做好解耦工作
第二點:即便是扇區(qū)512字節(jié),單位IO的基本數(shù)據(jù)量也是很小的,所以硬件是按照512字節(jié)處理,
操作系統(tǒng)實際進行IO,基本單位是4KB
操作系統(tǒng)和磁盤進行交互時,基本以4KB為單位,
基本大小:進行磁盤讀取和磁盤寫入時,必須以基本單位為基本大小,來與外設(shè)進行交互
哪怕只修改一個比特位,也要把一個比特位所在的4KB全部讀到內(nèi)存,
把一個比特位改完,再把4KB內(nèi)容全部寫到目標文件中,要以塊的方式整體與外設(shè)進行交互
所以一般把磁盤稱為 塊設(shè)備
所以OS需要有一套新的地址,來進行塊級別的訪問

把盤面抽象成一種線性結(jié)構(gòu)
以一個盤面舉例
相同磁道的東西一定放在一起的
整體可以看作是數(shù)組,設(shè)置數(shù)組名為 sector_disk1
初步完成了從物理邏輯到線性邏輯抽象的過程
因為看作是一個數(shù)組,而數(shù)組都是有下標的
假設(shè)數(shù)組下標為n,定位一個扇區(qū),只需要數(shù)組下標就可以定位一個扇區(qū)了

OS是以4KB為單位進行IO的,一個操作系統(tǒng)對應(yīng)的文件塊要包括8個扇區(qū)
計算機常規(guī)訪問方式:采用起始地址+偏移量的方式
只需要知道數(shù)據(jù)塊起始位置的地址,即第一個扇區(qū)的下標地址 + 4KB(塊的類型)
可以把數(shù)據(jù)塊看作一種類型
所以塊的地址本質(zhì)就是數(shù)組的一個下標N
N的地址在OS中被叫做LBA,即邏輯塊地址
磁盤只認CHS,LBA如何跟磁盤地址互相轉(zhuǎn)化?
假設(shè)LBA地址為6500 ,單片大小為5000
首先確定在那一面,也就相當于在哪一個磁頭上
H(磁頭): int n=6500/5000=1 說明H的地址在第2面上
C(柱面):6500/1000=6 1000為磁道的大小,對應(yīng)的H就在6號磁道上
S(扇區(qū)): 6500 %1000=500
所求扇區(qū) 就在 2號面中的6號磁道的第500個扇區(qū)
連續(xù)讀取8個扇區(qū),就能得到塊
3.文件系統(tǒng)

為了方便管理,就把數(shù)組拆分為一個個的區(qū)域
若感覺管理500GB太難了,就減少管理,從而管理150GB,將管理小的經(jīng)驗復(fù)制,從而使每一個小的都管理好
從而使500GB整體管理好 ,這種思想就叫做分區(qū)

雖然分完區(qū)小了很多,但依舊很大,所以操作系統(tǒng)對整個分區(qū)還會在做分組
假設(shè)每個區(qū)為150GB,就把15GB為一組,把其中一個組管理好了,按照一個組的管理方式就把所有組管理好了
由于每個區(qū)都可以分組,就有了 Block group

一個分區(qū)當中最開始有一個Boot Block
會保存與操作系統(tǒng)啟動相關(guān)的內(nèi)容,如分區(qū)表和操作系統(tǒng)鏡像地址
一個組的結(jié)構(gòu)
一個組中分為 Super Block(超級塊) 、Group Descriptor Table(組描述符)、Block Bitmap、inode Bitmap(位圖)、inode Table (inode表)、Data blocks(數(shù)據(jù)塊)
Super Block 保存的是文件系統(tǒng)的所有屬性信息 如文件系統(tǒng)的類型、整個分組的情況
Super Block在各個分組里面可能都會存在,而且是統(tǒng)一更新的
為了防止Super Block區(qū)域壞掉,如果出現(xiàn)故障,整個分區(qū)不可以被使用,所以要做好備份
Group Descriptor Table
GDT:組描述符 – 改組內(nèi)的詳細統(tǒng)計等屬性信息,用來描述整個
一般而言,一個文件內(nèi)部所有屬性的集合,被稱為inode節(jié)點 ,大小一般為128字節(jié)
一個文件,一個inode,一個分區(qū)內(nèi)部也會存在大量的文件即會存在大量的inode節(jié)點,一個group,需要有一個區(qū)域?qū)iT保存該group的所有文件的inode節(jié)點 即 inode table -----inode表
文件的內(nèi)容是變化的,用數(shù)據(jù)塊對文件內(nèi)容保存的,所以一個有效文件要保存內(nèi)容就需要1/n數(shù)據(jù)塊
若有多個文件就需要更多的數(shù)據(jù)塊,數(shù)據(jù)塊稱為 Data blocks
linux查找一個文件,是要根據(jù)inode編號,來進行文件查找到,包括讀取內(nèi)容
一個inode對應(yīng)一個文件,而該文件inode屬性和該文件的數(shù)據(jù)塊是由映射關(guān)系的
inode Bitmap
共有4096*8個比特位,按照從低向高掃描位圖時,比特位的位置對應(yīng)inode表中的inode
為1表示inode正常工作,為0表示inode不正常工作
每一個比特位表示 一個inode是否空閑可用
Block Bitmap
每一個bit位表示data block是否空閑可用
細節(jié)問題
1.inode與文件名
Linux系統(tǒng)只認inode編號,文件的inode屬性中,并不存在文件名
文件名是給用戶用的
2.目錄是文件么?
是的,目錄有inode和內(nèi)容
3.任何一個文件,一定在目錄內(nèi)部,所以目錄的內(nèi)容是什么?
目錄要有內(nèi)容就需要數(shù)據(jù)塊,目錄的數(shù)據(jù)塊里面保存的是該目錄下 文件名和inode編號對應(yīng)的映射關(guān)系
在目錄內(nèi),文件名和inode編號互為key值
4.當我們訪問一個文件的時候,是在特定目錄下訪問的 cat log.txt
1.先要在當前目錄下,找到log.txt 的 inode編號
2.一個目錄也是一個文件,也一定屬于 一個分區(qū),在該分區(qū)中找到分組,在該分組中對應(yīng)的inode table中,找到文件的inode
3. 通過inode與 對應(yīng)的data block的映射關(guān)系,找到該文件的數(shù)據(jù)塊 ,并加載到OS,并完成到顯示器
4.軟硬鏈接
1. 制作軟硬鏈接,對比差別
創(chuàng)建文件myfile.tx,并向文件中一直追加 hello world
[yzq@VM-8-8-centos lesson1]$ touch myfile.txt
[yzq@VM-8-8-centos lesson1]$ echo "hello world" >> myfile.txt
[yzq@VM-8-8-centos lesson1]$ echo "hello world" >> myfile.txt
[yzq@VM-8-8-centos lesson1]$ echo "hello world" >> myfile.txt
[yzq@VM-8-8-centos lesson1]$ echo "hello world" >> myfile.txt
[yzq@VM-8-8-centos lesson1]$ ls -li
total 4
1311370 -rw-rw-r-- 1 yzq yzq 48 Apr 2 22:25 myfile.txt
查詢當前myfile.txt文件的 inode編號為1311370
建立軟鏈接
建立軟鏈接 ln -s
[yzq@VM-8-8-centos lesson1]$ ln -s myfile.txt my-soft
[yzq@VM-8-8-centos lesson1]$ ll
total 4
-rw-rw-r-- 1 yzq yzq 48 Apr 2 22:25 myfile.txt
lrwxrwxrwx 1 yzq yzq 10 Apr 2 22:30 my-soft -> myfile.txt
對myfile.txt文件進行軟鏈接,并命名為my-soft
當前文件鏈接數(shù)為1,并以l開頭說明
[yzq@VM-8-8-centos lesson1]$ ls -li
total 4
1311370 -rw-rw-r-- 1 yzq yzq 48 Apr 2 22:25 myfile.txt
1311371 lrwxrwxrwx 1 yzq yzq 10 Apr 2 22:30 my-soft -> myfile.txt
輸入 ls - i, 發(fā)現(xiàn)兩者的inode編號不同
說明軟鏈接是一個獨立的鏈接文件,有自己的inode編號,必有自己的inode屬性和內(nèi)容
軟鏈接內(nèi)部放的是自己所指向的文件的路徑
可以認為保存的是一個字符串,保存的是當前myfile文件的路徑
建立硬鏈接
建立硬鏈接 ln
[yzq@VM-8-8-centos lesson1]$ ln myfile.txt my-hard
[yzq@VM-8-8-centos lesson1]$ ll
total 8
-rw-rw-r-- 2 yzq yzq 48 Apr 2 22:25 myfile.txt
-rw-rw-r-- 2 yzq yzq 48 Apr 2 22: my-hard
lrwxrwxrwx 1 yzq yzq 10 Apr 2 22:30 my-soft -> myfile.txt
對myfile.txt文件進行硬鏈接,并命名為my-hard
發(fā)現(xiàn) myfile.txt文件的鏈接數(shù)變?yōu)?
[yzq@VM-8-8-centos lesson1]$ ls -li
total 8
1311370 -rw-rw-r-- 2 yzq yzq 48 Apr 2 22:25 myfile.txt
1311370 -rw-rw-r-- 2 yzq yzq 48 Apr 2 22:25 my-hard
輸入 ls-li 后,發(fā)現(xiàn)硬鏈接my-hard和myfile.txt文件的inode編號相同
硬鏈接和目標文件公用同一個inode編號,意味著一定是和目標文件使用同一個inode
硬鏈接沒有獨立的inode
硬鏈接建立了新的文件名和老的inode的映射關(guān)系
若此時將myfile.txt文件刪除,就會發(fā)現(xiàn)my-hard依舊可以運行 ,并為之前myfile.txt文件的內(nèi)容
[yzq@VM-8-8-centos lesson1]$ rm myfile.txt
[yzq@VM-8-8-centos lesson1]$ ll
total 4
-rw-rw-r-- 1 yzq yzq 48 Apr 2 22:25 my-hard
[yzq@VM-8-8-centos lesson1]$ cat my-hard
hello world
hello world
hello world
hello world
硬鏈接中的引用計數(shù)

ref count默認為1 ,若有新的指向過來,執(zhí)行++ 變?yōu)?
ref count稱為 硬鏈接數(shù) 本質(zhì)是一種引用計數(shù)
代表有多少個文件名指向我,默認情況下有一個文件名和inode映射關(guān)系就為1,若再建立一個文件名和inode的映射關(guān)系就增加為2,若刪除一個文件,則ref count-- ,直到計數(shù)為0對應(yīng)的文件才真的會刪掉
2.提出軟硬鏈接的應(yīng)用場景
軟鏈接的使用

若可執(zhí)行程序在多級目錄中,正常來說想要調(diào)用多級目錄只能一層一層就寫

通過使用軟鏈接,將需要調(diào)用的可執(zhí)行程序命名為mytest

此時直接調(diào)用mytest 即可達到調(diào)用多級目錄下的可執(zhí)行程序的目的
硬鏈接的使用
創(chuàng)建多個文件 ,硬鏈接數(shù)都為1
創(chuàng)建一個目錄 dir ,硬鏈接數(shù)為2
- 普通文件是硬鏈接數(shù)為1,因為只有一組文件名和inode的映射關(guān)系
- 目錄的硬鏈接數(shù)為2,說明被其他文件名對應(yīng)的inode的映射關(guān)系指向了
一個目錄也是一個文件,所以dir目錄算一個
進入目錄dir中,. 作為隱藏文件 inode編號與目錄dir相同,所以硬鏈接數(shù)為2

. 與 dir 目錄的inode編號相同

… 與上一級目錄的inode編號相同
在dir目錄下再次創(chuàng)建一個子目錄d1

d1中的. 的inode編號與d1目錄相同
d1中…與上一級目錄dir的inode編號相同

dir目錄的硬鏈接數(shù)變?yōu)?3 ,
除了dir目錄本身與目錄中的 . 以外 ,在子目錄d1下的 … inode編號也與dir目錄相同
不能給目錄建立硬鏈接

當給目錄dir建立硬鏈接時,發(fā)現(xiàn)并不能成功
若給目錄建立硬鏈接,容易造成環(huán)路路徑問題

若在lesson1目錄找一個文件,依次向下到達dir-link ,而dir-link又相當于是lesson1,所以又會重新在lesson1目錄找文件
5. 解釋文件的三個時間
Access 最后訪問時間
Modify 文件內(nèi)容最后修改時間
Change 屬性最后修改時間
change代表對一個文件的屬性做修改
chmod+x 對myfile.txt文件的屬性做修改,此時change的時間更新成為最新了
modify 代表對文件的內(nèi)容做修改
使用重定向 往myfile.txt文件中追加內(nèi)容 ,此時modify的時間更新為最新了,而一般改內(nèi)容 屬性也會跟著變化
Access 文件的訪問時間文章來源:http://www.zghlxwxcb.cn/news/detail-407551.html
使用vim通過進入文件中,但不修改 ,而再次使用stat時,Access的時間更新為最新了文章來源地址http://www.zghlxwxcb.cn/news/detail-407551.html
到了這里,關(guān)于【Linux】基礎(chǔ)IO——文件系統(tǒng)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!