/proc目录的作用,及利用/proc恢复删除的文件

/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 ......

你可能感兴趣的:(学习笔记)