linux中apt-get使用

apt-get簡介

在Ubuntu系統中,常常要用到apt-get install指令來安裝軟件,因爲經常須要root權限來操做,因此搭配sudo食用口感更佳,apt-get指令對於安裝、卸載、升級軟件提供一條龍服務,對比於源碼安裝,實在是業界良心。node

源碼安裝

源碼安裝的流程通常是三部曲:linux

./configure
make
make install
  • ./configure是爲了檢測目標安裝平臺的特徵,而且檢查依賴的軟件包是否可用或者是否缺乏依賴軟件包,configure事實上是個腳本,最終的目的是生成Makefile。git

  • 若是第一條指令沒有報錯,會生成一個Makefile,make指令就是編譯這個源碼包編程

  • 正常編譯完以後若是沒有報錯,就生成了可執行文件,make install指令就是將可執行文件放到指定目錄並配置環境變量,容許咱們在任何目錄下使用這個軟件。canvas

源碼安裝的優勢

對於普通用戶而言,實在是想不到什麼優勢...ubuntu

對於軟件開發者而言,能夠拿到源碼閱讀學習並修改,geek一個軟件簡直比找女友還好玩!同時也能夠在必定程度上防止黑客的攻擊(你知道這個版本的漏洞,可是老夫已經把它修復了!!!)windows

源碼安裝的缺點

其實三部曲的安裝仍是不那麼麻煩的,前提是不報錯!一旦報錯,對於linux初學者而言,那也真是丈二摸不着頭腦,而後各類百度各類google,按照各類江湖術士的方法來整,結果把系統整崩的狀況數不勝數,即便當時能用,可是也有可能留下在之後的使用中常常出現莫名其妙問題的隱患,讓咱們來看看這些問題都是啥樣的:工具

  • ./configure報錯: 若是檢查到缺乏依賴或者依賴文件的版本不匹配呢?通常出現這種狀況,就本身解決吧,通常的作法是,升級軟件包或者安裝缺乏的依賴軟件包,運氣好的話,解決報錯的依賴問題就好了,運氣很差的話,A軟件包依賴B,B又依賴C.....這是比較常見的linux勸退方式,從入門到放棄!學習

  • make報錯,因爲源碼包的形式可能是我的用戶更新維護的,因此可能出現一些平臺沒測試到位或者在特定平臺上程序出現bug的狀況,這種狀況就沒辦法了,若是你有能力debug那固然另說測試

  • make install 報錯,這個指令報錯的形式通常僅僅是沒有權限,加上sudo就行。可是同時由於源碼包多由我的維護,也常常可能出現形成系統垃圾的狀況,又或者你須要卸載的時候 make uninstall指令僅僅卸載可執行文件,其餘配置文件和依賴文件不做處理。

apt-get指令管理安裝包

在上面說了那麼多源碼安裝的缺點,聰明的盆友就要猜我我將要引出今天的主角:apt-get包管理應用軟件,由apt-get管理的軟件包能夠輕鬆作到一鍵安裝卸載。廢話很少說,咱們先看看它的經常使用用法:

sudo apt-get install XXX
sudo apt-get install -y XXX
sudo apt-get install -q XXX
sudo apt-get remove XXX
sudo apt-get purge XXX
sudo apt-get autoremove
sudo apt-get update
sudo apt-get upgrade

apt-get install

一鍵安裝軟件包,與源碼安裝不一樣的是,這個指令會自動檢測並安裝依賴,並且用apt-get安裝的包都是成熟的軟件包,基本不存在安裝包有嚴重bug或者文件缺失的狀況。

sudo apt-get install -y

這裏主要將的就是-y選項,添加這個選項就至關於不須要重複地確認安裝

sudo apt-get install -q

即-quiet,靜默安裝,固然也不是徹底靜默,會將低等級的log信息屏蔽。

sudo apt-get remove

既然有安裝就會有卸載,remove指令就是卸載,值得注意的是,remove僅僅卸載軟件,可是並不卸載配置文件

sudo apt-get purge

卸載指令,同時卸載相應的配置文件

sudo apt-get autoremove

關於這條指令,官方解釋是這樣的:

autoremove is used to remove packages that were automatically installed to satisfy dependencies for other packages and are now no longer needed

在卸載軟件的時候同時卸載那些當初做爲依賴可是如今並不須要的包。

看起來很是完美的指令,可是博主建議慎用!!這條指令極可能將你要用的依賴包同時卸載,有時候你的安裝包並無經過apt-get指令來管理,apt-get管理工具不會加入這些包的信息,因此在檢索包的依賴關係時可能出問題.

又或者是另外一種狀況:舉個例子:在安裝某個包時,這個包依賴git,可是git並不是你主動下載的,而是做爲依賴下載的,包安裝完以後系統可能就會提示git做爲依賴再也不須要使用,它並不知道你是否是正在使用這個軟件包。

apt-get update

將全部包的來源更新,也就是提取最新的包信息,這一條咱們常用到。

apt-get upgrade

這條指令通常執行在apt-get update以後,它的做用是將系統中舊版本的包升級成最新的,慎用!

由於在linux下,因爲大部分爲非商業軟件,因此穩定性並無獲得很好的驗證,升級到最新版本須要十分慎重!

apt-get執行原理

若是僅僅知道怎麼用而不知道爲何這麼用,那就違背了學習使用linux的初衷,因此咱們仍是須要從原理出發來看apt-get指令時怎麼運行的。

提出問題

首先須要知道的問題是:

  • 咱們用apt-get下載的軟件包是從哪裏來的?

  • 下載以前要作哪些準備工做?

軟件從哪裏來?

全部的deb包由官方統一管理,那爲何咱們能定位到這些軟件包呢?這裏就涉及到一個軟件源的概念,在/etc/apt/目錄下有一個sources.list文件,咱們來看一下這個文件的內容:

cat /etc/apt/sources.list  

deb http://security.ubuntu.com/ubuntu trusty-security main restricted
deb-src http://security.ubuntu.com/ubuntu trusty-security main restricted
deb http://security.ubuntu.com/ubuntu trusty-security universe
deb-src http://security.ubuntu.com/ubuntu trusty-security universe
deb http://security.ubuntu.com/ubuntu trusty-security multiverse
deb-src http://security.ubuntu.com/ubuntu trusty-security multiverse
deb http://extras.ubuntu.com/ubuntu trusty main
deb-src http://extras.ubuntu.com/ubuntu trusty main
deb http://us.archive.ubuntu.com/ubuntu/ trusty-proposed main restricted multiverse universe

因爲條目太多,這裏只貼出一部分。能夠看出來的是,這裏都是一些資源網站,軟件包資源固然就是出自這裏。

下載以前要作哪些工做

實踐出真知,咱們來下載一個軟件看看:

Reading package lists... Done
Building dependency tree       
Reading state information... Done
The following packages were automatically installed and are no longer required:
account-plugin-windows-live libblas3 libbonobo2-0 libbonobo2-common
libbonoboui2-common libglade2-0 libgnomecanvas2-0 libgnomecanvas2-common
libgnomeui-common libidl-common libidl0 libisl10 liblinear-tools liblinear1
libllvm3.5 libntdb1 liborbit-2-0 liborbit2 libupstart1
linux-headers-3.16.0-30 linux-headers-3.16.0-30-generic
linux-image-3.16.0-30-generic linux-image-extra-3.16.0-30-generic
Use 'apt-get autoremove' to remove them.
The following extra packages will be installed:
libdiodon0 libunique-3.0-0
Suggested packages:
diodon-plugins
The following NEW packages will be installed:
diodon libdiodon0 libunique-3.0-0
0 upgraded, 3 newly installed, 0 to remove and 221 not upgraded.
Need to get 272 kB of archives.
After this operation, 1,348 kB of additional disk space will be used.
Do you want to continue? [Y/n]

這是前期準備工做的log信息,咱們能夠看到

第一步是Reading package lists,這就是從/etc/apt/sources.list中檢索可用的源中是否有這個軟件包。

而後從下面的log能夠看出,下面的步驟就是生成軟件依賴樹,將須要的依賴包提早列出來,在安裝所需軟件以前進行安裝。

常常咱們在下載軟件的時候須要先添加源,不少盆友都不知道這是在幹什麼,看到這裏你們應該是能看出個緣由了:

由於你須要下載的軟件並不在官方源網站中,因此須要先行添加資源網站,apt-get才能根據相應的源檢索到相應的資源,添加源有不少操做方式,歸根結底就是一個操做結果:在/etc/apt/sources.list添加相應的資源網站,知道了這個,就能夠直接在文件中添加源,可是要記住linux下最基本的一個習慣:操做系統文件時先備份

使用apt-get可能遇到的問題

在使用apt-get install的時候,咱們可能會遇到下面的問題:

E: Could not get lock /var/lib/dpkg/lock - open (11: Resource temporarily unavailable)
E: Unable to lock the administration directory (/var/lib/dpkg/), is another process using it?

碰到這種問題怎麼解決呢?

解決方法

這種問題的緣由是apt-get被佔用,沒法再次使用apt-get命令操做。解決辦法分爲兩種:
一、在終端輸入,ps -ef | grep "apt-get",這個指令找出佔用apt-get應用的進程,而後用sudo kill -9 PID強制結束進程

二、可是也有可能找不到這個佔用的進程,極可能你在上一次安裝操做的時候意外斷電,沒有正常退出致使的,這個時候須要作的操做就是強制刪除如下文件就能夠:
sudo rm /var/cache/apt/archives/lock
sudo rm /var/lib/dpkg/lock
從這裏能夠看出,其實就是刪除兩個鎖文件,咱們大能夠猜測一下,系統在執行apt-get指令安裝時,會在/var/lib/dpkg/和/var/cache/apt/archives/下生成lock文件,當指令正常退出時,系統會刪除這個lock文件。

這樣就能夠解釋爲何刪除這兩個文件就能夠恢復apt-get的自由。

那咱們就來驗證一下,以安裝diodon爲例:

sudo apt-get install diodon

在系統詢問是否繼續時,咱們先不操做,打開另外一個終端。鍵入:

ls /var/lib/dpkg/lock

結果顯示

/var/lib/dpkg/lock

表示是有這個文件的,而後咱們關掉apt-get執行的進程,再檢查沒有操做apt-get文件時是否有這個文件:

ls /var/lib/dpkg/lock

結果顯示

/var/lib/dpkg/lock

竟然還能查到這個文件,證實咱們的猜測是錯誤的!那就再猜想:既然是lock文件,那麼就涉及到文件鎖,文件是一直存在的,可是在執行apt-get時被鎖住了,在正常退出的時候被解鎖,立馬行動,一樣的,先鍵入:

sudo apt-get install diodon

並讓其停在用戶確認界面,在查看系統中被鎖住的文件,在終端鍵入:

cat /proc/locks  #查看系統中被鎖定的文件

結果顯示:
1: POSIX ADVISORY WRITE 13604 08:01:792131 0 EOF
2: POSIX ADVISORY WRITE 13604 08:01:792927 0 EOF
3: OFDLCK ADVISORY WRITE -1 08:01:393386 0 0
4: POSIX ADVISORY READ 2957 08:01:393504 128 128
5: POSIX ADVISORY READ 2957 08:01:393381 1073741826 1073742335
6: POSIX ADVISORY READ 2926 08:01:393504 128 128
7: POSIX ADVISORY READ 2926 08:01:393381 1073741826 1073742335
8: POSIX ADVISORY READ 2949 08:01:393504 128 128
9: POSIX ADVISORY READ 2949 08:01:393381 1073741826 1073742335
10: POSIX ADVISORY WRITE 2836 08:01:524297 0 EOF
...僅顯示用戶級別

而後關掉apt-get的進程,再次鍵入:

cat /proc/locks  #查看系統中被鎖定的文件

結果顯示
1: OFDLCK ADVISORY WRITE -1 08:01:393386 0 0
2: POSIX ADVISORY READ 2957 08:01:393504 128 128
3: POSIX ADVISORY READ 2957 08:01:393381 1073741826 1073742335
4: POSIX ADVISORY READ 2926 08:01:393504 128 128
5: POSIX ADVISORY READ 2926 08:01:393381 1073741826 1073742335
6: POSIX ADVISORY READ 2949 08:01:393504 128 128
7: POSIX ADVISORY READ 2949 08:01:393381 1073741826 1073742335
8: POSIX ADVISORY WRITE 2836 08:01:524297 0 EOF
...#僅顯示用戶級別

對比發現很明顯,在使用apt-get的時候,系統中被鎖定的文件明顯多出兩個,可是那一行數字是什麼意思呢?下列是對照關係,

number, type, mode,     type,   pid,    maj:min:inode     start    end
1:     POSIX ADVISORY  WRITE   13604   08:01:792131      0        EOF

咱們能夠經過inode的對比來確認在apt-get操做時多出來的兩個被鎖住的文件究竟是不是上述提到的那兩個鎖文件。

ls -i /var/lib/dpkg/lock /var/cache/apt/archives/lock

輸出結果:

792131 /var/cache/apt/archives/lock  792927 /var/lib/dpkg/lock

很顯然,inode爲792131,792927的兩個文件剛好是上述進行apt-get操做和不操做時被加鎖的兩個文件,這個猜測是正確的。

可是問題又來了:當apt-get沒法獲取這兩個鎖文件的操做權限時,爲何刪除這兩個文件就能夠了呢?這不會致使系統問題嗎?
帶着這個疑問,咱們繼續來操做:

sudo rm /var/cache/apt/archives/lock  /var/lib/dpkg/lock

而後再查詢文件:

ls /var/cache/apt/archives/lock  /var/lib/dpkg/lock

輸出結果:

ls: cannot access '/var/cache/apt/archives/lock': No such file or directory
ls: cannot access '/var/lib/dpkg/lock': No such file or directory

這下這兩個文件是刪除乾淨了,那咱們得趕忙看看apt-get命令是否還能操做:

sudo apt-get install diodon

結果發現仍是能夠操做,這時候我再來看這兩個文件:

ls /var/cache/apt/archives/lock  /var/lib/dpkg/lock

輸出結果:

/var/cache/apt/archives/lock  /var/lib/dpkg/lock

竟然又有了,這下是明白了,原來當咱們遇到apt-get的沒法獲取鎖的問題,直接刪除這兩個文件的同時這兩個文件的鎖天然也不存在了,在下一次從新使用apt-get指令時,系統檢測到沒有鎖文件時就會建立這兩個文件,同時進行apt-get操做。

其實這是一種覆蓋式的偷懶操做,咱們大能夠用修改文件的鎖屬性的方式來解決這個問題,在文件inode結構體中有一個

struct file_lock *i_flock;

直接操做這個結構體就能夠,可是這須要涉及到C和linux系統編程方面,在這裏就不贅述了。

好了,關於ubuntu中apt-get包管理軟件的討論就到此爲止啦,若是朋友們對於這個有什麼疑問或者發現有文章中有什麼錯誤,歡迎留言

原創博客,轉載請註明出處!

祝各位早日實現項目叢中過,bug不沾身.

相關文章
相關標籤/搜索