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 | $ apt search youtube |
看到 youtube-dl
,好像很好玩,就可以用安裝來玩玩看。
1 | $ sudo apt install [pkg] |
搜出來的結果因為只有短短的簡介,想要看更仔細的介紹:
1 | $ apt show [pkg] |
移除
移除常見有兩種指令,第一個是怕哪天還會重新安裝,第二個則是比較恩斷義絕。
1 | # 只移除套件 |
升級
因為 Linux 的世界就是集眾人之力,所以會看到有錯誤的、不安全的軟體,很快就會被改正,又或者套件有新版本可用,都是很正常的事。這時候就針對套件進行升級,在升級之前,可以先查看有哪些可以升級的:
1 | $ apt update |
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 | $ cat /etc/apt/sources.list |
以一行為設定單位。這種格式風格稱作 one-line-style format
第一個欄位是來源的類型,deb
意味著這個來源提供編譯過的執行檔,deb-src
則是這個來源提供原始碼,如果想要自行編譯,或者修改 bug ,可以打開註解。
第二個欄位就是來源網址,使用的協定可以是 http://
、file://
、ftp://
、cdrom://
第三個欄位是這個 linux 的代碼(SuiteCodename),Ubuntu 18.04 是 bionic。
第四個欄位以後,就是來源網址上的子目錄。所以拿這一行來說,就是去兩個地方更新清單:
1 | http://us.archive.ubuntu.com/ubuntu/bionic/main/ |
從 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 | Types: deb |
其他詳細介紹可以查看:
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 | $ apt-key list |
也可以直接用 gpg 工具來下載公鑰,只是還要多一個轉匯給 APT 的步驟:
1 | # 下載公鑰 |
加完來源之後,最重要的一件事,就是更新清單:
1 | $ sudo apt update |
然後就可以安裝想要的套件了。