0%

Linux下非root用户安装软件至本地

1. 背景介绍

在团队或小组中,免不了会多人使用同一台服务器。由于是多人使用,机器的环境肯定是预先配置好了最基本的软件或工具,但对于单个用户来讲,这些工具很可能远远不足以满足要求。此时,便需要非root用户自己根据所需去安装个性化的应用或工具。有些工具可能比较好装,但是大部分软件或工具的安装,均需要管理员权限。此时,便需要一些技巧去避开这些权限的要求。

2. Python 工具包

本章节有个前提就是不考虑Anaconda。

Python 的工具包分为两类:一类是python-dev,python-pip等管理员已经安装好了的,另一类便是缺少这些必要的包的。前者好理解,这些都是python基础环境所必需的,管理员一般都会安装好。但是,不排除一些管理员默认只配置python2,对于python3不管不顾(系统是 Ubuntu 16.04 及以下)。

2.1 依赖包齐全

这种情况最好解决,加一个--user全解决:

1
pip3 install pkg --user

2.2 依赖包缺失

首先,安装pip:

1
2
wget https://bootstrap.pypa.io/get-pip.py
python3 get-pip.py --user

搞定。

以 Ubuntu 16.04 为例,在包管理网站,下载python-dev的deb包(注意不止一个,相关的都下载下来)。然后通过 dpkg 命令将这些 deb 文件解包:

1
dpkg -x package.deb <pkg_dir>

最后,在 <pkg_dir> 路径下,将解包好的程序或文件组织好,mv$HOME/.local 文件夹下即可。

注意,对于wheel格式的python包安装同 2.1 介绍的一样。但是,对于一些源码编译的包可能会有问题。因为,有些包可能会用到 Python.h 之类的头文件,在源码的 setup.py 中(其实是 setuptools 默认的)这些头文件都是默认在根目录下的。因此,需要修改 setup.py 文件,添加这些头文件路径以及一些 lib 路径。

3. C/C++ 软件

3.1 源码编译

源码编译,咋都好说,按照官方的教程来就好,有些需要 configure 的,需要先执行 configure,记得配置 PREFIX 选在 $HOME/.local 即可。
有些可能是 CMake 的就更好设置了。

3.2 预编译的二进制包

对于预编译的二进制包,不同的 Linux 发行版有着不同的包管理工具。

3.2.1 Ubuntu

Ubuntu 的包管理工具为 apt,其可以在非 root 用户下下载制定的包,遗憾的是它不会像安装那样把所有依赖包都下载下来,需要手动的去下载所有依赖包。

1
apt-get download <pkg-name>

下载完所有的 deb 包后,接下来的工作同 2.2 节提到的。

3.2.2 CentOS

CentOS 的包管理工具为 yum,其除了查询等操作外,其他的操作均需要管理员权限。因此,这里指望不上它。(可能是我太挫了。)

CentOS 的二进制预编译包为 apm 打包,因此可以效仿 deb 包那样,进行手动解包。此外,对于一些允许重定位(relocatable)的包还可以使用 apm 命令手动重定位安装,安装命令如下(本人不用 CentOS 尚未见过可重定位的包)[1]

1
rpm -ivh --nodeps <pkg-name>.rpm --prefix $HOME/.local

手动解包命令[2]

1
rpm2cpio <pkg-name>.rpm | cpio -idvm

4. 实战演练

这里的实战是在 CentOS 系统下安装 R 软件。源码编译这一关我是死活过不去 bzip2 这个依赖的 check,源码编译可参考[3]。因此无奈选择了预编译包的安装。

首先,确定 R 二进制包的位置

1
yum list R

得到的结果

1
2
可安装的软件包
R.x86_64 3.5.2-2.el6 epel

OK,有就好了,在清华镜像源里的 epel 源里面找到了对应的一些列包,下载后,首先尝试 apm 安装,失败,因为 R 不允许重定向安装位置。
尝试解包安装:

1. 解包后,发现出现两个文件夹 `usr` 和 `etc`,其中,`usr/bin/R` 执行后报错,找不到 `/usr/lib64/R/etc/ldpaths`;
2. 将 `usr` 整体 `mv` 到 `$HOME/.local` 下;
3. 修改 `$HOME/.local/usr/bin/R` 文件中的 `R_HOME`, `R_HOME_DIR`等路径,改为现在的对应的本地路径;
4. 同理修改 `$HOME/.local/usr/lib64/R/bin/R` 文件;
5. 配置 `.bashrc` 文件,添加一行 `export PATH=$PATH:$HOME/.local/usr/bin`.

搞定,执行成功。

参考文献


  1. http://my.huhoo.net/archives/2010/09/rootrpm.html ↩︎

  2. https://blog.csdn.net/sdcxyz/article/details/47094221 ↩︎

  3. https://zhuanlan.zhihu.com/p/28055351 ↩︎

您的支持将鼓励我继续创作!