0から作るソフトウェア開発

日々勉強中。。。

Tips
リンク

ファイルシステム >

0から作るLinuxプログラム Ext2ファイルシステムその4 ファイルシステム関連のシステムコール

Ext2ファイルシステム

Linuxのファイルシステムのうち基本的なファイルシステムであるExt2について
みていきます。

それでは、順番に見ていきます。

目次 Ext2ファイルシステム

  1. ファイルシステムの概要

  2. ファイルシステムへのアクセス

  3. カーネルサイドから見たシステムコール

  4. (現在のページ) ファイルシステム関連のシステムコール

  5. 仮想ファイルシステム(VFS)

  6. ステップ0 Ext2ファイルシステムと簡単なモジュールの実装

  7. ステップ1 Ext2ファイルシステムタイプとマウントメソッド

  8. ステップ2 Ext2スーパーブロックの読み込み

  9. ステップ3 スーパーブロック管理情報

  10. ステップ4 マウントとスーパーブロックオブジェクト

  11. ステップ5 スーパーブロックオブジェクトと管理情報のセットアップ

  12. ステップ6 ブロックグループディスクリプターの読み込み

  13. ステップ7 ルートディレクトリのinode読み込み

  14. ステップ8 簡単なディレクトリの読み込み

  15. ステップ9 ディレクトリ読み込みとページキャッシュとaddress_space

  16. ステップ10 inodeオブジェクトのlookupメソッド

  17. ステップ11 inodeオブジェクトのmkdirメソッドとper-cpuカウンター

  18. ステップ12 簡単なブロックの新規割り当て処理

  19. ステップ13 スーパーブロックオブジェクトのwrite_inodeメソッド

  20. ステップ14 Orlov方式による新規ディレクトリのinodeを割り当てるブロックグループ選択

  21. ステップ15 inodeオブジェクトのrmdirメソッドとunlinkメソッド

  22. ステップ16 inodeオブジェクトのrenameメソッド

  23. ステップ17 inodeオブジェクトのcreateメソッドとファイルオブジェクトの汎用メソッド

  24. ステップ18 inodeオブジェクトのlinkメソッド

  25. ステップ19 シンボリックとinodeオブジェクトのsymlinkメソッド

  26. ステップ20 inodeオブジェクトのmknodメソッドとtmpfileメソッド

  27. ステップ21 スーパーブロックオブジェクトのevict_inodeメソッド

  28. ステップ22 スーパーブロックオブジェクトのsync_fsメソッド

  29. ステップ23 スーパーブロックオブジェクトのstatfsメソッドとメモリーバリアー/フェンス

  30. ステップ24 スーパーブロックオブジェクトのremount_fsメソッドとマウントオプション解析

  31. ステップ25 スーパーブロックオブジェクトのshow_optionsメソッドとprocfs

  32. ステップ26 カーネルオブジェクトとsysfs

  33. ステップ27 スーパーブロックオブジェクトのfreeze_fs/unfreeze_fsメソッド

  34. ステップ28 ファイルオブジェクトのioctlメソッド

  35. ステップ29 ファイルオブジェクトのsetattrメソッド

  36. ステップ30 address_spaceのdirect_IOメソッド

  37. ステップ31 リザベーションウィンドウ

  38. ステップ32 拡張アトリビュートその1 ハンドラーの呼び出し

  39. ステップ33 拡張アトリビュートその2 コア処理

  40. ステップ34 POSIX ACLその1 ハンドラーの呼び出し

  41. ステップ35 POSIX ACLその2 コア処理

  42. ステップ36 ディスククォータ

ファイルシステム関連のシステムコール

ここまでで、ファイルシステムを操作するための入り口であるシステムコールについて見てきました。

ここでは、どのような操作ができるのかを見ていきます。ファイルシステム関連のシステムコールに

ついてです。



システムコールを呼び出してファイルシステムの機能を呼び出すのがファイルシステム関連の

システムコールとなります。では一体どのようなシステムコールが定義されているのでしょうか。

ファイルシステム関連のシステムコールについて見ていきましょう。


次のようなファイルシステム関連のシステムコールがあります。次の表のシステムコール名

をクリックすると説明ページを見ることができます。

ほとんどmanコマンドで見れる内容となりますので、既にご存知の方には

非常に退屈な内容となります。後で見たいときに見ればいいくらいですので、

途中で仮想ファイルシステム(VFS)に進んでいただいて問題ありません。


各システムコールではプログラム例を載せています。実際にExt2ファイルシステムを

作っていく段階で、テストプログラムで使用することができますので、後々役に立つ

と思います。(テストには既存のプログラムコマンドも使用できますので、無理に

全部作る必要はありません)。


それでは見ていきましょう。結構たくさんあります。。。

マウント関連のシステムコール
システムコール名 説明 準拠
mount ファイルシステムをマウントします。 Linux固有
umount ファイルシステムをアンマウントします。カーネル内ではsys_mountとなります。umount2システムコール呼び出し時に処理を行います。 Linux固有
oldumount ファイルシステムをアンマウントします。カーネル内ではsys_oldmountとなります。umountシステムコール呼び出し時に処理を行います。 Linux固有
pivot_root ルートファイルシステムを変更します。 Linux固有
ファイルシステム情報関連のシステムコール
システムコール名 説明 準拠
sysfs ファイルシステムタイプを取得します。 System Vリリース4準拠
statfs ファイルシステムの統計情報を取得します。 Linux固有
fstatfs
statfs64
fstatfs64
ustat ファイルシステムの統計情報を取得します。ustatは古いプログラムとの互換性のためだけに用意されています。statfsを推奨します。 System Vリリース4準拠
ファイル作成・オープン・クローズ関連のシステムコール
システムコール名 説明 準拠
open ファイルを作成してそのファイルを開きます。 System Vリリース4、4.3BSD、POSIX.1-2001準拠
openat
creat
close ファイルを閉じます。 System Vリリース4、4.3BSD、POSIX.1-2001準拠
mknod 特別なファイルを作成します。 System Vリリース4、4.3BSD、POSIX.1-2001準拠
mknodat
name_to_handle_at ファイル名からファイルハンドラーを取得します。 現在のところLinuxでは標準のシステムコールではありません。
open_by_handle_at ファイルハンドラーからファイルをオープンします。 現在のところLinuxでは標準のシステムコールではありません。
dup ファイルディスクリプターを複製します。 System Vリリース4、4.3BSD、POSIX.1-2001準拠
dup2
dup3 Linux固有
pipe パイプを作成します。 POSIX.1-2001準拠
pipe2 Linux固有
ディレクトリ操作関連のシステムコール
システムコール名 説明 準拠
mkdir ディレクトリを作成します。 System Vリリース4、BSD、POSIX.1-2008準拠
mkdirat POSIX.1-2008準拠
rmdir ディレクトリを削除します。 System Vリリース4、4.3BSD、POSIX.1-2001準拠
getcwd 現在の作業ディレクトリを取得します。 POSIX.1-2001準拠
rename ファイル名やファイルの場所を変更します。 4.3BSD、C89、C99、POSIX.1-2001、POSIX.1-2008準拠
renameat POSIX.1-2001準拠
rename2 Linux固有
chdir 現在の作業ディレクトリを変更します。 System Vリリース4、4.4BSD、POSIX.1-2001準拠
fchdir
chroot ルートディレクトリを変更します。 System Vリリース4、4.4BSD、SUSv2(LEGACY)準拠
lookup_dcookie ファイルのフルパスを取得します。 Linux固有
getdents ディレクトリエントリーを取得します。 System Vリリース4準拠
getdents64
old_readdir ディレクトリエントリー(古いディレクトリエントリー)を取得します。 Linux固有
ファイル操作関連のシステムコール
システムコール名 説明 準拠
read ファイルからデータを読み込みます。 System Vリリース4、4.3BSD、POSIX.1-2001準拠
pread64 指定したオフセットからファイルのデータを読み込みます。(Linuxカーネル内部ではpread64というシステムコールとなります) POSIX.1-2001準拠
readv 指定した複数のバッファーにファイルのデータを読み込みます。 4.4BSD、POSIX.1-2001準拠
preadv 指定したオフセットから指定した複数のバッファーにファイルのデータを読み込みます。 標準のシステムコールコールではありません。
wirte ファイルにデータを書き込みます。 System Vリリース4、4.3BSD、POSIX.1-2001準拠
pwrite64 ファイルの指定したオフセットにデータを書き込みます。 POSIX.1-2001準拠
writev ファイルに複数のバッファーのデータを書き込みます。 4.4BSD、POSIX.1-2001準拠
pwritev ファイルの指定したオフセットに複数のバッファーのデータを書き込みます。 標準のシステムコールコールではありません。
lseek 読み込み/書き込みのオフセット位置を変更します。 System Vリリース4、4.3BSD、POSIX.1-2001準拠
llseek Linux固有
truncate ファイルを指定したサイズに変更します。 System Vリリース4、4.4BSD、POSIX.1-2001準拠
ftruncate
truncate64
ftruncate64
sendfile ファイル間でデータ転送を行います。 Linux固有
sendfile64
tee パイプのデータを複製します。 Linux固有
splice パイプから入力されるデータをコピーしたり、パイプにデータをコピーします。 Linux固有
vmsplice ユーザーページのデータをパイプにコピーします。 Linux固有
リンク操作関連のシステムコール
システムコール名 説明 準拠
link ファイルに新しい名前(ハードリンク)を作成します。 System Vリリース4、4.3BSD、POSIX.1-2001、POSIX.1-2008準拠
linkat POSIX.1-2008準拠
unlink ファイル名を削除します。削除可能であればファイル名が参照していたファイル自体も削除します。 System Vリリース4、4.3BSD、POSIX.1-2001、POSIX.1-2008準拠
unlinkat POSIX.1-2008準拠
symlink ファイルに新しい名前(シンボリックリンク)を作成します。 System Vリリース4、4.4BSD、POSIX.1-2001、POSIX.1-2008準拠
symlinkat POSIX.1-2008準拠
readlink シンボリックリンクが参照しているパス名を読み込みます。 System Vリリース4、4.4BSD、POSIX.1-2001、POSIX.1-2008準拠
readlinkat POSIX.1-2008準拠
ファイル属性関連のシステムコール
システムコール名 説明 準拠
access ファイルに対してユーザー権限があるかチェックします。 System Vリリース4、4.3BSD、POSIX.1-2001、POSIX.1-2008準拠
faccessat POSIX.1-2008準拠
utime ファイルの最終アクセス時刻と最終更新時刻を変更します。 System Vリリース4、POSIX.1-2001準拠。POSIX.1-2008では廃止。
utimes 4.3BSDPOSIX.1-2001準拠
utimensat タイムスタンプをナノ秒単位の正確さで変更します。 POSIX.1-2008準拠
futimens
chmod ファイルの権限を変更します。 System Vリリース4、POSIX.1-2001、POSIX.1-2008準拠
fchmod
fchmodat POSIX.1-2008準拠
chown ファイルの所有者を変更します。 System Vリリース4、4.4BSD、POSIX.1-2001、POSIX.1-2008準拠
fchown
lchown
fchownat POSIX.1-2008準拠
newstat ファイルのステータスを取得します。現在のライブラリーはstatシステムコールではなくnewstatシステムコールを呼び出します。newstatのシステムコール番号は__NR_statです。 System Vリリース4、4.4BSD、POSIX.1-2001、POSIX.1-2008準拠
newfstat
newlstat
newlstatat POSIX.1-2008準拠
stat ファイルのステータスを取得します。現在のライブラリーはstatシステムコールではなくnewstatシステムコールを呼び出します。sataのシステムコール番号は__NR_oldstatです。 System Vリリース4、4.4BSD、POSIX.1-2001、POSIX.1-2008準拠
fstat
lstat
lstatat POSIX.1-2008準拠
stat64 ファイルのステータスを取得します。64ビット(ロングファイル)ファイルシステム用のstatシステムコールです。sata64のシステムコール番号は__NR_stat64です。 System Vリリース4、4.4BSD、POSIX.1-2001、POSIX.1-2008準拠
fstat64
lstat64
lstatat64 POSIX.1-2008準拠
拡張ファイル属性関連のシステムコール
システムコール名 説明 準拠
getxattr 拡張ファイル属性の値を取得します。 Linux固有
lgetxattr
fgetxattr
setxattr 拡張ファイル属性の値を設定します。 Linux固有
lsetxattr
fsetxattr
listxattr 拡張ファイル属性の名前をリストします。 Linux固有
llistxattr
flistxattr
removexattr 拡張ファイル属性を削除します。 Linux固有
lremovexattr
fremovexattr
ファイルシステムの同期関連のシステムコール
システムコール名 説明 準拠
sync バッファーキャッシュをディスクに書き出します。 System Vリリース4、4.4BSD、POSIX.1-2001準拠
syncfs Linux固有
fsync ファイルに関連付けられたバッファーキャッシュをディスクに書き出します。 4.3BSD、POSIX.1-2001準拠
fdatasync
sync_file_range ファイルの一部をディスクに書き出します。 4.3BSD、POSIX.1-2001準拠
sync_file_range2
非同期I/O関連のシステムコール
システムコール名 説明 準拠
io_setup 非同期I/Oコンテキストを作成します。 Linux固有
io_getevents 完了キューから非同期I/Oイベントを読み込みます。 Linux固有
io_submit 処理が必要な非同期I/Oブロックを処理するように要求します。 Linux固有
io_cancel 未処理の非同期I/Oブロックの要求をキャンセルします。 Linux固有
io_destroy 非同期I/Oコンテキストを削除します。 Linux固有
イベント・シグナル関連のシステムコール
システムコール名 説明 準拠
select 同期をとるためにI/Oを仮想的に多重化します。 4.4BSD、POSIX.1-2001準拠
old_select
pselect6 POSIX.1g、POSIX.1-2001準拠
poll ファイルで発生するイベントを待ちます。 POSIX.1-2001準拠
ppoll Linux固有
epoll_create epollファイルディスクリプターを開きます。 Linux固有
epoll_create1
epoll_clt epollファイルディスクリプターを制御します。 Linux固有
epoll_wait epollファイルディスクリプターのI/Oイベントを待ちます。 Linux固有
epoll_pwait
signalfd シグナルが受信可能なファイルディスクリプターを作成します。 Linux固有
signalfd4
eventfd イベント通知用のファイルディスクリプターを作成します。 Linux固有
eventfd2
timerfd_create タイマー通知用のファイルディスクリプターを作成・設定・取得します。 Linux固有
timerfd_settime
timerfd_gettime
inotify_init ファイルシステムイベントを監視するためのinotifyインスタンスを初期化します。 Linux固有
inotify_init1
inotify_add_watch inotifyインスタンスにウォッチを追加します。 Linux固有
inotify_rm_watch inotifyインスタンスからウォッチを削除します。 Linux固有
fanotify_init ファイルシステムイベントを監視するためのfanotifyグループを作成・初期化します。 Linux固有
fanotify_mark ファイルシステムオブジェクトにfanotifyマークを付けたり、削除したり、変更したりします。 Linux固有
その他のファイルシステム関連システムコール
システムコール名 説明 準拠
mmap ファイルやデバイスをメモリーにマップします。 Linux固有
munmap ファイルやデバイスのメモリーマップを解除します。 System Vリリース4、4.4BSD、POSIX.1-2001準拠
old_mmap ファイルやデバイスをメモリーにマップします。
msync メモリーマップとファイルを同期します。 POSIX.1-2001準拠
fcntl ファイルディスクリプターの制御を行います。 System Vリリース4、4.4BSD準拠。POSIX.1-2001準拠
(System Vリリース4、4.4BSDでは定義されていない制御もあります)。一部Linux固有。
fcntl64
ioctl デバイスの制御を行います。 標準仕様はありません。
flock オープンファイルに通知ロックを施したり、解除したりします。 4.4BSD準拠。
fallocate ディスク領域をファイルに割り当てます。 4.4BSD準拠。
readahead ファイルの先読みを行います。 Linux固有。
quotactl ディスククォータを制御します。 4.4BSD準拠。
ioprio_get I/Oスケジューリングクラスと優先度を取得します。 Linux固有。
ioprio_set I/Oスケジューリングクラスと優先度を設定します。
execve プログラムを実行します。 System Vリリース4、4.3BSD、POSIX.1-2001準拠。
uselib 共有ライブラリーをロードします。 Linux固有。
fadvise64 ファイルデータのアクセスパターンを宣言します。ライブラリーではposix_fadviseが使用できます。 Linux固有。
fadvise64_64
bdflush バッファーダーティフラッシュデーモンに対して起動・フラッシュ・調整を指示します。(現在このシステムコールを呼び出しても特に何もしません。将来廃止される予定です。) Linux固有。
vhangup 現在の端末を仮想的にハングアップします。 Linux固有。


ここまでで、ファイルシステムにアクセスすることができるシステムコールについて見てきました。

次に、実際にシステムコールの処理が行われるVFS(仮想ファイルシステム)について

見ていきましょう。

PR 説明

ディベロッパー・エクスペリエンス Linux Ext2ファイルシステム
0から作るLinuxプログラム Linux Ext2ファイルシステムの完全説明版(Kindleのみ)となります。実装するステップ数は36ステップあります。少しずつステップを実装して、実際に動かして学習していきます。ファイルシステムの機能を呼び出すシステムコールの実装から、仮想ファイルシステムが呼び出すExt2ファイルシステムの実装を行っていきます。ファイルシステムの開発体験を通すことで、実際にカーネルが行っているファイルシステムの基礎的な動作を理解することができます。ぜひお試しください!

inserted by FC2 system