修复 CentOS ‘org.freedesktop.login1’ หมดเวลา

人修系统的时间。

根据情况描述是 “ติดอยู่ที่ ‘เริ่มต้นสวิตช์รูท’”,初步判定是 initramfs 坏掉了。经过询问果不其然,某个特别爱没事儿就更新的家伙在更新的时候被数据中心的智障远程手按了电源¯(ツ)/¯

既然启动不能那就进 กู้ภัย 呗。虽然 CentOS 这系统不怎么样,但是至少也算在原版 ISO 就提供了 Rescue 的选项,还能自动寻找根分区挂载。本来以为小事一桩,准备 chroot 的时候突然冒出来一句 “chroot: ไม่สามารถเรียกใช้คำสั่ง `/bin/sh’: ข้อผิดพลาดรูปแบบ Exec” 就瞬间心里一顿$#%#$^$#@#%#

一般来讲,报错 “ข้อผิดพลาดของรูปแบบ Exec” 代表二进制格式错误,例如在 32 位系统中执行 64 位二进制文件。但这不可能,首先同样是 x86_64 架构,安装的系统和 ISO 的系统也是同样的版本,磁盘也没有报错,为什么会出现这种问题?

更新时断电导致文件被写坏的可能性并不是没有,但奇怪的是执行/bin/bash也报一样的错误。能坏到这种程度怕不是 glibc 挂了…?但总之第一步?要能先进系统瞧瞧究竟,于是心一横,直接用 ซีดีสด 的/usr覆盖磁盘上的对应目录。

 1
 ~> cp -r /usr /m nt /sysimage/

然后再 chroot,果然成功进入系统, yum命令也可以用了。既然是更新过程中断电,那应该先尝试修复未完成的更新。

 1
2
3
4
 ~> yum-complete-transaction
ปลั๊กอินที่โหลด: กระจกที่เร็วที่สุด, langpacks
กำลังโหลดความเร็ว มิเรอ ร์ จาก ไฟล์โฮสต์ที่แคชไว้
ไม่มี ธุรกรรมที่ยังไม่เสร็จเหลืออยู่

 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
 ~> ยำอัพเดท
-> เสร็จสิ้นการพึ่งพาอาศัยกัน
ข้อผิดพลาด: พบปัญหา เวอร์ชัน Multilib นี้มักจะหมายความ ว่า ราก
สาเหตุ เป็น อย่าง อื่น และ การตรวจสอบ เวอร์ชัน multilib เป็น เพียง
แสดง ว่า มี ปัญหา เช่น.:

1. คุณมีการอัพเกรด สำหรับ libselinux ซึ่ง ขาด หายไป บ้าง
การพึ่งพา ที่ แพ็คเกจอื่นต้องการ ยำ กำลัง พยายาม
แก้ปัญหานี้ โดย ติดตั้ง glibc ของ the . เวอร์ชัน เก่า กว่า
สถาปัตยกรรมที่แตกต่างกัน หากคุณแยกสถาปัตยกรรม ที่ ไม่ดีออก
yum จะ บอก คุณ ว่า สาเหตุที่แท้จริง คืออะไร (แพ็คเกจใด
ต้องการอะไร) คุณสามารถ ลองทำ ซ้ำ การ อัปเกรด ด้วย
--exclude glibc.otherarch ... สิ่งนี้จะทำให้คุณมีข้อผิดพลาด
ข้อความแสดง สาเหตุ ของ ปัญหา

2. คุณมีสถาปัตยกรรม ของ glibc ติดตั้งอยู่หลายตัว แต่
yum สามารถเห็นการอัพเกรด สำหรับ หนึ่ง ใน สถาปัตยกรรมเหล่านั้นเท่านั้น
หากคุณไม่ต้องการ/ต้องการสถาปัตยกรรมทั้งสองอีกต่อไป แล้ว คุณ
สามารถลบ อันที่ มี การ อัปเดตที่ขาดหายไป และ ทุกอย่าง
จะทำงาน.

3. คุณได้ติดตั้ง glibc เวอร์ชัน ที่ ซ้ำกันไว้แล้ว
คุณสามารถใช้ "yum check" เพื่อ รับ yum แสดงข้อผิดพลาดเหล่านี้

...คุณยังสามารถใช้ --setopt=protected_multilib=false เพื่อลบ
การตรวจสอบนี้ แต่นี่แทบไม่เคย เป็น สิ่ง ที่ ถูก ต้อง เลย
ทำ อย่าง อื่น มัก จะ ผิดพลาด (มักทำให้
ปัญหาอีกมากมาย)

เวอร์ชัน multilib ที่ได้รับการป้องกัน: glibc..... != glibc.....
kbd... x86_64 != kbd ... x86_64

…还真是。

进一步了解到这个系统并没有安装 32 位包,那么这个 32 位的 glibc ?哪儿来的呢? yum check无果,更何况还有一个奇怪的 kbd 包甚至跟 32 位毫无关系。看来坏的不轻,但是既然确定系统中没有 32 位包,那么可以继续莽到底了。

 1
2
3
4
5
6
7
 # 有未更ใหม่的包
~> อัปเดตยำ --setopt=protected_multilib= false
# 为重装系统做准备
~> mkdir /root/tmp
~> cd /root/tmp
# 有包
~> yum ติดตั้งใหม่ * --setopt=protected_multilib= false

一通操作猛如虎,第一次重装所有包时还会报错 ldconfig 一些库是空文件,第二次完整重装就看不到报错了。看来可行,果断重启,一堆 OK 之后看到了 เข้าสู่ระบบ 。

 1
2
3
4
5
6
7
8
 localhost เข้าสู่ระบบ : root

เข้าสู่ระบบ ไม่ถูกต้อง

เข้าสู่ระบบ ไม่ถูกต้อง


เข้าสู่ระบบ ไม่ถูกต้อง

嗯嗯嗯???ฉัน还没输入密码呢??

还没输入密码就报错,至少不是 PAM 的问题。在那之前呢? 应该: systemd-logind 了。幸运的是网络可以正常启动,SSH 能够正常登入系统。如果网络或者 SSH 也不行,那就只好再次 เข้าสู่ระบบ进 กู้ภัย 了。

系统里很多本来应该有的底层服务没有启动,例如 systemd-logind。想查看这货的状态,结果报错:

 1
 ไม่ สามารถ เปิดใช้งาน บริการ 'org.freedesktop.systemd1' : หมดเวลา

咦? systemd 自己都没正常启动,看看日志:

 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
 ...
localhost dbus-daemon[1166]: พบ ข้อผิดพลาด ' ข้อผิดพลาด ใน ไฟล์ /etc/dbus-1/system. d /org.freedesktop.hostname1. conf , บรรทัดที่ 1, คอลัมน์ 0: ไม่ พบองค์ประกอบ
' ขณะ แยกวิเคราะห์ '/etc/dbus-1/system. d /org.freedesktop.hostname1. คอนเฟิร์ม '
localhost dbus-daemon[1166]: พบ ข้อผิดพลาด ' ข้อผิดพลาด ใน ไฟล์ /etc/dbus-1/system. d /org.freedesktop.import1. conf , บรรทัดที่ 1, คอลัมน์ 0: ไม่ พบองค์ประกอบ
' ขณะ แยกวิเคราะห์ '/etc/dbus-1/system. d /org.freedesktop.import1. คอนเฟิร์ม '
localhost dbus-daemon[1166]: พบ ข้อผิดพลาด ' ข้อผิดพลาด ใน ไฟล์ /etc/dbus-1/system. d /org.freedesktop.locale1. conf , บรรทัดที่ 1, คอลัมน์ 0: ไม่ พบองค์ประกอบ
' ขณะ แยกวิเคราะห์ '/etc/dbus-1/system. d /org.freedesktop.locale1. คอนเฟิร์ม '
localhost dbus-daemon[1166]: พบ ข้อผิดพลาด ' ข้อผิดพลาด ใน ไฟล์ /etc/dbus-1/system. d /org.freedesktop.login1. conf , บรรทัดที่ 1, คอลัมน์ 0: ไม่ พบองค์ประกอบ
' ขณะ แยกวิเคราะห์ '/etc/dbus-1/system. d /org.freedesktop.login1. คอนเฟิร์ม '
localhost dbus-daemon[1166]: พบ ข้อผิดพลาด ' ข้อผิดพลาด ใน ไฟล์ /etc/dbus-1/system. d /org.freedesktop.machine1. conf , บรรทัดที่ 1, คอลัมน์ 0: ไม่ พบองค์ประกอบ
' ขณะ แยกวิเคราะห์ '/etc/dbus-1/system. d /org.freedesktop.machine1. คอนเฟิร์ม '
localhost dbus-daemon[1166]: พบ ข้อผิดพลาด ' ข้อผิดพลาด ใน ไฟล์ /etc/dbus-1/system. d /org.freedesktop.systemd1. conf , บรรทัดที่ 1, คอลัมน์ 0: ไม่ พบองค์ประกอบ
' ขณะ แยกวิเคราะห์ '/etc/dbus-1/system. d /org.freedesktop.systemd1. คอนเฟิร์ม '
localhost dbus-daemon[1166]: พบ ข้อผิดพลาด ' ข้อผิดพลาด ใน ไฟล์ /etc/dbus-1/system. d /org.freedesktop.timedate1. conf , บรรทัดที่ 1, คอลัมน์ 0: ไม่ พบองค์ประกอบ
' ขณะ แยกวิเคราะห์ '/etc/dbus-1/system. d /org.freedesktop.timedate1. คอนเฟิร์ม '
...

病的不轻。这些文件内容消失了,重装包并不会覆盖它们。只好手动来覆盖了。

 1
2
3
4
5
6
7
 # 安装必要工具
~> yum ติดตั้ง yum-utils rpm2cpio
# 获取并解包 รอบต่อนาที
~> cd /root/tmp
~> yumdownloader dbus systemd
~> rpm2cpio dbus- 1.10 . 24 - 15.el 7.x86_64.rpm | cpio -idmv
~> rpm2cpio systemd- 219 - 78.el 7_9. 5.x 86_64.rpm | cpio -idmv

于是得到了这些包的内容。手动将etc/dbus-1目录下的所有文件覆盖到文件系统,然后执行kill 1

 1
2
3
4
5
6
7
 localhost systemd[1]: ได้รับ SIGTERM จาก PID 4332 (ทุบตี)
localhost systemd[1]: กำลังดำเนินการใหม่
localhost systemd [1]: systemd 219 ทำงาน ใน โหมด ระบบ (+PAM +ตรวจสอบ +SELINUX +IMA -APPARMOR +SMACK +SYSVINIT +UTMP +LIBCRYPTSETUP +GCRYPT +GNUTLS +ACL +XZ +LZ
localhost systemd[1]: สถาปัตยกรรมที่ตรวจพบ x86-64
localhost dbus [1166]: [ระบบ] เปิดใช้งาน บริการ 'org.freedesktop.systemd1' สำเร็จแล้ว
localhost systemd[1]: เริ่มบริการเข้าสู่ระบบ
localhost systemd-logind [4723]: ที่นั่งใหม่ 0.

一遍,各种服务都在正常启动了!

(๑•̀ㅂ•́)و✧

:别没事儿更ใหม่生产用系统。

ตอนที่ 2:西方国家的数据中心远程手没有一个靠谱的。