ネットワークプログラミング講座

ファイルシステムの構造
ファイルシステムの構造









外部記憶装置のパーティション(区画)
ファイルシステムとパーティション(区画)
ファイルシステムのmount
ファイルシステムのun-mount
ファイルシステムの領域レイアウト
ファイルシステムの階層化木構造
領域レイアウト情報のシステムコール
領域レイアウト情報のstatfs構造体
領域レイアウト情報を得る
ファイルシステムの構造
外部記憶装置のパーティション(区画)


ハードディスクは幾つかの
区画に分れている
ハードディスクの各区画を
パーティションと呼ぶ。
パーティション1
パーティション2
パーティション3
ファイルシステムの構造
ファイルシステムとパーティション(区画)


ファイルシステムはパー
ティション毎に構成されてい
る。
ファイルシステムは、ディレ
クトリによって階層化された
木構造を形成する。
パーティション1
/
bin
home
パーティション2
usr
パーティション3
/
/
me
you
bin
a.c
ファイルシステムの構造
ファイルシステムのmount




異なるパーティション上のファイ
ルシステムを、特定のパーティ
ション上のファイルシステムに統
合することが出来る
ファイルシステムを統合すること
をマウント(mount)と呼ぶ
Linuxが起動されると、各パーティ
ションはマウントされ、統合され
たファイルシステムが出来る
パーティション2にあるファイル
a.cは、絶対パス/home/me/a.cで
示される
パーティション1
bin
/
home
パーティション2
usr
パーティション3
/
me
/
you
bin
a.c
mount
統一された
ファイルシステム
/
bin
home
me
a.c
usr
you
bin
ファイルシステムの構造
ファイルシステムのun-mount


特定のパーティション上の
ファイルシステムに統合さ
れているファイルシステム
を、再び、異なるパーティ
ション上のファイルシステム
に分離することが出来る
ファイルシステムを再び分
離することをアンマウント
(un-mount)と呼ぶ
統一された
ファイルシステム
/
bin
home
me
usr
you
bin
a.c
Un-mount
パーティション1
bin
/
home
パーティション2
usr
パーティション3
/
me
a.c
/
you
bin
ファイルシステムの構造
ファイルシステムの領域レイアウト
statfs構造体
ブート
ブロック
パーティ
ション0
ブロック
グループ
0
ブロック
グループ
1
。
。
。
ブロック
グループ
N
f_type
ファイルシステム
の種類
f_bsize
ブロックサイズ
グループ
ディスクリプタ
f_blocks
全ブロック数
データブロック
ビットマップ
f_bfree
空ブロック数
スーパ
ブロック
iノード
ビットマップ
f_bavail
f_files
iノードの総数
iノード
テーブル
f_ffree
空iノード数
データ
ブロック
f_fsid
f_namelen
f_spare[6]
ファイルシステムの構造
ファイルシステムの階層化木構造
root inode
ino=2
Directory
/usr/bin
/usr/src
/usr/spool
data block
2
.
2
..
3 lost+found
26 vmlinuz
32
usr
inode
inode
ino=32
Directory
ino=26
Regular
data block
32
.
2
..
17
bin
53
src
18
spool
inode
ino=17
Directory
inode
ino=18
Regular
data block
“/var/spool”
/lost+found
/vmlinux
/usr
data block
17
.
32
..
42
yacc
68
gdb
/usr/bin/yacc
/usr/bin/gdb
data block
Linux
Kernel
object
inode
ino=68
Regular
data block
ファイルシステムの構造
領域レイアウト情報のシステムコール
statfs スーパブロックの情報を取出す
sync スーパブロックを更新する
インクルードファイル #include <sys/vfs.h>
書式
int statfs(const char *path,
struct statfs *buf);
戻値
成功時 0
失敗時 -1
インクルードファイル #include <unistd.h>
書式
void sync(void);
戻値
なし
statfs構造体
f_type
f_bsize
ファイルシステム
の種類
ブロックサイズ
f_blocks
全ブロック数
f_bfree
空ブロック数
f_bavail
f_files
iノードの総数
f_ffree
空iノード数
f_fsid
f_namelen
f_spare[6]
ファイルシステムの構造
領域レイアウト情報のstatfs構造体
statfs構造体
ブート
ブロック
パーティ
ション0
ブロック
グループ
0
ブロック
グループ
1
。
。
。
ブロック
グループ
N
スーパ
ブロック
f_type
ファイルシステム
の種類
f_bsize
ブロックサイズ
グループ
ディスクリプタ
f_blocks
全ブロック数
データブロック
ビットマップ
f_bfree
空ブロック数
iノード
ビットマップ
f_bavail
f_files
iノードの総数
iノード
テーブル
f_ffree
空iノード数
データ
ブロック
f_fsid
f_namelen
f_spare[6]
ファイルシステムの構造
領域レイアウト情報を得る
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/vfs.h>
ndf.c
% ./ndf /
40.2 % free
%
int main(int argc,char *argv[])
{
struct statfs buf[1];
sync();
if (statfs(argv[1],buf)<0) {
fprintf(stderr,"Cannot read super block!\n");
exit(EXIT_FAILURE);
}
fprintf(stderr,"%4.1f %% free\n",100.0*buf[0].f_bfree/buf[0].f_blocks);
return EXIT_SUCCESS;
}