Linux proc 目录详解

Linux 上的 /proc 目录是一种文件系统,即 proc 文件系统。与其它常见的文件系统不同的是,/proc 是一种伪文件系统(也即虚拟文件系统),存储的是当前内核运行状态的一系列特殊文件,用户可以通过这些文件查看有关系统硬件及当前正在运行进程的信息,甚至可以通过更改其中某些文件来改变内核的运行状态。

基于 /proc 文件系统如上所述的特殊性,其内的文件也常被称作虚拟文件,并具有一些独特的特点。例如:

  • 有些文件虽然使用查看命令查看时会返回大量信息,但文件本身的大小却会显示为 0 字节。
  • 这些特殊文件中大多数文件的时间及日期属性通常为当前系统时间和日期,这跟它们随时会被刷新(存储于RAM中)有关。

为了查看及使用上的方便,这些文件通常会按照相关性进行分类存储于不同的目录甚至子目录中,如

  • /proc/scsi 目录中存储的就是当前系统上所有 SCSI 设备的相关信息,
  • /proc/N 中存储的则是系统当前正在运行的进程的相关信息,其中N为正在运行的进程(可以想象得到,在某进程结束后其相关目录则会消失)。

大多数虚拟文件可以使用文件查看命令如 cat、more 或者 less 进行查看,有些文件信息表述的内容可以一目了然,但也有文件的信息却不怎么具有可读性。不过,这些可读性较差的文件在使用一些命令如 apm、free、lspci 或 top 查看时却可以有着不错的表现。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
[root@192 ~]# ll /proc
总用量 0
dr-xr-xr-x. 9 root root 0 8月 30 16:48 1 # 目录中包含许多以数字命名的子目录,这些数字表示系统当前正在运行进程的进程号,里面包含对应进程相关的多个信息文件
dr-xr-xr-x. 9 root root 0 8月 30 16:48 10
dr-xr-xr-x. 9 root root 0 8月 30 16:48 1017
dr-xr-xr-x. 9 root root 0 8月 30 16:48 1019
dr-xr-xr-x. 9 root root 0 8月 30 16:48 1021
dr-xr-xr-x. 9 root root 0 8月 30 16:48 11
dr-xr-xr-x. 9 root root 0 8月 30 19:06 1284
dr-xr-xr-x. 9 root root 0 8月 30 16:48 13
dr-xr-xr-x. 9 root root 0 8月 30 16:48 14
dr-xr-xr-x. 9 root root 0 8月 30 16:48 7
dr-xr-xr-x. 9 root root 0 8月 30 16:48 8
dr-xr-xr-x. 9 root root 0 8月 30 16:48 9
dr-xr-xr-x. 9 root root 0 8月 30 16:48 95
... 这种类型的还有很多

dr-xr-xr-x. 2 root root 0 8月 30 23:20 acpi
dr-xr-xr-x. 5 root root 0 8月 30 23:20 asound
-r--r--r--. 1 root root 0 8月 30 23:20 buddyinfo # 用于诊断内存碎片问题的相关信息文件
dr-xr-xr-x. 4 root root 0 8月 30 23:20 bus
-r--r--r--. 1 root root 0 8月 30 23:20 cgroups
-r--r--r--. 1 root root 0 8月 30 23:20 cmdline # 在启动时传递至内核的相关参数信息,这些信息通常由lilo或grub等启动管理工具进行传递
-r--r--r--. 1 root root 0 8月 30 23:20 consoles
-r--r--r--. 1 root root 0 8月 30 23:20 cpuinfo # 包含了有关 CPU 的详细信息,包括厂商、型号、频率、缓存等信息
-r--r--r--. 1 root root 0 8月 30 23:20 crypto # 系统上已安装的内核使用的密码算法及每个算法的详细信息列表
-r--r--r--. 1 root root 0 8月 30 23:20 devices # 系统已经加载的所有块设备和字符设备的信息,包含主设备号和设备组(与主设备号对应的设备类型)名;
-r--r--r--. 1 root root 0 8月 30 23:20 diskstats # 每块磁盘设备的磁盘I/O统计信息列表;(内核2.5.69以后的版本支持此功能)
-r--r--r--. 1 root root 0 8月 30 23:20 dma # 每个正在使用且注册的ISA DMA通道的信息列表
dr-xr-xr-x. 2 root root 0 8月 30 23:20 driver
-r--r--r--. 1 root root 0 8月 30 23:20 execdomains # 内核当前支持的执行域(每种操作系统独特“个性”)信息列表
-r--r--r--. 1 root root 0 8月 30 23:20 fb # 帧缓冲设备列表文件,包含帧缓冲设备的设备号和相关驱动信息
-r--r--r--. 1 root root 0 8月 30 23:20 filesystems # 当前被内核支持的文件系统类型列表文件,被标示为nodev的文件系统表示不需要块设备的支持;通常mount一个设备时,如果没有指定文件系统类型将通过此文件来决定其所需文件系统的类型
dr-xr-xr-x. 4 root root 0 8月 30 23:20 fs
-r--r--r--. 1 root root 0 8月 30 23:20 interrupts # X86 或 X86_64 体系架构系统上每个 IRQ 相关的中断号列表;多路处理器平台上每个CPU对于每个I/O设备均有自己的中断号;
-r--r--r--. 1 root root 0 8月 30 23:20 iomem # 每个物理设备上的记忆体(RAM或者ROM)在系统内存中的映射信息
-r--r--r--. 1 root root 0 8月 30 23:20 ioports # 当前正在使用且已经注册过的与物理设备进行通讯的输入-输出端口范围信息列表;
dr-xr-xr-x. 56 root root 0 8月 30 23:20 irq
-r--r--r--. 1 root root 0 8月 30 23:20 kallsyms # 模块管理工具用来动态链接或绑定可装载模块的符号定义,由内核输出;(内核2.5.71以后的版本支持此功能);通常这个文件中的信息量相当大
-r--------. 1 root root 140737486266368 8月 30 23:20 kcore # 系统使用的物理内存,以ELF核心文件(core file)格式存储,其文件大小为已使用的物理内存(RAM)加上4KB;这个文件用来检查内核数据结构的当前状态,因此,通常由GBD通常调试工具使用,但不能使用文件查看命令打开此文件
-r--r--r--. 1 root root 0 8月 30 23:20 keys
-r--r--r--. 1 root root 0 8月 30 23:20 key-users
-r--------. 1 root root 0 8月 30 23:20 kmsg # 此文件用来保存由内核输出的信息,通常由 /sbin/klogd 或 /bin/dmsg 等程序使用,不要试图使用查看命令打开此文件;
-r--------. 1 root root 0 8月 30 23:20 kpagecount
-r--------. 1 root root 0 8月 30 23:20 kpageflags
-r--r--r--. 1 root root 0 8月 30 23:20 loadavg # 保存关于CPU和磁盘I/O的负载平均值,其前三列分别表示每1秒钟、每5秒钟及每15秒的负载平均值,类似于uptime命令输出的相关信息;第四列是由斜线隔开的两个数值,前者表示当前正由内核调度的实体(进程和线程)的数目,后者表示系统当前存活的内核调度实体的数目;第五列表示此文件被查看前最近一个由内核创建的进程的PID;
-r--r--r--. 1 root root 0 8月 30 23:20 locks # 保存当前由内核锁定的文件的相关信息,包含内核内部的调试数据;每个锁定占据一行,且具有一个惟一的编号;
-r--r--r--. 1 root root 0 8月 30 23:20 mdstat # 保存RAID相关的多块磁盘的当前状态信息,在没有使用RAID机器上,其显示为如下状态:
-r--r--r--. 1 root root 0 8月 30 23:20 meminfo # 系统中关于当前内存的利用状况等的信息,包括可用内存、缓存大小、交换分区等信息。常由free命令使用;可以使用文件查看命令直接读取此文件,其内容显示为两列,前者为统计属性,后者为对应的值
-r--r--r--. 1 root root 0 8月 30 23:20 misc
-r--r--r--. 1 root root 0 8月 30 23:20 modules # 当前装入内核的所有模块名称列表,可以由lsmod命令使用,也可以直接查看
lrwxrwxrwx. 1 root root 11 8月 30 23:20 mounts -> self/mounts # 在内核2.4.29版本以前,此文件的内容为系统当前挂载的所有文件系统,在2.4.19以后的内核中引进了每个进程使用独立挂载名称空间的方式,此文件则随之变成了指向/proc/self/mounts(每个进程自身挂载名称空间中的所有挂载点列表)文件的符号链接;/proc/self是一个独特的目录,后文中会对此目录进行介绍;
dr-xr-xr-x. 3 root root 0 8月 30 23:20 mpt
-rw-r--r--. 1 root root 0 8月 30 23:20 mtrr
lrwxrwxrwx. 1 root root 8 8月 30 23:20 net -> self/net
-r--------. 1 root root 0 8月 30 23:20 pagetypeinfo
-r--r--r--. 1 root root 0 8月 30 23:20 partitions # 块设备每个分区的主设备号(major)和次设备号(minor)等信息,同时包括每个分区所包含的块(block)数目(如下面输出中第三列所示);
-r--r--r--. 1 root root 0 8月 30 23:20 sched_debug
-r--r--r--. 1 root root 0 8月 30 23:20 schedstat
dr-xr-xr-x. 4 root root 0 8月 30 23:20 scsi
lrwxrwxrwx. 1 root root 0 8月 30 16:48 self -> 2189
-r--------. 1 root root 0 8月 30 23:20 slabinfo # 在内核中频繁使用的对象(如inode、dentry等)都有自己的cache,即slab pool,而 /proc/slabinfo 文件列出了这些对象相关 slap 的信息;
-r--r--r--. 1 root root 0 8月 30 23:20 softirqs
-r--r--r--. 1 root root 0 8月 30 23:20 stat # 实时追踪自系统上次启动以来的多种统计信息;
-r--r--r--. 1 root root 0 8月 30 16:48 swaps # 当前系统上的交换分区及其空间利用信息,如果有多个交换分区的话,则会每个交换分区的信息分别存储于/proc/swap目录中的单独文件中,而其优先级数字越低,被使用到的可能性越大;
dr-xr-xr-x. 1 root root 0 8月 30 16:48 sys
--w-------. 1 root root 0 8月 30 23:20 sysrq-trigger
dr-xr-xr-x. 2 root root 0 8月 30 23:20 sysvipc
-r--r--r--. 1 root root 0 8月 30 23:20 timer_list
-rw-r--r--. 1 root root 0 8月 30 23:20 timer_stats
dr-xr-xr-x. 4 root root 0 8月 30 23:20 tty
-r--r--r--. 1 root root 0 8月 30 23:20 uptime # 系统上次启动以来的运行时间,其第一个数字表示系统运行时间,第二个数字表示系统空闲时间,单位是秒;
-r--r--r--. 1 root root 0 8月 30 23:20 version # 当前系统运行的内核版本号,包括内核版本、GCC 版本等信息。
-r--------. 1 root root 0 8月 30 23:20 vmallocinfo
-r--r--r--. 1 root root 0 8月 30 23:20 vmstat # 当前系统虚拟内存的多种统计数据,信息量可能会比较大,这因系统而有所不同,可读性较好;
-r--r--r--. 1 root root 0 8月 30 23:20 zoneinfo # 内存区域(zone)的详细信息列表,信息量较大,

2 部分目录展示

2.1 /proc/cpuinifo CPU 的信息(型号、家族、缓存大小等)

该文件包含了当前系统 CPU 的参数信息,包括 CPU 的核心数量、每个核心的工作频率、缓存大小、字宽地址线长度等

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
[root@192 ~]# cat /proc/cpuinfo
processor : 0
vendor_id : GenuineIntel
cpu family : 6
model : 142
model name : Intel(R) Core(TM) i5-7200U CPU @ 2.50GHz
stepping : 9
microcode : 0xde
cpu MHz : 2712.002
cache size : 3072 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 ss syscall nx pdpe1gb rdtscp lm constant_tsc arch_perfmon nopl xtopology tsc_reliable nonstop_tsc eagerfpu pni pclmulqdq ssse3 fma cx16 pcid sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand hypervisor lahf_lm abm 3dnowprefetch invpcid_single ssbd ibrs ibpb stibp fsgsbase tsc_adjust bmi1 avx2 smep bmi2 invpcid rdseed adx smap clflushopt xsaveopt xsavec xgetbv1 arat md_clear spec_ctrl intel_stibp flush_l1d arch_capabilities
bogomips : 5424.00
clflush size : 64
cache_alignment : 64
address sizes : 45 bits physical, 48 bits virtual
power management:

2.2 /proc/meminfo 物理内存、交换空间

这个文件显示的是系统中当前的内存状态信息,如物理内存总容量、已使用内存、空闲内存、共享内存、交换内存大小,等等。

在日常的开发工作中,开发者通常更偏向于通过 top 命令的输出,查看系统当前的内存使用状况,因为大多数时候,只关心内存的总量和当前的占用量就足够了。

但是在某些特殊情况下,还是需要参考这个文件中提供的更加详细的内存状态信息,如 slab 内存占用量(记录在一个页框中如何划分和分配小存储区用的内存)、可回收内存量 (SReclaimable)、内核栈空间大小(Kernel Stack)、使用 malloc 分配的堆内存总量,以及使用 mmap 映射的内存总量,等等。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
[root@192 ~]# cat /proc/meminfo
MemTotal: 995676 kB
MemFree: 689556 kB
MemAvailable: 674300 kB
Buffers: 2108 kB
Cached: 95772 kB
SwapCached: 0 kB
Active: 86368 kB
Inactive: 73484 kB
Active(anon): 62468 kB
Inactive(anon): 7300 kB
Active(file): 23900 kB
Inactive(file): 66184 kB
Unevictable: 0 kB
Mlocked: 0 kB
SwapTotal: 2097148 kB
SwapFree: 2097148 kB
Dirty: 16 kB
Writeback: 0 kB
AnonPages: 62004 kB
Mapped: 23952 kB
Shmem: 7796 kB
Slab: 58156 kB
SReclaimable: 22172 kB
SUnreclaim: 35984 kB
KernelStack: 3856 kB
PageTables: 3824 kB
NFS_Unstable: 0 kB
Bounce: 0 kB
WritebackTmp: 0 kB
CommitLimit: 2594984 kB
Committed_AS: 314776 kB
VmallocTotal: 34359738367 kB
VmallocUsed: 181636 kB
VmallocChunk: 34359310332 kB
Percpu: 34816 kB
HardwareCorrupted: 0 kB
AnonHugePages: 4096 kB
CmaTotal: 0 kB
CmaFree: 0 kB
HugePages_Total: 0
HugePages_Free: 0
HugePages_Rsvd: 0
HugePages_Surp: 0
Hugepagesize: 2048 kB
DirectMap4k: 71552 kB
DirectMap2M: 976896 kB
DirectMap1G: 0 kB

2.3 /proc/mounts 已加载的文件系统的列表

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
[root@192 ~]# cat /proc/mounts
sysfs /sys sysfs rw,seclabel,nosuid,nodev,noexec,relatime 0 0
proc /proc proc rw,nosuid,nodev,noexec,relatime 0 0
devtmpfs /dev devtmpfs rw,seclabel,nosuid,size=485752k,nr_inodes=121438,mode=755 0 0
securityfs /sys/kernel/security securityfs rw,nosuid,nodev,noexec,relatime 0 0
tmpfs /dev/shm tmpfs rw,seclabel,nosuid,nodev 0 0
devpts /dev/pts devpts rw,seclabel,nosuid,noexec,relatime,gid=5,mode=620,ptmxmode=000 0 0
tmpfs /run tmpfs rw,seclabel,nosuid,nodev,mode=755 0 0
tmpfs /sys/fs/cgroup tmpfs ro,seclabel,nosuid,nodev,noexec,mode=755 0 0
cgroup /sys/fs/cgroup/systemd cgroup rw,seclabel,nosuid,nodev,noexec,relatime,xattr,release_agent=/usr/lib/systemd/systemd-cgroups-agent,name=systemd 0 0
pstore /sys/fs/pstore pstore rw,nosuid,nodev,noexec,relatime 0 0
cgroup /sys/fs/cgroup/memory cgroup rw,seclabel,nosuid,nodev,noexec,relatime,memory 0 0
cgroup /sys/fs/cgroup/hugetlb cgroup rw,seclabel,nosuid,nodev,noexec,relatime,hugetlb 0 0
cgroup /sys/fs/cgroup/net_cls,net_prio cgroup rw,seclabel,nosuid,nodev,noexec,relatime,net_prio,net_cls 0 0
cgroup /sys/fs/cgroup/blkio cgroup rw,seclabel,nosuid,nodev,noexec,relatime,blkio 0 0
cgroup /sys/fs/cgroup/perf_event cgroup rw,seclabel,nosuid,nodev,noexec,relatime,perf_event 0 0
cgroup /sys/fs/cgroup/devices cgroup rw,seclabel,nosuid,nodev,noexec,relatime,devices 0 0
cgroup /sys/fs/cgroup/pids cgroup rw,seclabel,nosuid,nodev,noexec,relatime,pids 0 0
cgroup /sys/fs/cgroup/cpu,cpuacct cgroup rw,seclabel,nosuid,nodev,noexec,relatime,cpuacct,cpu 0 0
cgroup /sys/fs/cgroup/freezer cgroup rw,seclabel,nosuid,nodev,noexec,relatime,freezer 0 0
cgroup /sys/fs/cgroup/cpuset cgroup rw,seclabel,nosuid,nodev,noexec,relatime,cpuset 0 0
configfs /sys/kernel/config configfs rw,relatime 0 0
/dev/mapper/centos_192-root / xfs rw,seclabel,relatime,attr2,inode64,noquota 0 0
selinuxfs /sys/fs/selinux selinuxfs rw,relatime 0 0
systemd-1 /proc/sys/fs/binfmt_misc autofs rw,relatime,fd=31,pgrp=1,timeout=0,minproto=5,maxproto=5,direct,pipe_ino=13681 0 0
hugetlbfs /dev/hugepages hugetlbfs rw,seclabel,relatime 0 0
debugfs /sys/kernel/debug debugfs rw,relatime 0 0
mqueue /dev/mqueue mqueue rw,seclabel,relatime 0 0
/dev/sda1 /boot xfs rw,seclabel,relatime,attr2,inode64,noquota 0 0
tmpfs /run/user/0 tmpfs rw,seclabel,nosuid,nodev,relatime,size=99568k,mode=700 0 0

2.4 /proc/devices 可用设备的列表

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
[root@192 ~]# cat /proc/devices
Character devices:
1 mem
4 /dev/vc/0
4 tty
4 ttyS
5 /dev/tty
5 /dev/console
5 /dev/ptmx
7 vcs
10 misc
13 input
14 sound
21 sg
29 fb
99 ppdev
116 alsa
128 ptm
136 pts
162 raw
180 usb
188 ttyUSB
189 usb_device
202 cpu/msr
203 cpu/cpuid
226 drm
243 aux
244 dimmctl
245 ndctl
246 hidraw
247 usbmon
248 bsg
249 hmm_device
250 watchdog
251 iio
252 rtc
253 dax
254 tpm

Block devices:
259 blkext
8 sd
9 md
11 sr
65 sd
66 sd
67 sd
68 sd
69 sd
70 sd
71 sd
128 sd
129 sd
130 sd
131 sd
132 sd
133 sd
134 sd
135 sd
253 device-mapper
254 mdp

2.5 /proc/filesystems 被支持的文件系统

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
[root@192 ~]# cat /proc/filesystems
nodev sysfs
nodev rootfs
nodev ramfs
nodev bdev
nodev proc
nodev cgroup
nodev cpuset
nodev tmpfs
nodev devtmpfs
nodev debugfs
nodev securityfs
nodev sockfs
nodev dax
nodev bpf
nodev pipefs
nodev configfs
nodev devpts
nodev hugetlbfs
nodev autofs
nodev pstore
nodev mqueue
nodev selinuxfs
xfs

2.6 /proc/modules 已加载的模块

1
2
3
4
5
6
[root@192 ~]# cat /proc/modules
ip6t_rpfilter 12595 1 - Live 0xffffffffc073a000
ip6t_REJECT 12625 2 - Live 0xffffffffc0735000
nf_reject_ipv6 13717 1 ip6t_REJECT, Live 0xffffffffc0730000
ipt_REJECT 12541 2 - Live 0xffffffffc072b000
...

2.7 /proc/virsion 内核版本

1
2
[root@192 ~]# cat /proc/version
Linux version 3.10.0-1160.el7.x86_64 (mockbuild@kbuilder.bsys.centos.org) (gcc version 4.8.5 20150623 (Red Hat 4.8.5-44) (GCC) ) #1 SMP Mon Oct 19 16:18:59 UTC 2020

2.8 /proc/cmdline 系统启动时输入的内核命令行参数

1
2
[root@192 ~]# cat /proc/cmdline
BOOT_IMAGE=/vmlinuz-3.10.0-1160.el7.x86_64 root=/dev/mapper/centos_192-root ro crashkernel=auto spectre_v2=retpoline rd.lvm.lv=centos_192/root rd.lvm.lv=centos_192/swap rhgb quiet LANG=zh_CN.UTF-8

2.9 /proc/uptime 获取系统的正常运行时间

1
2
[root@192 ~]# cat /proc/uptime
14985.88 11766.31

2.10 /proc/kallsyms

该文件是一个符号表,包含了内核的所有全局变量和函数在内存中的地址。

这是一个帮助内核开发者调试内核而加入的文件,在 Linux 系统崩渍时产生的 Opps 信息中,函数调用堆栈中显示出来的函数名,就是在这个文件的帮助下生成的。

1
2
3
4
5
6
7
8
[root@192 ~]# cat /proc/kallsyms
...
ffffffffc014a3e0 t dm_get_reserved_bio_based_ios [dm_mod]
ffffffffc01500e0 t dm_table_get_immutable_target [dm_mod]
ffffffffc014f180 T dm_consume_args [dm_mod]
ffffffffc0155660 t dm_copy_name_and_uuid [dm_mod]
ffffffffc015a7a0 t dm_request_based [dm_mod]
...

2.11 /proc/interrupts

该文件包含了系统记录的在每个 CPU 上处理的各类中断的计数信息。

在Linux 中,如果没有特殊的处理,通常所有的中断都会交给 CPU 的第一个核心(CPUO)来处理。有一个叫做 rqbalance 的实用程序可以帮助系统把中断分发给不同的 CPU,实现负载均衡,对多核处理器的性能提升和控制能耗都有明显的作用。

当前的大多数 Linux 发行版都会默认在多核处理器上启动这个服务,但是以防万一,读者可以在自己的系统上确认该服务是否开启,同时通过检查 proc/interrupts 文件来确定中断是不是均衡地分发到了不同的 CPU上。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
[root@192 ~]# cat /proc/interrupts 
CPU0
0: 258 IO-APIC-edge timer
1: 60 IO-APIC-edge i8042
8: 1 IO-APIC-edge rtc0
9: 0 IO-APIC-fasteoi acpi
12: 817 IO-APIC-edge i8042
14: 0 IO-APIC-edge ata_piix
15: 32012 IO-APIC-edge ata_piix
16: 5630 IO-APIC-fasteoi vmwgfx, snd_ens1371
17: 5759 IO-APIC-fasteoi ehci_hcd:usb1, ioc0
18: 65 IO-APIC-fasteoi uhci_hcd:usb2
19: 37053 IO-APIC-fasteoi ens33
24: 0 PCI-MSI-edge PCIe PME, pciehp
25: 0 PCI-MSI-edge PCIe PME, pciehp
26: 0 PCI-MSI-edge PCIe PME, pciehp
27: 0 PCI-MSI-edge PCIe PME, pciehp
28: 0 PCI-MSI-edge PCIe PME, pciehp
29: 0 PCI-MSI-edge PCIe PME, pciehp
30: 0 PCI-MSI-edge PCIe PME, pciehp
31: 0 PCI-MSI-edge PCIe PME, pciehp
32: 0 PCI-MSI-edge PCIe PME, pciehp
33: 0 PCI-MSI-edge PCIe PME, pciehp
34: 0 PCI-MSI-edge PCIe PME, pciehp
35: 0 PCI-MSI-edge PCIe PME, pciehp
36: 0 PCI-MSI-edge PCIe PME, pciehp
37: 0 PCI-MSI-edge PCIe PME, pciehp
38: 0 PCI-MSI-edge PCIe PME, pciehp
39: 0 PCI-MSI-edge PCIe PME, pciehp
40: 0 PCI-MSI-edge PCIe PME, pciehp
41: 0 PCI-MSI-edge PCIe PME, pciehp
42: 0 PCI-MSI-edge PCIe PME, pciehp
43: 0 PCI-MSI-edge PCIe PME, pciehp
44: 0 PCI-MSI-edge PCIe PME, pciehp
45: 0 PCI-MSI-edge PCIe PME, pciehp
46: 0 PCI-MSI-edge PCIe PME, pciehp
47: 0 PCI-MSI-edge PCIe PME, pciehp
48: 0 PCI-MSI-edge PCIe PME, pciehp
49: 0 PCI-MSI-edge PCIe PME, pciehp
50: 0 PCI-MSI-edge PCIe PME, pciehp
51: 0 PCI-MSI-edge PCIe PME, pciehp
52: 0 PCI-MSI-edge PCIe PME, pciehp
53: 0 PCI-MSI-edge PCIe PME, pciehp
54: 0 PCI-MSI-edge PCIe PME, pciehp
55: 0 PCI-MSI-edge PCIe PME, pciehp
56: 1 PCI-MSI-edge vmw_vmci
57: 0 PCI-MSI-edge vmw_vmci
NMI: 0 Non-maskable interrupts
LOC: 449703 Local timer interrupts
SPU: 0 Spurious interrupts
PMI: 0 Performance monitoring interrupts
IWI: 29227 IRQ work interrupts
RTR: 0 APIC ICR read retries
RES: 0 Rescheduling interrupts
CAL: 0 Function call interrupts
TLB: 0 TLB shootdowns
TRM: 0 Thermal event interrupts
THR: 0 Threshold APIC interrupts
DFR: 0 Deferred Error APIC interrupts
MCE: 0 Machine check exceptions
MCP: 111 Machine check polls
ERR: 0
MIS: 0
PIN: 0 Posted-interrupt notification event
NPI: 0 Nested posted-interrupt event
PIW: 0 Posted-interrupt wakeup event

2.12 /proc/loadavg

这个文件显示系统在过去一段时间的平均负载,一个真实的输出如下所示:

1
2
[root@192 ~]# cat /proc/loadavg 
0.00 0.01 0.05 2/112 3065

上面的信息,具体含义如下:

  1. 过去一分钟的系统平均负载
  2. 过去五分钟的系统平均负载
  3. 过去十五分钟的系统平均负载
  4. 采样时刻运行队列的任务数/系统中活跃的总任务数
  5. 采样时刻占用最大的线程ID

这个文件的输出中的前三个值,经常被用来观察系统负载的发展趋势。如果前面的值比后面的值小,说明系统的负载在减轻;反之,说明系统负载开始呈现出上升的趋势。

2.13 /proc/partitions 硬盘设备分区信息

1
2
3
4
5
6
7
8
9
[root@192 ~]# cat /proc/partitions
major minor #blocks name

8 0 20971520 sda
8 1 1048576 sda1
8 2 19921920 sda2
11 0 996352 sr0
253 0 17821696 dm-0
253 1 2097152 dm-1

3 进程信息查看

3.1 /proc/N pid 为 N 的进程信息

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
[root@192 ~]# ll /proc/1021/
总用量 0
dr-xr-xr-x. 2 root root 0 8月 31 00:03 attr
-rw-r--r--. 1 root root 0 8月 31 00:03 autogroup
-r--------. 1 root root 0 8月 31 00:03 auxv
-r--r--r--. 1 root root 0 8月 30 16:48 cgroup
--w-------. 1 root root 0 8月 31 00:03 clear_refs
-r--r--r--. 1 root root 0 8月 30 16:48 cmdline # 进程启动命令
-rw-r--r--. 1 root root 0 8月 30 16:48 comm
-rw-r--r--. 1 root root 0 8月 31 00:03 coredump_filter
-r--r--r--. 1 root root 0 8月 31 00:03 cpuset
lrwxrwxrwx. 1 root root 0 8月 31 00:03 cwd -> / # 链接到进程当前工作目录
-r--------. 1 root root 0 8月 31 00:03 environ # 进程环境变量列表
lrwxrwxrwx. 1 root root 0 8月 30 16:48 exe -> /usr/sbin/rsyslogd # 链接到进程的执行命令文件
dr-x------. 2 root root 0 8月 30 16:48 fd # 包含进程相关的所有的文件描述符
dr-x------. 2 root root 0 8月 31 00:03 fdinfo
-rw-r--r--. 1 root root 0 8月 31 00:03 gid_map
-r--------. 1 root root 0 8月 31 00:03 io
-r--r--r--. 1 root root 0 8月 31 00:03 limits
-rw-r--r--. 1 root root 0 8月 30 16:48 loginuid
dr-x------. 2 root root 0 8月 31 00:03 map_files
-r--r--r--. 1 root root 0 8月 31 00:03 maps # 与进程相关的内存映射信息
-rw-------. 1 root root 0 8月 31 00:03 mem # 当前进程所占用的内存空间,由open、read和lseek等系统调用使用,不能被用户读取;
-r--r--r--. 1 root root 0 8月 31 00:03 mountinfo
-r--r--r--. 1 root root 0 8月 31 00:03 mounts
-r--------. 1 root root 0 8月 31 00:03 mountstats
dr-xr-xr-x. 5 root root 0 8月 31 00:03 net
dr-x--x--x. 2 root root 0 8月 31 00:03 ns
-r--r--r--. 1 root root 0 8月 31 00:03 numa_maps
-rw-r--r--. 1 root root 0 8月 31 00:03 oom_adj
-r--r--r--. 1 root root 0 8月 31 00:03 oom_score
-rw-r--r--. 1 root root 0 8月 31 00:03 oom_score_adj
-r--r--r--. 1 root root 0 8月 31 00:03 pagemap
-r--------. 1 root root 0 8月 31 00:03 patch_state
-r--r--r--. 1 root root 0 8月 31 00:03 personality
-rw-r--r--. 1 root root 0 8月 31 00:03 projid_map
lrwxrwxrwx. 1 root root 0 8月 31 00:03 root -> / # 指向当前进程运行根目录的符号链接;在Unix和Linux系统上,通常采用chroot命令使每个进程运行于独立的根目录
-rw-r--r--. 1 root root 0 8月 31 00:03 sched
-r--r--r--. 1 root root 0 8月 31 00:03 schedstat
-r--r--r--. 1 root root 0 8月 30 16:48 sessionid
-rw-r--r--. 1 root root 0 8月 31 00:03 setgroups
-r--r--r--. 1 root root 0 8月 31 00:03 smaps
-r--r--r--. 1 root root 0 8月 31 00:03 stack
-r--r--r--. 1 root root 0 8月 30 16:48 stat # 进程的状态
-r--r--r--. 1 root root 0 8月 30 19:06 statm # 当前进程占用内存的状态信息,通常以“页面”(page)表示;
-r--r--r--. 1 root root 0 8月 30 16:48 status
-r--r--r--. 1 root root 0 8月 31 00:03 syscall
dr-xr-xr-x. 5 root root 0 8月 31 00:03 task # 目录文件,包含由当前进程所运行的每一个线程的相关信息,每个线程的相关信息文件均保存在一个由线程号(tid)命名的目录中,这类似于其内容类似于每个进程目录中的内容;(内核2.6版本以后支持此功能)
-r--r--r--. 1 root root 0 8月 31 00:03 timers
-rw-r--r--. 1 root root 0 8月 31 00:03 uid_map
-r--r--r--. 1 root root 0 8月 31 00:03 wchan

下面是作者系统上运行的一个 PID 为 1021 的进程的相关文件,其中有些文件是每个进程都会具有的,后文会对这些常见文件做出说明。

3.2 /proc/N/cmdline 启动当前进程的完整命令,但僵尸进程目录中的此文件不包含任何信息

1
2
[root@192 ~]# cat /proc/1021/cmdline 
/usr/sbin/rsyslogd-n

3.3 /proc/N/exe 链接到进程的执行命令文件

1
2
[root@192 ~]# ll /proc/1021/exe
lrwxrwxrwx. 1 root root 0 8月 30 16:48 /proc/1021/exe -> /usr/sbin/rsyslogd

3.4 /proc/N/cwd 指向当前进程运行目录的一个符号链接

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
[root@192 ~]# ll /proc/1021/cwd/
总用量 20
lrwxrwxrwx. 1 root root 7 8月 24 11:31 bin -> usr/bin
dr-xr-xr-x. 5 root root 4096 8月 24 11:39 boot
drwxr-xr-x. 20 root root 3200 8月 30 16:48 dev
drwxr-xr-x. 74 root root 8192 8月 30 22:09 etc
drwxr-xr-x. 3 root root 16 8月 24 11:58 home
lrwxrwxrwx. 1 root root 7 8月 24 11:31 lib -> usr/lib
lrwxrwxrwx. 1 root root 9 8月 24 11:31 lib64 -> usr/lib64
drwxr-xr-x. 2 root root 6 4月 11 2018 media
drwxr-xr-x. 2 root root 6 4月 11 2018 mnt
drwxr-xr-x. 2 root root 6 4月 11 2018 opt
dr-xr-xr-x. 108 root root 0 8月 30 16:48 proc
dr-xr-x---. 2 root root 135 8月 24 16:24 root
drwxr-xr-x. 24 root root 720 8月 30 22:09 run
lrwxrwxrwx. 1 root root 8 8月 24 11:31 sbin -> usr/sbin
drwxr-xr-x. 2 root root 6 4月 11 2018 srv
dr-xr-xr-x. 13 root root 0 8月 30 16:48 sys
drwxrwxrwt. 13 root root 4096 8月 30 22:09 tmp
drwxr-xr-x. 13 root root 155 8月 24 11:31 usr
drwxr-xr-x. 19 root root 267 8月 24 11:42 var

3.5 /proc/N/environ 当前进程的环境变量列表,彼此间用空字符(NULL)隔开;变量用大写字母表示,其值用小写字母表示

1
2
[root@192 ~]# cat /proc/1021/environ 
LANG=zh_CN.UTF-8PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/binNOTIFY_SOCKET=/run/systemd/notifySYSLOGD_OPTIONS=

3.6 /proc/N/fd 这是个目录,包含当前进程打开的每一个文件的文件描述符(file descriptor),这些文件描述符是指向实际文件的一个符号链接

1
2
3
4
5
6
7
8
9
10
11
12
[root@192 ~]# ll /proc/1021/fd
总用量 0
lr-x------. 1 root root 64 8月 30 16:48 0 -> /dev/null
l-wx------. 1 root root 64 8月 30 16:48 1 -> /dev/null
l-wx------. 1 root root 64 8月 30 16:48 2 -> /dev/null
lr-x------. 1 root root 64 8月 30 16:48 3 -> anon_inode:inotify
lrwx------. 1 root root 64 8月 30 16:48 4 -> socket:[20332]
lr-x------. 1 root root 64 8月 30 16:48 5 -> /run/log/journal/92e26ad0ce2d4daf8222e6f2526060e2/system.journal
l-wx------. 1 root root 64 8月 30 16:48 6 -> /var/log/messages
l-wx------. 1 root root 64 8月 30 16:48 7 -> /var/log/cron
l-wx------. 1 root root 64 8月 30 16:48 8 -> /var/log/secure
l-wx------. 1 root root 64 8月 30 16:48 9 -> /var/log/maillog

3.7 /proc/N/limits 当前进程所使用的每一个受限资源的软限制、硬限制和管理单元;此文件仅可由实际启动当前进程的UID用户读取;(2.6.24以后的内核版本支持此功能)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
[root@192 ~]# cat /proc/1021/limits 
Limit Soft Limit Hard Limit Units
Max cpu time unlimited unlimited seconds
Max file size unlimited unlimited bytes
Max data size unlimited unlimited bytes
Max stack size 8388608 unlimited bytes
Max core file size 0 unlimited bytes
Max resident set unlimited unlimited bytes
Max processes 3794 3794 processes
Max open files 1024 4096 files
Max locked memory 65536 65536 bytes
Max address space unlimited unlimited bytes
Max file locks unlimited unlimited locks
Max pending signals 3794 3794 signals
Max msgqueue size 819200 819200 bytes
Max nice priority 0 0
Max realtime priority 0 0
Max realtime timeout unlimited unlimited us

3.8 maps 当前进程关联到的每个可执行文件和库文件在内存中的映射区域及其访问权限所组成的列表

1
2
3
4
[root@192 ~]# cat /proc/1021/maps
5630fd473000-5630fd508000 r-xp 00000000 fd:00 50756257 /usr/sbin/rsyslogd
5630fd708000-5630fd70b000 r--p 00095000 fd:00 50756257 /usr/sbin/rsyslogd
...

3.9 stat 当前进程的状态信息,包含一系统格式化后的数据列,可读性差,通常由ps命令使用

1
2
[root@192 ~]# cat /proc/1021/stat
1021 (rsyslogd) S 1 1021 1021 0 -1 1077944576 1586 0 9 0 358 568 0 0 20 0 3 0 2971 219578368 1119 18446744073709551615 94768407719936 94768408329474 140732791969248 140732791968656 140160513558947 0 0 16781830 1132545 18446744073709551615 0 0 17 0 0 0 4 0 0 94768410427432 94768410466656 94768416153600 140732791971668 140732791971690 140732791971690 140732791971813 0

3.10 status 与stat所提供信息类似,但可读性较好,比 stat/statm 更具可读性

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
[root@192 ~]# cat /proc/1021/status 
Name: rsyslogd
Umask: 0066
State: S (sleeping)
Tgid: 1021
Ngid: 0
Pid: 1021
PPid: 1
TracerPid: 0
Uid: 0 0 0 0
Gid: 0 0 0 0
FDSize: 64
Groups:
VmPeak: 271776 kB
VmSize: 214432 kB
VmLck: 0 kB
VmPin: 0 kB
VmHWM: 4476 kB
VmRSS: 4476 kB
RssAnon: 884 kB
RssFile: 1888 kB
RssShmem: 1704 kB
VmData: 148608 kB
VmStk: 132 kB
VmExe: 596 kB
VmLib: 5420 kB
VmPTE: 156 kB
VmSwap: 0 kB
Threads: 3
SigQ: 0/3794
SigPnd: 0000000000000000
ShdPnd: 0000000000000000
SigBlk: 0000000000000000
SigIgn: 0000000001001206
SigCgt: 0000000180114801
CapInh: 0000000000000000
CapPrm: 0000001fffffffff
CapEff: 0000001fffffffff
CapBnd: 0000001fffffffff
CapAmb: 0000000000000000
NoNewPrivs: 0
Seccomp: 0
Speculation_Store_Bypass: thread vulnerable
Cpus_allowed: ffffffff,ffffffff,ffffffff,ffffffff
Cpus_allowed_list: 0-127
Mems_allowed: 00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000001
Mems_allowed_list: 0
voluntary_ctxt_switches: 53
nonvoluntary_ctxt_switches: 33

系统信息查看

1
2
3
4
5
6
7
8
9
10
11
[root@192 ~]# ll /proc/sys
总用量 0
dr-xr-xr-x. 1 root root 0 8月 31 03:03 abi
dr-xr-xr-x. 1 root root 0 8月 30 17:47 crypto
dr-xr-xr-x. 1 root root 0 8月 31 03:03 debug
dr-xr-xr-x. 1 root root 0 8月 31 03:03 dev
dr-xr-xr-x. 1 root root 0 8月 30 16:48 fs
dr-xr-xr-x. 1 root root 0 8月 30 16:48 kernel
dr-xr-xr-x. 1 root root 0 8月 30 16:48 net
dr-xr-xr-x. 1 root root 0 8月 31 03:03 user
dr-xr-xr-x. 1 root root 0 8月 30 16:48 vm

2.10 /proc/sys/kernel/ostype 操作系统类型

1
2
[root@192 ~]# cat /proc/sys/kernel/ostype
Linux

2.11 /proc/sys/kernel/osrelease 内核版本

1
2
[root@192 ~]# cat /proc/sys/kernel/osrelease
3.10.0-1160.el7.x86_64

2.12 /proc/sys/kernel/hostname 主机名

1
2
[root@192 ~]# cat /proc/sys/kernel/hostname
lepeng

对应命令

  • 获取系统版本信息:uname -a 或者 lsb_release /proc/version 或者 /proc/sys/kernel/hostname[,domainname, osrelease, ostype, version]

  • 获取系统负载信息:top 或者 w 或者 uptime/proc/loadavg

  • 获取内存使用情况:free/proc/meminfo

  • 获取CPU使用情况:top/proc/cpuinfo

  • 获取进程运行情况:ps aux 或者 top/proc/N[N为对应的PID号]

Reference


Linux proc 目录详解
https://flepeng.github.io/002-Linux-41-目录-Linux-proc-目录详解/
作者
Lepeng
发布于
2021年7月5日
许可协议