标签:module unless cat cape 交换 工具 shel cut 时间
Q:今天有人问我lsof是怎么实现的? 然后当时在想要是我应该怎么实现? 通过每个进程的file_table list 出来!!!
实际上怎么出来的呢??strace lsof 结果可知
就是通过读取 /proc/pid/fdinfo 。。。。。。。。。。。。。。平时会用到proc/pid/ 却没有想到 lsof 也是通过他实现的。。。。。 果断google了一下 找到了一篇文章;里面介绍了 pid 目录的属性
先记录一下。。。。。但是还有一个万能帮助命令 man 它可以显示 你想要的一切,只是目前有很多人不知道 还有这个破东西
试一波:这是使用man 命令之后的结果 课件比较详细。。。。需要的直接慢慢欣赏!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
This directory is present only if the kernel was configured with CONFIG_SECURITY. /proc/[pid]/attr/current (since Linux 2.6.0) The contents of this file represent the current security attributes of the process. In SELinux, this file is used to get the security context of a process. Prior to Linux 2.6.11, this file could not be used to set the security context (a write was always denied), since SELinux limited process security transitions to execve(2) (see the description of /proc/[pid]/attr/exec, below). Since Linux 2.6.11, SELinux lifted this restric‐ tion and began supporting "set" operations via writes to this node if authorized by policy, although use of this operation is only suitable for applications that are trusted to maintain any desired separation between the old and new security contexts. Prior to Linux 2.6.28, SELinux did not allow threads within a multi-threaded process to set their security context via this node as it would yield an inconsistency among the security contexts of the threads sharing the same memory space. Since Linux 2.6.28, SELinux lifted this restriction and began supporting "set" operations for threads within a multithreaded process if the new security context is bounded by the old security context, where the bounded relation is defined in policy and guarantees that the new security context has a subset of the permissions of the old security context. Other security modules may choose to support "set" operations via writes to this node. /proc/[pid]/attr/exec (since Linux 2.6.0) This file represents the attributes to assign to the process upon a subsequent execve(2). In SELinux, this is needed to support role/domain transitions, and execve(2) is the preferred point to make such transitions because it offers better control over the initializa‐ tion of the process in the new security label and the inheritance of state. In SELinux, this attribute is reset on execve(2) so that the new program reverts to the default behavior for any execve(2) calls that it may make. In SELinux, a process can set only its own /proc/[pid]/attr/exec attribute. /proc/[pid]/attr/fscreate (since Linux 2.6.0) This file represents the attributes to assign to files created by subsequent calls to open(2), mkdir(2), symlink(2), and mknod(2) SELinux employs this file to support creation of a file (using the aforementioned system calls) in a secure state, so that there is no risk of inappropriate access being obtained between the time of creation and the time that attributes are set. In SELinux, this attribute is reset on execve(2), so that the new program reverts to the default behavior for any file creation calls it may make, but the attribute will persist across multiple file creation calls within a program unless it is explicitly reset. In SELinux, a process can set only its own /proc/[pid]/attr/fscreate attribute. /proc/[pid]/attr/prev (since Linux 2.6.0) This file contains the security context of the process before the last execve(2); that is, the previous value of /proc/[pid]/attr/current. /proc/[pid]/attr/keycreate (since Linux 2.6.18) If a process writes a security context into this file, all subsequently created keys (add_key(2)) will be labeled with this context. For further information, see the kernel source file Documentation/keys.txt.
或者使用https://linux.die.net/man/5/proc 阅读proc 手册也行
每一个运行的进程都存在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的属性可能因为如下的原先发生改变:
/proc/sys/fs/suid_dumpable
文件修改将dumpable重置为1,就可以恢复/proc/[pid]/*
文件到进程有效的UID和GID.
/proc/pid/attr
是一个目录,这个目录下的文件的作用是为安全模块提供了API.通过这些文件我们可以读取或者设置一些安全相关的选项.这个目录目前能够支持SELinux,但是本意是为了能够支持更多的其他的安全模块.以下将会演示SELinux如何使用这些文件.
PS: 只有内核开启了CONFIG_SECURITY选项,才能够看到这个目录.
这个文件的内容记录了当前进程的安全属性
在SELinux中,这个文件主要是用于得到当前进程的安全上下文.在2.6.11的内核之前,这个文件不能用来设置安全上下文(写操作是不允许的),因为SELinux限制了进程安全转换为 EXECVE(2) (参考下方的/proc/pid/attr/exec
). 从2.6.11之后,SELinux取消了这个限制.如果策略允许,SELinux通过向这个文件写入来支持设置行为,虽然这个操作仅仅只是为了维护老的上下文和新的上下文的隔离.在2.6.28之前,SELinux不允许多线程程序的线程通过这个值来设置安全上下文,因为这样会导致共享内存空间的县城的安全上下文不一致.从2.6.28之后,SELinux取消了这个限制,开始支持多线程的设置方法.但是需要满足一定的条件,新的安全上下文需要绑定在老的上下文上,并且这个绑定关系是设置在策略当中的,同时新的安全上下文是老的安全上下文的一个子集.
这个文件代表给进程的execve的属性.
在SELinux中,有时候需要支持role/domain的转换,execve(2)一般都是作为这种转换的首选,因为它提供了对进程的新的安全标签和状态继承的更好的控制.在SELinux中,如果重置了execve(2),那么这个程序就会恢复到execve(2)所设置的状态.
这个文件代表进程与文件有关的权限,包括open(2) mkdir(2) symlink(2) mknod(2)
SELinux通过此文件能够保证以一个安全的方式创建文件,所以这里不会存在不安全的访问的风险(在文件创建和文件属性设置).如果重置了execve(2),那么程序也会被重置,包括程序所创建的文件.
如果进程将安全上下文写入此文件,那么所有创建key的行为都会被加载到此上下文中.更多的信息可以参考内核文件 Documentation/security/keys/core.rst(在Linux3.0和Linux4.13中文件是 Documentation/security/keys.txt 在Linux3.0之前是Documentation/keys.txt)
这个文件包含了进程在执行最后一个execve(2)的安全上下文.换句话说,这个文件的内容是/proc/pid/attr/current
前一个值
如果一个进程向这个文件写入安全上下文,那么之后所有的sockets的创建行为都会在此进程上下文中;
参考 sched(7)
这个文件包含了在进程执行时,传递给进程的ELF的解释器的信息.这个文件的格式是一个无符号的long类型的ID加上每个entry的一个无符号的long类型,这最后的一个entry包含了两个零。参考 getauxval(3)
参考 cgroups(7)
这是一个只写文件,只有进程的owner能够写.只有下面这些值能够被写入:
如果向/proc/pid/clear_refs写入其他的任何值,不会有任何的效果;只有当启用了CONFGI_PROC_PAGE_MONITOR的内核选项之,才会出现/proc/pid/clear_refs文件
这个只读文件是包含了进程执行的完整命令.如果此进程是一个僵尸进程,那么次文件没有任何的内容.
此文件记录的是进程命令的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
参考 core(5)
参考 cpuset(7)
这是一个当前的进程的工作目录.比如如果想要知道pid为4451的进程的工作目录,可以通过如下的命令查看:
1
|
cd /proc/4451/cwd; /bin/pwd
|
在bash环境下,可能会出现/bin/pwd: couldn’t find directory entry in ‘..’ with matching i-node的错误,这是因为pwd通常是shell内置的,需要使用这样的命令:
1
|
/proc/4451/cwd; pwd -P
|
在多线程的程序中,如果主线程已经退出了,那么cwd的结果就是空.
取消或者是读取(readlink(2))这个链接的内容的权限是由ptrace的访问模式PTRACE_MODE_READ_FSCREDS来控制的,参考ptrace(2).
这个文件包含的是当程序使用execve启动程序时的环境变量的值,其中的entries是通过0x0分割的,结尾是可能是null.如果我们需要查询一个指定的进程的环境变量,我们可以采用如下的方法:
1
|
#cat /proc/4451/environ | tr ‘\000‘ ‘\n‘
|
如果执行了execve(2)之后,进程调用了putenv(3)或者是直接修改environ(7) ,那么environ变量的值是无法随之改变的.
更进一步,进程能够通过prctl(2)修改PR_SET_MM_ENV_START的值来修改这个文件所引用的内存位置.
读取这个文件的权限是由ptrace(2)的PTRACE_MODE_READ_FSCREDS来控制.
在Linux2.2的内核及其之后,/proc/pid/exe是直接执行的二进制文件的符号链接.这个符号链接能够被取消.尝试打开这个文件就相当与打开了二进制文件,甚至可以通过重新输入/proc/pid/exe重新运行一个对应于pid的二进制文件.在一个多线程的程序中,如果主线程已经退出了,就无法访问这个符号链接.
在Linux2.0及其之前,/proc/pid/exe是指向当前进程执行的二进制文件.采用readlink()读取返回如下的结果: [device]:inode
这是一个子目录,包含了当前进程打开的每一个文件.每一个条目都是一个文件描述符,是一个符号链接,指向的是实际打开的地址.0表示标准输入,1表示标准输出,2表示标准错误.在多线程程序中,如果主程序退出了,那么这个文件夹将不能被访问.
程序能够使用文件名作为命令行参数,如果没有提供这样的参数,就不会从标准输入中读取信息也不会将标准输出发送到文件中.但是即使没有提供与文件相关的命令行参数,我们仍然可以使用标准的输出输入.例如我们可以通过-i和-o分别指向输入和输出文件.如下所是:
1
|
$ foobar -i /proc/self/fd/0 -o /proc/self/fd/1 ...
|
在某些UNIX或者类似UNIX的系统中,/proc/self/fd/N与/dev/fd/N大致相同.大部分系统提供/dev/stdin,/dev/stdout,/dev/stderr的符号链接,分别只想的是/proc/self/fd中的0,1,2.所以上述的命令也可以写为:
1
|
$ foobar -i /dev/stdin -o /dev/stdout ...
|
这是一个子目录,包括了当前进程打开的所有的文件的文件描述符.可以读取每一个文件描述符的内容一获取i信息.如下所示:
1
|
$ cat /proc/5040/fdinfo/99
|
该文件显示了每个进程的软中断,硬中断和度量单位.在Linux2.6.35之前,这个文件仅仅只能被进程实际的UID访问.在26.36之后,该文件可以被系统中所有的用户读取.
包含了当前进程映射的内存区域以及他们的访问权限.文件格式如下:
1
|
address perms offset dev inode pathname
|
该文件可以通过open,read,seek访问进程的内存页.
这个文件主要是包含了挂载信息.文件内容结构如下:
1
|
36 35 98:0 /mnt1 /mnt2 rw,noatime master:1 - ext3 /dev/root rw,errors=continue
|
tag:[value]
类型的字段type[.subtype]
的方式命名列出在当前进程挂载空间下所有的已经挂载过的文件.文件的格式通过 fstab 查看.在kernel 2.6.15之后,这个文件是论询式的.在读取文件之后,这个事件会导致select标记这个文件是可读的,并且pool()和epoll_wait()会将此文件标记为遇到了错误.
该文件会列举在当前进程挂载空间下的所有挂载点的详细信息,包括统计信息,配置信息.文件格式如下:
1
|
device /dev/sda7 mounted on /home with fstype ext3 [statistics]
|
这是一个子目录.每一个子目录可以通过 setns 操作.关于更多的操作,参见clone
将文件挂载在其他地方可以使pid指定的进程的IPC命名空间保持活动状态,即使在当前命名空间的所有的进程全部都截止了.打开次文件就会返回文件句柄.只要文件保持打开状态,那么IPC的命名空间就可以保持活动状态.文件描述符可以通过 setns 传递.
将文件挂载在其他地方可以使pid指定的进程的网络命名空间保持活动状态,即使在当前命名空间的所有的进程全部都截止了.打开次文件就会返回文件句柄.只要文件保持打开状态,那么网络的命名空间就可以保持活动状态.文件描述符可以通过 setns 传递.
将文件挂载在其他地方可以使pid指定的进程的UTS 命名空间保持活动状态,即使在当前命名空间的所有的进程全部都截止了.打开次文件就会返回文件句柄.只要文件保持打开状态,那么UTS命名空间就可以保持活动状态.文件描述符可以通过 setns 传递
参见 numa
这个方法用于决定在出现OOM的情况下,哪个进程被杀掉.内核使用该值对进程的oom_score的值进行设定,oom_score的有效取值区间是-17至15.-17将会完全杀死这个进程.正数会增加进程当oom时被杀掉的可能性,负数会减小进程被oom杀掉的可能性.
该文件的默认值是0.新进程会继承其父进程的oom_adj设置.只有具有CAP_SYS_RESOURCE权限的进程才能够更新此文件.
在Linux2.6.36,推荐使用/proc/[pid]/oom_score_adj.
该文件显示了如果内核出现oom情况时决定杀死该进程时的分数.分数越高意味着进程越容易被杀掉.
这个文件用于调整在内存不足时应该杀掉哪个进程的分数判断.
该值可以用于 chroot 预先设定进程的根文件系统. 这个文件指向当前进程的根目录.作业类似于前面说过的 exe fd/* 等等.
在多线程的程序中,如果主线程推出了此符号链接的内容将无法访问.
这个文件显示了每个进程映射的内存消耗.每一个内存消耗都有如下的设置:
1
|
08048000-080bc000 r-xp 00000000 03:02 13130 /bin/bash
|
第一行显示的信息与/proc/[pid]/maps中的映射信息相同.剩下分别表示的是,映射的大小,RAM中当前驻留的映射大小,映射中干净和脏共享页的大小以及映射中干净和脏共享私有页数.
只有在启用了CONFIG_MMU内核配置选项时,此文件才会存在.
关于进程的状态信息.主要是用于 ps 展示.文件中的每一行的含义如下:
还有一些不常见的字段,就不做说明了
提供内存的使用情况.格式如下所示:
1
|
size (1) total program size
|
以更加可读的形式提供与/proc/pid/stat
和/proc/pid/statm
一样的信息.以下是示例.
1
|
$ cat /proc/$$/status
|
该目录包含的是进程中的每一个线程.每一个目录的名字是以线程ID命名的(tid).在每一个tid下面的目录结构与/proc/pid
下面的目录结构相同.对于所有线程共享的属性,task/tid
子目录中的每个文件内容与/proc/pid
目录中的相应文件内容相同.例如所有线程中的task/tid/cwd
文件和父目录中的/proc/pid/cwd
文件内容相同,因为所有的线程共享一个工作目录.对于每个线程的不同属性,task/tid
下相应文件的值也不相同.
在引导时传递给内核的参数
cpu和系统结构的信息.常见信息包括CPU的数量以及常见的系统常数.
此文件包含了系统当前内存的使用信息. free 用来报告系统中可用内存和已使用内存(物理内存和交换内存)以及内核中共享内存和缓冲区的大小.每一行都是以 参数名:参数值
显示.格式如下所示:
1
|
$ cat /proc/$$/status
|
显示当前加载到系统中所有的模块.
在内核2.4.19之前,这个文件会列举当前系统中挂载的所有的节点信息.在2.4.19之后,仅仅只会列举出当前进程在mount的命名空间下的挂载信息,即/proc/self/mounts的挂载信息,参见 fstab
此目录下面个中文虚拟的文件系统,主要是记录了系统中各种与网络有关的信息.这个文件都是普通ASCII文件,都可以通过cat的方式读取.
此文件主要是包含了用于地址解析的内核ARP表的信息.示例如下:
1
|
IP address HW type Flags HW address Mask Device
|
dev虚拟文件系统显示网络状态的信息,包括发送和接受的数据包的数量,错误和冲突以及其他的统计信息,这些信息也可以通过ifconfig查看. 示例如下:
1
|
Inter-| Receive | Transmit
|
存储的是RAW套接字表的信息
保存的是SNMP代理的IP,ICMP以及UDP的管理信息
保存的是系统中的TCP表的信息
保存的是系统中的UDP表的信息
显示当前系统所有的UNIX domain socket以及它们的状态信息.示例如下:
1
|
Num RefCount Protocol Flags Type St Path
|
内核/系统的信息
该目录下有很多的目录和子目录,其中主要是记录了与内核变量相关的信息.
dev目录下面的文件表示的是linux的设备.直接读/写/文件就可以向设备发送读或者写操作.按照读写存储数据方式,可以将dev下面的文件分为 字符型设备,块设备 伪设备.
字符型设备
字符设备是指每次与系统传输1个字符的设备.这些设备节点通常为传真,虚拟终端和串口调制解调器,键盘之类设备提供通信服务,它通常不支持随机存储数据.字符设备在实现时,大多不使用缓存其.系统直接从设备读取/写入每一个字符.
块设备
块设备是指与系统间用块的方式移动数据的设备,这些设备节点通常代表可寻址设备,如硬盘,CD-ROM和内存区域.块设备通常支持随机存取和寻址,并使用缓存器
伪设备
在类unix操作系统中,设备节点并不一定要对应物理设备.没有这种对应关系的设备是伪设备.常见的伪设备包括 null,zero,full,loop,random,urandom
对常见的dev设备进行说明
“tty”这个词源于Teletypes,或者teletypewriters,原来指的是电传打字机,是通过串行线用打印机键盘通过阅读和发送信息的东西,后 来这东西被键盘与显示器取代,所以现在叫终端比较合适。
终端是一种字符型设备,它有多种类型,通常使用tty来简称各种类型的终端设备。通常我们在linux下看到的控制台(console)是由几个设备完成的。分别是:
1
|
1. /dev/tty0
|
远程登录交互终端shell设备,我们在远程telnet到主机或使用xterm时也需要一个终端交互,这就是虚拟终端pty(pseudo-tty).
/dev/pts是远程登陆(telnet,ssh等)后创建的控制台设备文件所在的目录。由于可能有好几千个用户登陆,所以/dev/pts其实是动态生成的,不象其他设备文件是构建系统时就已经产生的硬盘节点(如果未使用devfs)
1
|
1. /dev/pts/0
|
上面来自 https://blog.spoock.com/2019/10/08/proc/
标签:module unless cat cape 交换 工具 shel cut 时间
原文地址:https://www.cnblogs.com/codestack/p/12897823.html