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