#概要
AWS で SQL Server on EC2 の導入記事を試していた時に、データファイルのディレクトリに関してパーティションとかもろもろ設定するところが出てきたので、いい機会なので勉強しなおすことにした。
#Linux のファイルシステムとは
2次記憶装置のビットデータの集まりを論理的な区切りとして扱うためのもの。
意味不明な感じがするので順番に説明します。
##パーティションとかをいったん忘れよう
まず簡単のために HDD や SSD などの2次記憶装置を全部そのまま使うと考える。
##ファイルには属性がある
Linux のファイルにはいろんな属性がある。
- 所有ユーザー・グループ
- パーミッション
- サイズ
- 最終更新日時・最終アクセス日時
- etc...
もちろん、ファイル自体のデータもある。
これらの属性情報(メタデータ)とファイル自体の情報はどこにあるのか?
##データ領域
2次記憶装置内のファイルの実際のデータの場所。↑でいうファイル自体の情報がある場所。
##i-node領域
Linux は 使用する2次記憶装置に i-node領域 と呼ばれる部分を作り、そこに1つ1つのファイルに対応する i-node と呼ばれるデータ構造が並んでいる。
この i-node に各ファイルのメタ情報や、ファイルの実際のデータの場所(↑のデータ領域内)へのポインタが入っている。
つまり、この i-node にアクセスできれば、そのファイルに関する情報は全部取り出せる。
###i-node にはファイル名が含まれていないことに注意
じゃあどこにあるのよ?というのはちょっと後で出てきます。
##i-node にアクセスしやすくする。
i-node 領域内の何番目の inode なのか?という情報が i番号(i-number)。
1つのファイルにはただ一つの i-number が対応する。ファイル名を変えてもこれは変化しない。
(つまり複数のファイル名をつけても、いずれのファイル名も指し示す i-number は同じ)
##i-number をどうやって探せばいいの?
ディレクトリが ファイル名とi-number の対応表を持っている。
というか、ファイル名と i-number の対応表がディレクトリと言ったほうが良いかもしれない。
ディレクトリ自体にも i-node, i-number がある。
↑で i-node にはファイル名が含まれていないと書いたが、ディレクトリにファイル名は記されているのである。
このディレクトリに格納されている ファイル名:i-number の対のことを リンク(ハードリンク) と呼ぶ。
もしこういう対応表がなく、ファイルの i-node 内にファイル名が含まれているとファイル名からファイルを探す時に、すべての i-node を順番に調べていかなければいけないので非常に時間がかかってしまう。
##ディレクトリの i-number はどうやって探す?
そのディレクトリの親ディレクトリが知っている。
ではその親ディレクトリの i-number はさらにその親が知っていて…と、プロセスが親プロセスを辿るのと同じようにルートディレクトリの i-number って何?という話になる。
ルートディレクトリの i-number は歴史的経緯により 2 らしいです。
###ディレクトリは、カレントディレクトリ(.)と親ディレクトリ(..)のリンクを持っている
ls -la などのコマンドでわかるように、ディレクトリは「.」「..」の 2つ のディレクトリ名を持っている。
これは自分自身の i-number と 親ディレクトリの i-number である。
パフォーマンス的な観点から持ってるのだと思われる。
#そしてパーティションとは
今までの議論は HDD や SSD のような2次記憶装置を単一のものとして扱った場合の議論になります。
実際は、記憶装置を論理的に小さい単位に区切って、それぞれ区切った場所を1つの2次記憶装置のように使います。
この区切った単位をパーティションと言います。
##ファイルシステムとパーティションとi-node
ファイルシステムというのは 2次記憶装置のビットデータの集まりを論理的な区切りとして扱うためのもの と最初の方に言いましたが、
具体的に言うと2次記憶装置内の区切り、例えば1ファイルごとのサイズや日付の範囲を決めています。
このファイルシステムごとに i-node, i-number が管理されます。
つまり、2次記憶装置の中にパーティションがあり、その各パーティションに対してファイルシステムが設定されている。
その各パーティション内のファイルシステムごとに i-node や i-number が管理されている、ということです。
記事の最初で説明したパーティションが1つしかない場合=ファイルシステムが2次記憶装置全体として一つになる、ということです。
##このサーバーでどんなデバイス&パーティションが使える状態になってるの?
現在のブロックデバイスを確認
ブロックデバイス確認 lsblk コマンド
パーティション確認 fdisk コマンド
ブロックデバイスってなに?って方はリンク先の引用ですが。
LinuxではHDDやモデムなどの装置を、/dev/sdaのようなデバイスファイルとして管理している。デバイスファイルのうち、アクセス時に文字単位ではなく、ブロック単位でデータを転送するものを「ブロックデバイス」と呼ぶ。HDDやCD-ROMなどがブロックデバイスだ。「ls -al /dev」を実行したとき、ブロックデバイスは先頭に「b」と表示される。
下記は試しに作ってみた SQL Server on Amazon Linux で実行したもの。
$ lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
xvda 202:0 0 8G 0 disk # デバイス
└─xvda1 202:1 0 8G 0 part / # デバイス内のパーティション
$ sudo fdisk -l
# 2次記憶装置(のデバイスファイル)の名前 /dev/xvda
Disk /dev/xvda: 8 GiB, 8589934592 bytes, 16777216 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: gpt
Disk identifier: DAC1631E-C621-457C-AB6B-46D376AE5954
# 2次記憶装置内のパーティション
Device Start End Sectors Size Type
/dev/xvda1 4096 16777182 16773087 8G Linux filesystem
/dev/xvda128 2048 4095 2048 1M BIOS boot
Partition table entries are not in disk order.
# ブロックデバイスのIDとかもわかる
$ sudo blkid
/dev/xvda1: LABEL="/" UUID="76e177a9-8195-43cf-84ae-14ea371008b6" TYPE="xfs" PARTLABEL="Linux" PARTUUID="bd10b85f-c226-4c70-a4b4-11f7976028dd"
Linux では識別している2次記憶装置のデバイスファイルの名前は xvda, xvdb, xvdc ... みたいなアルファベットが増えていく形で増えていき、
(sdb とか、種類によってデバイスファイルのアルファベット自体は変わる)
パーティションは xvda1, xvda2, ... みたいに数字で増えていく。
$ lsblk -f
NAME FSTYPE LABEL UUID MOUNTPOINT
xvda
└─xvda1 xfs / 76e177a9-8195-43cf-84ae-14ea371008b6 /
# xfs がファイルシステムの名前。パーティション xvda1 のファイルシステムは xfs ということ
##どんなファイルシステムがこのサーバーで使われてるの?
df コマンドはディスクの空き容量を確認するためのコマンド。
dfコマンド
#ファイルシステムごとに使用容量などを表示
$ df -Th
Filesystem Type Size Used Avail Use% Mounted on
devtmpfs devtmpfs 476M 0 476M 0% /dev
tmpfs tmpfs 493M 0 493M 0% /dev/shm
tmpfs tmpfs 493M 392K 493M 1% /run
tmpfs tmpfs 493M 0 493M 0% /sys/fs/cgroup
/dev/xvda1 xfs 8.0G 3.9G 4.2G 49% /
tmpfs tmpfs 99M 0 99M 0% /run/user/1000
#それでマウントってなに?
ファイルシステムが設定された各パーティション同士を一つのディレクトリのツリーとして扱うために接ぎ木するための方法。
例えば下記のコマンドで 「/dev/sdb1 のデバイスファイルで表されるパーティションの中身が、/mnt ディレクトリとつながっているとみなす」ことができる。
この例でいう「マウントされる側 /mnt」をマウントポイントと呼ぶ。
mount /dev/sdb1 /mnt
# ls /dev/sdb1 と ls /mnt の中身が同じになる、ということ
また、マウント時にファイルシステムを指定することもできる。
mount -t ext4 /dev/sdb1 /mnt
# ファイルシステム ext4 で、/dev/sdb1 パーティション を マウントポイント /mnt にマウントする。
##OS 再起動後もマウントした状態にしたい
マウントは OS を再起動すると外れてしまいますが、/etc/fstab に記述しておくと再起動後もマウントしてくれるようになります。
マウントについて
$ cat /etc/fstab
#
UUID=76e177a9-8195-43cf-84ae-14ea371008b6 / xfs defaults,noatime 1 1
#参考
https://qiita.com/kamihork/items/fbcd116a631324aae05d
https://qiita.com/lnznt/items/6178e1c5f066f22fe9c2
http://bob-mk2.hateblo.jp/entry/2012/09/12/005550