1 ubuntu包管理机制

跟大家分享一下ubuntu的软件管理机制。如果你们有过:

apt-get install 或者 apt-get update 失败的经历。

在众多的apt命令中迷失。

疑惑apt-get update 和 apt-get upgrade 的区别。

想要手动添加源仓库并下载软件

那么本文将带你一步步解决这些问题。

1.1 软件包仓库(Repositories)

1.1.1 sourcelist 文件

在使用apt-get install 和 apt-get update时, 系统会先扫描/etc/apt/目录下的所有的源仓库文件。该目录下包含两种类型的文件,

源仓库文件source.list和gpg秘钥。其中source.list是ubunut官方的源仓库文件。

souce.list文件的结构如下所示,该文件的每一项都可以分成四个部分

deb/deb-src ## URL ## ubuntu版本代号 ## 限定词

  1. 其中 deb-src 表示该项指向一个软件源代码的仓库,deb表示指向一个软件仓库
  2. 第二部分是仓库的URL
  3. 第三部分是版本代码,可以看到在我的ubuntu18.04上(代号bionic), 有bionic 和 bionic-updates 两种选项,其中updates表示,

    更新时使用的仓库。我猜测在apt-get update时应该读取的是该项。
  4. 最后一个部分,有几个选项:main,restricted,universe,multiverse。 它们分别表示了仓库的不同类型。ubuntu的软件的来源进行了严格的区分。
    • main : 表示由Canonical提供支持的免费开源的软件
    • universe : 表示由Ubuntu社区提供支持的免费开源的软件
    • restricted : 具有知识产权的设备专有驱动,比如英伟达自己开发的闭源驱动
    • multiverse : 受版权和法律保护的软件

1.1.2 软件仓库的结构

以vscode的ubuntu仓库为例,我们来看看一个完整的仓库是什么模样。

可以看到目录分成了两级,dists中存放的是该软件的配置信息。这些信息以文本形式保存。包含了软件的大小,

维护者信息,版本,软件运行于那些平台,还有软件的校验和保证软件的完整性。当然最重要的还有软件的deb文件的存放路径。

库中另一类文件是库中的公钥文件(gpg文件)。 通过这种非对称的加密手段,可以保证传输过程的安全。

最后就是实际的软件的安装包,这些软件被打包为deb格式存放在pool目录下。

1.1.3 手动添加PPA仓库

在ubuntu中有两种仓库,一种是官方仓库,源文件放在source.list。

为了弥补官方仓库软件数量不足的问题,ubuntu有提出了PPA(Personal Package Archive)仓库,允许第三方发行自己的库供用户下载。

源文件放在 /etc/apt/source.list/目录中,比如说如果是vscode,就是vscode.list。

下面我们说说手动添加PPA仓库的步骤:

1 安装秘钥

安装秘钥有两种方式,手动方式或者使用命令apt-key 命令

apt-key list
apt-key add keyname
apt-key del keyname
apt-key update

手动方式我们需要讲gpg格式的秘钥放置到目录 ** /etc/apt/trusted.gpg/ ** 中去。

通过list命令我们可以看到秘钥已经安装成功。

2 添加源

同样添加源也是两种手段,手动和命令。

在手动方式中,我们先创建一个/etc/apt/source.list.d/<库名>.list文件。然后根据上面说过的格式添加项。

或者使用 add-apt-repository 命令。

手动方式,就如下图中的sh命令所示,按照标准格式生成仓库的源,原则就是apt-get命令必须能够从添加的项中解析出仓库的位置。

所以我建议大家在手动添加源时,先从浏览器中进入url指向的网站,观察软件库的结构,然后再去构造项。

值得注意的是,能够使用add-apt-repository命令安装的必须是在launchpad这个网站上注册过的用户才可以。

至于为什么要这么做,接下来我们来看看PPA

上文提到过通过PPA,开发者可以更便捷的发布自己的软件。其实PPA也可以分成两类,一类在launchpad中注册(算是ubuntu认证的PPA), 另一类是未登记的PPA。

如果按照安全等级排列的话,官方仓库 > 已注册PPA > 未注册PPA。

如果在launchpad中注册过,那么该仓库在launchpad中就有一个用户名,这个用户名就是稍后在add-apt-repository中要用到的。

如下图所示,docker的PPA已经在launchpad中

命令格式

add-apt-repository ppa: [PPA name]

如果我们想添加docker stable ppa的话,就可以使用以下命令

sudo add-apt-repository ppa:docker/stable

以上我们探讨ubuntu的仓库管理机制,主要是如何添加一个PPA仓库。

1.2 upgrade和update的区别

有两个命令,也许我们都用过,但是可能并不了解它们的区别。这两个命令就是:

apt-get update 和 apt-get upgrade

文档中解释的还是比较清楚的,update的作用是读取/etc/apt/source.list,并根据仓库的描述文件去更新索引。

而upgrade是根据source.list文件去安装所有软件的更新,所以在upgrade之前会先执行update命令。

一般我们在手动添加PPA成功后,会按如下步骤去安装相应的软件:

apt-get update
apt-get install <app-name>

所以说只有在你想要更新系统中所有软件时,使用upgrade命令。

参考

https://www.cnblogs.com/beanmoon/p/3387652.html

https://help.ubuntu.com/community/Repositories/Ubuntu

https://code.visualstudio.com/docs/setup/linux

https://woshijpf.github.io/利器/2016/10/23/Ubuntu软件源详解.html

http://man.linuxde.net/apt-key

https://help.ubuntu.com/community/Repositories/Ubuntu#Adding_PPAs

ubuntu包管理机制的更多相关文章

  1. Android包管理机制(二)PackageInstaller安装APK

    前言 在本系列上一篇文章Android包管理机制(一)PackageInstaller的初始化中我们学习了PackageInstaller是如何初始化的,这一篇文章我们接着学习PackageInsta ...

  2. Android包管理机制(一) PackageInstaller的初始化

    前言 包管理机制是Android中的重要机制,是应用开发和系统开发需要掌握的知识点之一. 包指的是Apk.jar和so文件等等,它们被加载到Android内存中,由一个包转变成可执行的代码,这就需要一 ...

  3. 前端工程化 - 剖析npm的包管理机制

    转自https://juejin.im/post/5df789066fb9a0161f30580c 现如今,前端开发的同学已经离不开 npm 这个包管理工具,其优秀的包版本管理机制承载了整个繁荣发展的 ...

  4. Node: 包管理机制

    Node.js 的模块机制可以很好地解决业务代码混乱的难题,但对于第三方模块包,就有些力不从心了,因为第三方模块包分散存放在各地,无法集中式管理.这就需要一个包管理机制,在 Node.js 中,Isa ...

  5. Golang 包管理机制

    Golang 包管理机制 1. 历史 在go1.11之前, 并没有官方的包管理机制(Godep算个半官方), 主流的包管理机制有: GoVendor Glide Godep 在go1.11之后, 官方 ...

  6. 层次分明井然有条,Go lang1.18入门精炼教程,由白丁入鸿儒,Go lang包管理机制(package)EP10

    Go lang使用包(package)这种概念元素来统筹代码,所有代码功能上的可调用性都定义在包这个级别,如果我们需要调用依赖,那就"导包"就行了,无论是内部的还是外部的,使用im ...

  7. ubuntu包管理

    查看某个文件属于哪个包dpkg -S add-apt-repository 包名software-properties-common命令名/usr/bin/add-apt-repository/usr ...

  8. ubuntu12.04软件中心打开错误和 ubuntu 包管理之“:E: 读错误 - read (5: 输入/输出错误) E: 无法解析或打开软件包的列表或是状态文件。”的解决

    执行ubuntu软讲中心时打不开.老是崩溃,从终端也下载不了软件. 执行包管理的update或者search等等会报错: E: 读错误 - read (5: 输入/输出错误) E: 无法解析或打开软件 ...

  9. Ubuntu包管理命令 dpkg、apt和aptitude

    起初GNU/Linux系统中仅仅有.tar.gz.用户 必须自己编译他们想使用的每个程序.在Debian出现之後,人们觉得有必要在系统 中加入一种机 制用来管理 安装在计算机上的软件包.人们将这套系统 ...

随机推荐

  1. CentOS新增硬盘,重新扫描总线

    Centos 新增硬盘以后,系统不能自动进行识别. 1. 由于不知道新增硬盘挂载的位置,可以先查看现有硬盘挂载的适配器. [root@localhost ~]# ls -l /sys/block/sd ...

  2. mianxiangduixiang

    package com.hanqi; public class mianxiang { public static void main(String[]args) { Cat c1 =new Cat( ...

  3. Python学习系列-----第二章 操作符与表达式

    2.1 数学运算和赋值的简便方法 例如: 2.2 优先级 在python中运算符有优先级之分,高优先级的运算符先执行,低优先级的运算符后执行.下面是运算符优先级:(同一行的运算符具有相同的优先级) 2 ...

  4. ajax 请求调用问题

    http://localhost/dev/list 和  http://127.0.0.1/dev/list 最近在架构整体常规通用系统的解决方案,遭遇AJAX请求不执行的问题,刚开始以为Spring ...

  5. 微信小程序支付返回信息为空

    1.昨天公司说要实现微信小程序的支付,于是看了下微信小程序的开发api文档,和之前的app  端以及pc端基本相似:于是让他们把参数改了下,把之前的trade_type 由 app 改成 小程序要求的 ...

  6. Ssh 证书验证登录

    一般使用 PuTTY 等 SSH 客户端来远程管理 Linux 服务器.但是,一般的密码方式登录,容易有密码被暴力破解的问题.所以,一般我们会将 SSH 的端口设置为默认的 22 以外的端口,或者禁用 ...

  7. Linux ->> Chmod命令改变文件/文件夹属性

    简介 chmod命令用于改变linux系统文件或目录的访问权限,控制用户/用户组对文件或目录的访问权限. 用法: 两种用法:1)用字母r(读).w(写).x(执行)表示权限类型:2)用数字表示,4代表 ...

  8. 页面引入(include)方式的研究及性能比较

    1. 应用Html中的框架(iframe) 目前大多数门户网站都应用iframe来进行页面上广告的投放,就是将不同的广告分别应用iframe投放到主页面上,优点是效率高,互不影响,缺点是不符合网页标准 ...

  9. ASP.NET常用内置对象之——Server

    简介 Server对象是HttpServerUtility的一个实例,也是上下文对象context的一个属性,提供用于处理Web请求的Helper方法. 常用成员 一.Server.MapPath() ...

  10. 解决Ubuntu启动错误——kernel panic not syncing vfs unable to mount root fs on unknown-block 0 0 – error

    最近在倒腾Ubuntu,然后想着怎么美化一下界面,于是照着网上的教程整了一下Flatabulous这个软件,然后好像/boot就满了.关机之后再开机就出现了如题所述的错误,无法开机,也无法进入reco ...