7_基于Debian和Ubuntu的软件包管理

Debian and Ubuntu Based Distros

  1. Linux上的大多数应用程序都是开源的,我们提供了应用程序的源文件,为了在平台上运行它们,我们必须编译源代码或从二进制包安装它。Linux上下文中的二进制包是包含可执行文件的应用程序包,而不是源代码。可执行文件是编译过程的结果。本文将探讨如何使用dpkg管理Ubuntu和其他基于Debian的发行版上的软件应用程序。

  2. Deb是所有基于Debian的发行版使用的安装包格式,实际上这是一个包含其他文件的存档,包括已经编译好了的可执行的应用程序。

    例如,下载一个forlinux 的谷歌浏览器安装包,右键用Archive Manager打开

    img

    我们看到安装包里有三个存档:
    control.tar文件包含有关版本、发布、依赖项等元数据信息。
    data.tar文件包含可执行文件。

    可以使用不同的可用工具从最低级别执行包管理操作,从命令dpkg到apt到图形前端,如Synaptic。

    dpkg为包管理提供底层基础设施,dpkg数据库包含当前系统上已安装软件的列表,它可以与本地.deb包文件一起使用,并且不了解存储库且不解决依赖关系,就像apt一样。

    其他高级工具(如apt)将在幕后调用dpkg。如果你有一个本地下载的应用程序是一个deb文件,你可以使用dpkg安装它。

    dpkg --info命令显示安装包的信息。

    dpkg --info nameofthefile.deb

    dpkg -i安装安装包。

    sudo dpkg -i nameofthefile.deb

    dpkg -i一次安装多个安装包,特别是当多个安装包之间有依赖关系时。

    要获取所有已安装软件包的列表,运行:

    sudo dpkg --get-selections

    系统上安装的程序列表

    或者你想查看package-version架构和简短描述,使用:

    dpkg-query -l | grep name

    查询结果中的前缀 ii 表示所需状态为'安装',数据包状态是'已安装.

    如果你想查看该安装包安装在系统上的所有文件,可以运行:

    dpkg-query -l | grep name
    dpkg -L packagename

    如果你想查看特定文件属于哪个包,请使用大写S选项。

    比如想查看ls属于哪个包:

    which -a ls
    dpkg -S /bin/ls

    coreutils: /bin/ls #可以看到 /bin/ls属于coreutils这个安装包。

    要查看该软件包里的所有其他文件,请运行

    dpkg -L coreutils | less

    ...#我们可以看到这个软件包里包含系统cp、mkdir、rm、touch等核心实用程序。

    要删除已安装的安装包,请运行:

    sudo dpkg -r nameofthepackage

    同时,删除安装的应用,请运行:

    sudo dpkg -P nameoftheAPP

    dpkg是一个低级工具,既不能与存储库一起使用,也不能解决依赖问题,最好使用apt命令。

  3. apt means advanced Package Tool

    在安装应用之前,可用:

    sudo apt update

    该命令不会安装新程序,而会更新索引。

    从远程仓库安装多个应用:

    sudo apt install 应用名称1 应用名称2

    从本地deb文件安装程序,运行:

    sudo apt 文件完整路径.deb

    删除已经安装的文件,不包括配置文件:

    sudo apt remove apache2

    删除包,包括所有配置文件:

    sudo apt purge apache2

    每当在系统安装新的软件包时,软件包依赖项也不会被删除,你可以随时删除这些依赖包。

    删除依赖包:

    sudo apt auotoremove

    默认情况下,Ubuntu将每个已经下载并安装的软件包保存在缓存目录中。

    ls -l /var/cache/apt/archives

    。。。#这个包包含了所有已安装和升级的软件包的目录。

    让我们检测一下它的大小:

    du -sh /var/cache/apt/archives

    。。。
    我们发现这个包非常大,很占空间,如果想删除的话,使用

    sudo apt clean

    它会从该目录中删除除日志文件之外的所有内容。

    列出所有可运行的软件包,运行:

    apt list

    存储库中有数以万计的可用软件包:

    apt list | wc -l

    要搜寻特定包是否可用,请使用grep命令过滤输出,例如:

    apt list | grep postfix

    要查找描述中包含单词或短语的软件包,请在双引号之间的短语中运行

    apt search "transparant proxy"

    要仅仅获取已经安装后的软件包的列表:

    apt list --installed | wc -l

    要查找有关可用或已经卸载软件包的信息,下载大小及其内容的描述,运行:

    apt show 包名

    还有一些图形包管理器,其中一些是aptitude或者synaptic,他们以用户友好的方式安装、升级和删除软件包。

  4. 接着,让我们了解一下源代码编译安装软件包有什么好处。

    源代码方式和二进制包是软件包的两种形式。二进制包里面包括了已经经过编译,可以马上运行的程序。你只需要下载和解包(安装)它们以后,就马上可以使用。源代码包里面包括了程序原始的程序代码,需要在你的计算机上进行编译以后才可以产生可以运行程序,所以从源代码安装的时间会比较长。

    从源代码编译的一个优点是您可以使用某些选项编译应用程序,而这些选项可能在标准分发包中丢失或禁用。

    从源代码编译的另一个优点是您可以访问最新版本,因为分发者启动二进制包分发需要时间。

    从源代码编译的另一个优点是可以轻松安装同一个程序的多个版本。

    从源代码编译的缺点是,包管理器完全不知道你安装了软件,所以必须手动更新或删除这些软件包,而且操作较复杂,容易破坏系统,这意味着你必须从官方下载源代码,检查其完整性,并解决任何依赖问题。

  5. 接着让我们学习如何从源代码编译安装软件包。(Source Compilation Guide)

    为了能够编译源代码,你需要GNU Compiler Collection(GCC),它是C、C++和Objective-c的编译器和库的集合。

    默认的Ubuntu存储库包含一个名叫build-essential的包,其中包含编译器和许多库,以及编译软件所需的其他实用程序。

    sudo apt update && sudo apt install build—essential

    这实际上会安装许多其他软件包,包括gcc、g++和make。make 是用于构建实用程序源文件的集合,并将它们转换为最终产品。

    我们将从编译单个C源文件开始,然后编译更复杂的应用程序。用C创建一个基本的HELLO应用程序。使用vim创建一个扩展名为.c的文件

    然后用gcc编译该.c文件,即可生成目标文件。

    gcc hello.c -o hello

    现在我们编译一个服务器,以ProFTPd(专业的FTP守护程序)为例。

    编译程序的第一步是获取其源代码。这是对每个用户都开放的。

    第二步是检查文件的完整性,特别是如果你将其安装在生产服务器上。你可以通过检查其哈希或数字签名来做到这一点。

    检查哈希值可以通过以下命令:

    md5sum 文件名.tar.gz #md5是哈希加密算法

    解压到目录

    tar -xzvf 文件名.tar.gz

    在当前目录中创建了一个包含服务器源代码的新目录:

    cd 解压后的文件名/

    服务器的源代码保存在src/里

    ls src/

    这里放着许多后缀名为.c的文件

    解压后的文件名/目录下还放着一个 configure 文件,该文件会检查您正在编译的程序的要求和依赖关系是否得到满足。它可以配置程序的编译方式,决定启动哪些选项以及哪些选项不会启动。

    例如,如果您没有安装gcc编译器或者缺少所需的库,然后配置将显示错误。对问题进行故障排除并再次运行配置,直到没有错误为止。如果configure抛出任何错误,请不要继续编译过程。这个脚本有很多选项来控制程序的编译方式;了解其选项,运行./configure --help帮助。另外,建议将配置运行为非特权用户,并且仅作为root用户完成过程的最后一步。

    运行:

    ./configure --help

    它显示了很多输出,将它传递到less以便可以浏览输出

    ./configure --help | less

    --prefix 将指定软件的安装位置目录,如果你不使用此选项,应用程序文件将转到标准/bin、/usr/bin、/etc等目录,并覆盖任何相同的文件名,这可能破坏你的系统,我的建议是始终使用前缀选项。

    如何将某些功能编译或不编译到最终的产品中呢?

    例如:

    在该文件中搜索 /ssl

    其中一个选项叫启用SSL,默认是NO。这意味着如果不指定此选项,将在不支持SSL的情况下编译FTP服务器,所以它不支持加密连接。

    如果你希望它支持SSL,那么给这个选项来配置。这适用于任何其它选项。

    ./configure --prefix=/opt/proftpd #建议那些被编译且不受包管理器控制的程序被安装在一个目录中。

    常见错误一般是缺少依赖包。

    当没有错误时,下一步是 runmake命令,这是将构建您的应用程序的GNU实用程序。这意味着它将收集源文件和元数据并将它们转换为最终的产品,它通过多次调用GCC编译器来进行真正的编译。

    编译程序make将使用当前目录中名为Makefile的文件。

    此文件是由上一步的配置中生成的,包含有关最终产品的详细信息。

    执行 make可以看到make多次调用gcc编译文件。

    如果编译遇到问题,则在控制台抛出错误,它们通常是致命的。尝试解决它们,运行make clean,然后再次make

    当没有报错时,所有需要的二进制文件都被编译成功。

    接着运行命令:

    sudo make install

    这将创建安装软件的目录,在本例中为/opt/proftpd 。

    接着我们不需要这些源代码了,删除它们:

    rm -rf 源代码所在的文件夹/*

    试着在前台运行一下proftpd,使用-n选项:

    sudo ./proftpd -n

    上述过程也可以缩略为一条命令:

    sudo ./configure --prefix=/opt/proftpd && make && sudo make install

    如果以上的命令链没有错误,它会一直正常执行下去。

    这是一套标准的编译指南,适用于大多数知名应用程序,然而有些应用程序需要以自定义的方式编译,在这种情况下,你必须获得程序的文档,它通常是源目录里名为install或readme的文件。

posted @   lyyyuanfang  阅读(77)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 因为Apifox不支持离线,我果断选择了Apipost!
· 通过 API 将Deepseek响应流式内容输出到前端
点击右上角即可分享
微信分享提示