Oracle Solaris上如何使用打开文件描述符来恢复被误删除rm的文件

如果自己搞不定可以找诗檀软件专业ORACLE数据库修复团队成员帮您恢复!

诗檀软件专业数据库修复团队

服务热线 : 13764045638 QQ号:47079569 邮箱:service@parnassusdata.com

 

适用于:

Solaris SPARC Operating System – Version: 8.0 及以上  [Release: 8.0及以上 ]
所有平台

目标

本文描述了访问被进程保持打开的文件中数据的简单方法。

解决方案

 

在某些情况下,从已删除的文件中恢复数据是有可能的。具体来说,必须有一个进程仍为文件保持open file descriptor。

伪文件系统“/ proc”包含系统上每个正在运行进程的目录。每个进程目录以进程的PID命名,包含名为“fd”的子目录,下面是代表每个进程的open file descriptor的文件:
$ ls -li /proc/314/fd
total 432
c———   1 john  agroup       24,  3 Sep 25 21:07 0
c———   1 john  agroup       24,  3 Sep 25 21:07 1
c———   1 john  agroup       24,  3 Sep 25 21:07 2
-r–r–r–   1 dave  bgroup       740672 Apr 30 09:30 3

 

 

$ file /proc/314/fd/3
/proc/314/fd/3:        ascii text

 

使用这些文件可以访问由一个进程打开的文件。默认情况下,一个进程有文件描述符file descriptors 0,1和2打开,分别为标准输入,标准输出和标准错误。因此,通过一个进程打开的任何文件往往会被编号为3或以上。在上面的例子中,fd3是一个纯文本文件。

这里是该技术的一个例子:

  1. 首先设置一个文件:

$ cp /usr/dict/words /tmp

  1. 然后,启动一个进程,将保持文件无限打开:

$ tail -f /tmp/words > /dev/null 2>&1 &
[1]    1188

  1. 该进程PID为1188。找出该文件被分配了哪个file descriptor:

$ pfiles 1188
1188:        tail -f /tmp/words
Current rlimit: 256 file descriptors
0: S_IFREG mode:0444 dev:305,2 ino:12152977 uid:71062 gid:15 size:206663
O_RDONLY|O_LARGEFILE
/tmp/words
1: S_IFCHR mode:0666 dev:301,0 ino:6815752 uid:0 gid:3 rdev:13,2
O_WRONLY|O_CREAT|O_TRUNC|O_LARGEFILE
/devices/pseudo/mm@0:null
2: S_IFCHR mode:0666 dev:301,0 ino:6815752 uid:0 gid:3 rdev:13,2
O_WRONLY|O_CREAT|O_TRUNC|O_LARGEFILE
/devices/pseudo/mm@0:null

 

 

$ cd /proc/1188/fd
$ ls
0  1  2
$ file 0
0:               English text
$ head 0
10th
1st
2nd
3rd
4th
5th
6th
7th
8th
9th
$ tail 0
zoology
zoom
Zorn
Zoroaster
Zoroastrian
zounds
z’s
zucchini
Zurich
zygote

  1. 文件内容看起来没问题。现在删除文件:

$ rm /tmp/words
$ ls /tmp/words
/tmp/words: No such file or directory

  1. 现在尝试再次访问数据:

$ tail /proc/1188/fd/0
zoology
zoom
Zorn
Zoroaster
Zoroastrian
zounds
z’s
zucchini
Zurich
zygote

  1. 数据仍可访问,将其保存到一个文件:

$ cat 0 > /tmp/words.recovered

  1. 现在确保文件是完整的:

$ cmp /usr/dict/words /tmp/words.recovered

在以上进程中要考虑几点。

  1. /proc

/proc 文件系统在Solaris 2.6中被引入,所以该步骤不适用于Solaris 2.5.1 或以上。在Solaris之前的版本,pfiles 是在/usr/proc/bin 而非/usr/bin中找到。

  1. quiesce the process停顿进程

在上面的例子中,tail不会尝试修改要恢复的文件。你应该考虑这对于你的进程是否如此,并在必要时停顿进程,避免你恢复的数据副本不一致。kill-STOP或/usr/sbin/pstop将暂时停止进程运行。

  1. 文件系统空间

即使原始文件被删除,它仍会消耗空间。只有当保持fd的进程退出,空间才会被释放。

  1. pfiles

以上显示的pfiles输出是在Solaris 10 版本发出命令。早期版本不打印出文件的路径,而是打印出文件的inode号,以及包含文件系统的设备的major/minor 号。 要基于inode 号找出文件,使用’find / -inum ‘。

产品
Solaris 10 Operating System
Solaris 9 Operating System
Solaris 8 Operating System

Comment

*

沪ICP备14014813号

沪公网安备 31010802001379号