Linux 安裝軟體的幾種方式

来源:https://www.cnblogs.com/edisonfish/archive/2023/08/08/17615162.html
-Advertisement-
Play Games

哈嘍大家好,我是鹹魚 相信小伙伴們都知道在 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)

image-20230807172518277.png

make 與 makefile

我們在用 gcc 這類編譯器進行編譯的時候,需要手動指定要編譯的每個源代碼文件以及相關的編譯選項(如編譯模式、優化級別等)

編譯小型程式還好,如果碰到包含大量源代碼的程式就會導致編譯過程往往極為複雜(例如需要手動管理依賴關係和編譯順序)

那麼我們可以使用 make 來進行編譯,make 能夠根據代碼文件之間的依賴關係自動執行必要的編譯和鏈接操作,簡化編譯過程

當執行 make 命令時,make 會在當前目錄下查找 makefile 這個文件(makefile 裡面記錄了源代碼該如何編譯的詳細信息)

通常軟體開發商會寫一個檢測用戶操作環境以及當前操作環境是否有軟體開發商所需要的其他功能的程式,這個檢測程式一般命名為 configconfigure

檢測程式執行完畢之後就會主動建立出一個 makefile 文件

通常檢測的內容如下:

  1. 是否有適合的編譯器可以編譯該軟體的代碼
  2. 是否已經存在該軟體所需要的函數庫或其他依賴條件
  3. 操作系統是否適合該軟體
  4. 內核的頭文件是否存在

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
img
所以我們常見的安裝方式過程如下:

  1. 從官網下載 Tarball 軟體包,放在 /usr/local/src 目錄下解壓縮
  2. 解壓縮之後進入到軟體目錄,查看 INSTALLREADME 等相關文件內容,然後安裝好一些依賴的軟體
  3. 建立 makefile,通過自動檢測程式(configconfigure)生成 makefile 文件
  4. 使用 make 命令進行編譯
  5. 最後 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 包含了一組規則和指令,由自動檢測程式(configconfigure)生成
  • 為了方便用戶下載和檢測軟體官網的壓力,一般通過 Tarball 的方式來管理軟體

rpm 安裝

前面我們講到了源碼編譯安裝,即通過下載軟體發行商提供的 Tarball 文件來進行安裝

將 Tarball 文件下載之後還要解壓縮,還要 configure 檢測,還要編譯還要配置還要安裝,可以看到過程是比較複雜的,需要敲的命令比較多,很容易勸退小白

不但如此,這種安裝方式還會導致一些其他問題

  • 依賴性問題: 軟體通常依賴於其他軟體庫和組件,手動解決依賴性問題可能會變得非常棘手,特別是當軟體的依賴關係相對複雜時
  • 版本控制: 用戶需要自行管理多個軟體的不同版本,這可能導致版本衝突和不一致
  • 一致性問題: 用戶需要花費大量時間來確保所有安裝的軟體都保持一致,並避免不同版本之間的衝突

為了能夠更好地更加標準地管理 Linux 的軟體,減輕用戶的負擔和學習成本,廠商們就在想:我們能不能先把軟體所有的相關文件都打包成一個特殊格式的軟體包(文件)

然後在這個軟體包裡面不但包含了檢測依賴關係和系統環境的文件,還包含了關於這個軟體的信息、二進位文件等等

這樣當用戶下載了這個軟體包的時候,只需要簡單的命令就能夠安裝,並且還會把當前軟體的信息管理起來,方便用戶後續的升級、卸載等操作

於是 Red Hat 在 1995 年引入了 RPM (RedHat Package Manager)

RPM 是以一種資料庫記錄的方式來將你所需要的軟體安裝到你的 Linux 系統的一套管理機制

1、廠商們先把軟體編譯好,然後打包成 RPM 包(包含軟體的依賴關係、版本信息以及其他元數據)

2、當你在安裝 RPM 包的時候,系統會檢查該軟體包的依賴的其他軟體包是否已經安裝

3、然後檢查本地沒有已經安裝好的軟體或者衝突的版本(有的話會給提示)

image-20230808132316543.png
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 的伺服器存儲庫來管理軟體包,其中包含了各種軟體包及其依賴關係信息

這使得用戶可以通過簡單的命令完成軟體包的安裝、升級和卸載,同時自動處理依賴關係,無須繁瑣地一次次下載、安裝

image-20230808132638642.png

雖然 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 安裝

    • 優點:自動解決軟體包的依賴關係;管理方便,提供軟體包的安裝、升級、卸載和搜索等功能
    • 缺點:缺少定製化,不能自定義功能;更新滯後,某些發行版的官方倉庫可能不及時提供最新版本的軟體包

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 實踐過不同前端框架的朋友應該都知道,對於同一個樣式,在不同框架上的表現都會有不同,時時需要做“適配”,在 Blazor 上也不例外。 ...
  • # Unity IPreprocessComputeShaders Unity IPreprocessComputeShaders是Unity引擎中的一個非常有用的功能,它可以讓開發者編譯Compute Shader時自定義哪些操作需要被執行。這個可以幫助開發者更好地控制Compute Shader ...
  • 前言 大家好,我是wacky,最近在工作中遇到一個有趣的問題,同事反饋說WPF中有一個樹形結構的集合,在載入時會直接報堆棧溢出,一直沒時間(懶得)看,導致很久了也沒人解決掉。於是,組長就把這個"艱巨"的任務交給了我。作為新人中的"高手",必然要義不容辭地接受挑戰嘍,廢話不多說,走起。 分析 由於同事 ...
  • LINQ是C#3.0引入的特性,讓處理對象就像執行SQL語句一樣簡單,對於提高C#開發效率有革命性的作用。 對於每個.NET開發者來說,掌握C#的LINQ知識點是非常重要的。LINQ是C#的一個強大的特性,它為數據查詢和操作提供了簡潔、統一的語法,使得數據處理變得更加直觀和靈活。 以下是.NET開發 ...
  • # Unity IUnityLinkerProcessor Unity IUnityLinkerProcessor是Unity引擎中的一個介面,它允許開發者在Unity項目構建時對代碼進行鏈接處理。這個介面可以用來優化項目構建大小,減少不必要的代碼和資源,提高項目的性能和載入速度。 ## 介面定義 ...
  • 博客推行版本更新,成果積累制度,已經寫過的博客還會再次更新,不斷地琢磨,高質量高數量都是要追求的,工匠精神是學習必不可少的精神。因此,大家有何建議歡迎在評論區踴躍發言,你們的支持是我最大的動力,你們敢投,我就敢肝 ...
  • 大家好,我是痞子衡,是正經搞技術的痞子。今天痞子衡給大家分享的是**藉助i.MXRT10xx系列INIT_VTOR功能可以縮短程式熱重啟時間**。 最近痞子衡寫了篇文章 [《i.MXRT從Serial NAND啟動時間測量》](https://www.cnblogs.com/henjay724/p/ ...
  • yum update更新報錯 Transaction Check Error 解決方法 yum update 引起錯誤Transaction Check Error的原因很多,要根據錯誤概要去判斷具體原因。 錯誤現象: 報錯內容: file /usr/share/man/man1/gtk-query ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...