哈嘍大家好,我是鹹魚 相信小伙伴們都知道在 Linux 中,安裝軟體一般有三種方式 * yum 安裝 * rpm 安裝 * 源碼編譯安裝 鹹魚平時三種安裝方式都會用,但是具體原理和區別卻沒有去深入瞭解過 結果上周部門剛來的新人問我這幾種安裝方式的時候,一下子把我問懵了 那麼今天鹹魚將會向小伙伴們介紹 ...
哈嘍大家好,我是鹹魚
相信小伙伴們都知道在 Linux 中,安裝軟體一般有三種方式
- yum 安裝
- rpm 安裝
- 源碼編譯安裝
鹹魚平時三種安裝方式都會用,但是具體原理和區別卻沒有去深入瞭解過
結果上周部門剛來的新人問我這幾種安裝方式的時候,一下子把我問懵了
那麼今天鹹魚將會向小伙伴們介紹這三種軟體安裝方式的原理以及各自的優缺點
源碼編譯安裝
首先我們來看源碼編譯安裝,這是 Linux 中最傳統的軟體安裝方式
我們知道在 Linux 中,安裝好的軟體通常是以可執行文件的形式提供的
這些可執行文件是經過編譯的二進位程式,其本質上是由電腦可以直接執行的機器指令組成的
而二進位程式可以直接在 Linux 系統上運行,執行相應的功能
# 可以用 file 工具來查看
[root@minion2 ~]# file /bin/bash
/bin/bash: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.32, BuildID[sha1]=85e3da5a087950e7aaeb7893c056218a8874d2e5, stripped
"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 工具如何編譯和鏈接源代碼文件,生成可執行程式或庫文件等
#來看一個 makefile 簡單例子
[root@root ~]# cat makefile
main: main.o haha.o sin_value.o cos_value.o
gcc -o main main.o haha.o sin_value.o cos_value.o -lm
clean:
rm -f main main.o haha.o sin_value.o cos_value.o
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 文件到相關目錄
cd /usr/local/src && \
wget http://nginx.org/download/nginx-1.15.4.tar.gz
2、然後安裝相關的依賴軟體
yum -y install gcc openssl-devel pcre-devel zlib-devel
3、對 Tarball 文件解壓縮,併進入文件目錄
tar -zxvf nginx-1.15.4.tar.gz -C /usr/local
cd /usr/local/nginx-1.15.4
4、建立 makefile(指定了安裝目錄 /usr/local/nginx
)
./configure --prefix=/usr/local/nginx
5、編譯以及安裝
make && make install
總結一下
- 源代碼大多為純文本文件,需要通過編譯器的編譯操作後,才能夠生成操作系統看得懂的可執行二進位文件
- 可以通過 make 和 makefile 來簡化編譯流程
- makefile 包含了一組規則和指令,由自動檢測程式(
config
或configure
)生成 - 為了方便用戶下載和檢測軟體官網的壓力,一般通過 Tarball 的方式來管理軟體
rpm 安裝
前面我們講到了源碼編譯安裝,即通過下載軟體發行商提供的 Tarball 文件來進行安裝
將 Tarball 文件下載之後還要解壓縮,還要 configure
檢測,還要編譯還要配置還要安裝,可以看到過程是比較複雜的,需要敲的命令比較多,很容易勸退小白
不但如此,這種安裝方式還會導致一些其他問題
- 依賴性問題: 軟體通常依賴於其他軟體庫和組件,手動解決依賴性問題可能會變得非常棘手,特別是當軟體的依賴關係相對複雜時
- 版本控制: 用戶需要自行管理多個軟體的不同版本,這可能導致版本衝突和不一致
- 一致性問題: 用戶需要花費大量時間來確保所有安裝的軟體都保持一致,並避免不同版本之間的衝突
為了能夠更好地更加標準地管理 Linux 的軟體,減輕用戶的負擔和學習成本,廠商們就在想:我們能不能先把軟體所有的相關文件都打包成一個特殊格式的軟體包(文件)
然後在這個軟體包裡面不但包含了檢測依賴關係和系統環境的文件,還包含了關於這個軟體的信息、二進位文件等等
這樣當用戶下載了這個軟體包的時候,只需要簡單的命令就能夠安裝,並且還會把當前軟體的信息管理起來,方便用戶後續的升級、卸載等操作
於是 Red Hat 在 1995 年引入了 RPM (RedHat Package Manager)
RPM 是以一種資料庫記錄的方式來將你所需要的軟體安裝到你的 Linux 系統的一套管理機制
1、廠商們先把軟體編譯好,然後打包成 RPM 包(包含軟體的依賴關係、版本信息以及其他元數據)
2、當你在安裝 RPM 包的時候,系統會檢查該軟體包的依賴的其他軟體包是否已經安裝
3、然後檢查本地沒有已經安裝好的軟體或者衝突的版本(有的話會給提示)
4、如果上面兩項檢查都通過了,系統會將安裝的軟體包的信息添加到 RPM 資料庫中,以便後續的管理和查詢
5、安裝完成後,系統會更新 RPM 資料庫中的信息,標記軟體包為已安裝狀態,並記錄安裝時間、版本等信息
我們來看一下常見的 rpm 命令有哪些
# 安裝
rpm -i package
# 卸載
rpm -e package
# 卸載的時候不驗證依賴
rpm -e --nodeps package
# 顯示軟體包的詳細信息
rpm -qi package
# 列出已安裝的軟體包
rpm -qa
YUM 安裝
前面我們介紹了 RPM 安裝,儘管 RPM 可以處理軟體的依賴關係,但仍有一定的局限性
比如依賴關係需要我們手動處理,RPM 不會幫我們自動下載安裝所需要的依賴軟體包,這就導致我們需要手動查找並下載軟體包
為瞭解決這個問題,YUM(Yellowdog Updater, Modified)誕生了
YUM 基於 RPM 包去管理軟體包,它通過一個名為 yum repository
的伺服器存儲庫來管理軟體包,其中包含了各種軟體包及其依賴關係信息
這使得用戶可以通過簡單的命令完成軟體包的安裝、升級和卸載,同時自動處理依賴關係,無須繁瑣地一次次下載、安裝
雖然 YUM 最初是為 Red Hat Linux 開發的,但它的原理和功能非常通用,因此很多其他 Linux 發行版也採用了 YUM 作為其軟體包管理工具
下麵是一些 yum 常見命令
# 安裝指定的軟體包
yum install package
# 更新所有已安裝的軟體包到最新版本
yum update
# 更新指定安裝包
yum upgrade package
# 卸載指定的軟體包
yum remove package
# 顯示有關指定軟體包的詳細信息
yum info package
# 列出所有已安裝的軟體包
yum list
# 列出所有可用的軟體包(在倉庫中但尚未安裝)
yum list available
# 清理 YUM 緩存,包括元數據和軟體包
yum clean all
總結
最後我們總結一下
區別:
- 源碼編譯安裝需要手動下載源代碼,解決依賴問題,配置編譯選項,編譯,安裝,並且沒有自動升級和卸載功能
- RPM 軟體包包含已經編譯好的二進位程式、相關依賴關係信息以及軟體信息等,減輕了軟體安裝複雜性,方便軟體管理
- YUM 軟體包基於 RPM 包去管理軟體包,進一步解決了軟體依賴等問題,不同於 RPM 安裝,YUM 安裝能夠自動解決軟體包的依賴關係
各自優缺點:
-
源碼編譯安裝
- 優點:靈活性高定製性強,可以根據需要自定義編譯選項和功能;可以跨平臺使用
- 缺點:安裝過程複雜;不能解決軟體依賴問題;管理不方便,沒有自動升級卸載機制
-
RPM 安裝
- 優點:管理方便,將軟體以及相關信息打包成 RPM 形式,可以自動升級和卸載軟體;可以輕鬆跟蹤已安裝的軟體包、版本和更新信息;較好地解決軟體依賴問題
- 缺點:遇到軟體依賴問題的時候,需要手動解決;不夠靈活,不能夠自定義功能
-
YUM 安裝
- 優點:自動解決軟體包的依賴關係;管理方便,提供軟體包的安裝、升級、卸載和搜索等功能
- 缺點:缺少定製化,不能自定義功能;更新滯後,某些發行版的官方倉庫可能不及時提供最新版本的軟體包