銀河麒麟桌面版包管理器(二)

以下內容摘自《銀河麒麟操作系統進階應用》一書

APT包管理器

APT是Debian及其派生系統的包管理器,構建在dpkg之上,以其強大的依賴性處理能力和豐富的軟件倉庫而聞名。APT具有自動解決依賴關系、提供易于使用的命令行工具(如apt-get、apt-cache等),以及穩定的軟件更新機制等優點。

盡管APT極大地簡化了軟件管理過程,但是它也面臨著一些挑戰和限制。例如,APT的軟件倉庫可能不包含某些特定的或最新的軟件包,這時用戶可能需要添加第三方倉庫或下載.deb包手動安裝。現在,APT已經經過改造,可以在支持rpm(另外一種流行的Linux安裝包格式)的系統上用來管理rpm包。

APT配置文件

APT包管理器的配置和管理數據大多存儲在/etc/apt/目錄下,該目錄包含了多個配置文件和子目錄,它們控制了APT的行為,包括軟件源的位置、優先級規則等。理解/etc/apt/目錄的結構及其包含的文件對于高效使用APT有很大幫助。

圖35是ARM64架構的銀河麒麟桌面版/etc/apt目錄結構(目錄下的具體文件會因不同架構不同版本有所不同),在對該目錄進行詳細解析前,需要了解APT配置文件的語法格式。

1. APT配置文件基本語法

APT配置文件的基本語法規則如下所述。

  • 注釋:以 // 或 # 開頭的行被視為注釋。
  • 指令:指令以關鍵字開始,后跟一系列參數。參數可以是布爾值(True/False)、整數、字符串(通常需要用雙引號括起來)、列表(使用 { } 包圍,并用逗號分隔)。
  • 作用域:配置項可以具有作用域,使用點“.”來分隔不同的層級。

/etc/apt/目錄及子目錄下的配置文件按文件名的“字母數字”的升序依次被解析。

2. /etc/apt/apt.conf.d/目錄解析

/etc/apt/apt.conf.d/目錄中通常包含多個配置文件,每個文件可以包含一條或多條配置指令,用于修改APT的默認行為或添加新功能。這種分散的配置文件結構使得管理單個配置更加簡單,同時避免了單一大文件可能帶來的混亂。

在設置APT的代理服務器時,可以在該目錄下創建配置文件,指定APT使用的代理信息,如創建一個名為01proxy的文件,并添加如下內容:

Acquire::http::Proxy "http://your-proxy-address:port";

Acquire::https::Proxy "http://your-proxy-address:port";

現在很多代理軟件可以同時支持HTTP和HTTPS協議,一般HTTP和HTTPS填寫同樣的IP地址(域名)和端口即可。該目錄下的其他文件一般無須修改。

3. /etc/apt/sources.list文件解析

/etc/apt/sources.list文件是APT配置的核心部分,它指定了APT獲取的包信息和包的位置,即軟件源。這些軟件源可以是網絡上的服務器,也可以是本地文件系統上的目錄。sources.list文件內容有兩種語法格式:一種是傳統的單行語法格式,另一種是較新的Deb822語法格式。

(1)單行語法格式。

符合單行語法格式時,在以.list結尾的文件中,每個軟件源占據一行。銀河麒麟桌面版內置的/etc/apt/sources.list內容如下,以此為例進行闡述。

deb http://archive.***.cn/kylin/KYLIN-ALL 10.1 main restricted universe multiverse

deb http://archive.***.cn/kylin/KYLIN-ALL 10.1-2303-updates main universe multiverse restricted

deb?http://archive2.***.cn/deb/kylin/production/PART-V10-SP1/custom/partner/V10-SP1 default all

單個條目不能連續到多行。.list文件中的空行被忽略,任何位置的“#”字符后面部分是注釋。sources.list每行內容按照下面的語法格式組織。

類型 [選項] ?URI 分發版 [組件1] [組件2] [...]

  • 類型:指定軟件源的類型,通常為deb(二進制包)或deb-src(源代碼包)。
  • [選項]:(可選)用于指定軟件源的選項,多個選項間使用逗號“,”分隔。常見的選項如下所述。
  • arch=<architecture>:指定支持的架構,例如AMD64、i386、ARM64等。不支持同時指定多個CPU架構。每個軟件源條目只能指定一個架構。要支持多個架構,需要為每個架構單獨定義一個條目。
  • trusted=yes:表示信任該源,不會進行GPG簽名驗證。
  • allow-insecure=yes:允許使用不安全的HTTP源(非HTTPS)。
  • default-release=<release>:指定默認的發布版本。
  • URI:指定軟件源的URI(統一資源標識符)。URI是一種字符串,可以是具體的資源(如網頁、文件)或抽象的資源(如概念、服務)。一個完整的URI通常由以下幾個部分組成。
  • 方案(Scheme):指定資源的訪問協議,如HTTP、HTTPS、FTP等。
  • 權限(Authority):包括用戶信息、主機名和端口號,通常以雙斜杠//開頭。
  • 路徑(Path):指定資源在服務器上的位置。
  • 查詢(Query):(可選)提供額外的參數,通常用于動態頁面。
  • 片段(Fragment):(可選)指定資源內的某個位置或部分。

例如在http://archive.***.cn/kylin/KYLIN-ALL這個URI中,http是方案,archive.***.cn是權限(包含了主機名archive.***.cn和省略的端口號80),/kylin/KYLIN-ALL是路徑。

  • 分發版:指定特定的分發版名,如10.1、10.1-2303-updates等。
  • 組件:指軟件庫分類,如main、restricted、universe、multiverse。
  • main:表示官方支持的,并且完全遵循自由軟件準則的軟件包。
  • restricted:表示官方支持的,但不完全遵循自由軟件準則的軟件包。
  • universe:表示由社區維護的開源軟件,不保證安全更新和維護。
  • multiverse:包含可能受到法律或版權問題限制的軟件包。這些軟件可能是非自由或專有的,包括一些受版權保護的軟件、游戲、字體等。

上面將單行語法格式拆開了詳細講解,看似復雜,但無論是“http://archive.***.cn/kylin/?KYLIN-ALL 10.1 main restricted universe multiverse”,還是“http://archive.***.cn/kylin/KYLIN-?ALL 10.1-2303-updates main universe multiverse restricted”最終總是要和服務器端的文件目錄結構一一對應的。圖36是軟件倉庫服務器端的文件目錄結構,通過該圖可以比較直觀地理解單行語法格式中各個組成部分的相對關系。

單行語法格式的優點是,當前所有APT版本都支持,內容相對緊湊、容易人類解析。缺點是不便機器解析,因為其包括了多個部分,每個部分都有多個變種。為了解決單行語法格式機器解析不便的問題,推出了Deb822語法格式。

(2)Deb822語法格式。

對于Deb822語法格式,每個文件都需要.sources作為文件擴展名,每個軟件源都在單個“配置節”中進行配置,每行明確描述源的功能。大多數選項還允許配置值列表,可以在單個軟件源中定義多個鏡像(Mirror)或多個套件。也就是說,Deb822格式表達能力更強,Deb822格式對APT軟件的版本有要求,APT v1.1以后的版本才支持。有個別Linux發行版的最新版,例如Ubuntu 24.04的APT軟件源已默認采用了Deb822格式。Deb822格式的軟件源形式如下(包含了兩個配置節):

Enabled: yes

Types: deb deb-src

URIs: http://***.com/ubuntu

Suites: disco disco-updates disco-security disco-backports

Components: main universe multiverse restricted

X-Repolib-Name: Pop!_OS PPA

Enabled: yes

Types: deb

URIs: http://ppa.***.net/system76/pop/ubuntu

Suites: disco

Components: main

4. /etc/apt/sources.list.d/目錄解析

/etc/apt/sources.list.d/目錄放置第三方額外的軟件源,而不是添加到sources.list文件中。這使得管理額外軟件源更加靈活。自定義源的添加方法如下:創建一個以.list為擴展名的文件,將其放置在sources.list.d/目錄下,文件格式與sources.list條目格式相同。

5. /etc/apt/preferences.d/目錄解析

與sources.list.d目錄類似,preferences.d目錄允許用戶將軟件包優先級配置分散到單獨的文件中,以便更好地組織和管理。該目錄下的preferences文件允許用戶自定義包的優先級,這對于混合使用多個軟件源、避免自動更新到不穩定版本或者解決依賴性問題非常有用。

文件內容語法如下所示。

Package: 包名

Pin: Pin規則

Pin-Priority: 優先級

  • 包名:可以是具體的包名,也可以用通配符*表示所有包。
  • Pin字段定義了包的來源或特征。常見的Pin規則如下所述。
  • release:指定發布版本。
  • origin:指定包來源的主機名。
  • codename:指定發布代碼名。
  • archive:指定發布倉庫(例如stable、testing)。
  • version:指定包的版本。
  • label:指定包的標簽。
  • 優先級:整數值,APT根據這個值來決定包的安裝或升級優先級。已安裝軟件的默認優先級通常是1000。
  • 大于1000:APT將會強制安裝該版本,即使會導致系統損壞。
  • 100~1000:APT將嘗試安裝指定版本,除非有特定版本已被安裝。
  • 0~100:APT不會自動安裝該版本,但可以手動安裝。
  • 負值:APT將完全忽略該版本。

下面通過幾個例子展示該目錄下配置文件的用法。

(1)例1:優先使用特定版本的包。

Package: mypackage

Pin: version 1.2.3

Pin-Priority: 1001

這將強制安裝版本1.2.3的mypackage,即使有其他更新版本。

(2)例2:優先使用來自特定來源的包。

Package: *

Pin: origin "archive.ubuntu.com"

Pin-Priority: 700

這將優先從archive.ubuntu.com安裝所有包。

(3)降低testing版軟件包的優先級。

Package: *

Pin: release a=testing

Pin-Priority: 50

這將降低testing倉庫中所有包的優先級,除非沒有其他候選項。

銀河麒麟桌面版/etc/apt/preferences.d/目錄下有archive1.pref ~ archive4.pref四個文件,使用命令cat /etc/apt/preferences.d/*可同時查看這幾個文件的內容(如圖37所示)。

6. /etc/apt/trusted.gpg.d目錄解析

原先用于存儲系統信任GPG密鑰的文件/etc/apt/trusted.gpg已被廢棄,現在建議將軟件源的GPG密鑰存儲在/etc/apt/trusted.gpg.d目錄下的單獨文件中,以提高系統的安全性。GPG密鑰用于APT驗證從不同軟件源下載的軟件包的真實性。

APT使用/etc/apt/trusted.gpg.d目錄中的GPG密鑰來驗證軟件包的方式如下所述。

  • 軟件包簽名驗證:當APT下載軟件包時,軟件包會附帶數字簽名。APT會使用/etc/apt/trusted.gpg.d目錄中的GPG密鑰來驗證這些簽名的真實性。
  • 密鑰匹配:APT會檢查軟件包簽名中使用的密鑰是否存在于/etc/apt/trusted.gpg.d目錄中,如果存在匹配的密鑰,則軟件包被視為受信任。

通過驗證軟件包的簽名,APT可以確保軟件包在傳輸過程中沒有被篡改或損壞。如果軟件包的簽名無法通過GPG密鑰驗證,APT就會發出警告并拒絕安裝該軟件包。

APT主要命令和操作

APT包管理器主要由apt-get、apt-cache、apt-mark等幾個命令行工具組成,如圖38所示。APT可以智能地從安裝來源下載最新版本的軟件并且安裝,而無須在安裝后重啟電腦(除更新系統內核外)。

圖38 ?銀河麒麟系統中以apt開頭的命令行工具

APT中的軟件包有三種關聯性:依賴項、建議項和推薦項。

  • 依賴項:這些是必須安裝的軟件包,以確保目標軟件包能夠正常運行。
  • 建議項:這些是軟件包維護者認為大多數用戶在安裝目標軟件包時也應該安裝的軟件包,但不是必需的。
  • 推薦項:這些是與目標軟件包相關的軟件包,可以增強其功能,也不是必需的。

(1)apt命令。

apt命令用法如表35所示。

表35??apt命令用法示例

命????令

解????釋

apt list --installed

apt list --upgradable

apt list nginx*

列出已安裝的包

列出可升級的包

列出所有以nginx開頭的包

apt search nginx

apt search nginx --names-only

apt search ^python

apt search python$

搜索軟件包名稱或描述中包含nginx的所有包

僅搜索軟件包名稱中包含nginx的所有包

使用正則表達式搜索以“python”開頭的軟件包名稱

使用正則表達式搜索以“python”結尾的軟件包名稱

apt show nginx

顯示一個包的詳細信息,如版本、依賴關系等

apt install nginx

apt install nginx --download-only

apt install nginx --simulate

apt install --reinstall nginx

apt install --install-suggests nginx

apt install git=1:2.45.2

正常安裝軟件包,自動解決依賴關系

僅下載指定包,不安裝

模擬安裝過程,不會實際安裝包

重新安裝指定的軟件包

同時安裝建議的軟件包

安裝指定版本的git

apt reinstall nginx

重新安裝指定的軟件包

apt satisfy nginx

apt satisfy 'nginx>=1.14'

檢查并安裝滿足指定軟件包依賴性的包

確保安裝的nginx版本至少為1.14

apt remove nginx

apt remove nginx --purge

移除指定的軟件包,但不刪除配置文件

刪除軟件包及其相關的配置文件

apt autoremove

apt autoremove --purge

自動移除不再需要的包

--purge選項同時刪除配置文件

apt update

更新軟件包列表,從而知道有哪些可用的更新

apt upgrade

apt upgrade nginx

升級所有可升級的包或指定包

僅升級nginx包

apt full-upgrade

完全升級,可能會移除某些包以滿足依賴關系

apt-mark hold nginx

apt-mark unhold nginx

nginx無法被安裝、升級或卸載

恢復nginx可供更新

(2)apt-get命令。

apt-get命令包含而apt命令不包含的子命令如表36所示。

表36??apt-get相比apt的差異部分

命 ???令

解 ???釋

apt-get build-dep <package>

安裝構建軟件包所需的構建依賴項

apt-get build-dep --no-install-
recommends <package>

安裝構建依賴但跳過推薦包

apt-get check

更新緩存并檢查是否有損壞的依賴

apt-get dselect-upgrade

使用dselect的結果進行升級操作

apt-get purge <package>

刪除包含配置文件的軟件包

apt-get purge --auto-remove <package>

刪除包含配置文件的軟件及其依賴

apt-get source <package>

下載指定包的源代碼

apt-get source --compile <package>

下載源代碼,編譯并安裝

apt-get download <package>

僅下載指定包而非安裝

apt-get changelog <package>

下載指定軟件包,并顯示其變更日志

apt-get clean

清空整個/var/cache/apt/archives/目錄,刪除所有緩存的.deb文件

apt-get autoclean

只刪除/var/cache/apt/archives/下軟件包的舊版本。與clean命令相比,autoclean更加保守,它會保留可能仍然有用的包文件

(3)apt-cache命令。

apt-cache命令用法如表37所示。

表37??apt-cache命令用法

命 ???令

解 ???釋

apt-cache madison <package>

顯示軟件包<package>在各軟件源上的版本

apt-cache show <package>

顯示軟件包<package>所有可用版本的詳細信息

apt-cache show --no-all-versions <package>

顯示<package>在當前系統上可安裝的最新版本的詳細信息,而非所有版本

apt-cache search keyword

在包描述中搜索含有keyword的包

apt-cache search --names-only keyword

僅在包名中搜索keyword,不搜索描述

apt-cache search --full keyword

顯示包含keyword的包的完整記錄

apt-cache depends <package>

顯示軟件包<package>的依賴關系

apt-cache depends --recurse <package>

遞歸顯示軟件包<package>的依賴關系

apt-cache rdepends <package>

顯示哪些包依賴軟件包<package>?

apt-cache rdepends --installed <package>

僅顯示已安裝的包依賴軟件包<package>?

apt-cache pkgnames

列出APT數據庫中所有包的名稱

apt-cache pkgnames <prefix>

列出APT數據庫中以prefix為前綴的包名

apt-cache policy

顯示已安裝軟件包的版本和可用版本

apt-cache policy <package>

顯示特定軟件包<package>的版本和來源優先權信息

apt-cache dump

打印APT緩存中所有包的詳細信息

apt-cache dumpavail

打印可用的所有包列表信息,通常用于幫助調試

apt-cache unmet

顯示具有未滿足依賴關系的包

apt-cache unmet --auto

僅顯示可能會被apt-get autoremove刪除的包的未滿足依賴信息

apt-cache stats

顯示APT緩存的統計信息

apt-cache showpkg <package>

顯示軟件包<package>的所有可用版本及其依賴關系

APT離線使用

在離線環境下使用apt命令安裝軟件包,需要提前下載所需的軟件包及其依賴項,并將它們傳輸到目標系統。要求下載軟件包的計算機系統架構最好與離線環境下的目標計算機系統架構完全一致。

1. 方法1:使用apt-offline輔助工具

apt-offline是一個專門用于離線管理APT軟件包的軟件工具。它允許在離線系統上生成請求文件,然后在有網絡連接的系統上下載所需的包,最后將下載的包回傳到離線系統進行安裝。

(1)在離線系統上生成請求文件。

安裝apt-offline:

sudo apt-get install apt-offline

生成請求文件:

sudo apt-offline set ./apt-offline.sig

在當前路徑下,生成一個名為apt-offline.sig的請求文件,包含了當前系統上所有需要更新或安裝的軟件包信息。

(2)在有網絡連接的計算機上下載包。

將請求文件傳輸到有網絡連接的計算機上,使用apt-offline下載所需的軟件包:

sudo apt-offline get ./apt-offline.sig --bundle ./apt-offline.zip

這將下載所有需要的軟件包,并將它們打包成為apt-offline.zip文件。

(3)在離線計算機上安裝下載的軟件包。

首先將下載的apt-offline.zip文件傳回離線計算機,然后在離線計算機上,使用apt-offline安裝下載的軟件包:

sudo apt-offline install /path/to/apt-offline.zip

2. 方法2:手動下載和安裝軟件

如果不使用apt-offline,也可以手動下載和安裝所需的軟件包及其依賴項。

(1)在有網絡連接的計算機上下載軟件包。

在有網絡連接的系統上,使用apt-get download下載所需的軟件包及其依賴項。例如,要下載vim這個軟件包:

sudo apt-get download $(sudo apt-cache depends --recurse --no-recommends --no-suggests --no-conflicts --no-breaks --no-replaces --no-enhances vim | grep "^\w" | sort -u)

這將下載vim及其依賴項的.deb文件,然后將所有下載的.deb文件打包成一個壓縮文件或使用其他方式傳輸到離線計算機。

(2)在離線計算機上安裝軟件包。

將下載的.deb文件傳回離線計算機,然后在離線計算機上,進入.deb文件所在目錄,使用dpkg安裝當前目錄下的所有.deb文件。例如:

sudo dpkg -i ./*.deb

如果有依賴關系問題,可以使用apt-get -f install來修復依賴關系:

sudo apt-get -f install

3. 方法3:利用緩存的deb包搭建軟件源

當使用APT安裝或更新軟件包時,APT會將下載的.deb軟件包存放在/var/cache/apt/archives/目錄下。如果需要重新安裝軟件包,APT就可以直接使用這個目錄中的緩存文件,無須再次從網絡下載,從而節省帶寬,加快安裝速度。

可以將這些緩存的軟件包制作成APT可以使用的軟件源,復制到離線環境后使用。具體步驟如下:

(1)在聯網計算機上,將/var/cache/apt/archives/目錄下的deb包復制到新的文件夾中,比如/home/<username>/repository/。

mkdir ~/repository/

cp /var/cache/apt/archives/*.deb ~/repository/

(2)生成壓縮版的Packages.gz文件,Packages.gz文件包含了當前目錄中的所有.deb軟件包的元數據,包括軟件包名稱、版本、依賴關系等信息。這個文件是APT識別軟件源所必需的。

cd ~/repository

sudo dpkg-scanpackages . /dev/null | gzip -9c > Packages.gz

(3)將聯網計算機上的目錄~/repository/復制到離線環境。

(4)在離線計算機上,編輯sources.list文件,將軟件源添加到其中:

deb [trusted=yes] file:/home/<username>/repository/ / ??????# 最后的“/”不可省略

請將上面file:后面的路徑修改為repository實際存放路徑。上面這一行內容的最后是“/”,表示該軟件源不特定于任何發行版或組件,這樣APT就會嘗試從這個源中獲取所有可用的軟件包。

(5)重新加載軟件包索引:

sudo apt update

通過以上步驟,就可以利用/var/cache/apt/archives/下的deb包構建自己的軟件源了。

4. 方法4:使用系統安裝光盤(或系統安裝光盤文件)搭建本地源

通常Linux發行版是可以將安裝光盤制作成本地軟件源使用的,例如,Ubuntu、CentOS都可以將安裝光盤制作成本地軟件源。理論上,銀河麒麟桌面版作為Ubuntu的衍生版,應該也可以這么做。但經測試銀河麒麟桌面版安裝盤中的Release文件被刪除了(Release文件記錄了文件的哈希值)。由于運行sudo apt update的時候會先校檢Release文件的簽名信息,如果不符合則認為是無效的倉庫。銀河麒麟桌面版安裝光盤只內置了有限幾種安裝包,如圖39所示。

圖39 ?銀河麒麟桌面版安裝光盤可選deb包

這些deb包對應的就是在安裝系統時可選的幾款軟件,如圖310所示。

圖310 ?銀河麒麟桌面版安裝時軟件包選擇界面

因此,銀河麒麟桌面版不需要、也無法直接搭建光盤軟件源。

APT的安全特性

APT使用GPG對軟件包進行簽名和驗證,以確保包的完整性和來源的可信度,這一機制稱為apt-secure。

1. apt-secure的工作機制

apt-secure是APT的一個安全特性,用于驗證軟件包的來源和完整性。它通過簽名和驗證機制,確保從倉庫下載的包是可信的。

(1)包簽名與驗證過程。

  • 包簽名:開發者使用私鑰對軟件包進行簽名。
  • 發布:簽名的包上傳到軟件倉庫。
  • 下載:用戶使用APT下載軟件包。
  • 驗證:APT使用倉庫的公鑰驗證包的簽名。

(2)Release文件和InRelease文件。

APT使用多個文件來管理軟件包倉庫和包的元數據,其中Release文件和InRelease文件是兩個重要的文件。Release文件是包含倉庫元數據的文件,描述了軟件包倉庫的各個部分包含的包以及這些包的元數據。它主要用于確保倉庫的一致性和完整性。InRelease文件是Release文件的增強版本,它不僅包含Release文件中的所有內容,還包括一個內嵌的GPG簽名。

2. 使用apt-key命令管理密鑰

apt-key是一個用于管理APT的GPG密鑰的命令行工具。它可以添加、刪除和列出系統信任的密鑰(如表38所示)。表3-8中的apt-key adv是apt-key的子命令,提供了與GPG交互的高級功能。

表38??apt-key命令使用示例

命 ???令

解 ???釋

apt-key list

列出系統中所有已添加的APT密鑰

apt-key add /path/to/keyfile.asc

wget -qO - https://example.com/repo-key.gpg | apt-key add -

從本地文件中導入密鑰

從URL獲取并添加GPG公鑰

apt-key del <key-id>

刪除指定的密鑰

apt-key fingerprint <key-id>

顯示指定密鑰的指紋信息

apt-key update

更新所有密鑰(已棄用)

apt-key adv --keyserver <keyserver>?--recv-keys
<key-id>

apt-key adv --export <key-id> > exported-key.asc

從指定的密鑰服務器下載并導入密鑰

導出指定的密鑰到文件

3. 密鑰相關故障處置

(1)案例1。

在使用APT的過程中,特別是在添加PPA倉庫(后文將詳細講解)時,經常會遇到如圖311所示的錯誤。

圖311 ?缺少公鑰錯誤

該錯誤通常是由于PPA倉庫的公鑰未導入到系統中,導致APT無法驗證軟件包的簽名而引起的。遇到此類故障,可以使用如下命令添加缺少的公鑰:

sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 8094BB14F4E3FBBE

命令中的hkp://keyserver.ubuntu.com:80為存儲公鑰的服務器(稱之為keyserver),可用的keyserver包括如下這些。

keyserver.ubuntu.com

pgp.mit.edu

subkeys.pgp.net

www.gpg-keyserver.de

(2)案例2。

圖3-12展示了使用在線腳本安裝某軟件時的報錯信息,這是另一種缺少公鑰錯誤的示例。

圖312 ?GPG缺少公鑰錯誤

這類錯誤處置步驟如下所述。

按照圖3-12中提示,執行下面的命令獲取缺失的公鑰:

gpg2 --keyserver hkp://keyserver.ubuntu.com --recv-keys 409B6B1796C275462A1703113804BB82D39DC0E3 7D2BAF1CF37B13E2069D6956105BD0E739499BDB

導出所有GPG公鑰:

gpg --export --armor > all-gpg-keys.asc

將密鑰文件復制到/etc/apt/trusted.gpg.d/:

sudo cp all-gpg-keys.asc /etc/apt/trusted.gpg.d/

通過這種方式,可以確保將GPG管理的所有密鑰都導入APT的密鑰環中。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/898800.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/898800.shtml
英文地址,請注明出處:http://en.pswp.cn/news/898800.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【STM32實物】基于STM32的掃地機器人/小車控制系統設計

基于STM32的掃地機器人/小車控制系統設計 演示視頻: 基于STM32的掃地機器人小車控制系統設計 簡介:掃地機器人系統采用分層結構設計,主要包括底層硬件控制層、中間數據處理層和上層用戶交互層。底層硬件控制層負責對各個硬件模塊進行控制和數據采集,中間數據處理層負責對采…

STM32收發數據包中間件——ProtoFlow,更方便的打包解包助手

引言 在嵌入式開發中&#xff0c;數據包封裝是不可或缺的一環。手動編寫協議不僅耗時&#xff0c;還容易出錯。ProtoFlow 的出現&#xff0c;就是為了讓數據包封裝變得簡單、高效、可靠。它不僅占用資源少&#xff0c;還能適配多種場景&#xff0c;是你項目的理想助手。 項目地…

Xcode16.1使用MonkeyDev運行Tiktok報錯分析

問題1&#xff1a; Build input files cannot be found: /usr/lib/libc.dylib, /usr/lib/libstdc.dylib. Did you forget to declare these files as outputs of any script phases or custom build rules which produce them? 解決辦法&#xff1a;在TARGETS的dylib中的Bui…

R語言交互項-formula

R語言交互項-formula 交互項的模型交互項的幾種情形連續變量和連續變量連續變量和分類變量分類變量和分類變量總結交互項的模型 統計中的交互和相關是完全不同的兩個概念,交互項是指兩個或者多個變量對因變量的協同效應,關注變量對因變量的聯合影響,比如變量X對Y的影響是否因…

圖解AUTOSAR_SWS_IPDUMultiplexer

AUTOSAR IPDUMultiplexer模塊詳解 PDU復用器模塊架構與實現分析 目錄 1. IPDU Multiplexer概述2. 模塊配置模型 2.1 配置結構概述2.2 配置類詳解2.3 配置關系說明3. 架構設計 3.1 模塊位置與接口3.2 內部組件結構3.3 接口交互模式4. 操作序列 4.1 PDU傳輸流程4.2 PDU傳輸流程詳…

手機怎么換網絡IP有什么用?操作指南與場景應用?

在數字化時代&#xff0c;手機已經成為我們日常生活中不可或缺的一部分&#xff0c;無論是工作、學習還是娛樂&#xff0c;手機都扮演著至關重要的角色。而在手機的使用過程中&#xff0c;網絡IP地址作為設備在互聯網上的唯一標識符&#xff0c;其重要性和作用不容忽視。本文將…

CH32V208GBU6沁恒協議棧BUG:在主機Write的同一包notify會造成主機一直Write不成功

從事嵌入式單片機的工作算是符合我個人興趣愛好的,當面對一個新的芯片我即想把芯片盡快搞懂完成項目賺錢,也想著能夠把自己遇到的坑和注意事項記錄下來,即方便自己后面查閱也可以分享給大家,這是一種沖動,但是這個或許并不是原廠希望的,盡管這樣有可能會犧牲一些時間也有哪天原…

unsloth微調QwQ32B(4bit)

unsloth微調QwQ32B(4bit) GPU: 3090 24G unsloth安裝部署 pip 安裝 pip install unsloth --index https://pypi.mirrors.usrc.edu.cn/simplesource /etc/network_turbopip install --force-reinstall --no-cache-dir --no-deps githttps://github.com/unslothai/unsloth.git?…

JavaScript案例0322

以下是一些涵蓋不同高級JavaScript概念和應用的案例&#xff0c;每個案例都有詳細解釋&#xff1a; 案例1&#xff1a;實現 Promise/A 規范的手寫 Promise class MyPromise {constructor(executor) {this.state pending;this.value undefined;this.reason undefined;this.o…

Dify 0.15.3 輸入變量無法被重新賦值問題-解決方法

目錄 一、問題描述 二、解決方法 2.1 原因 2.2 修改源碼 2.3 重新打包 dify-api 鏡像 2.4 修改 docker-compose.yaml 文件 2.5 重啟啟動鏡像 一、問題描述 Dify 0.15.3 是一個比較穩定的版本&#xff0c;Dify 1.0 是一個大版本更新&#xff0c;目前還有很多 Bug。但是&a…

SQL Server查詢計劃操作符(7.3)——查詢計劃相關操作符(11)

7.3. 查詢計劃相關操作符 98&#xff09;Table Scan&#xff1a;該操作符從查詢計劃參數列確定的表中獲取所有數據行。如果其參數列中出現WHERE:()謂詞&#xff0c;則只返回滿足該謂詞的數據行。該操作符為邏輯操作符和物理操作符。該操作符具體如圖7.3-98節點1所示。 圖 7.3-…

數據庫練習2

目錄 1.向heros表中新增一列信息&#xff0c;添加一些約束&#xff0c;并嘗試查詢一些信息 2.課堂代碼練習 插入語句 INSERT INTO 刪除語句DELETE和TRUNCATE 更新語句UPDATE和replace 查詢語句SELECT 條件查詢 select語句中的特殊情況 ???查詢排序 order by 分組查詢…

Java架構師成長之路

概述 本教程主要從6個方面&#xff0c;全面講解Java技術棧的知識。 1.性能調優 深入理解MySQL底層原理、索引邏輯&#xff0c;數據結構與算法。使用Explain進行優化分析MVCC原理剖析日志機制解析 2.框架源碼 掌握Spring底層原理帶你手寫一個Spring解析IOC、AOP源碼、以及事…

資金管理策略思路

詳細描述了完整交易策略的實現細節&#xff0c;主要包括輸入參數、變量定義、趨勢判斷、入場與出場條件、止損與止盈設置等多個方面。 輸入參數&#xff08;Input&#xff09;&#xff1a; EntryFrL (.6)&#xff1a;多頭入場的前一日波動范圍的倍數。 EntryFrS (.3)&#xff1…

k8s--集群內的pod調用集群外的服務

關于如何讓同一個局域網內的Kubernetes服務的Pod訪問同一局域網中的電腦上的服務。 可能的解決方案包括使用ClusterIP、NodePort、Headless Service、HostNetwork、ExternalIPs&#xff0c;或者直接使用Pod網絡。每種方法都有不同的適用場景&#xff0c;需要逐一分析。 例如&…

數據模型,數據建模,組件,核心價值,使用,意義

數據模型 一組由符號,文本組成的集合, 用以準確表達信息景觀, 達到有效交流,溝通的目的 數據建模 是發現,分析和確定數據需求的過程,是一種稱為數據模型的精確形式表示和傳遞這些需求 數據模型的組件 實體, 關系, 屬性和域 數據模型的核心價值 交流性 精確性 數據模型的…

【QA】外觀模式在Qt中有哪些應用?

1. QWidget及其布局管理系統 外觀模式體現 QWidget 是Qt中所有用戶界面對象的基類&#xff0c;而布局管理系統&#xff08;如 QVBoxLayout、QHBoxLayout、QGridLayout 等&#xff09;就像是一個外觀類。客戶端代碼&#xff08;開發者編寫的界面代碼&#xff09;通常不需要直接…

解鎖云原生后端開發新姿勢:騰訊云大模型API實戰攻略

目錄 云原生后端與大模型融合的開篇之章? 探秘云原生后端開發? 云原生后端是什么? 云原生后端架構核心要素? 微服務架構? 容器化技術? 服務發現與配置管理? Kubernetes 編排? 走進騰訊云大模型知識引擎? 引擎獨特功能與優勢? DeepSeek - R1、V3 兩款模型 …

AWS NoSQL解決方案全景圖

&#xff08;技術架構對比表&#xff09; 服務名稱數據模型協議兼容性核心架構特性適用場景DynamoDB鍵值/文檔原生API分布式SSD、自動分片高并發事務處理DocumentDB文檔型MongoDB 4.0存儲計算分離、6副本日志體系JSON數據聚合分析MemoryDB鍵值流數據Redis 6.2多AZ持久化、微秒…

【拒絕算法PUA】LeetCode 2116. 判斷一個括號字符串是否有效

目錄 系列文章目錄 專題總結&#xff1a; C刷題技巧總結&#xff1a; 題目 2116. 判斷一個括號字符串是否有效 難度 描述 解題方法1 系列文章目錄 專題總結&#xff1a; 【拒絕算法PUA】0x00-位運算【拒絕算法PUA】0x01- 區間比較技巧【拒絕算法PUA】0x02- 區間合并技…