Linuxのファイルシステムについて勉強したメモ

書籍を読みながら、実際にコマンドを利用して確認した時のメモ。

# 参考

+ [インフラエンジニア教本　――ネットワーク構築技術解説](http://www.amazon.co.jp/%E3%82%A4%E3%83%B3%E3%83%95%E3%83%A9%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%8B%E3%82%A2%E6%95%99%E6%9C%AC%E3%80%80%E2%80%95%E2%80%95%E3%83%8D%E3%83%83%E3%83%88%E3%83%AF%E3%83%BC%E3%82%AF%E6%A7%8B%E7%AF%89%E6%8A%80%E8%A1%93%E8%A7%A3%E8%AA%AC-%E7%B7%A8%E9%9B%86%E9%83%A8-ebook/dp/B00ZQJRF4O/ref=sr_1_6?ie=UTF8&qid=1461907433&sr=8-6&keywords=%E3%82%A4%E3%83%B3%E3%83%95%E3%83%A9%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%8B%E3%82%A2)
+ [Linuxシステム[実践]入門 (Software Design plus)](http://www.amazon.co.jp/Linux%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0-%E5%AE%9F%E8%B7%B5-Software-Design-plus/dp/4774158135/ref=sr_1_14?ie=UTF8&qid=1461907544&sr=8-14&keywords=linux)

# 環境

+ Amazon Linux AMI 2016.03.0

# ファイルシステムとは

ウィキペディア参照

>ファイルシステムは、コンピュータのリソースを操作するための、オペレーティングシステム (OS) が持つ機能の一つ。ファイルとは、主に補助記憶装置に格納されたデータを指すが、デバイスやプロセス、カーネル内の情報といったものもファイルとして提供するファイルシステムもある。

また、書籍に以下のように書いてありました。

>ファイルシステムはアプリケーションがデータの読み込み・書き込みをストレージに行う際に仲介するカーネルのサービスの一つです。

ストレージとはHDDやSSDであったり色々ありますが、アプリケーションからストレージに対して書き込みを行う場合にはプロセスからLinuxのシステムコールを呼び出し、その後ファイルシステムを介してストレージに書き込みが行なわれています。

最近のストレージはどんどん大容量化していくため、希望しているデータを以下に早く取得できるかの検討が必要となります。また、実ファイルだけでなく、どのユーザーがファイルを利用できるのかなどの管理データも必要です。

ファイルシステムでは上記のようなファイル検索アルゴリズムであったり、ファイルの管理情報などを持っています。また、ファイルシステムによって認識できるファイルサイズなども違ってきます。

Linuxでは対象OSで認識できるファイルシステムは以下のファイルを確認することで確認できます。

```bash
$cat /proc/filesystems
nodev	sysfs
nodev	rootfs
nodev	ramfs
nodev	bdev
nodev	proc
nodev	cpuset
nodev	cgroup
nodev	tmpfs
nodev	devtmpfs
nodev	debugfs
nodev	tracefs
nodev	securityfs
nodev	sockfs
nodev	bpf
nodev	pipefs
nodev	devpts
nodev	hugetlbfs
nodev	pstore
nodev	mqueue
	ext3
	ext4
nodev	binfmt_misc
```

様々なファイルシステムがありますが、VFS(Virtual File System)という仕組みがプロセスとファイルシステムの間に介在することで、プロセス側ではどのファイルシステムにアクセスするかを意識する必要はありません。

# ファイルシステムの仕組み

ファイルシステムでは先ほども書いたように実際のファイルだけでなく、ファイル情報を管理するためのメタデータが記録されます。メタデータでは利用している領域、利用していない領域、どのディスクレトリがどこにあるかなどの情報を記録しています。

また、ファイルシステムではデータ格納の際に1ビットずつ書き込むようなことはせず、効率化のためにある程度まとまった単位で扱うようにしております。この容量をブロックサイズといいます。

現在、多くのLinuxで使われているファイルシステムのext4ではデフォルトブロックサイズは4096byteとして設定されています。

実際にマウントされているext4ファイルシステムのブロックサイズを確認してみます。

```bash
# マウントされているファイルシステムを確認
$df -Th
ファイルシス   タイプ   サイズ  使用  残り 使用% マウント位置
/dev/xvda1     ext4       7.8G  1.3G  6.4G   17% /
devtmpfs       devtmpfs   490M   56K  490M    1% /dev
tmpfs          tmpfs      498M     0  498M    0% /dev/shm

# /dev/xvda1(ext4)のブロックサイズを確認
$sudo /sbin/tune2fs -l /dev/xvda1 |grep 'Block size'
Block size:               4096
```
なお、詳細なext4のファイルシステムのレイアウトは以下より確認できます。

[Ext4 Disk Layout](https://ext4.wiki.kernel.org/index.php/Ext4_Disk_Layout)

# 新しいデバイスを認識させてみる

以下の流れで新しいデバイスを認識させて利用することができます。

+ ストレージをPCに接続し、認識させる
+ ストージにファイルシステムを作成する
+ 任意の位置にマウントさせ、Linuxからアクセスできるようにする

新しくマシンを買うのは面倒なので以下を参考に今回はAWSを使ってみます。

[Amazon EBS ボリュームを使用できるようにする](https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/ebs-using-volumes.html)

では順番にやっていきましょう

## ストレージをPCに接続し、認識させる

 今回はEC2を使っているのでEBSというストレージをEC2にアタッチさせます。
 
マネージメントコンソールでEBS(種類及びディスクサイズは何でもOK)を作成します。 
作成後、起動しているEC2にアタッチします。
アタッチする際に指定できるデバイス名は「/dev/sdf through /dev/sdp」との事なので今回は/dev/sdfとしてアタッチします。

確認してみます

```bash
# 現在マウントされているディスク
$df -Th
ファイルシス   タイプ   サイズ  使用  残り 使用% マウント位置
/dev/xvda1     ext4       7.8G  1.3G  6.4G   17% /
devtmpfs       devtmpfs   490M   60K  490M    1% /dev
tmpfs          tmpfs      498M     0  498M    0% /dev/shm

# それぞれ以下のような構成
$ll /dev/sda*
lrwxrwxrwx 1 root root 4  4月 28 08:27 /dev/sda -> xvda
lrwxrwxrwx 1 root root 5  4月 28 08:27 /dev/sda1 -> xvda1

# 先ほどアタッチしたEBSがデバイスとして認識されているか
$ll /dev/sdf
lrwxrwxrwx 1 root root 4  4月 29 09:43 /dev/sdf -> xvdf

$ll /dev/xvdf
brw-rw---- 1 root disk 202, 80  4月 29 09:43 /dev/xvdf

# 利用可能なデバイスを確認。/dev/sdf/でなく/dev/xvdfgがブロックデバイスとして認識されている
$lsblk
NAME    MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
xvda    202:0    0   8G  0 disk
└─xvda1 202:1    0   8G  0 part /
xvdf    202:80   0  10G  0 disk
```

ドキュメントにも書いてあるようにデバイス名を「/dev/sdf」としても末尾の文字が置き換えられる場合があるようで今回の場合も「/dev/xvdf」と置き換わっている(シンボリックリンク)のが分かりました。

また、fileコマンドでアタッチされたEBSに既にファイルシステムが作成されていないか念のため確認します。

```bash
$sudo file -s /dev/xvdf
/dev/xvdf: data
```

上記のように表示されれば、ファイルシステムは作成されていません。

## ストージにファイルシステムを作成する

次に先ほどLinuxから認識できたデバイスのブロックデバイスファイル/dev/xvdfにext4のファイルシステムを作成します。

ファイルシステム作成には`mkfs`コマンドを利用します。

```bash
# ext4ファイルシステムを作成
$sudo mkfs -t ext4 /dev/xvdf
mke2fs 1.42.12 (29-Aug-2014)
Creating filesystem with 2621440 4k blocks and 655360 inodes
Filesystem UUID: 6c4b8eca-da34-4cb7-87ac-bcbc6255d802
Superblock backups stored on blocks:
	32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632

Allocating group tables: done
Writing inode tables: done
Creating journal (32768 blocks): done
Writing superblocks and filesystem accounting information: done

# 確認
$sudo file -s /dev/xvdf
/dev/xvdf: Linux rev 1.0 ext4 filesystem data, UUID=6c4b8eca-da34-4cb7-87ac-bcbc6255d802 (extents) (large files) (huge files)
```

先ほど同じコマンドですが、/dev/xvdfがext4である表示に変わりました。

## 任意の位置にマウントさせ、Linuxからアクセスできるようにする

最後に作成したファイルシステムをマウントさせてアクセスできるようにします。

最初にマウントさせる任意のディレクトリを作成します。
今回は`/data`というディレクトリを作成し、マウントさせます。

```bash
# ディレクトリ作成
$sudo mkdir /data

# マウント
$sudo mount /dev/xvdf /data

# ファイルシステムとして認識されている
$df -Th
ファイルシス   タイプ   サイズ  使用  残り 使用% マウント位置
/dev/xvda1     ext4       7.8G  1.3G  6.4G   17% /
devtmpfs       devtmpfs   490M   60K  490M    1% /dev
tmpfs          tmpfs      498M     0  498M    0% /dev/shm
/dev/xvdf      ext4       9.8G   23M  9.2G    1% /data
```

このままだとLinuxが再起動した際に自動でマウントされないので必要に応じて以下のような追記を行い、自動マウントすることができます。

```text:/etc/fstab
/dev/xvdf       /data   ext4    defaults,nofail        0       2
```

お疲れ様でした。