今天我以磁盤結構作為硬碟的開篇,來分享我這些年在這方面的思考,
磁盤結構
為了方便討論,我們還是先從最基本的磁盤物理結構說起吧,對于常見的機械磁盤,分磁盤面、磁道、柱面和扇區,(注意本文只討論機械磁盤,SSD先放一放再說),
機械硬碟拆開以后,結構如下

我們再用一個邏輯圖看一下

可見有以下概念 :
- 磁盤面:磁盤是由一疊磁盤面疊加組合構成,每個磁盤面上都會有一個磁頭負責讀寫,
- 磁道(Track):每個盤面會圍繞圓心劃分出多個同心圓圈,每個圓圈叫做一個磁道,
- 柱面(Cylinders):所有盤片上的同一位置的磁道組成的立體叫做一個柱面,
- 扇區(Sector):以磁道為單位管理磁盤仍然太大,所以計算機前輩們又把每個磁道劃分出了多個扇區,
所以,磁盤存盤的最小組成單位就是扇區,
單柱面的存盤容量 = 每個扇區的位元組數*每個柱面扇區數*磁盤面數
整體磁盤的容量就等于單柱面容量乘以總的柱面數字,
扇區與扇區之間其實不是緊挨著的,而是在每個扇區結尾其實還有一個存盤糾錯碼的位置,假設某一個扇區讀取時發生了錯誤,這樣在扇區結尾的糾錯碼就能發現,磁頭就會在磁盤下一圈轉過來的時候再讀取一遍,
動手實際查看
Linux相比較windows作業系統,一個優點就是對開發非常友好和透明,只要你愿意,你總能扒到你想要的資訊,Linux上可以通過fdisk命令,來查看當前系統使用的磁盤的這些物理資訊,
首先我們查看服務器上安裝的硬碟數量以及大小,這需要借助lsblk這命令,
# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sdb 8:16 0 20T 0 disk
`-sdb1 8:17 0 20T 0 part /search
sda 8:0 0 278.5G 0 disk
|-sda1 8:1 0 200M 0 part /boot
`-sda2 8:2 0 278.3G 0 part
|-vgroot-lvroot (dm-0) 253:0 0 10G 0 lvm /
|-vgroot-lvswap (dm-1) 253:1 0 8G 0 lvm [SWAP]
|-vgroot-lvvar (dm-2) 253:2 0 15G 0 lvm /var
|-vgroot-lvusr (dm-3) 253:3 0 10G 0 lvm /usr
`-vgroot-lvopt (dm-4) 253:4 0 136.7G 0 lvm /opt
通過上面命令我們可以看到,筆者的服務器上裝了兩塊硬碟,分別是sda(278.5G)和sdb(20T),接下來我們再通過fdisk這個命令來查看硬碟更詳細的資訊:
#fdisk -l /dev/sda
Disk /dev/sda: 299.0 GB, 298999349248 bytes
255 heads, 63 sectors/track, 36351 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 4096 bytes
Disk identifier: 0x00053169
Device Boot Start End Blocks Id System
/dev/sda1 * 1 26 204800 83 Linux
Partition 1 does not end on cylinder boundary.
/dev/sda2 26 36352 291785728 8e Linux LVM
可以看出sda這塊磁盤:
- 有255個heads(磁頭),也就是說共有255個盤面,
- 36351個cylinders,也就是說每個盤面上都有36351個磁道,
- 63sectors/track說的是每個磁道上共有63個扇區,
- 邏輯扇區大小是512 bytes
上面的Units說的是每個磁道的存盤容量大小,8225280 bytes(=255盤面 * 63扇區 * 邏輯扇區大小512位元組), 那么該磁盤的總大小=36351 cylinders * Units(8225280 bytes)=299GB,
關于fdisk結果中的幾個疑問
- 問題1:每一個units的可存盤的資料都是一樣的,都是8225280位元組?
按理說,磁道是一組同心圓,越是外圈的磁道周長會越長,存盤的資料應該越多才對,這個問題的答案其實應該按時間來看:
在老式的磁盤里,確實是每個磁道資料都是一樣的,這樣越是內圈磁道的存盤密度越大,目的就是為了訪問方便,通過一個CHS地址:柱面地址(Cylinders)、磁頭地址(Heads)、扇區地址(Sectors)直接定位到存盤資料所在的扇區,但是這產生的問題就是外圈磁道的資料密度沒有充分發揮出來,造成磁盤存盤容量很難提升,
現代的磁盤人們改用等密度結構生產硬碟,也就是說,外圈磁道的扇區比內圈磁道多,這種磁盤里扇區是線性編號的,即從0到某個最大值方式排列,并連成一條線,這種尋址模式叫做LBA,全稱為Logic Block Address(即扇區的邏輯塊地址),磁盤內部是自己會通過磁盤控制器來完成CHS到LBA的轉換,進而定位到具體的物理扇區
- 問題2:為什么在fdisk命令的結果里,存在一個physical Sector size是4096 bytes?
現在新的磁盤真正的扇區也不是512位元組,真正磁盤的I/O size和physical Sector size都是4096 bytes, 但這時存在一個問題是扇區大小為512位元組的假設已經貫穿于整個軟體鏈,比如BIOS,啟動加載器,作業系統內核,檔案系統代碼,以及磁盤工具,等等,直接切換到4096 byte兼容性問題太大了,所以每個新的磁盤控制器將4096位元組的物理扇區對應成了8個512位元組的邏輯扇區,兼容各種老軟體,
除了fdisk -l命令外,如下方式也可以查看物理/邏輯扇區大小,
#cat /sys/block/sda/queue/physical_block_size
#cat /sys/block/sda/queue/logical_block_size
- 問題3:磁頭真的有255個?
我們先來看一張從磁盤上拆下來的磁頭的真實照片

上面的圖片里只有幾個磁頭,如果硬碟里真的裝下255個這樣的磁頭的話,很難想象磁盤得有多厚,而且磁頭多了以后硬碟的可靠性就越差,因為多磁頭出故障的幾率總會比單磁頭要高一些,所以fdisk -l里看到的255 heads其實和扇區一樣,也是虛擬出來的, 另外cylinders也一樣,也是虛擬出來的,

開發內功修煉之硬碟篇專輯:
- 1.磁盤開篇:扒開機械硬碟堅硬的外衣!
- 2.磁盤磁區也是隱含了技術技巧的
- 3.我們怎么解決機械硬碟既慢又容易壞的問題?
- 4.拆解固態硬碟結構
- 5.新建一個空檔案占用多少磁盤空間?
- 6.只有1個位元組的檔案實際占用多少磁盤空間
- 7.檔案過多時ls命令為什么會卡住?
- 8.理解格式化原理
- 9.read檔案一個位元組實際會發生多大的磁盤IO?
- 10.write檔案一個位元組后何時發起寫磁盤IO?
- 11.機械硬碟隨機IO慢的超乎你的想象
- 12.搭載固態硬碟的服務器究竟比搭機械硬碟快多少?
我的公眾號是「開發內功修煉」,在這里我不是單純介紹技術理論,也不只介紹實踐經驗,而是把理論與實踐結合起來,用實踐加深對理論的理解、用理論提高你的技術實踐能力,歡迎你來關注我的公眾號,也請分享給你的好友~~~
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/202163.html
標籤:其他
下一篇:磁盤磁區也是隱含了技術技巧的
