glibc 版本异常

事情起因

发现有一台物理机只能连接同一个网段的公网,不能访问如百度,dns服务器也ping不通,我就想装个traceroute 看看是哪一步的原因,由于这台机器不能联网,于是就打算从隔壁机器下载deb包,到这个机器上安装。于是:

# 获取依赖,并下载
apt-rdepends traceroute | grep -v "^ " | xargs sudo apt-get download
# 打包
tar zcvf traceroute.tgz traceroute/
# 远程复制
scp <>
# 解压
tar zxvf traceroute.tgz 
# 安装
cd traceroute&&dpkg -i *.deb

一气呵成,问题来了,所有命令都用不了了,报错/lib/x86_64-linux-gnu/libc.so.6: version 'GLIBC_2.30' not found (required by /lib/x86_64-linux-gnu/libselinux.so.1)
后来发现,隔壁机器跟这个机器不是同一个版本的操作系统,而且这些安装包里包含:gcc-6-base_6.0.1-0ubuntu1_amd64.deb libc6_2.23-0ubuntu11.3_amd64.deb libgcc1_1%3a6.0.1-0ubuntu1_amd64.deb traceroute_1%3a2.0.21-1_amd64.deb。好好好。只能怨我眼瞎。犯了这么低级的错误。
更离谱的来了,因为我是刚来这家公司,发现这个k8s集群的部分woker节点情况如下:

   OS-IMAGE             KERNEL-VERSION       CONTAINER-RUNTIME
   Ubuntu 18.04.1 LTS   4.15.0-147-generic   docker://19.3.13
   Ubuntu 16.04.3 LTS   4.4.0-210-generic    docker://19.3.13
   Ubuntu 16.04.2 LTS   4.4.0-210-generic    docker://19.3.13
   Ubuntu 16.04.3 LTS   4.4.0-210-generic    docker://17.9.0
   Ubuntu 16.04.3 LTS   4.4.0-210-generic    docker://19.3.13
   Ubuntu 16.04.2 LTS   4.4.0-210-generic    docker://18.6.0
   Ubuntu 16.04.2 LTS   4.4.0-62-generic     docker://19.3.13
   Ubuntu 16.04.2 LTS   4.4.0-62-generic     docker://18.6.0
   Ubuntu 16.04.3 LTS   4.4.0-91-generic     docker://19.3.13
   Ubuntu 18.04.4 LTS   4.15.0-192-generic   docker://19.3.11
   Ubuntu 18.04.4 LTS   4.15.0-156-generic   docker://19.3.12
   Ubuntu 20.04.5 LTS   5.4.0-125-generic    containerd://1.6.12
   Ubuntu 20.10         5.8.0-63-generic     docker://20.10.6
   Ubuntu 20.04.5 LTS   5.4.0-125-generic    docker://20.10.18

好巧不巧,我操作的就是这个 ubuntu 20.10。这个版本从发布到中止维护仅有9个月的时间。都是前人挖的坑啊。
此情此景,我只能说 k8s 牛逼,不挑食。
言归正传。现在什么命令都用不了。

自救过程

现在已经打开的ssh是没有断开的,但是新的ssh已经连接不了了。根据网上的方法:
上传20.10用的glibc版本的 libc-2.32.so

LD_PRELOAD=/home/sysuser/libc-2.32.so  ls

然而,并没有什么用。于此同时,我还手贱的打算复制一个ssh连接,好家伙,windterm直接闪退。
那没有办法了,就只能去机房操作了。

首先了解一下这次操作到底都更新了哪些文件

这里使用docker的 layer 机制,就能很明显的看到那些文件发生了改变

# 运行一个ubuntu 20.10的容器
docker run -it --name ubunt-2010 -v /root:/data ubuntu:20.10 bash
# 安装相关的包
cd /data/traceroute
dpkg -i *.deb
# 发现问题与线上问题一致
root@ubuntu-2010:/data/traceroute# ls
ls: /lib/x86_64-linux-gnu/libc.so.6: version `GLIBC_2.28' not found (required by ls)
ls: /lib/x86_64-linux-gnu/libc.so.6: version `GLIBC_2.30' not found (required by /lib/x86_64-linux-gnu/libselinux.so.1)
root@ubuntu-2010:/data/traceroute# cp
cp: /lib/x86_64-linux-gnu/libc.so.6: version `GLIBC_2.25' not found (required by cp)
cp: /lib/x86_64-linux-gnu/libc.so.6: version `GLIBC_2.28' not found (required by cp)
cp: /lib/x86_64-linux-gnu/libc.so.6: version `GLIBC_2.30' not found (required by /lib/x86_64-linux-gnu/libselinux.so.1)

接下来另起一个窗口:

docker inspect ubuntu-2010 --format '{{.GraphDriver.Data.UpperDir}}'
# cd 到这个目录
cd <上一步输出结果>
# 查看哪些文件夹发生了改变
tree
# 这里发现很多文件都改变了,于是只看看哪些目录
tree -d
.
├── data
├── etc
│   └── ld.so.conf.d
├── usr
│   ├── lib
│   │   ├── gcc
│   │   │   └── x86_64-linux-gnu
│   │   │       ├── 6
│   │   │       └── 6.0.0 -> 6
│   │   └── x86_64-linux-gnu
│   │       ├── audit
│   │       └── gconv
│   ├── lib64
│   └── share
│       ├── doc
│       │   ├── gcc-6-base
│       │   └── libc6
│       └── lintian
│           └── overrides
└── var
    ├── cache
    │   └── debconf
    ├── lib
    │   └── dpkg
    │       ├── info
    │       ├── triggers
    │       └── updates
    └── log

在启动一个新的ubuntu 20.10的容器,对比发现 /usr/lib/gcc/x86_64-linux-gnu目录是新增的,新增一般影响不大。主要变动就是/usr/lib/x86_64-linux-gnu
解决思路就是把/usr/lib/x86_64-linux-gnu备份一下,重新复制一份过去。
于是,在本地新建虚拟机,装上ubuntu 20.10的系统,模拟故障,使用ubuntu 20.10 desktop版本的live cd模式启动。把硬盘挂载到/mnt目录,尝试恢复:

mv /mnt/usr/lib/x86_64-linux-gnu /mnt/usr/lib/x86_64-linux-gnubak
cp -rp /usr/lib/x86_64-linux-gnu /mnt/usr/lib
chroot /mnt

发现chroot不过去,怀疑是仍然有问题。于是,发现lib64下的ld-linux-x86-64.so.2文件也发生了变动。查看这个文件:

ll /lib64/ld-linux-x86-64.so.2 
lrwxrwxrwx 1 root root 32 Sep 15  2020 /lib64/ld-linux-x86-64.so.2 -> /lib/x86_64-linux-gnu/ld-2.32.so*

把这个文件也复制回去,因为原来是个软连接,这里直接简单粗暴的把源文件复制过去了

cp /lib/x86_64-linux-gnu/ld-2.32.so  /mnt/lib64/ld-linux-x86-64.so.2
chroot /mnt

根目录转化成功,实验命令可以正常执行。
于是去机房,关机、U盘启动,修复文件,搞定。

在运行过程中又发现,部分软件缺少文件,将/usr/lib/x86_64-linux-gnubak/中的文件,复制但不替换回/usr/lib/x86_64-linux-gnu/

rsync -av --ignore-existing /usr/lib/x86_64-linux-gnubak/ /usr/lib/x86_64-linux-gnu/

当然,也可以在恢复/usr/lib/x86_64-linux-gnu/时:

# 原来是mv,改为cp
cp -rp /mnt/usr/lib/x86_64-linux-gnu /mnt/usr/lib/x86_64-linux-gnubak
cp -rp /usr/lib/x86_64-linux-gnu/*  /mnt/usr/lib/x86_64-linux-gnu

这样,直接覆盖掉修改过的文件(没试过,盲猜的)

总结

  1. /usr/lib/x86_64-linux-gnu替换回原操作系统内容
  2. 替换回 /lib64/ld-linux-x86-64.so.2
  3. 将后期增加的/usr/lib/x86_64-linux-gnu下的文件,增量复制回去
  4. 执行命令前,一定要看一眼到底执行了什么。不要闭着眼操作
  5. 服务器能跑,不影响业务使用,就不要管他。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,547评论 6 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,399评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,428评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,599评论 1 274
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,612评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,577评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,941评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,603评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,852评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,605评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,693评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,375评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,955评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,936评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,172评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,970评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,414评论 2 342

推荐阅读更多精彩内容