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 | wget https://bootstrap.pypa.io/get-pip.py |
搞定。
以 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 | 可安装的软件包 |
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`.
搞定,执行成功。