Linux系统的ECS实例中,启动SSH服务时提示“error while loading shared libraries:libcrypto.so.1.1:”错误怎么办?

问题现象

SSH服务启动报错:启动SSH服务时,提示缺少libcrypto.so.1.1库文件。

error while loading shared libraries:libcrypto.so.1.1: cannot open shared object file: No such file or directory.

问题原因

共享库文件缺失或损坏:SSH服务及其认证模块在运行时,需要动态加载 libcrypto.so.1.1共享库。若该文件或其指向的真实文件被误删、移动或损坏,将导致服务因找不到依赖库而启动失败。

解决方案

重要

若系统盘存在历史快照,建议新建快照备份当前数据后,优先利用历史快照回滚系统盘,然后验证SSH服务是否正常启动。

若无历史快照,则需准备一台与故障实例操作系统版本相同且在同一可用区的正常实例,通过挂载系统盘的方式恢复缺失的库文件。

步骤一:卸载系统盘

确保异常实例状态为已停止,执行以下操作:

  1. 为防止误操作导致数据丢失,建议对系统盘手动创建单个快照,备份当前数据。

  2. 访问ECS控制台-实例。在页面左侧顶部,选择目标资源所在的资源组和地域。

  3. 单击异常实例ID进入实例详情页后,切换至块存储页签。

  4. 系统盘操作列选择更多 > 卸载

  5. 卸载云盘对话框中确认信息,单击确定卸载。当实例状态显示无系统盘时,表示卸载成功。

步骤二:作为数据盘挂载至正常实例

确保正常实例状态为运行中,执行以下操作:

  1. 挂载异常系统盘至正常实例。

    1. 单击正常实例ID进入实例详情页。

    2. 切换至块存储页签后,单击挂载云盘

    3. 挂载到实例页面的目标盘中,选择已卸载的异常系统盘,单击下一步

    4. 分区及创建文件系统并挂载界面,选择稍后设置,完成挂载。

  2. 单击远程连接,选择通过Workbench远程连接。根据页面提示登录,进入终端页面。

  3. 挂载文件系统。

    1. 确定故障盘分区名称。

      sudo lsblk -f
      vda                                                      
      ├─vda1                                                   
      ├─vda2 vfat         7938-FA03                            /boot/efi
      └─vda3 ext4   root  33b46ac5-7482-4aa5-8de0-60ab4c3a4c78 /
      vdb                                                      
      ├─vdb1                                                   
      ├─vdb2 vfat         7938-FA03                            
      └─vdb3 ext4   root  33b46ac5-7482-4aa5-8de0-60ab4c3a4c78                                  

      示例中,故障盘vdb的根分区为vdb3需挂载,各分区含义如下:

      • vdb1/vdb2:存放系统启动相关程序,可忽略。

      • vdb3:存放操作系统文件和数据,需挂载。

    2. 创建目录并挂载文件系统。

      sudo mkdir <挂载目录> && sudo mount /dev/<分区名称> <挂载目录>

      参数

      说明

      <分区名称>

      替换为上一步确定的故障盘的根分区名称。

      <挂载目录>

      自定义<挂载目录>,应为以/开头的空路径,可自定义但不可重复。

      重要

      若目录非空,原目录下文件将被隐藏导致无法读取,请谨慎评估。

      以将目标分区vdb1挂载至新创建的/test为例,需执行sudo mkdir /test && sudo mount /dev/vdb3 /test
    3. 检查文件系统挂载结果。

      运行sudo lsblk命令,若目标分区存在挂载目录(MOUNTPOINT),表示文件系统挂载成功。

步骤三:修复libcrypto.so.10文件

Alibaba Cloud Linux 3.2104为例,在正常实例中修复挂载路径下的共享库文件。

  1. 查看libcrypto.so.1.1文件路径。

    不同的操作系统下,库文件的名称会有所差异,请根据实际报错名称进行搜索。
    sudo find / -name libcrypto.so.1.1

    输出内容:

    /usr/lib64/libcrypto.so.1.1

    示例输出可确认库文件位于/usr/lib64/下。

  2. 检查软连接指向。

    ll /usr/lib64/libcrypto.so.1.1

    输出内容:

    lrwxrwxrwx. 1 root root 19 Nov 20  2024 /usr/lib64/libcrypto.so.1.1 -> libcrypto.so.1.1.1k

    示例表示当访问 /usr/lib64/libcrypto.so.1.1 时,实际上访问的是 /usr/lib64/libcrypto.so.1.1.1k文件。因此需要将正常libcrypto.so.1.1.1k移动至故障盘的相同路径下。

  3. 修复库文件。

    <挂载目录>需替换为实际的挂载路径

    sudo cp /usr/lib64/libcrypto.so.1.1.1k <挂载目录>/usr/lib64/
    示例需要执行sudo cp /usr/lib64/libcrypto.so.1.1.1k /test/usr/lib64/
  4. 修复权限并重建软连接。

    1. 设置文件权限和归属。

      <挂载目录>需替换为实际的挂载路径

      # 设置权限为 rwxr-xr-x
      sudo chmod 755 <挂载目录>/usr/lib64/libcrypto.so.1.1.1k
      
      # 设置所有者和所属组为 root
      sudo chown root:root <挂载目录>/usr/lib64/libcrypto.so.1.1.1k
      示例需要执行sudo chmod 755 /test/usr/lib64/libcrypto.so.1.1.1ksudo chown root:root /test/usr/lib64/libcrypto.so.1.1.1k
    2. 重建软链接。

      sudo ln -sf /usr/lib64/libcrypto.so.1.1.1k <挂载目录>/usr/lib64/libcrypto.so.1.1
      示例需执行 sudo ln -sf /usr/lib64/libcrypto.so.1.1.1k /test/usr/lib64/libcrypto.so.1.1

步骤四:作为系统盘挂载回异常ECS实例

  1. 卸载文件系统。

    <挂载目录>需替换为实际的挂载路径

    sudo umount <挂载目录>
    示例需执行sudo umount /test
  2. 卸载修复后的系统盘。

    1. 返回ECS控制台,进入正常实例详情页的块存储页签。

    2. 单击修复后的系统盘操作列的卸载

    3. 卸载云盘界面,单击确定卸载

  3. 将修复后的系统盘挂载回源实例。

    1. 进入异常实例详情页的块存储页签,单击挂载云盘

    2. 挂载到实例页面的目标盘中,选择修复后的系统盘,配置登录凭证后,单击下一步

    3. 分区及创建文件系统并挂载界面,选择稍后设置,完成挂载。

  4. 启动ECS实例。

步骤五:验证结果

登录异常ECS实例,再次启动SSH服务,查看是否正常。

确认服务恢复正常后,可按需释放用于挂载修复的正常实例,以停止计费。

后续建议

  • 谨慎操作核心系统文件:在删除、移动或修改核心系统文件前,请务必手动创建单个快照备份数据,并确认操作的必要性和潜在风险。切勿轻易删除不熟悉的系统文件。

  • 规范软件安装方式:优先使用系统自带的包管理器(如yum、apt)进行软件安装与卸载,以自动处理依赖关系,避免破坏共享库。