如何在没有 root 用户的情况下使用自动依赖处理在 Linux (CentOS) 中安装软件包?
How to install packages in Linux (CentOS) without root user with automatic dependency handling?
是否可以在 Linux 中使用 RPM 或 YUM 或任何其他包管理器,特别是 CentOS,将已经下载的包或从 repo 安装到自定义位置而无需 admin/root 访问权限?
我尝试从源代码构建,使用 cmake、configure、make、make install 等,但是,它最终一个接一个地具有如此多的依赖项。
或者有更好的选择吗?
goldilocks 的这个回答听起来正是您要找的。
https://unix.stackexchange.com/a/61295
它仍然不是一个漂亮的过程,但似乎比从源代码构建更容易。
否则,您可能需要研究非根软件包管理器作为 yum 的替代品。
是的。如果软件打包在 repos 中。并安装了管理员
PackageKit-command-not-found 包。
参见:
https://fedoraproject.org/wiki/Features/PackageKitCommandNotFound
TL;DR 使用 Miniconda,conda-forge 很棒。
curl "https://repo.continuum.io/miniconda/Miniconda3-latest-Linux-x86_64.sh" | sh
或者,或者:
curl https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh > Miniconda.sh
bash Miniconda.sh -b -p ~/conda
# -b is used to specify that this is done "in batch", so skip the EULA prompt
# -p lets you specify where you want conda installed
常用软件包:
- 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 有一个错误,它使用的 ncurse 库的名称。您可以通过转到
da/lib
文件夹并符号链接 ln -sT libtinfow.so.6.1 libtinfo.so.6
来解决它
剩下的,你可以试试https://anaconda.org/search?q=
。
我已经尝试了很长时间让包管理器在 CentOS/RedHat 上运行良好但没有成功。我能做的最好的事情是在另一个具有 root 访问权限的 CentOS 上的正确位置安装 Gentoo Prefix,然后将整个安装的 .tar.xz
scp 到目标服务器(唯一为 Gentoo Prefix 获取正确 gcc 的方法) .我可以 emerge
(构建和安装)目标服务器上的包,但一直遇到本地和权限问题。
我最近使用 conda 实现了一些有趣的包的用户安装。以下是如何从命令行安装它:
curl "https://repo.continuum.io/miniconda/Miniconda3-latest-Linux-x86_64.sh" | sh
如果像我一样,您的主文件夹托管在远程驱动器(网络文件系统)上,您可能不想将它安装在您的主文件夹中,因此您可能想要使用 mkdir /var/tmp/lo
然后在安装过程中指定一个安装文件夹,如/var/tmp/lo/da
。
然后您将能够安装相当多的软件包,尽管可能不是您想要的所有软件包。大多数时候,如果它不在默认频道中,它将在 conda-forge
中。您可以在 https://anaconda.org/search?q=
检查现有的软件包
我在 conda 之后尝试使用的其他包管理器:
Linuxbrew
我认为安装自制软件 (linuxbrew) 会很容易,但它们的源代码很乱,并且使用 ruby 解释器的硬编码绝对路径,但它失败了,因为它不是最新版本等等等等我放弃了。
尼克斯
Nix 仍然需要您使用 /nix 文件夹。他们也对其进行了硬编码,并且很难从安装过程中必须执行的每次下载中正确地 sed(更不用说更新了)。
Gentoo 前缀
我希望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 上或者遇到 7.x 版本的 (G)LibC 版本问题,请使用(旧)版本 64 位 EL 6.x。 -- 运气不好,pkgsrc 硬编码 /usr/pkg/sbin
和 /usr/pkg/bin
。所以它不能用作用户,除非可能设置一个 fakechroot 环境。但我从来没有这样做过,我预计会出现可用性问题。
如果您成功安装任何其他包管理器,请comment/answer。
可以使用 yum 和 rpm 在发行版的存储库中安装任何包。这是食谱:
查找包名
使用yum search
.
下载
使用 yumdownloader
下载软件包及其所有依赖项(默认情况下在 CentOS 上可用)。您需要传递它 --resolve
以获得依赖项解析。 yumdownloader
下载到当前目录,除非您指定 --destdir
.
mkdir -p ~/rpm
yumdownloader --destdir ~/rpm --resolve vim-common
选择前缀位置
可能是 ~
、~/centos
或 ~/y
。如果你的家因为在网络文件系统上很慢,你可以把它放在/var/tmp/...
.
mkdir ~/centos
提取所有 .rpm 包
将所有 .rpm 包提取到您选择的前缀位置。
cd ~/centos && rpm2cpio ~/rpm/x.rpm | cpio -id
rpm2cpio
将 .rpm 文件输出为 stdout 上的 .cpio 存档。
cpio
从 stdin 读取它
-i
表示解压(到当前目录)
-d
表示创建缺失目录
您可以选择使用 -v
: verbose
配置环境
您需要配置环境变量 PATH
和 LD_LIBRARY_PATH
才能使已安装的软件包正常工作。这是我 ~/.bashrc
:
中的相应示例
export PATH="$HOME/centos/usr/sbin:$HOME/centos/usr/bin:$HOME/centos/bin:$PATH"
export MANPATH="$HOME/centos/usr/share/man:$MANPATH"
L='/lib:/lib64:/usr/lib:/usr/lib64'
export LD_LIBRARY_PATH="$HOME/centos/usr/lib:$HOME/centos/usr/lib64:$L"
编辑注释(感谢@AmitNaidu 指出我的错误):
根据 bash documentation about startup files,当通过 ssh 连接到服务器时,仅获取 .bashrc:
Invoked by remote shell daemon
Bash attempts to determine when it is being run with its standard input connected to a network connection, as when executed by the remote shell daemon, usually rshd, or the secure shell daemon sshd. If Bash determines it is being run in this fashion, it reads and executes commands from ~/.bashrc, if that file exists and is readable.
现在,如果您想以这种方式安装大量软件包,则可能需要使该过程自动化。如果是这样,请查看 this repository.
额外注意:如果您尝试安装 gcc, zlib, make, cmake, git, fish, zsh or tmux
中的任何一个,您应该真正考虑使用 conda,请参阅 。
下载软件包,并使用 --resolve
标志指示包含依赖项。
yumdownloader --resolve openslide-tools
遍历所有下载的 rpm
个文件。
for i in *.rpm; do rpm2cpio $i | cpio -idv; done
输出将存储在您当前的工作目录中$PWD/usr/*
是否可以在 Linux 中使用 RPM 或 YUM 或任何其他包管理器,特别是 CentOS,将已经下载的包或从 repo 安装到自定义位置而无需 admin/root 访问权限?
我尝试从源代码构建,使用 cmake、configure、make、make install 等,但是,它最终一个接一个地具有如此多的依赖项。
或者有更好的选择吗?
goldilocks 的这个回答听起来正是您要找的。
https://unix.stackexchange.com/a/61295
它仍然不是一个漂亮的过程,但似乎比从源代码构建更容易。
否则,您可能需要研究非根软件包管理器作为 yum 的替代品。
是的。如果软件打包在 repos 中。并安装了管理员 PackageKit-command-not-found 包。
参见: https://fedoraproject.org/wiki/Features/PackageKitCommandNotFound
TL;DR 使用 Miniconda,conda-forge 很棒。
curl "https://repo.continuum.io/miniconda/Miniconda3-latest-Linux-x86_64.sh" | sh
或者,或者:
curl https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh > Miniconda.sh
bash Miniconda.sh -b -p ~/conda
# -b is used to specify that this is done "in batch", so skip the EULA prompt
# -p lets you specify where you want conda installed
常用软件包:
- 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 有一个错误,它使用的 ncurse 库的名称。您可以通过转到
da/lib
文件夹并符号链接ln -sT libtinfow.so.6.1 libtinfo.so.6
来解决它
- 这个 tmux 有一个错误,它使用的 ncurse 库的名称。您可以通过转到
剩下的,你可以试试https://anaconda.org/search?q=
。
我已经尝试了很长时间让包管理器在 CentOS/RedHat 上运行良好但没有成功。我能做的最好的事情是在另一个具有 root 访问权限的 CentOS 上的正确位置安装 Gentoo Prefix,然后将整个安装的 .tar.xz
scp 到目标服务器(唯一为 Gentoo Prefix 获取正确 gcc 的方法) .我可以 emerge
(构建和安装)目标服务器上的包,但一直遇到本地和权限问题。
我最近使用 conda 实现了一些有趣的包的用户安装。以下是如何从命令行安装它:
curl "https://repo.continuum.io/miniconda/Miniconda3-latest-Linux-x86_64.sh" | sh
如果像我一样,您的主文件夹托管在远程驱动器(网络文件系统)上,您可能不想将它安装在您的主文件夹中,因此您可能想要使用 mkdir /var/tmp/lo
然后在安装过程中指定一个安装文件夹,如/var/tmp/lo/da
。
然后您将能够安装相当多的软件包,尽管可能不是您想要的所有软件包。大多数时候,如果它不在默认频道中,它将在 conda-forge
中。您可以在 https://anaconda.org/search?q=
我在 conda 之后尝试使用的其他包管理器:
Linuxbrew
我认为安装自制软件 (linuxbrew) 会很容易,但它们的源代码很乱,并且使用 ruby 解释器的硬编码绝对路径,但它失败了,因为它不是最新版本等等等等我放弃了。
尼克斯
Nix 仍然需要您使用 /nix 文件夹。他们也对其进行了硬编码,并且很难从安装过程中必须执行的每次下载中正确地 sed(更不用说更新了)。
Gentoo 前缀
我希望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 上或者遇到 7.x 版本的 (G)LibC 版本问题,请使用(旧)版本 64 位 EL 6.x。 -- 运气不好,pkgsrc 硬编码 /usr/pkg/sbin
和 /usr/pkg/bin
。所以它不能用作用户,除非可能设置一个 fakechroot 环境。但我从来没有这样做过,我预计会出现可用性问题。
如果您成功安装任何其他包管理器,请comment/answer。
可以使用 yum 和 rpm 在发行版的存储库中安装任何包。这是食谱:
查找包名
使用yum search
.
下载
使用 yumdownloader
下载软件包及其所有依赖项(默认情况下在 CentOS 上可用)。您需要传递它 --resolve
以获得依赖项解析。 yumdownloader
下载到当前目录,除非您指定 --destdir
.
mkdir -p ~/rpm
yumdownloader --destdir ~/rpm --resolve vim-common
选择前缀位置
可能是 ~
、~/centos
或 ~/y
。如果你的家因为在网络文件系统上很慢,你可以把它放在/var/tmp/...
.
mkdir ~/centos
提取所有 .rpm 包
将所有 .rpm 包提取到您选择的前缀位置。
cd ~/centos && rpm2cpio ~/rpm/x.rpm | cpio -id
rpm2cpio
将 .rpm 文件输出为 stdout 上的 .cpio 存档。cpio
从 stdin 读取它
-i
表示解压(到当前目录)-d
表示创建缺失目录
您可以选择使用 -v
: verbose
配置环境
您需要配置环境变量 PATH
和 LD_LIBRARY_PATH
才能使已安装的软件包正常工作。这是我 ~/.bashrc
:
export PATH="$HOME/centos/usr/sbin:$HOME/centos/usr/bin:$HOME/centos/bin:$PATH"
export MANPATH="$HOME/centos/usr/share/man:$MANPATH"
L='/lib:/lib64:/usr/lib:/usr/lib64'
export LD_LIBRARY_PATH="$HOME/centos/usr/lib:$HOME/centos/usr/lib64:$L"
编辑注释(感谢@AmitNaidu 指出我的错误):
根据 bash documentation about startup files,当通过 ssh 连接到服务器时,仅获取 .bashrc:
Invoked by remote shell daemon
Bash attempts to determine when it is being run with its standard input connected to a network connection, as when executed by the remote shell daemon, usually rshd, or the secure shell daemon sshd. If Bash determines it is being run in this fashion, it reads and executes commands from ~/.bashrc, if that file exists and is readable.
现在,如果您想以这种方式安装大量软件包,则可能需要使该过程自动化。如果是这样,请查看 this repository.
额外注意:如果您尝试安装 gcc, zlib, make, cmake, git, fish, zsh or tmux
中的任何一个,您应该真正考虑使用 conda,请参阅
下载软件包,并使用 --resolve
标志指示包含依赖项。
yumdownloader --resolve openslide-tools
遍历所有下载的 rpm
个文件。
for i in *.rpm; do rpm2cpio $i | cpio -idv; done
输出将存储在您当前的工作目录中$PWD/usr/*