書籍を読みながら、実際にコマンドを利用して確認した時のメモ。
参考
環境
- Amazon Linux AMI 2016.03.0
ファイルシステムとは
ウィキペディア参照
ファイルシステムは、コンピュータのリソースを操作するための、オペレーティングシステム (OS) が持つ機能の一つ。ファイルとは、主に補助記憶装置に格納されたデータを指すが、デバイスやプロセス、カーネル内の情報といったものもファイルとして提供するファイルシステムもある。
また、書籍に以下のように書いてありました。
ファイルシステムはアプリケーションがデータの読み込み・書き込みをストレージに行う際に仲介するカーネルのサービスの一つです。
ストレージとはHDDやSSDであったり色々ありますが、アプリケーションからストレージに対して書き込みを行う場合にはプロセスからLinuxのシステムコールを呼び出し、その後ファイルシステムを介してストレージに書き込みが行なわれています。
最近のストレージはどんどん大容量化していくため、希望しているデータを以下に早く取得できるかの検討が必要となります。また、実ファイルだけでなく、どのユーザーがファイルを利用できるのかなどの管理データも必要です。
ファイルシステムでは上記のようなファイル検索アルゴリズムであったり、ファイルの管理情報などを持っています。また、ファイルシステムによって認識できるファイルサイズなども違ってきます。
Linuxでは対象OSで認識できるファイルシステムは以下のファイルを確認することで確認できます。
$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ファイルシステムのブロックサイズを確認してみます。
# マウントされているファイルシステムを確認
$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のファイルシステムのレイアウトは以下より確認できます。
新しいデバイスを認識させてみる
以下の流れで新しいデバイスを認識させて利用することができます。
- ストレージをPCに接続し、認識させる
- ストージにファイルシステムを作成する
- 任意の位置にマウントさせ、Linuxからアクセスできるようにする
新しくマシンを買うのは面倒なので以下を参考に今回はAWSを使ってみます。
では順番にやっていきましょう
ストレージをPCに接続し、認識させる
今回はEC2を使っているのでEBSというストレージをEC2にアタッチさせます。
マネージメントコンソールでEBS(種類及びディスクサイズは何でもOK)を作成します。
作成後、起動しているEC2にアタッチします。
アタッチする際に指定できるデバイス名は「/dev/sdf through /dev/sdp」との事なので今回は/dev/sdfとしてアタッチします。
確認してみます
# 現在マウントされているディスク
$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に既にファイルシステムが作成されていないか念のため確認します。
$sudo file -s /dev/xvdf
/dev/xvdf: data
上記のように表示されれば、ファイルシステムは作成されていません。
ストージにファイルシステムを作成する
次に先ほどLinuxから認識できたデバイスのブロックデバイスファイル/dev/xvdfにext4のファイルシステムを作成します。
ファイルシステム作成にはmkfs
コマンドを利用します。
# 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
というディレクトリを作成し、マウントさせます。
# ディレクトリ作成
$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が再起動した際に自動でマウントされないので必要に応じて以下のような追記を行い、自動マウントすることができます。
/dev/xvdf /data ext4 defaults,nofail 0 2
お疲れ様でした。