首頁>技術>

目錄

一、包管理器使用

二、自動依賴管理

2.1 yum

2.2 apt

三、編譯安裝 Nginx

3.1 下載原始碼

3.2 解壓

3.3 配置和解決依賴

3.4 編譯和安裝。

四、為什麼會有編譯安裝?

五、總結

六、問題

在 Linux 上安裝程式大概有 2 種思路:

直接編譯原始碼;使用包管理器。

受開源運動影響,Linux 上很多軟體都可以拿到原始碼,這也是 Linux 能取得成功的一個重要原因。

一、包管理器使用

Linux 下的應用程式多數以軟體包的形式釋出

Linux 下兩大主流的包就是rpm和dpkg

dpkg(debian package),是linux一個主流的社群分支開發出來的。社群就是開源社群,有很多世界頂級的程式設計師會在社群貢獻程式碼,比如 github。一般衍生於debian的 Linux 版本都支援dpkg,比如ubuntu。rpm(redhatpackage manager)。

RedHat 是一個做 Linux 的公司,你可以把它理解成一家“保險公司”。 很多公司購買紅帽的服務,是為了給自己的業務上一個保險。以防萬一哪天公司內部搞不定 Linux 底層,或者底層有 Bug,再或者底層不適合當下的業務發展,需要修改等問題,紅帽的工程師都可以幫企業解決。

再比如,RedHat 收購了JBoss,把 JBoss 改名為 WildFly。 像 WildFly 這種工具更多是面向企業級,比如沒有大量研發團隊的企業會更傾向使用成熟的技術。RedHat 公司也有自己的 Linux,就叫作 RedHat。RedHat 系統比較重要的 Linux 有 RedHat/Fedora 等。

無論是dpkg還是rpm都抽象了自己的包格式,就是以.dpkg或者.rpm結尾的檔案。

dpkg和rpm也都提供了類似的能力:

二、自動依賴管理

Linux 是一個開源生態,因此工具非常多。工具在給使用者使用之前,需要先打成dpkg或者rpm包。 有的時候一個包會依賴很多其他的包,而dpkg和rpm不會對這種情況進行管理,有時候為了裝一個包需要先裝十幾個依賴的包,過程非常艱辛!因此現在多數情況都在用yum和apt。

2.1 yum

yum的全名是 Yellodog Updator,Modified。 看名字就知道它是基於Yellodog Updator這款軟體修改而來的一個工具。yum是 Python 開發的,提供的是rpm包,因此只有redhat系的 Linux,比如 Fedora,Centos 支援yum。yum的主要能力就是幫你解決下載和依賴兩個問題。

下載之所以是問題,是因為 Linux 生態非常龐大,有時候使用者不知道該去哪裡下載一款工具。比如使用者想安裝vim,只需要輸入sudo yum install vim就可以安裝了。

yum的伺服器收集了很多linux軟體,因此yum會幫助使用者找到vim的包。

另一方面,yum幫助使用者解決了很多依賴,比如使用者安裝一個軟體依賴了 10 個其他的軟體,yum會把這 11 個軟體一次性的裝好。

關於yum的具體用法,你可以使用man工具進行學習。

2.2 apt

apt全名是 Advanced Packaging Tools,是一個debian及其衍生 Linux 系統下的包管理器。由於advanced(先進)是相對於dpkg而言的,因此它也能夠提供和yum類似的下載和依賴管理能力。

比如在沒有vim的機器上,我們可以用下面的指令安裝vim。如下圖所示:

然後用dpkg指令檢視 vim 的狀態是ii。第一個i代表期望狀態是已安裝,第二個i代表實際狀態是已安裝。

下面我們解除安裝vim,再透過dpkg檢視,如下圖所示:

我們看到 vim 的狀態從ii變成了rc,r是期望刪除,c是實際上還有配置檔案遺留。 如果我們想徹底刪除配置檔案,可以使用apt purge,就是徹底清除的意思,如下圖所示:

再使用dpkg -l時,vim已經清除了。

期待結果是u就是 unkonw (未知)說明已經沒有了。實際結果是n,就是 not-installed(未安裝)。

如果想查詢mysql相關的包,可以使用apt serach mysql,這樣會看到很多和mysql相關的包,如下圖所示:

如果我們想精確查詢一個叫作mysql-server的包,可以用apt list。

這裡我們找到了mysql-server包。

另外有時候國內的apt伺服器速度比較慢,你可以嘗試使用阿里雲的映象伺服器。

cat /etc/apt/sources.list--以下是檔案內容--deb http://mirrors.aliyun.com/ubuntu/ focal main restricted universe multiversedeb http://mirrors.aliyun.com/ubuntu/ focal-security main restricted universe multiversedeb http://mirrors.aliyun.com/ubuntu/ focal-updates main restricted universe multiversedeb http://mirrors.aliyun.com/ubuntu/ focal-proposed main restricted universe multiversedeb http://mirrors.aliyun.com/ubuntu/ focal-backports main restricted universe multiversedeb-src http://mirrors.aliyun.com/ubuntu/ focal main restricted universe multiversedeb-src http://mirrors.aliyun.com/ubuntu/ focal-security main restricted universe multiversedeb-src http://mirrors.aliyun.com/ubuntu/ focal-updates main restricted universe multiversedeb-src http://mirrors.aliyun.com/ubuntu/ focal-proposed main restricted universe multiversedeb-src http://mirrors.aliyun.com/ubuntu/ focal-backports main restricted universe multiverse

映象地址可以透過/etc/apt/sources.list配置,注意focal是我用的ubuntu版本,你可以使用sudo lsb_release檢視自己的 Ubuntu 版本。如果你想用我上面給出的內容覆蓋你的sources.list,只需把版本號改成你自己的。注意,每個ubuntu版本都有自己的代號。

透過上面的學習,相信你已經逐漸瞭解了包管理器的基本概念和使用。如果你是centos或者fedora,需要自己man一下yum。

三、編譯安裝 Nginx

接下來我們說說編譯安裝 Nginx(發音是 engine X),是一個家喻戶曉的 Web 伺服器。 它的發明者是俄國的伊戈爾·賽索耶夫。賽索耶夫 2002 年開始寫 Nginx,主要目的是解決同一個網際網路節點同時進入大量併發請求的問題。注意,大量併發請求不是大量 QPS 的意思,QPS 是吞吐量大,需要快速響應,而高併發時則需要合理安排任務排程。

後來塞索耶夫成立了 Nginx 公司, 2018 年估值到達到 4.3 億美金。現在基本上國內大廠的 Web 伺服器都是基於 Nginx,只不過進行了特殊的修改,比如淘寶用 Tengine。

如上圖所示,可以看到 nginx-1.18.0 的網址是:http://nginx.org/download/nginx-1.19.2.tar.gz。然後我們用 wget 去下載這個包。 wget 是 GNU 專案下的下載工具,GNU 是早期unix專案的一個變種。linux下很多工具都是從unix繼承來的,這就是開源的好處,很多工具不用再次開發了。你可能很難想象windows下的命令工具可以在linux下用,但是linux下的工具卻可以在任何系統中用。 因此,linux下面的工具發展速度很快,如今已成為最受歡迎的伺服器作業系統。

當然也有同學的機器上沒有wget,那麼你可以用apt安裝一下。

3.1 下載原始碼3.2 解壓

tar是用來打包和解壓用的。之所以叫作tar是有一些歷史原因:t代表tape(磁帶);ar是 archive(檔案)。因為早期的儲存介質很小,人們習慣把檔案打包然後儲存到磁帶上,那時候unix用的命令就是tar。因為linux是個開源生態,所以就沿襲下來繼續使用tar。

-x代表 extract(提取)-z代表gzip,也就是解壓gz型別的檔案。-v代表 verbose(顯示細節),如果你不輸入-v,就不會列印解壓過程了。-f代表 file,這裡指的是要操作檔案,而不是磁帶。

所以tar解壓通常帶有x和f,打包通常是c就是 create 的意思

3.3 配置和解決依賴

可以看到一個叫作configure的檔案是綠色的,也就是可執行檔案

這個配置檔案來自一款叫作autoconf的工具,也是 GNU 專案下的,說白了就是bash(Bourne Shell)下的安裝打包工具(就是個安裝程式)

這個安裝程式支援很多配置,你可以用./configure --help看到所有的配置項,如下圖所示:

這裡有幾個非常重要的配置項,叫作prefix。prefix配置項決定了軟體的安裝目錄。如果不配置這個配置項,就會使用預設的安裝目錄。

sbin-path決定了nginx的可執行檔案的位置conf-path決定了nginx配置檔案的位置。

我們都使用預設,然後執行./configure如下圖所示:

我們看到配置程式開始執行。但是最終報了一個錯誤,如下圖所示:

報錯的內容是,nginx的HTTP rewrite模組,需要PCRE庫。 PCRE 是perl語言的相容正則表示式庫。perl語言一直以支援原生正則表示式,而受到廣大程式設計愛好者的喜愛。

開始安裝PCRE。

一般這種依賴庫,會叫pcre-dev或者libpcre。用apt查詢了一下,然後grep。

我們看到有pcre2也有pcre3。這個時候可以考慮試試pcre3。

安裝完成之後再試試./configure,提示還需要zlib。然後我們用類似的方法解決zlib依賴。

zlib包的名字叫zlib1g不太好找,需要查資料才能確定是這個名字。

我們再嘗試配置,終於配置成功了。

3.4 編譯和安裝。

通常配置完之後,我們輸入make && sudo make install進行編譯和安裝。

make是linux下面一個強大的構建工具。

autoconf也就是./configure會在當前目錄下生成一個 MakeFile 檔案。

make會根據MakeFile檔案編譯整個專案。

編譯完成後,能夠形成和當前作業系統以及 CPU 指令集相容的二進位制可執行檔案。然後再用make install安裝。&&符號代表執行完make再去執行make installl。

你可以看到編譯是個非常慢的活。等待了差不多 1 分鐘,終於結束了。

nginx被安裝到了/usr/local/nginx中,如果需要讓nginx全域性執行,可以設定一個軟連線到/usr/local/bin,具體如下:

ln -sf /usr/local/nginx/sbin/nginx /usr/local/sbin/nginx
四、為什麼會有編譯安裝?

你可能會問,為什麼會有編譯安裝這麼複雜的事情。

原來使用 C/C++ 寫的程式存在一個交叉編譯的問題。就是寫一次程式,在很多個平臺執行。

而不同指令集的 CPU 指令,還有作業系統的可執行檔案格式是不同的。因此,這裡有非常多的現實問題需要解決。一般是由作業系統的提供方,比如 RedHat 來牽頭解決這些問題。你可以用apt等工具提供給使用者已經編譯好的包。apt會自動根據使用者的平臺型別選擇不同的包。

但如果某個包沒有在平臺側註冊,也沒有提供某個 Linux 平臺的軟體包,我們就需要回退到編譯安裝,透過原始碼直接在某個平臺安裝。

五、總結

包管理安裝很方便,但是有兩點劣勢。

第一點是需要提前將包編譯好,因此有一個釋出的過程,如果某個包沒有釋出版本,或者在某個平臺上找不到對應的釋出版本,就需要編譯安裝。第二點就是如果一個軟體的定製程度很高,可能會在編譯階段傳入引數,比如利用configure傳入配置引數,這種時候就需要編譯安裝。六、問題

在編譯安裝 MySQL 時,發現找不到 libcrypt.so,應該如何處理?

遇到這類問題,首先應該去查資料。 比如查 StackOverflow,搜尋關鍵詞:libcrypt.so not found,或者帶上自己的作業系統ubuntu。下圖是關於 Stackoverflow 的一個解答:

3
最新評論
  • BSA-TRITC(10mg/ml) TRITC-BSA 牛血清白蛋白改性標記羅丹明
  • 基於Pytorch版yolov的滑塊驗證碼破解思路!非常好用