>> >> >> Reference << << << <<<<<<Ref>>>>>>
linux software download and install
Update: 2026-01-14

Linux上软件的下载与安装

从源码安装

从源码下载编译安装软件包是Linux系统中常见的操作,尤其是当需要安装某个没有预编译包或需要自定义配置的软件时,很多开源软件默认新版本源代码就是给Linux系统提供的新版本
但是从源码安装没有统一的方式,它由三个方面共同决定

  1. 时代差异 不同年代的软件,诞生在不同的工具环境中
年代主流方式
90s./configure && make install
00sautotools/手写 Makefile
10scmake/meson
10s+language-native build (cargo/go/npm)

不可能要求一个1998年的C程序,像2024年的Rust项目一样安装

  1. 语言生态决定构建方式
语言主流源码安装
Cautotools/cmake/meson
C++cmake
Rustcargo
Gogo install
Pythonpip/setup.py/poetry
Javagradle/maven
Lualuarocks
  1. 作者的哲学 有的项目README巨详细,install一步到位;有的项目README很冷,默认你懂

统一的思维模型

虽然步骤不同,但源码安装背后只有一个不变的模型:
源码 -> 构建 -> 产物 -> 安装

checklist

任何的新项目,可以根据这个checklist来

  1. 看README/INSTALL 找关键词
    • build
    • install
    • dependencies
    • requirements
  2. 识别构建系统类型 它是语言生态驱动,还是通用工具构建
特征判断
有 Cargo.tomlcargo
有CMakeLists.txtcmake
有 configure.acautotools
有 meson.buildmeson
有Makefilemake
  1. 安装依赖 源码安装80%的失败,都在依赖阶段

  2. 构建(只编译,不安装)

make 
cargo build 
cmake --build 

确认产物是否生成

二进制文件

如果下载的是二进制文件,已经经过编译可以直接运行或安装,节省了编译时间,但可能需要根据文件类型和系统环境进行不同的操作\

.tar.gz.tar.ba2压缩包

这类文件通常包含编译好的二进制文件、库文件以及其他资源文件,适用于大多数Linux系统
首先需要解压文件

tar -xzvf <file_name>.tar.gz
tar -xjvf <file_name>.tar.gz

查看解压后的目录
解压后,需要查看该文件的文件结构,通常会有一个包含二进制文件的文件夹

查找可执行文件
在解压后的目录中,通常会有一个或多个可执行文件
或者在某些情况下,bin目录中会存放可执行文件\

运行二进制文件

./<executable_file_name>

将二进制文件放到系统路径中
为了方便使用,可以将二进制文件移动到一个目录中,该目录已包含在PATH环境变量中(如usr/local/bin)\

sudo mv <executable_file_name> /usr/local/bin/

这样,就可以在终端中直接通过命令名运行它,而不必每次都进入目录

.deb文件

如果下载的是.deb文件(Debian包),它是专门为Debian系列发行版(如Ubuntu)设计的二进制包,安装过程类似于通过包管理工具安装软件

安装.deb文件
使用dpkg命令安装.deb

sudo dpkg -i <package_name>.deb

解决依赖问题
如果安装过程中提示缺少依赖项,可以使用apt修复依赖

sudo apt install -f

.AppImage文件

AppImage是一种便携式二进制格式,允许应用在不同的Linux发行版上运行,而无需安装。通常AppImage文件包含所有依赖项,运行时无需联网

运行.AppImage文件
首先,确保文件具有执行权限

chmod +x <file_name>.AppImage

然后直接运行

./<file_name>.AppImage

.AppImage文件放到系统路径中可以更方便地运行

wget

wget是一个常用的命令行工具,用于从网络上下载文件。它支持HTTP、HTTPS和FTP协议,能够递归下载、支持断点续传、代理设置等功能,非常适合用来批量下载或在无图形界面的环境下下载文件

wget <URL>

这个命令会将指定的URL地址上的文件下载到当前目录

wget -O new_filename.zip https://example.com/file.zip
wget -i urls.txt
wget --limit-rate=200k <URL>

k表示KB/s ,可以选择不同的单位如m

wget -r -l 2 <URL>

这将递归下载深度为2的文件

wget -r -A jpg <URL>

-A表示允许的文件类型,可以指定多个类型
-R表示禁止的文件类型

wget -S <URL>
wget -e use_proxy=yes -e http_proxy=http://proxy.example.com:8080 https://example.com/file.zip

-e use_proxy=yes开启代理
-e http_proxy设置代理服务器地址和端口

包与包管理器(Common Summary)

Linux的包管理器是一套工具,用来安装、更新、卸载、查询软件包,并自动处理依赖关系(别的软件库和工具)。它是Linux发行版的“软件中枢”,决定了系统如何获取和维护软件

包的概念

“包”是软件的分发单位,通常是一个压缩文件,里面包含:

不同发行版的包格式不同:

前端与后端

包管理器通常分为两层

工作流程

一个典型的安装过程

  1. 用户执行命令,例如sudo apt install vim
  2. 前端去软件源(repository)下载对应的.deb
  3. 自动解析依赖关系,下载所有包
  4. 调用底层工具(如dpkg)安装,并更新系统数据库

依赖(dependency)

在Linux中,依赖指的是一个软件包在运行时需要其他软件包提供的功能或库文件。换句话说,一个软件包可能需要其他软件包的支持才能正常运行
依赖通常分为以下几种类型:

  1. 直接依赖(Direct Dependency) 这是最常见的依赖关系。某个软件包需要另一个软件包的功能才能正常运行

  2. 间接依赖(Indirect Dependency) 间接依赖是指通过其他包间依赖的库或工具。例如,软件A直接依赖软件B,而软件B又依赖软件C,那么软件A就间接依赖软件C

  3. 推荐依赖(Recommends) 这是一个建议的依赖项。某个软件包可能运行没有问题,即使缺少推荐的软件包,但如果安装了推荐的软件包,通常会改善软件的功能或用户体验。例如,某些软件的推荐依赖可能是图形界面包,而不是命令行版本

  4. 建议依赖(Suggests) 建议依赖是一个软依赖,表示一个包可以运行,但如果安装了他所建议的软件包,可能会使得功能更加完整或增强

  5. 增强依赖(Enhances) 增强依赖是某个软件包功能的增强。当你安装某个包时,可能有额外的软件包来增强其功能。此时,增强依赖项的包是可选的,但如果有这些增强包,它们能够提升某个软件的功能

  6. 冲突(Confilicts) 冲突表示两个软件包不能一起安装。例如,两个软件包提供相同的功能或修改了相同的文件,这时安装其中一个会导致另一个无法正常工作

  7. 替代(Replaces) 当一个软件包替代另一个软件包时,这意味着可以用新包来代替旧包,通常会卸载旧包并安装新包

  8. 依赖关系的生命周期

依赖管理的重要性

依赖的问题

解决依赖问题

现代的包管理系统(如APT)会尽量避免依赖地狱,通过智能算法自动解决版本和冲突问题

软件源

APT 的“源”指的是软件仓库(Software Repository),这些仓库是存储在互联网服务器上的集合,里面包含了大量的软件包(.deb文件)及其元数据(如版本、依赖关系等)。

源的组成和位置

1. 源列表文件(Sources List)

Ubuntu 从以下文件中知道服务器的地址

cat /etc/apt/sources.list
2. 源的格式
deb http://archive.ubuntu.com/ubuntu noble main restricted universe multiverse
deb http://security.ubuntu.com/ubuntu noble-security main restricted universe multiverse

源的种类和来源

  1. 官方源 (Official Repositories) 由 Canonical (Ubuntu 背后的公司) 维护。
  1. 镜像源 (Mirrors) 为了缓解主服务器的压力并提供更快的下载速度,全球各地有很多大学、机构或公司搭建了镜像源。
  1. 第三方源 (Third-Party Repositories) 除了官方软件,还有很多软件开发者维护着自己的 APT 源。

高阶玩法

Ubuntu基于Debian系,软件包管理工具主要是APT系列(Advanced Package Tool)。可以把它理解为“Linux的应用商店 + 包管理器”

核心概念

Ubuntu软件包管理命令

APT(推荐,现代用法)

APT命令是APT前端工具,比aot-get更人性化,交互信息更友好

sudo apt update
sudo apt upgrade
sudo apt full-upgrade
sudo apt install <包名>
sudo apt remove <包名>
sudo apt purge <包名>
sudo apt autoremove
sudo apt clean
apt search <关键词>
apt list --upgradable
apt show <package_name>
sudo apt policy <package_name>
sudo apt upgrade --without-new-pkgs
sudo apt --fix-broken install

apt-get(老牌工具,脚本里常见)

apt-get功能更底层、更全面。常用命令和apt类似,输出没有apt美观,但功能更全

apt-cache(包信息查询)

专门用来查找和查看包信息

新系统使用apt search/show就足够了,apt-cache更偏底层

dpkg(更底层,直接操作.deb包)

dpkg是Debian和基于Debian的Linux发行版(如Ubunt)中的一个低级包管理工具,主要用于安装、卸载、查询和管理.deb格式的软件包

sudo dpkg -i package.deb
sudo dpkg -r <包名>
dpkg -l | grep <包名>

如果需要知道某个软件包中包含那些文件,并且确认包的安装状态,可以使用

dpkg -L <包名>
dpkg -s <包名>
dpkg -S <文件路径>

如果dpkg -i报依赖错误,再用sudo apt -f install自动修复依赖

dpkg -c <package_name>.deb 
dpkg --configure -a 

该命令将会配置所有尚未完成配置的包

dpkg依赖问题

dpkg本身不处理依赖关系,因此如果在安装.deb包时遇到缺少依赖项,dpkg只会提示错误。此时,需要手动安装缺少的依赖包

  1. 安装依赖问题 如果在安装某个.deb包时遇到类似dependency problems的错误,可以先使用以下命令尝试修复依赖问题
sudo apt-get install -f 

这个命令会自动查找缺失的依赖并安装他们。apt-get会解析依赖关系,下载并安装缺少的包 2. 强制安装 如果不想解决依赖问题,或者希望强制安装一个.deb包(通常不建议)

sudo dpkg -i --force-all <package_name>.deb
dpkg与apt-get的关系

dpkg是Debian系列发行版的底层包管理工具,它直接操作.deb文件。而aptapt-get是高层包管理工具,它依赖于dpkg来安装和管理包,但同时也处理包的依赖关系
通常,我们使用apt-getapt来安装、更新、卸载包,因为它们会自动处理依赖关系。但有时你会直接使用dpkg,比如在下载来.deb文件后手动安装,或者在没有网络连接的环境中操作

dpkg常见的错误和解决方法
sudo apt-get install -f 

或者使用dpkg --configure -a来重新配置未完全安装的包

sudo dpkg --configure -a 

Snap

Snap是一种由Canonical (Ubuntu母公司)开发的Linux软件包管理系统。它提供了一种标准化的软件分发和安装方式,使得开发者能够创建跨不同Linux发行版运行的应用程序。Snap包将应用及其所有依赖项打包在一起,因此可以避免因不同发行版的库版本差异而引起的兼容性问题。Snap包的最大特点之一就是他的容器化特性,使得应用与系统其他部分分隔运行,从而提高安全性

Snap的主要特点
  1. 跨发行版兼容性 Snap包是跨平台的,可以在不同的Linux发行版上安装和运行(如Ubuntu、Debian、Fedora、Arch Linux等)。这使得开发者只需要维护一个包,而无需为每个发行版分别打包

  2. 容器化应用 Snap包通过容器化技术将应用和它的所有依赖一起打包。每个Snap包都在自己的沙盒环境中运行,与其他应用和系统环境相隔离。这增强了系统的安全性,因为即使应用存在漏洞,它也无法轻易访问系统的其他部分

  3. 自动更新 Snap包具有自动更新功能,系统会在后台自动下载并安装应用的最新版本。更新是增量的,意味着只有在应用程序或其依赖发生变化时才会下载新内容,从而节省带宽和存储

  4. 回滚支持 如果某个更新引入了问题,Snap包允许用户回滚到先前的版本。每次更新都会保存一个备份,用户可以轻松恢复到更稳定的版本

  5. 隔离性和沙盒 Snap包在自己的沙盒中运行,因此它不能直接访问系统的其他文件和资源。Snap包和外部资源的访问都可以通过权限系统控制,确保应用程序的安全性

  6. 一次构建,多平台支持 与传统的.deb.rpm包相比,Snap包让开发者能够只为一次构建提供支持,自动适配不同的Linux发行版。开发者只需要将应用及其所有依赖打包成一个Snap文件,而不必针对不同平台进行多次打包

Snap包的组成

一个Snap包通常包含以下几部分

snap find <关键词>
sudo snap install <包名>
sudo snap refresh <包名>
sudo snap revert <包名>
sudo snap remove <包名>
snap list
sudo snap install <包名> --channel=<channel_name>

有些新软件(如chromium)只提供snap包,不再提供apt包

Snap的优势
  1. 跨发行版支持:Snap包可以在不同的Linux发行版上运行,简化了开发者的工作,不需要为每个发行版维护不同的包
  2. 自动更新:Snap可以自动更新,确保应用始终是最新版本,减少了手动管理和更新的麻烦
  3. 容器化与沙盒:应用被打包称一个独立的单元,具有更好的安全性和隔离性,减少了与系统其他部分的依赖和影响
  4. 回滚支持:如果新版本有问题,可以方便地回滚到先前的稳定版本
劣势
  1. 较大的磁盘占用:由于Snap包包含应用程序和所有依赖项,安装的Snap包可能会比传统的包占用更多的磁盘空间
  2. 启动较慢:Snap包可能启动较慢,因为它们需要在容器中运行,并且可能需要加载更多的依赖项
  3. 不完全兼容某些系统资源:虽然Snap旨在提供跨发行版支持,但它并不完美,有些特性可能无法在某些系统中完美运行
  4. 权限控制:Snap包的沙河特性要求通过权限管理控制应用与系统资源的交互,有时可能会限制某些功能,导致应用无法执行某些操作

总结与工作流程

当执行sudo apt update时,APT 工具会:

  1. 读取 /etc/apt/sources.list 和 /etc/apt/sources.list.d/* .list 中的所有源地址。
  2. 连接到这些地址对应的服务器。
  3. 下载服务器上的元数据文件(如 Packages.gz),并存储到本地 /var/lib/apt/lists/ 目录。这些元数据包含了服务器上所有软件包的列表、版本、依赖等信息。
  4. 建立本地软件数据库。之后执行 apt search, apt install 等操作时,APT 都是在查询这个本地数据库,而不是上网去搜。 所以,APT 的源就来自这些遍布全球的、由官方、镜像站以及第三方开发者维护的软件仓库服务器。sources.list 文件就是告诉系统该去哪些服务器的清单