デバイスとLinuxファイルシステム

# ファイルシステム管理
ファイルシステムとは、ハードディスクなど外部記憶装置のデータをファイルとして管理する仕組み。ディスク上にパーティションを作成し、パーティション内にファイルシステムを作成する。

## FHS(Filesystem Hierarchy Standard)
ファイルシステム階層標準と呼ばれ標準化されている。最新バージョンは3.0

| 階層 | 説明 |
|:-:|:-:|
| /bin  | 一般ユーザーが利用できるシステム管理に必須のコマンドを格納  |
| /sbin  | システム管理者が利用する基本コマンド。基本rootユーザーのみ利用可能だが、オプションによっては一般ユーザーも利用可能  |
| /etc  | システム設定ファイルや起動スクリプトファイルを格納  |
| /dev  | デバイスファイルを格納  |
| /lib  | 共有ライブラリファイル、カーネルモジュール（デバイスファイルなど）を格納。/bin,/sbinにあるコマンドが必要となるライブラリが配置される  |
| /mnt  | マウントポイントとなるディレクトリを格納  |
| /opt  | ソフトウェアのインストール先。追加でインストールしたパッケージを格納する。あまり利用されない  |
| /boot  | Linuxカーネルなど起動に必要なファイルを格納  |
| /proc  | カーネル情報にアクセスするための仮想ファイルシステム。起動中のプロセスやカーネルが認識しているハードウェアおよびシステムリソースなどの情報が格納されている  |
| /root  | rootユーザーのホームディレクトリ  |
| /home  | 一般ユーザーのホームディレクトリ  |
| /tmp  | 一時ファイル置き場  |
| /var  | ログファイルなど頻繁に更新されるファイル  |
| /var/cache  | 一時的なキャッシュファイルを格納  |
| /var/log  | ログファイルを格納  |
| /usr  | システム起動時には必要とされないコマンドを格納。プログラムやソフトウェア、ライブラリなどを格納  |
|   /usr/bin  | 一般ユーザーコマンド（緊急時のシステム管理に必須でない）を格納  |
|   /usr/sbin  | システム起動時には必要とされない管理者コマンド（緊急時のシステム管理に必須でない）を格納  |
|   /usr/lib  | 共有ライブラリを格納  |
|   /usr/local  | ホスト固有で使用するプログラムや設定ファイルを格納する  |
|   /usr/local/bin  | 配下にブログラムを格納する  |
|   /usr/local/etc  | 配下に設定ファイルを格納する  |
|   /usr/share  | システムアーキテクチャに依存しないファイルやドキュメントを格納  |
|   /usr/src  | プログラムのソースコードを格納  |


## デバイスファイル
デバイスを表すファイルのこと。デバイスファイルは`/dev`ディレクトリ以下に配置される。これらのデバイスファイルは、udevという仕組みによって自動的に作成される

Linuxカーネルが認識しているデバイスに関する情報の一部は、`/proc`ディレクトリ以下のファイルで確認できる。これらはファイルとして実体がない仮想的なファイルで、一部のファイルはテキストファイルとして閲覧可能

| ファイル名 | 説明 |
|:-:|:-:|
| /proc/cpuinfo  | CPU情報  |
| /proc/interrupts  | IRQ情報  |
| /proc/ioports  | I/Oアドレス情報  |
| /proc/meminfo  | メモリ情報  |
| /proc/bus/usb/*  | USBデバイス情報  |
| /proc/bus/pci/*  | PCIデバイス情報  |

### lsblk(List Block Devices)コマンド
**書式：lsblk**
システムのブロックデバイス一覧を表示するコマンド。

+ **ブロックデバイス**
ハードディスクやSSDなどメディア上の任意の場所にアクセスできるデバイスのこと

+ **キャラクタデバイス**
キーボードやシリアルポートなど文字単位でデータを読み書きできるデバイスのこと

::: note info
デバイスファイルのうち、ブロック単位でデータを転送するデバイスのこと。
:::


## exFAT(Extended FAT)ファイルシステム
USBメモリのようなフラッシュドライブ向けで、マイクロソフトが開発したプロプライエタリな(私有の)ファイルシステム。「開発者によりプログラムやソースコードの利用に際して、秘密保持契約や利用料の支払いが必要などの制限がかけられている」ことを意味する。
Linuxで使用するにFUSE（Filesystem in Userspace）が必要
理論上では16EiBの大容量のファイルを扱え、最大ボリュームサイズも拡張されている


### ルートファイルシステム
Linuxのディレクトリはツリー状の階層構造になっており、/ディレクトリを含むファイルシステムのこと。
`/bin`,`/sbin`,`/etc`,`/lib`,`dev`ディレクトリがシステム起動に必要となる

![キャプチャ1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3238179/ae7457da-0ba0-02b7-8d02-bd281e8e5dcd.png)


## ファイルシステムの作成
パーティションを作成しただけではその中にファイルを保存することはできない。データを管理できるようにするにはファイルシステムを作成する必要があり、OSによって種類が異なってくる。

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

| ファイルシステム | 説明 |
|:-:|:-:|
| ext2（extended file system2）  | 一昔前のLinux標準ファイルシステム  |
| ext3  | ext2を改良し機能強化したファイルシステム  |
| ext4  | ext3を改良したファイルシステムで、現在の標準ファイルシステム  |
| XFS（Extents File System）  | SGI社が開発した、高速かつ堅牢なファイルシステム  |
| Btrfs（B-tree file system）  | Linux向けに開発されている高速かつ多機能なファイルシステム  |
| NTFS  | Windowsのファイルシステム  |
| FAT  | デジカメなどでよく使われているファイルシステム  |
| ISO9660  | CD-ROMで使われているファイルシステム  |
| UDF  | DVDで使われているファイルシステム  |

::: note warn
**ext2,ext3,ext4はinode番号の数に制限がある**。inodeはファイルシステム作成時に作成され、増やすことはできない。inode番号がなくなった場合、ディスクに空き容量があってもファイルを新規に作成できなくなる。
:::

### mkfs(make filesystem)コマンド
**書式：mkfs [-t ファイルシステム] デバイスファイル名**
ファイルシステムを作成するためのコマンドで、rootユーザーのみ実行可能。ファイルシステムの種類を指定する場合は「-t」で指定する。**オプション指定がない場合はext2ファイルシステムが作成**される

| オプション | 説明 |
|:-:|:-:|
| -t ファイルシステムタイプ  | ファイルシステムの種類を指定する  |
| -j  | ext3ファイルシステムを作成する  |
| -c | 実行前に不良ブロックを検査する  |


~~~ md
#ext4ファイルシステムの作成
# mkfs -t ext4 /dev/sda5
~~~

::: note warn
ファイルシステムの作成は「**フォーマット(初期化)する**」を意味しているため、実行すると記録されているデータは失われる。
:::

### mke2fsコマンド
**書式：mke2fs [オプション]デバイスファイル名**
ext2,ext3,ext4ファイルシステムを作成する際に使用する。デフォルトではext2を作成する。

| オプション | 説明 |
|:-:|:-:|
| -t ファイルシステムタイプ  | ファイルシステムの種類を指定する  |
| -j  | ext3ファイルシステムを作成する  |
| -c | 実行前に不良ブロックを検査する  |

### mkfs.btrfsコマンド
**書式：mkfs.btrfs デバイス名**
Btrfsを作成するコマンド

::: note info
**・Btrfs(B-tree file system)とは？？**
Linux向けの新しいファイルシステムで、耐障害性にすぐれ、先進的な機能が取り込まれている

+ ストレージプール
複数の物理ボリューム(パーティションやディスク)をまとめて1つの仮想的なボリュームを作成することができる

+ マルチデバイスファイルシステム
複数の物理ボリュームにまたがってファイルシステムの作成が可能

+ スナップショットの作成
+ ファイルシステムを分割したサブボリュームの活用

:::

### mkswapコマンド
**書式：mkswap デバイス名**
パーティション上にスワップ領域を作成する。

::: note info
 **・スワップ領域とは？？**
物理メモリが不足した際に仮想メモリ領域として利用するパーティションのこと。割り当てる容量の目安は物理メモリの1~2倍。
:::

## ディスクの利用状況の確認

### df(Disk Free)コマンド
**書式：df [オプション][デバイス名やディレクトリ名]**
ファイルシステムの空き容量を確認するコマンド。引数なしで使用すると、マウントされているすべてのファイルシステムの使用状況を表示する

| オプション | 説明 |
|:-:|:-:|
| -h  | human readableの略。容量を適当な単位で表示する(Mは1048576バイト)  |
| -H  | 容量を適当な単位で表示する(Mは1000000バイト)  |
| -k  | 容量をKB単位で表示する  |
| -l  | iノードの使用状況を表示する  |

::: note warn
作成できるiノードの数は、ファイルシステム作成時に設定され、後から追加・変更することはできない。枯渇してしまうと、空き容量があったとしてもファイルを新規に保存することが出来なくなる。
:::

### du(Disk Usage)コマンド
**書式：du [オプション][デバイス名やディレクトリ名]**
ファイルやディレクトリが占めている容量を表示するコマンド。

| オプション | 説明 |
|:-:|:-:|
| -a（--all）  | ディレクトリ以外にファイルについても表示する  |
| -l  | リンクも含めて集計する  |
| -c  | 全ての容量の合計を表示する  |
| -k  | 容量をKB単位で表示する  |
| -m  | 容量をMB単位で表示する  |
| -s(--summarize)  | 指定したファイルやディレクトリのみの合計を表示する  |
| -S(--separate-dirs)  | サブディレクトリを含めずに集計する  |
| -h(--human-readable)  | 容量を読みやすい単位で表示する  |


## ファイルシステムのチェック
ext2,ext3.ext4ファイルシステムでは、デフォルトで**ファイルシステム全体の5％分**の領域がrootユーザー用の予約領域として確保される。一般ユーザーのプロセスがファイルシステムの領域を全て使い切ってしまっても、rootユーザーの権限で実行するsyslogdなどのプログラムがファイルシステムに書き込みできるようにする目的で使用される。

### fsck(File System Check)コマンド
**書式:fsck [オプション] デバイス名**
ディスクのチェックを行い、必要であれば修復を試みることが出来る。チェックと修復は、ファイルシステムを破壊してしまう可能性があるので必ずアンマウントした状態で行う。

| オプション | 説明 |
|:-:|:-:|
| -t ファイルシステム名  | ファイルシステムの種類を指定する  |
| -a  | 自動的に修復を実行する  |
| -r  | 対話的に修復を実行する  |
| -A  | `/etc/fstab`に記述されている全ファイルシステムに対して実行する  |
| -N  | 実際には実行せず何が行われるかのみ表示する  |


### e2fsck(Ext2 File System Check)コマンド
**書式：e2fsck [オプション] デバイス名**
ext2,ext3.ext4ファイルシステムのチェックと修復に使用する。

| オプション | 説明 |
|:-:|:-:|
| -p  | 全ての不良ブロックを自動的に修復する  |
| -y  | 問い合わせに対して自動的に「yes」と回答する  |
| -n  | 問い合わせに対して自動的に「no」と回答する  |


### tune2fs(Tune Ext2 File System)コマンド
**書式：tune2fs [オプション] デバイス名**
ext2,ext3.ext4ファイルシステムの様々なパラメーターを設定する

| オプション | 説明 |
|:-:|:-:|
| -c 回数  | e2fsckコマンドでファイルシステムのチェックを行うまでの最大マウント回数を指定  |
| -i 時間[d,m,w]]  | e2fsckコマンドでファイルシステムのチェックを行うまでの最大時間間隔を指定。時間のみまたはdを付けると「日」、mを付けると「月」、wを付けると「週」  |
| -j  | ext2をext3ファイルシステムに変換  |
| -L ラベル名  | ファイルシステムのボリュームラベルを設定  |


### dumpe2fsコマンド
**書式：dumpe2fs [オプション] デバイスファイル名**
ファイルシステムの詳細情報を表示するコマンド

### debugfsコマンド
**書式：debugfs [オプション] デバイスファイル名**
ext2,ext3.ext4ファイルシステムの状態の調査・変更を行うことが出来る。デバッグをしながら修復することが出来る。


# XFS
SGI社が自社のUNIXであるIRIX用に開発した、堅固で高速なジャーナリングファイルシステム。CentOS7では標準のファイルシステムになっている。

XFSは設計上、ファイルの作成や削除を繰り返すうちにハードディスク上の連続した領域が少なくなり、データが分散されて保存される断片化（フラグメンテーション）が発生することがある。断片化が多くなるとデータの読み書きのパフォーマンスが低下するため、デフラグを行って断片化を解消する

::: note info
**・ジャーナリングファイルシステムとは？？**
ファイルシステムの操作をジャーナル（ログ）に記録する仕組みを備えたファイルシステムのこと。整合性チェックが素早く行え、障害発生時のリブート時間を短縮することが出来る
:::

| コマンド | 説明 |
|:-:|:-:|
| mkfs.xfs  | XFSファイルシステムを作成する  |
| xfs.info  | XFSファイルシステムの情報を表示する  |
| xfs_db  | XFSファイルシステムのデバッグを行う  |
| xfs_check  | XFSファイルシステムをチェックする  |
| xfs_admin  | XFSファイルシステムのパラメータを変更する  |
| xfs_fsr  | XFSファイルシステムのデフラグを行う  |
| xfs_repair  | XFSファイルシステムを修復する  |

::: note info
**・デフラグとは？？**
デフラグメンテーション（defragmentation）の略であり、ファイルの断片化（フラグメンテーション）を解消すること。断片化したデータを、可能な限り連続して配置・整理し直す。

**・フラグメンテーションとは？？**
ハードディスクで何度もデータの読み書きや消去を繰り返すうちに、1つのファイルが連続した領域に収まらず、複数の領域に分断されていくこと

![デフラグ](https://enjoy.sso.biglobe.ne.jp/wp-content/uploads/img/defragmentation_01.jpg)

:::




# マウント
全体として1つのファイルシステムとして扱えるようにすること。Linuxにはドライブという概念がなく、すべてディレクトリツリーに接ぎ木して管理する。

現在マウントされているファイルシステムの情報が格納されているファイルは「`/etc/mtab`」


![キャプチャ6.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3238179/6ca2f55f-3e35-549e-bd04-5e05aa98e6c6.png)

### /etc/fstabファイル
**書式:デバイス名 マウントポイント ファイルシステムの種類 マウントオプション dumpフラグ fsckフラグ**

**利用するファイルシステムのマウント設定を事前に行っておく設定ファイル**のこと。CD-ROM、DVDなど頻繁に利用することが予想されるデバイスについては、設定を記載することでデバイスファイル名かマウントポイントを指定するだけでマウントできるようになる。

マウントオプションに「auto」、「default」が設定されているファイルシステムはシステム起動時に自動的にマウントされる

| オプション | 説明 |
|:-:|:-:|
| auto  | 「mount -a」コマンド実行時にマウント  |
| noauto  | 「mount -a」コマンド実行時にマウントしない  |
| default  | デフォルト指定(async,auto,dev,exec,nouser,rw,suid)  |
| exec  | バイナリの実行を許可  |
| noexec  | バイナリの実行を禁止  |
| ro  | 読み取り専用  |
| rw  | 読み書きを許可  |
| user  | 一般ユーザーでもマウントを可能にする。本人のみアンマウント可  |
| users  | 一般ユーザーでもマウントを可能にし、マウントしたユーザー以外のユーザーもアンマウントできるようにする  |
| nouser  | 一般ユーザーのマウントを許可しないようにする  |


~~~ md
$ /dev/sda1 /boot ext3 defaults 1 1
$ /dev/sda1 /boot ext3 auto 1 1
~~~

#### 設定項目
`/etc/fstab`ファイルの設定項目は6つある

+ **1\.デバイス名**
「/dev/sda1」のように**デバイスファイル**を書くか、ラベル（あらかじめファイルシステムに対して付けておいた名前）や**UUID（Universally Unique Identifier: 汎用一意識別子、全世界で重複が起きないように生成される一意な値**）を使った指定を書く。
ラベルを使う場合は LABEL=/boot」のように「**LABEL=**」の後ろにラベル名を書く。

+ **2\.マウントポイント**
ルートファイルシステム上のどの位置にマウントするかの指定をルートからのパスで書く。

+ **3\.ファイルシステムの種類**
デバイス名で指定したファイルシステムの種類を書く。

+ **4\.マウントオプション**
マウントする際に必要となるオプションを書く。


+ **5\.dumpフラグ**
そのファイルシステムをdumpコマンド（バックアップ用のコマンド）の対象とするかどうかを「0」か「1」で書く。「0」では対象外となり、「1」では対象となる

+ **6\.fsckフラグ**
起動時に自動的に行われるfsck(ファイルシステムチェック)の優先度を数字で書く。数字が小さいものから順にチェックされるが、0は例外で、チェックを省く指定になる。

::: note info 
最近のディストリビューションはシステムによって自動的に処理されており、手動での書き換えは好ましくない場合がある。
:::

### mountコマンド
**書式：mount [オプション] [マウントするデバイス名] マウントポイント**
マウントを実行するためのコマンド。マウントポイントとはデバイスを接続するディレクトリのことで、任意のディレクトリで問題ない。
一般ユーザーによるファイルシステムのマウントは禁止されているが、現在のマウントされているファイルシステムの一覧が表示される。

::: note info
**`/proc/self/mounts`、`/etc/mtab`、`/proc/mounts`ファイルを参照し全てのファイルシステムを表示することも出来る**。
:::


| オプション | 説明 |
|:-:|:-:|
| -a（--all）  | /etc/fstabに記述されているファイルシステムを全てマウントする(noautoオプションがついているものを除く)  |
| -t（--types） ファイルシステム名 | ファイルシステムの種類を指定する  |
| -o（--options）  | マウントオプションを指定する|
| --bind  | 元のディレクトリを行先のディレクトリにマウントする　|
| -r  | ファイルシステムを読み取り専用でマウントする　|
| -w  | ファイルシステムを読み書き可能なモードでマウントする　|



~~~ md
#/dev/sr0として認識されているCD-ROMドライブを/mnt/cdromにマウントする
$ mount /dev/sr0 /mnt/cdrom
$ mount -t iso9660 /dev/sr0 /mnt/cdrom

#ログディレクトリ「/var/log」をrootユーザのホームディレクトリ配下の「/root/systemlogs」にマウント
# mount --bind /var/log /root/systemlogs
~~~

::: note info 
標準的なCD-ROMのファイルシステムタイプは「iso9660」だが、-tオプションで種類を指定しない場合は自動で判別される

`/etc/fstab`ファイルにあらかじめCD-ROMドライブのエントリが記述されている「デバイス名」か「マウントポイント」のどちらか片方だけ指定すれば、もう片方は参照され自動的に決定される
:::




### umountコマンド
**書式：umount [オプション] マウントされているデバイス名またはマウントポイント**
ファイルシステムをアンマウントする。

| オプション | 説明 |
|:-:|:-:|
| -a  | `/etc/mtab`に記述されているファイルシステムを全てアンマウントする(noautoオプションがついているものを除く)  |
| -t ファイルシステム名 | 指定した種類のファイルシステムだけをアンマウントする  |

::: note warn
**ファイルシステムにあるファイルが操作中の場合や、ユーザがファイルシステム内で操作をしている場合、そのファイルシステムはアンマウントできない**。
:::



# ファイルの配置と検索


### findコマンド
**書式：find [検索起点ディレクトリ][検索式][アクション]**
ファイル名だけではなく、様々な条件を指定して、リアルタイムでファイルを検索できる。


| 検索式 | 説明 |
|:-:|:-:|
| -name  | ファイル名で検索  |
| -size  | ファイルサイズで検索  |
| -atime  | ファイルの最終アクセス日で検索  |
| -amin  | ファイルの最終アクセス時刻を〇分前で検索  |
| -mtime  | ファイルの最終修正日で検索  |
| -mmin  | ファイルの最終更新時刻を〇分前で検索  |
| -uid  | ファイルの所有者のユーザーIDを指定  |
| -user  | ファイルの所有者のユーザー名またはユーザーIDを指定  |
| -perm  | ファイルのアクセス権で検索  |
| -type  | ファイルの種類で検索(f:ファイル、d:ディレクトリ、l:シンボリックリンク)  |
| -maxdepth  | 検索したいディレクトリ以下の階層数を指定できる  |
| -print  | パス付のファイル名を標準出力する。省略可能  |


| アクション | 説明 |
|:-:|:-:|
| -print  | 検索結果を開業で区切って表示(デフォルト)  |
| -print0  | 検索結果をNULL文字で区切って表示  |
| -exec コマンド名 {} ￥;  | 検索結果のファイルに対してコマンドを実行  |

~~~ md
#ファイル名が「c」から始まるファイル検索
$ find /usr/bin -name "c*"

#複数の検索条件を指定
$ find -size -10k -atime -1

#アクセス権が755のディレクトリを検索
$ find . -type d -perm 755
~~~


### locateコマンド
**書式：locate 検索パターン**
ファイルなどを名前で検索することができる。「＊」「？」などのメタキャラクタも使用可能で、その際は引用符で囲む必要がある。

::: note warn
作成済みのファイル名データベースを使って検索をしているため、更新後に作成されたファイルを検索することは出来ない。
`updatedb`コマンドを実行しファイル名データベースを更新することが解消できる。これはrootユーザーのみが実行できる
:::

#### updatedbコマンド
**書式：updatedb [オプション]**
locateコマンドが利用する検索用のデータベースを更新するためのコマンド。
`/etc/updatedb.conf`ファイルでは、データベースに登録しない(locateコマンドでの検索対象外とする)ディレクトリの設定などを行うことが可能

| オプション | 説明 |
|:-:|:-:|
| -e  | データベースのファイルの一覧に取り込まないディレクトリパスを指定する  |
| -o  | 更新対象のデータベースを指定する。独自に作成したデータベースを指定したい場合に利用  |




### whichコマンド
**書式: which コマンド名**
コマンドを探し出して絶対パスを表示するコマンド。**環境変数PATHに基づいて検索**を行うため、一般ユーザーが管理者用のコマンドを検索することはできない。


::: note warn
**指定したコマンドが格納されている場所のみを検索する**
PATH環境変数に指定されたディレクトリ以外の検索は、findコマンドを使用する。
:::



### whereisコマンド
**書式：whereis [オプション] コマンド**
指定されたコマンドのバイナリファイル、ソースコード、マニュアルファイルが置かれている場所を検索し、**絶対パスで表示する**

| オプション | 説明 |
|:-:|:-:|
| -b  | バイナリファイルのみ検索する  |
| -m  | マニュアルファイルのみ検索する  |
| -s  | ソースファイルのみ検索する  |

### typeコマンド
**書式：type コマンド**
指定したコマンドが通常の実行ファイルなのか、シェルの組み込みコマンドなのか、エイリアスなのかといった情報を表示する

### headコマンド
**書式: head [オプション] [ファイル名]**
ファイルの先頭部分を表示する。オプションしていない場合は先頭から10行目までを表示する

| オプション | 説明 |
|:-:|:-:|
|  -n 行数 | 指定した行数をファイルの先頭から表示  |
|  -c バイト数 | 指定したバイト数をファイルの先頭から表示  |

### statコマンド
ファイルやファイルシステムのinode番号やタイムスタンプ（アクセス時刻や修正時刻）などの詳細情報を表示できるコマンド。


### tailコマンド
**書式：tail [オプション] ファイル名**
指定したファイルの末尾部分を表示するコマンド

| オプション | 説明 |
|:-:|:-:|
| -n 行数  | 指定した行数のファイルの末尾から表示。-nは省略可能  |
| -c バイト数  | 指定したバイト数をファイルの末尾から表示  |
| -f  | ファイルの末尾に追加された行を表示し続ける  |