浅谈Ubuntu中的软件包
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
来管理软件包。那么apt
和dpkg
有什么关系和区别?
简单来说,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中的软件包的更多相关文章
- 浅谈Java中的equals和==(转)
浅谈Java中的equals和== 在初学Java时,可能会经常碰到下面的代码: 1 String str1 = new String("hello"); 2 String str ...
- 浅谈Linux中的信号处理机制(二)
首先谢谢 @小尧弟 这位朋友对我昨天夜里写的一篇<浅谈Linux中的信号处理机制(一)>的指正,之前的题目我用的“浅析”一词,给人一种要剖析内核的感觉.本人自知功力不够,尚且不能对着Lin ...
- 浅谈Java中的对象和引用
浅谈Java中的对象和对象引用 在Java中,有一组名词经常一起出现,它们就是“对象和对象引用”,很多朋友在初学Java的时候可能经常会混淆这2个概念,觉得它们是一回事,事实上则不然.今天我们就来一起 ...
- 浅谈Java中的equals和==
浅谈Java中的equals和== 在初学Java时,可能会经常碰到下面的代码: String str1 = new String("hello"); String str2 = ...
- 转【】浅谈sql中的in与not in,exists与not exists的区别_
浅谈sql中的in与not in,exists与not exists的区别 1.in和exists in是把外表和内表作hash连接,而exists是对外表作loop循环,每次loop循环再对内表 ...
- 浅谈iOS中的userAgent
浅谈iOS中的userAgent User-Agent(用户代理)字符串是Web浏览器用于声明自身型号版本并随HTTP请求发送给Web服务器的字符串,在Web服务器上可以获取到该字符串. 在公司产 ...
- 浅谈JavaScript中的闭包
浅谈JavaScript中的闭包 在JavaScript中,闭包是指这样一个函数:它有权访问另一个函数作用域中的变量. 创建一个闭包的常用的方式:在一个函数内部创建另一个函数. 比如: functio ...
- 浅谈sql中的in与not in,exists与not exists的区别
转 浅谈sql中的in与not in,exists与not exists的区别 12月12日北京OSC源创会 —— 开源技术的年终盛典 » sql exists in 1.in和exists ...
- 浅谈Java中的深拷贝和浅拷贝(转载)
浅谈Java中的深拷贝和浅拷贝(转载) 原文链接: http://blog.csdn.net/tounaobun/article/details/8491392 假如说你想复制一个简单变量.很简单: ...
- 浅谈Java中的深拷贝和浅拷贝
转载: 浅谈Java中的深拷贝和浅拷贝 假如说你想复制一个简单变量.很简单: int apples = 5; int pears = apples; 不仅仅是int类型,其它七种原始数据类型(bool ...
随机推荐
- 外部H5唤起常用小程序链接规则整理
概述 我目前工作是全职做小程序开发,所负责的小程序需要发布抖音+快手+微信+支付宝四端,年底了,公司准备做一波营销活动,营销活动更好传播的话首选H5活动营销页,这就需要考虑怎么把用户从H5页面引入到我 ...
- Spring Cloud Alibaba实战,从微服务架构到基本服务配置
https://blog.csdn.net/itcast_cn/article/details/124558887 Spring Cloud Alibaba 实战 1目标理解什么是微服务架构理解什么是 ...
- linux安装软件配置
CentOS7更换yum为阿里源 1 备份本地源mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backu ...
- 学Shiro完结版-3
第八章 拦截器机制--<跟我学Shiro> 8.1 拦截器介绍 Shiro使用了与Servlet一样的Filter接口进行扩展:所以如果对Filter不熟悉可以参考<Servlet3 ...
- rpm与dpkg
基本介绍 "dpkg "是"Debian Packager "的简写.为 Debian 专门开发的套件管理系统,方便软件的安装.更新及移除.所有源自Debian ...
- WordPress产品导入后内容出现乱码,以及附属一些别的功能
效果图如下 该插件附带了一个可以把产品描述里面的超链接给去掉,以及有的产品图片点击会在地址栏上面显示图片的路径,在该插件可以进行关闭,并且替换成一个模态窗,还有对产品邮费展示进行了处理,到金额到达包邮 ...
- 记一次DAC转换功能修改的解决
最近的项目捣鼓msp430需要用到dac转换以输出模拟信号,项目代码是接手前同事的 有些地方调试不通,以前没有接触过msp430芯片,更是没搞过这种芯片io口时序驱动层的东西,甚至纯c的都是头一次作为 ...
- Q:oracle备份表语句
oracle备份还原表语句 方法1.sql语句(同一数据库服务器) 备份 create table xxx_temp as select * from xxx; 还原 truncate table x ...
- FLink16--计数窗口--CountWindiwApp
一.依赖 https://www.cnblogs.com/robots2/p/16048648.html 二.代码 概念:窗口来多少条计算一次,存在滚动和滑动两种情况 package net.xdcl ...
- Hetao P3804 Cut 题解 [ 蓝 ] [ AC 自动机 ] [ 差分 ]
Cut:AC 自动机简单题. 思路 看见多个模式串以及求前缀,很显然能想到构建一个 AC 自动机. 那么在用 \(T\) 查询时,当前指针的深度就是该位置的最长前缀匹配长度.这个在字典树 insert ...