<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                ## 20.1 開放源碼的軟件安裝與升級簡介 如果鳥哥想要在我的 Linux 服務器上面跑網頁服務器 (WWW server) 這項服務,那么我應該要做些什么事呢?當然就一定需要“安裝網頁服務器的軟件”啰!如果鳥哥的服務器上面沒有這個軟件的話,那當然也就無法啟用 WWW 的服務啦!所以啦,想要在你的 Linux 上面進行一些有的沒的功能,學會“如何安裝軟件”是很重要的一個課題! 咦!安裝軟件有什么難的?在 W 牌的操作系統上面安裝軟件時,不是只要一直給他按 “下一步”就可以安裝妥當了嗎?話是這樣說沒錯啦,不過,也由于如此,所以在 Windows 系統上面的軟件都是一模一樣的,也就是說,你“無法修改該軟件的原始程序碼”,因此, 萬一你想要增加或者減少該軟件的某些功能時,大概只能求助于當初發行該軟件的廠商了!(這就是所謂的商機嗎?) 或許你會說:“唉呦!我不過是一般人,不會用到多余的功能,所以不太可能會更動到程序碼的部分吧?” 如果你這么想的話,很抱歉~是有問題的!怎么說呢?像目前網絡上面的病毒、黑客軟件、臭蟲程序等等, 都可能對你的主機上面的某些軟件造成影響,導致主機的死機或者是其他數據損毀等等的傷害。 如果你可以借由安全信息單位所提供的修訂方式進行修改, 那么你將可以很快速的自行修補好該軟件的漏洞,而不必一定要等到軟件開發商提供修補的程序包哩!要知道,提早補洞是很重要的一件事。 ![鳥哥的圖示](https://box.kancloud.cn/2016-05-13_5735736501917.gif "鳥哥的圖示") **Tips** 并不是軟件開發商故意要搞出一個有問題的軟件,而是某些程序碼當初設計時可能沒有考慮周全, 或者是程序碼與操作系統的權限設置并不相同,所導致的一些漏洞。當然,也有可能是 cracker 通過某些攻擊程序測試到程序的不周全所致。 無論如何,只要有網絡存在的一天,可以想像的到,程序的漏洞永遠補不完!但能補多少就補多少吧! 這樣說可以了解 Linux 的優點了嗎?沒錯!因為 Linux 上面的軟件幾乎都是經過 GPL 的授權,所以每個軟件幾乎均提供原始程序碼, 并且你可以自行修改該程序碼,以符合你個人的需求呢!很棒吧!這就是開放源碼的優點啰!不過,到底什么是開放源碼? 這些程序碼是什么咚咚?又 Linux 上面可以執行的相關軟件文件與開放源碼之間是如何轉換的?不同版本的 Linux 之間能不能使用同一個可執行文件?或者是該可執行文件需要由原始程序碼的部分重新進行轉換? 這些都是需要厘清觀念的。下面我們先就原始程序碼與可可執行文件來進行說明。 ### 21.1.1 什么是開放源碼、編譯器與可可執行文件 在討論程序碼是什么之前,我們先來談論一下什么是可可執行文件?我們說過,在 Linux 系統上面,一個文件能不能被執行看的是有沒有可執行的那個權限 (具有 x permission),不過,Linux 系統上真正認識的可可執行文件其實是二進制文件 ( binary program),例如 /usr/bin/passwd, /bin/touch 這些個文件即為二進制程序碼。 或許你會說 shell scripts 不是也可以執行嗎?其實 shell scripts 只是利用 shell (例如 bash) 這支程序的功能進行一些判斷式,而最終執行的除了 bash 提供的功能外,仍是調用一些已經編譯好的二進制程序來執行的呢! 當然啦, bash 本身也是一支二進制程序啊!那么我怎么知道一個文件是否為 binary 呢?還記得我們在[第六章里面提到的 file](../Text/index.html#file) 這個指令的功能嗎?對啦!用他就是了!我們現在來測試一下: ``` # 先以系統的文件測試看看: [root@study ~]# 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]=0x7e60e35005254...stripped # 如果是系統提供的 /etc/init.d/network 呢? [root@study ~]# file /etc/init.d/network /etc/init.d/network: Bourne-Again shell script, ASCII text executable ``` 看到了吧!如果是 binary 而且是可以執行的時候,他就會顯示可執行文件類別 (ELF 64-bit LSB executable), 同時會說明是否使用動態函數庫 (shared libs),而如果是一般的 script ,那他就會顯示出 text executables 之類的字樣! ![鳥哥的圖示](https://box.kancloud.cn/2016-05-13_5735736501917.gif "鳥哥的圖示") **Tips** 事實上,network 的數據顯示出 Bourne-Again ... 那一行,是因為你的 scripts 上面第一行有宣告 #!/bin/bash 的緣故,如果你將 script 的第一行拿掉,那么不管 /etc/init.d/network 的權限為何,他其實顯示的是 ASCII 文本文件的信息喔! 既然 Linux 操作系統真正認識的其實是 binary program,那么我們是如何做出這樣的一支 binary 的程序呢?首先,我們必須要寫程序,用什么東西寫程序?就是一般的文書處理器啊!鳥哥都喜歡使用 [vim](../Text/index.html) 來進行程序的撰寫,寫完的程序就是所謂的原始程序碼啰! 這個程序碼文件其實就是一般的純文本文件。 在完成這個源代碼文件的編寫之后,再來就是要將這個文件“編譯”成為操作系統看的懂得 binary program 啰!而要編譯自然就需要“編譯器”來動作, 經過編譯器的編譯與鏈接之后,就會產生一支可以執行的 binary program 啰。 舉個例子來說,在 Linux 上面最標準的程序語言為 C ,所以我使用 C 的語法進行原始程序碼的書寫,寫完之后,以 Linux 上標準的 C 語言編譯器 gcc 這支程序來編譯,就可以制作一支可以執行的 binary program 啰。整個的流程有點像這樣: ![利用 gcc 編譯器進行程序的編譯流程示意圖](https://box.kancloud.cn/2016-05-13_5735737f0f112.gif)圖21.1.1、利用 gcc 編譯器進行程序的編譯流程示意圖 事實上,在編譯的過程當中還會產生所謂的目標文件 (Object file),這些文件是以 *.o 的擴展名樣式存在的!至于 C 語言的源代碼文件通常以 *.c 作為擴展名。此外,有的時候,我們會在程序當中“引用、調用” 其他的外部副程序,或者是利用其他軟件提供的“函數功能”,這個時候,我們就必須要在編譯的過程當中, 將該函數庫給他加進去,如此一來,編譯器就可以將所有的程序碼與函數庫作一個鏈接 (Link) 以產生正確的可執行文件啰。 總之,我們可以這么說: * 開放源碼:就是程序碼,寫給人類看的程序語言,但機器并不認識,所以無法執行; * 編譯器:將程序碼轉譯成為機器看的懂得語言,就類似翻譯者的角色; * 可可執行文件:經過編譯器變成二進制程序后,機器看的懂所以可以執行的文件。 ### 20.1.2 什么是函數庫 在前一小節的[圖21.1.1](../Text/index.html#fig21.1.1)示意圖中,在編譯的過程里面有提到函數庫這東西。 什么是函數庫呢?先舉個例子來說:我們的 Linux 系統上通常已經提供一個可以進行身份驗證的模塊, 就是在[第十三章提到的 PAM 模塊](../Text/index.html#usershell)。這個 PAM 提供的功能可以讓很多的程序在被執行的時候,除了可以驗證使用者登陸的信息外, 還可以將身份確認的數據記錄在[登錄文件](../Text/index.html)里面,以方便系統管理員的追蹤! 既然有這么好用的功能,那如果我要編寫具有身份認證功能的程序時,直接引用該 PAM 的功能就好啦,如此一來,我就不需要重新設計認證機制啰!也就是說,只要在我寫的程序碼里面,設置去調用 PAM 的函數功能,我的程序就可以利用 Linux 原本就有的身份認證的程序咯!除此之外,其實我們的 Linux 核心也提供了相當多的函數庫來給硬件開發者利用喔。 函數庫又分為動態與靜態函數庫,這兩個咚咚的分別我們在后面的小節再加以說明。 這里我們以一個簡單的流程圖,來示意一支有調用外部函數庫的程序的執行情況。 ![程序執行時引用外部動態函數庫的示意圖](https://box.kancloud.cn/2016-05-13_5735737f21f42.gif)圖21.1.2、程序執行時引用外部動態函數庫的示意圖 很簡單的示意圖啊!^_^!而如果要在程序里面加入引用的函數庫,就需要如[圖 21.1.1](../Text/index.html#fig21.1.1) 所示, 亦即在編譯的過程當中,就需要加入函數庫的相關設置啰。 事實上, Linux 的核心提供很多的核心相關函數庫與外部參數, 這些核心功能在設計硬件的驅動程序的時候是相當有用的信息,這些核心相關信息大多放置在 /usr/include, /usr/lib, /usr/lib64 里面哩!我們在本章的后續小節再來探討。反正我們可以簡單的這么想: * 函數庫:就類似副程序的角色,可以被調用來執行的一段功能函數。 ### 20.1.3 什么是 make 與 configure 事實上,使用類似 gcc 的編譯器來進行編譯的過程并不簡單,因為一套軟件并不會僅有一支程序, 而是有一堆程序碼文件。所以除了每個主程序與副程序均需要寫上一筆編譯過程的指令外,還需要寫上最終的鏈接程序。 程序碼小的時候還好,如果是類似 WWW 服務器軟件 (例如 [Apache](http://linux.vbird.org/linux_server/0360apache.php)) ,或者是類似核心的源代碼,動則數百 MBytes 的數據量,編譯指令會寫到瘋掉~這個時候,我們就可以使用 make 這個指令的相關功能來進行編譯過程的指令簡化了! 當執行 make 時,make 會在當時的目錄下搜尋 Makefile (or makefile) 這個文本文件,而 Makefile 里面則記錄了源代碼如何編譯的詳細信息! make 會自動的判別源代碼是否經過變動了,而自動更新可執行文件,是軟件工程師相當好用的一個輔助工具呢! 咦!make 是一支程序,會去找 Makefile ,那 Makefile 怎么寫? 通常軟件開發商都會寫一支偵測程序來偵測使用者的作業環境, 以及該作業環境是否有軟件開發商所需要的其他功能,該偵測程序偵測完畢后,就會主動的創建這個 Makefile 的規則文件啦!通常這支偵測程序的文件名為 configure 或者是 config 。 咦!那為什么要偵測作業環境呢?在[第一章](../Text/index.html)當中, 不是曾經提過其實每個 Linux distribution 都使用同樣的核心嗎?但你得要注意, 不同版本的核心所使用的系統調用可能不相同,而且每個軟件所需要的相依的函數庫也不相同, 同時,軟件開發商不會僅針對 Linux 開發,而是會針對整個 Unix-Like 做開發啊! 所以他也必須要偵測該操作系統平臺有沒有提供合適的編譯器才行!所以當然要偵測環境啊! 一般來說,偵測程序會偵測的數據大約有下面這些: * 是否有適合的編譯器可以編譯本軟件的程序碼; * 是否已經存在本軟件所需要的函數庫,或其他需要的相依軟件; * 操作系統平臺是否適合本軟件,包括 Linux 的核心版本; * 核心的表頭定義文件 (header include) 是否存在 (驅動程序必須要的偵測)。 至于 make 與 configure 運行流程的相關性,我們可以使用下面的圖示來示意一下啊! 下圖中,你要進行的任務其實只有兩個,一個是執行 configure 來創建 Makefile , 這個步驟一定要成功!成功之后再以 make 來調用所需要的數據來編譯即可!非常簡單! ![通過 configure 與 make 進行編譯示意圖](https://box.kancloud.cn/2016-05-13_5735737f35874.gif)圖21.1.3、通過 configure 與 make 進行編譯示意圖 由于不同的 Linux distribution 的函數庫文件所放置的路徑,或者是函數庫的文件名訂定, 或者是默認安裝的編譯器,以及核心的版本都不相同,因此理論上,你無法在 CentOS 7.x 上面編譯出 binary program 后,還將他拿到 SuSE 上面執行,這個動作通常是不可能成功的! 因為調用的目標函數庫位置可能不同 (參考[圖21.1.2](../Text/index.html#fig21.1.2)) , 核心版本更不可能相同!所以能夠執行的情況是微乎其微!所以同一套軟件要在不同的平臺上面執行時, 必須要重復編譯!所以才需要源代碼嘛!了解乎!詳細的 make 用法與 Makefile 規則,在后續的小節里面再探討啰! ### 20.1.4 什么是 Tarball 的軟件 從前面幾個小節的說明來看,我們知道所謂的原始程序碼,其實就是一些寫滿了程序碼的純文本。 那我們在[第八章壓縮指令的介紹](../Text/index.html)當中, 也了解了純文本文件在網絡上其實是很浪費帶寬的一種文件格式! 所以啦,如果能夠將這些源代碼通過文件的打包與壓縮技術來將文件的數量與容量減小, 不但讓使用者容易下載,軟件開發商的網站帶寬也能夠節省很多很多啊!這就是 Tarball 文件的由來啰! ![鳥哥的圖示](https://box.kancloud.cn/2016-05-13_5735736501917.gif "鳥哥的圖示") **Tips** 想一想,一個核心的源代碼文件大約要 300~500 MB 以上,如果每個人都去下載這樣的一個核心文件, 呵呵!那么網絡帶寬不被吃的死翹翹才怪呢! 所謂的 Tarball 文件,其實就是將軟件的所有源代碼文件先以 [tar](../Text/index.html#tar) 打包,然后再以壓縮技術來壓縮,通常最常見的就是以 [gzip](../Text/index.html#gzip) 來壓縮了。因為利用了 tar 與 gzip 的功能,所以 tarball 文件一般的擴展名就會寫成 *.tar.gz 或者是簡寫為 *.tgz 啰!不過,近來由于 [bzip2](../Text/index.html#bzip2) 與 xz 的壓縮率較佳,所以 Tarball 漸漸的以 bzip2 及 xz 的壓縮技術來取代 gzip 啰!因此文件名也會變成 *.tar.bz2, *.tar.xz 之類的哩。所以說, Tarball 是一個軟件包, 你將他解壓縮之后,里面的文件通常就會有: * 原始程序碼文件; * 偵測程序文件 (可能是 configure 或 config 等文件名); * 本軟件的簡易說明與安裝說明 (INSTALL 或 README)。 其中最重要的是那個 INSTALL 或者是 README 這兩個文件,通常你只要能夠參考這兩個文件, Tarball 軟件的安裝是很簡單的啦!我們在后面的章節會再繼續介紹 Tarball 這個玩意兒。 ### 20.1.5 如何安裝與升級軟件 將源代碼作了一個簡單的介紹,也知道了系統其實認識的可可執行文件是 binary program 之后,好了,得要聊一聊,那么怎么安裝與升級一個 Tarball 的軟件?為什么要安裝一個新的軟件呢?當然是因為我們的主機上面沒有該軟件啰!那么, 為何要升級呢?原因可能有下面這些: * 需要新的功能,但舊有主機的舊版軟件并沒有,所以需要升級到新版的軟件; * 舊版本的軟件上面可能有資安上的顧慮,所以需要更新到新版的軟件; * 舊版的軟件執行性能不彰,或者執行的能力不能讓管理者滿足。 在上面的需求當中,尤其需要注意的是第二點,當一個軟件有安全上的顧慮時,千萬不要懷疑, 趕緊更新軟件吧!否則造成網絡危機,那可不是鬧著玩的!那么更新的方法有哪些呢? 基本上更新的方法可以分為兩大類,分別是: * 直接以源代碼通過編譯來安裝與升級; * 直接以編譯好的 binary program 來安裝與升級。 上面第一點很簡單,就是直接以 Tarball 在自己的機器上面進行偵測、編譯、 安裝與設置等等動作來升級就是了。不過,這樣的動作雖然讓使用者在安裝過程當中具有很高的彈性, 但畢竟是比較麻煩一點,如果 Linux distribution 廠商能夠針對自己的作業平臺先進行編譯等過程,再將編譯好的 binary program 釋出的話,那由于我的系統與該 Linux distribution 的環境是相同的,所以他所釋出的 binary program 就可以在我的機器上面直接安裝啦!省略了偵測與編譯等等繁雜的過程呢! 這個預先編譯好程序的機制存在于很多 distribution 喔,包括有 Red Hat 系統 (含 Fedora/CentOS 系列) 發展的 RPM 軟件管理機制與 yum 線上更新模式; Debian 使用的 dpkg 軟件管理機制與 APT 線上更新模式等等。 由于 CentOS 系統是依循標準的 Linux distribution,所以可以使用 Tarball 直接進行編譯的安裝與升級, 當然也可以使用 RPM 相關的機制來進行安裝與升級啰!本章節主要針對 Tarball ,至于 RPM 則留待下個章節再來介紹呢! 好了,那么一個軟件的 Tarball 是如何安裝的呢?基本流程是這樣的啦: 1. 將 Tarball 由廠商的網頁下載下來; 2. 將 Tarball 解開,產生很多的源代碼文件; 3. 開始以 gcc 進行源代碼的編譯 (會產生目標文件 object files); 4. 然后以 gcc 進行函數庫、主、副程序的鏈接,以形成主要的 binary file; 5. 將上述的 binary file 以及相關的配置文件安裝至自己的主機上面。 上面第 3, 4 步驟當中,我們可以通過 make 這個指令的功能來簡化他, 所以整個步驟其實是很簡單的啦!只不過你就得需要至少有 gcc 以及 make 這兩個軟件在你的 Linux 系統里面才行喔! 詳細的過程以及需要的軟件我們在后面的章節繼續來介紹的啦!
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看