# 練習 14:包管理:Debian 包管理工具`aptitude`
> 原文:[Exercise 14. Package management: Debian package management utility aptitude](https://archive.fo/NUuCN)
> 譯者:[飛龍](https://github.com/wizardforcel)
> 協議:[CC BY-NC-SA 4.0](http://creativecommons.org/licenses/by-nc-sa/4.0/)
> 自豪地采用[谷歌翻譯](https://translate.google.cn/)
現在是時候獲得一些神圣的知識,向 Linux 系統添加新程序了。Linux 中的程序稱為軟件包,通常通過稱作包管理器的工具,從網絡倉庫安裝 。
+ 軟件包通常是一個壓縮的程序,你可以像這樣安裝軟件包:`aptitude install program...`。為了避免安裝惡意程序,所有軟件包都由其創建者進行數字簽名,這意味著,如果軟件包在創建后修改,包管理器不允許你安裝它。
+ 包管理器是一個程序,允許你安裝其他程序。許多程序依賴于其他程序,例如使用對話窗口的程序通常需要一個程序,它知道如何繪制這些窗口。包管理器知道這些依賴關系,當你要求它安裝一個特定的程序時,它會安裝所需的所有程序,你要求的程序需要這些程序來工作。Debian 包管理器稱為`aptitude`。
網絡倉庫是一個包含許多軟件包的站點,可以隨時安裝。
這是程序安裝的典型概述:
```
你
使用包管理器搜索可用的程序
請求包管理器安裝程序
包管理器
查找安裝當前程序所需的所有程序
在包管理器數據庫中,為安裝標記它們
安裝所有需要的程序,包括你所需的程序
下載所有需要的程序
從這些軟件包提取文件,放到由 FHS 標準定義的,系統上的位置
對于每個程序,運行一個特殊的安裝腳本,允許它執行初始操作:
創建目錄
創建數據庫
生成默認配置文件
......
通過將已安裝程序的狀態修改為已安裝,更新系統包的數據庫
你
能夠立即運行你新安裝的程序
```
現在是時候了解提取文件的位置。在 Linux 中,所有相同類型的文件都安裝在相同的位置。例如,所有程序的可執行文件都安裝在`/usr/bin`中,程序的文檔在`/usr/share/doc`中,以及其它。這可能聽起來有點凌亂,但它是非常有用的。一個名為 FHS 的標準文件定義了哪些文件在哪里,你可以通過調用`man 7 hier`來查看它 。我將在下面向你顯示“文件系統層次標準”版本 2.2 的縮略版本:
+ `/` - 這是根目錄。這是整棵樹開始的地方。
+ `/bin` - 此目錄包含在單用戶模式下需要的可執行程序,并將其升級或修復。
+ `/boot` - 包含用于引導程序的靜態文件。該目錄僅保存引導過程所需的文件。映射安裝程序和配置文件應該放在`/sbin`和`/etc`。
+ `/dev` - 特殊或設備文件,指的是物理設備。見`mknod(1)`。
+ `/etc` - 包含機器本地的配置文件。
+ `/home` - 在具有用戶主目錄的機器上,這些通常位于該目錄下。該目錄的結構取決于本地管理決策。
+ `/lib` - 此目錄應該保存共享庫,它們是啟動系統和在根文件系統中運行命令所必需的。
+ `/media` - 此目錄包含可移動介質的掛載點,如 CD 和 DVD 磁盤或 USB 記憶棒。
+ `/mnt` - 此目錄是臨時裝載的文件系統的掛載點。在某些發行版中,`/mnt`包含子目錄,用作多個臨時文件系統的掛載點。
+ `/proc` - 這是`proc`文件系統的掛載點,它提供運行進程和內核的信息。這個偽文件系統在`proc(5)`中有更詳細的描述。
+ `/root` - 此目錄通常是`root`用戶的主目錄(可選)。
+ `/sbin` - 類似`/bin`,此目錄包含啟動系統所需的命令,但通常不會由普通用戶執行。
+ `/srv` - 此目錄包含由該系統提供的,站點特定的數據。
+ `/tmp` - 此目錄包含臨時文件,可能會在沒有通知的情況下進行刪除,例如通過普通任務或在系統啟動時刪除。
+ `/usr` - 此目錄通常是從單獨的分區掛載的。它應該只保存可共享的只讀數據,以便它可以由運行 Linux 的各種機器來掛載。
+ `/usr/bin` - 這是可執行程序的主目錄。普通用戶執行的大多數程序不需要啟動或修復系統,它們不在本地安裝,并且應放在該目錄中。
+ `/usr/local` - 這是站點本地的程序的通常位置。
+ `/usr/share` - 此目錄包含具有特定應用程序數據的子目錄,可以在同一操作系統的不同架構之間共享。通常可以在這里找到,以前存在于`/usr/doc`或`/usr/ lib`或`/usr/man`中的東西。
+ `/usr/share/doc` - 已安裝程序的文檔。
+ `/var` - 此目錄包含可能會更改大小的文件,如假脫機和日志文件。
+ `/var/log` - 其他日志文件。
+ `/var/spool` - 各種程序的假脫機(或排隊)文件。
+ `/var/tmp` - 類似`/tmp`,此目錄保存臨時文件,不知道存儲多長時間。
真的很長,但是你不需要記住它,`man hier 7`總是在那里。現在你只需要知道`/usr/bin`,`/usr/share`和`/var/log`。
讓我們再談談軟件包和包管理器。首先讓我們重復一下:
+ 每個程序都叫做軟件包。
+ 包管理器管理所有軟件包,即安裝或卸載它們。
+ 為此,包管理器擁有一個已安裝和可用軟件包的數據庫。
此數據庫中的每個包都具有狀態,指示是否安裝了軟件包,軟件包是否可以更新,以及其它。你可以通過鍵入`dpkg -l`打印當前安裝的軟件包。示例輸出如下所示:
```
user1@vm1:~$ dpkg -l | head | less -S
Desired=Unknown/Install/Remove/Purge/Hold
| Status=Not/Inst/Conf-files/Unpacked/halF-conf/Half-inst/trig-aWait/Trig-pend
|/ Err?=(none)/Reinst-required (Status,Err: uppercase=bad)
||/ Name Version Description
+++-=====================-====================-========================================================
ii acpi 1.5-2 displays information on ACPI devices
ii acpi-support-base 0.137-5 scripts for handling base ACPI events such as the power
ii acpid 1:2.0.7-1squeeze4 Advanced Configuration and Power Interface event daemon
```
你可以看到,這些狀態顯示在前三列中。從這個輸出可以看出,所有的包都需要安裝,或者確實已安裝,沒有錯誤,因為第三列是空的。以下是所有可能的包狀態列表。
第一列。預期的操作,我們想要對軟件包做的事情:
+ `u` = 未知(未知狀態)
+ `i` = 安裝。選擇該軟件包進行安裝。
+ `r` = 選擇該軟件包進行卸載(即我們要刪除所有文件,但配置文件除外)。
+ `p` = 清理 選擇軟件包進行清理(即我們要從系統目錄,甚至配置文件中刪除所有東西)。
+ `h` = 標記為保留的包,不由`dpkg`處理,除非強制使用選項`-force-hold`。
第二列。軟件包狀態,軟件包目前是什么狀態:
+ `n` = 未安裝。該軟件包未安裝在你的系統上。
+ `c` = 配置文件。系統上只存在該包的配置文件。
+ `H` = 半安裝。包的安裝已經啟動,但由于某種原因未完成。
+ `U` = 已解壓縮。該軟件包已解壓縮,但未配置。
+ `F` = 半配置。軟件包已解壓縮,配置已啟動,但由于某些原因尚未完成。
+ `W` = 觸發器等待。軟件包等待另一個包的觸發器處理。
+ `t` = 觸發中。軟件包已被觸發。
+ `i` = 已安裝.該軟件包已解壓縮并配置好。
第三欄。出錯的東西。
+ `R` = 需要恢復。標有“需要恢復”的軟件包已損壞,需要重新安裝。這些包不能被刪除,除非強制使用選項`-force-remove-reinstreq`。
同樣,你不需要記住它,只需記住`info dpkg`命令,它將顯示這些信息。現在不要糾結包狀態,只要記住,`ii`狀態意味著這個包一切正常。
好了,讓我們安裝一個名為`midnight commander`的程序,它是一個文件管理器,它允許你直觀地瀏覽系統上的目錄,并對你的文件執行復制,重命名或刪除操作。
現在,你將了解如何搜索,安裝和刪除軟件包。
## 這樣做
```
1: aptitude search mc | grep -i 'midnight commander'
2: sudo aptitude install mc
3: dpkg -L mc | grep '/usr/bin'
4: aptitude search mc | grep -i 'midnight commander'
5: mc
6: <F10><ENTER>
7: sudo aptitude remove mc
```
## 你應該看到什么
```
user1@vm1:~$ aptitude search mc | grep -i 'midnight commander'
p mc - Midnight Commander - a powerful file manag
p mc-dbg - Midnight Commander - a powerful file manag
user1@vm1:/home/user1# sudo aptitude install mc
The following NEW packages will be installed:
libglib2.0-0{a} libglib2.0-data{a} mc shared-mime-info{a}
0 packages upgraded, 4 newly installed, 0 to remove and 0 not upgraded.
Need to get 2,957 kB/5,157 kB of archives. After unpacking 17.0 MB will be used.
Do you want to continue? [Y/n/?] y
Get:1 http://mirror.yandex.ru/debian/ squeeze/main libglib2.0-0 amd64 2.24.2-1 [1,122 kB]
Get:2 http://mirror.yandex.ru/debian/ squeeze/main libglib2.0-data all 2.24.2-1 [994 kB]
Get:3 http://mirror.yandex.ru/debian/ squeeze/main shared-mime-info amd64 0.71-4 [841 kB]
Fetched 2,957 kB in 0s (4,010 kB/s)
Selecting previously deselected package libglib2.0-0.
(Reading database ... 24220 files and directories currently installed.)
Unpacking libglib2.0-0 (from .../libglib2.0-0_2.24.2-1_amd64.deb) ...
Selecting previously deselected package libglib2.0-data.
Unpacking libglib2.0-data (from .../libglib2.0-data_2.24.2-1_all.deb) ...
Selecting previously deselected package mc.
Unpacking mc (from .../mc_3%3a4.7.0.9-1_amd64.deb) ...
Selecting previously deselected package shared-mime-info.
Unpacking shared-mime-info (from .../shared-mime-info_0.71-4_amd64.deb) ...
Processing triggers for man-db ...
Setting up libglib2.0-0 (2.24.2-1) ...
Setting up libglib2.0-data (2.24.2-1) ...
Setting up mc (3:4.7.0.9-1) ...
Setting up shared-mime-info (0.71-4) ...
user1@vm1:~$ aptitude search mc | grep -i 'midnight commander'
i mc - Midnight Commander - a powerful file manag
p mc-dbg - Midnight Commander - a powerful file manag
user1@vm1:~$ mc
Left File Command Options Right
|< ~ ---------------------.[^]>||< ~ ---------------------.[^]>|
|'n Name | Size |Modify time||'n Name | Size |Modify time|
|/.. |P--DIR|un 6 21:49||/.. |P--DIR|un 6 21:49|
|/.aptitude | 4096|un 25 18:34||/.aptitude | 4096|un 25 18:34|
|/.mc | 4096|un 25 18:41||/.mc | 4096|un 25 18:41|
| .bash~story| 10149|un 21 12:01|| .bash~story| 10149|un 21 12:01|
| .bash~ogout| 220|un 6 21:48|| .bash~ogout| 220|un 6 21:48|
| .bashrc | 3184|un 14 12:24|| .bashrc | 3184|un 14 12:24|
| .lesshst | 157|un 25 11:31|| .lesshst | 157|un 25 11:31|
|----------------------------------------------------------------|
|UP--DIR --UP--DIR |
----------- 6367M/7508M (84%) -------------- 6367M/7508M (84%) -|
Hint: The homepage of GNU Midnight Commander: http://www.midnight-
user1@vm1:~$ [^]
1Help 2Menu 3View 4Edit 5Copy 6Re~ov 7Mkdir 8De~te 9Pu~Dn
user1@vm1:~$ sudo aptitude remove mc
The following packages will be REMOVED:
libglib2.0-0{u} libglib2.0-data{u} mc shared-mime-info{u}
0 packages upgraded, 0 newly installed, 4 to remove and 0 not upgraded.
Need to get 0 B of archives. After unpacking 17.0 MB will be freed.
Do you want to continue? [Y/n/?] y
(Reading database ... 24637 files and directories currently installed.)
Removing shared-mime-info ...
Removing mc ...
Removing libglib2.0-data ...
Removing libglib2.0-0 ...
Processing triggers for man-db ...
user1@vm1:~$
```
## 解釋
1. 搜索包含`mc`的包名稱,并在描述中僅顯示包含`midnight commander`的包。`grep -i`意味著,`grep`應該搜索小寫和大寫字母,如果沒有它,`grep`不會顯示包含`Midnight Commander`的行,因為它們以大寫字母開頭。請注意,`mc`狀態為`p`狀態,這意味著這個包的所需操作是清理,并且由于其他兩個狀態列中沒有任何內容,因此我們可以得出結論,該包未安裝。你的`man`注意到了,最開始你沒有安裝這個包,但這也沒問題,因為沒有安裝的軟件包 默認是清除狀態。
1. 安裝軟件包`mc`。因為這個更改是系統范圍的,所以這個命令需要使用超級用戶,它能夠寫入系統中的所有目錄。還要注意 debian 軟件包管理器`aptitude`如何自動安裝`mc`所需的`libglib2.0-0`,`libglib2.0-data`和`shared-mime-info`軟件包。
1. 顯示你安裝的包的可執行文件。如你所見,他們放在`/usr/bin`中。
1. 調用`mc`。
1. 退出`mc`。
1. 刪除`mc`。請注意,自動安裝的軟件包也會自動刪除。如果在 安裝`mc`之后,你安裝一些需要這些軟件包的東西,`aptitude`將保留它們。
## 附加題
好吧,東西真多。但這里還有更多:
鍵入`aptiutde search emacs`。弄清楚`v`的意思是什么。
閱讀或瀏覽 Debian 手冊中的[第 2 章 Debian 軟件包管理](http://www.debian.org/doc/manuals/debian-reference/ch02.en.html)。
- 笨辦法學 Linux 中文版
- 練習 0:起步
- 練習 1:文本編輯器,vim
- 練習 2:文本瀏覽器,少即是多
- 練習 3:Bash:Shell、.profile、.bashrc、.bash_history
- 練習 4:Bash:處理文件,pwd,ls,cp,mv,rm,touch
- 練習 5:Bash:環境變量,env,set,export
- 練習 6:Bash:語言設置,LANG,locale,dpkg-reconfigure locales
- 練習 7:Bash:重定向,stdin,stdout,stderr,<,>,>>,|,tee,pv
- 練習 8:更多的重定向和過濾:head,tail,awk,grep,sed
- 練習 9:Bash:任務控制,jobs,fg
- 練習 10:Bash:程序退出代碼(返回狀態)
- 練習 11:總結
- 練習 12:文檔:man,info
- 練習 13:文檔:Google
- 練習 14:包管理:Debian 包管理工具aptitude
- 練習 15:系統啟動:運行級別,/etc/init.d,rcconf,update-rc.d
- 練習 16:處理進程,ps,kill
- 練習 17:任務調度:cron,at
- 練習 18:日志:/var/log,rsyslog,logger
- 練習 19:文件系統:掛載,mount,/etc/fstab
- 練習 20:文件系統:修改和創建文件系統,tune2fs,mkfs
- 練習 21:文件系統:修改根目錄,chroot
- 練習 22:文件系統:移動數據,tar,dd
- 練習 23:文件系統:權限,chown,chmod,umask
- 練習 24:接口配置,ifconfig,netstat,iproute2,ss,route
- 練習 25:網絡:配置文件,/etc/network/interfaces
- 練習 26:網絡:封包過濾配置,iptables
- 練習 27:安全 Shell,ssh,sshd,scp
- 練習 28:性能:獲取性能情況,uptime,free,top
- 練習 29:內核:內核消息,dmesg
- 練習 30:打磨、洗練、重復:總復習
- 下一步做什么
- Debian 手動安裝