/proc目录的作用,及利用/proc恢复删除的文件
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了/proc目录的作用,及利用/proc恢复删除的文件相关的知识,希望对你有一定的参考价值。
介绍:在Linux系统中,/proc目录是一个位于内存中的伪文件系统。该目录下保存的不是真正的文件和目录,而是一些“运行时”的信息,如CPU信息、负载信息、系统内存信息、磁盘io信息等。
通过ls -lh命令查看该目录下的文件,会发现几乎所有的文件大小都是0。但是仍然可以通过vim、cat、less、more等命令查看文件的内容。
/proc目录是内核提供给我们的查询中心,通过查询该目录下的文件内容,可以获取到有关系统硬件及当前运行进程的信息。
常用文件:
文件名 | 功能 |
cmdline | 保存操作系统的启动参数 |
cpuinfo | 保存CPU的相关信息。对应lscpu命令。 |
devices | 系统已经加载的所有块设备和字符设备的信息。 |
diskstats | 统计磁盘设备的I/O信息。 |
filesystems | 保存当前系统支持的文件系统。 |
kcore | 物理内存的镜像。会显示文件大小,但不占用实际磁盘空间。该文件大小是已使用的物理内存加上4K。 |
loadavg | 保存最近1分钟、5分钟、15分钟的系统平均负载。 |
meminfo | 保存当前内存使用情况。对应free命令 |
mounts -> self/mounts | 系统中当前挂载的所有文件系统。mount命令。 mounts文件是链接到self/mounts。 |
net/dev | 网络流量统计。接收、发送、发送时的错误和冲突情况。 |
partitions | 每个分区的主设备号(major)、次设备号(minor)、包含的块(block)数目。 |
uptime | 系统自上次启动后的运行时间。 |
version | 当前系统的内核版本号 |
vmstat | 当前系统虚拟内存的统计数据 |
更多其他文件的介绍,可以通过man proc命令查看。
进程目录:
/proc目录下有很多以数字命名的目录,这些目录与进程的pid相对应。通过这些目录,可以查看进程相关的信息。下面是一些常用的文件:
cmdline:保存了当前进程的启动命令。如下是系统中运行的jenkins的启动命令:
# cat cmdline /etc/alternatives/java-Dcom.sun.akuma.Daemon=daemonized-Djava.awt.headless=true-DJENKINS_HOME=/var/lib/jenkins-jar/usr/lib/jenkins/jenkins.war--logfile=/var/log/jenkins/jenkins.log--webroot=/var/cache/jenkins/war--daemon--httpPort=8080--debug=5--handlerCountMax=100--handlerCountMaxIdle=20
cwd:指向进程运行的目录:
lrwxrwxrwx 1 jenkins jenkins 0 1月 10 15:09 cwd -> /
exe:指向启动进程的可执行文件:
lrwxrwxrwx 1 jenkins jenkins 0 1月 10 15:09 exe -> /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.131-0.b11.el6_9.x86_64/jre/bin/java
environ:包含与进程相关的环境变量:
# cat environ SHELL=/bin/bashTERM=linuxUSER=jenkinsPATH=/sbin:/usr/sbin:/bin:/usr/binrunlevel=5RUNLEVEL=5LANGSH_SOURCED=1PWD=/LANG=en_US.UTF-8previous=NPREVLEVEL=NCONSOLETYPE=vtHOME=/home/jenkinsSHLVL=3UPSTART_INSTANCE=LOGNAME=jenkinsUPSTART_EVENTS=runlevelUPSTART_JOB=rc_=/etc/alternatives/javaNLSPATH=/usr/dt/lib/nls/msg/%L/%N.catXFILESEARCHPATH=/usr/dt/app-defaults/%L/Dt
fd:fd目录包含了进程打开的每一个文件的文件描述符。这些描述符都指向实际文件:
# ls -l 总用量 0 l-wx------ 1 jenkins jenkins 64 1月 8 14:06 0 -> /dev/null l-wx------ 1 jenkins jenkins 64 1月 8 14:06 1 -> /dev/null lr-x------ 1 jenkins jenkins 64 1月 8 14:06 10 -> /dev/urandom lr-x------ 1 jenkins jenkins 64 1月 8 14:06 100 -> /var/cache/jenkins/war/WEB-INF/lib/akuma-1.10.jar lr-x------ 1 jenkins jenkins 64 1月 8 14:06 101 -> /var/cache/jenkins/war/WEB-INF/lib/asm-analysis-5.0.3.jar ......
task:task目录下包含了当前进程的每一个线程的相关信息,与进程运行时的相关文件一样:
# ls task/ 12289 12291 13763 13766 2639 2641 2643 2647 2649 2651 ...
limits:保存了进程使用资源的限制信息,软限制、硬限制及单位:
# cat limits Limit Soft Limit Hard Limit Units Max cpu time unlimited unlimited seconds Max file size unlimited unlimited bytes
利用/proc目录找到被删除的文件:
当前系统有jenkins正在运行,误删除了/var/cache/jenkins/war/WEB-INF/lib/akuma-1.10.jar文件。误删除的文件可能导致jenkins重启失败,或者导致某些功能失效。
在Linux系统中,如果删除了一个较大的文件。虽然在文件系统中找不到该文件,但是用df命令查看时,发现磁盘空间并没有因为文件的删除而增大。很有可能是因为某个进程正在使用该文件,执行删除命令不会马上删除该文件,占用的磁盘空间也不会被立即释放。
现在尝试使用/proc目录恢复删除的文件:
首先使用lsof命令查看该文件被哪个进程使用:
# lsof | grep 'akuma-1.10.jar' java 2639 jenkins mem REG 8,5 19673 11928812 /var/cache/jenkins/war/WEB-INF/lib/akuma-1.10.jar java 2639 jenkins 100r REG 8,5 19673 11928812 /var/cache/jenkins/war/WEB-INF/lib/akuma-1.10.jar
在/proc/2639/fd目录下找到该文件的文件句柄:
# ls -l | grep akuma lr-x------ 1 jenkins jenkins 64 1月 8 14:06 100 -> /var/cache/jenkins/war/WEB-INF/lib/akuma-1.10.jar (deleted)
尝试恢复该文件,恢复的方式很简单。直接复制文件句柄、并修改文件权限即可:
# cp /proc/2639/fd/100 /var/cache/jenkins/war/WEB-INF/lib/akuma-1.10.jar # chown jenkins:jenkins /var/cache/jenkins/war/WEB-INF/lib/akuma-1.10.jar
重启jenkins,是否能启动成功:
# /etc/init.d/jenkins restart Shutting down Jenkins [确定] Starting Jenkins [确定] # ps -ef | grep -v grep | grep jenkins jenkins 21001 1 99 16:22 ? 00:00:17 /etc/alternatives/java -Dcom.sun.akuma.Daemon=daemonized ......
以上是关于/proc目录的作用,及利用/proc恢复删除的文件的主要内容,如果未能解决你的问题,请参考以下文章
Android 逆向Android 系统文件分析 ( /proc/ 目录文件分析 | 记录系统和进程信息 | version 内核版本信息文件 )