[排错] 解决 Linux 开机时报错 “kernel panic – no syncing: Attempted to kill init ……”

报错代码

/init: error while loading shared libraries: libsystemd-shared-239.so: cannot open shared object file: No such file or directory
kernel panic - no syncing: Attempted to kill init! exitcode=0x00007f00

解决方法

步骤一:进入拯救模式

步骤二:确认第三方软件库

2.1 搜集第三方软件库信息

# ldconfig -p > /tmp/ldconfig.out

2.2 确认有没有第三方软件库

# for l in $(awk '{ print $1 }' /tmp/ldconfig.out); do matches=$(awk "\$1 == \"$l\" { print }" /tmp/ldconfig.out); if [ $(echo "$matches" | wc -l) -ge 2 ]; then echo "$matches"; echo; fi; done

(补充:如果没有第三方软件库的话这里不会有任何输出)

步骤三:检查 /etc/ld.so.conf 文件或者 /etc/ld.so.conf.d/ 目录里的文件去除第三方库

(步骤略)

步骤四:刷新库缓存

# ldconfig

步骤五:为启动失败的系统创建创建 initramfs 文件

# dracut -f /boot/initramfs-(uname -r).img $(uname -r)

(补充:这里以将正在运行的内核版本生成一个新的 initramfs 为例)

(注意:此时原来启动系统时使用的那个 initramfs 文件会被覆盖)

步骤六:重启系统

# reboot

参考文献

https://access.redhat.com/solutions/7096246

[步骤] Linux 第三方库的添加

步骤一:添加第三方库

# vi /etc/ld.so.conf

或者:

# vi /etc/ld.so.conf.d/*.conf

添加以下内容:

......
/root/lib

(补充:这里以添加位于目录 /root/lib 的库为例)

(注意:这里的 /etc/ld.so.conf.d/*.conf 是指 /etc/ld.so.conf.d/ 目录下任意以 .conf 结尾的文件,例如 /etc/ld.so.conf.d/one.conf)

步骤二:创建新的 initramfs 文件为例

2.1 备份已有的 initramfs 文件

# cp /boot/initramfs-4.18.0-553.89.1.el8_10.x86_64.img  /boot/initramfs-4.18.0-553.89.1.el8_10.x86_64.img.backup


补充:
1) 这里以将:/boot/initramfs-4.18.0-553.89.1.el8_10.x86_64.img 备份为:/boot/initramfs-4.18.0-553.89.1.el8_10.x86_64.img.backup 为例
2) initramfs 是压缩的 cpis 文件,是临时的根文件系统包含一些脚本、程序和配置文件,在 Linux 启动过程中被加载在内存里,负责 Linux 操作系统在挂载根目录前加载内核模块、检查硬件、加载驱动以及挂载真正的根文件系统等)

2.2 创建新的 initramfs 文件

# dracut -f /boot/initramfs-(uname -r).img $(uname -r)

(补充:这里以将正在运行的内核版本生成一个新的 initramfs 为例)

(注意:此时原来启动系统时使用的那个 initramfs 文件会被覆盖)

步骤三:重启系统

# reboot

步骤四:确认第三方库已经添加

4.1 确认在现在的缓存中包含了第三方库

# ldconfig -p -M -X | grep out


补充:
1) 这里的 -N 和 -X 必须一起使用,作用是不更新相关链接和不重建相关缓存
2) 这里的 -p 作用是打印现在在缓存中的相关目录和相关候选库
3) 这条命令会显示目前在缓存中的第三方库

4.2 确认加载的库中没有重复的

# for l in $(ldconfig -p -N -X | awk '{ print $1 }') ; do matches=$(ldconfig -p -N -X | awk "\$1 == \"$l\" { print }"); if [ $(echo "$matches" | wc -l) -ge 2 ]; then echo "$matches"; echo; fi; done |wc -l

(补充:如果加载的库中没有重复的则这里不会有任何输出结果)

[内容] 两台 Linux MAC 地址冲突后的出现的现象 (两台 Linux 系统在同 1 个二层交换机下使用相同的 MAC 地址)

现象一:ping 命令会卡住

ping MAC 地址冲突的 Linux IP 地址时,ping 的延迟不高,但是 ping 命令会随机卡住

现象二:SSH 远程登录后输入命令会卡住

通过 SSH 登录 MAC 地址冲突的 Linux IP 地址时,可以正常登录,但是输入命令后会随机卡住

现象三:SNMP 客户端失效

此时 MAC 地址冲突的 Linux SNMP 客户端无法被其他机器发现。若此时通过 SNMPv3 访问此 Linux 的 SNMP 客户端,验证可以通过,但是无法拉取信息

[步骤] Linux 救援模式软件的安装 (把系统目录当作根目录前)

步骤一:挂载官方镜像

(步骤略)

步骤二:登录拯救模式

2.1 选择通过光盘启动

(步骤略)

2.2 进入拯救模式

(步骤略)

2.3 登录拯救模式

rescue login:root

步骤三:在救援模式确定系统的根 “/” 目录分区

(步骤略)


补充:
1) 物理分区可以使用 lsblk 命令、fdisk -l 或 cat /proc/partitions 命令辅助确定
2) 逻辑分区还可以可以使用 pvs 命令、lvs 命令或 lvdisplay 命令辅助确定

步骤四:在救援模式将系统的根 “/” 分区挂载到救援模式的 /mnt 目录

# mount <root spartition> /mnt

步骤五:在救援模式将系统的光驱挂载到救援模式的 /mnt/mnt 目录

# mount /dev/sr0 /mnt/mnt

步骤六:重新安装 mount 软件

# rpm -ivh --root=/mnt /mnt/mnt/Module-Basesystem/x86_64/util-linux-2.39.3-150600.2.1.x86_64.rpm

(补充:这里以安装 util-linux-2.39.3-150600.2.1.x86_64.rpm 软件包为例)

步骤七:重启系统

7.1 从当前系统的根 “/” 目录切换回救援模式的根 “/” 目录

bash-4.3# exit

7.2 重启系统

tty1:rescue:~ # reboot

[排错] 解决 Linux 无法进入系统且 Linux 进入救援模式以后挂载系统目录时乱码

报错代码

Linux 无法进入系统,进入拯救模式后乱码

原因分析

mount 命令损坏,导致系统在启动的过程中无法挂载所有需要挂载的分区,例如 /boot 目录、根 “/” 分区等

解决方法

步骤一:挂载官方镜像

(步骤略)

步骤二:登录拯救模式

2.1 选择通过光盘启动

(步骤略)

2.2 进入拯救模式

(步骤略)

2.3 登录拯救模式

rescue login:root

步骤三:在救援模式确定系统的根 “/” 目录分区

(步骤略)


补充:
1) 物理分区可以使用 lsblk 命令、fdisk -l 或 cat /proc/partitions 命令辅助确定
2) 逻辑分区还可以可以使用 pvs 命令、lvs 命令或 lvdisplay 命令辅助确定

步骤四:在救援模式将系统的根 “/” 分区挂载到救援模式的 /mnt 目录

# mount <root spartition> /mnt

步骤五:在救援模式将系统的光驱挂载到救援模式的 /mnt/mnt 目录

# mount /dev/sr0 /mnt/mnt

步骤六:重新安装 mount 软件

# rpm -ivh --root=/mnt /mnt/mnt/Module-Basesystem/x86_64/util-linux-2.39.3-150600.2.1.x86_64.rpm

(补充:这里以安装 util-linux-2.39.3-150600.2.1.x86_64.rpm 软件包为例)

步骤七:重启系统

7.1 从当前系统的根 “/” 目录切换回救援模式的根 “/” 目录

bash-4.3# exit

7.2 重启系统

tty1:rescue:~ # reboot