Slide 1

Slide 1 text

/proc を見てみる @ozuma5119 1 「新しいLinuxの教科書」を読む会 オンライン #2 2020/06/20

Slide 2

Slide 2 text

2

Slide 3

Slide 3 text

3

Slide 4

Slide 4 text

4 $ man proc

Slide 5

Slide 5 text

5 https://linuxjm.osdn.jp/html/LDP_man-pages/man5/proc.5.html

Slide 6

Slide 6 text

6 https://linuxjm.osdn.jp/html/LDP_man-pages/man5/proc.5.html pseudo-file system : 擬似ファイルシステム

Slide 7

Slide 7 text

まずは見てみましょう 7

Slide 8

Slide 8 text

8 数字のディレクトリたくさん + それっぽいファイル名たくさん + それっぽいディレクトリ名がいくつか

Slide 9

Slide 9 text

9 $ cat /proc/meminfo MemTotal: 16294336 kB MemFree: 15851072 kB MemAvailable: 15843672 kB Buffers: 25336 kB Cached: 204780 kB SwapCached: 0 kB Active: 164016 kB Inactive: 100876 kB Active(anon): 35612 kB Inactive(anon): 444 kB Active(file): 128404 kB Inactive(file): 100432 kB Unevictable: 16 kB Mlocked: 0 kB SwapTotal: 16666620 kB SwapFree: 16666620 kB Dirty: 0 kB Writeback: 0 kB AnonPages: 34564 kB Mapped: 63636 kB Shmem: 1284 kB KReclaimable: 32704 kB Slab: 81764 kB SReclaimable: 32704 kB SUnreclaim: 49060 kB KernelStack: 2548 kB PageTables: 1304 kB NFS_Unstable: 0 kB Bounce: 0 kB WritebackTmp: 0 kB CommitLimit: 24813788 kB Committed_AS: 261736 kB VmallocTotal: 34359738367 kB VmallocUsed: 41272 kB VmallocChunk: 0 kB Percpu: 3552 kB HardwareCorrupted: 0 kB AnonHugePages: 2048 kB ShmemHugePages: 0 kB

Slide 10

Slide 10 text

10 $ cat /proc/cpuinfo processor : 0 vendor_id : GenuineIntel cpu family : 6 model : 58 model name : Intel(R) Core(TM) i7-3770K CPU @ 3.50GHz stepping : 9 microcode : 0x21 cpu MHz : 1600.787 cache size : 8192 KB physical id: 0 siblings : 8 core id : 0 cpu cores : 4 apicid : 0 initial apicid : 0 fpu : yes ....(省略).... cache_alignment: 64 address sizes : 36 bits physical, 48 bits virtual power management: processor : 1 vendor_id : GenuineIntel cpu family : 6 model : 58 model name : Intel(R) Core(TM) i7-3770K CPU @ 3.50GHz stepping : 9 microcode : 0x21 cpu MHz : 1600.503 cache size : 8192 KB physical id: 0 siblings : 8 core id : 1 cpu cores : 4 ....(省略)....

Slide 11

Slide 11 text

/proc ディレクトリの擬似ファイル (イメージ) 11 メモリ カーネル メモリ上に 展開 窓のような疑似 ファイル( /proc ) /proc ファイルを通して、カーネルの現在のプロ セス管理状態や各種情報の取得 (一部は書き込み=設定変更も可能)

Slide 12

Slide 12 text

計算して uptime コマンドと比べてみよう 12 $ cat /proc/uptime 1313352.37 1311195.34 $ $ uptime 02:49:25 up 15 days, 4:49, 3 users, load average: 0.00, 0.01, 0.05 1313352秒 ≒ 21889分 ≒ 364時間 ≒ 15日ちょっと

Slide 13

Slide 13 text

13 数字のディレクトリはプロセスごとの proc ファイル。 プロセスIDに対応したディレクトリになっている

Slide 14

Slide 14 text

psコマンドと比べてみよう 14 # ps ww -p 20446 PID TTY STAT TIME COMMAND 20446 ? Ss 0:00 /usr/bin/ssh-agent /bin/sh -c exec -l /bin/bash -c "env GNOME_SHELL_SESSION_MODE=classic gnome-session --session gnome-classic" # # cat -v /proc/20446/cmdline /usr/bin/ssh-agent^@/bin/sh^@-c^@exec -l /bin/bash -c "env GNOME_SHELL_SESSION_MODE=classic gnome-session --session gnome-classic"^@ ※ ^@ =0x00, ゼロ終端 ※他人のプロセス情報はrootで無いとあまり見られない

Slide 15

Slide 15 text

procfs系のコマンドは、procから拾って組み立てる (ps, top, uptime, vmstat... 等) 15 [root@cent7 ~]# strace ps execve("/bin/ps", ["ps"], 0x7ffc3e00eb10 /* 18 vars */) = 0 ....(省略)... stat("/proc/1", {st_mode=S_IFDIR|0555, st_size=0, ...}) = 0 open("/proc/1/stat", O_RDONLY) = 6 read(6, "1 (systemd) S 0 1 1 0 -1 4202752"..., 1024) = 375 close(6) = 0 open("/proc/1/status", O_RDONLY) = 6 read(6, "Name:\tsystemd\nUmask:\t0000\nState:"..., 1024) = 1024 read(6, "0,00000000,00000000,00000000,000"..., 1024) = 178 close(6) = 0 stat("/proc/2", {st_mode=S_IFDIR|0555, st_size=0, ...}) = 0 open("/proc/2/stat", O_RDONLY) = 6 read(6, "2 (kthreadd) S 0 0 0 0 -1 213817"..., 2048) = 169 close(6) = 0 ....(省略)...

Slide 16

Slide 16 text

書き込む例:一時的にカーネルパラメタをいじる 16 # cat /proc/sys/net/ipv4/icmp_echo_ignore_all ← pingの応答を返すか? 0 # ping localhost PING localhost (127.0.0.1) 56(84) bytes of data. 64 bytes from localhost (127.0.0.1): icmp_seq=1 ttl=64 time=0.028 ms 64 bytes from localhost (127.0.0.1): icmp_seq=2 ttl=64 time=0.029 ms ...(省略)... # # echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_all ← pingを無視する # ping localhost PING localhost (127.0.0.1) 56(84) bytes of data. ^C --- localhost ping statistics --- 8 packets transmitted, 0 received, 100% packet loss, time 6999ms 永続的には /etc/sysctl.conf: net.ipv4.icmp_echo_ignore_all=1

Slide 17

Slide 17 text

例:わざとシステムをクラッシュ(Windowsで言うブルースクリーン) 17 # echo 1 > /proc/sys/kernel/sysrq ← sysrqを有効化 # echo c > /proc/sysrq-trigger ← カーネルにSystem Crash命令を送る

Slide 18

Slide 18 text

参考文献 ● Man page of PROC ○ https://linuxjm.osdn.jp/html/LDP_man-pages/man5/proc.5.html ● Linux procfs 徹底入門 ○ https://www.kimullaa.com/entry/2019/12/15/075138 ● Wikipedia: procfs ○ https://ja.wikipedia.org/wiki/Procfs ● RedHat Enterprise Linux 6: 導入ガイド 付録E PROC ファイルシステム ○ https://access.redhat.com/documentation/ja-jp/red_hat_enterprise_linux/6/html/deployment_guide/ch-proc ● その5: procfs (Satoru Takeuchi) ○ https://www.youtube.com/watch?v=y0N4TmNRmQg 18