Linux下的安装与sudo

167 阅读3分钟

软件安装概述

在 Linux 上,软件的安装方法通常有 3 种:

  • 源码编译安装(如 make、cmake)
  • 包管理工具(如 apt-get、yum)
  • 虚拟环境与容器(如 conda、docker)

源码编译安装

  1. 下载源代码
  2. 解压源代码
  3. 配置源代码,生成构建文件
  4. 根据构建文件对源代码进行编译
  5. 安装编译后的程序,将编译后的程序安装到指定目录

make 具体步骤

# 生成 Makefile 文件,配置安装路径(默认'/usr/local')
./configure --prefix=/usr/local/proj
​
# 根据 Makefile 进行编译,生成二进制文件
make
​
# 将编译生成的文件复制到系统目录
sudo make install

cmake 具体步骤

# 通常会在源码目录外单独创建一个构建目录
mkdir build && cd build
​
# 配置项目并指定安装路径
cmake ../source_code -DCMAKE_INSTALL_PREFIX=/path/to/install
​
# 编译项目
make
​
# 安装编译后程序
sudo make install

包管理工具

  • apt-get 用于管理 .deb 包,yum 用于管理 .rpm

  • update:从配置的源服务器上获取软件包的最新列表,更新本地的包索引数据库

  • install package_name:从包索引数据库中查找所需的软件包及其依赖项,下载并安装到系统目录中

    • 可执行文件通常放在 /usr/bin/usr/local/bin
    • 库文件通常放在 /usr/lib/usr/local/lib
    • 配置文件通常放在 /usr/etc
    • 共享资源文件通常放在 /usr/share

虚拟环境与容器

conda

  • 安装路径:默认安装在用户主目录下(如 {HOME}/anaconda3

  • 安装包过程:

    • conda create -n env_name:在 {HOME}/anaconda3/envs/env_name 下创建一个新的环境。

    • conda install package_name:在该环境中安装软件包

      • 可执行文件: {HOME}/anaconda3/envs/env_name/bin
      • 库文件: {HOME}/anaconda3/envs/env_name/lib
  • 指定安装的路径

    • 方法1:修改 ~/.condarc 配置文件

      envs_dirs:
         - /path/to/new/envs/dir
      pkgs_dirs:
         - /path/to/new/pkgs/cache/dir
      
    • 方法2:--prefix

      • 创建环境

        • conda create -p /opt/env/.conda/envs/env_name
      • 激活环境需要指定绝对路径

        • conda activate /opt/env/.conda/envs/env_name
      • 删除环境同样需要 -p 指定路径

      • 安装软件包到指定目录

        • conda install --prefix /path/to/directory package_name
  • Conda 使用环境变量进行环境间的隔离

Docker

  • /var 目录通常用于存储可变的数据,特别是会在系统运行期间发生变化的数据。

    • 日志文件 (/var/log): 系统和应用程序生成的日志文件
    • 缓存文件 (/var/cache): 临时缓存文件,应用程序可以在这里存储临时数据
    • 锁文件 (/var/lock): 锁文件,用于指示某些资源被占用
    • 临时文件 (/var/tmp): 临时文件,类似于 /tmp 目录,但通常具有较长的保存时间
    • 数据库文件 (/var/lib): 应用程序使用的数据库文件
  • 由于 Docker 的运行会涉及到大量的可变数据,所以通常在 /var 目录下进行操作

    • /var/lib/docker:Docker 的主要数据目录,存储所有 Docker 对象(如镜像、容器、卷和网络)的数据
    • /var/run/docker:存储 Docker 运行时的相关文件

环境变量概述

export 命令

export 命令用于在当前 shell 会话中设置或修改环境变量

export PATH=/usr/local/bin:$PATH
# 上述命令将 /usr/local/bin 添加到 PATH 环境的开头,确保系统优先查找该目录下的可执行文件

常见环境变量

  • PATH:定义系统查找可执行文件的路径

    export PATH={HOME}/local/bin:$PATH
    
  • LIBRARY_PATH:用于编译时,定义编译器到哪些目录寻找库文件

    export LIBRARY_PATH=/path/to/compile-time/libraries:$LIBRARY_PATH
    
  • LD_LIBRARY_PATH:用于运行时,定义动态链接器到哪些目录寻找动态库

    export LD_LIBRARY_PATH=/path/to/runtime/libraries:$LD_LIBRARY_PATH
    
  • CMAKE_PREFIX_PATH:是 CMake 使用的一个环境变量,用于指定额外的搜索路径以查找依赖和包,可以 export 一些自定义安装的库和文件

    export CMAKE_PREFIX_PATH=/path/to/cmake/search/path:$CMAKE_PREFIX_PATH
    

没有 sudo 权限下的安装方法

为什么需要 sudo

  • 安装编译后的程序需要将编译后的程序安装到指定目录,许多系统目录(如 /usr/bin, /usr/local/bin, /etc 等)只有 sudo 有写权限。
  • 没有 sudo 权限时,尝试将文件复制到系统目录会导致权限错误,从而导致安装失败

通用解决方案逻辑

  1. 指定一个有权限的目录进行安装

    • 使用配置选项(如 --prefixCMAKE_INSTALL_PREFIX
  2. 更新环境变量

    • 将编译产生的 binlib 目录添加到系统环境变量中,使得系统可以找到可执行文件与库文件

具体场景下的解决示例

使用 make 安装

./configure --prefix={HOME}/local
make
make install
​
export PATH={HOME}/local/bin:$PATH
export LD_LIBRARY_PATH={HOME}/local/lib:$LD_LIBRARY_PATH

使用 cmake 安装

mkdir build && cd build
cmake ../source_code -DCMAKE_INSTALL_PREFIX={HOME}/local
make
make install 
​
export PATH={HOME}/local/bin:$PATH
export LD_LIBRARY_PATH={HOME}/local/lib:$LD_LIBRARY_PATH

使用 apt-get 安装(未实践,仅作为参考)

# 创建本地包目录
mkdir -p {HOME}/local/var/lib/apt/lists
mkdir -p {HOME}/local/var/cache/apt/archives
mkdir -p {HOME}/local/etc/apt/sources.list.d
​
# 设置本地环境
export APT_CONFIG={HOME}/local/etc/apt/apt.conf
# 创建 apt.conf 配置文件:在 {HOME}/local/etc/apt/apt.conf 中写入
Dir {
    State "{HOME}/local/var/lib/apt/";
    Cache "{HOME}/local/var/cache/apt/";
    Etc "{HOME}/local/etc/apt/";
}
# 使用 fakeroot 安装软件包
fakeroot apt-get -o Dir::State={HOME}/local/var/lib/apt -o Dir::Cache={HOME}/local/var/cache/apt -o Dir::Etc::SourceList={HOME}/local/etc/apt/sources.list -d install package_name
# 更新环境变量
export PATH={HOME}/local/bin:$PATH
export LD_LIBRARY_PATH={HOME}/local/lib:$LD_LIBRARY_PATH

使用 yum 安装(未实践,仅作为参考)

# 创建本地包目录
mkdir -p {HOME}/local/var/lib/yum
mkdir -p {HOME}/local/var/cache/yum
mkdir -p {HOME}/local/etc/yum.repos.d
​
# 设置本地环境
export YUM_ROOT={HOME}/local
# 创建 yum.conf 配置文件:在 {HOME}/local/etc/yum.conf 中写入
[main]
cachedir={HOME}/local/var/cache/yum
keepcache=0
debuglevel=2
logfile={HOME}/local/var/log/yum.log
reposdir={HOME}/local/etc/yum.repos.d
# 使用 fakeroot 安装软件包
fakeroot yum --installroot={HOME}/local --releasever=/ install package_name
# 更新环境变量
export PATH={HOME}/local/bin:$PATH
export LD_LIBRARY_PATH={HOME}/local/lib:$LD_LIBRARY_PATH