💭

仮想ファイルシステムについて

2023/05/10に公開

はじめに

Linuxには/dev, /proc, /sys, /tmpといった仮想ファイルシステムが存在します。
それぞれについての概念をまとめました。

対象者

仮想ファイルシステムの概念について知りたい人。

仮想ファイルシステムについて

OS内でファイルシステムのインターフェースを提供する抽象層であり、
統一されたインターフェースで異なるファイルシステムやデバイスへアクセスできる。
仮想ファイルシステムの具体的な実装やデータ構造は、OSのカーネル内部で保持されていて、
/proc、/sys、/dev などのディレクトリを通じて、ユーザーやアプリケーションにシステム情報やデバイスへのアクセスを提供する。

つまり、仮想ファイルシステムのおかげで
異なるファイルシステムやデバイスであっても、
簡単にアクセス可能にしてくれる。

/devについて

ハードウェアのアクセスを抽象化するデバイスファイルの格納場所で、デバイスファイルはudevという仕組みによって自動的に作成される。
すべてのハードウェアはデバイスファイルとして表され、デバイスファイルの読み書きを通してハードウェアにアクセスできるようになっている。

つまり、/devディレクトリはユーザーがデバイスにアクセスするための「入り口」のようなもの。

/devディレクトリ以下のデバイスファイルを確認

# ls /dev
autofs           crash      initctl             null    sda1      tty0   tty2   tty30  tty41  tty52  tty63    usbmon1  vcsa3
block            disk       input               nvram   sda2      tty1   tty20  tty31  tty42  tty53  tty7     usbmon2  vcsa4
bsg              dm-0       kmsg                oldmem  sg0       tty10  tty21  tty32  tty43  tty54  tty8     vcs      vcsa5
btrfs-control    dm-1       log                 port    sg1       tty11  tty22  tty33  tty44  tty55  tty9     vcs1     vcsa6
bus              dri        loop-control        ppp     shm       tty12  tty23  tty34  tty45  tty56  ttyS0    vcs2     vfio
cdrom            fb0        mapper              ptmx    snapshot  tty13  tty24  tty35  tty46  tty57  ttyS1    vcs3     vga_arbiter
centos           fd         mcelog              pts     snd       tty14  tty25  tty36  tty47  tty58  ttyS2    vcs4     vhci
char             full       mem                 random  sr0       tty15  tty26  tty37  tty48  tty59  ttyS3    vcs5     vhost-net
console          fuse       mqueue              raw     stderr    tty16  tty27  tty38  tty49  tty6   uhid     vcs6     zero
core             hpet       net                 rtc     stdin     tty17  tty28  tty39  tty5   tty60  uinput   vcsa
cpu              hugepages  network_latency     rtc0    stdout    tty18  tty29  tty4   tty50  tty61  urandom  vcsa1
cpu_dma_latency  hwrng      network_throughput  sda     tty       tty19  tty3   tty40  tty51  tty62  usbmon0  vcsa2

/procについて

Linuxカーネルが認識しているデバイスに関する情報の一部は、/procディレクトリ以下のファイルで確認できる。

つまり、システムやプロセスの状態をリアルタイムで参照・調整できる「情報窓口」の役割をする。

下記は/procディレクトリ以下のファイルであり、一部のファイルはテキストファイルとしてcatコマンド等で確認できる。

CPU情報
/proc/cpuinfo

# cat /proc/cpuinfo
processor	: 0
vendor_id	: GenuineIntel
cpu family	: 6
model		: 142
model name	: Intel(R) Core(TM) i5-8257U CPU @ 1.40GHz
stepping	: 10
cpu MHz		: 1394.176
cache size	: 6144 KB
physical id	: 0
siblings	: 1
core id		: 0
cpu cores	: 1
apicid		: 0
initial apicid	: 0
fpu		: yes
fpu_exception	: yes
cpuid level	: 22
wp		: yes
flags		: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ht syscall nx rdtscp lm constant_tsc rep_good nopl xtopology nonstop_tsc eagerfpu pni pclmulqdq monitor ssse3 cx16 pcid sse4_1 sse4_2 x2apic movbe popcnt aes xsave avx rdrand hypervisor lahf_lm abm 3dnowprefetch invpcid_single fsgsbase bmi1 avx2 bmi2 invpcid rdseed clflushopt md_clear flush_l1d arch_capabilities
bogomips	: 2788.35
clflush size	: 64
cache_alignment	: 64
address sizes	: 39 bits physical, 48 bits virtual
power management:

ちなみに若干出力結果は異なるがlscpuコマンドでもcpu情報が確認できる。

# lscpu
アーキテクチャ: x86_64
CPU op-mode(s):        32-bit, 64-bit
Byte Order:            Little Endian
CPU(s):                1
On-line CPU(s) list:   0
コアあたりのスレッド数:1
ソケットあたりのコア数:1
Socket(s):             1
NUMAノード:         1
ベンダーID:        GenuineIntel
CPUファミリー:    6
モデル:             142
Model name:            Intel(R) Core(TM) i5-8257U CPU @ 1.40GHz
ステッピング:    10
CPU MHz:               1394.176
BogoMIPS:              2788.35
ハイパーバイザーベンダー:KVM
仮想化タイプ:    完全仮想化
L1d キャッシュ:   32K
L1i キャッシュ:   32K
L2 キャッシュ:    256K
L3 キャッシュ:    6144K
NUMAノード 0 CPU:   0
Flags:                 fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ht syscall nx rdtscp lm constant_tsc rep_good nopl xtopology nonstop_tsc eagerfpu pni pclmulqdq monitor ssse3 cx16 pcid sse4_1 sse4_2 x2apic movbe popcnt aes xsave avx rdrand hypervisor lahf_lm abm 3dnowprefetch invpcid_single fsgsbase bmi1 avx2 bmi2 invpcid rdseed clflushopt md_clear flush_l1d arch_capabilities

IRQ情報
/proc/interrupts

I/Oアドレス情報
/proc/ioports

メモリ情報
/proc/meminfo

USBデバイス情報
/proc//bus/usb/*

PCIデバイス情報
/proc/bus/pci/*

/sysについて

カーネルオブジェクトやデバイスの情報や設定を管理するための仮想ファイルシステム。
主にデバイスドライバやカーネルサブシステムとやりとりするために使用され、
カーネルとデバイスの情報や設定を管理するためのインターフェースを提供する。

つまり、デバイスやカーネルオブジェクトの情報や設定を管理・調整するための「コントロールパネル」のようなもの。

/tmpについて

一時ファイルを格納するためにある。
データはメモリ上に保持されシステムの再起動時に消去されるため、
高速なファイルアクセスや、ディスク容量を節約することができる。

ちなみに、/var/tmpはより長期間保持される一時ファイルを格納する場所である。
つまり/tmpと/var/tmpの違いは、一時ファイルの保持期間である。

各仮想ファイルシステムについて改めて整理

  • /dev
    デバイスファイルを格納し、ハードウェアへのアクセスを抽象化する「入り口」

  • /proc
    カーネルやプロセスの情報をリアルタイムで提供する「情報窓口」

  • /sys
    カーネルオブジェクトやデバイスの情報や設定を管理する「コントロールパネル」

  • /tmp
    短期間の一時ファイルを保存し、速度とディスクスペースを最適化。再起動時に消える。

  • /var/tmp
    /tmpと同様に一時ファイルを格納するが、より長期間保持される。

Discussion