概括
如何让 apt-get 优先选择本地存储库软件包,而不是从官方存储库再次下载相同版本的软件包?本地存储库已签名且受信任。我们已经尝试过 apt 首选项优先级。
最初的问题是:“如何在不使用 sources.list 文件的情况下为本地存储库分配最高优先级”
我已经设置了一个本地存储库,其中包含我下载的软件包。当我需要重新安装 Ubuntu 时,我使用它来避免通过互联网下载相同的软件包。这是一个使用 创建的基本存储库apt-ftparchive packages . > Packages
。我将其设置为受信任的存储库,以避免出现“未经身份验证的存储库”警告。(当你有一个不受信任的存储库,apt
或者synaptic
尝试通过互联网下载相同的软件包时,因为它是受信任的)。
我已经使用这个本地存储库至少 1 年了。但是我必须始终将本地存储库行放在文件顶部sources.list
才能使用它。但这很烦人,因为每次重新安装 Ubuntu 时我都必须打开终端并在其上进行一些输入,尽管有一个更好的工具software-properties-gtk
。我无法使用此工具,因为它将源代码行放在“sources.list”的末尾。
还有真正的问题问题是,apt
或者 synaptic
总是从前面提到的源下载包,而不检查本地存储库中是否已经有包。所以,我别无选择,只能将本地源放在sources.list
终端的顶部(我其实并不讨厌终端,但我需要一个解决方案)。
我努力了此方法。但这对我没有帮助。
我的偏好文件是这样的/etc/apt/preferences.d/local-pin-900
Package: *
Pin: release o=Local,n=ubuntu-local
Pin-Priority: 900
我的发布文件是这个
Origin: Local
Label: Local-Ubuntu
Description: Local Ubuntu Repository
Codename: ubuntu-local
MD5Sum:
ed43222856d18f389c637ac3d7dd6f85 1043412 Packages
d41d8cd98f00b204e9800998ecf8427e 0 Sources
当我启用 apt-preference 时,它会apt-cache policy
正确显示首选项,例如,它显示本地存储库具有最高优先级。
但当我这样做时sudo apt-get install <package-name>
,apt
尝试从互联网下载它。但当我将本地存储库放在顶部时,它会从本地存储库安装。
所以,我的问题是 ->“当软件包在本地存储库中可用时,是否可以强制 apt 使用本地存储库,而无需将“本地源”明确放在存储库列表的顶部(例如 sources.list 文件)?'
编辑:的输出apt-cache policy $package_name
如下
鹦鹉螺擦拭: 已安装:(无) 候选:0.1.1-2 版本表: 0.1.1-2 0 500 http://archive.ubuntu.com/ubuntu/precise/universe i386 软件包 900 文件:/media/Main/Linux-Software/Ubuntu/Precise/ 软件包
它表明我的本地存储库具有更高的优先级,尽管它不是sources.list
文件中第一个出现的存储库。
以下是输出apt-get install nautilus-wipe
正在读取软件包列表...完成 构建依赖关系树 正在读取状态信息...完成 将会安装以下新软件包: 鹦鹉螺擦拭 升级了 0 个,新安装了 1 个,删除了 0 个,并且未升级 131 个。 需要获取 30.7 kB 的档案。 此操作后,将使用150 kB的额外磁盘空间。 “http://archive.ubuntu.com/ubuntu/pool/universe/n/nautilus-wipe/nautilus-wipe_0.1.1-2_i386.deb” nautilus-wipe_0.1.1-2_i386.deb 30730 MD5Sum:7d497b8dfcefe1c0b51a45f3b0466994
它仍在尝试从互联网获取文件,但我认为它应该对本地文件感到满意。
按照 mediageek 的建议使用“”或 localhost 的结果
使用 localhost 没有效果。但是“”有,但与我的方法没有什么不同
Package: *
Pin: origin ""
Pin-Priority: 1001
我在发布问题之前就使用过它们。但我再次尝试了这个(为了确保万无一失)。结果相同。apt-cache policy
显示我的本地存储库确实具有最高优先级。但当我尝试安装时,它说“需要获取 XXX/XXX KB 的存档”。
答案1
简短的回答是:
APT 首选项文件 /etc/apt/preferences 可用于控制将选择哪些版本的软件包进行安装。
这是文件/etc/apt/preferences
,用于apt-get
决定当单个包有多个版本时应选择哪个版本。这样,来自本地存储库的任何包都将优先于其他包。
包裹: * 引脚:原点“” 引脚优先级:1001
这不会控制版本,而是控制如果两个包具有相同版本时的源首选项。如果需要为同一个包分配最高优先级版本在您的本地存储库中,将它们列在文件顶部/etc/apt/sources.list
>
回答原始问题:
如何在不使用 sources.list 文件的情况下为本地存储库分配最高优先级?
如果不使用文件,就无法为本地存储库分配最高优先级sources.list
。如果您想为本地存储库分配最高优先级,则必须将它们放在“sources.list”的顶部。
这个问题的总结性回答:
如何让 apt-get 优先选择本地存储库软件包,而不是从官方存储库再次下载相同版本的软件包?本地存储库已签名且受信任。我们已经尝试过 apt 首选项优先级。
使用该/etc/apt/sources.list
文件,您需要将本地存储库行放在该文件的顶部。如下所示。
deb cdrom:[Kubuntu 12.04 LTS _Precise Pangolin_ - 发布 i386 (20120424)]/ precise main restricted deb 文件:/media/Main/Precise-Debs-New / deb 文件:/media/Main/Linux-Software/Ubuntu/Precise / deb http://archive.ubuntu.com/ubuntu 精确主宇宙受限多元宇宙 deb-src http://archive.ubuntu.com/ubuntu 精确宇宙主多元宇宙受限#由软件属性添加 # deb cdrom:[Xubuntu 12.04 LTS _Precise Pangolin_ - Release i386 (20120423.1)]/ 精确主多元宇宙受限宇宙 # deb cdrom:[Ubuntu 12.04 LTS _Precise Pangolin_ - Release i386 (20120423)]/ precise main restricted # deb http://archive.canonical.com/ubuntu 精准合作伙伴 # deb-src http://archive.canonical.com/ubuntu 精准合作伙伴 # deb http://extras.ubuntu.com/ubuntu 精确主 # deb-src http://extras.ubuntu.com/ubuntu 精确的主要
是的,“apt_preference”与选择无关实例具有相同版本的软件包。这里的重点是,您不能使用/etc/apt/preference
文件强制选择/使用.deb
本地存储库中的文件,方法是将最高优先级分配给本地存储库。该文件(首选项)用于选择特定版本,而不是相同版本的特定实例(.deb 文件)。对于后一种情况,您需要使用/etc/apt/sources.list
上述方法的文件。
解释:
看来我们都误解了apt_preference
目的,apt_preference 手册在前三段中描述了这一点!!
APT 首选项文件 /etc/apt/preferences 可用于控制将选择哪些版本的软件包进行安装。
当 sources.list(5) 文件包含对多个发行版(例如稳定版和测试版)的引用时,软件包的多个版本可能可供安装。APT 为每个可用版本分配优先级。根据依赖性约束,apt-get(8) 选择优先级最高的版本进行安装。APT 首选项文件默认覆盖 APT 为软件包版本分配的优先级,从而让用户可以控制选择哪个版本进行安装。
最重要的是第三段
当 sources.list(5) 文件包含对多个源的引用时,同一版本的软件包可能会有多个实例可用。在这种情况下apt-get(8) 下载 sources.list(5) 文件中最早列出的实例。APT 首选项文件不会影响实例的选择,只会影响版本的选择。
这些斜体字是我做的
让我们通过一个例子来看一下:
我有精确的版本compiz-fusion-plugins-extra
,但为了演示我禁用了它
这是文件/etc/apt/preferences
,用于apt-get
决定当单个包有多个版本时应该选择哪个版本。(在这个例子中,compiz-fusion-plugins-extra
有多个版本。)
包裹: * 引脚:原点“” 引脚优先级:1001
该文件表示apt-get
从本地存储库安装所有在不同的存储库中存在多个版本的软件包。
换句话说,如果我的本地存储库中有xapps
一个带有版本的包,并且这个相同的包在 Precise 的存储库中存在更高的版本,比如说,则会优先选择本地存储库中的版本,即版本。1.0
xapps
2.0
apt-get
1.0
这是我的/etc/apt/sources.list
文件
deb http://archive.ubuntu.com/ubuntu 精确主宇宙受限多元宇宙 deb-src http://archive.ubuntu.com/ubuntu 精确宇宙主多元宇宙受限#由软件属性添加 deb http://security.ubuntu.com/ubuntu/ 精确安全宇宙主多元宇宙受限 deb http://archive.ubuntu.com/ubuntu precise-updates 宇宙 主 多元宇宙 受限 deb http://archive.ubuntu.com/ubuntu precise-backports 宇宙 主 多元宇宙 受限 # deb http://archive.canonical.com/ubuntu 精准合作伙伴 #deb-src http://archive.canonical.com/ubuntu 精准合作伙伴 # deb http://extras.ubuntu.com/ubuntu 精确主 # deb-src http://extras.ubuntu.com/ubuntu 精确的主要 deb 文件:/media/Main/Linux-Software/Ubuntu/Oneiric /#这是 oneiric 存储库。 deb 文件:/media/Main/Linux-Software/Ubuntu/Natty/natty / deb 文件:/media/Main/Linux-Software/Ubuntu/Natty/kubuntu/ deb 文件:/media/Main/Linux-Software/Ubuntu/Natty/natty_new /
尽管我在文件前面列出了精确的存储库,但它不会导致apt-get
从该存储库中选择包。如手册中所述
APT 首选项文件不会影响实例的选择,只会影响版本的选择。
因此,该命令的输出apt-cache policy compiz-fusion-plugins-extra
与预期一致,如下所示
anwar@edubuntu-lenovo:/etc/apt$ apt-cache 策略 compiz-fusion-plugins-extra compiz-fusion-插件-extra: 已安装:(无) 候选版本:0.9.5.94-0ubuntu1 / **选择较低版本作为优先级** / 版本表: 0.9.7.0~bzr9-0ubuntu6 0 500 http://archive.ubuntu.com/ubuntu/precise/universe i386 软件包 0.9.5.94-0ubuntu1 0 1001 文件:/media/Main/Linux-Software/Ubuntu/Oneiric/软件包 0.9.4-0ubuntu3 0 1001 文件:/media/Main/Linux-Software/Ubuntu/Natty/natty/ 软件包
这里,候选版本是0.9.5.94-0ubuntu1
(位于本地存储库中),而不是 (0.9.7.0~bzr9-0ubuntu6 0
位于 precises 的存储库中)。尽管 precises 的版本在文件中首先列出sources.list
。
将本地存储库设置为最高优先级后apt-get
尝试安装的示例运行。compiz-fusion-plugins-extra
anwar@edubuntu-lenovo:~$ sudo apt-get install compiz-fusion-plugins-extra 正在读取软件包列表...完成 构建依赖关系树 正在读取状态信息...完成 以下软件包已自动安装并且不再需要: x11-应用程序 x11-xfs-实用程序 xinit x11-会话-实用程序 libfs6 使用“apt-get autoremove”来删除它们。 将会安装以下额外的软件包: compiz-核心 compiz-插件-默认 compiz-插件-额外 compiz-插件-main-default libdecoration0 xserver-xorg-core xserver-xorg-video-intel 建议的软件包: compizconfig-设置管理器 xfonts-100dpi xfonts-75dpi 下列软件包将被删除: compiz compiz-gnome compizconfig-后端-gconf edubuntu-桌面 libcompizconfig0 ubuntu-desktop unity xorg xserver-xorg xserver-xorg-input-all xserver-xorg-input-evdev xserver-xorg-input-鼠标 xserver-xorg-input-synaptics xserver-xorg-input-vmmouse xserver-xorg-输入-wacom xserver-xorg-视频-all xserver-xorg-视频-ati xserver-xorg-video-cirrus xserver-xorg-video-fbdev xserver-xorg-video-geode xserver-xorg-video-mach64 xserver-xorg-video-mga xserver-xorg-video-neomaic xserver-xorg-video-nouveau xserver-xorg-video-openchrome xserver-xorg-video-qxl xserver-xorg-video-r128 xserver-xorg-video-radeon xserver-xorg-video-s3 xserver-xorg-video-savage xserver-xorg-video-siliconmotion xserver-xorg-video-sis xserver-xorg-video-sisusb xserver-xorg-video-tdfx xserver-xorg-video-trident xserver-xorg-video-vesa xserver-xorg-video-vmware 将会安装以下新软件包: compiz-fusion-插件-extra compiz-插件-extra 以下软件包将被降级: compiz-核心 compiz-插件-默认 compiz-插件-主默认 libdecoration0 xserver-xorg-core xserver-xorg-video-intel 0 个升级,2 个新安装,6 个降级,37 个删除,698 个未升级。 需要获取 0 B/5,772 kB 的档案。 此操作后将释放8,294 kB 磁盘空间。 您想继续 [Y/n] 吗?
奇怪!!!它正在尝试降级已经安装的 compiz 包,以精确解决与新选择的compiz-fusion-plugins-extra
!!! 的依赖关系(与 Oneiric 的匹配)。
更危险的是,它试图删除图形驱动程序包(xserver-xorg-....)以避免与新的编译冲突。
(可能,如果我的本地存储库中也有它们,他们可能会安全地想要降级。但由于这些包通常已安装,我没有下载它们,所以不在本地存储库中,因此出现此结果)。
结论:因此,/etc/apt/preferences
如果您在本地系统中有完整的存储库,则仅建议使用本地存储库。
如果许多存储库中存在同一版本的多个实例(.deb 文件),该怎么办?
apt_preference
手册中有描述
当 sources.list(5) 文件包含对多个源的引用时,同一版本的软件包可能会有多个实例可用。在这种情况下,apt-get(8) 会下载 sources.list(5) 文件中最早列出的实例。
文件用例示例/etc/apt/preferences
:
apt-get
强制选择自定义存储库中可用版本(而不是 Ubuntu 标准存储库)的一个例子可能是“Linux Mint”发行版。他们使用此自定义preference
文件。
包裹: * 密码:release o=linuxmint Pin 优先级:700 包裹: * 密码:origin packages.linuxmint.com Pin 优先级:700 包裹: * 引脚:release o=Ubuntu Pin 优先级:500
这实际上导致他们在存储库中有软件包时提供软件包。但如果没有,他们就会使用 Ubuntu 的标准存储库。
apt-get
将本地存储库设置为最高优先级后运行的示例
我只是想kubuntu-desktop
通过 Ubuntu 安装包来测试 KDE。(我忘了,我已经使用/etc/apt/preference
文件设置了首选项)。我有一个 kubuntu-12.04-alternate-installer 的 iso,所以我认为我可以使用它。
(正确将 iso 设置为存储库源后),我运行了
sudo apt-get install kubuntu-desktop
,然后惊讶地看到下面的输出。
anwar@edubuntu-lenovo:~$ sudo apt-get install kubuntu-desktop 正在读取软件包列表...完成 构建依赖关系树 正在读取状态信息...完成 某些软件包无法安装。这可能意味着您有 请求一个不可能的情况,或者如果你正在使用不稳定 发行版中某些必需的软件包尚未创建 或已移出传入。 以下信息可能有助于解决该情况: 以下软件包具有未满足的依赖关系: kubuntu-desktop :依赖:language-selector-kde 但是它将不会被安装 推荐:amarok 但不会安装 推荐:apturl-kde 但不会安装 推荐:gdebi-kde 但不会安装 推荐:gpgsm 但不会安装 推荐:ibus-qt4 但无法安装 推荐:jockey-kde 但不会安装 推荐:kdegraphics-strigi-plugins,但它不会被安装 推荐:kdepim-wizards 但不会安装 推荐:kpackagekit 但不会安装 推荐:libreoffice-kde 但不会安装 推荐:libreoffice-style-oxygen 但不会安装 推荐:network-manager-pptp-kde,但它不会被安装 推荐:plasma-widget-facebook 但不会安装 推荐:plasma-widget-kimpanel,但它不会被安装 推荐:usb-creator-kde 但不会安装 E:无法纠正问题,您持有破损的包裹。
我对结果感到惊讶。突然我记起来,我已经设置了一个偏好(写下这个答案)将/etc/apt/preference
我的本地存储库设置为最高优先级。
因此,我运行了这个:apt-cache policy kubuntu-desktop
,输出如下:
anwar@edubuntu-lenovo:~$ apt-cache 策略 kubuntu-desktop kubuntu 桌面: 已安装:(无) 候选:1.222.1kde47~ppa2 版本表: 1.254 0 500 cdrom://Kubuntu 12.04 LTS _Precise Pangolin_ - 发布 i386 (20120424)/ precise/main i386 软件包 500 http://archive.ubuntu.com/ubuntu/ precise/main i386 软件包 1.222.1kde47~ppa2 0 1001 文件:/media/Main/Linux-Software/Ubuntu/Natty/natty/ 软件包 1.222.1 0 1001 文件:/media/Main/Linux-Software/Ubuntu/Natty/natty/ 软件包 1.222 0 1001 文件:/media/Main/Linux-Software/Ubuntu/Natty/kubuntu/ 软件包
在此输出中,我们看到“cdrom”和“precise main repository”都有版本号1.254,而本地存储库有版本1.222.1kde47~ppa2,即较低版本。尽管在 sources.list 文件中,它们被放置在本地包之前,但本地包具有优先权。
为了明确地看到apt-get
确实尝试从本地安装,我运行synaptic
并得到了这个,这表明,Apt 系统考虑1.222.1kde47~ppa2作为要安装的候选版本。
也apt-cache policy kubuntu-desktop
展示同样的东西
anwar@edubuntu-lenovo:~$ apt-cache 策略 kubuntu-desktop kubuntu 桌面: 已安装:(无) 候选:1.222.1kde47~ppa2 版本表: 1.254 0 500 cdrom://Kubuntu 12.04 LTS _Precise Pangolin_ - 发布 i386 (20120424)/ precise/main i386 软件包 500 http://archive.ubuntu.com/ubuntu/ precise/main i386 软件包 1.222.1kde47~ppa2 0 1001 文件:/media/Main/Linux-Software/Ubuntu/Natty/natty/ 软件包 1.222.1 0 1001 文件:/media/Main/Linux-Software/Ubuntu/Natty/natty/ 软件包 1.222 0 1001 文件:/media/Main/Linux-Software/Ubuntu/Natty/kubuntu/ 软件包
为了解决这个问题,我/etc/apt/preference
通过 删除了该文件sudo rm /etc/apt/preference
。
然后再次运行此程序apt-cache policy kubuntu-desktop
,只看到这个预期的输出。
anwar@edubuntu-lenovo:~$ sudo rm /etc/apt/preferences anwar@edubuntu-lenovo:~$ sudo apt-cache policy kubuntu-desktop kubuntu 桌面: 已安装:(无) 候选人:1.254 版本表: 1.254 0 500 cdrom://Kubuntu 12.04 LTS _Precise Pangolin_ - 发布 i386 (20120424)/ precise/main i386 软件包 500 http://archive.ubuntu.com/ubuntu/ precise/main i386 软件包 1.222.1kde47~ppa2 0 500 文件:/media/Main/Linux-Software/Ubuntu/Natty/natty/ 软件包 1.222.1 0 500 文件:/media/Main/Linux-Software/Ubuntu/Natty/natty/ 软件包 1.222 0 500 文件:/media/Main/Linux-Software/Ubuntu/Natty/kubuntu/ 软件包
再次运行此操作,sudo apt-get install kubuntu-desktop
查看以下输出:
.........删除了不必要的细节......... 升级了 0 个,新安装了 213 个,删除了 0 个,并且未升级 150 个。 需要获取 0 B/89.6 MB 的档案。 此操作后,将使用269 MB的额外磁盘空间。 您想继续 [Y/n] 吗?
您可以查看完整结果这里
那么我对解释部分就非常确定了。