管理 Linux 共享库

CompTIACompTIABeginner
立即练习

💡 本教程由 AI 辅助翻译自英文原版。如需查看原文,您可以 切换至英文原版

引言

在本实验中,你将学习管理 Linux 中共享库的基础知识。共享库是允许多个程序使用相同代码的关键组件,可以节省磁盘空间和内存。你将首先使用 ldd 命令检查一个可执行程序,例如 ping,并识别它正常运行所需的特定共享库依赖。

在此基础上,你将学习如何使用 find 命令在文件系统中定位特定库的物理文件。最后,你将探索如何管理共享库缓存,这是提高性能的关键系统组件。你将使用 ldconfig 工具来查看当前缓存并重建它,以确保系统能够高效地查找和加载所需的库。

使用 ldd 识别共享库依赖

在此步骤中,你将学习如何识别可执行程序所依赖的共享库。在 Linux 中,大多数程序并不包含运行所需的所有代码。相反,它们依赖于共享库,共享库是可供多个程序同时使用的代码集合。这种方法可以节省磁盘空间和内存。ldd (List Dynamic Dependencies) 命令是一个实用工具,用于打印每个程序或库所需的共享库。

让我们使用 ldd 来检查 ping 命令,这是一个常用的网络工具。这将向我们展示 ping 需要哪些共享库才能正常运行。在你的终端中运行以下命令:

ldd /bin/ping

你将看到类似以下的输出。确切的内存地址(括号中的数字)和路径在你的系统上可能略有不同,但库名称应该是一致的。

        linux-vdso.so.1 (0x00007ffcfa17e000)
        libcap.so.2 => /lib/x86_64-linux-gnu/libcap.so.2 (0x00007f29235c4000)
        libidn2.so.0 => /lib/x86_64-linux-gnu/libidn2.so.0 (0x00007f29235a3000)
        libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f292337a000)
        libunistring.so.2 => /lib/x86_64-linux-gnu/libunistring.so.2 (0x00007f29231d0000)
        /lib64/ld-linux-x86-64.so.2 (0x00007f29235f5000)

此输出列出了 /bin/ping 所需的共享库。每一行代表一个依赖项。

  • libc.so.6 是标准的 C 库,它提供了基本功能,如打开文件、向屏幕写入以及管理内存。=> 符号表示系统动态链接器找到库文件的路径。
  • libcap.so.2 提供了能力管理功能,用于处理 Linux 能力。
  • libidn2.so.0 提供了国际化域名支持。
  • libunistring.so.2 提供了 Unicode 字符串操作功能。
  • linux-vdso.so.1 是由内核提供的虚拟库,用于加速某些系统调用。
  • /lib64/ld-linux-x86-64.so.2 是程序解释器本身,负责加载其他共享库。

现在你已经知道如何查看程序的依赖项了,在下一步中,我们将学习如何在文件系统中定位其中一个库的物理文件。

使用 find 定位特定共享库

在上一步中,你使用 ldd 命令查看了 /bin/ping 依赖于 libc.so.6 共享库。现在,你将学习如何在你系统的文件系统中找到该库文件的确切位置。对于这项任务,我们将使用 find 命令,这是一个用于搜索文件和目录的强大实用工具。

find 命令在目录层次结构中搜索文件。其基本语法是 find [起始目录] -name [文件名]。我们将从 /usr 目录开始搜索,这是许多系统库的常见位置。

要定位 libc.so.6 文件,请在终端中执行以下命令。我们使用 sudo 为命令授予管理员权限,这可以防止在搜索系统保护的目录时出现“Permission denied”错误。

sudo find /usr -name libc.so.6

由于我们只在 /usr 目录中搜索,该命令应该会相对快速地完成。你将看到类似以下的输出:

/usr/lib/x86_64-linux-gnu/libc.so.6

这显示了 C 标准库文件在 /usr 目录中的位置。请注意,这与 ldd 显示的路径(/lib/x86_64-linux-gnu/libc.so.6)不同。这是因为库可能存在于不同的位置,并且系统通常使用符号链接来管理实际加载的版本。

如果你想在整个文件系统中搜索库的所有副本,可以使用根目录 / 作为起始点:

sudo find / -name libc.so.6

虽然 find 是定位任何文件的通用工具,但 Linux 有一个专门且快得多的机制来管理和定位共享库,称为库缓存。在下一步中,你将学习如何查看此缓存。

使用 ldconfig -p 查看共享库缓存

在上一步中,你使用了 find 命令搜索整个文件系统来查找库,这可能会比较慢。为了加快查找共享库的过程,Linux 系统维护着一个缓存文件,通常位于 /etc/ld.so.cache。这个缓存包含一个已编译的列表,列出了标准系统目录中可用的共享库,使程序能够更快地加载其依赖项。

ldconfig 命令是管理此缓存的主要工具。要查看当前库缓存的内容,你可以使用 -p (print) 选项。

执行以下命令以显示缓存中所有已知的库:

ldconfig -p

输出内容会非常长,因为典型的系统有很多共享库。该命令会列出找到的库数量,然后打印每个库。以下是输出内容的一个小样本:

1234 libs found in cache `/etc/ld.so.cache'
	libzstd.so.1 (libc6,x86-64) => /lib/x86_64-linux-gnu/libzstd.so.1
	libz.so.1 (libc6,x86-64) => /lib/x86_64-linux-gnu/libz.so.1
	libz.so (libc6,x86-64) => /lib/x86_64-linux-gnu/libz.so
	libyield.so.2 (libc6,x86-64) => /lib/x86_64-linux-gnu/libyield.so.2
...
	libc.so.6 (libc6,x86-64) => /lib/x86_64-linux-gnu/libc.so.6
...

每一行显示库名称、其架构和 ABI(例如 libc6,x86-64),以及库文件的完整路径。

为了避免滚动浏览整个列表,你可以将输出通过管道传递给 grep 来搜索特定库。让我们查找我们一直在使用的 libc.so.6 的条目:

ldconfig -p | grep libc.so.6

这将过滤列表,只显示与 libc.so.6 相关的条目:

        libc.so.6 (libc6,x86-64, OS ABI: Linux 3.2.0) => /lib/x86_64-linux-gnu/libc.so.6

如你所见,这是一种比搜索整个文件系统更快、更直接的查找缓存库位置的方法。输出不仅显示了库名称和路径,还显示了架构信息(libc6,x86-64)和操作系统 ABI 兼容性(OS ABI: Linux 3.2.0)。但是,此缓存不会实时自动更新。如果你安装了一个新库,必须更新缓存系统才能找到它。在下一步中,你将学习如何做到这一点。

使用 ldconfig -v 重建共享库缓存

在这一步中,你将学习如何手动更新或重建共享库缓存。这是系统管理员的一项常见任务,尤其是在从源代码安装新库之后,或者当软件包安装没有自动触发缓存更新时。一个最新的缓存对于系统动态链接器查找新添加的库至关重要。

我们将再次使用 ldconfig 命令,但这次是为了执行更新。当不带 -p 选项运行时,ldconfig 会扫描受信任的目录(在 /etc/ld.so.conf/etc/ld.so.conf.d/*.conf 中定义)查找共享库,并重建缓存文件 /etc/ld.so.cache

为了在实践中看到这个过程,我们将使用 -v (verbose) 选项,它会使 ldconfig 打印出正在扫描的目录名称以及它创建的符号链接。由于此命令会修改系统文件,因此你需要使用 sudo 来运行它。

在终端中执行以下命令:

sudo ldconfig -v

该命令会处理你系统上的所有库目录,并产生大量输出。输出将类似于以下片段:

/lib/x86_64-linux-gnu:
	libip6tc.so.2 -> libip6tc.so.2.0.0
	libip4tc.so.2 -> libip4tc.so.2.0.0
	libxtables.so.12 -> libxtables.so.12.1.0
	...
/usr/lib/x86_64-linux-gnu:
	libfakeroot-0.so -> libfakeroot-0.so
	...
/lib:
...
(etc.)

输出首先显示一个正在扫描的目录路径(例如 /lib/x86_64-linux-gnu:),然后是该目录中正在检查或创建的符号链接。这种详细的输出是确认缓存已成功重建并包含所有预期库路径的好方法。

你现在已经完成了在 Linux 中管理共享库的基本任务:识别依赖项、定位库文件以及管理动态链接器的缓存。

总结

在这个实验中,你学习了在 Linux 环境中管理共享库的基本技能。你首先使用 ldd 命令来识别可执行程序的动态依赖项,从而揭示了它运行所需的共享库。然后,你练习使用 find 命令在文件系统中定位特定库的物理文件,这是一项用于故障排除和验证的有用技能。

此外,你还了解了共享库缓存的作用,系统使用它来加快查找库的过程。你学会了如何使用 ldconfig -p 命令查看此缓存的内容。最后,你使用 ldconfig -v 重建了缓存,这是安装新库后确保它们被系统识别并可用所必需的关键步骤。