事件还原
最近服务器的磁盘不够用了,通过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为链接目录/文件