tar解压冲掉软连接后恢复CentOS系统

问题来源

tar解压文件,如果你的源目录是一个文件夹,目标地址有一个相同名字的文件夹(但它其实是一个软连接),那么目标地址里面的那个软连接会修改为你的源目录文件夹,而非从源目录里面将内容拷贝到目标软连接下面。

例如,你有一个tar.gz压缩的安装包libedit.tar.gz
里面内容为:

1
2
./lib64/libedit.so.0.0.42
./lib64/libedit.so.2 -> libedit.so.0

现在我们使用:

1
tar -zxvf libedit.tar.gz -C /

解压到根目录。

会有什么潜在的问题?
咋一看应该很正常,但是,我们看下根目录下的lib64

1
2
3
# ls -lh /
lrwxrwxrwx 1 root root 7 Sep 19 19:39 lib -> usr/lib/
lrwxrwxrwx 1 root root 9 Sep 19 19:39 lib64 -> usr/lib64/

lib64目录并非你想像的,他不是一个目录,而是一个软链接,如果强行覆盖,会导致lib64变成一个目录,而目录里面只有上述的libedit文件。
于是一些列依赖于/lib64下的动态库的软件(包括bash都无法运行)。提示:
运行任何命令都会提示:

1
/lib64/ld-linux-x86-64.so.2: bad file or directory

link-info

下面我们演示的,是在CentOS 7下,覆盖了sbin和lib目录,导致启动失败的情况,破坏性动作为:

1
2
3
4
5
6
7
8
9
10
~ # ls -lh /
lrwxrwxrwx. 1 root root 8 Dec 4 2016 sbin -> usr/sbin
lrwxrwxrwx. 1 root root 7 Apr 14 15:47 lib -> usr/lib/
~ # tar -zxvf iotop.tar.gz -C /
sbin/
sbin/iotop
lib/python2.7/site-packages/iotop-0.6-py2.7.egg-info
~ # ls -lh /
drwxr-xr-x 2 root root 18 Sep 27 2017 sbin
drwxr-xr-x. 1 root root 7 Apr 14 15:47 lib

演示使用CentOS Rescue模块恢复。

下载

进入 https://www.centos.org/download/ 下载CentOS-7-x86_64-Minimal-1708.iso 可以选择阿里的下载地址 http://mirrors.aliyun.com/centos/7/isos/x86_64/CentOS-7-x86_64-Minimal-1708.iso

引导

物理机直接刻录USB光盘即可引导,虚拟机我们以vSphere作为演示。
先上传ISO到服务器存储:
vsphere-upload

设置虚拟机加载ISO镜像:
vsphere-iso

记得勾选“打开电源时连接”:
vsphere-iso-poweron

设置引导的时候,引导到BIOS:
vsphere-bios

接下来就可以开启电源,启动后,按ctrl+alt+del进入重启,然后马上按Esc,就会出现Boot Menu,选择 CD-ROM Drive启动:
boot-select

进入Rescue模式

选择进入Troubleshooting:
menu-select

选择进入Rescue a CentOS system:
enter-rescue-mode

输入“1”进入默认的read-write挂载模式,然后再输入“回车”:
enter-system

修改

由于我的覆盖操作将sbin和lib目录都覆盖了,所以,需要恢复两个目录,执行:

1
2
3
4
5
cd /mnt/sysimage/
rm -rf ./lib ./sbin
ln -s usr/sbin sbin
ln -s usr/lib lib
reboot -f

repaire

重启后,就能进入系统了,确认一下,内容如下即可:
after-repaire

此外,之前遇到类似问题,不使用Rescue模式也可以,直接手动mount,用内存文件系统引导进入系统,将原来的root分区挂载,修改软链接然后重启。

如果root分区是lvm卷,需要如此挂载:

1
2
3
vgscan
vgchange -a y XXX
mount /dev/XXX /mnt