proc 文件系统
1、简介
proc 是一个虚拟文件系统,通常作为进程信息的伪文件系统,里面没有真正的文件,但是却包含系统运行信息(系统内存、设备mount、硬件配置)。proc 文件系统可以认为是内核的控制和信息中心,许多的系统应用程序只是简单的对这个文件进行读写使用,例如lsmod 等效于 cat /proc/modules,lspci 等同于 cat /proc/pci ,更改proc目录下的文件,可读写正在运行的系统kernel 相关参数。
/proc/下文件较为特别,除kcore、mtrr、self极少数文件外,这些文件大小为0。
大部分/proc 下的文件都是只读的,修改部分文件可以改变内核变量,从而达到不重新编译内核、不重启设备情况下修改内核。
procinfo 命令可以将proc文件系统信息显示出来
[root@localhost proc]# ls -lah total 4.0K dr-xr-xr-x 626 root root 0 Feb 7 17:54 . dr-xr-xr-x. 20 root root 4.0K Feb 7 17:56 .. dr-xr-xr-x 9 root root 0 Feb 7 17:54 1 dr-xr-xr-x 9 root root 0 Feb 7 19:27 10 dr-xr-xr-x 9 root root 0 Feb 7 19:27 100 dr-xr-xr-x 9 root root 0 Feb 7 19:27 1001 dr-xr-xr-x 9 root root 0 Feb 7 19:27 101 dr-xr-xr-x 9 root root 0 Feb 7 19:27 999 dr-xr-xr-x 2 root root 0 Feb 8 01:18 acpi -r--r--r-- 1 root root 0 Feb 8 01:18 buddyinfo dr-xr-xr-x 4 root root 0 Feb 8 01:18 bus -r--r--r-- 1 root root 0 Feb 8 01:18 cgroups -r--r--r-- 1 root root 0 Feb 8 01:18 cmdline -r--r--r-- 1 root root 0 Feb 8 01:18 consoles -r--r--r-- 1 root root 0 Feb 8 01:18 cpuinfo -r--r--r-- 1 root root 0 Feb 8 01:18 crypto -r--r--r-- 1 root root 0 Feb 8 01:18 devices -r--r--r-- 1 root root 0 Feb 8 01:18 diskstats -r--r--r-- 1 root root 0 Feb 8 01:18 dma dr-xr-xr-x 2 root root 0 Feb 8 01:18 driver -r--r--r-- 1 root root 0 Feb 8 01:18 execdomains -r--r--r-- 1 root root 0 Feb 8 01:18 fb -r--r--r-- 1 root root 0 Feb 8 01:18 filesystems dr-xr-xr-x 4 root root 0 Feb 8 01:18 fs -r--r--r-- 1 root root 0 Feb 8 01:18 interrupts -r--r--r-- 1 root root 0 Feb 8 01:18 iomem -r--r--r-- 1 root root 0 Feb 8 01:18 ioports dr-xr-xr-x 3 root root 0 Feb 8 01:18 ipmi dr-xr-xr-x 53 root root 0 Feb 8 01:18 irq -r--r--r-- 1 root root 0 Feb 8 01:18 kallsyms -r-------- 1 root root 128T Feb 8 01:18 kcore -r--r--r-- 1 root root 0 Feb 8 01:18 keys -r--r--r-- 1 root root 0 Feb 8 01:18 key-users -r-------- 1 root root 0 Feb 8 01:18 kmsg -r-------- 1 root root 0 Feb 8 01:18 kpagecount -r-------- 1 root root 0 Feb 8 01:18 kpageflags -r--r--r-- 1 root root 0 Feb 8 01:18 loadavg -r--r--r-- 1 root root 0 Feb 8 01:18 locks -r--r--r-- 1 root root 0 Feb 8 01:18 mdstat -r--r--r-- 1 root root 0 Feb 8 01:18 meminfo -r--r--r-- 1 root root 0 Feb 8 01:18 misc -r--r--r-- 1 root root 0 Feb 8 01:18 modules lrwxrwxrwx 1 root root 11 Feb 8 01:18 mounts -> self/mounts -rw-r--r-- 1 root root 0 Feb 7 17:55 mtrr lrwxrwxrwx 1 root root 8 Feb 8 01:18 net -> self/net -r--r--r-- 1 root root 0 Feb 8 01:18 pagetypeinfo -r--r--r-- 1 root root 0 Feb 8 01:18 partitions -r--r--r-- 1 root root 0 Feb 8 01:18 sched_debug -r--r--r-- 1 root root 0 Feb 8 01:18 schedstat dr-xr-xr-x 3 root root 0 Feb 8 01:18 scsi lrwxrwxrwx 1 root root 0 Feb 7 17:54 self -> 16779 -r-------- 1 root root 0 Feb 8 01:18 slabinfo -r--r--r-- 1 root root 0 Feb 8 01:18 softirqs -r--r--r-- 1 root root 0 Feb 8 01:18 stat -r--r--r-- 1 root root 0 Feb 7 17:54 swaps dr-xr-xr-x 1 root root 0 Feb 7 17:54 sys --w------- 1 root root 0 Feb 8 01:18 sysrq-trigger dr-xr-xr-x 2 root root 0 Feb 8 01:18 sysvipc -r--r--r-- 1 root root 0 Feb 8 01:18 timer_list -rw-r--r-- 1 root root 0 Feb 8 01:18 timer_stats dr-xr-xr-x 4 root root 0 Feb 8 01:18 tty -r--r--r-- 1 root root 0 Feb 8 01:18 uptime -r--r--r-- 1 root root 0 Feb 8 01:18 version -r-------- 1 root root 0 Feb 8 01:18 vmallocinfo -r--r--r-- 1 root root 0 Feb 8 01:18 vmstat -r--r--r-- 1 root root 0 Feb 8 01:18 zoneinfo
2、/proc/<PID>
每个数字命名的文件实际上是一个进程,进程可能是一个shell命令。
查看进程下相关文件可以获取进程的详细信息。进程文件大小为0如何看到进程详细信息的呢?进程下这些文件可以看做这个是一个内核的窗口,这些文件并不包含一些数据,他实际上是指向进程信息的一个指针。
[root@localhost 460]# ls -lah /proc/1600/ total 0 dr-xr-xr-x 9 root root 0 Feb 7 19:27 . dr-xr-xr-x 628 root root 0 Feb 7 17:54 .. dr-xr-xr-x 2 root root 0 Feb 8 01:18 attr -rw-r--r-- 1 root root 0 Feb 8 01:18 autogroup -r-------- 1 root root 0 Feb 8 01:18 auxv -r--r--r-- 1 root root 0 Feb 8 01:18 cgroup --w------- 1 root root 0 Feb 8 01:18 clear_refs -r--r--r-- 1 root root 0 Feb 7 19:27 cmdline -rw-r--r-- 1 root root 0 Feb 8 01:18 comm -rw-r--r-- 1 root root 0 Feb 8 01:18 coredump_filter -r--r--r-- 1 root root 0 Feb 8 01:18 cpuset lrwxrwxrwx 1 root root 0 Feb 8 01:18 cwd -> / -r-------- 1 root root 0 Feb 8 01:18 environ lrwxrwxrwx 1 root root 0 Feb 8 01:18 exe -> /usr/sbin/sshd dr-x------ 2 root root 0 Feb 8 01:18 fd dr-x------ 2 root root 0 Feb 8 01:18 fdinfo -rw-r--r-- 1 root root 0 Feb 8 01:18 gid_map -r-------- 1 root root 0 Feb 8 01:18 io -r--r--r-- 1 root root 0 Feb 8 01:18 limits -rw-r--r-- 1 root root 0 Feb 8 01:18 loginuid dr-x------ 2 root root 0 Feb 8 01:18 map_files -r--r--r-- 1 root root 0 Feb 8 01:18 maps -rw------- 1 root root 0 Feb 8 01:18 mem -r--r--r-- 1 root root 0 Feb 8 01:18 mountinfo -r--r--r-- 1 root root 0 Feb 8 01:18 mounts -r-------- 1 root root 0 Feb 8 01:18 mountstats dr-xr-xr-x 6 root root 0 Feb 8 01:18 net dr-x--x--x 2 root root 0 Feb 8 01:18 ns -r--r--r-- 1 root root 0 Feb 8 01:18 numa_maps -rw-r--r-- 1 root root 0 Feb 8 01:18 oom_adj -r--r--r-- 1 root root 0 Feb 8 01:18 oom_score -rw-r--r-- 1 root root 0 Feb 8 01:18 oom_score_adj -r--r--r-- 1 root root 0 Feb 8 01:18 pagemap -r-------- 1 root root 0 Feb 8 01:18 patch_state -r--r--r-- 1 root root 0 Feb 8 01:18 personality -rw-r--r-- 1 root root 0 Feb 8 01:18 projid_map lrwxrwxrwx 1 root root 0 Feb 8 01:18 root -> / -rw-r--r-- 1 root root 0 Feb 8 01:18 sched -r--r--r-- 1 root root 0 Feb 8 01:18 schedstat -r--r--r-- 1 root root 0 Feb 8 01:18 sessionid -rw-r--r-- 1 root root 0 Feb 8 01:18 setgroups -r--r--r-- 1 root root 0 Feb 8 01:18 smaps -r--r--r-- 1 root root 0 Feb 8 01:18 stack -r--r--r-- 1 root root 0 Feb 7 23:54 stat -r--r--r-- 1 root root 0 Feb 7 23:54 statm -r--r--r-- 1 root root 0 Feb 7 19:27 status -r--r--r-- 1 root root 0 Feb 8 01:18 syscall dr-xr-xr-x 3 root root 0 Feb 8 01:18 task -r--r--r-- 1 root root 0 Feb 8 01:18 timers -rw-r--r-- 1 root root 0 Feb 8 01:18 uid_map -r--r--r-- 1 root root 0 Feb 8 01:18 wchan [root@localhost 460]#
2.1、/proc/<PID>/cmdline
命令行参数
2.2、/proc/<PID>/cpu
当前或最后执行这个进程的cpu
2.3、/proc/<PID>/cwd
链接到当前的进程工作目录(一般为/根目录)
2.4、/proc/<PID>/environ
进程运行时的环境变量
2.5、/proc/<PID>/exe
链接到此进程的可执行文件
2.6、/proc/<PID>/fd
包含进程所使用的所有文件
2.7、/proc/<PID>/maps
可执行文件或库映射的memory
2.8、/proc/<PID>/mem
此进程使用的memory
2.9、/proc/<PID>/root
此进程链接到root用户目录
2.10、/proc/<PID>/stat
此进程的状态
2.11、/proc/<PID>/statm
进程 memory 状态信息
2.12、/proc/<PID>/status
人们便读的进程状态信息
3、/proc/interrupts
/proc/interrupts [root@(none) ~]# cat /proc/interrupts CPU0 CPU1 CPU2 CPU3 CPU4 CPU5 1: 0 0 0 0 0 0 GICv3 25 Level vgic 3: 0 0 0 0 0 0 GICv3 30 Level kvm guest ptimer 4: 0 0 0 0 0 0 GICv3 27 Level kvm guest vtimer 5: 101996856 80352917 80376035 80376004 80375984 80375935 GICv3 26 Level arch_timer 6: 0 0 0 0 0 0 GICv3 23 Level arm-pmu 7: 3570 0 0 0 0 0 GICv3 32 Level uart-pl011 11: 0 0 0 0 0 0 GICv3 40 Level 8020000a0000.watch-dog 12: 0 0 0 0 0 0 ITS-pMSI 0 Edge arm-smmu-v3-evtq 13: 0 0 0 0 0 0 ITS-pMSI 1 Edge arm-smmu-v3-gerror 14: 3 0 0 0 0 0 ITS-MSI 786432 Edge cgx_fwi_0_0 23: 1 0 0 0 0 0 ITS-MSI 786441 Edge cgx_fwi_0_1 32: 1 0 0 0 0 0 ITS-MSI 786450 Edge cgx_fwi_0_2 41: 1 0 0 0 0 0 ITS-MSI 786459 Edge cgx_fwi_0_3 53: 4 0 0 0 0 0 ITS-MSI 268959745 Edge RVUAF FLR 54: 14 0 0 0 0 0 ITS-MSI 268959746 Edge RVUAF ME 56: 344 0 0 0 0 0 ITS-MSI 268959748 Edge RVUAF Mbox 57: 0 0 0 0 0 0 ITS-MSI 268959749 Edge RVUAFVF FLR0 58: 0 0 0 0 0 0 ITS-MSI 268959750 Edge RVUAFVF FLR1 59: 8 0 0 0 0 0 ITS-MSI 268959751 Edge RVUAFVF ME0 60: 0 0 0 0 0 0 ITS-MSI 268959752 Edge RVUAFVF ME1 61: 40 0 0 0 0 0 ITS-MSI 268959753 Edge RVUAFVF Mbox0 62: 0 0 0 0 0 0 ITS-MSI 268959754 Edge RVUAFVF Mbox1
表示正在使用的中断
/proc/interrupts文件是动态收集相关数据并显示的。
4、/proc/apm
高级电源管理信息
5、/proc/bus
包含总线细节信息的文件夹
6、/proc/cmdline
内核传参命令行
7、/proc/cpuinfo
包含处理器相关信息,例如类型、组装、模型、性能
8、/proc/devices
罗列当前运行内核配置了驱动的设备(block和character)
9、/proc/dma
显示此时正在使用的dma
10、/proc/driver
各种驱动,但是当前为rtc
11、/proc/execdomains
Execdomains,与安全相关
12、/proc/fd
帧缓存设备
13、/proc/filesystems
内核配置的或支持的文件系统
14、/proc/fs
文件系统参数,当前是nfs/exports
15、/proc/ide
此子目录包含所有内核扫描到的IDE设备信息,每一个IDE控制器、驱动、IDE设备均有一
个子目录,指向控制器子树下的设备文件。
驱动文件包含IDE设备使用的驱动信息。可以在控制器子目录里有更详细信息。他们被命令为ide0、ide1,这些文件包含这些内容。
/*ide 未完**/
16、/proc/interrupts
显示正在使用的中断,以及显示每个中断发生的次数。
16.1 LOC&&ERR
在2.4内核以后,此文件添加了LOC&&ERR(这个是SMP的输出)
[root@localhost test_ko]# cat /proc/interrupts | grep -E "ERR|LOC" LOC: 2353386190 1084063652 2337597268 216915500 230618715 919 906 899 1270 887 2109515 2705850549 2109366693 569896502 378720244 168888984 516221152 618341020 811559772 1203516526 2095021535 2124590049 2329475 736 2103896360 2081289857 714 708 702 696 690 683 2111935120 657 652 644 638 631 625 2124611949 Local timer interrupts ERR: 0
LOC 是每个cpu内部APIC的一个本地中断计数器(local interrupts)
IO-APIC bus 出错会导致ERR 增加(IO-APIC bus是SMP系统连接cpu之间的总线),这意味着ERR错误出现,IO-APIC会自动尝试重传,这个问题不严重,但也需要关注SMP-FAQ。
16.2 affinity
2.4 内核新增一个文件,这个文件可以可以设置IRQ 和 CPU 的affinity,可以将一个中断只绑定在一个cpu上,或将某cpu排除在处理IRQ的cpu之外。/proc/irq 里面包含中断子目录以及一个default_smp_affinity文件(kernel 2.6 应该是prof_cpu_mask)
[root@localhost test_ko]# ls /proc/irq/ 0 10 105 107 109 110 12 14 16 24 27 3 31 33 35 37 39 40 44 50 6 8 default_smp_affinity 1 104 106 108 11 111 13 15 2 25 29 30 32 34 36 38 4 42 5 51 7 9 [root@localhost test_ko]# cat /proc/irq/0/smp_affinity 00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000001
default_smp_affinity 和 smp_affinity 里面为cpu 掩码形式(bitmask),想设置哪些cpu可以处理中断,可以echo cpu_mask > default_smp_affinity
echo 1 > /proc/irq/prof_cpu_mask
上面意味着第一个cpu能处理中断,echo 5 代表着第一个、第三个cpu可以处理中断,IRQ的route是由IO_APIC决定的,它允许处理IRQ在所有允许的CPU之间循环。由于内核很多的job、information 需要处理,所以默认是所有cpu均可处理。
17、/proc/iomem
Memory 映射
18、/proc/ioports
此时正在使用的 I/O ports
19、/proc/irq
标识irq的affinity20、/proc/isapnp
ISA PnP (Plug&Play) Info.
21、/proc/kcore
此系统物理内存存储的Image(ELF或A.OUT A.OUT 2.4已经被弃用),与物理内存实际占用相同,但不会占用太多内存,他是在程序访问时动态生成的(除非将其拷贝到其他地方,否则/proc 下文件基本上不会占用disk存储)
22、/proc/kmsg
内核输出的信息,这些信息也会route到syslog
23、/proc/ksyms、/proc/kallsyms
内核符号表
24、/proc/meminfo
内存使用的相关信息,包括物理内存和swap交换分区内存。此文件会产生‘free’或'top'前面几行一样的结果
25、/proc/misc
misc杂项设备相关信息,在proc 文件系统这些信息这些信息没有实际的空间。
26、/proc/modules
内核最近加载的modules,它输出内容同‘lsmod’相同
27、/proc/mounts
挂载的文件系统
28、/proc/mtrr
29、/proc/net
网络控制相关信息
未完!!!
参考:
https://tldp.org/LDP/Linux-Filesystem-Hierarchy/html/proc.html
man proc 可以查看更多详细信息