首页 > 系统相关 >浅谈Ubuntu中的软件包

浅谈Ubuntu中的软件包

时间:2023-05-08 23:33:55浏览次数:31  
标签:依赖 浅谈 Ubuntu apt 软件包 软件 deb dpkg

1. 前言

还记得大学第一次接触Ubuntu和Linux的时候,觉得用apt安装想要的软件非常方便。但是有时候出现了问题,各种报错,自己又不懂原理,就会非常抓狂。现在稍微理解一点了,故以较为容易理解的方式记录在这里,方便他人。

2. 软件包与包管理器dpkg

Linux里的软件就是一些可执行文件。就像是你自己写个main.c,里面printf("hello world");,然后用gcc编译出来的可执行文件一样。
但是实际上的一个软件不会这么简单,除了可执行文件本体以外,还会有一些库、配置文件、图标资源、文档等。把这些东西打一个包,就是所谓的软件包,例如:

  • 在Debian系的Linux发行版(如Ubuntu、Raspbian、Armbian)中,软件包后缀名是.deb
  • 在RedHat系的Linux发行版(如CentOS、Fedora)中,软件包后缀名是.rpm
  • ...

要安装一个下载好的.deb软件包,可以使用dpkg工具。例如:

sudo dpkg -i   xxxxxx.deb

所谓的安装过程,其实就是根据.deb包里的记述,把这些可执行文件、文档、图标、快捷方式等文件放到它们该在的位置
如何知道一个软件包到底安装了哪些文件,这些文件安装在哪些目录下?可以使用dpkg -L命令,例如:

dpkg -L gcc

要删除一个.deb包,可以使用dpkg -r <package_name>
dpkg的更多使用方式,本文就不多介绍了,可自行搜索。

3. 包管理器apt与包的依赖关系

在Ubuntu中,更多时候我们是使用apt来管理软件包。那么aptdpkg有什么关系和区别?
简单来说,dpkg是一个离线的本地包管理器,在安装软件包时,它只管把文件解压出来并拷贝到对应的目录下;在卸载软件包时,它只管把之前安装的文件从对应的位置删除。也就是说,如果两个软件包内的文件有重复的目录名称,使用dpkg先后安装这两个软件包时,也会直接覆盖,dpkg不会管那么多。
apt是一个“在线”的包管理器,apt的底层其实就是dpkg,但是apt不需要自己提前下好.deb包,它可以从apt源网站直接自动下载.deb包并进行安装。
但是apt的作用不止于此。这要从Unix系统的设计风格讲起,通常,一些软件包不会包含这个软件执行所需要的全部文件,而是尽量去使用其他.deb包提供的.so动态链接库等资源。这样就形成了一个包对另一个包的依赖关系。这样,Unix系统就可以形成全局的一个依赖树,最好是所有库都只保存一份,从而满足了早期Unix程序员大佬们的“洁癖”。
你可以用dpkg -I /path/to/deb来查看一个deb包的依赖信息。

所以,当你用apt安装一个软件时,apt会检查你的电脑上是否有这个包的依赖包,如果缺少的话,apt会帮你把这个包的依赖包也安装好。当你要卸载包时,apt会帮你把当初装的,现在用不到的那些依赖包们也同时卸载掉。

具体来说:

  • sudo apt install <package> 可以安装一个包及其依赖项
  • sudo apt remove <package> 可以卸载一个包,以及用不到的依赖项

再列举一个场景,你从网上下载了一个deb包,使用sudo opkg -i进行安装,但是发现这个deb包有一些依赖项在你的电脑上是缺少的。这时你可以尝试使用sudo apt install --fix-broken来自动安装这个deb包的依赖项。

4. 软件源

Ubuntu官方会维护一个软件包的仓库,apt其实就是从这个仓库下载软件包。你可以使用apt update来把本地的软件包列表与软件源进行同步,然后使用apt upgrade来把本地所有软件更新到最新。在安装想要的软件包之前也执行apt update是一个好习惯。
官方软件源的地址记录在/etc/etc/apt/sources.list中。
如果你觉得访问官方源的速度太慢,也可以选择国内的镜像源,例如阿里、清华、中科大等单位提供的镜像源。
此外,如果官方的软件源没有收录你想要的软件,也可以添加PPA(Personal Package Archives)源,这样你就可以从这些第三方仓库中下载到你想要的软件了。

5. 解决依赖问题

随着Linux的发展,现在各种各样的软件实在是太多了,而且新旧版本不一定兼容。举一个常见的抓狂场景:你想使用A和B两个软件,A和B软件包都依赖C软件包,但是一个依赖1.0版本的C,一个依赖2.0版本的C,互相不兼容,然后apt源下载到的还是1.5版本。
为了解决这个问题,你有好几个选择:

  • 如果A和B都依赖的库文件名不同(例如文件名携带版本号的情况),你可以去Ubuntu源站分别下载到这两个版本的C软件包,然后都用dpkg安装一下即可;
  • 如果A和B都依赖同一路径下的同名但不同版本的库,就麻烦了。A和B你只能留一个,另一个就得拉取源码编译,编译的时候手动指定一个另外的路径来链接对应版本的依赖包;

6.其他软件安装方式

为什么我们比较少见到Windows上出现依赖的问题?因为软件公司们在发布软件安装包的时候,把所有依赖都打包在一起了,从而确保他们的软件能在用户的电脑上能直接运行。从商业上看这种行为确实是合理的,至于浪费了用户的硬盘空间就无所谓了,反正现在2T的SSD也就五六百块钱了。
在Linux上也有这种软件,那就是AppImage,它们打包了所有的依赖库,可以直接运行。牺牲了空间,保证了稳定性。
不过AppImage需要自己从命令行执行,如果是GUI软件的话,每次都要打开命令行运行比较麻烦。为了解决这个问题,可以安装AppImageLauncher.

sudo add-apt-repository ppa:appimagelauncher-team/stable
sudo apt update
sudo apt install appimagelauncher

然后从GNOME桌面Applications菜单中找到appimagelauncher,设置好自己存放AppImage的目录。这些AppImage就会出现在GNOME桌面系统的Applications菜单中了。
类似的思路,也可以使用Docker容器。不精确地讲,容器就像虚拟机,把所有的依赖都准备好,然后把镜像分享给别人,从而确保程序能够运行。当然容器和虚拟机完全不是一个东西,本文不多介绍了。

标签:依赖,浅谈,Ubuntu,apt,软件包,软件,deb,dpkg
From: https://www.cnblogs.com/jayant97/p/17383481.html

相关文章

  • 台式机装Ubuntu 遇到“no root file system is defined”、安装类型上没有“删除直接
    今日,给清华要的两台电脑终于拿到手了(下午拿到的,具体坎坷经历见日报)。开始配环境,主要是三个步骤:1、装Linux2、装网卡和网卡驱动3、装GNU_radio一系列环境(见我上个月虚拟机的操作方案)今天完成了1和2.最恶心的是1.首先报的错误是,norootfilesystemisdefined,确实,但是为什么......
  • 全志A10平板上的ubuntu终极安装版,支持HDMI和平板本机LCD,全新内核硬浮点加速,堪比i3 XP
     这个ubuntu系统仍然是安装在miniSD卡中。与原andorid系统相互独立,构成android/ubunut双系统,原android丝毫不动,工作学习开发可以使用ubuntu。    该款img映像文件来自Linaro 12.06 armhf build项目,目前版本为http://dl.miniand.com/toby_corkindale/linaro-alip-armhf-t4......
  • 浅谈整除分块
    例题一\[\sum_{i=1}^n\lfloor\fracni\rfloor\\\]首先很容易想到直接求解,对于较大的数据,\(O(n)\)做法无法通过。注意到函数\(y=\lfloor\dfracnx\rfloor\)的图像如下:不难发现,随着\(x\)增大,\(y\)单调不增,这说明对于相同值的\(y\)总是分布在同一块区域。这启发我们根......
  • 升级到Ubuntu 22.04后启动网易云音乐失败
    实际上就是运行启动命令/opt/netease/netease-cloud-music/netease-cloud-music.bash报错了,如下:/opt/netease/netease-cloud-music/netease-cloud-music:/opt/netease/netease-cloud-music/libs/libselinux.so.1:noversioninformationavailable(requiredby/lib/x86_64-li......
  • ubuntu20安装nginx支持多站点及代理配置
    上文说到安装mysql、redis、net6及部署应用 GO接着本次配置通过域名访问站点,站点总共分为两个,前端、后端项目为前后端分离,管理包括服务+管理UI,为一个站点,管理UI,放到服务某个文件夹中Web访问为另一个站点。一、安装Nginxsudoapt-getinstallnginx二、增加站点配置文件1......
  • ubuntu14.04 lts 安装freeswitch
    ubuntu14.04lts安装freeswitch:0、安装一堆依赖包。apt-getinstalllibedit-devlibldns-devlibpcre3-devlibspeexdsp-devlibspeex-devlibcurl4-openssl-devlibopus-devlibncurses5-devlibtiff-devlibjpeg-devzlib1g-devlibssl-devlibsqlite3-devbuild-essential......
  • Ubuntu 安装最新版 redis
    可以通过以下步骤在Ubuntu上安装最新版本的Redis:1. 更新软件包索引列表。打开终端并使用如下命令:sudoaptupdate2. 安装Redis依赖项。使用如下命令:sudoaptinstallbuild-essentialtcl3. 下载最新版本的Redis。可以从Redis的官方网站获取最新版本的Redis:wgethttp://d......
  • ubuntu 彻底卸载谷歌浏览器
    在终端中输入下面的命令:sudoaptpurgegoogle-chrome-stable输入你的用户账户密码,也就是你用来登录Ubuntu系统的密码。当你输入密码的时候,屏幕上什么也不会显示。这是Linux系统的正常行为。继续输入密码,完成后按下回车键。此时它会让你确认是否删除GoogleChrome,输入......
  • ESXI运行虚拟机,软件包0CPU耗用高
    1、问题本文不提供具体的问题分析和解决方法,实在是能力问题,仅做个记录前一段时间把我的N5105小主机从PVE换到了ESXI8,开了3个Linux虚拟机,主要运行docker应用。Linux选的mint,带图形化界面(不选择Ubuntu是因为之前使用Ubuntu,会莫名其妙CPU吃满,导致虚拟机卡死,换了mint就再没出现这......
  • ubuntu22.04设置ftp服务
    本来家里的主机是有smb服务的,但是发现存在这样的一个问题:我用苹果手机可以访问smb,但是我使用安卓系统的电视是访问不了的。于是我搜索了一下,问题大概是高版本的smb是不支持低版本的安卓系统的后来我就想安装个ftp服务吧,本来想设置匿名访问的,但是没有设置成功,最后是通过本机登录......