当前位置: 首页 > article >正文

Ubuntu虚拟机无法启动,无U盘拯救

一 、背景

  • 在Ubuntu手动源码安装glibc,直接手动将libc-2.34.so替换原libc-2.31.so,导致系统崩溃,基本指令无法使用
// 正常指向
op@ubuntu ~ 15:49 $ ls /lib/x86_64-linux-gnu/libc.so.6 -alh
lrwxrwxrwx 1 root root 12 May  1 02:20 /lib/x86_64-linux-gnu/libc.so.6 -> libc-2.31.so
op@ubuntu ~ 15:49 $

//准备手动更改libc.so.6的链接文件,备注:libc-2.34.so是源码生成的动态库
op@ubuntu /lib/x86_64-linux-gnu 15:50 $ sudo ln -s libc-2.34.so libc.so.6
ln: failed to create symbolic link 'libc.so.6': File exists
op@ubuntu /lib/x86_64-linux-gnu 15:50 $

//手动删除了libc.so.6,直接导致终端指令基本全部无法使用了
op@ubuntu /lib/x86_64-linux-gnu 15:50 $ sudo rm libc.so.6
sed: error while loading shared libraries: libc.so.6: cannot open shared object file: No such file or directory
grep: error while loading shared libraries: libc.so.6: cannot open shared object file: No such file or directory
op@ubuntu /lib/x86_64-linux-gnu 15:51 $
  • 悲剧的开始, 在非root用户手动删除了libc.so.6文件,导致无法使用sudo指令去重新建立软链接

二、通过LD_PRELOAD参数临时执行基本命令

op@ubuntu /sbin 16:15 $ LD_PRELOAD=/lib/x86_64-linux-gnu/libc-2.31.so ls
aa-remove-unknown      cracklib-unpacker     fdisk                  installkernel                ldconfig.real     ntfs
aa-status              crda                  filefrag               install-sgmlcatalog          locale-gen        ntfs
aa-teardown            create-cracklib-dict  findfs                 invoke-rc.d                  logrotate         ntfs
accessdb               cron                  fixparts               ip                           logsave           on_a
acpid                  ctrlaltdel            fsck                   ip6tables                    losetup           open
addgnupghome           cupsaccept            fsck.cramfs            ip6tables-apply              lpadmin           owne
addgroup               cups-browsed          fsck.ext2              ip6tables-legacy             lpc               pam-
add-shell              cupsctl               fsck.ext3
  • 误删除libc.so.6 恢复
    (1)" LD_PRELOAD的解决原理是,linux调用so库文件时,先搜索当前路径,然后是系统库目录,提供LD_PRELOAD系统变量可以改变这个顺序,改变后的搜索顺序为 LD_PRELOAD, 当前路径, 系统库目录"

  • 修改libc.so.6导致系统命令都不能用? 博客所述:
    (1)“在每条命令前加上 LD_PRELOAD=/lib64/libc-2.12.so 前缀,不能使用的命令可以重新使用。例如 LD_PRELOAD=/lib64/libc-2.12.so ls,ls命令可以重新使用”
    (2)" LD_PRELOAD可以影响程序的运行时的链接(Runtime linker), 它允许你定义在程序运行前优先加载的动态链接库,之前把libc.so.6这个软连接给干掉了,所以系统找不到这个库了,但是通过LD_PRELOAD设置一下glibc这个库的真实地址就可以解决这个问题了 libc.so.6被删除的修复方法:
    LD_PRELOAD=/lib64/libc-2.12.so ln -s /lib64/libc-2.12.so /lib64/libc.so.6"

    备注:但是上述指令需要使用sudo执行才有效,但是LD_PRELOAD=/lib64/libc-2.12.so sudo依旧无法进入root模式,因为LD_PRELOAD仅在当前op用户下才生效

  • 记glibc升级失败后的恢复
    (1)“export命令,用于指定临时使用的环境变量。使用export LD_PRELOAD=”/opt/glibc-2.14/lib/libc-2.14.so" 只要指定了正确的so文件(这里需要指向你编译的或者是备份的so文件),所有的命令就可以使用了。"

sln命令

  1. rm或者mv误删或改动过libc.so.6后,此时 ln -s 已经不能使用了,可以使用sln命令恢复软链接。

  2. sln 命令是一个专门用于创建静态链接(static link)的工具,通常用于系统引导过程中。它的主要目的是在系统的早期引导阶段创建符号链接,而不依赖于动态链接库(shared libraries)。sln 通常在 /sbin 目录下,只有在系统管理员需要在单用户模式或系统恢复模式下工作时才会使用。

  3. 功能区别:
    (1)功能:
    ln:用于创建硬链接和符号链接,适用于一般用途。
    sln:专门用于创建符号链接,主要用于系统引导和恢复过程中,不依赖于动态链接库。
    (2)使用场景:
    ln:日常文件管理和链接创建。
    sln:系统管理员在单用户模式或系统恢复模式下使用,特别是在系统引导过程中。
    (3)依赖性:
    ln:可能依赖于动态链接库。
    sln:不依赖于动态链接库,适用于系统的早期引导阶段。

三、 新建虚拟机

  • 可以新建一个虚拟机,在新虚拟机设置中,将旧虚拟机虚拟磁盘添加到“硬盘”中,再挂载新硬盘,重新建立软链接即可,建立完成后,可以通过chroot测试效果。
    在这里插入图片描述

四、通过CD/DVD(SATA)加载ISO映像修复

  • 如果不想新建虚机机,可以在原虚拟机中,通过CD/DVD(SATA)加载ISO映像修复
    在这里插入图片描述
  • 修改系统启动项顺序,CD-ROM Drive前移
    在这里插入图片描述
  • 系统启动后,选择“try ubuntu”修复
    在这里插入图片描述

五、正确升级glibc

  • aptitude 是一个高级的包管理工具,主要用于基于 Debian 的 Linux 发行版(如 Debian 和 Ubuntu)。它提供了一个命令行界面和一个基于文本的用户界面,用于安装、更新和删除软件包。aptitude 是 apt-get 和 apt 的高级替代品,提供了更多的功能和更好的依赖关系处理。

  • 首先,更新源,在/etc/apt/sources.list文件末尾增加,参考博文Ubuntu20.04更新GLIBC到2.35版本

deb http://mirrors.aliyun.com/ubuntu/ jammy main
  • 新增源后,执行sudo apt update,再通过sudo apt-cache policy libc6查看可用版本,可看到Candidate: 2.35-0ubuntu3,参考博文ubuntu20.04 GLIBC从2.35降级到2.31
op@ubuntu ~ 19:05 $ sudo apt update
Get:1 http://security.ubuntu.com/ubuntu focal-security InRelease [128 kB]
Get:2 http://mirrors.aliyun.com/ubuntu jammy InRelease [270 kB]
Ign:3 http://ppa.launchpad.net/ubuntu-audio-dev/alsa-daily/ubuntu focal InRelease
Err:4 http://ppa.launchpad.net/ubuntu-audio-dev/alsa-daily/ubuntu focal Release
  404  Not Found [IP: 185.125.190.80 80]
Get:5 http://mirrors.aliyun.com/ubuntu jammy/main amd64 Packages [1,395 kB]
Hit:6 http://us.archive.ubuntu.com/ubuntu focal InRelease
Get:7 http://security.ubuntu.com/ubuntu focal-security/main amd64 DEP-11 Metadata [65.3 kB]
Get:8 http://security.ubuntu.com/ubuntu focal-security/restricted amd64 DEP-11 Metadata [212 B]
Get:9 http://security.ubuntu.com/ubuntu focal-security/universe amd64 DEP-11 Metadata [160 kB]
Get:10 http://mirrors.aliyun.com/ubuntu jammy/main i386 Packages [1,040 kB]
Get:11 http://security.ubuntu.com/ubuntu focal-security/multiverse amd64 DEP-11 Metadata [940 B]
Get:12 http://mirrors.aliyun.com/ubuntu jammy/main Translation-en [510 kB]
Get:13 http://mirrors.aliyun.com/ubuntu jammy/main amd64 DEP-11 Metadata [423 kB]
Get:14 http://mirrors.aliyun.com/ubuntu jammy/main DEP-11 48x48 Icons [100.0 kB]
Get:15 http://mirrors.aliyun.com/ubuntu jammy/main DEP-11 64x64 Icons [148 kB]
Get:16 http://mirrors.aliyun.com/ubuntu jammy/main DEP-11 64x64@2 Icons [15.8 kB]
Get:17 http://mirrors.aliyun.com/ubuntu jammy/main amd64 c-n-f Metadata [30.3 kB]
Reading package lists... Done
E: The repository 'http://ppa.launchpad.net/ubuntu-audio-dev/alsa-daily/ubuntu focal Release' does not have a Release file.
N: Updating from such a repository can't be done securely, and is therefore disabled by default.
N: See apt-secure(8) manpage for repository creation and user configuration details.
op@ubuntu ~ 19:05 $
op@ubuntu ~ 19:05 $
op@ubuntu ~ 19:05 $
op@ubuntu ~ 19:05 $
op@ubuntu ~ 19:05 $ sudo apt-cache policy libc6
libc6:
  Installed: 2.31-0ubuntu9.16
  Candidate: 2.35-0ubuntu3
  Version table:
     2.35-0ubuntu3 500
        500 http://mirrors.aliyun.com/ubuntu jammy/main amd64 Packages
 *** 2.31-0ubuntu9.16 500
        500 http://security.ubuntu.com/ubuntu focal-security/main amd64 Packages
        100 /var/lib/dpkg/status
     2.31-0ubuntu9 500
        500 http://us.archive.ubuntu.com/ubuntu focal/main amd64 Packages
op@ubuntu ~ 19:06 $
  • 开始升级aptitude install libc6=2.35-0ubuntu3
op@ubuntu ~ 19:06 $ sudo aptitude install libc6=2.35-0ubuntu3
The following NEW packages will be installed:
  libcom-err2:i386{
   a} libgssapi-krb5-2:i386{
   a} libk5crypto3:i386{
   a} libkeyutils1:i386{
   a} libkrb5-3:i386{
   a} libkrb5support0:i38
  libnss-nisplus:i386{
   a} libssl3{
   a} libssl3:i386{
   a} libtirpc-common{
   a} libtirpc3{
   a} libtirpc3:i386{
   a}
The following packages will be REMOVED:
  libxcb-xv0{
   u} xserver-xephyr{
   u}
The following packages will be upgraded:
  fakeroot libc-bin libc6 libc6:i386 libcom-err2 libfakeroot libgssapi-krb5-2 libk5crypto3 libkeyutils1 libkrb5-3 libkrb5suppo
12 packages upgraded, 17 newly installed, 2 to remove and 1398 not upgraded.
Need to get 16.9 MB of archives. After unpacking 11.7 MB will be used.
The following packages have unmet dependencies:
 libc6-dbg : Depends: libc6 (= 2.31-0ubuntu9.16) but 2.35-0ubuntu3 is to be installed
 libc6-dev : Depends: libc6 (= 2.31-0ubuntu9.16) but 2.35-0ubuntu3 is to be installed
 libc6-x32 : Depends: libc6 (= 2.31-0ubuntu9.16) but 2.35-0ubuntu3 is to be installed
 libc6-i386 : Depends: libc6 (= 2.31-0ubuntu9.16

http://www.kler.cn/news/366895.html

相关文章:

  • 阿里面试竟被“DPO微调”吊打...
  • Flume的安装及使用
  • 硬件安全逻辑混淆技术讲稿及PPT
  • 使用python代码绘制好看的统计图
  • # 渗透测试#安全见闻9 二进制安全
  • STM32--基于STM32F103C8T6的OV7670摄像头显示
  • GoogleChrome和Edge浏览器闪屏问题
  • 图片懒加载
  • MATLAB工具箱使用案例详解
  • Vuejs设计与实现 — 编译层面的优化
  • Walrus + Sui:如何充分发挥Web3的潜力
  • vue中$nextTick的作用是什么,什么时候使用
  • docker-minio启动参数
  • vue3嵌套路由二级跳转三级路由时,如何阻止走二级的生命周期
  • Vulnhub打靶-DC-2
  • python批量漏洞检测工具编写
  • KUKA机器人选定程序时提示“选择非法”的处理方法
  • JSON语法学习分析
  • 【每日一题】LeetCode - 盛最多水的容器
  • PHP模拟多继承的方式:traits
  • 安全见闻(6)
  • GitHub上传更新到他人仓库
  • CentOS7编译安装Python3.12记录
  • YOLO11 图像缩放 | 图像填充 | 自适应不同尺寸的图片
  • Llama3微调后合并:推动自然语言处理的新进展
  • K8s中TSL证书如何续期