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

Linuxのファイルなどに関して

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コマンドで利用可能。

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

タイプ説明
ext2Linuxファイルシステムextの拡張したシステム
ext3ext2にジャーナリングシステムを追加したもの
ext4ext3の機能拡張をしたもの
ReiserFSLinux用のジャーナリングシステム
JFSIBMにより開発されたジャーナリングシステム
XFSSGIにより開発されたジャーナリングシステム
BtrfsLinux向け堅牢ファイルシステム
ISO9660CD-ROM向けのファイルシステム
UDFDVDのファイルシステム
F2FSSSDなどフラッシュメモリ向け
msdosMS-DOS向けファイルシステム
FAT/FAT32フラッシュメモリなどで使われる
NTFSwindows NT/2000向け
hpfsOS/2のファイルシステム
HFSMacOS向けのシステム
HFS+MacOS8.1以降
NFSネットワークファイルシステム
CIFSWindows2000以降
procfsプロセス情報を扱う仮想ファイルシステム
sysfsデバイス情報を扱う仮想ファイルシステム
tmpfs仮想メモリベースの仮想ファイルシステム
devpts疑似端末を制御するための仮想ファイルシステム
usbfsUSBデバイス監視用ファイルシステム
cramfs組み込みデバイス向けの圧縮ファイルシステム

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

オプション説明
asyncファイルシステムのすべての入出力を非同期で行う
syncファイルシステムのすべての入出力を同期で行う
atimeファイルへのアクセスごとにinodeのアクセス時刻を更新する
relatimeファイル更新/アクセスの一定時間後にアクセス時刻を更新する
noatimeinodeのアクセス時刻を更新しない(ディスクアクセス高速化)
auto-aオプションでmountコマンドを実行したときにマウントする
noauto-aオプションでmountコマンドを実行したときにマウントしない
defaultsデフォルト(async, auto, dev, exec, nouser, rw, suid)
devファイルシステム上のデバイスファイルを利用できる
groupユーザのグループがデバイスファイルの所有グループと一致すればマウント許可
execバイナリ実行の許可
noexecバイナリ実行の禁止
suidSUID, SGIDビットを有効化する
nosuidSUID,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あたりのバイト数を指定
-jrootユーザ用の予約領域を%指定する
-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イメージの指定
-Jjolietフォーマット
-R,-rRockRidgeフォーマット
-TRockRidgeフォーマットが使えないファイルシステムで正しいファイル名を維持する
-udfDVDなどで用いられる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 間隔ファイルシステムのチェック間隔を指定
-jext2から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 / –allS.M.A.R.T情報を表示する
-i / –infoS.M.A.R.Tの対応状況などを表示する
-c / –capabilitiesテストの診断状況の表示
-t / –testセルフテストを実施する
-l / –logテストログを表示する
-H / –health状態を表示する
–scan認識されているデバイスを表示

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

xfs_adminコマンド

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

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

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
# マウントベース以下に作成されるディレクトリ マウントオプション デバイスファイル名
最終更新 2025.01.19: Added ss command (683d062)