一、 /proc文件系统
1.1 /proc: 一个虚拟文件系统
/proc 文件系统是一种内核和内核模块用来向进程(process) 发送信息的机制(所以叫做/proc)。
最初的设计目的是允许更方便的对进程信息进行访问, 现在它被内核使用, 如/proc/modules是模块的列表, /proc/meminfo 是内存使用的统计表。
Linux内核提供了一种通过 /proc文件系统,在运行时访问内核内部数据结构、改变内核设置的机制。 以文件系统的方式为访问系统内核数据的操作提供接口。
由于系统的信息, 如进程是动态改变的,所以用户或应用程序读取proc文件时,proc文件系统是动态从系统内核读出所需信息并提交的。
1.2 加载/proc
/proc 存在于内存之中而不是硬盘上。/proc 由内核控制,没有承载/proc的设备。
查看文件/proc/mounts(和mount命令一样列出所有已经加载的文件系统):
[root@centos78 ~]# grep proc /proc/mounts
proc /proc proc rw,nosuid,nodev,noexec,relatime 0 0
systemd-1 /proc/sys/fs/binfmt_misc autofs rw,relatime,fd=36,pgrp=1,timeout=0,minproto=5,maxproto=5,direct,pipe_ino=14038 0 0
如果系统中没有加载 proc文件系统,可以通过如下命令加载proc文件系统:
[root@centos78 ~]# mount -t proc proc /proc
/proc 文件系统和其他常规的文件系统一样把自己注册到虚拟文件系统层(VFS)了。
然而直到当VFS调用它,请求文件、目录的i-node的时候,/proc文件系统才会根据内核中的信息建立相应的文件和目录。
当编辑程序试图打开一个虚拟文件时,这个文件就通过内核中的信息被凭空地(on the fly) 创建了。
[root@centos78 1021]# ls -i -l
total 0
23827 dr-xr-xr-x. 2 root root 0 Feb 20 07:16 attr
23813 -rw-r--r--. 1 root root 0 Feb 20 07:16 autogroup
23809 -r--------. 1 root root 0 Feb 20 07:16 auxv
二、 /proc 内核信息
2.1 常用文件
self目录则是读取进程本身(bash)的信息接口,是一个link。
/proc/cmdline: 系统启动时输入的内核命令行参数
/proc/cpuinfo: CPU的信息(型号, 家族, 缓存大小等)
/proc/devices: 可用设备的列表(块设备/字符设备)
/proc/filesystems: 被支持的文件系统
/proc/loadavg: 系统的负载
/proc/meminfo: 物理内存、交换空间等的信息
/proc/modules: 已加载的模块,lsmod 查看
/proc/version: 内核版本
/proc/mounts -> self/mounts: 已加载的文件系统的列表
2.2 文件的写权限
大部分/proc 的文件是只读的。而实际上/proc 文件系统通过/proc 中可读写的文件提供了对内核的交互机制。
写这些文件可以改变内核的状态,/proc/sys 目录存放所有可读写的文件的目录,可以被用于改变内核行为。
/proc/sys/kernel: 目录包含非通用内核行为的信息。
/proc/sys/net: 目录中的文件用于修改机器/网络的网络属性。
[root@centos78 ~]# cat /proc/sys/kernel/domainname
(none)
[root@centos78 ~]# echo "kunking.com" > /proc/sys/kernel/domainname
[root@centos78 ~]# cat /proc/sys/kernel/domainname
kunking.com
[root@centos78 ~]# cat /proc/sys/net/ipv4/ip_forward
0
[root@centos78 ~]# echo 1 > /proc/sys/net/ipv4/ip_forward
[root@centos78 ~]# cat /proc/sys/net/ipv4/ip_forward
1
2.3 运行中的进程的信息
在/proc中数字编号的子目录, 每个编号的目录对应一个进程id (PID)。子目录包含了进程的状态和环境信息的文件。
cmdline: 命令行参数
cwd: 当前工作目录的链接
environ: 环境变量值
exe: 指向该进程的执行命令文件
fd: 包含进程所有文件描述符的目录
maps: 内存映像
mem: 进程的内存使用情况
stat: 进程状态
status: 进程当前状态, 以可读方式显示
statm: 进程内存状态信息
root: 链接到进程的root目录
2.4 不常用文件
/proc/buddyinfo: 用于诊断内存碎片问题的相关信息文件 /proc/cmdline: 在启动时传递至内核的相关参数信息,这些信息通常由lilo或grub等启动管理工具进行传递; /proc/cgroups: 资源控制组开启信息 /proc/cpuinfo: 处理器的相关信息 /proc/crypto: 系统上已安装的内核使用的密码算法及每个算法的详细信息列表; /proc/devices: 系统已加载的所有块设备和字符设备的信息,包含主设备号和设备组(与主设备号对应的设备类型)名 /proc/diskstats: 每块磁盘设备的磁盘I/O统计信息; (内核2.5.69以后的版本支持此功能) /proc/dma: 每个正在使用且注册的ISA DMA通道的信息 /proc/execdomains: 内核当前支持的执行域(每种操作系统独特"个性")信息 /proc/fb: 帧缓冲设备列表文件,包含帧缓冲设备的设备号和相关驱动信息。 /proc/filesystems: 当前被内核支持的文件系统类型,标记为nodev的文件系统表示不需要块设备的支持;mount设备时,不指定文件系统类型使用此文件默认。 /proc/interrupts: X86或X86_64体系架构系统上每个IRQ相关的中断号列表;多路处理器平台上每个CPU对于每个I/O设备均有自己的中断号。 /proc/iomem: 每个物理设备上的记忆体(RAM或者ROM)在系统内存中的映射信息 /proc/ioports: 当前正在使用且已经注册过的与物理设备进行通讯的输入-输出端口范围信息;第一列表示注册的I/O端口范围,其后表示相关的设备。 /proc/kallsyms: 模块管理工具用来动态链接或绑定可装载模块的符号定义,由内核输出;(内核2.5.71以后的版本支持此功能) /proc/kcore: 系统使用的物理内存,以ELF核心文件(core file)格式存储,文件大小为已使用的物理内存(RAM)加上4KB; 这个文件用来检查内核数据结构的当前状态, 通常由gdb调试工具使用, 不能使用文件查看命令查看此文件。 /proc/kmsg: 保存由内核输出的信息,通常由/sbin/klogd或/bin/dmsg等程序使用。 /proc/loadavg: 保存CPU和磁盘I/O的负载平均值,其前三列分别表示每1分钟、每5分钟及每15分钟的负载平均值,类似于uptime命令输出的相关信息。 第四列是由斜线隔开的两个数值,前者表示当前正由内核调度的实体(进程和线程)的数目,后者表示系统当前存活的内核调度实体的数目; 第五列表示此文件被查看前最近一个由内核创建的进程的PID。 /proc/locks: 保存当前由内核锁定的文件的相关信息,包含内核内部的调试数据;每个锁定占据一行,且具有一个惟一的编号; 第二列表示当前锁定使用的锁定类别,POSIX表示目前较新类型的文件锁,由lockf系统调用产生; FLOCK是传统的UNIX文件锁,由flock系统调用产生; 第三列有两种类型,ADVISORY表示不允许其他用户锁定此文件,但允许读取; MANDATORY表示此文件锁定期间不允许其他用户任何形式的访问。 /proc/mdstat: 保存RAID相关的多块磁盘的当前状态信息 /proc/meminfo: 系统中关于当前内存的利用状况等的信息,常由free命令使用。 /proc/modules: 当前装入内核的所有模块名称列表,由lsmod命令使用; 各列的意义如下: ecdh_generic 24576 1 bluetooth, Live 0xffffffffc060c000 1模块名/2模块占用内存空间大小/3此模块有多少实例被装入/4此模块依赖于其它哪些模块 5模块的装载状态(Live:已经装入,Loading:正在装入,Unloading:正在卸载)/ 6此模块在内核内存(kernel memory)中的偏移量。 /proc/mounts: 在内核2.4.29版本以前,此文件的内容为系统当前挂载的所有文件系统;之后引进了每个进程使用独立挂载名称空间的方式, 此文件则变成了指向/proc/self/mounts(每个进程自身挂载名称空间中的所有挂载点列表)文件的符号链接;/proc/self是一个独特的目录。 sysfs /sys sysfs rw,nosuid,nodev,noexec,relatime 0 0 挂载的设备/ 在当前目录树中的挂载点 / 当前文件系统的类型/ 挂载属性(ro或者rw)/ 匹配/etc/mtab文件中的转储(dump)属性 /proc/partitions: 块设备每个分区的主设备号(major)和次设备号(minor)等信息,每个分区所包含的块(block)数目 major minor #blocks name 253 0 41943040 vda /proc/slabinfo: 在内核中频繁使用的对象(如inode、dentry等)都有自己的cache,即slab pool, 而/proc/slabinfo文件列出了这些对象相关slab的信息; /proc/stat: 实时追踪自系统上次启动以来的多种统计信息; "cpu"行后的八个值分别表示以1/100(jiffies))秒为单位的统计值, 包括系统运行于user、nice、system、idle等的时间等; "intr": 中断的信息,第一个为自系统启动以来,发生的所有的中断的次数; 然后每个数对应一个特定的中断自系统启动以来所发生的次数; "ctxt": 自系统启动以来CPU发生的上下文交换的次数; "btime": 从系统启动到现在为止的时间,单位为秒; "processes (total_forks)": 自系统启动以来所创建的任务的个数目; "procs_running":当前运行队列的任务的数目; "procs_blocked":当前被阻塞的任务的数目; "softirq ": 软中断 /proc/swaps: 当前系统上的交换分区及其空间利用信息, Filename Type Size Used Priority /dev/sda3 partition 4194300 357544 -1 /proc/uptime: 系统自上次启动以来的运行时间,第一个数字表示系统运行时间,第二个数字表示系统空闲时间,单位是秒。 /proc/version: 当前系统运行的内核版本号,包括gcc版本 /proc/vmstat: 当前系统虚拟内存的多种统计数据, 2.6以后的内核支持此文件 /proc/zoneinfo: 内存区域(zone)的详细信息列表
[root@myos ~]# cat /proc/locks 1: POSIX ADVISORY WRITE 4904 fd:00:4325393 0 EOF 2: POSIX ADVISORY WRITE 4550 fd:00:2066539 0 EOF 3: FLOCK ADVISORY WRITE 4497 fd:00:2066533 0 EOF [root@myos proc]# cat slabinfo slabinfo - version: 2.1 # name <active_objs> <num_objs> <objsize> <objperslab> <pagesperslab> : tunables <limit> <batchcount> <sharedfactor> : slabdata <active_slabs> <num_slabs> <sharedavail> ext4_groupinfo_4k 336 336 144 28 1 : tunables 0 0 0 : slabdata 12 12 0 ext4_inode_cache 5311 10368 1176 27 8 : tunables 0 0 0 : slabdata 384 384 0 RAW 16 28 1152 14 4 : tunables 0 0 0 : slabdata 2 2 0 UDP 157 168 1280 12 4 : tunables 0 0 0 : slabdata 14 14 0 tw_sock_TCP 30 30 272 15 1 : tunables 0 0 0 : slabdata 2 2 0 request_sock_TCP 72 72 336 12 1 : tunables 0 0 0 : slabdata 6 6 0 TCP 91 91 2432 13 8 : tunables 0 0 0 : slabdata 7 7 0 [root@myos proc]# slabinfo Name Objects Objsize Space Slabs/Part/Cpu O/S O %Fr %Ef Flg TCP 39 2408 98.3K 0/0/3 13 3 0 95 A TCPv6 49 2560 229.3K 3/3/4 12 3 42 54 A
2.5 /proc/net 信息
/proc/net/anycast6
/proc/net/arp: 转储每个网络接口的arp表中dev 包的统计
/proc/net/connector
/proc/net/dev: 来自网络设备的统计
/proc/net/dev_mcast: 列出二层(数据链路层)多播组
/proc/net/dev_snmp6
/proc/net/fib_trie
/proc/net/fib_triestat
/proc/net/hci
/proc/net/icmp
/proc/net/if_inet6
/proc/net/igmp: 加入的IGMP多播组
/proc/net/igmp6
/proc/net/ip6_flowlabel
/proc/net/ip6_mr_cache
/proc/net/ip6_mr_vif
/proc/net/ip6_tables_matches
/proc/net/ip6_tables_names
/proc/net/ip6_tables_targets
/proc/net/ip_mr_cache
/proc/net/ip_mr_vif
/proc/net/ip_tables_matches
/proc/net/ip_tables_names
/proc/net/ip_tables_targets
/proc/net/ipv6_route
/proc/net/l2cap
/proc/net/mcfilter
/proc/net/mcfilter6
/proc/net/netfilter
/proc/net/netlink: netlink 套接口的信息
/proc/net/netstat: 网络流量的多种统计。
/proc/net/nf_conntrack
/proc/net/nf_conntrack_expect
/proc/net/packet
/proc/net/protocols
/proc/net/psched
/proc/net/ptype
/proc/net/raw: 原始套接字的套接字列表
/proc/net/raw6
/proc/net/route: 静态路由表
/proc/net/rt6_stats
/proc/net/rt_acct
/proc/net/rt_cache
/proc/net/sco
/proc/net/snmp: snmp agent的ip/icmp/tcp/udp协议统计
/proc/net/snmp6
/proc/net/sockstat: 列出使用的tcp/udp/raw/pac/syc_cookies的数量
/proc/net/sockstat6
/proc/net/softnet_stat
/proc/net/stat
/proc/net/tcp: TCP 连接的套接字
/proc/net/tcp6
/proc/net/udp: UDP 连接的套接字
/proc/net/udp6
/proc/net/udplite
/proc/net/udplite6
/proc/net/unix: UNIX 域套接字列表
/proc/net/wireless
/proc/net/xfrm_stat
2.6 /proc/sys
[root@myos proc]# ls sys/ abi crypto debug dev fs kernel net user vm
与/proc下其它文件的"只读"属性不同,管理员可对/proc/sys子目录中的许多文件内容进行修改以更改内核的运行特性。
3.1 /proc/sys/debug: 此目录通常是空目录
3.2 /proc/sys/dev: 为系统上特殊设备提供参数信息文件的目录,不同设备的信息文件分别存储于不同的子目录中。如./dev/cdrom和./dev/raid