LPIC 勉強記録 第4章 ファイルシステムの管理

#第4章 ファイルシステムの管理

`FHS(Filesystem Hierarchy Standard)`は、ディレクトリ構造の標準を定めた仕様書
FHSでは、ディレクトリ名のほか、各ディレクトリの役割や、格納するファイルの種類、コマンドの配置などについても示されている

`FHS`では、`/dev`以下にデバイスファイルを配置する
システム起動時に接続されているデバイスがチェックされ、自動的に作成される
FHSは`ルート(/)`を起点とした単一のツリー構造であり、/以下に目的に応じたディレクトリ階層が配置される

| 主なディレクトリ | 説明 | 
|:----------|:----------|
|/dev|デバイスファイルを配置。システム起動時に接続されているデバイスがチェックされ、自動的に作成される|
|/lib|/binや/sbinなどに置かれたコマンドやプログラムが利用する共有ライブラリが配置|
|/lib64|64bit用の共有ライブラリが配置|
|/boot|システム起動時に必要なブートローダ関連のファイルや、カーネルイメージが配置|
|/usr|ユーザが共有するデータが配置。ユーティリティ、ライブラリ、コマンドなどが配置|
|/usr/bin|一般ユーザ、管理者が使用するコマンドが配置|
|/usr/local|Linuxインストール後、追加でインストールしたパッケージ(ソフトウェア)が配置。このディレクトリ以下には、bin、sbin、libなどのディレクトリが配置される|
|/usr/sbin|システム管理者のみ実行できるコマンドが配置|
|/home|ユーザのホームディレクトリが配置|

独自に作成したローカルホストにインストールするプログラムは、`FHS`に従い、一般的に`/usr/local/binディレクトリ`に配置する

1台の物理的なディスクを複数の領域に分割し、それぞれの領域を独立した論理的なディスクとして扱えるようにする操作が`パーティショニング`
分割された領域を`パーティション`と呼ぶ
パーティションを分けることで、パーティション単位の効率的なバックアップや、ファイルシステム単位での障害修復が可能となる

| 主なパーティション | 説明 | 
|:----------|:----------|
|/homeパーティション|ユーザのホームディレクトリ(可変データ)を配置。容量が大きくなりやすく、バックアップ頻度も高いため、独立したパーティションにする場合が多い|
|/optパーティション|Linuxをインストール後、追加でインストールしたパッケージ(ソフトウェア)を配置するため、容量の大きなパッケージを入れる可能性がある場合、独立したパーティションにする|
|/varパーティション|システム運用中にサイズが変化するファイル(可変データ)を配置。急激なファイルサイズの増大によるディスクフルなどの危険性を考慮し、独立したパーティションにする場合が多い|
|/tmpパーティション|誰でも読み書き可能な共有データを配置。一般ユーザの利用の仕方による危険性を考慮し、独立したパーティションにする場合が多い|
|swapパーティション|実メモリに入りきらないプロセスを退避させる領域。swapは、パーティションもしくはファイルで確保する方法がある|

`LVM(Logical Volume Manager)`は、複数のディスクパーティションからなる、パーティションの制限を受けない伸縮可能な`論理ボリューム(LV)`を構成する

`ボリューム(volume)`とは、プログラムやデータを格納する単位となる領域のこと
ハードディスクのパーティションは、`pvcreateコマンド`を実行することで、`LVM`の物理ボリュームになる

`LVM`の論理ボリュームは、`物理エクステント`と呼ばれる小さな単位から構成されるため、物理エクステントの個数の増減により`論理ボリューム`のサイズの伸縮が可能

論理ボリュームの`スナップショット`は、実行した時点での元データの状態を取得し、その後に更新されたデータのみを保存する
`スナップショット`実行の時点では、元データを参照する情報のみの取得であるため、瞬時に実行できる
元データをコピーするわけではないので、バックアップとは異なる

`/var`には、システムの運用中にサイズが変化するファイルを格納する
`ログファイル`は、一般的には`/var/log`ディレクトリに配置されるが、ディストリビューションや使用するアプリケーションによって異なる
`/varディレクトリ`以下は、日々ファイルサイズが増えるファイルが数多く配置されるため、ディスクの使用状況を定期的に確認する必要がある

`デバイスファイル`は、`デバイス(周辺機器)`を操作するためのファイル
デバイスを追加すると、`/dev`以下に検出されたデバイスへアクセスするためのデバイスファイルが作成される

ハードディスクには、`SCSI`、`SATA`、`IDE/ATA(PATA)`、`USB`など、いくつかの規格がある
`SATA`、`IDE/ATA(PATA)`、`USB`の場合は、カーネル内の`SCSIサブシステム`の`SCSIエミュレーション`により、デバイスファイル名はSCSIと同じく、`/dev/sd◯`として作成され、◯には、1台目からa、b、c、・・・と付与される
SATAディスクの場合は、1本のSATAケーブルでコントローラ上のポートと接続する
1番目のSATAディスクは`/dev/sda`、2番目のSATAディスクは`/dev/sdb`となる

SATAディスクの接続ポートや`SCSIエミュレーション`の情報は、`lsscsiコマンド`や`lshwコマンド`で表示できる

| 種類 | 説明 | 
|:----------|:----------|
|基本パーティション|1台のディスクに必ず1つ以上存在するパーティション。最大で4つ作成することができ、1〜4までの番号が割り当てられる|
|拡張パーティション|基本パーティションのうち、1つのみ拡張パーティションとして使用可能。直接ファイルシステムを作成するのではなく、論理パーティションを作成するために使用される|
|論理パーティション|拡張パーティションの中に複数作成することができるパーティション。パーティション番号は5以上が割り当てられる|

`ハードディスクの新規追加手順`
1. ハードディスクをマシンに接続する
2. 追加したハードディスクのデバイスファイルが作成されていることを確認する
3. パーティションをいくつに分けるか検討する
4. ハードディスクにパーティションを作成する
5. 各パーティションにファイルシステムを作成する
6. 作成したファイルシステムをディレクトリツリーにマウントする

`fdiskコマンド`はパーティションの作成、削除、変更、情報の表示が可能
このコマンドを実行するには、root権限が必要
`-lオプション`を使用すると、作成済みの`パーティションテーブル`を表示する
オプションを使用せずに実行すると、パーティションへの操作を対話しながら行うことが可能
`パーティションテーブル`とは、各パーティションのオフセットやサイズなどの情報が格納されたテーブル
ブートローダやカーネルは、`パーティションテーブル`を読み取ることで、ハードディスクのパーティションを認識する
`パーティションテーブル`はハードディスクの先頭の位置に保存されている

`GPT(GUID Partition Table)`は`MBR(Master Boot Record)`に代わるハードディスクのパーティションの規格であり、`EFI(Extensible Firmware Interface)`の機能の1つ
大容量ハードディスクに対応する規格として、インテル社が提唱した

| コマンド | パッケージ | 
|:----------|:----------|
|fdisk|標準パッケージ util-linux|
|gdisk|標準パッケージ gdisk|
|parted|標準パッケージ parted|
|gparted|EPELリポジトリのパッケージ gparted|

`fdiskコマンド`を使用してパーティションを作成した後、各パーティションにファイルシステムを作成する
パーティション内にディレクトリ階層構造を作り、データをファイルとして保存することが可能となる

`ジャーナル機能`とは、ファイルシステムのデータの更新を記録する機能
不意な電源切断があった場合など、変更履歴をチェックして管理データの再構築ができるため、ファイルシステムチェック(ファイルシステムの整合性の確認)を短縮することができる
`iノード`とは、ファイルシステムの構成要素の1つで、メタデータを格納する

| ファイルの構成要素 | 説明 | 
|:----------|:----------|
|ファイル名|ファイルに付けられている名前。ファイルにアクセスする際に使用される|
|iノード|メタデータを格納。iノードは、ファイル1つにつき、1個割り当てられる。iノードには、メタデータとしてファイルの詳細情報や実データが格納されている番地(ポインタ)が格納されている|
|データブロック|実データが格納される領域|

`iノード`には、ファイルのタイプ、パーミッション、所有者など`ls -l`で表示されるほとんどの情報と、実体へのポインタが格納されている
`ext2`、`ext3`、`ext4`は、ファイルシステムの初期化時に用意されるiノードの個数が、作成できるファイルの数の上限となる

`ntfs(NT File System)`は、Windows NT系の標準ファイルシステム
`vfat`は、LinuxとWindowsの両方で読み書き可能なファイルシステムで、LinuxとWindowsでデータを共有するためのパーティションに使用されるファイルシステム

ファイルシステムの作成(初期化)には、`mkfsコマンド`や`mke2fsコマンド`を使用する
`mkfsコマンド`の`-tオプション`の後にファイルシステムのタイプを指定し、続けてデバイスファイル名を指定する
`-tオプション`を指定しなかった場合は、`ext2ファイルシステム`を作成する
`-jオプション`を使用すると、ジャーナルが有効となり、`ext3ファイルシステム`として作成する
`-Vオプション`を付けて実行すると、実行するコマンドとオプションを確認できる

`mke2fsコマンド`で、`ext2ファイルシステム`を作成する
`-jオプション`を使用すると、ジャーナルが有効となり、`ext3ファイルシステム`として作成する

`xfsファイルシステム`の作成は、`mkfs -t xfs デバイスファイル名`もしくは`mkfs.xfs デバイスファイル名`で行う

| コマンド | 説明 | 
|:----------|:----------|
|xfs_info|引数で指定されたxfsファイルシステムに関する情報の表示。実行時は、マウントされた状態で行う|
|xfs_repair|xfsファイルシステムの修復を行う。修復の調査のみの場合は、-nオプションを使用する|
|xfs_fsr|マウントしているxfsファイルシステムのデフラグを行う|
|xfs_db|xfsファイルシステムのデバッグを行う|

スーパーユーザしか書き込めない予備領域のデフォルト値は、ファイルシステム全体の`5%`
実際の使用領域が`95%`を超えると、root権限を持つプログラム以外はディスクに書き込みができなくなる

`mkswapコマンド`は、デバイス上またはファイル上に確保されたスワップ領域の初期化を行う
スワップ領域は、専用のパーティションを割り当てることが一般的だが、特定のファイルをスワップ領域として利用することも可能

`mkswapコマンド`でスワップ領域を初期化後、`swaponコマンド`で有効にする
`swapoffコマンド`は、指定したデバイスやファイルのスワップ領域を無効にする

| コマンド | 説明 | 
|:----------|:----------|
|dfコマンド|ファイルシステムの使用状況の表示|
|duコマンド|ファイル、ディレクトリの使用容量の表示|

`dfコマンド`は、パーティションごとの使用状況も調べることができる

| 主なオプション | 説明 | 
|:----------|:----------|
|-k|キロバイト単位で表示する|
|-h|容量に合わせた適切な単位で表示する。Mは1,048,576バイトを表す|
|-i|inodeの使用状況をリスト表示する|

`tune2fsコマンド`は、`ext2/ext3/ext4`ファイルシステムのパラメータを、適切な値に変更する
ジャーナル機能の追加は`tune2fs -j`または`tune2fs -O has_journal`コマンドで行う
マウントしたままでの追加が可能だが、一度アンマウントした後に、再マウントして有効となる
ジャーナル機能の削除はアンマウントしてから、`tune2fs -O ^has_journal`コマンドで行う

| 主なオプション | 説明 | 
|:----------|:----------|
|-i [d｜m｜w]|ファイルシステムをチェックする最大の時間間隔を設定する。数値のみ、もしくは末尾にdを付けると「日」と解釈され、mは「月」、wは「週」と解釈される|
|-j|ext3ジャーナルをファイルシステムに追加する|
|-l|ファイルシステムのスーパーブロックの内容を表示する|
|-O 追加機能|has_journalなど、追加する機能を指定。先頭に^を付けると機能削除|

`dumpe2fsコマンド`は、ファイルシステムの詳細情報を表示する
`tune2fs -l`で表示したスーパーブロックの内容に加え、ブロックグループに関する情報も表示する

`fsckコマンド`は、ファイルシステムの不整合をチェックし、必要であれば修正する
対象のファイルシステムに適したチェックプログラムが呼び出される
`ext2`、`ext3`、`ext4`ファイルシステムの場合、`e2fsckコマンド`が実行される
なお、`e2fsck`、`fsck.ext2`、`fsck.ext3`、`fsck.ext4`はハードリンク(あるいはシンボリックリンク)された同じプログラム
デフォルトの動作として、`/etc/fstab`に書かれているファイルシステムを逐次的にチェックする

`debugfsコマンド`は、`ext2/ext3/ext4ファイルシステム`の対話的なデバッガツール
ファイルシステムの状態の調査・変更を行うことができる

`マウント`とは、あるディレクトリにファイルシステムのルートディレクトリを接続する作業のこと
ファイルシステムをマウントするには、接続するディレクトリ(`マウントポイント`)を事前に作成し、`mountコマンド`を実行する

| 主なオプション | 説明 | 
|:----------|:----------|
|-a|/etc/fstabファイルに記載されているファイルシステムをすべてマウントする|
|--bind|サブツリーをどこか他の場所に再マウントする|

Linuxでは、デバイス(周辺機器)を`デバイスファイル`として管理している
デバイスファイルのうち、ブロック単位でデータを転送するものを、`ブロックデバイス`と呼ぶ

`lsblkコマンド`は、利用可能なブロックデバイスの一覧を表示する
デバイス名(NAME)や、デバイスのマウント先(MOUNTPOINT)を表示する

`blkidコマンド`は、利用可能なブロックデバイスに関する情報を表示する
UUID、ファイルシステムのタイプ、ボリュームラベルなどの属性を表示する

特定のファイルシステムをルートファイルシステムから切り離す(`アンマウント`する)には、`umountコマンド`を使用する
アンマウントすると、そのファイルシステムに存在するファイルやディレクトリに、ルートファイルシステムからアクセスできない

`/etc/fstabファイル`には、デバイスとマウントポイント、ファイルシステム、マウント時に指定するオプションなど`mountコマンド`の実行に必要な情報を記述する
1. デバイスファイル名(ファイルシステム、もしくはラベル名)
2. マウントポイント
3. ファイルシステムの種類
4. マウントオプション
5. バックアップの指定
6. ファイルシステムのチェック
の6つの項目を持つ
第1フィールドには、デバイスファイル名の他、UUID(Universally Unique Identifier)と呼ばれるデバイスの一意な識別子と、LABEL(任意で命名できる名前)の指定が可能
`マウントオプション`は、どのような設定でマウントするかを指定する
マウントオプションに`user`を指定すると、一般ユーザもマウントが可能となる
`mount -a`を実行すると、`/etc/fstabファイル`内のオプションフィールドが`auto`のエントリをすべてマウントする

`ext2/ext3/ext4ファイルシステム`の起動時には、`/etc/fstab`に登録されたファイルシステムの`cleanフラッグ`をチェックし、フラッグが立っている場合は、`fsck`は実行されない
`cleanフラッグ`が立っている場合でも、軽微な不整合が生じている場合があり、`fsck`に`fオプション`を付けることで、`fsck`を実行できる
`cleanフラッグ`が立っていない場合は、`fsck`が実行される
`xfs`はシステム起動時にチェックまたは修復は行わない
修復を行う場合は、`xfs_repairコマンド`を実行する

現在マウントされているファイルシステムとマウントオプションを調べるには、引数を付けずに`mountコマンド`を実行する
または`/proc/mountsファイル`と`/proc/self/mountsファイル`にも、現在のマウント状態が格納されている

#終わりに
3周目終了
この章は全然頭に入ってこないな〜