剛看了一下,上一次我分享完內存篇的時候是2019年12月25號。沒想到在我醞釀和打磨磁盤篇的這段時間裏,咱們的生活發生瞭如此大的變化。人類一直以爲本身是地球上全部生物的主宰,沒想到此次被一個小小的病毒狠狠地咬了一口,並且還在歐美繼續猖狂。也許是人類安逸過久了,早已經沒有原始社會那種須要戰戰兢兢過日子的心態,在病毒初見端倪的時候,並無獲得足夠的重視。甚至中國已經和病毒進行着全國大戰役的時候,歐美的同窗們還在開開心心的閒逛,聚會。原本他們有足夠多的時間和機會的,結果卻演變到了今天這個局面。我想說的一句是,人類在宇宙中可以存在,原本就已是一個極低機率的事件了,宇宙中的各類射線,上千度萬度的高溫,都是脆弱的人類生命的不可承受之重。人類如今已經把宇宙觀測到放大到星系團了暫時也沒發現其它文明存在。無論本身多牛逼,始終仍是要保存一顆敬畏天然、敬畏其它物種的心,且行且珍惜。
windows
今天我以磁盤結構做爲硬盤的開篇,來分享我這些年在磁盤、文件方面的思考和總結。服務器
1磁盤結構app
爲了方便討論,咱們仍是先從最基本的磁盤物理結構提及吧,對於常見的機械磁盤,分磁盤面、磁道、柱面和扇區。(注意本文只討論機械磁盤,SSD先放一放再說)。 機械硬盤拆開之後,結構以下:ide
圖1 機械硬盤內部工具
咱們再用一個邏輯圖看一下spa
圖2 磁盤邏輯結構圖操作系統
可見有如下概念 :code
1. 磁盤面:磁盤是由一疊磁盤面疊加組合構成,每一個磁盤面上都會有一個磁頭負責讀寫。orm
2. 磁道(Track):每一個盤面會圍繞圓心劃分出多個同心圓圈,每一個圓圈叫作一個磁道。blog
3. 柱面(Cylinders):全部盤片上的同一位置的磁道組成的立體叫作一個柱面。
4. 扇區(Sector):以磁道爲單位管理磁盤仍然太大,因此計算機前輩們又把每一個磁道劃分出了多個扇區。
因此,磁盤存儲的最小組成單位就是扇區。
單柱面的存儲容量 = 每一個扇區的字節數 * 每柱面扇區數 * 磁盤面數
總體磁盤的容量 = 單柱面容量 * 總的柱面數字。
扇區與扇區之間其實不是緊挨着的,而是在每一個扇區結尾其實還有一個存儲糾錯碼的位置。假設某一個扇區讀取時發生了錯誤,這樣在扇區結尾的糾錯碼就能發現。磁頭就會在磁盤下一圈轉過來的時候再讀取一遍。
2動手實際查看
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這塊磁盤:
1. 有255個heads(磁頭),也就是說共有255個盤面。
2. 36351個cylinders,也就是說每一個盤面上都有36351個磁道,
3. 63sectors/track說的是每一個磁道上共有63個扇區。
4. 邏輯扇區大小是512 bytes
上面的Units說的是每一個磁道的存儲容量大小,8225280 bytes(=255盤面 * 63扇區 * 邏輯扇區大小512字節)。 那麼該磁盤的總大小=36351 cylinders * Units(8225280 bytes)=299GB。
3關於fdisk結果中的幾個疑問
問題1:每個units的可存儲的數據都是同樣的,都是8225280字節?
按理說,磁道是一組同心圓,越是外圈的磁道周長會越長,存儲的數據應該越多才對。這個問題的答案其實應該按時間來看:
在老式的磁盤裏,確實是每一個磁道數據都是同樣的。這樣越是內圈磁道的存儲密度越大。目的就是爲了訪問方便,經過一個CHS地址:柱面地址(Cylinders)、磁頭地址(Heads)、扇區地址(Sectors)直接定位到存儲數據所在的扇區。可是這產生的問題就是外圈磁道的數據密度沒有充分發揮出來,形成磁盤存儲容量很難提高。
現代的磁盤人們改用等密度結構生產硬盤,也就是說,外圈磁道的扇區比內圈磁道多。這種磁盤裏扇區是線性編號的,即從0到某個最大值方式排列,並連成一條線。這種尋址模式叫作LBA,全稱爲Logic Block Address(即扇區的邏輯塊地址)。磁盤內部是本身會經過磁盤控制器來完成CHS到LBA的轉換,進而定位到具體的物理扇區
問題2:在fdisk命令的結果裏,存在的physical Sector size是什麼?
現代科技進步了,磁盤底層的最小組成單位並非扇區512字節,physical Sector size 4KB。但這時存在一個問題是扇區大小爲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個?
咱們先來看一張從磁盤上拆下來的磁頭的真實照片
圖3 機械硬盤磁頭
上面的圖片裏只有幾個磁頭,若是硬盤裏真的裝下255個這樣的磁頭的話,很難想象磁盤得有多厚。並且磁頭多了之後硬盤的可靠性就越差,由於多磁頭出故障的概率總會比單磁頭要高一些。因此fdisk -l
裏看到的255 heads其實和扇區同樣,也是虛擬出來的。 另外cylinders也同樣,也是虛擬出來的。