磁気ディスクの仕組みを理解しよう

# 1 磁気ディスクの構造

## 1.1 デバイスファイル
Linuxの哲学：全てがファイル
ハードウェアデバイスも、Linuxシステムではファイルの形式で表示されます。
デバイスファイル：デバイスドライバに関連付けられ、対応するハードウェアデバイスと通信できます。

### 通常のファイル
```shell
[root@rocky86 ~]# ll t*
-rw-r--r--  1 root root  20 Jul 11 21:17 test
-rw-r--r--  1 root root 178 Jul 15 09:50 test2.sh
```

### デバイスファイル
```shell
[root@rocky86 ~]# ll /dev/sda
brw-rw---- 1 root disk 8, 0 Jul 29 08:51 /dev/sda
[root@rocky86 ~]# ll /dev/tty0
crw--w---- 1 root tty 4, 0 Jul 29 08:51 /dev/tty0
```

### デバイス番号
| デバイス番号      | 英語           | 役割                           |
|------------------|----------------|--------------------------------|
| 主デバイス番号   | major number   | デバイスタイプを識別する       |
| 副デバイス番号   | minor number   | 同一タイプ内の異なるデバイスを識別する |

### デバイスファイルタイプ
| デバイスタイプ    | 英語         | ファイルタイプ識別文字 | アクセス単位 | 典型的なデバイス |
|------------------|--------------|-----------------------|-------------|-----------------|
| ブロックデバイス   | block        | b                     | ブロック    | ディスク         |
| キャラクタデバイス | char         | c                     | キャラクタ  | キーボード       |

### 磁気ディスクデバイスのデバイスファイル命名
| デバイスタイプ      | デバイスファイル名        | 備考                       |
|------------------|----------------------------|----------------------------|
| SAS, SATA, SCSI, IDE, USB | /dev/sda; /dev/sdb; /dev/sdc; ...... |                           |
| NVMeプロトコルのディスク | /dev/nvme0n1; /dev/nvme0n2; /dev/nvme0n3; ...... |                           |
| 仮想ディスク       | /dev/vda; /dev/vdb; /dev/xvda; /dev/xvdb; ...... |                           |

### ハードディスクの追加（再起動せずに認識）
```shell
[root@rocky86 ~]# echo '- - -' > /sys/class/scsi_host/host0/scan 
[root@rocky86 ~]# echo '- - -' > /sys/class/scsi_host/host1/scan 
[root@rocky86 ~]# echo '- - -' > /sys/class/scsi_host/host2/scan
```
## 1.2 ハードディスクの種類

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3515709/614f9400-1b3d-7558-9091-f73340ccf0f1.png)

### ハードディスクインターフェースの種類
- IDE：133MB/s、並列インターフェース、初期の家庭用パソコン
- SCSI：640MB/s、並列インターフェース、初期のサーバー
- SATA：6Gbps、SATAデータポートと電源ポートが分かれている、つまり2本のケーブルが必要（1本はデータケーブル、もう1本は電源ケーブル）
- SAS：6Gbps、SASは1本のケーブルでデータポートと電源ポートが一体化されている。SASには電源線が含まれていますが、SATAには含まれていません。SATA標準はSAS標準のサブセットであり、互換性があります。SATAハードディスクはSASマザーボードに接続できますが、その逆はできません。
- USB：480MB/s
- M.2：

注意：速度は単純なインターフェースタイプによって決まるわけではなく、Nvmeプロトコルをサポートするハードディスクの速度が最も速いです。

### サーバーハードディスクのサイズ
- LFF：3.5インチ、一般的に見られるデスクトップハードディスクのサイズ
- SFF：Small Form Factor（小形状因数）、2.5インチ、ノートパソコンの2.5インチハードディスクとは異なる点に注意
LとSはそれぞれ大きい、小さいを意味し、現在のサーバーやディスクエンクロージャーは主にSFF規格のハードディスクを採用しています。これは、単位密度内のディスク容量を増大させ、冷却性を強化し、消費電力を減少させるためです。

## 1.3 メカニカルハードディスクとソリッドステートドライブ

### メカニカルハードディスク（HDD）
- Hard Disk Drive、つまり従来の通常のハードディスク。
- 主な構成要素：ディスク、磁気ヘッド、ディスクスピンドルとコントロールモーター、磁気ヘッドコントローラー、データコンバーター、インターフェース、キャッシュなど。
- すべてのディスクは1本の回転軸に装着され、各ディスクは平行に配置されています。各ディスクの記憶面には1つの磁気ヘッドがあり、磁気ヘッドとディスクの間の距離は髪の毛の直径よりも小さいです。すべての磁気ヘッドは1つの磁気ヘッドコントローラーに接続され、磁気ヘッドコントローラーが各磁気ヘッドの動きを制御します。
- 磁気ヘッドはディスクの半径方向に動き、ディスクは毎分数千回転する高速で回転するため、磁気ヘッドはディスク上の指定位置に位置してデータの読み書きを行います。
- データは磁気ヘッドを通じて電磁流により極性を変えることでディスクに書き込まれ、逆の方法で読み取られます。
- ハードディスクは精密機器であり、内部に入る空気は必ずフィルターを通す必要があります。

### ソリッドステートドライブ（SSD）
- Solid State Drive、固体電子記憶チップアレイで作られたハードディスク。
- 構成要素：コントロールユニットと記憶ユニット（FLASHチップ、DRAMチップ）。
- インターフェースの規格と定義、機能、使用方法は通常のハードディスクと全く同じで、外観と寸法も通常のハードディスクと一致しています。

### HDDとSSD
- HDDと比較して、SSDは防震耐衝撃性、転送速度、消費電力、重量、騒音において明らかな利点があります。SSDの転送速度はHDDの2倍です。
- SSDと比較して、HDDは価格と容量において絶対的な利点があります。
- ハードディスクには価格があり、データには価格がありません。現時点では、SSDが完全にHDDを置き換えることはできません。

### メカニカルハードディスクの構造

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3515709/a12e897f-cf5e-92a2-49a1-9b601bcff5b3.png)


## 1.4 ハードディスクのストレージ用語

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3515709/492cf4aa-6bea-f8df-ee8b-5568f6345360.png) ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3515709/aa7ab9f5-ccfb-c526-531c-ec8190073bcd.png)


### ハードディスクのストレージ用語 CHS

| 用語   | 英語   | 説明                                                                                       |
|--------|--------|--------------------------------------------------------------------------------------------|
| 磁頭   | head   | 1つのディスク面に対応する1つの磁頭                                                          |
| トラック | track  | ディスク面上の1周ごとに1つのトラックが存在する                                                |
| セクタ | sector | 各トラックを512バイト単位で分割したものがセクタであり、各トラックのセクタ数は異なる               |
| シリンダ | cylinder | 磁頭は一緒に動くため、6つのディスク面がある場合、6つの磁頭に対応するトラックが一致する。これがシリンダ |

CentOS7以降では、セクタ情報のみが表示される
CentOS 5以前のバージョンのLinuxでは、シリンダの整数倍でパーティションを分割していましたが、CentOS 6以降はセクタ単位でパーティションを分割することができます

#### 例：CHS情報の確認
Rocky8.6ではデフォルトでセクタ情報のみが表示されます
```bash
[root@rocky86 ~]# fdisk -l /dev/sda
Disk /dev/sda: 200 GiB, 214748364800 bytes, 419430400 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
Disklabel type: dos
Disk identifier: 0x3475e2b0

Device     Boot   Start       End   Sectors Size Id Type
/dev/sda1 *       2048   2099199   2097152   1G 83 Linux
/dev/sda2       2099200 419430399 417331200 199G 8e Linux LVM
```

パラメータを追加すると、より詳細な情報が表示されます
```bash
[root@rocky86 ~]# fdisk -u=cylinder -l /dev/sda
Disk /dev/sda: 200 GiB, 214748364800 bytes, 419430400 sectors
Geometry: 255 heads, 2 sectors/track, 26108 cylinders
Units: cylinders of 510 * 512 = 261120 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x3475e2b0

Device     Boot Start   End Cylinders Size Id Type
/dev/sda1 *        5   4117      4113   1G 83 Linux
/dev/sda2        4117 822413    818297 199G 8e Linux LVM
```

CentOS6ではデフォルトで詳細情報が表示されます
```bash
[root@centos6 ~]# fdisk -l /dev/sda
Disk /dev/sda: 214.7 GB, 214748364800 bytes
255 heads, 63 sectors/track, 26108 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x0006fc79

   Device Boot     Start         End     Blocks   Id System
/dev/sda1   *           1         131     1048576   83 Linux
Partition 1 does not end on cylinder boundary.
/dev/sda2             131       12879   102400000   83 Linux
/dev/sda3           12879       19253    51200000   83 Linux
/dev/sda4           19253       26109    55065600    5 Extended
/dev/sda5           19254       19515     2097152   82 Linux swap / Solaris
```

#### 例：SSDとメカニカルハードディスクの識別方法
- 1はメカニカル、0はSSDを示します
```bash
[root@rocky86 ~]# lsblk -d -o name,rota
NAME   ROTA
sda        1
sr0        1
nvme0n1    0
nvme0n2    0

[root@rocky86 ~]# ls /sys/block/
nvme0n1 nvme0n2 sda sr0

[root@rocky86 ~]# cat /sys/block/*/queue/rotational
0
0
1
1

[root@rocky86 ~]# cat /sys/block/sda/queue/rotational 
1
```

#### 速度測定
```bash
[root@ubuntu1804 ~]# dd | hdparm -t /dev/sda 
/dev/sda:
 Timing buffered disk reads: 1854 MB in  3.00 seconds = 617.80 MB/sec
```

### 1.4.1 ZBR（ゾーンビットレコーディング）によるディスクセクタ構造

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3515709/8260744e-1e51-7346-e250-06d5d728eb57.png)


#### ディスク上のアドレッシングの2つの方式

1. CHS
- CHSは24ビットアドレッシングを採用します。
- 前10ビットがシリンダを、中間の8ビットがヘッドを、後ろの6ビットがセクタを示します。
- 最大アドレッシング空間は8 GBです。

2. LBA（論理ブロックアドレッシング）
- LBAは整数で、CHSフォーマットに変換されて具体的なディスクアドレッシングが行われます。
- ATA-1規格で28ビットアドレッシングが定義されており、1セクタ512バイト単位で計算すると、ATA-1で定義される28ビットLBAの上限は128 GiBです。2002年にはATA-6規格で48ビットLBAが採用され、同じく1セクタ512バイト単位で計算すると、容量上限は128ペタバイトに達します。

CHSアドレッシング方式のアドレッシング空間は約8GB以内なので、ディスク容量が約8GB未満の場合、CHSアドレッシング方式またはLBAアドレッシング方式のどちらも使用できますが、ディスク容量が約8GBを超える場合は、LBAアドレッシング方式のみ使用できます。