Advanced Package Tools - APT

APT 是 Debian 發展的套件管理工具,用來安裝/升級/移除套件用。APT 常見工具有 Command 跟 GUI 兩種:

Command:

  • apt-get (第一代)
  • apt (第二代)

GUI:

  • synaptic
  • aptitude

以下以 Ubuntu 系統的 apt 指令為例。

使用預設的官方套件庫

更新套件清單

要安裝套件之前,最好都先去更新套件清單。由於 Linux 世界有非常豐富的套件資源,而且時時刻刻都有新玩意。每個 Linux 發行版都會整理自己的套件庫。每個套件庫就像是一本很厚的書,套件清單就像是這本書的目錄頁,可以讓你知道目前有哪些套件可以安裝。

1
$ sudo apt update

安裝

一旦有了最新的套件清單,就可以開始安裝想要的套件。遙想剛接觸套件管理工具的時候,一開始就卡關了:我想裝個 mp3 player,那套件名稱要輸入啥?想想使用 Windows 系統時候,都是怎麼安裝軟體的?搜啊!

1
$ apt search [keyword]

舉例來說,找看看跟 youtube 有關的玩意有啥:

1
2
3
4
5
$ apt search youtube

...
youtube-dl/xenial,xenial 2016.02.22-1 all
downloader of videos from YouTube and other sites

看到 youtube-dl,好像很好玩,就可以用安裝來玩玩看。

1
$ sudo apt install [pkg]

搜出來的結果因為只有短短的簡介,想要看更仔細的介紹:

1
$ apt show [pkg]

移除

移除常見有兩種指令,第一個是怕哪天還會重新安裝,第二個則是比較恩斷義絕。

1
2
3
4
5
# 只移除套件
$ sudo apt remove [pkg]

# 移除套件跟設定檔
$ sudo apt purge [pkg]

升級

因為 Linux 的世界就是集眾人之力,所以會看到有錯誤的、不安全的軟體,很快就會被改正,又或者套件有新版本可用,都是很正常的事。這時候就針對套件進行升級,在升級之前,可以先查看有哪些可以升級的:

1
2
$ apt update
$ apt list --upgradable
1
$ sudo apt upgrade

上述指令最大的特性是:在不移除任何 pkg 的情況下,尋找已安裝的 pkg 來升級。所以如果想要進行一生一次的瘋狂,即使刪除 pkg 也要升級到最新,可以這樣:

1
$ sudo apt full-upgrade

先前的指令 apt 跟 apt-get 次命令幾乎一樣,只有這一個 apt-get 沒有 full-upgrade,所以要用:

1
$ sudo apt-get dist-upgrade

重新安裝

學習系統最常發生的事就是,系統被玩壞了。有時候是因為移除或者改變 pkg 檔案引起,最簡單的還原方式,是重新安裝 pkg:

1
$ sudo apt install --reinstall [pkg]

了解更新清單多一點

首先,問題來了,Ubuntu 怎麼知道要去哪裡更新套件清單?/etc/apt/sources.list 這個檔案維護了來源:

1
2
3
4
$ cat /etc/apt/sources.list

deb http://us.archive.ubuntu.com/ubuntu/ bionic main restricted
# deb-src http://us.archive.ubuntu.com/ubuntu/ bionic main restricted

以一行為設定單位。這種格式風格稱作 one-line-style format

第一個欄位是來源的類型,deb 意味著這個來源提供編譯過的執行檔,deb-src 則是這個來源提供原始碼,如果想要自行編譯,或者修改 bug ,可以打開註解。

第二個欄位就是來源網址,使用的協定可以是 http://file://ftp://cdrom://

第三個欄位是這個 linux 的代碼(SuiteCodename),Ubuntu 18.04 是 bionic。

第四個欄位以後,就是來源網址上的子目錄。所以拿這一行來說,就是去兩個地方更新清單:

1
2
http://us.archive.ubuntu.com/ubuntu/bionic/main/
http://us.archive.ubuntu.com/ubuntu/bionic/restricted/

Ubuntu 官方文件可以得知有四種版本庫,這四種分類對應到子目錄名稱:

  • Main: 官方支持的免費和開源軟件。
  • Universe: 社區維護的免費和開源軟件。
  • Restricted: 裝置的專屬驅動程式。
  • Multiverse: 受版權或法律問題限制的軟件。

使用第三方套件庫

新增套件庫來源

除了官方提供的套件庫,要安裝第三方軟體,就要把他們的套件庫來源加進來,然後更新他們的套件清單資訊。不過通常不會直接去改 /etc/apt/sources.list ,而是在 /etc/apt/sources.list.d/ 新增一個 list 檔案,語法一樣使用 one-line-style format 。 第三方軟體的官方文件通常會提供套件庫來源資訊與語法,以 ROS 為例:

1
sudo sh -c 'echo "deb http://packages.ros.org/ros/ubuntu $(lsb_release -sc) main" > /etc/apt/sources.list.d/ros-latest.list'

還有另外一種方法是透過 PPAs(Adding Personal Package Archives) 機制:

1
$ sudo add-apt-repository ppa:<launch-pad-account>/<ppa-name>

不管是哪一種方法,都要小心的是,除非你相信這個第三方軟體來源,否則不要亂加,以免是惡意軟體。

加完了來源,記得要更新來源清單,才能取得最新的套件資訊:

1
$ sudo apt update

要移除 ppa 可以:

1
$ sudo ppa-purge ppa:<launch-pad-account>/<ppa-name>

關於 launch-pad-account 等觀念是什麼,可以參考創建 PPA 來了解基本觀念,在此不贅述。

剛剛提到 one-line-style format,其實還有另一種 sources.list 檔案的語法風格,叫做 deb822 style format ,長得像這樣:

1
2
3
4
5
6
7
8
9
Types: deb
URIs: http://us.archive.ubuntu.com/ubuntu
Suites: trusty trusty-updates
Components: main restricted

Types: deb
URIs: http://security.ubuntu.com/ubuntu
Suites: trusty-security
Components: main restricted

其他詳細介紹可以查看:

1
$ man sources.list

SecureApt

由於軟體是放在公開場域供大家安裝使用,如果軟體不小心經過惡意竄改,那就慘了。所以開始有 “secure apt”。SecureApt 大致上做了兩件事:

  • 在 release file 上提供 checksum 資訊,確認軟體沒有被竄改過。
  • 在 release file 上使用 gpg 簽署,利用公鑰/私鑰機制來證明 release file 真的是官方發佈的。

gpg 是 GnuPG,簡單地說,這個機制是給軟體發行人做簽署(簽名)用的。身為軟體發行人,會使用這個工具產生公鑰/私鑰,私鑰留著,公鑰上傳到一些常見的 key server。接著我拿私鑰在我的發行文件上簽名,要安裝我發行的軟體,就得先去 key server 拿公鑰,來檢查我的發行文件簽署有沒有異常。基本觀念可以看看這裡,至於怎麼使用 gpg 工具,可以參考這篇

當軟體發行人將公鑰上傳至 key server 後,會取得一個 user id,

所以現在除了設定 sources.list 檔案,提供套件庫來源資訊,也要給定「尋找並取得公鑰」的資訊,以 ROS 為例:

1
$ sudo apt-key adv --keyserver hkp://ha.pool.sks-keyservers.net:80 --recv-key 421C365BD9FF1F717815A3895523BAEEB01FA116

hkp://ha.pool.sks-keyservers.net常見的 key server 之一,421C365BD9FF1F717815A3895523BAEEB01FA116公鑰的 fingerprint ,不是公鑰。因為公鑰都很長,所以搞一個短碼版的來代表。

所以上述指令意謂著:去 key server,尋找 public key fingerprint 所代表的 public key,並且下載下來。如果要看自己目前已經有哪些 public key 可以輸入:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
$ apt-key list

/etc/apt/trusted.gpg
--------------------
pub 1024D/437D05B5 2004-09-12
uid Ubuntu Archive Automatic Signing Key <ftpmaster@ubuntu.com>
sub 2048g/79164387 2004-09-12

pub 4096R/C0B21F32 2012-05-11
uid Ubuntu Archive Automatic Signing Key (2012) <ftpmaster@ubuntu.com>

pub 4096R/EFE21092 2012-05-11
uid Ubuntu CD Image Automatic Signing Key (2012) <cdimage@ubuntu.com>

pub 1024D/FBB75451 2004-12-30
uid Ubuntu CD Image Automatic Signing Key <cdimage@ubuntu.com>

pub 1024D/B01FA116 2009-12-24
uid ROS Builder <rosbuild@ros.org>
sub 2048g/8F3611A0 2009-12-24

/etc/apt/trusted.gpg.d/debian-archive-jessie-automatic.gpg
----------------------------------------------------------
pub 4096R/2B90D010 2014-11-21 [expires: 2022-11-19]
uid Debian Archive Automatic Signing Key (8/jessie) <ftpmaster@debian.org>

也可以直接用 gpg 工具來下載公鑰,只是還要多一個轉匯給 APT 的步驟:

1
2
3
4
5
# 下載公鑰
$ gpg --keyserver hkp://ha.pool.sks-keyservers.net:80 --recv-keys xxxxxxxxxxxxxxxx

# 將公鑰轉匯給 APT
$ gpg --armor --export xxxxxxxxxxxxxxxx | apt-key add -

加完來源之後,最重要的一件事,就是更新清單:

1
$ sudo apt update

然後就可以安裝想要的套件了。