libc.so.6被误删的恢复

说出来都是泪,国庆都都这个事耽搁了,libc.so.6文件被我不小心删掉了,踩了所有能踩到的坑,终于恢复了。

事情的起因是由于需要做进化树,出来可能树比较大,所以下载了命令行版的MEGA11(mega-cc-11.0.13-1.x86_64),但在安装过程中显示需要glibc2.34, 我用yum最多只能更新到glibc2.28,而是下载了glibc2.34源代码进行编译安装,安装在了/usr/local文件夹中,但系统默认的还是/lib64/中的glibc2.28,于是想着像其它软件一样,先把现在使用的libc.so.6删掉,然后重新建立一个软连接到/usr/local/glicb2.34中的libc.so.6,但当我删除掉/lib64中的libc.so.6后,一切都变了,除了cd命令,其它命令都用不了,除了当前运行的用户,其它用户远程连接也进去不了,想着第二天去机房登录root再改过来不就行了,便第二天去机房发现root用户也登录不了,这时windows思维来了,重启可以解决80%的问题,果断重启了,这也使我失去了最后一次挽救的机会,重启之后,原来的连接也断了,没办法,只能到处找攻略,发现手贱的不只我一个,于是按照攻略开启了曲折的营救模式。

由于服务器安装的是CentOS8,但CentOS8官方已不支持了,官网上下不到系统,我想CentOS7应该也可以,于是就下载了一个CentOS7系统制作启动盘,这就开启了踩坑之旅。

首先出现的是问题是进入救援模式后出现:

No Caching mode page found
Assuming drive cache:write through

2. 修改U盘位置

出现此种情况之后,安装无法进行下去,只能重启,通过搜索发现是由于系统没有识别引导路径,在进入到启动盘界面时,用上下键选择救援模式,然后按”e”进入编辑模式,将hd:后的内容换成U盘所在的盘符位置,如:

vmlinuz initrd=initrd.img inst.stage2=hd:LABEL=CentOSx207x20x86_64 rescue quiet
###修改为
vmlinuz initrd=initrd.img inst.stage2=hd:/dev/sdc4:/ rescue quiet
###如果不知道U盘的位置,可以退出后进入shell模式,然后使用:
ls /dev/sd*
##或者使用查看
fdisk -l

这一步没有问题后按”ctrl+x”运行,看见有选择界面后选择“ 1 continue”,可以运行了,但一直是出现一排排的等于号,我以为可能是由于服务器中文件比较多,加载时间比较长,但等我第二天过来一看还是如此,第三天也一样,我看到别人的只有两排等于号,第四天终于受不了,给终止了,重新找原因。

多年的经验告诉我,百娘在关键时候是不行的,解决问题的最佳途径是要找官方的说明文档,中文中论坛中的解释很多都是很片面的,而是找到了官方的关于救援模式的说明文件,里面详细说明了救援模式的来龙去脉,而且告诉了具体的操作方法,发现救援模式是用Anaconda做的一个小的linux环境,使用Alt+Tab可以切换到命令模式,可以运行

systemctl --no-wall rescue

重新进入救援模式,发现还是出现原来的情况,但是如果选择2 “Read-only mount”的话可以挂载文件,这下心里就有底了,实在弄不了可以选择这个把数据拷贝出来。

3. 更换系统盘

后来想了一下,会不会是由于我的系统是CentOS8,而我使用的救援模式所采用的系统是CentOS7,导致挂载失败,于是重新找了个CentOS8系统,由于官方不支持CentOS8了,很多镜像也去掉这个版本了,幸好阿里云镜像中还有,使用UltraISO做了个新的启动盘,由于U盘比较旧了,插在服务器上接触不良,老是识别不了,没办法重新找了一个好一点的金士顿的盘才做好,但是每次开机时都是直接进入了系统,没有先启动U盘,一开始时我不是已经设置了U盘先启动的吗,使我进一步怀疑是不是U盘有问题,插到其它的电脑试了都没有问题后,重新打开BIOS设置看下是不是U盘先启动,但发现启动顺序恢复到了默认设置,按F2重新设置启动顺序,终于顺利进入了U盘的救援模式,按照上面的操作按”e”进入编辑模式,将hd:后的内容换成U盘所在的盘符位置,进入到系统救援模式,按”1) Continue”,但又遇到了新的问题,就是找不到可用的 linux 系统,明明刚才用CentOS7启动盘的时候可以找到系统吗。而是又搜索了这个错误信息,终于找到了解决的办法。

4. 激活引导分区

出现的错误信息如下:

you don't have any Linux partitions,
Press return to get a shell.
The system will reboot automatically when you exit from the shell.

参考这篇文章介绍的方法终于解决了。运行”fdisk -l”查看分区情况,看到/dev/sda1 后面加了个“*”号,这个可能就是引导分区了,运行”lvdisplay”查看逻辑卷,找到需要激活的逻辑卷,使用vgchange命令进行激活,但当我使用mount挂载时还是找不到,运行”systemctl –no-wall rescue”重新进入救援模式,按”1) Continue”没有出现找不到linux系统,激活的引导程序所在的系统找到了,不到1分钟swap中的内容就挂载上去,因为不需要修改/root和/home中的内容,所以选择不挂载这两个盘。这一步需要运行的命令如下:

###查看磁盘分区情况
fdisk -l
###查看逻辑卷
lvdisplay
###激活逻辑卷
vgchange -ay /dev/cl   ##cl是上一步需要激活的"VG name"
###重新进入救援模式
systemctl --no-wall rescue

5. 恢复libc.so.6文件

与CentOS7不同的是CentOS8默认挂载的文件夹是”/mnt/sysroot/”,不是”/mnt/sysimage”, “chroot /mnt/sysroot”进入到服务器的系统目录(注意不是启动盘中的系统目录),运行”ls‘可以看到系统目录中的文件,进入libc.so.6文件原来的目录”lib64″,拷贝一个libc.so.6文件到这个文件夹中就可以了。

###进入系统目录
chroot /mnt/sysroot
###拷贝文件
cp lib64/libc-2.28.so /lib/libc.so.6     ##因为原来libc.so.6只是libc-2.28.so的软连接,所以直接复制原文件过来就可以了
###重启系统
reboot 

由于系统软件有更改,重启时需要进行安全校验,可能进入系统会花费较长时间,可以更改启动文件来进行设置不检验,启动后再更过来,但是不建议这么做,因为服务器一般启动了很久才会关,有可能有搞忘了改,反正几天时间都花了,多等几分钟也没关系。

参考资料:

https://docs.centos.org/en-US/centos/install-guide/Rescue_Mode/         ###官方资料
https://www.thegeekdiary.com/how-to-boot-into-rescue-mode-or-emergency-mode-through-systemd-in-centos-rhel-7-and-8/                     ###多种进入救援模式的方法
https://www.tecmint.com/recover-or-rescue-corrupted-grub-boot-loader-in-centos-7/   ###CentOS7的救援模式
https://zhuanlan.zhihu.com/p/398478111   ###国内比较详细的介绍救援模式的方法
https://www.golinuxcloud.com/e2fsck-repair-filesystem-in-rescue-mode-ext4/ ###找不到linux系统搜到的解决方法
https://blog.csdn.net/leenhem/article/details/118111370   ###救援模式挂载lvm出错的解决方法

CentOS8安装docker

由于有一些软件需要运行在docker上,打算在CentOS8上安装试一下。一开始是按照菜鸟教程上的操作(curl -fsSL https://get.docker.com | bash -s docker –mirror Aliyun)来进行的,但出现下面错误:

Error:
 Problem 1: problem with installed package podman-3.2.3-0.10.module_el8.4.0+886+c9a8d9ad.x86_64
  - package podman-3.2.3-0.10.module_el8.4.0+886+c9a8d9ad.x86_64 requires runc >= 1.0.0-57, but none of the providers can be installed
  - package podman-3.3.1-9.module_el8.5.0+988+b1f0b741.x86_64 requires runc >= 1.0.0-57, but none of the providers can be installed
  - package containerd.io-1.6.8-3.1.el8.x86_64 conflicts with runc provided by runc-1.0.0-74.rc95.module_el8.4.0+886+c9a8d9ad.x86_64
  - package containerd.io-1.6.8-3.1.el8.x86_64 obsoletes runc provided by runc-1.0.0-74.rc95.module_el8.4.0+886+c9a8d9ad.x86_64
  - package containerd.io-1.6.8-3.1.el8.x86_64 conflicts with runc provided by runc-1.0.2-1.module_el8.5.0+911+f19012f9.x86_64
  - package containerd.io-1.6.8-3.1.el8.x86_64 obsoletes runc provided by runc-1.0.2-1.module_el8.5.0+911+f19012f9.x86_64
  - cannot install the best candidate for the job
  - package runc-1.0.0-66.rc10.module_el8.5.0+1004+c00a74f5.x86_64 is filtered out by modular filtering
  - package runc-1.0.0-72.rc92.module_el8.5.0+1006+8d0e68a2.x86_64 is filtered out by modular filtering
 Problem 2: problem with installed package buildah-1.21.4-1.module_el8.4.0+886+c9a8d9ad.x86_64

这是因为安装了podman就不能再安装docker了,需要先卸载podman:

yum install -y -q yum-utils
+ sh -c 'yum install -y -q docker-ce docker-ce-cli containerd.io docker-scan-plugin docker-compose-plugin docker-ce-rootless-extras'
Error:
 Problem 1: problem with installed package containers-common-1:1.3.1-5.module_el8.4.0+886+c9a8d9ad.x86_64
  - package containers-common-1:1.3.1-5.module_el8.4.0+886+c9a8d9ad.x86_64 requires runc, but none of the providers can be installed
  - package containers-common-2:1-2.module_el8.5.0+890+6b136101.noarch requires runc, but none of the providers can be installed
  - package containerd.io-1.6.8-3.1.el8.x86_64 conflicts with runc provided by runc-1.0.0-74.rc95.module_el8.4.0+886+c9a8d9ad.x86_64
  - package containerd.io-1.6.8-3.1.el8.x86_64 obsoletes runc provided by runc-1.0.0-74.rc95.module_el8.4.0+886+c9a8d9ad.x86_64
  - package containerd.io-1.6.8-3.1.el8.x86_64 conflicts with runc provided by runc-1.0.2-1.module_el8.5.0+911+f19012f9.x86_64
  - package containerd.io-1.6.8-3.1.el8.x86_64 obsoletes runc provided by runc-1.0.2-1.module_el8.5.0+911+f19012f9.x86_64
  - cannot install the best candidate for the job
  - package runc-1.0.0-56.rc5.dev.git2abd837.module_el8.3.0+569+1bada2e4.x86_64 is filtered out by modular filtering
  - package runc-1.0.0-66.rc10.module_el8.5.0+1004+c00a74f5.x86_64 is filtered out by modular filtering
  - package runc-1.0.0-72.rc92.module_el8.5.0+1006+8d0e68a2.x86_64 is filtered out by modular filtering
 Problem 2: problem with installed package buildah-1.21.4-1.module_el8.4.0+886+c9a8d9ad.x86_64

这是由于安装的docker版本与系统不匹配的原因,可以手动安装与之对应的版本,先找到相应系统所在的目录,如我的为CentOS 8,对应的目录为“https://download.docker.com/linux/centos/8/x86_64/stable/Packages/”,然后在里面找到需要安装的包,应下面的命令安装就可以了。

yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
yum install https://download.docker.com/linux/centos/8/x86_64/stable/Packages/containerd.io-1.6.8-3.1.el8.x86_64.rpm --allowerasing
yum install https://download.docker.com/linux/centos/8/x86_64/stable/Packages/docker-ce-20.10.9-3.el8.x86_64.rpm --allowerasing
yum install https://download.docker.com/linux/centos/8/x86_64/stable/Packages/docker-compose-plugin-2.6.0-3.el8.x86_64.rpm --allowerasing

最后启动docker服务,进行测试,添加用户:

systemctl start docker    ##start docker service
docker run hello-world    ###test docker
sudo gpasswd -a $USER docker  ###Add the user
newgrp docke              ###update the user group