1. 程式人生 > >linux檔案系統及磁碟格式化

linux檔案系統及磁碟格式化

千萬注意:分割槽格式化磁碟前確保你磁碟的資料備份好了,要不可能就沒了。

1、傻瓜式磁碟分割槽,最直接的方式(先fdisk後parted)。不用瞭解檔案系統的原理。此處將對兩種分割槽機制磁碟進行分割槽格式化(MBR型別磁碟——用fdisk###GPT型別磁碟——用parted)。fdisk不支援大於2T的分割槽定址(後邊再詳細介紹原理,這裡為保持簡單不涉及)。

1> fdisk -l   #檢視當前系統上所有儲存裝置(包括掛在和沒掛載的)  注:如果沒有管理員許可權是看不見磁碟的,因為fdisk預設讀的/proc/partitions檔案。無許可權無法讀取

Disk /dev/vda: 214.7 GB, 214748364800 bytes   #磁碟一共214.7G
255 heads, 63 sectors/track, 26108 cylinders   #共255個磁頭,每個磁軌63個扇區,共26108個柱面。
Units = cylinders of 16065 * 512 = 8225280 bytes #每個柱面8225280個位元組。計算公式:255*63*512=8225280  (每個柱面255個磁軌,每個磁軌63個扇區。所以扇區總數16065/柱面。所以每個柱面也就8M多。這個是後邊分區劃分的單元)
Sector size (logical/physical): 512 bytes / 512 bytes  #邏輯扇區和物理扇區都是512個自位元組
I/O size (minimum/optimal): 512 bytes / 512 bytes  #此引數不知道設麼意思,知道的大神補充
Disk identifier: 0x00078f9c #這裡是磁碟id

   Device Boot      Start         End      Blocks   Id  System
/dev/vda1   *           1       26109   209713152   83  Linux           #該磁碟上有分割槽vda1,*號表示核心在此分割槽上,Start=1代表次分割槽大小是從1柱面開始的 End=26109表示次分割槽到26109柱面結束。Block=209713156表示次分割槽共209713156個塊大小(每塊1k預設大小,所以你可以看出總共多少空間),Id=83代表此分割槽檔案系統編號是83即Linux(分割槽型別可以在分割槽的時候指定,這樣可以使我們在用工具進行格式化分割槽的時候優化檔案系統。)

附加:cat  /proc/partitions  檢視作業系統識別的磁碟和分割槽,包括掛在和沒掛載的。fdisk -l命令讀取的也是這個檔案,只不過顯示內容更詳細。

2>知道了自己系統上磁碟的情況後就可以開始著手分割槽了。

直接上例子:fdisk使用語法如下

fdisk /dev/硬碟名字  //分割槽sda硬碟

p //列印已有分割槽

如果輸入錯誤,按著ctrl + delete才能刪除

n //建立新分割槽

e // 選擇的是擴充套件分割槽 p //指的是主分割槽(注意分配的柱面是否全用完,避免浪費,磁碟上只能由最多3主分割槽和1擴充套件分割槽,或者最多4個主分割槽),之後你就可以在擴充套件分割槽上建立邏輯分割槽了(邏輯分割槽個數一般沒什麼限制幾百個都沒問題)

w //儲存退出,這樣你的分割槽資訊即可生效,如果不儲存則不生效(相當於取消操作什麼都沒做)

m //幫助資訊

 fdisk /dev/sdb =>鍵入m獲取幫助資訊。=>鍵入n建立新分割槽(e擴充套件分割槽,p主分割槽,l邏輯分割槽--主分割槽擴充套件分割槽邏輯分割槽分不清的請自行google,注意主分割槽和擴充套件分割槽個數和不能大於4。這是MBR分割槽機制的限制。)=>指定大小(用多少柱面或者多少 K、M、G)=>p檢視下分割槽結果=>w儲存分割槽結果

如果分割槽有問題:fdisk /dev/sdb=>鍵入p檢視之前的分割槽=>鍵入d刪除分割槽

如果還有沒有用完的分割槽:fdisk /dev/sdb=>按照之前的步驟進行分割槽即可。但是注意主分割槽和擴充套件分割槽的數量必須<=4,如果要的分割槽多餘4個的話請使用邏輯分割槽。

如果分割槽型別有問題:fdisk /dev/sdb =>p列印下當前分割槽,檢視各個分割槽的分割槽型別=>鍵入t修改分割槽型別(鍵入L可列舉分割槽型別)=>鍵入分割槽型別16進位制id即可改變分割槽型別

如果分完區後新分割槽沒有顯示:則有可能是作業系統還沒有識別新分割槽。之行下邊兩個命令即可

cat /proc/partitions //檢視當前系統上核心已經識別的分割槽,分割槽完後核心可能沒有識別的,需要重新讀取分割槽資訊。沒有你之前分的分割槽的話之行下邊命令重新讀取磁碟的分割槽資訊 

partprobe   /dev/sda //重新讀取磁碟。/dev/sda磁碟的分割槽資訊

附加知識點:cat  /proc/filesystems //檢視當前作業系統支援那些檔案系統。瞭解即可,多說一句對於NTFS檔案系統(windows下的檔案系統型別)linux預設是不支援的,如果要支援的話可以安裝第三方的工具--在這部分為了簡化操作不涉及ntfs檔案系統在linux下的使用,後邊會詳細介紹

3>磁碟分割槽完畢後就可以考慮進行格式化了

工具及使用語法

mkfs語法:mkfs -t   檔案系統型別    分割槽名字

例: mkfs -t ext3 /dev/sdb1    ##  檔案系統的型別常用的值ext2、ext3、ext4

mke2fs語法:mke2fs [option]    分割槽名字

例:mke2fs -j /dev/sda5  ##sda5格式化成ext3檔案系統-j格式化成ext3檔案系統

 option選項主要有:

     -j:建立ext3型別檔案系統

     -b:指定塊大小,預設4096:可用取值1024、2048、4096

     -L:指定卷標

     -m:指定預留給超級使用者的百分比

     -i:用於指定多少位元組空間建立一個inode,預設8192,這裡給出的數值應該為塊大小的2^n倍

     -N:指定inode數,用的不多

     -F:強制建立檔案系統

     -E:使用者指定額外檔案系統屬性

附加資訊命令輸出詳解及其他有用說明:此處只是加深對檔案系統的進一步認識。不是必須檢視的

mkfs -t ext3 /dev/sdb1

mke2fs 1.41.12 (17-May-2010)
Filesystem label=             #當前分割槽的碟符
OS type: Linux              #作業系統型別
Block size=4096 (log=2)          #組成檔案系統的最小單元,塊大小
Fragment size=4096 (log=2)       
Stride=0 blocks, Stripe width=0 blocks   
251472 inodes, 1004054 blocks       #當前檔案系統(這個分割槽)共有251472inode(inode是用於儲存檔案的元資料資訊,後邊詳細說明),共有1004054個數據塊
50202 blocks (5.00%) reserved for the super user #為root使用者保留50202個數據塊,保障root使用者能對當前磁碟進行操作。預設是總容量的5%,此數值可調且很有必要調。
First data block=0
Maximum filesystem blocks=1031798784
31 block groups         #塊組個數共31個(這個是檔案系統的結構資訊,後邊會有詳細介紹)
32768 blocks per group, 32768 fragments per group #每個塊組有32768個數據塊
8112 inodes per group    #每個塊組有8112個innode,後邊會有檔案系統的結構詳細解釋,看完就明白了
Superblock backups stored on blocks:
    32768, 98304, 163840, 229376, 294912, 819200, 884736   #超級塊被存貯在那些塊上(超級塊會按照一定的演算法儲存在不同的塊組的塊中,主要用來保證檔案系統的安全,儲存分割槽的很多資訊,後邊會詳細介紹。著急的話自行google)

Writing inode tables: done           #向檔案系統裡邊寫inode                
Creating journal (16384 blocks): done      #ext3是日誌型作業系統,對檔案錯誤的查詢速度更快。此處建立日誌
Writing superblocks and filesystem accounting information: done 

This filesystem will be automatically checked every 33 mounts or   #此檔案系統將會在33次後或者180天后被自動檢查,一般應該加以控制,防止在一些關鍵業務上由於檔案系統的檢查使得效能下降甚至出現問題
180 days, whichever comes first.  Use tune2fs -c or -i to override.  #可以使用tune2fs來覆蓋預設檢查機制

2、格式化分割槽時可以進行必要的定製,使檔案系統更加合理。

mke2fs語法:mke2fs [option]    分割槽名字

例:mke2fs -j /dev/sda5  ##sda5格式化成ext3檔案系統-j格式化成ext3檔案系統

 option選項主要有:

     -j:建立ext3型別檔案系統

     -b:指定塊大小,預設4096:可用取值1024、2048、4096

     -L:指定卷標

     -m:指定預留給超級使用者的百分比

     -i:用於指定多少位元組空間建立一個inode,預設8192,這裡給出的數值應該為塊大小的2^n倍

     -N:指定inode數,用的不多

     -F:強制建立檔案系統

     -E:使用者指定額外檔案系統屬性

例項:   

mke2fs -b 2048 /dev/sda5 //指定塊大小,預設4096。如果檔案系統中儲存小檔案(幾k的檔案或者多少位元組的檔案)比較多,調小塊大小可以減少塊的浪費。

mke2fs -L MYDATA /dev/sda5  //指定卷標,到時候可用卷標來操作這個分割槽。如果使用分割槽名可能下次開機分割槽名會亂掉。所以用卷標比較穩定

mke2fs -m 3 /dev/sda5 //改變為超級使用者預留的磁碟空間。(避免浪費太多起始1G就夠用了)

mke2fs -i 4096 /dev/sda5 //指定每4k建立一個inodeinode增多意味著可以儲存更多的小檔案。因為如果按照預設的8k建立一個inode。當儲存過多的小檔案時可能會將inode用完。一般來說不用改了8k也不差。

3、此步不是必須的,可直接跳到下部分掛載檔案系統。這一步主要對格式化好的檔案系統進行一定的調整和設定方便後續操作。

blkid /dev/sdb1   #顯示分割槽的相關屬性。主要的屬性UUID,磁碟掛載時使用的資訊,很常用。
/dev/sdb1: UUID="1dbf4d39-a179-4559-9c60-2f38c782a532" SEC_TYPE="ext2" TYPE="ext3" 

e2label /dev/sdb1 MY_DATE1   #設定分割槽碟符
[[email protected] Desktop]# e2label /dev/sdb1 #檢視分割槽碟符,當然blkid也能看見。碟符也經常用來進行自動掛載。
MY_DATE1

tune2fs  命令語法:tune2fs  [option]   檔案系統名字(分割槽)   這個命令可以在檔案系統掛載這的時候使用,沒什麼影響。

    [option]主要有:

    -j:不損壞原有資料,將ext2升級為ext3

例:tune2fs -j /dev/sda5 //調整分割槽sda5的檔案系統型別為ext3,無損修改,裡邊有檔案也沒有問題。

    -L:設定或修改卷標

例:tune2fs -L MY_DATA1 /dev/sdb1  //修改卷標

    -m:調整預留百分比

例:tune2fs -m 3 /dev/sdb1 //修改為管理員預留的空間大小,預設5%

    -r:指定預留塊數

例: tune2fs -r30122  /dev/sdb1

    -o:設定預設掛載選項

             acl  ,一般在/etc/fstab裡邊指定。

例    tune2fs -o acl /dev/sdb1 //使用acl控制列表。開啟這個功能才可以對檔案的許可權設定使用facl功能。

 使用acl的功能例項:

                       setfacl語法:setfacl [option]   USER_ATTR

                        [option]:

                           -m:設定

                                          u:UID:perm

                                          g:GID:perm

                           -x:取消許可權

                                          u:UID

                                          g:GID

                       getfacl語法:getfacl filename

                        例:getfacl ./test.sh    //檢視檔案許可權資訊

                               setfacl  -m u:hadoop:rw ./test.sh  //設定額外使用者hadoop對此檔案有讀寫許可權,檢視命令使用getfacl filename

                               setfacl  -m g:hadoop:rw ./test.sh  //設定二外組hadoop組對此檔案有讀寫許可權,檢視命令使用getfacl filename

                               setfacl -x u:hadoop ./test.sh //取消hadoop使用者對此檔案的許可權,檢視命令使用getfacl filename

                               setfacl  -x g:hadoop ./test.sh //取消hadoop組對此檔案的許可權,檢視命令使用getfacl filename

    -c:指定掛載次數到達多少之後進行自檢,0或-1表示關閉此功能。與下邊的-i一塊用的情況多點

例:tune2fs -c -1 /dev/sdb1

    -i:每掛載使用多少天后進行自檢,0或者-1表示關閉此功能

例: tune2fs -i -1 /dev/sdb1

    -l:顯示超級快資訊

例:tune2fs -l /dev/sdb1  //詳細資訊可參考,看出此檔案系統超級塊中的資訊。可用於檢視上述設定是否生效。看來挺好用。

 tune2fs -l  /dev/sdb1
tune2fs 1.41.12 (17-May-2010)
Filesystem volume name:   MY_DATA1
Last mounted on:          <not available>
Filesystem UUID:          1dbf4d39-a179-4559-9c60-2f38c782a532
Filesystem magic number:  0xEF53
Filesystem revision #:    1 (dynamic)
Filesystem features:      has_journal ext_attr resize_inode dir_index filetype needs_recovery sparse_super large_file
Filesystem flags:         signed_directory_hash
Default mount options:    acl
Filesystem state:         clean
Errors behavior:          Continue
Filesystem OS type:       Linux
Inode count:              251472
Block count:              1004054
Reserved block count:     30123
Free blocks:              969892
Free inodes:              251461
First block:              0
Block size:               4096
Fragment size:            4096
Reserved GDT blocks:      245
Blocks per group:         32768
Fragments per group:      32768
Inodes per group:         8112
Inode blocks per group:   507
Filesystem created:       Mon Feb 13 13:52:52 2017
Last mount time:          Mon Feb 13 15:34:47 2017
Last write time:          Mon Feb 13 16:01:45 2017
Mount count:              1
Maximum mount count:      -1
Last checked:             Mon Feb 13 13:52:52 2017
Check interval:           4294880896 (1656 months, 4 weeks, 1 day, 6:28:16)
Next check after:         Sun Feb 12 13:52:52 2017
Reserved blocks uid:      0 (user root)
Reserved blocks gid:      0 (group root)
First inode:              11
Inode size:              256
Required extra isize:     28
Desired extra isize:      28
Journal inode:            8
Default directory hash:   half_md4
Directory Hash Seed:      7d15a978-21af-4819-a32a-0c839055a9ca
Journal backup:           inode blocks

附加命令:

dumpe2fs  /dev/sda5 //顯示超級快資訊 ,  dumpe2fs -h /dev/sda5 //只顯示超級快資訊 

檢查並修復檔案系統的命令:fsck(用於檢查並修復linux檔案系統)和e2fsck(專門用於修復ext型別的檔案系統)。注意檢查前請備份好資料並解除安裝檔案系統

fsck -t ext3 /dev/sdb1 //檢查檔案系統

fsck -p /dev/sdb1 //修復檔案系統

e2fsck /dev/sda5 //檢查分割槽

e2fsck -f -p /dev/sda5 //強制檢查,如果有錯誤自動修復。

4、檔案系統的掛載解除安裝 ,前面把檔案系統格式化好後接下來就可以考慮掛載檔案系統了。這裡介紹mount使用。

1>掛載

mount  裝置  掛載點

例:mount  /dev/sdb1 /mnt

            裝置:裝置檔案(/dev/sdb1),測試的時候用下 ;卷標(LABEL“”“);UUID(UUID="")

            掛載點:目錄 。     要求:此目錄不能被其他程序使用;目錄必須存在;目錄中原有檔案會被臨時隱藏

mount  //不跟任何引數,顯示當前掛載的檔案系統和掛載點。比較亂不如df -l清楚

mount [option]  [-o option]  DEVICE MOUNT_POINT

[option]

      -a:表示只掛載/etc/fstab中的檔案系統

      -n:預設情況mount每掛載一個檔案系統就會將掛載得裝置資訊儲存到/etc/mtab檔案中

      -t: FS_TYPE:指定正在掛載裝置上的檔案系統型別,不適用此選項時mount會呼叫blkid命令獲取對應檔案系統型別。一般掛載ntfs檔案系統是時會使用此選項。

                     -r:只讀掛載檔案系統

                     -w:“讀寫”掛載檔案系統

                    -o :指定掛載的額外選項

                          remount:重新掛載當前檔案系統

                           ro:只讀掛載

                           rw:讀寫掛

例:

mount -r /dev/sda5 /media/ //只讀掛載

mount -o ro /dev/sda5 /media/ //只讀掛載

mount -o remount,ro /dev/sda5 //重新掛載並啟用新的功能。多個功能用逗號隔開

mount -o loop /root/*.iso  /media  //掛載iso檔案,就可以直接訪問裡邊的檔案了,loop將一個檔案當成分割槽掛載。


2>解除安裝

umount  裝置/掛載點    //注意解除安裝檔案系統的時候,此檔案系統沒有程序在使用。

例:umount /dev/sdb1

如果檔案系統解除安裝不了,顯示“busy”:

fuser -v /mnt/目錄名   //檢視誰或者那個程序正在訪問這個檔案系統(分割槽)

fuser  -km /mnt/目錄名    //將使用檔案系統的使用者或程序,踢出去或kill掉。之後再次umount即可


5、額外

1>對於swap(交換分割槽的格式化):

mkswap  /dev/sdb2  //建立交換分割槽。儘量不要使用交換分割槽,太慢了。

              -L LABEL

swapon  /dev/sdb2  //開啟交換分割槽/dev/sdb2的使用

swapoff /dev/sdb2   //關閉交換分割槽/dev/sdb2的使用

2>檢視交換分割槽是否生效

 free -m
             total       used       free     shared    buffers     cached
Mem:          1862        579       1283          0         32        204    #總共2G不到,使用了579M,空餘1283M ,共享儲存0M,緩衝32M,快取204M
-/+ buffers/cache:        342       1520                                          #+-緩衝和快取後的使用量342M,空閒1520M
Swap:         3999          0       3999                                             #交換分割槽4G,空餘4G


6、parted命令進行分割槽格式化。直接引用別人的好了

操作例項:
(parted)表示在parted中輸入的命令,其他為自動列印的資訊   

1、首先類似fdisk一樣,先選擇要分割槽的硬碟,此處為/dev/hdd:
[[email protected] ~]# parted /dev/hdd
GNU Parted 1.8.1
Using /dev/hdd
Welcome to GNU Parted! Type 'help' to view a list of commands.
2、選擇了/dev/hdd作為我們操作的磁碟,接下來需要建立一個分割槽表(在parted中可以使用help命令列印幫助資訊):
(parted) mklabel
Warning: The existing disk label on /dev/hdd will be destroyed and all data on this disk will be lost. Do you want to continue?
Yes/No?(警告使用者磁碟上的資料將會被銷燬,詢問是否繼續,我們這裡是新的磁碟,輸入yes後回車) yes
New disk label type? [msdos]? (預設為msdos形式的分割槽,我們要正確分割槽大於2TB的磁碟,應該使用gpt方式的分割槽表,輸入gpt後回車)gpt
3、建立好分割槽表以後,接下來就可以進行分割槽操作了,執行mkpart命令,分別輸入分割槽名稱,檔案系統和分割槽 的起止位置
(parted) mkpart
Partition name? []? dp1
File system type? [ext2]? ext3
Start? 0
End? 500GB
4、分好區後可以使用print命令列印分割槽資訊,下面是一個print的樣例
(parted) print
Model: VBOX HARDDISK (ide)
Disk /dev/hdd: 2199GB
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Number Start End Size File system Name Flags
1 17.4kB 500GB 500GB dp1
5、如果分割槽錯了,可以使用rm命令刪除分割槽,比如我們要刪除上面的分割槽,然後列印刪除後的結果
(parted)rm 1
 #rm後面使用分割槽的號碼
(parted) print
Model: VBOX HARDDISK (ide)
Disk /dev/hdd: 2199GB
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Number Start End Size File system Name Flags
6、按照上面的方法把整個硬碟都分好區,下面是一個分完後的樣例
(parted) mkpart
Partition name? []? dp1
File system type? [ext2]? ext3
Start? 0
End? 500GB
(parted) mkpart
Partition name? []? dp2
File system type? [ext2]? ext3
Start? 500GB
End? 2199GB
(parted) print
Model: VBOX HARDDISK (ide)
Disk /dev/hdd: 2199GB
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Number Start End Size File system Name Flags
1 17.4kB 500GB 500GB dp1
2 500GB 2199GB 1699GB dp2
7、由於parted內建的mkfs還不夠完善,所以完成以後我們可以使用quit命令退出parted並使用 系統的mkfs命令對分割槽進行格式化了,此時如果使用fdisk -l命令列印分割槽表會出現警告資訊,這是正常的
[[email protected] ~]# fdisk -l    #列出的資訊不太對,用cat /proc/partitions檢視下是否已經有相應的分去了,有的話直接進行格式化。並掛在。記得加上-T largefile 這樣可以是格式化的時候很快。
WARNING: GPT (GUID Partition Table) detected on '/dev/hdd'! The util fdisk doesn't support GPT. Use GNU Parted.

Disk /dev/hdd: 2199.0 GB, 2199022206976 bytes
255 heads, 63 sectors/track, 267349 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Device Boot Start End Blocks Id System
/dev/hdd1 1 267350 2147482623+ ee EFI GPT

[[email protected] ~]# mkfs.ext3 -T largefile  /dev/hdd1
[[email protected] ~]# mkfs.ext3  -T largefile /dev/hdd2
[[email protected] ~]# mkdir /dp1 /dp2
[[email protected] ~]# mount /dev/hdd1 /dp1
[[email protected] ~]# mount /dev/hdd2 /dp2

7、檔案系統的內部結構詳解,有興趣的可以看下。加深對檔案系統的認識。首先先解決幾個問題

1>gpt和mbr分割槽機制的不同(為什麼用兩個工具進行分割槽--fdisk和parted)。直接引用大神的圖文說明。通過閱讀可以知道為什麼mbr分割槽機制不支援大於2T的分割槽。這就是gpt分割槽機制的產生原因。

MBR

MBR即主引導記錄(Master Boot Record),位置在磁碟的第一個邏輯扇區,即LBA0的位置。一個邏輯扇區僅有512B(位元組),分給MBR分割槽表的只有64B,由4個16B大小的分割槽,這也是硬碟主分割槽數目不能超過4個的原因,MBR分割槽表最大可定址的儲存空間只有2TB(2^32 * 512)。標準MBR結構如下:


由上圖可以看出,MBR主要由三部分組成,主載入程式、硬碟分割槽表(DPT)、分割槽有效標誌。主載入程式佔據446位元組,分割槽表佔據64位元組,由4個大小為16位元組的主分割槽組成,還有分割槽有效標誌佔據2位元組。接下來談談有關這三個部分的作用:

  • 主載入程式(boot loader):主要負責從活動分割槽中裝載並執行引導系統程式
  • 分割槽表(DPT,Disk Partition Table):將大表的資料分成稱為分割槽的許多小的子集。如果磁碟丟失了分割槽表,資料就無法按順序讀取和寫入,導致無法操作
  • 分割槽有效標誌(magic number):有的地方也稱為結束標誌字,固定值為0xAA55或者0x55AA,取決於處理器型別,如果是小端模式處理器(如Intel系列),則該值為0xAA55,如果是大端模式處理器(如Motorola6800),則該值為0x55AA。如果該標誌錯誤,系統就不能啟動

傳統的BIOS比較低階,它不能像作業系統一樣識別檔案系統,所有磁碟必須要有一個固定的物理塊作為引導塊(Boot Block),這個引導塊就是MBR。也就是說MBR是用來引導記憶體載入並執行作業系統核心的。

GPT

GPT即全域性唯一標識分割槽表(GUID Partition Table)是一個實體磁碟的分割槽表的結構佈局的標準。它是可擴充套件介面(EFI)標準的一部分。由於MBR分割槽表最大可定址的儲存空間只有2TB這個侷限性。CPT就誕生了,CGPT分類64bits給邏輯塊地址,這就意味著定址儲存空間達到8ZB。GPT支援最多128個主分割槽。CPT結構圖如下:


如圖可以看出:GPT分為以下幾個部分:

  • 保護性MBR: 處於位置LBA0,是在CPT分割槽表的開頭,為了相容性而存在的傳統的MBR。一般情況下是沒有引導程式碼,僅僅有一個被標識為未知的分割槽,當支援GPT分割槽表的作業系統檢索到這個MBR後會自動忽略並跳到LBA1讀取CGT分割槽表。
  • GPT頭:定義了硬碟的可控制元件和組成分割槽表的項的大小和數量,還記錄了這塊硬碟的GUID,記錄了分割槽表頭本身的位置和大小以及備份分割槽表頭和分割槽表的位置和大小。
  • 分割槽表:用於儲存分割槽的資訊。如(分割槽型別GUID,起始LBA,末尾LBA等)
  • 分割槽:是物理磁碟的一部分,作用如同一個物理分隔單元。其基本資訊存在分割槽表中。
  • 分割槽表備份對分割槽表進行備份
  • GPT頭備份對GPT頭進行備份。處於硬碟最後面

2>以ext2檔案系統為例理解檔案系統的內部結構。

檔案系統:我們經常看見的磁碟分割槽或者我們經常用的U盤就是一個檔案系統。他們都是被格式化後的。 所有要用的儲存裝置都必須經過格式化之後才能儲存資料。

檔案系統的儲存佈局(可以說格式化後的磁碟內部結構)



上圖就是檔案系統的結構,檔案系統中最小的儲存單位是塊(Block),格式化時預設大小1024位元組(有很多是4096位元組),當然可以指定其它值。圖中最前面的是Boot Block啟動塊(儲存磁碟分割槽資訊和啟動資訊),之後是Super Block超級塊(儲存分割槽的檔案系統資訊,例如塊大小,檔案系統版本號,上次MOUNT時間等,超級塊在若干塊組前都有一份拷貝),快組描述符表(儲存塊組描述符,有多少塊組就有多少塊組描述符,主要儲存從哪裡開始是INODE表,從哪裡是資料塊開始,有多少空閒inode和資料塊,塊組描述符表也在各個塊組中都有拷貝),之後是塊點陣圖Block Bitmap,(描述塊組中那些塊空閒,那些已經被用了。它的大小是一個塊,它的每個位都表示一個塊是否被用,1表示已經用了)。

 一個分割槽分成多少塊組,假設分割槽大小s塊(s kb),一個塊組最多有8b個塊(b為塊大小),那麼塊組個數=s/8b

 之後是inode點陣圖:(大小為1個塊,用來表示inode表中的inode使用情況)

 之後是inode表(儲存inode節點,每個檔案都有1inode節點,儲存該檔案的檔案型別、許可權、檔案大小、建立修改訪問時間)ls命令檢視的資訊都是在inode中儲存的。一個inode

節點128個位元組。(預設一個塊組是有多少8k就有多少inode)。

 之後是資料塊(用於儲存檔案的資料),檔案的儲存規則:


下圖就是超級塊的樣子:


下圖是塊組描述符的樣子:


塊組描述符表示的資訊:



最後圖片的最後劃線的那行表示已用inode11個,第2inode是根目錄的inode,第11個是lost+foundinode

根目錄的inode樣子如下圖:



根目錄的資料塊如下圖:


資料塊定址:



一句話每個檔案都有一個inode節點,每個節點中都儲存著這個檔案都用到了資料塊中的那些塊(可以是連續的也可以是不連續的),我們通過檔案的inode就可以找到該檔案的內容(資料塊)。

舉例說明找磁碟檔案的過程:以根目錄為例(目錄也是檔案,只是特殊的檔案)簡述尋找過程,找到根目錄的inode節點(節點2),-inode節點的Block[0]指向資料塊位置,找到根目錄的資料塊位置-》找到資料塊中的檔名的記錄(就是我們要找的檔名假設為123-》根據這條記錄的資訊找到123這個檔案的inode-》再根據123檔案的inode節點中的Block[],

找到123檔案的資料塊-123後邊如果還有要找的檔案查詢過程以此類推。


下邊是Linux核心VFS子系統的圖:每個PCB(程序控制塊,核心中程序的代表)中都有一份檔案描述符表,它裡邊儲存著很多檔案描述符,每個描述符都指向代表該檔案的file結構體,我們經常在檔案操作是開啟函式得到的就是一個檔案描述符。檔案描述符所指向的結構體中的f_op指標指向的就是操作這個檔案的系統服務例程(就是核心磁碟的驅動),結構體中的d_entry指標指向的就是某目錄的“目錄項快取”(他是個結構體,成員有這個檔案的inode的指標還有一些其他成員,主要用於尋找該目錄下的其他目錄或檔案——想一下找檔案的過程,快取目錄項的方法只是減少了讀盤的次數,利用快取手段可以減少讀盤次數,但是知識方便了訪問過的檔案,對於為訪問過的檔案還得讀磁碟)。


之前的問題請自行在這個原理介紹中查詢。如有那些理解有誤請幫忙指出,共同進步。

8、瞭解內容

windows系統安裝支援 UEFI+GPT、MBR+BIOS。

Linux系統支援UEFI+GPT、MBR+BIOS、MBR+GPT。

作業系統的啟動是有一定順序的,傳統的啟動方式(詳細的啟動流程請自行google)大致是BIOS上電自檢->載入MBR->載入磁碟上的核心,作業系統這樣啟動是需要硬體支援的,即MBR+BIOS。傳統的MBR轉變成了GPT。作業系統的啟動當然也需要改變。這裡不是介紹作業系統的安裝,有興趣的話可以自己去研究下。