不同的Perl安装引起的混乱问题

3
我试图升级Perl,结果把电脑搞得一团糟。 我目前正在运行RHEL6.5 64位操作系统,并且已经安装了perl-5.10.1。但是,我想安装Padre(Perl IDE),需要至少v5.11版本的Perl。但是我所在的存储库中没有更新的Perl版本(而且我无法添加新的存储库)。于是我得到了老板的批准,从www.perl.org下载了perl-5.20.0并尝试安装它,结果...混乱开始了! 首先,我用自己的ID安装了新的perl,这将perl推到我的home目录下某个位置。我测试了'perl -v'命令,可以看到我的环境指向较新的安装程序,然而,yum从未识别过它(这不是真正的问题)。当我尝试安装Padre时,似乎它将原始的perl硬编码(来自/usr/bin),仍然要求5.11或更新版本的perl。为了解决这个问题,我再次使用root安装了新的perl,以便将其推送到/usr树下... 它确实安装成功了,但将perl推送到了/usr/local/bin而不是/usr/bin。因此,我又安装了一个perl,但Padre仍在寻找/usr/bin上的那个perl。最后,我放弃了Padre,并删除与其相关的文件,以及安装在我的home目录下的perl,但是我已经编写的一些perl脚本现在出现错误,例如:
perl -cw "xmltest.pl" (in directory: /home/myid/scripts/xmltest.pl)
perl: symbol lookup error: /usr/lib64/perl5/auto/Data/Dumper/Dumper.so: undefined symbol: Perl_Istack_sp_ptr
Compilation failed.

...而Data :: Dumper并不是唯一的......每次我禁用其中一个模块,另一个模块也会以同样或类似的方式挂起

从我所了解的情况来看,这个问题与最初安装在一个perl版本中的模块有关,并被另一个版本调用,然而,我已经强制使用的模块从CPAN直接重新安装,但它们仍然失败。

问题:如何安全地摆脱当前的perl安装程序,并执行新的干净安装,以便在没有这些版本冲突的情况下使用它?

我最担心的是我的许多应用程序都依赖于Perl,我不能在卸载时破坏它们。

任何帮助都将非常感激。


2
(5.odd是开发版本,您不应该安装它们。) - ikegami
perl -V(大写的“V”)告诉您的perl搜索模块的位置,因此您知道要开始删除什么...至于安全性?嗯,据我所知,您的软件包管理器可能需要Perl,所以谁知道呢! - ikegami
tkx @ikegami...转移到另一个版本,比如5.19或类似的版本都不是问题...但首先,我需要从这个混乱中解脱出来! :-( - Renato
当你说你要删除时,你的意思是移动,对吗? - ikegami
2
另外,如果您切换到另一个版本,请确保不要覆盖系统 Perl。这次可以使用 perlbrew 在您的主目录中安装它。 - ikegami
对于Padre文件和那些推送到我的/home目录下的文件,我确实删除了...对于其他在/usr目录下的文件,我将它们放在了一个tar文件中,但是还没有删除任何东西,因为我担心其他应用程序。 - Renato
3个回答

8
你应该:
  1. 清理

    • 清除(注释掉)你的 ~/.profile 中任何不需要的路径等
    • 清除任何新安装的 Perl,从你的 $HOME 中移动到一个安全的位置
    • 简而言之,尝试将你的环境还原到以前的工作状态
  2. 重新登录(登出、登录)

  3. 修复你的系统 Perl。这意味着:

    • 阅读 @Sam Varshavchik 的答案
    • 使用你的软件包管理器(5.10)从你的发行版中重新安装它
    • 这一步应该覆盖你造成的混乱
    • 测试它!
    • 在确保一切正常运行之前,请不要继续

教训:永远不要覆盖你的系统 Perl

  1. 学习

  2. 安装perlbrew

    • 运行安装命令\wget -O - http://install.perlbrew.pl | bash
    • 应该没有错误地完成
    • 按照说明修改启动文件,例如~/.profile等...(需要在末尾添加一行)
    • 检查~/perl5/perlbrew/bin应包含prelbrewpatchperl
  3. 重新登录

  4. 设置新的perl,运行

    • perlbrew init #初始化环境
    • perlbrew available #显示可以安装的perl版本
    • perlbrew install 5.20.0 #将需要几分钟-取决于您的系统速度
    • perlbrew install-cpanm
    • perlbrew list #检查
    • perlbrew switch perl-5.20.0 #激活新安装的perl 5.20

检查您的安装

  • ~/perl5/perlbrew/bin中,您应该有3个脚本:prelbrewpatchperlcpanm
  • perl -v应返回5.20
  • type cpanm - 应返回~/perl5/perlbrew/bin/cpanm

你完成了。

  1. CPAN模块

您可以使用cpanm安装新模块,例如:

请检查 ~/perl5/perlbrew/perls/perl-5.20.0/bin/ 是否有新命令

您需要更新自己的 Perl 脚本的 shebang 行为

#!/usr/bin/env perl

我希望你不要遗漏任何东西,也许更有经验的Perl大师会添加/编辑/更正更多内容。无论如何,在现实中,步骤5、6、7比听起来容易得多(通过阅读本文),可以在几分钟内完成。

在基于rpm的发行版中,我不建议使用cpanm来安装Perl包。rpm是唯一的选择。尽管我可以轻松地构建一个新版本的Perl或任何软件包,并自己安装它(我以前做过这样的事情),而且即使我破坏了系统Perl,我也可以修复它。我并不是在吹嘘,我只是想说明一个问题。如果我即将犯下严重错误,rpm就在那里拯救我。无论有多少牛逼的黑客,每个人都会犯错,而rpm会防止我浪费整个周末来解决大问题。 - Sam Varshavchik
2
@SamVarshavchik,请了解一下perlbrew。cpanm是perlbrew的本地工具,整个perlbrew完全与系统perl隔离(在自己的独立环境中运行,在自己的目录树中),而且您不需要成为root用户来安装它。如果您不是root用户,则无法覆盖系统perl或者出现意外情况。当某人使用cpanm进行系统范围内的perl安装(作为root用户或使用--sudo)时,您的评论是正确的 - 但这不是perlbrew的情况。所以,你哭得很准确,但却在错误的坟墓上... ;) - clt60

4
在基于rpm的Linux发行版上,您应该永远不要手动安装系统软件,例如尝试自己编译和构建。RHEL的软件包管理工具rpm执行了一个重要的功能,跟踪软件包之间的依赖关系,并防止软件包冲突。
您显示的错误正是系统Perl安装损坏的症状,而rpm恰好存在为了避免这种情况发生。手动构建和安装随意的tarballs完全绕过了rpm提供的安全网。
没有通用的配方来从像perl这样的关键系统rpm的损坏系统安装中恢复,但一般而言:
1)运行“rpm -q perl”,这将显示rpm认为应该安装的perl rpm软件包的确切版本。
2)转到RHEL安装介质/目录,验证它是否包含相同的perl-.x86_64.rpm软件包。如果您以前安装了RHEL更新,则有可能已经更新了perl,因此请查找rpm告诉您在RHEL更新目录中已安装的版本,并验证您是否拥有正确的rpm软件包。
3)执行:
rpm -ivh --force perl-<version>.x86_64.rpm

这将重新安装以前安装的原始perl RPM软件包。你的问题不仅在于你有额外版本的perl安装,而且很可能你的一些自定义perl构建已经覆盖了系统的perl软件包,卸载它们是没有用的,你必须重新安装系统的perl。

4) 在RHEL中,许多perl模块都安装为单独的软件包。上述过程应该用于重新安装您安装的每个perl rpm软件包。执行:

rpm -q -a | grep '^perl'

这将为您提供所有已安装的Perl包的列表。您需要针对每个Perl rpm软件包重复此过程。

虽然不能保证这一步就能解决所有问题,但这是恢复的良好第一步。


感谢您的回复,@Sam-Varshavchik ...看起来我将会有一个漫长的周末!...我一定会尝试并在完成后在这里发布结果。只是一个问题,在rpm/yum中是否有一种列出所有依赖于perl的软件包的方法?...我可以看到perl依赖于哪些软件包,但找不到一种识别依赖于它的软件包的方法。此致敬礼。 - Renato
"rpm -e --test perl" -- 这将会是一个很长的列表。 - Sam Varshavchik

0

我做了什么:

从@Sam-Varshavchik的回答中:

  1. 在我的yum缓存中找到了以前的perl rpm,并安装了... rpm -ivh --force perl-<version>.x86_64.rpm

  2. 检查之前安装的其他"perl*"软件包...有260多个,所以将其保存在文件中 rpm -qa "perl*" > /tmp/perl.pkgs

  3. 有260多个软件包需要安装,我意识到手动安装需要太多时间,所以是时候发挥一些ksh技能了...

    我检查了我的yum缓存,并找到了大约130个+260个软件包,因此

    • 从列表中取出基本perl软件包(我已经安装了它);
    • 对于那些在缓存中的软件包,我决定像基本软件包一样使用rpm进行安装;
    • 对于我没有方便的软件包,我使用yum,它会下载并执行与rpm相同的操作,所以...

    CACHE="/var/cache/yum/x86_64" for perlpkg in $(cat /tmp/perl.pkgs) do FILE=$(find $CACHE -name "${perlpkg}.rpm") if [[ ${FILE} != "" ]] ; then rpm -ivh --force ${FILE} else yum -y reinstall ${perlpkg} fi done

来自@jm666:

  1. 安装了perlbrew(能够从我的认证仓库中获取,因此使用yum获取),并使用perlbrew在本地安装了5.20.0

    • 待办事项:没有获得任何其他模块,也没有获得Padre...需要更多地了解perlbrew的工作方式,并将安装的版本与系统perl隔离开来

再次感谢@Sam-Varshavchik和@jm666的支持和指导。


我对由yum安装的perlbrew一无所知。我的答案中提到的方法会将perlbrew_安装到您的主目录下_。默认路径为$HOME/perl5/perlbrew。之后,perlbrew会将新的perl(您可以有_多个_)安装到目录$HOME/perl5/perlbrew/perls/perl5.20.0中(按版本)。在第5步中,您需要通过添加一行source ~/perl5/perlbrew/etc/bashrc来修改.profile文件——这行代码允许您使用新安装的perl。您不需要以root身份安装带有perlbrew的perl。例如,您无法覆盖系统perl。 - clt60

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接