博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

Linux基础 - 文件系统 /proc

Posted on 2023-02-19 11:58  Kingdomer  阅读(502)  评论(0编辑  收藏  举报

 

 

一、 /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