Linuxのファイルシステムについて勉強した内容をまとめてみた


## ファイルシステムの役割
書き込み読み込みなどの操作をファイルシステムが抽象化して記憶媒体の種類が違ってもread writeの操作を行えるようにしている。
ファイルシステムにも種類があり、ext2 ext3 ext4 xfsなどが挙げられる。
ext4はCentOS6デフォルトで使われ、xfsはCentOS7からデフォルトのファイルシステム。
ネットワークと同様に規格が多くあるものには必ずインターフェースとなるものが定められ、Linuxにおけるファイルシステムの規約はVFS(Virtual　File System)になる。

## VFSの構成

### file_system_type
ファイルシステムの役割でも挙げた通りLinuxのファイルシステムにはいくつかタイプが存在する。
CentOS6ではext4がデフォルトCentOS7からはxfsがデフォルト
詳しくは[こちらの記事](http://qiita.com/sion_cojp/items/c8e015db39ddbf43012e "こちらの記事")が参考になる。

現在マウントされているファイルタイプを確認する

```bash
$ df -T
```
![スクリーンショット 2016-01-26 3.24.47.png](https://qiita-image-store.s3.amazonaws.com/0/35451/cd55c957-265f-6293-0825-a5f4a59c3e9c.png "スクリーンショット 2016-01-26 3.24.47.png")

/dev下のデバイスがどのファイルタイプでフォーマットされているかは下記コマンドで確認出来る。

```bash
$ df -T /dev/sdb1
```
![スクリーンショット 2016-01-26 3.26.23.png](https://qiita-image-store.s3.amazonaws.com/0/35451/32a6b3ff-7fb7-69e1-0e63-8d3ef2bc9091.png "スクリーンショット 2016-01-26 3.26.23.png")

### inode
VFSの抽象化の仕組みの一つとしてiノードがある。
これはファイルが記録媒体の物理的などこの位置に保存されているか、ディスク情報、ブロック情報を持っている。
ディスクがフルになって保存できなくなるのと同じようにiノードにも使用できる量が決まっており、枯渇するとファイルが作れなくなったりする。
iノードの使用数の確認方法は以下のとおり。

```bash
$ df -i
```
![スクリーンショット 2016-01-26 1.15.49.png](https://qiita-image-store.s3.amazonaws.com/0/35451/e5b1064d-b68b-f0c5-535a-d967e3ca0f46.png "スクリーンショット 2016-01-26 1.15.49.png")

### super_block
スーパーブロックは1つのファイルシステムに1つだけ存在する。
スーパーブロックの役割はファイルシステムの管理情報を記録する領域のことで、詳しくは下記のコマンドで確認出来る

```bash
$ dumpe2fs -h /dev/sdb1
```
![スクリーンショット 2016-01-26 6.10.29.png](https://qiita-image-store.s3.amazonaws.com/0/35451/24facf5f-9d14-6ae5-fad2-e9968dda33f5.png "スクリーンショット 2016-01-26 6.10.29.png")

## デバイスを操作する
これからの操作にはデバイスをフォーマットしたりマウントを行ったり下手をするとOS自体が立ち上がらなくなる恐れのある操作をするため、Vagrantを使用して行っています。

### vagrantにディスクを追加する

```Vagrantfile
# -*- mode: ruby -*- # vi: set ft=ruby :

# Vagrantfile API/syntax version. Don't touch unless you know what you're doing!
VAGRANTFILE_API_VERSION = "2"

Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
  config.vm.box = "centos65-x86_64"
  config.vm.box_url = "https://github.com/2creatives/vagrant-centos/releases/download/v6.5.1/centos65-x86_64-20131205.box"
  config.vm.network :private_network, ip: "192.168.33.10"
end
```

まずはこの状態のVagrantfileでvagrant upを行い、/dev下を見てみるとHDDはひとつだけ(sda)です。
sdaとはSATAかSCSI接続されたHDDを指しており、HDE接続であればhdaとなっています。
sda1..2と続くのはパーティーションの数です。
![スクリーンショット 2016-01-26 7.14.00.png](https://qiita-image-store.s3.amazonaws.com/0/35451/2995da94-958f-79a5-58b0-369ea30fc7f5.png "スクリーンショット 2016-01-26 7.14.00.png")

新たにディスクをマウントするためにVagrantfileを修正して、ディスクの追加を行います。
下記のようにVagrantfileを修正します。

```Vagrantfile
# -*- mode: ruby -*- # vi: set ft=ruby :

# Vagrantfile API/syntax version. Don't touch unless you know what you're doing!
VAGRANTFILE_API_VERSION = "2"

Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
  config.vm.box = "centos65"
  config.vm.network :private_network, ip: "192.168.33.15"

  # 以下のブロックを追加する
  config.vm.provider :virtualbox do |vb|
    file_to_diskes = ["./tmp/disk.vdi"]
    file_to_diskes.each do |file|
      unless File.exist?(file)
        vb.customize ['createhd', '--filename', file, '--size', 20 * 1024]
        vb.customize ['storageattach', :id, '--storagectl', 'SATA', '--port', 1, '--device', 0, '--type', 'hdd', '--medium', file]
      end
    end
  end
end
```
修正したのち、vagrant reloadを行い、/dev下を覗いてみるとsdbが追加されています。
パーティーションとは違い、同じ形式のディスクが認識されると連番ではなく末尾のアルファベットが更新されていきます。
sda sdb sdc...

![スクリーンショット_2016-01-26_7_14_18.png](https://qiita-image-store.s3.amazonaws.com/0/35451/f9336b1c-ba2e-4440-d7fe-8d5abd30085f.png "スクリーンショット_2016-01-26_7_14_18.png")

### パーティーションを切る
パーティーションとは論理的に分割された領域のことを指しており、1つのハードディスク(vagrantなので仮想ディスク)には最低でもひとつ以上のパーティーションで構成されている。
そのためまずは追加したsdbにfdiskコマンドを使用してパーティーションを作成します。

fdiskコマンドは対話形式でパーティーションの設定を入力していくので結果は以下のとおりです。

```bash
[root@vagrant-centos65 ~]# fdisk /dev/sdb
Device contains neither a valid DOS partition table, nor Sun, SGI or OSF disklabel
Building a new DOS disklabel with disk identifier 0x865e7cbd.
Changes will remain in memory only, until you decide to write them.
After that, of course, the previous content won't be recoverable.

Warning: invalid flag 0x0000 of partition table 4 will be corrected by w(rite)

WARNING: DOS-compatible mode is deprecated. It's strongly recommended to
         switch off the mode (command 'c') and change display units to
         sectors (command 'u').

Command (m for help): n

# pを入力 primaryとextendedの違いは今回はしません
Command action
   e   extended
   p   primary partition (1-4)
p

# 最初のパーティーションなので1を入力
Partition number (1-4): 1

# ディスクの書き込み位置を入力 基本はdefaultに表示される値を入力すればおｋ?
First cylinder (1-2610, default 1): 1

# パーティーションのサイズを入力 今回は1G
Last cylinder, +cylinders or +size{K,M,G} (1-2610, default 2610): +1G

# パーティーションを２つ作成するのでもう一周
Command (m for help): n
Command action
   e   extended
   p   primary partition (1-4)
p
Partition number (1-4): 2
First cylinder (133-2610, default 133): 133
Last cylinder, +cylinders or +size{K,M,G} (133-2610, default 2610): +1G

# pを入力すると現在の設定を表示してくれる
Command (m for help): p

Disk /dev/sdb: 21.5 GB, 21474836480 bytes
255 heads, 63 sectors/track, 2610 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: 0x865e7cbd

   Device Boot      Start         End      Blocks   Id  System
/dev/sdb1               1         132     1060258+  83  Linux
/dev/sdb2             133         264     1060290   83  Linux

# 最後はwを入力して保存
Command (m for help): w
```

パーティーションの情報を確認するには下記コマンドを実行する

```bash
# fdisk -l
```
![スクリーンショット 2016-01-26 8.20.22.png](https://qiita-image-store.s3.amazonaws.com/0/35451/ca8723bd-5c53-f85f-3b84-b828f6568ba5.png "スクリーンショット 2016-01-26 8.20.22.png")
はい/dev/sdb1と/dev/sdb2が作成されました。

### ディスクをフォーマットする

file_system_typeの項目で説明しましたが、ディスクにはファイルタイプが存在します。
ext4やxfsはファイルシステムの仕様が異なるため、ディスクがどのような形式で保存されるのかフォーマットさせないとならない。
これがいわゆる新品のディスクを購入した時にやるフォーマットの作業です。

フォーマットは下記コマンドで行える。
今回はVagrantにcentos6を入れているため、ext4形式でフォーマットを行う。

```bash
[root@vagrant-centos65 ~]# mkfs -t ext4 /dev/sdb1
# あるいは
[root@vagrant-centos65 ~]# mkfs.ext4 /dev/sdb1
```

### ディスクをマウントする
パーティーションを切ってフォーマットすると下ごしらえは完了です。
これでディレクトリにマウントすれば使えるようになります。
今までの例ではsdbを２つのパーティーションに分けたので、/mnt下に以下のディレクトリを作成してマウントしてみます。

```bash
[root@vagrant-centos65 ~]# mkdir /mnt/sdb1_mount_target
[root@vagrant-centos65 ~]# mkdir /mnt/sdb2_mount_target
```

以下のコマンドで作成した２つのディレクトリをマウント。

```bash
[root@vagrant-centos65 ~]# mount /dev/sdb1 /mnt/sdb1_mount/
[root@vagrant-centos65 ~]# mount /dev/sdb2 /mnt/sdb2_mount/
```


マウントが完了したら確認してみる。

![スクリーンショット 2016-01-31 20.14.40.png](https://qiita-image-store.s3.amazonaws.com/0/35451/0cab6bec-3600-aa6d-0f50-526948464b86.png "スクリーンショット 2016-01-31 20.14.40.png")

### OS起動時に自動でマウントされるように設定する

今のままでの設定ではOSを再起動すると再度マウントしなくてはならない。
そのため/etc/fstabを修正する。

```bash
#
# /etc/fstab
# Created by anaconda on Thu Dec  5 14:15:50 2013
#
# Accessible filesystems, by reference, are maintained under '/dev/disk'
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
UUID=ecd27adf-074b-4511-8cee-4a08a4620a4f /                       ext4    defaults        0 0
UUID=6a229de0-2206-4e10-b1a2-496ea60ec30e swap                    swap    defaults        0 0
tmpfs                   /dev/shm                tmpfs   defaults        0 0
devpts                  /dev/pts                devpts  gid=5,mode=620  0 0
sysfs                   /sys                    sysfs   defaults        0 0
proc                    /proc                   proc    defaults        0 0
# 以下を追加
/dev/sdb1               /mnt/sdb1_mount/        ext4
/dev/sdb2               /mnt/sdb2_mount/        ext4
```

「マウント対象のディスク」「マウントポイント」「ファイルシステムの種類」の順で指定する。
マウント対象のディスクの指定の仕方はボリュームラベルやUUIDを指定することが出来ます。
試しに設定が完了したらvagrantを再起動して、df -T コマンドで/mnt/sdb1_mount/ を確認して/dev/sdb1がマウントされていれば成功です。

以上！