软件安装概述
在 Linux 上,软件的安装方法通常有 3 种:
- 源码编译安装(如 make、cmake)
- 包管理工具(如 apt-get、yum)
- 虚拟环境与容器(如 conda、docker)
源码编译安装
- 下载源代码
- 解压源代码
- 配置源代码,生成构建文件
- 根据构建文件对源代码进行编译
- 安装编译后的程序,将编译后的程序安装到指定目录
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 权限时,尝试将文件复制到系统目录会导致权限错误,从而导致安装失败
通用解决方案逻辑
-
指定一个有权限的目录进行安装
- 使用配置选项(如
--prefix或CMAKE_INSTALL_PREFIX)
- 使用配置选项(如
-
更新环境变量
- 将编译产生的
bin和lib目录添加到系统环境变量中,使得系统可以找到可执行文件与库文件
- 将编译产生的
具体场景下的解决示例
使用 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