@(linux)[磁盤管理]
1. 寫在前面
- 在此強(qiáng)調(diào)一個(gè)Linux的核心機(jī)制就是一切皆文件。
- I/O Ports即I/O設(shè)備地址,用來標(biāo)識(shí)硬件對(duì)應(yīng)的設(shè)備地址,來讓操作系統(tǒng)以及cpu使用。
- CPU的核數(shù)不一定就是越多越好,由于CPU協(xié)調(diào)之間的協(xié)調(diào)問題,可能性能不升反降。
2. 設(shè)備文件
關(guān)聯(lián)至一個(gè)設(shè)備驅(qū)動(dòng)程序,進(jìn)而能夠跟與之對(duì)應(yīng)硬件設(shè)備進(jìn)行通信
設(shè)備文件分類
- 塊設(shè)備:block,存取單位“塊”,磁盤
- 字符設(shè)備:char,存取單位“字符”,鍵盤
設(shè)備號(hào)碼
- 主設(shè)備號(hào):major number, 標(biāo)識(shí)設(shè)備類型
- 次設(shè)備號(hào):minor number, 標(biāo)識(shí)同一類型下的不同設(shè)備
[root@localhost ~]# ll /dev/
total 0
# 10為主設(shè)備號(hào)標(biāo)識(shí)相同的設(shè)備類型,175/235此設(shè)備標(biāo)識(shí)不同的設(shè)備
crw-rw----. 1 root video 10, 175 3月 30 08:48 agpgart
crw-------. 1 root root 10, 235 3月 30 08:48 autofs
# 200標(biāo)識(shí)這個(gè)單獨(dú)的設(shè)備
drwxr-xr-x. 2 root root 200 3月 30 08:48 block
硬盤接口類型
接口速率而非硬件設(shè)備速率,同一個(gè)接口不同的硬盤速率不同
- 并行(實(shí)現(xiàn)數(shù)據(jù)串行工作,類似雙向兩車道,但是之間有數(shù)據(jù)干擾)
- IDE:133MB/s
- SCSI:640MB/s
- 串口(實(shí)現(xiàn)數(shù)據(jù)串行工作,類型單向四車道)
- SATA3:6Gbps(需要除以8來得到實(shí)際速率)
- SAS:6Gbps
- USB:480MB/s
- 單位(rpm): rotations per minute
磁盤設(shè)備的設(shè)備文件命名
命名格式:/dev/DEV_FILE
- IDE:
/dev/hd - SCSI, SATA, SAS, USB:
/dev/sd - 不同設(shè)備:a-z
/dev/sda,/dev/sdb, ... - 同一設(shè)備上的不同分區(qū):1,2, ...
/dev/sda1,/dev/sda5, ...
3. 機(jī)械式硬盤
機(jī)械硬盤主要由以下幾部分組成:機(jī)械手臂(Boom),磁頭(Head),轉(zhuǎn)軸(Spindle),盤片(Platter)組成,在實(shí)際應(yīng)用中又將盤片分成了磁道(Track),扇區(qū)(Sector)和柱面(Cylinder)。


機(jī)械手臂
機(jī)械手臂由控制電路控制,可以前后移動(dòng),在機(jī)械手臂的前端有磁頭,機(jī)械手臂的作用就是,移動(dòng)磁頭,使磁頭位于正確的位置上。
磁頭
磁頭由機(jī)械手臂控制在盤片上移動(dòng)。讀寫硬盤時(shí),磁頭依靠磁盤的高速旋轉(zhuǎn)引起的空氣動(dòng)力效應(yīng)懸浮在盤面上,可以在極短的時(shí)間內(nèi)精確定位到計(jì)算機(jī)指令指定的磁道上。
盤片
硬盤的存儲(chǔ)介質(zhì),所有的信息都存儲(chǔ)在這里,盤片分為單面盤片和雙面盤片,單面盤片只能在一面進(jìn)行存儲(chǔ),雙面盤片能在兩面進(jìn)行存儲(chǔ)。硬盤的盤片一般采用合金材料,多數(shù)為鋁合金,盤面上涂著磁性材料。早期硬盤由于單碟容量低導(dǎo)致盤片較多,現(xiàn)代的硬盤盤片一般只有少數(shù)幾片。硬盤一般會(huì)有一個(gè)或多個(gè)盤片,每個(gè)盤片可以有兩個(gè)面(Side),即第1個(gè)盤片的正面稱為0面,反面稱為1面;第2個(gè)盤片的正面稱為2面,反面稱為3面…依次類推。每個(gè)盤面對(duì)應(yīng)一個(gè)磁頭(head)用于讀寫數(shù)據(jù)。第一個(gè)盤面的正面的磁頭稱為0磁頭,背面稱為1磁頭;第二個(gè)盤片正面的磁頭稱為2磁頭,背面稱為3磁頭,以此類推。盤面數(shù)和磁頭數(shù)是相等的。
磁道
每個(gè)盤片的每個(gè)盤面被劃分成多個(gè)狹窄的同心圓環(huán),數(shù)據(jù)就是存儲(chǔ)在這樣的同心圓環(huán)上,我們將這樣的圓環(huán)稱為磁道(Track),每個(gè)盤面可以劃分多個(gè)磁道。在每個(gè)盤面的最外圈,離盤心最遠(yuǎn)的地方是“0”磁道,向盤心方向依次增長(zhǎng)為1磁道,2磁道,等等。硬盤數(shù)據(jù)的存放就是從最外圈開始。
扇區(qū)
根據(jù)硬盤規(guī)格的不同,磁道數(shù)可以從幾百到成千上萬不等。每個(gè)磁道上可以存儲(chǔ)數(shù)KB的數(shù)據(jù),但計(jì)算機(jī)并不需要一次讀寫這么多數(shù)據(jù)。在這一這基礎(chǔ)上,又把每個(gè)磁道劃分成若干弧段,每段稱為一個(gè)扇區(qū)(Sector)。扇區(qū)是硬盤上存儲(chǔ)的物理單位,每個(gè)扇區(qū)可存儲(chǔ)128×2N次方(N=0,1,2,3)字節(jié)的數(shù)據(jù)。從DOS時(shí)代起,每扇區(qū)是128×22=512字節(jié),現(xiàn)在已經(jīng)成了業(yè)界不成文的規(guī)定,也沒有哪個(gè)硬盤廠商試圖去改變這種約定。也就是說即使計(jì)算機(jī)只需要硬盤上存儲(chǔ)的某個(gè)字節(jié),也須一次把這個(gè)字節(jié)所在的扇區(qū)中的全部512字節(jié)讀入內(nèi)存,再選擇所需的那個(gè)字節(jié)。扇區(qū)的編號(hào)是從1開始,而不是0,這一點(diǎn)需要注意。另外,硬盤在劃分扇區(qū)時(shí),和軟盤是有一定區(qū)別的。軟盤的一個(gè)磁道中,扇區(qū)號(hào)一般依次編排,如1號(hào),2號(hào),3號(hào)…以此類推。

在硬盤磁道中,扇區(qū)號(hào)是按照某個(gè)間隔跳躍著編排。比如,2號(hào)扇區(qū)并不是1號(hào)扇區(qū)后的按順序的第一個(gè)而是第八個(gè),3號(hào)扇區(qū)又是2號(hào)扇區(qū)后的按順序的第八個(gè),依此類推,這個(gè)“八”稱為交叉因子。這個(gè)交叉因子的來歷有必要詳述一下,我們知道,數(shù)據(jù)讀取經(jīng)常需要按順序讀取一系列相鄰的扇區(qū)(邏輯數(shù)據(jù)相鄰)。如對(duì)磁道扇區(qū)按物理順序進(jìn)行編號(hào),很有可能出現(xiàn)當(dāng)磁頭讀取完第一個(gè)扇區(qū)后,由于盤片轉(zhuǎn)速過快來不及讀取下一個(gè)扇區(qū),(要知道物理相鄰扇區(qū)位置距離是極小的),必須等待轉(zhuǎn)完一圈,這極大浪費(fèi)了時(shí)間。所以就用交叉來解決這個(gè)問題。
柱面
柱面其實(shí)是我們抽象出來的一個(gè)邏輯概念,前面說過,離盤心最遠(yuǎn)的磁道為0磁道,依此往里為1磁道,2磁道,3磁道….,不同面上相同磁道編號(hào)則組成了一個(gè)圓柱面,即所稱的柱面(Cylinder)。
簇
將物理相鄰的若干個(gè)扇區(qū)稱為了一個(gè)簇。操作系統(tǒng)讀寫磁盤的基本單位是扇區(qū),而文件系統(tǒng)的基本單位是簇(Cluster)。在Windows下,隨便找個(gè)幾字節(jié)的文件,在其上面點(diǎn)擊鼠標(biāo)右鍵選擇屬性,看看實(shí)際大小與占用空間兩項(xiàng)內(nèi)容,如大小:15 字節(jié) (15 字節(jié)), 占用空間:4.00 KB (4,096 字節(jié))。這里的占用空間就是你機(jī)器分區(qū)的簇大小,因?yàn)樵傩〉奈募紩?huì)占用空間,邏輯基本單位是4K,所以都會(huì)占用4K。 簇一般有這幾類大小 4K,8K,16K,32K,64K等。簇越大存儲(chǔ)性能越好,但空間浪費(fèi)嚴(yán)重。簇越小性能相對(duì)越低,但空間利用率高。NTFS格式的文件系統(tǒng)簇的大小為4K。
4. 分區(qū)劃分
4.1 BIOS
BIOS(Basic Input/Output System)
每一臺(tái)普通的電腦都會(huì)有一個(gè)BIOS,用于加載電腦最基本的程式碼,擔(dān)負(fù)著初始化硬件,檢測(cè)硬件功能以及引導(dǎo)操作系統(tǒng)的任務(wù)。
0磁道0扇區(qū)
在傳統(tǒng)的系統(tǒng)上,當(dāng)我們啟動(dòng)計(jì)算的時(shí)候,默認(rèn)的最開始會(huì)讀取0磁道0扇區(qū)的數(shù)據(jù),其是以
512bytes為單位來進(jìn)行硬盤的分區(qū)劃分,它不屬于任何分區(qū),用來標(biāo)識(shí)我們創(chuàng)建的分區(qū)信息等。
格式
MBR(Master Boot Record): 指的是一個(gè)一段程序而非一個(gè)空間
-
446bytes: boot loader 主引導(dǎo)記錄 -
64bytes: 分區(qū)表 -
16bytes: 標(biāo)識(shí)一個(gè)分區(qū) -
2bytes:55AA用來標(biāo)識(shí)結(jié)尾
實(shí)戰(zhàn)演示:
# 首先使用 fdisk -l 確定MBR位置,標(biāo)記 * 即為mbr所在分區(qū)
[root@localhost ~]# fdisk -l
Disk /dev/sda: 21.5 GB, 21474836480 bytes, 41943040 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk label type: dos
Disk identifier: 0x00093397
Device Boot Start End Blocks Id System
/dev/sda1 * 2048 1026047 512000 83 Linux
/dev/sda2 1026048 41943039 20458496 8e Linux LVM
下面的省略了......
# 備份MBR
dd if=/dev/sda1 of=/root/mbr bs=512 count=1
# 恢復(fù)MBR:
dd if=/root/mbr of=/dev/sda1 bs=512 count=1
# 恢復(fù)分區(qū)表:
dd if=/root/mbr of=/dev/sda1 bs=512 skip=446 count=66
注:mbr大小512 所以bs=512 count=1 bs=512 skip=446 count=66 用來確定分區(qū)表在備份文件中的位置
# 查看 mbr 分區(qū)信息
[root@localhost ~]# hexdump -C mbr.txt
00000000 58 46 53 42 00 00 10 00 00 00 00 00 00 01 f4 00 |XFSB............|
00000010 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
00000020 46 74 a4 dd d2 48 40 cb a6 0e 3f 8f 32 c8 e0 2d |Ft...H@...?.2..-|
00000030 00 00 00 00 00 01 00 04 00 00 00 00 00 00 00 80 |................|
00000040 00 00 00 00 00 00 00 81 00 00 00 00 00 00 00 82 |................|
00000050 00 00 00 01 00 00 7d 00 00 00 00 04 00 00 00 00 |......}.........|
00000060 00 00 03 55 b4 b4 02 00 01 00 00 10 00 00 00 00 |...U............|
00000070 00 00 00 00 00 00 00 00 0c 09 08 04 0f 00 00 19 |................|
00000080 00 00 00 00 00 00 02 00 00 00 00 00 00 00 00 af |................|
00000090 00 00 00 00 00 01 44 98 00 00 00 00 00 00 00 00 |......D.........|
000000a0 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff |................|
000000b0 00 00 00 00 00 00 00 02 00 00 00 00 00 00 00 00 |................|
000000c0 00 00 00 00 00 00 00 01 00 00 00 8a 00 00 00 8a |................|
000000d0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
*
00000200
有一部分給缺失了
分區(qū)類型
- 最多4個(gè)主分區(qū)
- 3主分區(qū)+1擴(kuò)展(N個(gè)邏輯分區(qū))
4.2 UEFI
UEFI(Unified Extensible Firmware Interface)
- 即“統(tǒng)一的可擴(kuò)展固件接口”,是一種詳細(xì)描述全新類型接口的標(biāo)準(zhǔn),是適用于電腦的標(biāo)準(zhǔn)固件接口,旨在代替BIOS(基本輸入/輸出系統(tǒng))。
- 這種接口用于操作系統(tǒng)自動(dòng)從預(yù)啟動(dòng)的操作環(huán)境,加載到一種操作系統(tǒng)上,從而達(dá)到開機(jī)程序化繁為簡(jiǎn)節(jié)省時(shí)間的目的。
- UEFI拋去了傳統(tǒng)BIOS需要長(zhǎng)時(shí)間自檢的問題,讓硬件初始化以及引導(dǎo)系統(tǒng)變得簡(jiǎn)潔快速。
UEFI的優(yōu)點(diǎn)
- 通過保護(hù)預(yù)啟動(dòng)或預(yù)引導(dǎo)進(jìn)程,抵御bootkit攻擊,從而提高安全性。
- 縮短了啟動(dòng)時(shí)間和從休眠狀態(tài)恢復(fù)的時(shí)間。
- 支持容量超過2.2 TB的驅(qū)動(dòng)器。
- 支持64位的現(xiàn)代固件設(shè)備驅(qū)動(dòng)程序,系統(tǒng)在啟動(dòng)過程中可以使用它們來對(duì)超過172億GB的內(nèi)存進(jìn)行尋址。
- UEFI硬件可與BIOS結(jié)合使用。
5. fdisk命令
fdisk:對(duì)于一塊硬盤來講,最多只能管理15分區(qū)
格式:fdisk -l [-u] [device...]
參數(shù)選項(xiàng):
-
-b <size>
sector size (512, 1024, 2048 or 4096) -
-c[=<mode>]
compatible mode: 'dos' or 'nondos' (default) -
-h
print this help text -
-u[=<unit>]
display units: 'cylinders' or 'sectors' (default) -
-v
print program version -
-C <number>
specify the number of cylinders -
-H <number>
specify the number of heads -
-S <number>
specify the number of sectors per track -
-l
列出指定設(shè)備的分區(qū)表信息并退出,如果沒有給出設(shè)備,那么使用那些在/proc/partitions(如果存在)
實(shí)戰(zhàn)演示:
[root@localhost ~]# fdisk -l
# 第一塊硬盤的總量
Disk /dev/sda: 21.5 GB, 21474836480 bytes, 41943040 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk label type: dos
Disk identifier: 0x00093397
# 單位為扇區(qū),即為512KB
Device Boot Start End Blocks Id System
/dev/sda1 * 2048 1026047 512000 83 Linux
/dev/sda2 1026048 41943039 20458496 8e Linux LVM
# 第二塊硬盤的分區(qū)表為空,暫時(shí)沒有分區(qū)
Disk /dev/sdb: 5368 MB, 5368709120 bytes, 10485760 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
[root@localhost ~]# fdisk /dev/sdb
Welcome to fdisk (util-linux 2.23.2).
Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.
Device does not contain a recognized partition table
Building a new DOS disklabel with disk identifier 0xd2d77080.
Command (m for help): m
Command action
a toggle a bootable flag
b edit bsd disklabel
c toggle the dos compatibility flag
# 刪除一個(gè)分區(qū)
d delete a partition
g create a new empty GPT partition table
G create an IRIX (SGI) partition table
# 列出所有分區(qū)
l list known partition types
# 打印幫助列表
m print this menu
# 創(chuàng)建新分區(qū)
n add a new partition
o create a new empty DOS partition table
# 打印分區(qū)表信息
p print the partition table
# 退出不保存
q quit without saving changes
s create a new empty Sun disklabel
# 修改分區(qū)id
t change a partition's system id
# 修改容量單位
u change display/entry units
# 檢測(cè)分區(qū)表
v verify the partition table
# 保存退出
w write table to disk and exit
x extra functionality (experts only)
Command (m for help): n
Partition type:
p primary (0 primary, 0 extended, 4 free)
e extended
Select (default p): p
Partition number (1-4, default 1): 1
First sector (2048-10485759, default 2048):
Using default value 2048
Last sector, +sectors or +size{K,M,G} (2048-10485759, default 10485759): +1G
Partition 1 of type Linux and of size 1 GiB is set
Command (m for help): l
0 Empty 24 NEC DOS 81 Minix / old Lin bf Solaris
1 FAT12 27 Hidden NTFS Win 82 Linux swap / So c1 DRDOS/sec (FAT-
2 XENIX root 39 Plan 9 83 Linux c4 DRDOS/sec (FAT-
3 XENIX usr 3c PartitionMagic 84 OS/2 hidden C: c6 DRDOS/sec (FAT-
4 FAT16 <32M 40 Venix 80286 85 Linux extended c7 Syrinx
5 Extended 41 PPC PReP Boot 86 NTFS volume set da Non-FS data
6 FAT16 42 SFS 87 NTFS volume set db CP/M / CTOS / .
7 HPFS/NTFS/exFAT 4d QNX4.x 88 Linux plaintext de Dell Utility
8 AIX 4e QNX4.x 2nd part 8e Linux LVM df BootIt
9 AIX bootable 4f QNX4.x 3rd part 93 Amoeba e1 DOS access
a OS/2 Boot Manag 50 OnTrack DM 94 Amoeba BBT e3 DOS R/O
b W95 FAT32 51 OnTrack DM6 Aux 9f BSD/OS e4 SpeedStor
c W95 FAT32 (LBA) 52 CP/M a0 IBM Thinkpad hi eb BeOS fs
e W95 FAT16 (LBA) 53 OnTrack DM6 Aux a5 FreeBSD ee GPT
f W95 Ext'd (LBA) 54 OnTrackDM6 a6 OpenBSD ef EFI (FAT-12/16/
10 OPUS 55 EZ-Drive a7 NeXTSTEP f0 Linux/PA-RISC b
11 Hidden FAT12 56 Golden Bow a8 Darwin UFS f1 SpeedStor
12 Compaq diagnost 5c Priam Edisk a9 NetBSD f4 SpeedStor
14 Hidden FAT16 <3 61 SpeedStor ab Darwin boot f2 DOS secondary
16 Hidden FAT16 63 GNU HURD or Sys af HFS / HFS+ fb VMware VMFS
17 Hidden HPFS/NTF 64 Novell Netware b7 BSDI fs fc VMware VMKCORE
18 AST SmartSleep 65 Novell Netware b8 BSDI swap fd Linux raid auto
1b Hidden W95 FAT3 70 DiskSecure Mult bb Boot Wizard hid fe LANstep
1c Hidden W95 FAT3 75 PC/IX be Solaris boot ff BBT
1e Hidden W95 FAT1 80 Old Minix
Command (m for help): q
查看內(nèi)核是否已經(jīng)識(shí)別新的分區(qū)
cat /proc/partations
通知內(nèi)核重新讀取硬盤分區(qū)表
partx -a
# 如果指定設(shè)備則重讀特定設(shè)備,不指明則一次讀取,如果你有兩個(gè)設(shè)備則需要執(zhí)行兩次
partx -a /dev/sda
partx -a -n M:N
partx -a -n 4:6 /dev/sda
kpartx -a /dev/DEVICE
kpartx -a /dev/sda
-
partprobe [/dev/DEVICE]
在Cetntos中使用的命令,能夠重新的讀取設(shè)定的分區(qū)。
