/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恢复删除的文件的主要内容,如果未能解决你的问题,请参考以下文章

恢复删除的文件

认识/proc/[pid]/

认识/proc/[pid]/

Proc恢复数据文件

/proc文件系统的作用

Android 逆向Android 系统文件分析 ( /proc/ 目录文件分析 | 记录系统和进程信息 | version 内核版本信息文件 )