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コマンド
ファイルシステムのマウント、マウントされたデバイスの確認ができるコマンド。
オプション | 説明 |
---|---|
-a | /etc/fstab で指定されているファイルシステムをマウントする |
-f | /etc/mtab の情報を書き換えるだけでマウントなし |
-o オプション | マウントオプションの指定(remount: 再マウント, noexec:バイナリ実行の不許可, nosuid:SUID,SGIDの無視, loop: イメージファイルのマウント) |
-n | /etc/mtab のマウント情報を書き込まない |
-r | 読み取り専用でマウントする |
-t タイプ | ファイルシステムの種類を指定する |
-w | 読み書き可能でマウントする |
unmountコマンド
ファイルシステムをアンマウントするコマンド。
オプション | 説明 |
---|---|
-a | /etc/mtab で指定されているシステムすべてアンマウントする |
-t タイプ | 指定した種類のファイルシステムをアンマウントする |
fuserコマンド
指定のファイルを利用しているプロセスの一覧を得たり、そのプロセスをまとめて kill したりするために利用できるコマンド。 具体的にはどのプロセスがそのファイルシステムを利用中なのかも調べられる。
4.1.3. ファイルの書き込み動作
ファイルに書き込み処理をしてもすぐには書き込まれず、メモリ上のディスクバッファ領域に書き込まれる。 これはディスクアクセスがメモリアクセスに比べて格段に遅いためである。 そのためデータをまとめてディスクに書き込むことでパフォーマンスを向上させる。
syncコマンド
ディスクバッファ領域にあるデータをディスクに書き込むコマンド。
キャッシュの種類
キャッシュにはいくつか種類があり、代表的なものにはバッファキャッシュとページキャッシュがある。
種類 | 説明 |
---|---|
バッファキャッシュ | ディスク書き込み終了時にディスクバッファのデータを保存することで、再読出しの際に高速化する |
ページキャッシュ | ページ単位で管理されているメモリ上の情報を保持しておくタイプのキャッシュ |
4.1.4. スワップ領域
スワップ領域はブロックデバイス上の仮想的なメモリ領域のこと。
スワップ領域はシステム構成時に作成するが、後から作成も可能でmkswap
コマンドでできる。
mkswapコマンド
スワップ領域を作成するコマンド。
オプション | 説明 |
---|---|
-c | スワップ作成前に不良ブロックのチェックを行う |
-L ラベル | ラベルの作成 |
swaponコマンド
スワップ領域を有効にするコマンド。
オプション | 説明 |
---|---|
-a | /etc/fstab 内のスワップ領域すべての有効化 |
-s | スワップ領域を表示する |
swapoffコマンド
スワップ領域を無効にするコマンド
オプション | 説明 |
---|---|
-a | /etc/fstab 内のスワップ領域すべての無効化 |
4.2. ファイルシステムの作成
4.2.1. ext2~ext4ファイルシステムの作成
ext2/ext3/ext4のファイルシステムの作成はmke2fs
コマンドで可能。
オプション | 説明 |
---|---|
-b サイズ | ブロックサイズをバイト単位で指定する |
-c | ファイルシステム作成前に不良ブロックのチェックを行う |
-i サイズ | inodeあたりのバイト数を指定 |
-j | rootユーザ用の予約領域を%指定する |
-m 領域% | rootユーザ用の予約領域を%で指定する |
-n | パラメータ確認 |
-t タイプ | ファイルシステムのタイプを指定(ext2~ext4) |
なおデフォルト値は/etc/mke2fs.conf
で指定可能。
使用例
ブロックサイズを2048Byte、不良ブロックのチェックを行い、/dec/sda1
にext3ファイルシステムを作成する例
ブロックサイズは平均低ファイルサイズが小さい場合は小さく、大きい場合は大きく設定する。 またinode1つ当たりのByte数は平均低名ファイルサイズを基準にしそれを超えないようにする。
ext3ファイルシステムの書き込みフロー
- 書き込み操作の発生
- メタデータ(inode番号など)の更新内容をログへ書き込み
- データとメタデータをディスクに書き込む
- ディスク書き込み後に該当ログを破棄する
ext4ファイルシステムの作成
ext4ファイルシステムの作成にはmkfs.ext4
コマンドを使用する。
またext4システムはext3ファイルシステムと互換性がある。
変換例は以下の通り。
ジャーナリングモード
ext3/ext4には3つのモードのジャーナリングモードがある。
種類 | 説明 |
---|---|
journal | メインファイルシステムより前にすべてのデータがジャーナルに記録される |
ordered | メタデータがジャーナルに記録される前に、すべてのデータをメインファイルシステムに直接書き出す(デフォルトの設定) |
writeback | メタデータがジャーナルに記録された後に、すべてのデータをメインファイルシステムに上書きする |
writebackはファイルシステムの完全性が保持されるが、クラッシュ後のリカバリでファイル内容が元に戻ることがある。
4.2.2. XFSファイルシステムの作成
XFSはSGI社が開発した堅固な高速なジャーナリングファイルシステムのこと。 最大ボリュームサイズ/最大ファイルサイズは8EBとなっている。
カーネルがxfsに対応しているかは以下のように確認可能。
mkfs.xfsコマンド
XFSのファイルシステムを作成するコマンド。
4.2.3. Btrfsファイルシステムの作成
BtrfsはLinux向けのファイルシステム、耐障害性に優れている。 特徴は以下の通り。
- 最大16EiBのファイルサイズに対応
- コピーオンライト
- ディスク領域の効率的利用
- inodeの動的割り当て
- ストレージプールの対応
- スナップショット機能
- チェックサムによる完全性保証
- 効率的な増分バックアップ
mfs.brtfsコマンド
Btrfsのファイルシステムを作成するコマンド。
4.2.4. mkfsコマンドによるファイルシステムの作成
mkfsコマンドはファイルシステムの作成などができるフロントエンドプログラム。
対応しているファイルシステムは以下の通り。 ext2~ext4,XFS,Brtfs,cramfs,FAT/VFAT,MINXFS。
オプション | 説明 |
---|---|
-t タイプ | ファイルシステムの種類を指定 |
-c | 不良ブロックのチェック |
-V | 詳細情報の表示 |
4.2.5. CD/DVDの作成
LinuxでCD/DVDへ書き込みを行い場合の手順は以下の通り。
- CD-R/DVD-Rへ書き込むデータのファイルイメージの作成
- 作成したイメージファイルをライティングソフトで書きこむ
CD-ROMのファイルシステムはISO9660となる。
ファイルシステムは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パーティションを閉じる
暗号化してマウントする手順は以下の通り
cryptsetup create 名前 デバイスファイル名
で暗号化/dev/mapper/名前
にデバイスファイルが作成される- 上記デバイスファイルにファイルシステムを作成(
mkfs.ext4 /dev/mapper/名前
など) - マウントポイントの作成(
mkdir /mnt/名前
)、そしてマウントを行う(mount /dev/mapper/名前 /mnt/名前
)
アンマウントして暗号化を削除する手順は以下の通り。
unmount /dev/mapper/名前
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
で可能となっている。
確認例は以下の通り。
dumpe2fsコマンド
スーパーブロックの内容を確認できるコマンド。
4.3.2. ext4ファイルシステムの構造
ext4ファイルシステムの構造は基本的にはext2/ext3と同じだが以下の違いがある。
- 最大ファイルサイズが16TB, 最大ファイルシステムサイズが1EB
- エクステント方式のブロック管理
- オンラインデフラグ
- ナノ秒単位のタイムスタンプ
- マルチブロック割り当て
- ジャーナルチェックサム
- fsckの高層化
4.3.3. ファイルシステムのチェック
ファイルシステムの整合性チェックはfsck
やe2fsck
コマンドで確認できる。
チェックする際はそのチェック対象のファイルシステムをマウントもしくは読み込みonlyでマウントする必要がある。
fsckコマンド
オプション | 説明 |
---|---|
-r | 対話的に修復を実行 |
-t タイプ | ファイルシステムの種類を指定 |
-A | /etc/fstabに記載された全ファイルシステムに対し実行 |
-N | 実行せず、実行した場合の結果を表示 |
e2fsckコマンド
ext2/ext3/ext4ファイルシステムをチェックする際に使用するコマンド。
オプション | 説明 |
---|---|
-b ブロック | 指定したスーパブロックのバックアップを使用して復元 |
-c | 不良ブロックのチェック |
-f | ファイルシステムの状態がcleanでもチェックする |
-p | すべての不良ブロックを自動的に修復する |
-y | 再帰問い合わせに関しすべて「yes」と回答する |
-n | 再帰問い合わせに関しすべて「no」と回答する |
なおマウント中のファイルシステムはチェックできないため、ルートファイルシステムをチェックする際は、CD-ROM等より起動するなどを行う必要がある。
もしくはshutdown -r -F now
コマンドで起動時でチェックを行うこともできる。
xfs_repairコマンド
XFSファイルシステムをチェックするコマンド。
-n
オプションを付けるとチェックのみを行い修復はしない動作となる。
4.3.4. ext2~ext4ファイルシステムの管理
ext2/ext3/ext4ファイルシステムの様々なパラメータを設定するにはtune2fs
コマンドを使用する。
tune2fsコマンド
オプション | 説明 |
---|---|
-c 回数 | ファイルシステムチェックが行われるまでの最大マウント回数を指定する |
-C 回数 | 現在のマウント回数の設定 |
-i 間隔 | ファイルシステムのチェック間隔を指定 |
-j | ext2からext3へ変換する |
-m 領域% | rootユーザ用の予約領域のサイズを変更する |
-i | スーパーブロックの内容を表示する |
-L ラベル | ファイルシステムのボリュームラベルを設定する |
-U UUID | 指定したUUIDに変更する |
badblocksコマンド
デバイス上の不良ブロックを検索するコマンド。
オプション | 説明 |
---|---|
-b サイズ | ブロックサイズを指定する |
-o ファイル名 | 指定したファイルに結果を出力する |
-w | 書き込みモードでテストする |
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コマンド
オプション | 説明 |
---|---|
-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
コマンドを使用する。
オプション | 説明 |
---|---|
-u | UUIDを表示する |
-l | ラベルを表示する |
-L ラベル | ラベルの設定 |
-U UUID | UUIDを設定する |
xfs_infoコマンド
XFSファイルシステムの情報を表示するコマンド。
xfsdumpコマンド
XFSファイルシステムをバックアップするコマンド。
オプション | 説明 |
---|---|
-f 出力先 | 出力先を指定する |
-l レベル | ダンプレベルの指定 |
-J | ダンプ情報データベースを更新しない |
xfsrestoreコマンド
xfsファイルシステムをリストアするコマンド。 XFSファイルシステムの復元を行うことができる。
オプション | 説明 |
---|---|
-f ファイル名 | バックアップされたデバイスファイル名を指定する |
-S セッションID | リストアされたバックアップのセッションIDを指定する |
-L セッションラベル | リストアするバックアップのセッションラベルを指定する |
-r | 増分バックアップからリストアする |
-i | 対話的にリストアする |
-I | すべてのダンプのセッションIDとセッションラベルを明示する |
なお増分バックアップが含まれるテープデバイスからリストアするにはセッションIDまたはセッションラベルが必要となる。
xfs_repairコマンド
XFSファイルシステムの修復を行うコマンド。
4.3.7. 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に変換するコマンド。
4.3.8. オートマウント
autofsサービスによるオートマウントを実行することで、自動マウントがされる。 この機能を使えば手動でマウント/アンマウントする必要がない。
autofsサービスの開始
autofsサービスは以下コマンドで開始できる。
設定ファイルは/etc/auto.master
とファイルシステム毎に設定するマップファイルになる。
/etc/auto.masterの書き方
マウントポイントの指定方法は直接マップ、間接マップの2つの方式がある。
/- /etc/auto.direct # 直接マップ
/mnt/sample /etc/sample.dvdrom --timeout=60 # 間接マップ
# マウントベース マップファイル オプション
なお/etc/auto.master
を編集した場合には、設定を反映させる為にデーモンの再起動(/etc/init.d/autofs reload
など)が必要となる。
マップファイル
マップファイルではファイル名を自由に変更する設定を記述することができる。 マップファイルはオートマウントしたいファイルシステムの個数だけ作成する必要がある。
書式は以下の通り。