Linux 下无 Root 权限编译软件

Northword2020年11月21日
  • Install
  • linux
大约 6 分钟

Linux 下无 Root 权限编译软件

参考:linux 非 root 用户安装软件入门 | tlanyan.meopen in new window .

下为上文的备份。


下面是 Linux 下非 root 用户安装软件的一般流程:

  1. 获取源代码;常用 wget/curl 下载,也可以用类似 apt-get source 的方式获取仓库中软件源代码;
  2. 解压源代码安装包;例如对于 gzip 格式的 tar 包:tar -zxvf xxx.tar.gz
  3. 切换到解压后的目录,运行 ./configure;./configure --help 可以列出配置项,非 root 用户最重要的配置项是安装目录 prefix,例如 ./configure --prefix=/path/to/bin。在无法自动找到依赖库位置的情况下,用 --with-xx-dir=xxx 的形式配置依赖库位置;
  4. 编译源代码并复制可执行文件到指定的安装目录:make && make install。这两条命令可以分开执行,make 时指定 -j 参数并行编译,能显著减少编译耗时(单进程编译 GCC 需要几个小时,开启并行编译后可缩短到十几分钟);
  5. 使用 export PATH=/path/to/bin:$PATH 更新 PATH 变量。命令行窗口运行此命令只对本次会话中有效,可将其写到.bashrc 或者.bash_profile 中;
  6. 如果安装的是动态链接库,则需要更新动态链接库路径:export LD_LIBRARY_PATH=/path/to/library:$LD_LIBRARY_PATH。最好将此命令写在.bashrc 文件中,用户下次打开会话时自动执行。

windowsopen in new window 转移到 Linuxopen in new window 的用户刚开始会有各种不适,因使用习惯水土不服而放弃 Linux 的不在少数。还没有领略到 Linux 的美好就退却,对于这类人只能说可惜。还有部分人在个人电脑上用 Linux,总体感觉还不错;切换到工作时只能使用无特权的普通账户,会遇到“没 root 权限 -> 出现问题 -> 找答案 -> 提示用 root”的死循环,于是感到沮丧和抓狂。本文主要面向对象第二类人,简要介绍没有 root 权限时,安装软件的步骤和操作。

许多人都非常熟悉 Windows,毫无疑问 windows 是目前桌面操作系统的王者。随着高富帅和土豪种群的增长,Mac OSopen in new window 的份额也逐步提升。无论是 windows 还是 Mac OS,用户接触的都是图形界面(Graphical User Interface,GUI)。转向 Linux 之后,大部分人会优先使用带图形界面的系统作为过渡。比如本人最开始使用 Ubuntu,熟悉后才慢慢转向 CentOS 和 Fedora。许多优秀的 Linux 桌面图形发行版,如 Debian/Ubuntu/Mint,Fedora,OpenSUSE 等,图形界面华美,桌面体验良好,可以给 Windows 用户很好的过渡。这些 Linux 系统基本都开源且可免费使用(支持服务可能要付费),是 Linux 入门级操作系统的首选。

Windows 上安装软件相当傻瓜化,下载 exe 后双击运行,点击鼠标一直 next 就完事。安装过程中,小白用户一般不会看引导页面种的内容(估计字都认识,连在一块不知道什么意思),附带安装其他软件或者对系统做了额外改动也毫不知情。当有人(一般是女生)说电脑开机后反应很慢/失去响应,过去一看电脑上瑞星、360、金山毒霸、腾讯安全管家等各种软件都在右下角托盘刷着存在感。对于这种情形,只能表示理解,进入安全模式把不用的软件都卸载掉,电脑基本上就正常了。

回到 Linux 安装软件,情况稍有不同。首先是软件一般从软件仓库中获取,即现在熟悉的应用市场;再次基本上用命令行安装软件,不是双击安装包(Mac OS 可以这样做)。所以熟悉命令行安装软件,是迈向 Linux 世界基础的一步。幸运的是 linux 上又 apt/yum/dnf 等简单好用的软件包管理工具,能自动解决软件包之间的依赖问题,让用户一行命令就获取到所需软件。例如安装 g++,执行 sudo apt-get install g++sudo yum install -y gcc-c++ 即可。

然而有些软件是有源代码,因为版权、无人维护等原因不在软件仓库中,apt-get/yum/dnf 的安装方式就行不通,只能从源码编译。这便需要先下载源代码,解压(大多数不能点右键解压),然后按照说明文档 make && make install。不管是从软件仓库,还是手工编译源代码的方式,对有 root 权限的用户问题都不大。倒霉的是没有 root 权限,还不得不安装某些软件才能正常工作的普通账号。这些普通账号需要额外的软件或依赖库时,该如何自救解脱?

因为无法安装的原因是权限限制,故而有必要先了解一下 Linux 中文件和用户的权限。对任意一个文件(Linux 下一切皆文件,包括目录、CPU 内存等设备),可以使用 ls -l 查看其权限。命令的每行首列输出类似 (d|-)rwxrwxrwx,这就是文件的权限标志。第一个字母是文件类型,d 表示目录,- 表示普通文件,s 套接字,l 链接文件,等等;接下来有 9 列,每 3 列一组,总共 3 组,对应文件属主 (owner)、属主组员 (group) 和其他用户 (other) 对该文件的权限。每组的标志类似 rwx。rwx 是读 (read),写 (write) 和执行 (execute) 三种权限的缩写。如果没有某种权限,对应标志位是 -。例如某个文件 foo.txt,只有属主可读写,其权限标志就是:-rw-------。注意,非 root 用户下,文件夹必须要有执行(x)权限才能进入。

再看用户的权限。root 用户是 bug,电脑上所有的文件都是它的,权限位设置对其无效。非 root 用户默认 只对家目录有完全的控制权限,对/tmp 目录有读写的权限。/tmp 目录如其名,应该只在其中存放临时性文件,该目录在系统重启时会被清空。/var、/usr、/bin、/opt 等常见文件夹及子目录,几乎所有用户都能访问其中的文件和内容,执行可执行程序,但只有 root 用户和属主有写入的权限

了解完权限,再看普通账户安装软件困难的原因。大部分软件默认安装路径是 /usr/bin/usr/local/bin,安装时需要将可执行文件复制到这些目录下。普通用户没有目录的写权限,于是提示无权限导致安装失败。切换到 root 模式后,一切又都好使了。根据普通账号的权限,可以得出结论:非 root 用户,(几乎)只能安装软件到家目录下。