/usr/local 用于安装机器管理员在本地编译的程序。简单的程序只需进入 /usr/local/bin 并通过将 /usr/local/bin 放入PATH
环境变量从那里运行。这允许管理员向用户提供对操作系统中不包含的其他命令的访问权限。没有什么能阻止 root 将新东西安装到 /usr/bin 中,但惯例是 /usr/bin 由 OS 发行商的打包工具管理,并且将本地东西分开可以让事情变得不那么混乱。
有时,本地程序需要操作系统发行商未提供的库,并且该库进入 /usr/local/lib 并且一切正常。
当存在版本冲突时——操作系统提供了版本 X 的 libz.so,但本地程序需要 libz.so 版本 X+1 或需要使用特殊选项编译 libz.so——事情开始变得复杂。在 /usr/local/lib 中安装较新的库一开始可能没问题。
每个程序都会根据 /usr/lib 来查找库/etc/ld.so.conf
,如果 /usr/lib 在那里被优先考虑,那么 /usr/local 程序将找不到他们需要的较新的库。所以 /usr/local/lib 通常被优先考虑。较旧的程序找到较新的库通常不是问题,因为这些库是向后兼容的。
多年后,经过几次操作系统升级,/usr/lib 中的库现在是 X+2 版本,/usr/local/lib 中的库仍然是 X+1 版本,现在 /usr/bin 中的程序正在加载旧的 /usr/local/lib 版本和行为不端。这可以通过删除旧库来解决。需要版本 X+1 的 /usr/local/bin 程序将在 /usr/lib 中找到版本 X+2 并正常工作。但前提是需要更新版本是首先在本地安装版本 X+1 的原因。
要在删除之前探查潜在问题,请在 /usr/local 下查找使用 libz 的任何内容。
ldd /usr/local/bin/* /usr/local/sbin/* | less +/libz
如果您发现任何引用 libz 的内容,请尝试运行它LD_LIBRARY_PATH=/usr/lib
以确保它仍然有效。假设没有中断,请删除本地 libz 文件(通过将它们移动到备份位置,以便在必要时撤消此操作)
mkdir /root/local-libz-backup
mv /usr/local/lib/libz* /root/local-libz-backup
ldconfig