Linux文件误删除,如何快速恢复

事件还原

最近服务器的磁盘不够用了,通过df -lh命令,发现其他挂载盘有相对充裕的磁盘空间,就想着将服务放在另外的磁盘目录,然后通过软链接使原本目录正常访问;具体场景如下:

[root@root-10-xx-xx-174 boci_logs]# df -lh
Filesystem            Size  Used Avail Use% Mounted on
/dev/mapper/myvg-root
                      259G  218G   28G  89% /
tmpfs                  63G   36G   28G  58% /dev/shm

上述目录/dev/mapper/myvg-root之前是近100%的使用率,后面将某一目录进行迁移,以及软链接创建的操作:

mv /home/xxx /dev/shm/xxx
ln -s /dev/shm/xxx /home/xxx
ln -s /dev/shm/xxx /home/xxx-2

此时我发现/home/xxx-2目录多余了,就想删掉,执行了命令:

rm -rf /home/xxx-2

可想而知,反应过来的时候,多奔溃,平白无故给自己加工作量;

恢复方法

先看看文件是不是还有进程占用(文件恢复也基于此种情形)

[root@root-10-xx-xx-174 boci_logs]# lsof | grep /dev/shm
java      132387      root  mem       REG               0,16       48602  474577519 /dev/shm/xxx/lib/tomcat-juli-8.5.27.jar
java      132387      root  mem       REG               0,16      148604  474577516 /dev/shm/xxx/lib/tomcat-jdbc-8.5.51.jar
java      132387      root  mem       REG               0,16      144971  474577512 /dev/shm/xxx/lib/tomcat-jdbc-8.5.27.jar
java      132387      root  mem       REG               0,16      260325  474577509 /dev/shm/xxx/lib/tomcat-embed-websocket-8.5.51.jar
java      132387      root  mem       REG               0,16      257229  474577506 /dev/shm/xxx/lib/tomcat-embed-websocket-8.5.27.jar
java      132387      root  mem       REG               0,16      250194  474577503 /dev/shm/xxx/lib/tomcat-embed-el-8.5.51.jar
java      132387      root  mem       REG               0,16      240316  474577500 /dev/shm/xxx/lib/tomcat-embed-el-8.5.27.jar
java      132387      root  mem       REG               0,16     3241499  474577494 /dev/shm/xxx/lib/tomcat-embed-core-8.5.51.jar
java      132387      root  mem       REG               0,16     3107599  474577491 /dev/shm/xxx/lib/tomcat-embed-core-8.5.27.jar
java      132387      root  mem       REG               0,16       12373  474577488 /dev/shm/xxx/lib/tomcat-annotations-api-8.5.51.jar

发现部分文件还存在进程,pid为 132387。根据pid进入此目录cd /proc/132387/fd
查看文件:

[root@root-10-xx-xx-174 fd]# ll
总用量 0
lr-x------ 1 root root 64 11月 27 16:00 10 -> /dev/shm/xxx/lib/asm-analysis-4.1.jar
lr-x------ 1 root root 64 11月 27 16:00 100 -> /dev/shm/xxx/lib/spring-aop-4.3.14.RELEASE.jar
lr-x------ 1 root root 64 11月 27 16:00 101 -> /dev/shm/xxx/lib/spring-aspects-4.3.14.RELEASE.jar
lr-x------ 1 root root 64 11月 27 16:00 102 -> /dev/shm/xxx/lib/spring-beans-4.3.14.RELEASE.jar
lr-x------ 1 root root 64 11月 27 16:00 103 -> /dev/shm/xxx/lib/spring-boot-1.5.10.RELEASE.jar
lr-x------ 1 root root 64 11月 27 16:00 104 -> /dev/shm/xxx/lib/spring-boot-autoconfigure-1.5.10.RELEASE.jar
lr-x------ 1 root root 64 11月 27 16:00 105 -> /dev/shm/xxx/lib/spring-boot-starter-1.5.10.RELEASE.jar
lr-x------ 1 root root 64 11月 27 16:00 106 -> /dev/shm/xxx/lib/spring-boot-starter-aop-1.5.10.RELEASE.jar
lr-x------ 1 root root 64 11月 27 16:00 107 -> /dev/shm/xxx/lib/spring-boot-starter-cache-1.5.10.RELEASE.jar

上述我截取了一部分数据,实际上,你会找到非常多的数据,你还需要过滤筛选。另外,手动恢复的时候需要每个目录一层层恢复,下面以恢复/dev/shm/xxx/目录为例。先创建该目录:mkdir -vp /dev/shm/xxx/。然后在/proc/pid/fd目录下筛选出该目录下可恢复文件:

[root@root-10-xx-xx-174 fd]# ll | grep /dev/shm/xxx/ | awk '{print $9, $11}'
1 /dev/shm/xxx/logs/stdout.log
10 /dev/shm/xxx/lib/asm-analysis-4.1.jar
100 /dev/shm/xxx/lib/spring-aop-4.3.14.RELEASE.jar
101 /dev/shm/xxx/lib/spring-aspects-4.3.14.RELEASE.jar
102 /dev/shm/xxx/lib/spring-beans-4.3.14.RELEASE.jar
103 /dev/shm/xxx/lib/spring-boot-1.5.10.RELEASE.jar
104 /dev/shm/xxx/lib/spring-boot-autoconfigure-1.5.10.RELEASE.jar
105 /dev/shm/xxx/lib/spring-boot-starter-1.5.10.RELEASE.jar
106 /dev/shm/xxx/lib/spring-boot-starter-aop-1.5.10.RELEASE.jar
107 /dev/shm/xxx/lib/spring-boot-starter-cache-1.5.10.RELEASE.jar
108 /dev/shm/xxx/lib/spring-boot-starter-data-jpa-1.5.10.RELEASE.jar
109 /dev/shm/xxx/lib/spring-boot-starter-data-redis-1.5.10.RELEASE.jar
11 /dev/shm/xxx/lib/asm-tree-4.1.jar

awk '{print $9, $11}'命令是将ll | grep /dev/shm/xxx/的输出项的第9个字段与第11个字段提取出来。第9个字段称之为:文件id,第11个字段称之为:文件路径,则恢复命令为:cp 文件id 文件路径。经处理,上述输出结果最终执行的恢复命令为(可用正则替换,查找目标:(^\d+), 替换为:cp $1):

cp 1 /dev/shm/xxx/logs/stdout.log
cp 10 /dev/shm/xxx/lib/asm-analysis-4.1.jar
cp 100 /dev/shm/xxx/lib/spring-aop-4.3.14.RELEASE.jar
cp 101 /dev/shm/xxx/lib/spring-aspects-4.3.14.RELEASE.jar
cp 102 /dev/shm/xxx/lib/spring-beans-4.3.14.RELEASE.jar
cp 103 /dev/shm/xxx/lib/spring-boot-1.5.10.RELEASE.jar
cp 104 /dev/shm/xxx/lib/spring-boot-autoconfigure-1.5.10.RELEASE.jar
cp 105 /dev/shm/xxx/lib/spring-boot-starter-1.5.10.RELEASE.jar
cp 106 /dev/shm/xxx/lib/spring-boot-starter-aop-1.5.10.RELEASE.jar
cp 107 /dev/shm/xxx/lib/spring-boot-starter-cache-1.5.10.RELEASE.jar
cp 108 /dev/shm/xxx/lib/spring-boot-starter-data-jpa-1.5.10.RELEASE.jar
cp 109 /dev/shm/xxx/lib/spring-boot-starter-data-redis-1.5.10.RELEASE.jar
cp 11 /dev/shm/xxx/lib/asm-tree-4.1.jar

上述命令,在/proc/pid/fd 目录下,执行即可。

题外话

虽然已经能够简单地文件恢复,但是还需要注意两点:
1.一个目录源最好不要有多个软链接,很容易误操作删除本不想删除的文件;
2.要删除软链接时,执行unlink xxx,xxx为链接目录/文件

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 对于删除文件恢复,可以使用一些工具来进行恢复,比如说TestDisk、PhotoRec等等。这些工具可以扫描硬盘并找回被删除文件,但是需要注意的是,如果文件被覆盖或者硬盘已经受损,那么恢复的成功率会降低。 ### 回答2: 在Linux系统中,当文件删除时,我们有几种方法可以尝试恢复文件。 首先,我们可以使用一些命令行工具来恢复删除文件。比如使用“find”命令可以搜索整个文件系统,找到被删除文件的副本。命令如下: ``` $ find / -name "filename" ``` 这将在整个文件系统中搜索名为“filename”的文件,并显示它们的位置。然后可以将文件移动回原来的位置。 第二种方法是使用“grep”命令。它可以在磁盘上搜索二进制数据,找到被删除文件的内容并使用其内容重建文件。命令如下: ``` $ grep -a -B100 -A100 'text in the file' /dev/sda1 > recovered_file ``` 这个命令将在磁盘设备/sda1上搜索包含“file”中内容的二进制数据,并将结果保存到一个名为“recovered_file”的文件中。 第三种方法是使用专业的数据恢复工具。有许多第三方软件可以帮助我们恢复删除文件,例如TestDisk、PhotoRec等。这些工具通常具有更复杂的功能,可以深入扫描磁盘,寻找被删除文件的各个部分,并尝试将它们重新组装起来。 尽管使用这些方法可以恢复删除文件,但是成功率并不是百分之百,因为文件删除后,其数据可能已经被覆盖或者损坏。因此,在删除文件后,应尽快采取措施来尝试恢复文件,以提高成功的机会。此外,为了避免类似问题的发生,我们应该定期备份重要文件,并小心操作。 ### 回答3: 在Linux系统中,当我们删除文件时,通常可以采取以下方法进行恢复: 1. 使用回收站:某些文件管理器在删除文件时会将其移动到回收站而不是直接永久删除。可以尝试在文件管理器的回收站或垃圾桶中查找并恢复删除文件。 2. 使用undelete命令:在终端中,可以尝试使用undelete命令来恢复删除文件。通过在终端输入该命令并指定所需恢复文件路径,系统将尝试从硬盘上恢复删除文件。 3. 使用恢复工具:还可以使用一些专门的恢复工具来恢复删除文件。例如,extundelete和testdisk是两个常用的Linux文件恢复工具。这些工具可以扫描硬盘并尝试恢复删除文件。 需要注意的是,无论使用哪种方法,都应尽可能在删除后尽早采取恢复措施。一旦新的文件被写入硬盘上原文件所在的空间,恢复工作就会变得更加困难或者不可能。因此,当发现删除文件后,尽量避免继续使用该硬盘,以最大限度地提高文件恢复成功率。 此外,为了避免删除文件,建议定期备份重要的文件。备份可以帮助我们恢复文件,即使出现操作或其他问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值