如何在没有root用户自动依赖处理的情况下在Linux(CentOS)中安装软件包?

问题描述 投票:9回答:4

是否可以在Linux中使用RPM或YUM或任何其他软件包管理器(特别是CentOS)来安装已下载的软件包或从repo到没有admin / root访问权限的自定义位置?

我尝试从源代码构建,使用cmake,configure,make,make install等,但是,它最终依次拥有如此多的依赖项。

还是有更好的选择吗?

linux centos rpm yum package-managers
4个回答
10
投票

可以使用yum和rpm在分发的存储库中安装任何包。这是食谱:

Find the package name

使用yum search

Download

使用yumdownloader(默认情况下可在CentOS上使用)下载软件包及其所有依赖项。你需要传递它--resolve来获得依赖性解析。除非您指定yumdownloader,否则--destdir会下载到当前目录。

mkdir -p ~/rpm
yumdownloader --destdir ~/rpm --resolve vim-common

Choose a prefix location

它可能是~~/centos~/y。如果你的家在网络文件系统上很慢,你可以将它放在/var/tmp/...中。

mkdir ~/centos

Extract all .rpm packages

将所有.rpm包提取到您选择的前缀位置。

cd ~/centos && rpm2cpio ~/rpm/x.rpm | cpio -id
  • rpm2cpio将.rpm文件输出为stdout上的.cpio存档。
  • cpio从stdin读取它
  • -i表示提取(到当前目录)
  • -d表示创建缺少目录

你可以选择使用-v:verbose

Configure the environment

您需要配置环境变量PATHLD_LIBRARY_PATH才能使已安装的软件包正常工作。以下是我的~/.profile的相应示例:

export PATH="$HOME/centos/usr/sbin:$HOME/centos/usr/bin:$HOME/centos/bin:$PATH"

L='/lib:/lib64:/usr/lib:/usr/lib64'
export LD_LIBRARY_PATH="$L:$HOME/centos/usr/lib:$HOME/centos/usr/lib64"

注意:当您进入服务器时,您将获得一个登录shell。所以你的.bashrc默认不是来源的。 Bash运行您的登录启动文件。此文件是列表中的第一个现有文件:.bash_profile.bash_login.profile(请参阅bash documentation about startup files)。如果由于某些不明原因,您希望在.bashrc而不是登录或启动文件中配置环境,则必须从后者获取前者。


现在,如果您想以这种方式安装许多软件包,您可能希望自动化该过程。如果是这样,看看this repository


5
投票

TL; DR使用Miniconda,conda-forge非常棒。


我已经尝试了很长时间让一个包管理器在CentOS上运行良好但没有成功。我能做的最好的事情是在另一个具有root访问权限的CentOS上的正确位置安装Gentoo前缀,然后将整个安装的.tar.xz scp到目标服务器(只有这样才能获得Gentoo前缀的正确gcc)。我可以在目标服务器上使用emerge(构建和安装)软件包,但仍然遇到本地和权限问题。


我最近使用conda实现了一些有趣包的用户安装。以下是如何从命令行安装它:

curl "https://repo.continuum.io/miniconda/Miniconda3-latest-Linux-x86_64.sh" | sh

如果像我一样,您的主文件夹托管在远程驱动器(网络文件系统)上,您可能不希望将其安装在您的主文件夹中,因此您可能希望使用类似mkdir /var/tmp/lo的东西,然后指定一个安装文件夹,如/var/tmp/lo/da安装。

您还会被提示添加,例如/var/tmp/lo/da/bin到您的.bashrc中的PATH,但当您进入服务器时,您会获得一个登录shell,因此默认情况下不会获取您的.bashrc。因此,您需要使用.bash_profile / .bash_login / .profile(请参阅bash documentation about startup files)添加该行或来源.bashrc

然后,您可以安装相当多的软件包,但可能不是您想要的所有软件包。大多数情况下,如果它不在默认通道中,它将在conda-forge中。您可以在https://anaconda.org/search?q=查看现有的包裹

  • gcc conda install gcc
  • zlib conda install zlib
  • 制作conda install make
  • cmake conda install cmake
  • git conda install git
  • conda install -c conda-forge fish
  • zsh conda install -c ActivisionGameScience zsh
  • tmux conda install -c conda-forge tmux 这个tmux有一个bug,它使用的是ncurse库的名称。您可以通过转到da/lib文件夹和符号化ln -sT libtinfow.so.6.1 libtinfo.so.6来解决它

我在conda之后尝试使用的其他包管理器:

Linuxbrew

我认为,安装自制软件(linuxbrew)很容易,但是它们的来源很麻烦并且使用硬编码的绝对路径到ruby解释器,这会因为它不是最后一个版本而失败,等等等我给了起来。

Nix

Nix仍然要求您使用/ nix文件夹。他们也对它进行了硬编码,并且在安装过程中每次下载时都很难正确地进行编码(更不用说更新了)。

Gentoo Prefix

我希望Gentoo Prefix更容易直接安装,因为我们可以在目标服务器上使用gcc。 - 好的,我尝试过但在安装过程中遇到了权限错误(2018-09-28):

portage.exception.OperationNotPermitted: chown(b'~/gentoo/tmp/var/tmp/portage/sys-apps/gentoo-functions-0.12/image/var', 2000, 2000)

PkgSrc

我现在要去尝试pkgsrc。 - 如果在CentOS 6上使用(较旧的)64位EL 6.x版本,或者遇到与7.x版本相遇的(G)LibC版本问题。 - 没有运气,pkgsrc硬编码/usr/pkg/sbin/usr/pkg/bin。因此它不能用作用户,除非可能设置一个假的机器人环境。但我从来没有这样做,我期待可用性问题。


如果您成功安装了任何其他软件包管理器,请发表评论/回答。


0
投票

金发姑娘的回答听起来就像你在寻找的那样。

https://unix.stackexchange.com/a/61295

它仍然不是一个漂亮的过程,但似乎比从源代码构建更容易。

否则,您可能希望查看非root包管理器作为yum的替代方法。


0
投票

是的。如果软件包装在repos中。并且管理员安装了PackageKit-command-not-found包。

见:https://fedoraproject.org/wiki/Features/PackageKitCommandNotFound

© www.soinside.com 2019 - 2024. All rights reserved.