硬盘术语详解

2017-03-28|Categories: Linux|Tags: |

Hardware level 硬件层面

Head / Platter 磁头、盘片

A hard disk is usually made up of multiple platters, each of which use two heads to record and read data, one for the top of the platter and one for the bottom (this isn't always the case, but usually is; see here for more details). The heads that access the platters are locked together on an assembly of head arms. This means that all the heads move in and out together, so each head is always physically located at the same track number. It is not possible to have one head at track 0 and another at track 1,000.

http://www.pcguide.com/ref/hdd/geom/tracksDifference-c.html

disk-structure-1

Sector 扇区

Geometrically, the word sector means a portion of a disk between a center, two radii and a corresponding arc (see Figure 1, item Geometric Sector), which is shaped like a slice of a pie. Thus, the disk sector (Figure 1, item Sector) refers to the intersection of a track and geometrical sector.

https://en.wikipedia.org/wiki/Disk_sector

disk-structure-2

Advanced Format 高级格式化

高级格式化磁盘将每个 4,096 字节的物理扇区转变成 8 个 512 字节的逻辑扇区。对于固件、操作系统和所有磁盘实用程序,磁盘看起像是 512 字节的扇区,但实际上,基础的物理扇区大小是 4,096 字节。

https://www.ibm.com/developerworks/cn/linux/l-linux-on-4kb-sector-disks/index.html

《高级格式化技术白皮书》 by 西部数据:

512-byte和4096-byte的物理空间占用对比:

最主要的好处是减少ECC的占用和提升ECC校验效率。因为512-byte扇区需要另外40 bytes作为ECC校验空间,而4096-byte扇区只需要100 bytes,所以,同样提供4096 bytes扇区空间,使用高级格式化能节约出220 bytes的储存空间,而且能令ECC校验完成更多空间的检验纠错,提高ECC校验的效率。

https://en.wikipedia.org/wiki/Advanced_Format

4KB-sector Alignment 4K扇区对齐

使用未对齐的分区会带来重大的性能损失。

https://www.ibm.com/developerworks/cn/linux/l-linux-on-4kb-sector-disks/index.html
(backup for the above link) https://app.yinxiang.com/shard/s6/nl/91542823/33e76b65-ddeb-4b14-83a4-5ad59cff4e3d/

In the past, the first partition always began at LBA Address 63, which corresponds to the sixty-fourth sector (see also CHS and LBA hard disk addressing). Such (logical) sectors had a size of 512 bytes. This was acceptable for normal hard disks (with a physical sector size of 512 bytes). Newer hard disks with a physical sector size of 4,096 bytes (four kilobytes) are really emulating a sector size of 512 bytes as far as external access is concerned, however internally they are working with 4,096 bytes. Even SSDs work with page sizes of four or eight kilobytes. Partitioning beginning at LBA Address 63 as such is a problem for these new hard disk and SSDs.

If partitions are formatted with a file system with a typical block size of four kilobytes, the four-kilobyte blocks for the file system will not directly fit into the four-kilobyte sectors for a hard disk or the four-, or eight-, kilobyte pages for an SSD. When a four-kilobyte file system block is written, two four-kilobyte sectors or pages will have to be modified. The fact that the respective 512-byte blocks must be maintained simply adds to the already difficult situation, meaning that a Read/Modify/Write process will have to be performed. A reduction in writing performance of up to a factor of 25 is the consequence during smaller data access attempts.

To avoid these problems, alignment at one-mebibyte (1MiB) boundaries is recommended(注1), which is a conservative approach over the long term. With the current addressing system divided in logical sectors of 512 bytes, doing so would correspond to 2,048 sectors.

https://www.thomas-krenn.com/en/wiki/Partition_Alignment

MB vs MiB

(注1):原文是「alignment at one-megabyte (1MB) boundaries is recommended」,但这是错误的,通过计算可以得知:

2048 sectors * 512 bytes = 1,048,576 bytes

但是1 MB = 1,000,000 bytesMBMiB的详细区别如下图所示:

https://zh.wikipedia.org/wiki/Mebibyte

(注2):如果使用了MB作为分区单位,在parted 2.4之前的版本会报错,告知「分区没有正确对齐」,必须使用MiB才可以正确对齐:

https://unix.stackexchange.com/questions/200582/scripteable-gpt-partitions-using-parted

(注3):从parted 2.4开始,加入了对「IEC二进制单位」的支持,第一个分区的开始位置如果是1MB,会被自动转换1MiB,除此之外的MBGB不会自动转换,如下图所示:

parted --script /dev/sdb mkpart primary 1MB 1GB

Block (Cluster) 磁区(簇)

While sector specifically means the physical disk area, the term block has been used loosely to refer to a small chunk of data. Block has multiple meanings depending on the context. In the context of data storage, a filesystem block is an abstraction over disk sectors possibly encompassing multiple sectors. In other contexts, it may be a unit of a data stream or a unit of operation for a utility. For example, the Unix program dd allows one to set the block size to be used during execution with the parameter bs=bytes. This specifies the size of the chunks of data as delivered by dd, and is unrelated to sectors or filesystem blocks.

In Linux, disk sector size can be determined with fdisk -l | grep "Sector size" and block size can be determined with blockdev --getbsz /dev/sda.

https://en.wikipedia.org/wiki/Disk_sector

Track / Cylinder 磁道、柱面

disk-structure-4

OS level 操作系统层面

Partition 分区

http://linux.vbird.org/linux_basic/0130designlinux.php#partition_table

為啥要分割?

基本上你可以這樣思考分割的角度:

  • 資料的安全性:
    因為每個分割槽的資料是分開的!所以,當你需要將某個分割槽的資料重整時,例如你要將電腦中Windows的C槽重新安裝一次系統時, 可以將其他重要資料移動到其他分割槽,例如將郵件、桌面資料移動到D槽去,那麼C槽重灌系統並不會影響到D槽!所以善用分割槽,可以讓妳的資料更安全。

  • 系統的效能考量:
    由於分割槽將資料集中在某個磁柱的區段,例如下圖當中第一個分割槽位於磁柱號碼1~100號,如此一來當有資料要讀取自該分割槽時,磁碟只會搜尋前面1~100的磁柱範圍,由於資料集中了,將有助於資料讀取的速度與效能!所以說,分割是很重要的!

分割是什麼?

分割是以磁柱扇区為單位的『連續』磁碟空間。

(备注):以柱面为单位是早期的分区方式,目前的分区都是以扇区为单位,从 fdisk/gdisk/parted 这些分区软件的工作方式就能够发现,这些软件会询问分区的起始和结束位置是哪一个「扇区」。

Windows系统的硬盘分区示意图:

windows-disk-partition-2

MBR分区表(Master Boot Record)

磁碟的第一個磁區(sector)放置開機管理程式紀錄區與分割表,這個磁區通常是512 bytes的大小:

  • 主要開機記錄區(Master Boot Record, MBR):可以安裝開機管理程式的地方,有446 bytes
  • 分割表(partition table):記錄整顆硬碟分割的狀態,有64 bytes

其實所謂的『分割』只是針對那個64 bytes的分割表進行設定而已!

由於分割表僅有64 bytes容量,因此最多僅能有四組記錄區,每組記錄區記錄了該區段的啟始與結束的磁柱號碼,這四個分割的記錄被稱為主要(Primary)或延伸(Extended)分割槽。

延伸分割的想法是:既然第一個磁區所在的分割表只能記錄四筆資料,那我可否利用額外的磁區來記錄更多的分割資訊?

MBR主要分割、延伸分割與邏輯分割(logical partition)的特性我們作個簡單的定義:

  • 主要分割與延伸分割最多可以有四筆(硬碟的限制)
  • 延伸分割最多只能有一個(作業系統的限制)
  • 邏輯分割是由延伸分割持續切割出來的分割槽;
  • 能夠被格式化、作為資料存取的分割槽為主要分割與邏輯分割,延伸分割無法格式化;
  • 邏輯分割的數量依作業系統而不同,在Linux系統中SATA硬碟已經可以突破63個以上的分割限制;

MBR分割表的限制

  • 作業系統無法抓取到2.2T以上的磁碟容量!
  • MBR僅有一個磁區,若被破壞後,經常無法(或很難)救援。
  • MBR僅有446 bytes存放開機管理程式,無法容納較多的程式碼。

為了解決這些問題,所以後來就有GPT。

GPT分区表(GUID Partition Table)

GPT將磁碟所有磁區以LBA(Logical Block Address,邏輯區塊位址)來規劃,預設每個磁區為512 bytes,而第一個LBA稱為LBA0(從 0 開始編號)。

與MBR僅使用第一個512 bytes磁區來紀錄不同,GPT使用了34個LBA來紀錄分割資訊!同時與過去MBR僅有一個磁區,被幹掉就死光光的情況不同,GPT除了前面34個LBA之外,整個磁碟的最後33個LBA也拿來作為另一個備份!

上述圖示的解釋說明如下:

  • LBA0(MBR相容磁區)
    與MBR模式相似的,這個相容磁區也分為兩個部份,一個就是跟之前446 bytes相似的區域,儲存了第一階段的開機管理程式!而在原本的分割表的紀錄區內,這個相容模式僅放入一個特殊標誌的分割,用來表示此磁碟為GPT格式之意。而不懂GPT分割表的磁碟管理程式,就不會認識這顆磁碟,除非用戶有特別要求要處理這顆磁碟,否則該管理軟體不能修改此分割資訊,進一步保護了此磁碟!

  • LBA1(GPT表頭紀錄)
    這個部份紀錄了分割表本身的位置與大小,同時紀錄了備份用的GPT分割(就是前面談到的最後34個LBA磁區)放置的位置,同時放置了分割表的檢驗機制碼(CRC32),作業系統可以根據這個檢驗碼來判斷GPT是否正確。若有錯誤,還可以透過這個紀錄區來取得備份的GPT(磁碟最後的那個備份區塊)來恢復GPT的正常運作!

  • LBA2-33(實際紀錄分割資訊)
    從LBA2磁區開始,因為每個LBA有512 bytes,每筆紀錄用到128 bytes的空間,因此每個LBA都可以紀錄4筆分割紀錄,所以在預設的情況下,總共可以有4*32 = 128筆分割紀錄(分割槽)!除了每筆紀錄所需要的識別碼與相關的紀錄之外,GPT在每筆紀錄中分別提供了64 bits來記載開始、結束的磁區號碼,因此,GPT分割表對於單一分割槽來說, 他的最大容量限制就會在『 264 * 512 bytes = 263 * 1 KiB = 233 * 1 TiB = 8 ZiB 』,要注意1 ZiB = 230 TiB啦!你說有沒有夠大了?

GPT分割已經沒有所謂的主要、延伸、邏輯分割槽的概念,每個分割槽都可以視為是主分割!每一個分割都可以拿來格式化使用!

Format 格式化

我們都知道磁碟分割完畢後還需要進行格式化(format),之後作業系統才能夠使用這個檔案系統。為什麼需要進行『格式化』呢?這是因為每種作業系統所設定的檔案屬性、權限並不相同,為了存放這些檔案所需的資料,就需要將分割槽進行格式化,以成為作業系統能夠利用的『檔案系統格式(filesystem)』。

http://linux.vbird.org/linux_basic/0230filesystem.php#harddisk-filesystem

因此,『格式化』其實應該稱為『建置檔案系統(make filesystem)』才對。

http://linux.vbird.org/linux_basic/0230filesystem.php#format

Partition vs Format

windows-disk-partition-1

References

http://www.pcguide.com/ref/hdd/index.htm

Leave A Comment