Linux 安裝軟件的幾種方式
哈嘍大家好,我是咸魚(yú)。
相信小伙伴們都知道在 Linux 中,安裝軟件一般有三種方式:
- YUM 安裝
- RPM 安裝
- 源碼編譯安裝
咸魚(yú)平時(shí)三種安裝方式都會(huì)用,但是具體原理和區(qū)別卻沒(méi)有去深入了解過(guò),結(jié)果上周部門(mén)剛來(lái)的新人問(wèn)我這幾種安裝方式的時(shí)候,一下子把我問(wèn)懵了。
那么今天咸魚(yú)將會(huì)向小伙伴們介紹這三種軟件安裝方式的原理以及各自的優(yōu)缺點(diǎn)。
源碼編譯安裝
首先我們來(lái)看源碼編譯安裝,這是 Linux 中最傳統(tǒng)的軟件安裝方式。
我們知道在 Linux 中,安裝好的軟件通常是以可執(zhí)行文件的形式提供的,這些可執(zhí)行文件是經(jīng)過(guò)編譯的二進(jìn)制程序,其本質(zhì)上是由計(jì)算機(jī)可以直接執(zhí)行的機(jī)器指令組成的,而二進(jìn)制程序可以直接在 Linux 系統(tǒng)上運(yùn)行,執(zhí)行相應(yīng)的功能。
"ELF 64-bit LSB executable" 時(shí),表示該文件是一個(gè) 64 位的 ELF 可執(zhí)行文件。
“源碼”就是源代碼,源代碼其實(shí)就是一般的純文本文件,我們編寫(xiě)好“源碼”之后,需要將這個(gè)文本文件“編譯”成為操作系統(tǒng)看得懂的二進(jìn)制程序,這個(gè)“編譯”的過(guò)程就需要”編譯器“來(lái)實(shí)現(xiàn)。
比如說(shuō)我們使用 Linux 的標(biāo)準(zhǔn)程序語(yǔ)言 C 來(lái)寫(xiě)一個(gè)源代碼,然后用 C 語(yǔ)言編譯器 gcc 來(lái)編譯,就可以制作一個(gè)可執(zhí)行二進(jìn)制程序。
有時(shí)候我們會(huì)在程序當(dāng)中調(diào)用外部子程序,或是利用其他軟件提供的函數(shù),這個(gè)時(shí)候我們就需要在編譯的過(guò)程中將對(duì)應(yīng)的函數(shù)庫(kù)加進(jìn)去,這樣編譯器就可以將源代碼與函數(shù)庫(kù)作一個(gè)鏈接(link)。
make 與 makefile
我們?cè)谟?gcc 這類編譯器進(jìn)行編譯的時(shí)候,需要手動(dòng)指定要編譯的每個(gè)源代碼文件以及相關(guān)的編譯選項(xiàng)(如編譯模式、優(yōu)化級(jí)別等)。
編譯小型程序還好,如果碰到包含大量源代碼的程序就會(huì)導(dǎo)致編譯過(guò)程往往極為復(fù)雜(例如需要手動(dòng)管理依賴關(guān)系和編譯順序),那么我們可以使用 make 來(lái)進(jìn)行編譯,make 能夠根據(jù)代碼文件之間的依賴關(guān)系自動(dòng)執(zhí)行必要的編譯和鏈接操作,簡(jiǎn)化編譯過(guò)程。
當(dāng)執(zhí)行 make 命令時(shí),make 會(huì)在當(dāng)前目錄下查找 makefile 這個(gè)文件(makefile 里面記錄了源代碼該如何編譯的詳細(xì)信息)。
通常軟件開(kāi)發(fā)商會(huì)寫(xiě)一個(gè)檢測(cè)用戶操作環(huán)境以及當(dāng)前操作環(huán)境是否有軟件開(kāi)發(fā)商所需要的其他功能的程序,這個(gè)檢測(cè)程序一般命名為 config 或 configure,檢測(cè)程序執(zhí)行完畢之后就會(huì)主動(dòng)建立出一個(gè) makefile 文件。
通常檢測(cè)的內(nèi)容如下:
- 是否有適合的編譯器可以編譯該軟件的代碼
- 是否已經(jīng)存在該軟件所需要的函數(shù)庫(kù)或其他依賴條件
- 操作系統(tǒng)是否適合該軟件
- 內(nèi)核的頭文件是否存在
makefile 是一種文本文件,它包含了一組規(guī)則和指令,用于告訴 make 工具如何編譯和鏈接源代碼文件,生成可執(zhí)行程序或庫(kù)文件等:
Tarball(壓縮文件)
前面我們已經(jīng)知道,源代碼其實(shí)就是純文本文件,我們想要安裝一款軟件,就需要去官網(wǎng)下載這些源碼到本地,但是這樣是很浪費(fèi)帶寬和消耗網(wǎng)絡(luò)資源的(純文本文件在網(wǎng)絡(luò)上是很浪費(fèi)帶寬的一種文件格式),所以如果能夠把這些源碼將其打包和壓縮,不但能夠讓用戶方便下載,還能減輕官網(wǎng)的網(wǎng)絡(luò)帶寬, Tarball 文件由此誕生。
所謂的 Tarball 文件,就是將軟件的所有源碼先用 tar 打包,然后再壓縮(最常見(jiàn)的就是 gzip 壓縮技術(shù)),所以 Tarball 文件一般的擴(kuò)展名會(huì)寫(xiě)成 *.tar.gz 或 *.tgz。
所以我們常見(jiàn)的安裝方式過(guò)程如下:
- 從官網(wǎng)下載 Tarball 軟件包,放在 /usr/local/src 目錄下解壓縮
- 解壓縮之后進(jìn)入到軟件目錄,查看 INSTALL 和 README 等相關(guān)文件內(nèi)容,然后安裝好一些依賴的軟件
- 建立 makefile,通過(guò)自動(dòng)檢測(cè)程序(config 或 configure)生成 makefile 文件
- 使用 make 命令進(jìn)行編譯
- 最后 make install 安裝
我們以安裝 nginx 為例
(1) 首先從官網(wǎng)下載 Tarball 文件到相關(guān)目錄
(2) 然后安裝相關(guān)的依賴
(3) 對(duì) Tarball 文件解壓縮,并進(jìn)入文件目錄
(4) 建立 makefile(指定了安裝目錄 /usr/local/nginx)
(5) 編譯以及安裝
總結(jié)一下
- 源代碼大多為純文本文件,需要通過(guò)編譯器的編譯操作后,才能夠生成操作系統(tǒng)看得懂的可執(zhí)行二進(jìn)制文件
- 可以通過(guò) make 和 makefile 來(lái)簡(jiǎn)化編譯流程
- makefile 包含了一組規(guī)則和指令,由自動(dòng)檢測(cè)程序(config 或 configure)生成
- 為了方便用戶下載和檢測(cè)軟件官網(wǎng)的壓力,一般通過(guò) Tarball 的方式來(lái)管理軟件
RPM 安裝
前面我們講到了源碼編譯安裝,即通過(guò)下載軟件發(fā)行商提供的 Tarball 文件來(lái)進(jìn)行安裝,將 Tarball 文件下載之后還要解壓縮,還要 configure 檢測(cè),還要編譯還要配置還要安裝,可以看到過(guò)程是比較復(fù)雜的,需要敲的命令比較多,很容易勸退小白,不但如此,這種安裝方式還會(huì)導(dǎo)致一些其他問(wèn)題:
- 依賴性問(wèn)題: 軟件通常依賴于其他軟件庫(kù)和組件,手動(dòng)解決依賴性問(wèn)題可能會(huì)變得非常棘手,特別是當(dāng)軟件的依賴關(guān)系相對(duì)復(fù)雜時(shí)
- 版本控制: 用戶需要自行管理多個(gè)軟件的不同版本,這可能導(dǎo)致版本沖突和不一致
- 一致性問(wèn)題: 用戶需要花費(fèi)大量時(shí)間來(lái)確保所有安裝的軟件都保持一致,并避免不同版本之間的沖突
為了能夠更好地更加標(biāo)準(zhǔn)地管理 Linux 的軟件,減輕用戶的負(fù)擔(dān)和學(xué)習(xí)成本,廠商們就在想:我們能不能先把軟件所有的相關(guān)文件都打包成一個(gè)特殊格式的軟件包(文件),然后在這個(gè)軟件包里面不但包含了檢測(cè)依賴關(guān)系和系統(tǒng)環(huán)境的文件,還包含了關(guān)于這個(gè)軟件的信息、二進(jìn)制文件等等。
這樣當(dāng)用戶下載了這個(gè)軟件包的時(shí)候,只需要簡(jiǎn)單的命令就能夠安裝,并且還會(huì)把當(dāng)前軟件的信息管理起來(lái),方便用戶后續(xù)的升級(jí)、卸載等操作,于是 Red Hat 在 1995 年引入了 RPM (RedHat Package Manager)。
RPM 是以一種數(shù)據(jù)庫(kù)記錄的方式來(lái)將你所需要的軟件安裝到你的 Linux 系統(tǒng)的一套管理機(jī)制:
- 廠商們先把軟件編譯好,然后打包成 RPM 包(包含軟件的依賴關(guān)系、版本信息以及其他元數(shù)據(jù))
- 當(dāng)你在安裝 RPM 包的時(shí)候,系統(tǒng)會(huì)檢查該軟件包的依賴的其他軟件包是否已經(jīng)安裝
- 然后檢查本地沒(méi)有已經(jīng)安裝好的軟件或者沖突的版本(有的話會(huì)給提示)
- 如果上面兩項(xiàng)檢查都通過(guò)了,系統(tǒng)會(huì)將安裝的軟件包的信息添加到 RPM 數(shù)據(jù)庫(kù)中,以便后續(xù)的管理和查詢
- 安裝完成后,系統(tǒng)會(huì)更新 RPM 數(shù)據(jù)庫(kù)中的信息,標(biāo)記軟件包為已安裝狀態(tài),并記錄安裝時(shí)間、版本等信息
我們來(lái)看一下常見(jiàn)的 rpm 命令有哪些:
YUM 安裝
前面我們介紹了 RPM 安裝,盡管 RPM 可以處理軟件的依賴關(guān)系,但仍有一定的局限性,比如依賴關(guān)系需要我們手動(dòng)處理,RPM 不會(huì)幫我們自動(dòng)下載安裝所需要的依賴軟件包,這就導(dǎo)致我們需要手動(dòng)查找并下載軟件包,為了解決這個(gè)問(wèn)題,YUM(Yellowdog Updater, Modified)誕生了。
YUM 基于 RPM 包去管理軟件包,它通過(guò)一個(gè)名為 `yum repository ` 的服務(wù)器存儲(chǔ)庫(kù)來(lái)管理軟件包,其中包含了各種軟件包及其依賴關(guān)系信息,這使得用戶可以通過(guò)簡(jiǎn)單的命令完成軟件包的安裝、升級(jí)和卸載,同時(shí)自動(dòng)處理依賴關(guān)系,無(wú)須繁瑣地一次次下載、安裝。
雖然 YUM 最初是為 Red Hat Linux 開(kāi)發(fā)的,但它的原理和功能非常通用,因此很多其他 Linux 發(fā)行版也采用了 YUM 作為其軟件包管理工具。
下面是一些 yum 常見(jiàn)命令:
總結(jié)
最后我們總結(jié)一下:
區(qū)別:
- 源碼編譯安裝需要手動(dòng)下載源代碼,解決依賴問(wèn)題,配置編譯選項(xiàng),編譯,安裝,并且沒(méi)有自動(dòng)升級(jí)和卸載功能
- RPM 軟件包包含已經(jīng)編譯好的二進(jìn)制程序、相關(guān)依賴關(guān)系信息以及軟件信息等,減輕了軟件安裝復(fù)雜性,方便軟件管理
- YUM 軟件包基于 RPM 包去管理軟件包,進(jìn)一步解決了軟件依賴等問(wèn)題,不同于 RPM 安裝,YUM 安裝能夠自動(dòng)解決軟件包的依賴關(guān)系
各自優(yōu)缺點(diǎn):
源碼編譯安裝:
- 優(yōu)點(diǎn):靈活性高定制性強(qiáng),可以根據(jù)需要自定義編譯選項(xiàng)和功能;可以跨平臺(tái)使用
- 缺點(diǎn):安裝過(guò)程復(fù)雜;不能解決軟件依賴問(wèn)題;管理不方便,沒(méi)有自動(dòng)升級(jí)卸載機(jī)制
RPM 安裝:
- 優(yōu)點(diǎn):管理方便,將軟件以及相關(guān)信息打包成 RPM 形式,可以自動(dòng)升級(jí)和卸載軟件;可以輕松跟蹤已安裝的軟件包、版本和更新信息;較好地解決軟件依賴問(wèn)題
- 缺點(diǎn):遇到軟件依賴問(wèn)題的時(shí)候,需要手動(dòng)解決;不夠靈活,不能夠自定義功能
YUM 安裝:
- 優(yōu)點(diǎn):自動(dòng)解決軟件包的依賴關(guān)系;管理方便,提供軟件包的安裝、升級(jí)、卸載和搜索等功能
- 缺點(diǎn):缺少定制化,不能自定義功能;更新滯后,某些發(fā)行版的官方倉(cāng)庫(kù)可能不及時(shí)提供最新版本的軟件包