由于实验需要,最近获得了一个实验室服务器的账号,平常主要通过 ssh 进行远程登陆进行实验。一方面,远程登录的机器只提供终端界面,一般只通过命令行进行任务操作;另一方面,由于是多人共享服务器,故而个人账号并不具备 root 权限,平时在个人主机上肆无忌惮 sudo 进行操作以及大不了重装的做法显然不太合适。目前遇到的一个问题就是由于缺少 root 权限,无法直接通过包管理工具进行某些软件的安装。这里主要记录的是通过源代码编译的方式在远程登陆的主机上安装所需的如 GNU M4、autoconf、automake 等程序的方法。
0.简介
在个人主机上安装程序时,用户可以使用 apt install xxx 命令安装所需要的软件工具( 需要 root 权限,个人用户一般用 sudo 指令即可),且包管理工具会自动为用户配置好当前待安装的软件所需要的依赖软件,使用起来较为方便和简洁。新安装的可执行文件一般存放在目录 /usr/bin 中( distribution发布者提供的软件 ),而用户自行下载编译安装的软件一般位于 /usr/local/bin ( 非distribution默认提供者提供的软件 )目录下,这些软件相应的头文件等数据则存放在 /usr/include 和 /usr/local/include 文件夹下。由于上述目录位于每个用户的环境变量 PATH 中,故而具备 root 权限的用户安装好程序后,其他用户也可直接使用这些程序。
sudo apt install package-name //安装 package-name 以及其所依赖的相关程序
但当许多用户共享同一台服务器时,此时可能只有系统管理员具备 root 权限,单个用户无法直接通过 apt install 命令安装所需的软件( 普通用户不具备 sudo 权限 ),普通用户新安装的程序也无法放置在 /usr/bin 和 /usr/local/bin 目录下( 普通用户仅具有对上述目录的读和执行权限 ),这样避免了单个用户的行为改变系统的一般环境,但也为普通用户的环境配置设置了一定的障碍。这种情况下,一般需要用户通过源码手动编译程序,并将可执行程序放置在自己的主目录下,从而配置个人的开发环境。下面以安装 GNU M4 为例,记录通过源代码编译的方式在远程登陆的主机上安装程序的过程。
1.在对应程序的官网下载源代码压缩包
首先在本地下载对应程序的安装包。以安装 GNU M4 为例,可通过浏览器搜索 GNU M4 ,找到 GNU M4 官网。
通过其中的下载页面下载较新版本的 GNU M4 源码包,也就是 xx.tar.xx 文件。
注:Linux 终端环境下,也可以直接通过命令行操作直接进行文件的上传和下载,Linux 命令 curl 和 wget 支持在终端环境下的文件传输功能。
2. 将下载的源码包传送至服务器端并解压
想要在远程登陆的服务端安装对应的程序,则首先需要将文件传输至远端服务器文件夹下。用户可通过 ftp 服务或 scp 指令完成文件压缩包的传输。若远端服务器的 ftp 服务是开启的,则用户可在本地安装 ftp 客户端,并连接远端服务器,实现文件的传输功能。或者用户可直接通过 Linux 内置的命令 scp 进行文件的传输,关于 scp 命令可以参考笔者的另一篇记录远程登录与文件传输指令——ssh与scp。
scp ~/Downloads/xxx.tar.xxx user@1.2.3.4:~ //将本地路径指定的文件传输至位于地址 1.2.3.4 处的 user 用户的主目录,执行时会首先要求进行密码验证
完成文件源码的传输后,通过 ssh 命令远程登陆服务器账户,并通过终端命令行进行文件的解压操作。
对于后缀为 .tar.gz 的文件 :
tar -xzvf xxx.tar.gz //解压文件至当前目录下,可增加 -C dir 参数指定解压路径
对于后缀为 .tar.bz2 的文件:
tar -xjvf xxx.tar.bz2 //解压文件至当前目录
3. 程序的编译和安装
将上述文件压缩包解压缩后,即可进入解压后的文件目录进行程序的编译和安装。Linux 平台下程序的安装包一般会有关于安装和编译的说明文件,如 README.md 和 INSTALL 文件等,用户可以参考其中的说明进行操作。这里后续的安装指令即参考 GNU M4 文件的 INSTALL 文件的说明,其他的常用基础工具如 autoconf、automake 的安装与其过程大致相同。后续的用户目录均使用 /home/xxx,在实际操作时请替换为用户的实际目录 /home/username。
首先通过 echo $PATH 命令查看当前用户的环境变量值,找到可存放个人用户的可执行文件的目录。之前介绍中有说明,普通用户不具备对 /usr/bin 和 /usr/local/bin 的写入权限,故而一般需要手动安装的可执行程序放在自己的主目录下,环境变量 PATH 中记录的是用户在执行某个命令时,系统依照其中的记录搜寻可执行文件的目录的顺序,普通用户的 PATH 变量的第一个目录即为本用户可用的可执行文件的存放位置。
echo $PATH //输出本用户环境变量 PATH 的值
在笔者的环境中,在远端服务器的 PATH 变量的值如如所示,在安装程序时可以将可执行程序放置在上述 /home/xxx/.local/bin 或 /home/xxx/bin 目录下( 不同环境情况可能不同 )。这样当后续需要通过命令行运行可执行程序或者其他程序寻找所依赖的可执行程序时即可通过 PATH 变量的记录寻找到存放在上述目录中的可执行程序。
在确定可用的可执行文件的安装目录后,可依次执行以下命令完成安装过程。
检查系统环境并进行某些编译设置:
./configure --prefix=/home/xxx/.local //检查当前安装所需要的一些必要环境,并设置安装目录为 prefix 指定的目录下的 bin 目录( 可执行程序 )和 include 目录( 头文件等 )
根据 INSTALL 文件的说明,默认安装时可执行程序会被安装于 /usr/local/bin 目录下,对应的头文件安装于 /usr/local/include 目录下,而由于普通用户不具备对上述目录的写入权限,故而需要指定新的安装参数,将安装目录调整为用户的主目录。这里 --prefix 参数指定最终的安装目录,其参数必须为绝对路径。如若指定路径 --prefix=/home/xxx/,则安装后的可执行文件位于 /home/xxx/bin 文件夹下,而头文件位于 /home/xxx/include 文件夹下。
编译生成可执行文件:
make //根据 makefile 编译生成可执行程序
安装可执行程序
make install //安装编译好的可执行程序
上述指令完成后,在没有报错的情况下即完成了安装过程,用户此时应该可以在指定的可执行文件目录中看到对应的可执行文件。在实际安装某个软件时,需通过上述步骤,依次按依赖条件安装某个软件所需要的基础工具,最后即可完成对应软件的安装过程。
4.其他软件的安装
在安装好特定软件所依赖的基础工具后,则可进行特定软件的安装。但此时需要注意,已安装好的依赖工具的可执行程序和相关文件如头文件、so库等均位于之前安装时通过 --prefix 参数指定的目录下,在笔者的实践环境中即 /home/xxx/.local 目录下的 /bin、/lib和/include 目录。上述目录并不是编译器在进行编译时的默认搜索目录,故而在后续的安装过程中,在 configure 步骤之前需要在配置中首先指定编译过程中相关文件如头文件、so库文件所存放的非默认路径,才能顺利完成软件的编译过程。
用户可以通过 ./configure --help 来查看通过 configure 进行环境配置时可以指定的参数。
./configure --help //查看进行 configure 时可以指定的参数
笔者环境下的部分结果如图所示,用户可通过这些环境变量来设置编译器寻找所需头文件、so文件的非标准路径。
设置所需的环境变量,以确保编译过程能够正确寻找到所需的相关文件。其中,应指定头文件和 so 文件的存放位置,从而保证编译过程中编译器能够找到所需的文件,同时也需要为链接器指定 so 文件的位置,以便后续执行指令时需要的 so 文件能够被顺利加载进内存中
export CPPFLAGS='-I/home/xxx/.local/include' //设置编译选项,-I 参数指定编译过程中首先在给定目录中搜索所需的头文件 export LDFLAGS='-L/home/xxx/.local/lib -Wl,-rpath=/home/xxx/.local/lib' //设置链接选项,-L 参数指定链接过程中首先在给定目录中搜索需要的so库文件,-rpath 参数指定一个非默认的运行时库的搜索路径
上述参数设置时,若需要指定多个特定的目录,则需要通过多个 -I/L 参数进行指定.对于 LDFLAGS ,其中的 -Wl 选项表示后续参数为链接器 ld 的指定参数,-rpath=dir 指定一个非默认的运行时库的搜索路径。更多编译和链接过程使用的参数可参考笔者的记录Linux下编辑、编译、调试命令总结——gcc和gdb描述和网上资料。
在设置完成后,正常的进行步骤3中所描述的 configure 、make 和 make install 安装过程即可。
5.其他选择
理论上,通过源码安装的方式可以安装所有开源的应用软件,但是手动安装应用的过程需要用户自行解决安装包之间的依赖关系,比如笔者在通过源码编译 git 的过程中就需要首先通过源码安装 m4 、autoconf、automake、openssl、zlib 以及 curl,这样才能保证编译出来的 git 具备大多数的常用功能,因为在 configure 过程中,脚本会检查当前系统上支持的软件和库的可用状况,若某些模块需要的库不存在,那么对应的模块可能并不会被编译,最终 git 也就无法使用这些模块的功能。笔者之前便由于编译出来的 curl 库不支持 https 协议,使得最终编译生成的 git 不支持通过 https 指定的网址进行 git clone 操作,从而为操作带来一定的麻烦。总的来说,通过源码编译软件的方式能够解决问题,但想对来说比较原始和笨拙,故而用户也可以根据自己的情况选择一些替代方案。
用户也可以安装 pip 来进行软件包的安装和管理。pip 的官方安装教程在这里。用户可通过本地下载好 get-pip.py 文件后通过 ftp 传送至远端服务器,也可直接在服务器端通过 wget 或 curl 命令进行下载。在安装过程中,需要指定 --user 命令,设置 pip 安装在本用户目录下。
python get-pip.py --user //进行 pip 的本地安装
对于使用服务器环境进行以 Python 为主的计算和分析任务的情况,用户可安装 Anaconda 来进行相关包的安装和管理,在不具备 root 权限的条件下进行相关的开发和工作。可以直接在本地下载 Anaconda 的安装脚本,并通过 ftp 传送至远端服务器,再通过命令行进行安装过程。Anaconda 官网的安装教程在这里。Anaconda 安装完成后,环境变量 PATH 会增加一项 /Path/to/Anaconda/bin ,该目录位于系统安装的 python 目录之前( /usr/bin ),故而后续使用 python 相关的命令时,运行的都是该目录下包含的 python 工具,其中包含常用的 Python 相关工具包括 python、python3 和 pip 等。
bash /Path/to/Anaconda3-5.3.0-Linux-x86_64.sh //在下载好安装包后,命令行安装 Anaconda3
在安装好上述工具后,即可直接通过上述软件提供的包管理工具进行软件的安装和管理,pip 和 conda 的常用命令记录如下。
pip 的常用命令
pip install package_name //安装 package_name 对应的包 pip uninstall package_name //卸载 package_name 对应的包 pip list //显示所有已安装的包 pip show package_name //显示某个包的详细信息
conda 的常用命令
conda install package_name //安装 package_name 对应的包 conda remove package_name //卸载 package_name 对应的包 conda list //显示所有已安装的包 conda search name //搜索 name 对应的包,name 可为目标包名的一部分 conda update package_name //更新 package_name 对应的包
参考资料:
ask ubuntu - How to add libraries path to the ./configure command?
Linux c 语言头文件搜索路径
Linux系统的头文件和库文件搜索路径
一文解决C程序的编译问题
初学python者自学anaconda的正确姿势是什么??问题-猴子的回答( 记录时为第一个回答 )