Linuxのハードディスク、パーティション、ファイルシステムの管理

## Linuxでハードディスクを使用するための手順
Linuxでハードディスクを使用するには以下の手順で設定する必要があります。1,2はカーネルによって自動で行われるので作成されたデバイスファイルの確認から見ていきます。

1.ハードウェアを接続してカーネルがデバイスを認識
2.ハードディスクのデバイスファイルが/dev配下に作成される（カーネルがハードウェアを認識した際に自動的に作成される）
3.ハードディスクにパーティションを作成
4.パーティションにファイルシステムを作成
5.ファイルシステムをマウントする

## デバイスファイルの確認
カーネルがハードウェアを認識した時に自動で/dev配下にデバイスファイルが作成されます。デバイスファイルはudevという仕組みによって作成されます。

udevの仕組みではデバイスが接続されるとカーネルがそれを検知して/sysディレクトリ配下にデバイス情報を作成します。udevデーモン(udevd)はそのデバイス情報を参照して/devディレクトリにデバイスファイルが作成されます。
その際にメインの設定ファイル「/etc/udev/udev.conf」と個別の設定ファイル「/etc/udev/rules.d」が使用されます。

| デバイスファイル | 説明 |
|------------------|------|
| `/dev/sda`       | 第一ハードディスクのブロックデバイス。 |
| `/dev/sda1`      | 第一ハードディスクの最初のパーティション。 |
| `/dev/ttyS0`     | 第一シリアルポートのキャラクタデバイス。 |
| `/dev/random`    | ランダムデータ生成デバイス。 |
| `/dev/null`      | データを捨てるデバイス。 |
| `/dev/zero`      | ゼロデータ生成デバイス。 |
| `/dev/sr0`       | 第一CD/DVDドライブのブロックデバイス。 |
| `/dev/fb0`       | 第一フレームバッファデバイス。 |


## デバイスドライバ
デバイスを使用するために必要な制御プログラムのことをデバイスドライバといいます。Linuxではデバイスドライバはカーネルモジュールとしてカーネルに組み込まれています。デバイスドライバをカーネルに組み込むことを「ロードする」といいます。

### lsmod

lsmodでロードされているカーネルモジュールを表示します。

```
[ec2-user@ip-192-168-0-48 ~]$ lsmod
Module                  Size  Used by
nls_ascii              16384  1
sunrpc                692224  1
nls_cp437              20480  1
vfat                   24576  1
```

## modprobe 
デバイスドライバは自動でロードされますが、手動でロードする場合はmodprobeコマンドを使用します。

modprobeを使用するとカーネルモジュールどうしの依存関係を自動的に解決してくれます。


ハードディスクやSSDなどのストレージは、複数の論理的な区画（パーティション）に分割して使用します。パーティションはOSがBIOSとUEFIどちらを搭載しているかによって種類が異なります。

### パーティションにはMBRとGPTの2つ規格がある
OSがBIOSの場合は基本的にMBR（BIOSでもGPTのこともある）、UEFIの場合はGPTを採用しています。

| 特徴                     | MBR（Master Boot Record）                               | GPT（GUID Partition Table）                                 |
|--------------------------|----------------------------------------------------------|-------------------------------------------------------------|
| **最大パーティション数** | 4つのプライマリパーティション（拡張パーティション内に複数の論理パーティションを作成可能） | ほぼ無制限（通常128個まで設定可能）                        |
| **最大ディスクサイズ**   | 2TB                                                      | 理論上、8 ZB（ゼタバイト）                                   |
| **互換性**               | 古いシステムおよびBIOSベースのシステムで広くサポート       | UEFIシステムで標準。BIOSとも組み合わせ可能（特別な設定が必要） |
| **冗長性**               | なし                                                      | パーティションテーブルをディスクの先頭と末尾に格納し、冗長性を提供 |
| **データ整合性チェック** | なし                                                      | CRC32チェックサムを使用                                       |
| **ディスク構造**         | ブートストラップコード、ディスクパーティションテーブル、ディスクシグネチャ | プライマリヘッダー、パーティションエントリーアレイ、バックアップヘッダー |
| **ブートパーティション** | 必要なし                                                   | BIOSブートパーティション（BIOSと組み合わせる場合）           |
| **パーティションID**     | プライマリパーティションごとに1バイトのタイプコード       | 各パーティションに128ビットのGUID                            |
| **ツール互換性**         | 古いツールやシステムで広くサポート                       | 最新のツールやシステムでサポート                             |
| **セキュリティ**         | なし                                                      | パーティションエントリに属性フラグを追加可能（例：読み取り専用、非表示など） |

### ファームウェアとは
ハードウェアデバイスに組み込まれているソフトウェアの一種で、デバイスの基本的な動作を制御する役割を果たします。ファームウェアは、デバイスのROM（Read-Only Memory）やフラッシュメモリに格納されています。

#### BIOSとUEFI
BIOSはパソコンの電源が入ってから最初に動き、OSの読み込みや、主にハードウェアを制御するプログラムです。現在は後継となるUEFI（Unified Extensible Firmware Interface）が主流となっています。

ファームウェアどちらを使用しているかは以下コマンドでブートメッセージを確認することで確認可能。

```
dmesg | grep -i "efi\|bios"
```

#### BIOSとUEFIの違い
2つのファームウェアの違いとして以下があります。細かい違いはもっとありますが、とりあえずは以下の違いを理解しておけば十分かと思います。


* **インターフェース：** BIOSはテキストベースのインターフェースを持ちますが、UEFIはグラフィカルインターフェースを提供します。
* **ディスクのパーティション形式 :** BIOSはMBRを使用し2TBまでのディスクサイズに制限されますが、UEFIはGPTを使用し、それ以上のサイズをサポートします。

### LVMとは

#### パーティションの確認コマンド

まずはパーティションを確認する必要があります。パーティションを確認するコマンドは複数あります。
**・lsblk：** 認識されているデバイスの一覧を表示

```
sh-4.2$ lsblk
NAME    MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
xvda    202:0    0   8G  0 disk
└─xvda1 202:1    0   8G  0 part /
```

### パーティションの作成

**・fdisk：** パーティションの作成、削除、変更、情報表示を行うコマンド。パーティションを確認するには-lコマンドを指定する。もともとはMBR専用でしたがGPTにも対応しています。

```
sh-4.2$ sudo fdisk -l
Disk /dev/xvda: 8 GiB, 8589934592 bytes, 16777216 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: gpt
Disk identifier: 3479DB6B-26DF-4EE4-A40E-14C759434212

Device       Start      End  Sectors Size Type
/dev/xvda1    4096 16777182 16773087   8G Linux filesystem
/dev/xvda128  2048     4095     2048   1M BIOS boot

Partition table entries are not in disk order.
```

**・parted：** MBRにもGPTにも対応したパーティション操作コマンドです。
partedで確認するには対象となるディスクデバイスを指定します。

```
sh-4.2$ sudo parted /dev/xvda
GNU Parted 3.1
Using /dev/xvda
Welcome to GNU Parted! Type 'help' to view a list of commands.
(parted) print
Model: Xen Virtual Block Device (xvd)
Disk /dev/xvda: 8590MB
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Disk Flags:

Number  Start   End     Size    File system  Name                 Flags
128     1049kB  2097kB  1049kB               BIOS Boot Partition  bios_grub
 1      2097kB  8590MB  8588MB  xfs          Linux
```


### パーティションの拡張にオススメのコマンド
growpart
AWSの公式ドキュメントで推奨されており、EBSのパーティション拡張で使うコマンドです。AWS以外の環境でもインストールすれば簡単に使用することが可能です。指定されたパーティションをディスク上の未使用領域に対して最大限まで拡張します。ファイルシステムは拡張されないので別途コマンドで拡張する必要があります。

## パーティションにファイルシステムを作成
パーティションを作成したら、作成したパーティションの中にファイルシステムを作成します。まずはファイルシステムの種類から見ていきましょう。

### ファイルシステムの種類

| ファイルシステム種類 | 特徴 |
|-----------------------|------|
| **ext4**              | - Linuxで広く使われている<br>- 大容量ファイルやパーティションのサポート<br>- 高速なファイルアクセス |
| **xfs**               | - 高性能で大容量データに最適<br>- 並列処理に強い<br>- スナップショットやクローン作成が可能 |
| **btrfs**             | - 高度な機能を持つ次世代ファイルシステム<br>- スナップショット、クローン、圧縮サポート<br>- RAIDサポート、データ整合性チェック |

### ファイルシステムの作成

mkfs（make file system）コマンド
パーミッション上にファイルシステムを作成します。ファイルシステムを-tオプションで指定することで様々なファイルシステムを作成できます。

```
mkfs -t <ファイルシステム> <オプション> <デバイスファイル名>
```

以下の例ではファイルシステムを/dev/sdb1に作成します

```
mkfs -t ext4 /dev/sdb1
```

## ファイルシステムをマウントする
あるファイルシステムに別のファイルシステムを組み込んで、全体として１つのファイルシステムとして扱えるようにすることをマウントといいます。マウントしたファイルシステムが結合されるディレクトリのことをマウントポイントといいます。

### mountコマンド

### umountコマンド

参考記事

https://qiita.com/kakkie/items/8f960f2dc5eb6e591d9d

https://zenn.dev/headwaters/articles/629d631d1afe1f

https://qiita.com/ss12345/items/d0dcfc0ef2ecab65c420

https://linuc.org/study/knowledge/347/

https://linuc.org/study/knowledge/416/

https://qiita.com/kakkie/items/c4a9a2f2a9e4e802ca0b

https://qiita.com/u-bayashi/items/6bdbd36474ab70d57bb8