Linux下一个重要目录“/proc”,你还不知道作用?
sinye56 2024-11-23 22:14 1 浏览 0 评论
proc简介
在linux的根目录下存在一个/proc目录,/proc文件系统是一种虚拟文件系统,以文件系统目录和文件形式,提供一个指向内核数据结构的接口,通过它能够查看和改变各种系统属性.proc目录通常情况下是由系统自动挂载在/proc目录下,但是我们也可以自行手动挂载.
|
|
/proc目录下的大部分文件都是只读的,部分文件是可写的,我们通过这些可写的文件来修改内核的一些配置;
说明
在/proc目录下,一般会存在如下文件和目录.
/proc/pid
每一个/proc/pid目录中还存在一系列目录和文件,这些文件和目录记录的都是关于pid对应进程的信息.例如,在/proc/pid的目录下存在一个task目录,在task目录下又存在task/tid这样的目录,这个目录就是包含此进程中的每个线程的信息,其中的tid是内核线程的tid;通过 GETDENTS(2) 遍历/proc就能够看到所有的/proc/pid的目录,当然通过 ls -al /proc的方式也可以看到所有的信息.
/proc/tid
/proc/tid 每一个/proc/tid目录中还存在一系列目录和文件,这些文件和目录记录的都是有关线程tid对应的信息,这些信息与具体的/proc/pid/task/tid的目录相同,所记录的信息也是相同的.我们遍历/proc时并不能看到/proc/tid的信息,同样通过ls -al /proc的方式也无法看到.但是虽然无法看到,但是却可以通过cd /proc/tid进入到这个线程的内部;传统的通过ps | grep tid是无法看到信息的,通过ps -T -p pid的方式就能够看到tid的信息.
/proc/self
这是一个link,当进程访问此链接时,就会访问这个进程本身的/proc/pid目录,如下所示:
|
|
/proc/thread-self
这是一个link,当访问次链接时,就会访问进程的/proc/self/task/tid目录。
|
|
/proc/[a-z]*
/proc/[a-z]*, proc下面还有许多其他的文件,记录了系统中的各种信息,Linux /proc、/dev Principle 这篇文章对proc目录下的文件进行了详细的说明.
文件和目录
在第一节主要是对poc目录进行了一个简单的介绍,本章节则主要是关注/proc/pid中记录的进程的具体的信息。
/proc/pid
每一个运行的进程都存在pid,对应的在/proc就存在一个/proc/pid的目录,这个/proc/pid目录也是一个伪文件系统.通常情况下每个/proc/pid是属于运行进程的有效用户的UID和GID.但是如果一个进程的dumpable属性的值大于1,从安全角度考虑,/proc/pid的属性就是root:root.
在4.11的内核版本之前,root:root表示的是全局UID和GID (在初始化的用户空间中的UID和GID都是0).但是在4.11之后的内核版本,如果这个进程不是在初始化的用户空间中,它的UID却是0,那么对应的/proc/pid的权限也是root:root.这就意味着在docker容器内,如果将进程的PID设置为0,那么这个进程在容器内就是以root权限运行的.
进程的dumpable的属性可能因为如下的原先发生改变:
- 通过 prctl 设置了 PR_SET_DUMPABLE 属性
- 通过 /proc/sys/fs/suid_dumpable文件修改
将dumpable重置为1,就可以恢复/proc/[pid]/*文件到进程有效的UID和GID.
/proc/pid/attr
/proc/pid/attr是一个目录,这个目录下的文件的作用是为安全模块提供了API.通过这些文件我们可以读取或者设置一些安全相关的选项.这个目录目前能够支持SELinux,但是本意是为了能够支持更多的其他的安全模块.以下将会演示SELinux如何使用这些文件.
PS: 只有内核开启了CONFIG_SECURITY选项,才能够看到这个目录.
/proc/pid/attr/current
这个文件的内容记录了当前进程的安全属性
在SELinux中,这个文件主要是用于得到当前进程的安全上下文.在2.6.11的内核之前,这个文件不能用来设置安全上下文(写操作是不允许的),因为SELinux限制了进程安全转换为 EXECVE(2) (参考下方的/proc/pid/attr/exec). 从2.6.11之后,SELinux取消了这个限制.如果策略允许,SELinux通过向这个文件写入来支持设置行为,虽然这个操作仅仅只是为了维护老的上下文和新的上下文的隔离.在2.6.28之前,SELinux不允许多线程程序的线程通过这个值来设置安全上下文,因为这样会导致共享内存空间的县城的安全上下文不一致.从2.6.28之后,SELinux取消了这个限制,开始支持多线程的设置方法.但是需要满足一定的条件,新的安全上下文需要绑定在老的上下文上,并且这个绑定关系是设置在策略当中的,同时新的安全上下文是老的安全上下文的一个子集.
/proc/pid/attr/exec
这个文件代表给进程的execve的属性.
在SELinux中,有时候需要支持role/domain的转换,execve(2)一般都是作为这种转换的首选,因为它提供了对进程的新的安全标签和状态继承的更好的控制.在SELinux中,如果重置了execve(2),那么这个程序就会恢复到execve(2)所设置的状态.
/proc/pid/attr/fscreate
这个文件代表进程与文件有关的权限,包括open(2) mkdir(2) symlink(2) mknod(2)
SELinux通过此文件能够保证以一个安全的方式创建文件,所以这里不会存在不安全的访问的风险(在文件创建和文件属性设置).如果重置了execve(2),那么程序也会被重置,包括程序所创建的文件.
/proc/pid/attr/keycreate
如果进程将安全上下文写入此文件,那么所有创建key的行为都会被加载到此上下文中.更多的信息可以参考内核文件 Documentation/security/keys/core.rst(在Linux3.0和Linux4.13中文件是 Documentation/security/keys.txt 在Linux3.0之前是Documentation/keys.txt)
/proc/pid/attr/prev
这个文件包含了进程在执行最后一个execve(2)的安全上下文.换句话说,这个文件的内容是/proc/pid/attr/current前一个值
/proc/pid/attr/socketcreate
如果一个进程向这个文件写入安全上下文,那么之后所有的sockets的创建行为都会在此进程上下文中;
/proc/pid/autogroup
参考 sched(7)
/proc/pid/auxv
这个文件包含了在进程执行时,传递给进程的ELF的解释器的信息.这个文件的格式是一个无符号的long类型的ID加上每个entry的一个无符号的long类型,这最后的一个entry包含了两个零。参考 getauxval(3)
/proc/pid/cgroup
参考 cgroups(7)
/proc/pid/clear_refs
这是一个只写文件,只有进程的owner能够写.只有下面这些值能够被写入:
- (Since Linux 2.6.22)对进程所有的相关的页重置所有的PG_Referenced 和ACCESSED/YOUNG位 (在2.6.32之前,任何的非零的值写入到此文件都是有效的)
- (Since Linux2.6.32) 对进程所有的匿名页重置所有的PG_Referenced和ACCESSED/YOUNG位
- (Since Linux2.6.32)对进程所有的与文件相关的页重置所有的PG_Referenced和ACCESSED/YOUNG位.清除所有的PG_Referenced和ACCESSED/YOUNG提供了一个方法用于测量一个进程是有了多少内存.第一个可以参考的是/proc/[pid]/smaps中的VMAs中的值.当清除了PG_Referenced和ACCESSED/YOUNG 经过一段时间之后,再次测量这个值.
- (Since Linux3.11) 清空掉进程所有的页的soft-dirty位.通过向/proc/[pid]/clear_refs清空,就能够知道哪些页是被污染了.
- 将peak resident重置为进程当前的resident的大小.
如果向/proc/pid/clear_refs写入其他的任何值,不会有任何的效果;只有当启用了CONFGI_PROC_PAGE_MONITOR的内核选项之,才会出现/proc/pid/clear_refs文件
/proc/pid/cmdline
这个只读文件是包含了进程执行的完整命令.如果此进程是一个僵尸进程,那么次文件没有任何的内容.
/proc/pid/comm
此文件记录的是进程命令的comm.在同一个进程中的不同线程的comm可能不同,可以访问/proc/[pid]/task/tid/comm获取进程中的每个线程的comm.通过向/proc/self/task/tid/comm写入就能够修改自己或者其他线程的comm.如果comm超过TASK_COMM_LEN(16)就会被截断.
这个文件的值可以通过 prctl(2) 的PR_SET_NAME和PR_GET_NAME的操作来设置和获取,通过 pthread_setname_np(3) 能够设置线程的comm
/proc/pid/coredump_filter
参考 core(5)
/proc/pid/cpuset
参考 cpuset(7)
/proc/pid/cwd
这是一个当前的进程的工作目录.比如如果想要知道pid为4451的进程的工作目录,可以通过如下的命令查看:
|
|
在bash环境下,可能会出现/bin/pwd: couldn’t find directory entry in ‘..’ with matching i-node的错误,这是因为pwd通常是shell内置的,需要使用这样的命令:
|
|
在多线程的程序中,如果主线程已经退出了,那么cwd的结果就是空.
取消或者是读取(readlink(2))这个链接的内容的权限是由ptrace的访问模式PTRACE_MODE_READ_FSCREDS来控制的,参考ptrace(2).
/proc/pid/environ
这个文件包含的是当程序使用execve启动程序时的环境变量的值,其中的entries是通过0x0分割的,结尾是可能是null.如果我们需要查询一个指定的进程的环境变量,我们可以采用如下的方法:
|
|
如果执行了execve(2)之后,进程调用了putenv(3)或者是直接修改environ(7) ,那么environ变量的值是无法随之改变的.
更进一步,进程能够通过prctl(2)修改PR_SET_MM_ENV_START的值来修改这个文件所引用的内存位置.
读取这个文件的权限是由ptrace(2)的PTRACE_MODE_READ_FSCREDS来控制.
/proc/pid/exe
在Linux2.2的内核及其之后,/proc/pid/exe是直接执行的二进制文件的符号链接.这个符号链接能够被取消.尝试打开这个文件就相当与打开了二进制文件,甚至可以通过重新输入/proc/pid/exe重新运行一个对应于pid的二进制文件.在一个多线程的程序中,如果主线程已经退出了,就无法访问这个符号链接.
在Linux2.0及其之前,/proc/pid/exe是指向当前进程执行的二进制文件.采用readlink()读取返回如下的结果: [device]:inode
/proc/pid/fd
这是一个子目录,包含了当前进程打开的每一个文件.每一个条目都是一个文件描述符,是一个符号链接,指向的是实际打开的地址.0表示标准输入,1表示标准输出,2表示标准错误.在多线程程序中,如果主程序退出了,那么这个文件夹将不能被访问.
程序能够使用文件名作为命令行参数,如果没有提供这样的参数,就不会从标准输入中读取信息也不会将标准输出发送到文件中.但是即使没有提供与文件相关的命令行参数,我们仍然可以使用标准的输出输入.例如我们可以通过-i和-o分别指向输入和输出文件.如下所是:
|
|
在某些UNIX或者类似UNIX的系统中,/proc/self/fd/N与/dev/fd/N大致相同.大部分系统提供/dev/stdin,/dev/stdout,/dev/stderr的符号链接,分别只想的是/proc/self/fd中的0,1,2.所以上述的命令也可以写为:
|
|
/proc/pid/fdinfo/
这是一个子目录,包括了当前进程打开的所有的文件的文件描述符.可以读取每一个文件描述符的内容一获取i信息.如下所示:
|
|
- pos 是十进制,显示当前文件的偏移量
- flag是八进制,显示文件的访问模式和文件状态标志.
该目录中的文件只有进程的所有者才可以读.
/proc/pid/limits
该文件显示了每个进程的软中断,硬中断和度量单位.在Linux2.6.35之前,这个文件仅仅只能被进程实际的UID访问.在26.36之后,该文件可以被系统中所有的用户读取.
/proc/pid/maps
包含了当前进程映射的内存区域以及他们的访问权限.文件格式如下:
|
|
- address,表示进程占用的地址.
- perms, 表示一系列权限.r=read,w=write,x=execute,s=shared,p=private(copy on write)
- offset, 表示文件偏移量
- dev:表示设备 (主要设备,次要设备)
- inode: 表示设备上面的inode编号.如果是0,表示没有索引节点与内存区域关联,就如同BSS段一样.
- pathname,在Linux2.0之前,没有pathname字段.
/proc/pid/mem
该文件可以通过open,read,seek访问进程的内存页.
/proc/pid/mountinfo
这个文件主要是包含了挂载信息.文件内容结构如下:
|
|
- mount ID,挂载点的唯一标识
- parent ID,当前挂载点的父挂载点的ID
- major:minor, files的st_dev的值
- root: 文件系统的根挂载点
- mount point: 相对于进程根目录的挂载点
- mount options: 预挂载选项
- options fields: tag:[value]类型的字段
- sparator: options fields结束标志
- file systemtype: 文件系统的名称,以type[.subtype]的方式命名
- mount source: 文件特定信息
- super options: 超级块选项
/proc/pid/mounts
列出在当前进程挂载空间下所有的已经挂载过的文件.文件的格式通过 fstab 查看.在kernel 2.6.15之后,这个文件是论询式的.在读取文件之后,这个事件会导致select标记这个文件是可读的,并且pool()和epoll_wait()会将此文件标记为遇到了错误.
/proc/pid/mountstas
该文件会列举在当前进程挂载空间下的所有挂载点的详细信息,包括统计信息,配置信息.文件格式如下:
|
|
- 载的设备名
- 挂载点
- 文件系统类型
- 可选的统计和配置信息.在2.6.26之后,仅NFS文件系统可以到处此字段信息
/proc/pid/ns/
这是一个子目录.每一个子目录可以通过 setns 操作.关于更多的操作,参见clone
/proc/pid/ns/ipc
将文件挂载在其他地方可以使pid指定的进程的IPC命名空间保持活动状态,即使在当前命名空间的所有的进程全部都截止了.打开次文件就会返回文件句柄.只要文件保持打开状态,那么IPC的命名空间就可以保持活动状态.文件描述符可以通过 setns 传递.
/proc/pid/ns/net
将文件挂载在其他地方可以使pid指定的进程的网络命名空间保持活动状态,即使在当前命名空间的所有的进程全部都截止了.打开次文件就会返回文件句柄.只要文件保持打开状态,那么网络的命名空间就可以保持活动状态.文件描述符可以通过 setns 传递.
/proc/pid/ns/uts
将文件挂载在其他地方可以使pid指定的进程的UTS 命名空间保持活动状态,即使在当前命名空间的所有的进程全部都截止了.打开次文件就会返回文件句柄.只要文件保持打开状态,那么UTS命名空间就可以保持活动状态.文件描述符可以通过 setns 传递
/proc/pid/numa_maps
参见 numa
/proc/pid/oom_adj
这个方法用于决定在出现OOM的情况下,哪个进程被杀掉.内核使用该值对进程的oom_score的值进行设定,oom_score的有效取值区间是-17至15.-17将会完全杀死这个进程.正数会增加进程当oom时被杀掉的可能性,负数会减小进程被oom杀掉的可能性.
该文件的默认值是0.新进程会继承其父进程的oom_adj设置.只有具有CAP_SYS_RESOURCE权限的进程才能够更新此文件.
在Linux2.6.36,推荐使用/proc/[pid]/oom_score_adj.
/proc/pid/oom_score
该文件显示了如果内核出现oom情况时决定杀死该进程时的分数.分数越高意味着进程越容易被杀掉.
/proc/pid/oom_adj_score
这个文件用于调整在内存不足时应该杀掉哪个进程的分数判断.
/proc/pid/root
该值可以用于 chroot 预先设定进程的根文件系统. 这个文件指向当前进程的根目录.作业类似于前面说过的 exe fd/* 等等.
在多线程的程序中,如果主线程推出了此符号链接的内容将无法访问.
/proc/pid/smaps
这个文件显示了每个进程映射的内存消耗.每一个内存消耗都有如下的设置:
|
|
第一行显示的信息与/proc/[pid]/maps中的映射信息相同.剩下分别表示的是,映射的大小,RAM中当前驻留的映射大小,映射中干净和脏共享页的大小以及映射中干净和脏共享私有页数.
只有在启用了CONFIG_MMU内核配置选项时,此文件才会存在.
/proc/pid/stat
关于进程的状态信息.主要是用于 ps 展示。
/proc/pid/statm
提供内存的使用情况.格式如下所示:
|
|
/proc/pid/status
以更加可读的形式提供与/proc/pid/stat和/proc/pid/statm一样的信息.以下是示例.
|
|
/proc/pid/task
该目录包含的是进程中的每一个线程.每一个目录的名字是以线程ID命名的(tid).在每一个tid下面的目录结构与/proc/pid下面的目录结构相同.对于所有线程共享的属性,task/tid子目录中的每个文件内容与/proc/pid目录中的相应文件内容相同.例如所有线程中的task/tid/cwd文件和父目录中的/proc/pid/cwd文件内容相同,因为所有的线程共享一个工作目录.对于每个线程的不同属性,task/tid下相应文件的值也不相同.
/proc/cmdline
在引导时传递给内核的参数
/proc/cpuinfo
cpu和系统结构的信息.常见信息包括CPU的数量以及常见的系统常数.
/proc/meminfo
此文件包含了系统当前内存的使用信息. free 用来报告系统中可用内存和已使用内存(物理内存和交换内存)以及内核中共享内存和缓冲区的大小.每一行都是以 参数名:参数值 显示.格式如下所示:
|
|
/proc/modules
显示当前加载到系统中所有的模块.
/proc/mounts
在内核2.4.19之前,这个文件会列举当前系统中挂载的所有的节点信息.在2.4.19之后,仅仅只会列举出当前进程在mount的命名空间下的挂载信息,即/proc/self/mounts的挂载信息,参见 fstab
/proc/net
此目录下面个中文虚拟的文件系统,主要是记录了系统中各种与网络有关的信息.这个文件都是普通ASCII文件,都可以通过cat的方式读取.
/proc/net/arp
此文件主要是包含了用于地址解析的内核ARP表的信息.示例如下:
|
|
- IP address 是主机的IPv4的地址
- HW type 是来自与RFC826的硬件类型的地址
- Flags 是ARP 结构中的内部标识 参见 /usr/include/linux/if_arp.h
- HW address 是数据链路层的映射地址
/proc/net/dev
dev虚拟文件系统显示网络状态的信息,包括发送和接受的数据包的数量,错误和冲突以及其他的统计信息,这些信息也可以通过ifconfig查看. 示例如下:
|
|
/proc/net/raw
存储的是RAW套接字表的信息
/proc/net/snmp
保存的是SNMP代理的IP,ICMP以及UDP的管理信息
/proc/net/tcp
保存的是系统中的TCP表的信息
/proc/net/udp
保存的是系统中的UDP表的信息
/proc/net/unix
显示当前系统所有的UNIX domain socket以及它们的状态信息.示例如下:
|
|
- Num 是kernle table slot number
- Refcount 是使用这个套接字的用户数
- Protocol 当前永远是0
- Flags 表示当前内部内核标志 用于表示套接字状态
- Type 当前永远是1
- St 套接字内部状态
- Path 是套接字绑定路径
/proc/stat
内核/系统的信息
/proc/sys
该目录下有很多的目录和子目录,其中主要是记录了与内核变量相关的信息.
原文链接:https://blog.spoock.com/2019/10/08/proc/
- 上一篇:linux centos7 光盘修复模式
- 下一篇:Linux系统安全加固防攻击技术
相关推荐
- Linux在线安装JDK1.8
-
首先在服务器pingwww.baidu.com查看是否可以连网然后就可以在线下载一、下载安装JDK1.81、在下载安装的同时做好一些准备工作...
- Linux安装JDK,超详细
-
1、了解RPMRPM是Red-HatPackageManager(RPM软件包管理器)的缩写,这一文件格式名称虽然打上了RedHat的标志,但是其原始设计理念是开放式的,现在包括OpenLinux...
- Linux安装jdk1.8(超级详细)
-
前言最近刚购买了一台阿里云的服务器准备要搭建一个网站,正好将网站的一个完整搭建过程分享给大家!#一、下载jdk1.8首先我们需要去下载linux版本的jdk1.8安装包,我们有两种方式去下载安装...
- Linux系统安装JDK教程
-
下载jdk-8u151-linux-x64.tar.gz下载地址:https://www.oracle.com/technetwork/java/javase/downloads/index.ht...
- 干货|JDK下载安装与环境变量配置图文教程「超详细」
-
1.JDK介绍1.1什么是JDK?SUN公司提供了一套Java开发环境,简称JDK(JavaDevelopmentKit),它是整个Java的核心,其中包括Java编译器、Java运行工具、Jav...
- Linux下安装jdk1.8
-
一、安装环境操作系统:CentOSLinuxrelease7.6.1810(Core)JDK版本:1.8二、安装步骤1.下载安装包...
- Linux上安装JDK
-
以CentOS为例。检查是否已安装过jdk。yumlist--installed|grepjdk或者...
- Linux系统的一些常用目录以及介绍
-
根目录(/):“/”目录也称为根目录,位于Linux文件系统目录结构的顶层。在很多系统中,“/”目录是系统中的唯一分区。如果还有其他分区,必须挂载到“/”目录下某个位置。整个目录结构呈树形结构,因此也...
- Linux系统目录结构
-
一、系统目录结构几乎所有的计算机操作系统都是使用目录结构组织文件。具体来说就是在一个目录中存放子目录和文件,而在子目录中又会进一步存放子目录和文件,以此类推形成一个树状的文件结构,由于其结构很像一棵树...
- Linux文件查找
-
在Linux下通常find不很常用的,因为速度慢(find是直接查找硬盘),通常我们都是先使用whereis或者是locate来检查,如果真的找不到了,才以find来搜寻。为什么...
- 嵌入式linux基本操作之查找文件
-
对于很多初学者来说都习惯用windows操作系统,对于这个系统来说查找一个文件简直不在话下。而学习嵌入式开发行业之后,发现所用到的是嵌入式Linux操作系统,本想着跟windows类似,结果在操作的时...
- linux系统查看软件安装目录的方法
-
linux系统下怎么查看软件安装的目录?方法1:whereis软件名以查询nginx为例子...
- Linux下如何对目录中的文件进行统计
-
统计目录中的文件数量...
- Linux常见文件目录管理命令
-
touch用于创建空白文件touch文件名称mkdir用于创建空白目录还可以通过参数-p创建递归的目录...
- Linux常用查找文件方法总结
-
一、前言Linux系统提供了多种查找文件的命令,而且每种查找命令都具有其独特的优势,下面详细总结一下常用的几个Linux查找命令。二、which命令查找类型:二进制文件;...
你 发表评论:
欢迎- 一周热门
- 最近发表
- 标签列表
-
- oracle忘记用户名密码 (59)
- oracle11gr2安装教程 (55)
- mybatis调用oracle存储过程 (67)
- oracle spool的用法 (57)
- oracle asm 磁盘管理 (67)
- 前端 设计模式 (64)
- 前端面试vue (56)
- linux格式化 (55)
- linux图形界面 (62)
- linux文件压缩 (75)
- Linux设置权限 (53)
- linux服务器配置 (62)
- mysql安装linux (71)
- linux启动命令 (59)
- 查看linux磁盘 (72)
- linux用户组 (74)
- linux多线程 (70)
- linux设备驱动 (53)
- linux自启动 (59)
- linux网络命令 (55)
- linux传文件 (60)
- linux打包文件 (58)
- linux查看数据库 (61)
- linux获取ip (64)
- 关闭防火墙linux (53)