[Linux]Packages
Packages
1 software distribution
在计算机系统中,众多软件包如互联网浏览器、文本编辑器和媒体播放器等通过包管理器进行管理。包管理器负责安装并维护系统上的软件。尽管并非所有软件包都通过包管理器安装,直接从源代码安装也是一种常见方式,但大多数情况下,用户依赖包管理器来完成软件的安装。常用的软件包格式包括Debian(.deb)和Red Hat(.rpm)。Debian风格的软件包广泛应用于诸如Debian、Ubuntu、Linux Mint等发行版中;而Red Hat风格的软件包则用于Red Hat Enterprise Linux、Fedora、CentOS等。
软件包可以理解为我们熟知的应用程序,例如Chrome、Photoshop等。实际上,它们是由大量文件编译而成的一个整体。编写这些软件的人或团队被称为上游提供者,他们不仅编写代码,还会编写安装指南。上游提供者致力于开发新软件及更新现有软件。当准备发布时,他们会将软件包提交给包维护者。包维护者负责审核、管理和以软件包的形式分发这些软件,确保最终用户能够获取并使用这些软件。
2 package repositories
软件包通过网络上传后,是如何安装到我们的计算机上的呢?是否需要访问每个软件包的下载页面并手动点击下载和安装?实际上,这种方法是可行的,但存在一种更高效的方式:使用软件包仓库(repositories)。仓库作为软件包的集中存储位置,其中包含了大量软件包,并且这些仓库均位于互联网上,无需传统的安装光盘。然而,计算机需要明确知道这些仓库的位置才能进行访问。
例如,假设希望在计算机上安装WackyWidgets公司的软件。WackyWidgets管理着自己的仓库用于存放其软件包,在这个仓库中有10个软件包,如CoolWidget、SuperWidget等。WackyWidgets在其服务器上托管了该仓库,对应的源链接为:http://download.widgets/linux/deb/。
通过这种方式,不需要访问WackyWidgets的官方网站直接下载软件包,而是让计算机从指定的源链接获取WackyWidgets的软件。
通常情况下,操作系统已经预设了一些可信的软件源,这使得系统能够安装所有基础软件包。在基于Debian的系统中,这些源信息保存在/etc/apt/sources.list
文件中。
3 tar和gzip
archive
archive,比如常见的.rar和.zip文件格式。这些是包含多个文件的单个archive文件,便于存储和传输。
使用gzip进行文件压缩
gzip
是Linux中用于压缩文件的程序,生成的压缩文件通常带有.gz
扩展名。
压缩文件:
1
$ gzip mycoolfile
解压文件:
1
$ gunzip mycoolfile.gz
使用tar创建archive文件
尽管gzip
无法将多个文件合并到一个归档文件中,但tar
命令可以做到这一点。使用tar
创建的归档文件通常带有.tar
扩展名。
创建归档文件:
1
$ tar cvf mytarfile.tar mycoolfile1 mycoolfile2
参数说明:
c
:创建归档。v
:显示处理过程(可选)。f
:指定输出文件名。
解开归档文件:
1
$ tar xvf mytarfile.tar
参数说明:
x
:解压文件。v
:显示处理过程(可选)。f
:指定要解压的文件。
结合tar和gzip进行压缩和解压缩
有时会遇到被压缩的tar文件,如mycompressedarchive.tar.gz
。这时,可以先用gunzip
解除压缩,再用tar
解开归档;或者直接使用tar
命令的z
选项来简化这一过程。
创建压缩的tar文件:
1
$ tar czf myfile.tar.gz [files...]
解压缩并解归档:
1
$ tar xzf file.tar.gz
记住这个简单的助记符:“eXtract all Zee Files!”
其他工具
在使用Linux的过程中,还会遇到其他一些归档和压缩类型,例如bzip2、compress、zip和unzip等。
4 Package Dependencies
在Linux系统中,软件包很少能够独立工作,它们通常需要依赖其他软件包或共享库来正常运行。以一组餐厅为例,尽管每家餐厅制作不同的菜肴,但它们都从同一个农场获取食材。如果这个农场突然停止供应,那么这些餐厅将会陷入困境。
依赖关系的重要性
类似地,在Linux中,软件包依赖于其他软件包或共享库。共享库是程序代码库,其它程序可以使用这些代码而无需自行重写。设想一下,如果每家餐厅都需要自己种植食材,那将是非常低效的。
- 共享库:这些是多个程序可以共同使用的代码库。
缺失依赖导致的问题
如果一个软件包所需的依赖项不存在,该软件包可能无法安装,或者即使安装成功也可能处于损坏状态,无法正常运行。因此,确保所有依赖项的存在对于维护软件环境的稳定至关重要。
5 rpm和dpkg
独立软件包格式
类似于Windows下的.exe文件,Linux系统中有.deb和.rpm格式的单个可执行包文件。通常情况下,通过软件仓库安装软件时不会直接遇到这些文件,但当从网络上直接下载软件包时,最有可能获得的就是这两种格式之一。.deb格式专用于基于Debian的发行版,而.rpm格式则用于基于Red Hat的发行版。
安装与卸载命令
为了安装这些单独的软件包,可以使用dpkg
和rpm
命令:
安装软件包
- Debian系:
$ dpkg -i some_deb_package.deb
- RPM系:
$ rpm -i some_rpm_package.rpm
这里的
i
代表install,也可以使用全写--install
。- Debian系:
移除软件包
- Debian系:
$ dpkg -r some_deb_package.deb
- RPM系:
$ rpm -e some_rpm_package.rpm
Debian系中的
r
表示remove,RPM系中的e
表示erase。- Debian系:
查询与验证
由于dpkg
和rpm
不会自动处理依赖关系,因此在使用这些工具安装软件包之前,需要手动解决所有依赖项问题。这凸显了完整包管理系统的重要性。
此外,还有查询已安装软件包的命令:
Debian系:
$ dpkg -l
RPM系:
$ rpm -qa
在Debian系中,
l
表示list;而在RPM系中,q
表示query,a
表示all。
6 yum和apt
在Linux系统中,包管理系统扮演着至关重要的角色,它们不仅简化了软件的安装、卸载和更新流程,还能够自动处理依赖关系。当前最流行的两大包管理系统分别是适用于Red Hat系列的YUM和专用于Debian系列的APT。
软件包操作命令
使用这些工具进行软件包的操作非常直接:
从仓库安装软件包
- Debian系:
$ apt install package_name
- RPM系:
$ yum install package_name
- Debian系:
移除软件包
- Debian系:
$ apt remove package_name
- RPM系:
$ yum erase package_name
- Debian系:
更新仓库与软件包
为了确保系统的稳定性和安全性,在安装或更新软件包之前,建议首先更新仓库列表,并升级现有软件包至最新版本:
- Debian系:
$ apt update; apt upgrade
- RPM系:
$ yum update
这种做法可以保证您获取到最新的安全补丁和功能改进。
查询已安装软件包信息
了解已安装软件包的详细信息同样重要,这有助于排查问题或确认软件的功能特性:
- Debian系:
$ apt show package_name
- RPM系:
$ yum info package_name
7 编译源码
在Linux系统中,有时会遇到仅以纯源代码形式提供的软件包。为了将这些源代码包编译并安装到系统中,需要执行一系列命令。以下是详细步骤:
安装编译工具
首先,确保系统已安装必要的编译工具。对于基于Debian的系统,可以使用以下命令进行安装:
1 |
|
解压源代码包
通常,源代码包为.tar.gz
格式,使用tar
命令解压缩:
1 |
|
阅读README或INSTALL文件
解压后,查看包内的README或INSTALL文件,因为它们可能包含特定的安装指南。
编译与安装
根据开发者采用的编译方法不同,需要使用的命令也会有所差异,如cmake等。然而,最常见的编译方式是通过make
进行基本编译:
运行配置脚本:检查系统依赖项。
1
$ ./configure
编译源代码:使用Makefile中的规则构建软件。
1
$ make
安装软件包:复制编译后的文件到系统相应位置。
1
$ sudo make install
卸载软件包(如果需要):
1
$ sudo make uninstall
使用checkinstall简化管理
直接使用make install
可能会导致后续难以完全卸载软件包的问题。为了避免这种情况,推荐使用checkinstall
命令,它会在安装过程中生成一个.deb
包,便于日后安装和卸载:
1 |
|