コンテンツにスキップ

4. デバイスとファイルシステム

4.1. ファイルシステムの操作

ファイルシステムはハードディスクやフロッピーディスクなどの記憶媒体にファイル保存し管理する仕組みのこと。 ファイルシステムはOSごとに異なる

VFS

VFS(仮想ファイルシステム)はファイルシステムとユーザプログラムの中間にありファイルシステムの差異を吸収する仕組み。 このシステムによりユーザプログラムはファイルシステムの違いを気にせずに統一して扱える。

4.1.1. ファイルシステムの情報

システムで利用するファイルシステムは/etc/fstabに記載される。 書式は以下の通り。

/dev/sda1 /boot ext2 default 0 2
# デバイスファイル名/ラベル マウントポイント ファイルシステムの種類 マウントオプション dumpコマンドの対象 ブート時にfsckがチェックする順序

デバイスファイル名はUUIDで識別されるケースもある。 またUUIDはblkidコマンドや/dev/disk/by-uuidファイルで確認可能。 UUIDの変更はtune2fsコマンド、作成はuuidgenコマンドで利用可能。

またファイルシステムの種類は以下の通り。

タイプ 説明
ext2 Linuxファイルシステムextの拡張したシステム
ext3 ext2にジャーナリングシステムを追加したもの
ext4 ext3の機能拡張をしたもの
ReiserFS Linux用のジャーナリングシステム
JFS IBMにより開発されたジャーナリングシステム
XFS SGIにより開発されたジャーナリングシステム
Btrfs Linux向け堅牢ファイルシステム
ISO9660 CD-ROM向けのファイルシステム
UDF DVDのファイルシステム
F2FS SSDなどフラッシュメモリ向け
msdos MS-DOS向けファイルシステム
FAT/FAT32 フラッシュメモリなどで使われる
NTFS windows NT/2000向け
hpfs OS/2のファイルシステム
HFS MacOS向けのシステム
HFS+ MacOS8.1以降
NFS ネットワークファイルシステム
CIFS Windows2000以降
procfs プロセス情報を扱う仮想ファイルシステム
sysfs デバイス情報を扱う仮想ファイルシステム
tmpfs 仮想メモリベースの仮想ファイルシステム
devpts 疑似端末を制御するための仮想ファイルシステム
usbfs USBデバイス監視用ファイルシステム
cramfs 組み込みデバイス向けの圧縮ファイルシステム

マウントオプションは以下の通り。

オプション 説明
async ファイルシステムのすべての入出力を非同期で行う
sync ファイルシステムのすべての入出力を同期で行う
atime ファイルへのアクセスごとにinodeのアクセス時刻を更新する
relatime ファイル更新/アクセスの一定時間後にアクセス時刻を更新する
noatime inodeのアクセス時刻を更新しない(ディスクアクセス高速化)
auto -aオプションでmountコマンドを実行したときにマウントする
noauto -aオプションでmountコマンドを実行したときにマウントしない
defaults デフォルト(async, auto, dev, exec, nouser, rw, suid)
dev ファイルシステム上のデバイスファイルを利用できる
group ユーザのグループがデバイスファイルの所有グループと一致すればマウント許可
exec バイナリ実行の許可
noexec バイナリ実行の禁止
suid SUID, SGIDビットを有効化する
nosuid SUID,SGIDビットの無効化
ro 読み出し専用のマウント
rw 読み書きを許可してマウント
uid=UID すべてのファイル所有者を指定したUIDのユーザにする
gid=GID すべてのファイルの所有グループを指定したGIDのグループにする
user 一般ユーザのマウントを許可、マウントしたユーザのみがアンマウントできる
users 一般ユーザのマウントを許可、マウントしたユーザ以外もアンマウントができる
nouser 一般ユーザのマウントを禁止
owner デバイスファイルの所有者によりマウントを許可する

なおカーネルがサポートしているファイルシステムは/proc/filesystemsで確認が可能。

また現時点でどのファイルシステムがマウントされているか、またどのようなマウントオプションが使われているかは/etc/mtabで確認可能。 なお/etc/mtabは直接編集してはならない。間違って編集した場合は/proc/mountsを利用し復旧が可能。 また/proc/mountsにも同様の情報がある。

4.1.2. マウントとアンマウント

ファイルシステムを利用するためには任意のディレクトリにマウントポイントとしてマウントする必要がある。 ファイルシステムのマウントにはmountコマンドを使用する。

mountコマンド

ファイルシステムのマウント、マウントされたデバイスの確認ができるコマンド。

mount [オプション]

mount /dev/sda1 /data # /dataをマウントポイントとしてマウントする
オプション 説明
-a /etc/fstabで指定されているファイルシステムをマウントする
-f /etc/mtabの情報を書き換えるだけでマウントなし
-o オプション マウントオプションの指定(remount: 再マウント, noexec:バイナリ実行の不許可, nosuid:SUID,SGIDの無視, loop: イメージファイルのマウント)
-n /etc/mtabのマウント情報を書き込まない
-r 読み取り専用でマウントする
-t タイプ ファイルシステムの種類を指定する
-w 読み書き可能でマウントする

unmountコマンド

ファイルシステムをアンマウントするコマンド。

unmount [オプション] [デバイスファイル名/マウントポイント]
オプション 説明
-a /etc/mtabで指定されているシステムすべてアンマウントする
-t タイプ 指定した種類のファイルシステムをアンマウントする

fuserコマンド

指定のファイルを利用しているプロセスの一覧を得たり、そのプロセスをまとめて kill したりするために利用できるコマンド。 具体的にはどのプロセスがそのファイルシステムを利用中なのかも調べられる。

fuser

4.1.3. ファイルの書き込み動作

ファイルに書き込み処理をしてもすぐには書き込まれず、メモリ上のディスクバッファ領域に書き込まれる。 これはディスクアクセスがメモリアクセスに比べて格段に遅いためである。 そのためデータをまとめてディスクに書き込むことでパフォーマンスを向上させる。

syncコマンド

ディスクバッファ領域にあるデータをディスクに書き込むコマンド。

sync

キャッシュの種類

キャッシュにはいくつか種類があり、代表的なものにはバッファキャッシュページキャッシュがある。

種類 説明
バッファキャッシュ ディスク書き込み終了時にディスクバッファのデータを保存することで、再読出しの際に高速化する
ページキャッシュ ページ単位で管理されているメモリ上の情報を保持しておくタイプのキャッシュ

4.1.4. スワップ領域

スワップ領域はブロックデバイス上の仮想的なメモリ領域のこと。 スワップ領域はシステム構成時に作成するが、後から作成も可能でmkswapコマンドでできる。

mkswapコマンド

スワップ領域を作成するコマンド。

mkswap [オプション] [デバイスファイル名/ファイル名]
オプション 説明
-c スワップ作成前に不良ブロックのチェックを行う
-L ラベル ラベルの作成

swaponコマンド

スワップ領域を有効にするコマンド。

swapon [オプション] [デバイスファイル名/ファイル名]
オプション 説明
-a /etc/fstab内のスワップ領域すべての有効化
-s スワップ領域を表示する

swapoffコマンド

スワップ領域を無効にするコマンド

swapoff [オプション] [デバイスファイル名/ファイル名]
オプション 説明
-a /etc/fstab内のスワップ領域すべての無効化

4.2. ファイルシステムの作成

4.2.1. ext2~ext4ファイルシステムの作成

ext2/ext3/ext4のファイルシステムの作成はmke2fsコマンドで可能。

mke2fs [オプション] デバイスファイル
オプション 説明
-b サイズ ブロックサイズをバイト単位で指定する
-c ファイルシステム作成前に不良ブロックのチェックを行う
-i サイズ inodeあたりのバイト数を指定
-j rootユーザ用の予約領域を%指定する
-m 領域% rootユーザ用の予約領域を%で指定する
-n パラメータ確認
-t タイプ ファイルシステムのタイプを指定(ext2~ext4)

なおデフォルト値は/etc/mke2fs.confで指定可能。

使用例

ブロックサイズを2048Byte、不良ブロックのチェックを行い、/dec/sda1にext3ファイルシステムを作成する例

mke2fs -b 2048 -c -j /dev/sda1

ブロックサイズは平均低ファイルサイズが小さい場合は小さく、大きい場合は大きく設定する。 またinode1つ当たりのByte数は平均低名ファイルサイズを基準にしそれを超えないようにする。

ext3ファイルシステムの書き込みフロー

  1. 書き込み操作の発生
  2. メタデータ(inode番号など)の更新内容をログへ書き込み
  3. データとメタデータをディスクに書き込む
  4. ディスク書き込み後に該当ログを破棄する

ext4ファイルシステムの作成

ext4ファイルシステムの作成にはmkfs.ext4コマンドを使用する。 またext4システムはext3ファイルシステムと互換性がある。

変換例は以下の通り。

tune2fs -O extend,uninit_bg,dir_index /dev/sda4
e2fsck /dev/sda4 #  整合性の確認

ジャーナリングモード

ext3/ext4には3つのモードのジャーナリングモードがある。

種類 説明
journal メインファイルシステムより前にすべてのデータがジャーナルに記録される
ordered メタデータがジャーナルに記録される前に、すべてのデータをメインファイルシステムに直接書き出す(デフォルトの設定)
writeback メタデータがジャーナルに記録された後に、すべてのデータをメインファイルシステムに上書きする

writebackはファイルシステムの完全性が保持されるが、クラッシュ後のリカバリでファイル内容が元に戻ることがある。

4.2.2. XFSファイルシステムの作成

XFSはSGI社が開発した堅固な高速なジャーナリングファイルシステムのこと。 最大ボリュームサイズ/最大ファイルサイズは8EBとなっている。

カーネルがxfsに対応しているかは以下のように確認可能。

modprobe xfs
grep xfs /proc/filesystems

mkfs.xfsコマンド

XFSのファイルシステムを作成するコマンド。

mkfs.xfs /dev/sda1

4.2.3. Btrfsファイルシステムの作成

BtrfsはLinux向けのファイルシステム、耐障害性に優れている。 特徴は以下の通り。

  • 最大16EiBのファイルサイズに対応
  • コピーオンライト
  • ディスク領域の効率的利用
  • inodeの動的割り当て
  • ストレージプールの対応
  • スナップショット機能
  • チェックサムによる完全性保証
  • 効率的な増分バックアップ

mfs.brtfsコマンド

Btrfsのファイルシステムを作成するコマンド。

mkfs.btrfs /dev/sdb1

4.2.4. mkfsコマンドによるファイルシステムの作成

mkfsコマンドはファイルシステムの作成などができるフロントエンドプログラム。

mkfs -t ext3 /dev/sdc1

対応しているファイルシステムは以下の通り。 ext2~ext4,XFS,Brtfs,cramfs,FAT/VFAT,MINXFS

オプション 説明
-t タイプ ファイルシステムの種類を指定
-c 不良ブロックのチェック
-V 詳細情報の表示

4.2.5. CD/DVDの作成

LinuxでCD/DVDへ書き込みを行い場合の手順は以下の通り。

  1. CD-R/DVD-Rへ書き込むデータのファイルイメージの作成
  2. 作成したイメージファイルをライティングソフトで書きこむ

CD-ROMのファイルシステムはISO9660となる。 ファイルシステムはmkisofsコマンドで作成を行う。

mkisofs [オプション] ディレクトリ名
オプション 説明
-b ブータブルCDにする
-o ファイル名 ISO9660/UEFIイメージの指定
-J jolietフォーマット
-R,-r RockRidgeフォーマット
-T RockRidgeフォーマットが使えないファイルシステムで正しいファイル名を維持する
-udf DVDなどで用いられるUDFイメージの作成

jolietとRockridge

ISO9660ではファイル名は「8文字+.+3文字」構成(8.3形式)となる。 RockRidgeフォーマットはロングネームでもファイル名が対応できるように拡張したものでUnixOSで使用される。 Jolietフォーマットは最大64文字のファイル名に対応しているMicrosoftが開発したISO9660上位互換規格である。

4.2.6. 暗号化ファイルシステムの作成

ディスクやファイルの暗号化を行うことができる。 ディスクやファイルの暗号化は大きく分けて以下の種類がある。

  • ブロックデバイス(パーティション、ファイルシステムを含む)に対する暗号化
  • 個別のファイルに対する暗号化

ファイル自体を個別に暗号化する暗号化手法にはEncfs、eCryptfsなどがある。

dm-cryptによる暗号化

dm-cryptはカーネルの仕組みの1つ。 dm-cryptによる暗号化はブロックデバイスの暗号化機能を提供する。

dm-cryptはdevice-mapperを利用して、ブロックデバイス(物理デバイス)へのアクセス時に暗号化が行われるよう暗号化マッピングを行う。 またdevice-mapperは論理デバイスを/dev/mapper配下に作成し、物理デバイスと論理デバイス間のマッピングを行う。

暗号化にはcryptsetupコマンドを使用する。

なお暗号化のためには以下パッケージが必要。

  • RHell系ではcryptsetup-luks
  • Debian系ではcryptsetup

cryptsetupコマンド

ブロックデバイスを暗号化するコマンド。 入力されたパスフレーズをもとに暗号化する(覚えておく必要あり)

cryptsetup create 名前 デバイスファイル名 # ファイルシステムの暗号化
cryptsetup remove 名前 # 次回使用時に暗号化を解く
cryptsetup status 名前 

cryptsetup luksDump デバイスファイル名 # 暗号化の状態を表示
cryptsetup luksFormat デバイスファイル名 # 指定したデバイスを暗号化パーティションとして初期化
cryptsetup luksOpen デバイスファイル名 名前 # LuKSパーティションを名称を指定し開く
cryptsetup luksClose デバイスファイル名 # LUKSパーティションを閉じる

暗号化してマウントする手順は以下の通り

  1. cryptsetup create 名前 デバイスファイル名で暗号化
  2. /dev/mapper/名前にデバイスファイルが作成される
  3. 上記デバイスファイルにファイルシステムを作成(mkfs.ext4 /dev/mapper/名前など)
  4. マウントポイントの作成(mkdir /mnt/名前)、そしてマウントを行う(mount /dev/mapper/名前 /mnt/名前)

アンマウントして暗号化を削除する手順は以下の通り。

  1. unmount /dev/mapper/名前
  2. cryptsetup remove 名前

LUKS

LUKS(Linux Unified Key Setup) はLinuxにおいて標準的に使用される暗号化ファイルシステムの仕様のこと。 LUKSは異なるシステム、ディストリビューション間において相互運用ができる。 LUKSではKeySlotといって、暗号化管理のための鍵をパーティションごとに8つ持つことができる。

LUKSはLinuxにおいてdm-cryptを用いて実装されており、cryptsetupコマンドでファイルシステムの暗号化や管理を行う。

4.3. ファイルシステムの保守

4.3.1. ext2/ext3のファイルシステムの構造

ext2/2xt3のファイルシステムはブロック単位で管理され、ブロックにはデータブロック、iノードブロック、スーパブロックの3種類がある。 データブロックにはファイルの内容が保存される。1024の倍数でブロックサイズを指定可能となっている。指定しない場合は適切な値が自動で選択される。

またデータブロックなどはブロックグループという単位でまとめられる。 データブロックにどのデータが記録されているかはiノードに記録される。 iノードブロックにはファイルタイプや更新日、アクセス権所有者情報などのメタデータも保存される。

なおiノードブロックのサイズは128Byteで、1ブロックが1024Byteの場合は1ブロックに8つのiノードが格納される。 ext2/ext3ではiノードをシステム作成後に追加することはできない。

スーパーブロックにはファイルシステムの全般的な情報であるデータブロックサイズやマウント回数、iノードなどが格納される。 スーパーブロックはブロックグループごとにバックアップが作成される。 バックアップスーパーブロックの位置はファイルシステム作成時に表示され、後から確認はmke2fs -nで可能となっている。

確認例は以下の通り。

mke2fs -b 4096 -c -j -n /dev/sdb1

dumpe2fsコマンド

スーパーブロックの内容を確認できるコマンド。

dumpe2fs デバイスファイル名

4.3.2. ext4ファイルシステムの構造

ext4ファイルシステムの構造は基本的にはext2/ext3と同じだが以下の違いがある。

  • 最大ファイルサイズが16TB, 最大ファイルシステムサイズが1EB
  • エクステント方式のブロック管理
  • オンラインデフラグ
  • ナノ秒単位のタイムスタンプ
  • マルチブロック割り当て
  • ジャーナルチェックサム
  • fsckの高層化

4.3.3. ファイルシステムのチェック

ファイルシステムの整合性チェックはfscke2fsckコマンドで確認できる。 チェックする際はそのチェック対象のファイルシステムをマウントもしくは読み込みonlyでマウントする必要がある。

fsckコマンド

fsck [オプション] [デバイス名]
オプション 説明
-r 対話的に修復を実行
-t タイプ ファイルシステムの種類を指定
-A /etc/fstabに記載された全ファイルシステムに対し実行
-N 実行せず、実行した場合の結果を表示

e2fsckコマンド

ext2/ext3/ext4ファイルシステムをチェックする際に使用するコマンド。

e2fsck [オプション] [デバイス名]
オプション 説明
-b ブロック 指定したスーパブロックのバックアップを使用して復元
-c 不良ブロックのチェック
-f ファイルシステムの状態がcleanでもチェックする
-p すべての不良ブロックを自動的に修復する
-y 再帰問い合わせに関しすべて「yes」と回答する
-n 再帰問い合わせに関しすべて「no」と回答する

なおマウント中のファイルシステムはチェックできないため、ルートファイルシステムをチェックする際は、CD-ROM等より起動するなどを行う必要がある。

もしくはshutdown -r -F nowコマンドで起動時でチェックを行うこともできる。

xfs_repairコマンド

XFSファイルシステムをチェックするコマンド。 -nオプションを付けるとチェックのみを行い修復はしない動作となる。

xfs_repair -n デバイス名

4.3.4. ext2~ext4ファイルシステムの管理

ext2/ext3/ext4ファイルシステムの様々なパラメータを設定するにはtune2fsコマンドを使用する。

tune2fsコマンド

tune2fs [オプション] デバイス名
オプション 説明
-c 回数 ファイルシステムチェックが行われるまでの最大マウント回数を指定する
-C 回数 現在のマウント回数の設定
-i 間隔 ファイルシステムのチェック間隔を指定
-j ext2からext3へ変換する
-m 領域% rootユーザ用の予約領域のサイズを変更する
-i スーパーブロックの内容を表示する
-L ラベル ファイルシステムのボリュームラベルを設定する
-U UUID 指定したUUIDに変更する

badblocksコマンド

デバイス上の不良ブロックを検索するコマンド。

badblocks [オプション] [デバイスファイル名]
オプション 説明
-b サイズ ブロックサイズを指定する
-o ファイル名 指定したファイルに結果を出力する
-w 書き込みモードでテストする

debugfsコマンド

ファイルシステムのデバックを対話式に行えるコマンド。

debugfs [オプション] [デバイスファイル名]
オプション 説明
-w ファイルシステムを読み書き可能モードで開く
-s ブロック番号 指定したブロックをスーパーブロックとして利用する
サブコマンド 説明
cat ファイル名 ファイルの内容を表示する
cd ディレクトリ 別のディレクトリに移動する
chroot ディレクトリ ルートディレクトリを変更する
close ファイルシステムを閉じる
dump ファイルA ファイルB ファイルAの内容をファイルBとして保存
freei ファイル名 ファイルのiノードを消去する
ls ファイル一覧を表示する
mkdir ディレクトリ ディレクトリを作成する
open デバイス名 ファイルシステムを開く
pwd カレントディレクトリを表示する
rm ファイル名 ファイルを削除する
rmdir ディレクトリ ディレクトリを削除する
stat ファイル名 inodeの内容を表示する
quit 終了する

4.3.5. S.M.A.R.T

S.M.A.R.Tはハードディスクに組み込まれている自己診断機能のこと。 この機能を搭載しているハードディスクでは故障時期の予測や故障の兆候を発見可能となっている。 LinuxにはいくつかのS.M.A.R.T対応ソフトウェアがある。

代表的なものにはsmartmontoolsがある。 この仕組みではsmartdデーモンがハードウェアのS.M.A.R.T情報を取得し、smartctlコマンドで表示する。

smartctlコマンド

smartctl [オプション] [デバイスファイル名]
オプション 説明
-a / --all S.M.A.R.T情報を表示する
-i / --info S.M.A.R.Tの対応状況などを表示する
-c / --capabilities テストの診断状況の表示
-t / --test セルフテストを実施する
-l / --log テストログを表示する
-H / --health 状態を表示する
--scan 認識されているデバイスを表示

4.3.6. XFSファイルシステムの管理

xfs_adminコマンド

XFSファイルシステムのパラメータ変更はxfs_adminコマンドを使用する。

xfs_admin [オプション] [デバイス名]
オプション 説明
-u UUIDを表示する
-l ラベルを表示する
-L ラベル ラベルの設定
-U UUID UUIDを設定する

xfs_infoコマンド

XFSファイルシステムの情報を表示するコマンド。

xfs_info デバイス名

xfsdumpコマンド

XFSファイルシステムをバックアップするコマンド。

xfsdump オプション バックアップするファイルシステム
オプション 説明
-f 出力先 出力先を指定する
-l レベル ダンプレベルの指定
-J ダンプ情報データベースを更新しない

xfsrestoreコマンド

xfsファイルシステムをリストアするコマンド。 XFSファイルシステムの復元を行うことができる。

xfsrestore オプション リストア先
オプション 説明
-f ファイル名 バックアップされたデバイスファイル名を指定する
-S セッションID リストアされたバックアップのセッションIDを指定する
-L セッションラベル リストアするバックアップのセッションラベルを指定する
-r 増分バックアップからリストアする
-i 対話的にリストアする
-I すべてのダンプのセッションIDとセッションラベルを明示する

なお増分バックアップが含まれるテープデバイスからリストアするにはセッションIDまたはセッションラベルが必要となる。

xfs_repairコマンド

XFSファイルシステムの修復を行うコマンド。

xfs_repair デバイスファイル名

4.3.7. Btrfsファイルシステムの管理

Btrfsファイルシステムの管理を行う場合はbtrfsコマンドを使用する。

btrfsコマンド

btrfs コマンド サブコマンド
コマンド/サブコマンド 説明
filesystem show ファイルシステムの情報を表示
filesystem df ファイルシステムの使用状況を表示
filesystem label ファイルシステムのラベルを指定
filesystem resize ファイルシステムサイズの変更
subvolume create サブボリュームの作成
subvolume delete サブボリュームの削除
subvolume list サブボリューム一覧の表示
subvolume snapshot サブボリュームのスナップショットの作成
subvolume show サブボリュームの情報の表示

Btrfsではサブボリュームが使用できる。 サブボリュームはファイルシステムを分割したものを示す。

btrfs-convertコマンド

ext4などのファイルシステムをBtrfsに変換するコマンド。

btrfs-convert デバイス名

4.3.8. オートマウント

autofsサービスによるオートマウントを実行することで、自動マウントがされる。 この機能を使えば手動でマウント/アンマウントする必要がない。

autofsサービスの開始

autofsサービスは以下コマンドで開始できる。 設定ファイルは/etc/auto.masterとファイルシステム毎に設定するマップファイルになる。

systemctl start autofs
systemctl restart autofs

/etc/auto.masterの書き方

マウントポイントの指定方法は直接マップ、間接マップの2つの方式がある。

/- /etc/auto.direct # 直接マップ
/mnt/sample /etc/sample.dvdrom --timeout=60 # 間接マップ
# マウントベース マップファイル オプション

なお/etc/auto.masterを編集した場合には、設定を反映させる為にデーモンの再起動(/etc/init.d/autofs reloadなど)が必要となる。

マップファイル

マップファイルではファイル名を自由に変更する設定を記述することができる。 マップファイルはオートマウントしたいファイルシステムの個数だけ作成する必要がある。

書式は以下の通り。

dvdrom -fstype=udf,ro :/dev/sdc1
# マウントベース以下に作成されるディレクトリ マウントオプション デバイスファイル名