简短回答:
APT首选项文件/etc/apt/preferences可用于控制安装时选择的软件包版本。
这是文件/etc/apt/preferences,apt-get使用它来决定如果有多个版本的单个软件包,应选择哪个版本。通过这种方式,任何来自本地仓库的软件包都将优先于其他软件包。
Package: *
Pin: origin ""
Pin-Priority: 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_ - Release i386 (20120424)]/ precise main restricted
deb file:/media/Main/Precise-Debs-New /
deb file:/media/Main/Linux-Software/Ubuntu/Precise /
deb http://archive.ubuntu.com/ubuntu precise main universe restricted multiverse
deb-src http://archive.ubuntu.com/ubuntu precise universe main multiverse restricted #Added by software-properties
# deb cdrom:[Xubuntu 12.04 LTS _Precise Pangolin_ - Release i386 (20120423.1)]/ precise main multiverse restricted universe
# deb cdrom:[Ubuntu 12.04 LTS _Precise Pangolin_ - Release i386 (20120423)]/ precise main restricted
# deb http://archive.canonical.com/ubuntu precise partner
# deb-src http://archive.canonical.com/ubuntu precise partner
# deb http://extras.ubuntu.com/ubuntu precise main
# deb-src http://extras.ubuntu.com/ubuntu precise main
而且,“apt_preference”与选择具有相同版本的软件包的“实例”无关。这里的重点是,您不能使用“/etc/apt/preference”文件来强制选择/使用来自本地存储库的.deb文件,并将最高优先级分配给本地存储库。该文件(preference)用于选择特定版本,而不是相同版本的特定实例(.deb文件)。对于后一种情况,您需要使用上述方法中提到的“/etc/apt/sources.list”文件。
解释:
看起来我们都误解了apt_preference
的目的,apt_preference手册在前三段中对此进行了描述!
APT首选项文件/etc/apt/preferences可用于控制选择安装哪个版本的软件包。
当sources.list(5)文件包含对多个发行版(例如stable和testing)的引用时,可能有多个软件包版本可供安装。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
有几个版本。
Package: *
Pin: origin ""
Pin-Priority: 1001
这个文件告诉apt-get
对于所有在不同仓库中存在多个版本的软件包,从本地仓库安装。
换句话说,如果我在我的本地仓库中有版本为1.0
的软件包xapps
,而且这个相同的软件包xapps
在精确版本的仓库中有更高的版本,比如2.0
,apt-get
将优先选择本地仓库的版本,即版本1.0
。
这是我的/etc/apt/sources.list
文件
deb http://archive.ubuntu.com/ubuntu precise main universe restricted multiverse
deb-src http://archive.ubuntu.com/ubuntu precise universe main multiverse restricted #Added by software-properties
deb http://security.ubuntu.com/ubuntu/ precise-security universe main multiverse restricted
deb http://archive.ubuntu.com/ubuntu precise-updates universe main multiverse restricted
deb http://archive.ubuntu.com/ubuntu precise-backports universe main multiverse restricted
# deb http://archive.canonical.com/ubuntu precise partner
#deb-src http://archive.canonical.com/ubuntu precise partner
# deb http://extras.ubuntu.com/ubuntu precise main
# deb-src http://extras.ubuntu.com/ubuntu precise main
deb file:/media/Main/Linux-Software/Ubuntu/Oneiric / #this is oneiric repository.
deb file:/media/Main/Linux-Software/Ubuntu/Natty/natty /
deb file:/media/Main/Linux-Software/Ubuntu/Natty/kubuntu /
deb file:/media/Main/Linux-Software/Ubuntu/Natty/natty_new /
尽管我在文件中早些时候列出了precise的存储库,但这并不会导致apt-get从该存储库选择软件包。正如手册中所述,
引用:
APT首选项文件不影响实例的选择,只影响版本的选择。
所以,命令
apt-cache policy compiz-fusion-plugins-extra
的输出如下所示:
anwar@edubuntu-lenovo:/etc/apt$ apt-cache policy compiz-fusion-plugins-extra
compiz-fusion-plugins-extra:
已安装: (无)
候选版本: 0.9.5.94-0ubuntu1 / **选择较低版本作为优先级** /
版本表:
0.9.7.0~bzr9-0ubuntu6 0
500 http://archive.ubuntu.com/ubuntu/ precise/universe i386 Packages
0.9.5.94-0ubuntu1 0
1001 file:/media/Main/Linux-Software/Ubuntu/Oneiric/ Packages
0.9.4-0ubuntu3 0
1001 file:/media/Main/Linux-Software/Ubuntu/Natty/natty/ Packages
在这里,候选版本是
0.9.5.94-0ubuntu1
(位于本地存储库中),而不是
0.9.7.0~bzr9-0ubuntu6 0
,后者位于precise存储库中。尽管precise的版本在
sources.list
文件中排在第一位。
一个示例运行的
apt-get
尝试在将最高优先级设置为本地仓库后安装
compiz-fusion-plugins-extra
。
anwar@edubuntu-lenovo:~$ sudo apt-get install compiz-fusion-plugins-extra
正在读取软件包列表... 完成
正在构建依赖关系树
正在读取状态信息... 完成
以下软件包是自动安装的,现在不再需要:
x11-apps x11-xfs-utils xinit x11-session-utils libfs6
使用 'apt-get autoremove' 命令来移除它们。
将会安装下列额外的软件包:
compiz-core compiz-plugins-default compiz-plugins-extra
compiz-plugins-main-default libdecoration0 xserver-xorg-core
xserver-xorg-video-intel
建议安装的软件包:
compizconfig-settings-manager xfonts-100dpi xfonts-75dpi
将会删除下列软件包:
compiz compiz-gnome compizconfig-backend-gconf edubuntu-desktop
libcompizconfig0 ubuntu-desktop unity xorg xserver-xorg
xserver-xorg-input-all xserver-xorg-input-evdev xserver-xorg-input-mouse
xserver-xorg-input-synaptics xserver-xorg-input-vmmouse
xserver-xorg-input-wacom xserver-xorg-video-all xserver-xorg-video-ati
xserver-xorg-video-cirrus xserver-xorg-video-fbdev xserver-xorg-video-geode
xserver-xorg-video-mach64 xserver-xorg-video-mga xserver-xorg-video-neomagic
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-plugins-extra compiz-plugins-extra
以下软件包将会降级:
compiz-core compiz-plugins-default compiz-plugins-main-default
libdecoration0 xserver-xorg-core xserver-xorg-video-intel
升级了 0 个软件包,新安装了 2 个软件包,降级了 6 个软件包,移除了 37 个软件包,有 698 个软件包未被升级。
需要下载 0 B/5,772 kB 的归档文件。
在此操作之后,将释放 8,294 kB 的磁盘空间。
是否继续执行 [Y/n]?
奇怪!!!它正在尝试将已安装的precise compiz软件包降级以解决依赖关系(与Oneiric的匹配),并选择新的compiz-fusion-plugins-extra!!!
更危险的是,它正在尝试删除图形驱动程序包(xserver-xorg-....)以避免与新的compizes冲突。
(可能,如果我也在本地存储库中拥有它们,它们可能会安全地想要降级。但由于这些软件包通常已安装,我没有下载它们,因此不在本地存储库中,因此出现了这种结果)。
结论:因此,仅建议在本地系统中具有完整存储库的情况下使用/etc/apt/preferences。
如果许多存储库中存在相同版本的几个实例(.deb文件),该如何处理?
这是apt_preference手册所描述的。
引用:
当sources.list(5)文件包含对多个源的引用时,可能会提供相同版本的软件包的几个实例。在这种情况下,apt-get(8)会下载在sources.list(5)文件中最早列出的实例。
使用/etc/apt/preferences文件的用例示例:
一个强制使用自定义仓库中可用版本的示例是"Linux Mint"发行版。他们使用这个自定义的偏好文件。
Package: *
Pin: release o=linuxmint
Pin-Priority: 700
Package: *
Pin: origin packages.linuxmint.com
Pin-Priority: 700
Package: *
Pin: release o=Ubuntu
Pin-Priority: 500
这有效地使他们在他们的存储库中有这些软件包时提供软件包。但如果他们没有这些软件包,他们将使用Ubuntu的标准存储库。
在将本地存储库设置为最高优先级后运行apt-get
的示例
我只是想在Ubuntu上安装kubuntu-desktop
软件包来测试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 policy kubuntu-desktop
kubuntu-desktop:
Installed: (none)
Candidate: 1.222.1kde47~ppa2
Version table:
1.254 0
500 cdrom://Kubuntu 12.04 LTS _Precise Pangolin_ - Release i386 (20120424)/ precise/main i386 Packages
500 http://archive.ubuntu.com/ubuntu/ precise/main i386 Packages
1.222.1kde47~ppa2 0
1001 file:/media/Main/Linux-Software/Ubuntu/Natty/natty/ Packages
1.222.1 0
1001 file:/media/Main/Linux-Software/Ubuntu/Natty/natty/ Packages
1.222 0
1001 file:/media/Main/Linux-Software/Ubuntu/Natty/kubuntu/ Packages
在这个输出中,我们可以看到"cdrom"和"precise main repository"都有版本号
1.254,而本地仓库的版本是
1.222.1kde47~ppa2,比较低。尽管它们在sources.list文件中位于本地版本之前,但本地软件包具有优先权。
为了明确地看到
apt-get
确实尝试从本地安装,我运行了
synaptic
并得到了以下结果,显示Apt系统将
1.222.1kde47~ppa2作为要安装的候选版本。
![enter image description here](https://istack.dev59.com/MfRU7.webp)
此外,
apt-cache policy kubuntu-desktop
也显示相同的内容。
anwar@edubuntu-lenovo:~$ apt-cache policy kubuntu-desktop
kubuntu-desktop:
已安装:(无)
候选版本:1.222.1kde47~ppa2
版本表:
1.254 0
500 cdrom://Kubuntu 12.04 LTS _Precise Pangolin_ - Release i386 (20120424)/ precise/main i386 Packages
500 http://archive.ubuntu.com/ubuntu/ precise/main i386 Packages
1.222.1kde47~ppa2 0
1001 file:/media/Main/Linux-Software/Ubuntu/Natty/natty/ Packages
1.222.1 0
1001 file:/media/Main/Linux-Software/Ubuntu/Natty/natty/ Packages
1.222 0
1001 file:/media/Main/Linux-Software/Ubuntu/Natty/kubuntu/ Packages
为了解决这个问题,我通过sudo rm /etc/apt/preference
删除了/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-desktop:
已安装: (无)
候选版本: 1.254
版本表:
1.254 0
500 cdrom://Kubuntu 12.04 LTS _Precise Pangolin_ - Release i386 (20120424)/ precise/main i386 Packages
500 http://archive.ubuntu.com/ubuntu/ precise/main i386 Packages
1.222.1kde47~ppa2 0
500 file:/media/Main/Linux-Software/Ubuntu/Natty/natty/ Packages
1.222.1 0
500 file:/media/Main/Linux-Software/Ubuntu/Natty/natty/ Packages
1.222 0
500 file:/media/Main/Linux-Software/Ubuntu/Natty/kubuntu/ Packages
还运行了以下命令:sudo apt-get install kubuntu-desktop
,输出如下:
0 升级,213 新安装,0 删除和150 未升级。
需要获取 0 B/89.6 MB 的存档。
执行此操作后,将使用额外的 269 MB 磁盘空间。
您是否要继续 [Y/n]?
您可以在
此处查看完整结果。
然后我对解释部分非常确定。
参考文献1:apt_preference手册
参考文献2:如何保留特定版本的软件包安装
apt-get
命令进行了验证。它显示"需要下载0 kb"。 - Anwarapt-cache policy
来验证一下吗? - tumbleweedapt-cache policy
进行了验证,并且看到本地仓库具有更高的优先级。但是apt-get
仍然试图从互联网上安装它。我认为如果不使用sources.list
文件,这是不可能的。 - Anwarapt-cache policy
是否显示版本相同。 - tumbleweedapt-cache show package-name
,是的,它显示相同的版本。apt-cache policy
不显示版本号。 - Anwarapt-cache policy $packagename
的完整输出结果。 - tumbleweed