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