如何定製Linux作業系統安裝盤詳解

來源:互聯網
上載者:User

如何定製Linux作業系統安裝盤詳解

 

 

 

本文詳細介紹如何定製Linux作業系統安裝盤詳解 

 

  本文闡述如何以一個現有的 RedHat Linux系統安裝盤為藍本,定製符合需要的 Linux 系統安裝盤。

 

  1 引言

 

  通常由於某種實際應用,需要一個包含所有最新動向的RPM包的作業系統發布盤,以備在安裝時一次完成所有的更新操作,或者是想定製一個有自己特色的作業系統發布盤,如將自己開發的應用程式通過建立RPM包,加入到作業系統中,在系統安裝時一次完成,形成包含自己產品的作業系統發布盤。這些都需要重建安裝盤,而且產生安裝盤也是十分必要的,因為作業系統發布商在每一次正式發布後,總會對一些漏洞進行更新處理,有些還是與安全相關的,在重建安裝盤時就可以將這些bug修複添加進你自己定製的安裝盤中,對一些裝置新開發的驅動程式提供支援也需要重建安裝盤。

 

  在一些嵌入式具體應用中,由於其對作業系統的要求較具體,不需要當前作業系統安裝盤中內建的那麼多的功能,如Fedora Core 2當前有4張安裝盤,它包含了許多其它的應用,如office、娛樂和遊戲等等,而一些具體的應用根本不需要這麼多的功能,因此,它們常常需要基於一個版本的作業系統,然後對之進行相應的裁減,使之能滿足具體應用的實際需要,而不需要其它的多餘的功能。因此,通過作業系統安裝盤的定製,可以根據自己或實際的需要,選擇有用的軟體包,組成安裝盤,從而通過定製作業系統的安裝,滿足具體應用的需要。

 

  我們在定製作業系統安裝盤之前,必須有一個藍本作為安裝盤的基礎,比如是Red Hat 9.0安裝盤或Fedora Core 2安裝盤,也可以是Red Hat 9.0或Fedora Core 2安裝盤的iso檔案,這些我們可以從Red Hat的網站或其它一些網站上下載。現假設我們已經有了Fedora Core 2的安裝盤,下面我們先大略看一下Fedora Core 2的安裝盤裡面的內容。

 

在安裝盤中有一個目錄為Fedora,它包含了發布盤的核心內容,如下:

 

 

 

drwxr-xr-x  2 root   root     2048 May 13 2004 base

drwxr-xr-x  2 root   root    77824 May 13 2004 RPMS

 

  RPMS目錄包含Fedora Core 2發布盤的主要部分,它是一些RPM檔案。RPM包通常包含二進位可執行檔、有關的設定檔和文檔,我們可以參考RPM協助以獲得更多資訊。

 

  base 目錄中包含一些在安裝過程中所需要的檔案,如comps.xml檔案,它定義哪個組件包含哪些RPM包以及RPM包之間的依賴關係,需要注意的是,在comps.xml檔案中表示哪個組件有哪些RPM包採用的是RPM包名,而不是包的檔案名稱。比如perl-5.8.3-18.i386.rpm這個檔案名稱,在comps.xml中所表示的RPM包名為perl。對於comps.xml檔案,我們會在後面作進一步解釋。另一個重要的檔案是hdlist檔案,它包含了RPM目錄中的所有RPM包大部分的標頭檔,這意味著在RPM包中相互依賴關係可以通過讀取hdlist檔案而決定,而不需要讀所有的RPM包。hdlist檔案的另一個作用是將包名映射到檔案名稱,如將perl包名映射到perl-5.8.3-18.i386.rpm,這意味著如果你想更新RPM包或添加你自己的包到RPM目錄中,你就需要更新hdlist這個檔案,這會在後面進行描述。

 

  2 RPM操作

 

  RPM(Redhat Package Management)是由RedHat開發的,在Linux系統下的系統包管理工具。它的目標是:使包的安裝和卸載過程更容易,它能夠證實一個包是否已經正確安裝了,可以簡化包的建立過程,可以從原始碼建立整個包,它能用於不同的體繫結構。RPM系統已經成為現在Linux系統下包管理工具事實上的標準,並且它也移植到很多商業的unix系統之下。

 

  RPM包由包標籤對它標識,包標籤包含軟體名,軟體版本,包的發行版本幾部分。在包的內部還包含包的建立時間,包的內容描述,安裝包的所有檔案的大小,數位簽章以證實包的完整性等資訊。RMP包還包含包內的檔案資訊,其中包括:每個檔案的檔案名稱,每個檔案的許可權,檔案的屬組和擁有者,每個檔案的md5校正和,檔案的內容等。

 

 

RPM包管理系統提供了下列功能:安裝新的包,卸載舊的包,將一箇舊包升級為新的包,獲得已經安裝包的資訊等。

 

  Red Hat發布盤主要是由一些RPM包組成。RPM包的名字包含一個尾碼:arch.rpm,arch 指的是體繫結構,對於Intel平台的有i386、i586、i686等,你所安裝的包必須要與機器上的共用庫的版本相匹配。如果你發現某個RPM包沒有安裝,你可以自己安裝。任何時候,你都可以(必須是root使用者)安裝RPM包。RPM命令使用輕參考相關資料。

 

  3 RPM包建立過程

 

  為了完成RPM包的建立,需要執行以下步驟:

 

執行spec檔案prep節的命令和宏; 

檢查檔案清單的內容; 

執行spec檔案build節的命令和宏; 

執行spec檔案install節的命令和宏,同時也執行檔案清單中的宏; 

建立二進位包檔案; 

建立源碼包。 

 

  為了執行打包的工作,RPM需要一系列目錄完成建立的工作。正常的目錄結構通常由一個頂級目錄和五個子目錄構成。這五個子目錄分別是:

 

SOURCES------包含原始的源檔案和補丁檔案。 

SPECS--------包含控制RPM包建立過程的spec檔案。 

BUILD--------包含源碼解包和軟體建立的目錄。 

RPMS---------包含建立過程建立的二進位包檔案。 

SRPMS--------包含建立過程建立的源碼包檔案。 

 

  除了上述這五個主要的目錄外,在RPMS或SRPMS目錄下通常還會有關於RPM包目標平台的目錄。例如,i386、i586、i686等代表與Intel相容cpu的平台,noarch目錄下的RPM包代表可以在任何平台下執行。

 

  3.1 SPEC檔案

 

  spec檔案是整個RPM包建立過程的中心,它的作用就如同編譯器時的Makefile檔案。spec檔案包含建立一個RPM包必需的資訊,包括哪些檔案是包的一部分以及它們安裝在哪個目錄下。這個檔案一般分為如下的幾節:

 

(1) Preamle(序言)

 

  序言包含使用者請求包的資訊時所顯示的內容。它可以包含包的功能描述、包的軟體版本、著作權資訊和所屬的包組等。Summary 是一行關於該軟體包的描述,Name 是該軟體包的基名,Version 是該軟體的版本號碼,Release 是 RPM 本身的版本號碼,如果修複了 spec 檔案中的一個錯誤並發布了該軟體同一版本的新 RPM,就應該增加發行版號。License 應該給出一些許可術語(如:"GPL"、"Commercial"、"Shareware"),Group 標識軟體類型。那些試圖協助人們管理 RPM 的程式通常按照組列出 RPM。您可以在usr/share/doc/rpm-4.0.4/GROUPS 檔案看到一個 Red Hat 使用的組列表(假設您安裝的 RPM 版本是 4.0.4)。但是您還可以使用那些組名以外的名稱。Source0、Source1等等給這些源檔案命名(通常為 tar.gz 檔案)。%{name} 和 %{version} 是 RPM 宏,它們擴充成為頭中定義的 rpm 名稱和版本。

 

  要注意的是,你不要在 Source 語句中包含任何路徑。預設情況下,RPM 會在 /usr/src/redhat/SOURCES 中尋找檔案,請將您的源檔案複製或連結到那裡。(要使 spec 檔案盡量可移植的話,應當盡量避免嵌入自己開發機器上的假想路徑。其他開發人員就可以指示 RPM 在別的目錄下尋找源檔案,而不用修改您的 spec 檔案。)

 

  接下來的部分從 %description 行開始。您應該在這裡提供該軟體更多的描述,這樣任何人使用 rpm -qi 查詢您的軟體包時都可以看到它。您可以解釋這個軟體包做什麼,描述任何警告或附加的配置指令,等等。

 

  (2) Prep節

 

  Prep節進行實際的打包準備工作,它是使用節首碼%prep表示的。一般而言,這一節的主要工作是檢查標籤文法是否正確,刪除舊的軟體來源程式,對包含來源程式的tar檔案進行解碼。如果包含補丁(patch)檔案,將補丁檔案應用到解開的源碼中。它一般包含%setup與%patch兩個命令。%setup用於將軟體源碼包解開,執行%patch可將補丁檔案加入解開的來源程式中。

 

 

 %setup

 

  -n newdir---------將壓縮的軟體來源程式在newdir目錄下解開。

 

  -c ---------------在解開來源程式之前先建立目錄。

 

  -b num------------在包含多個來源程式時,將第num個來源程式解壓縮。

 

  -T----------------不使用預設的解壓縮操作。

 

  例如:

 

  %setup -T -b 0

 

  /*解開第一個來源程式檔案。*/

 

  %setup -c -n newdir

 

  /*建立目錄newdir,並在此目錄之下解開來源程式。*/

 

  %patch

 

  %patchN-------這裡N是數字,表示使用第N個補丁檔案,等價於%patch -P N

 

  -p0-----------指定使用第一個補丁檔案,-p1指定使用第二個補丁檔案。 -s------------在使用補丁時,不顯示任何資訊。

 

  -b name-------在加入補丁檔案之前,將源檔案名稱上加入name。若為指定此參數,則預設源檔案加入.orig。

 

  -T------------將所有打補丁時產生的輸出檔案刪除。

 

  3) Build節

 

  這一節主要用於編譯源碼,它是使用節首碼%build表示的。這一節一般由多個make命令組成。

 

  (4) Install節

 

  這一節主要用於完成實際安裝軟體必須執行的命令,它是使用節首碼%install表示的。這一節一般是由make install指令構成,但是有時也會包含cp、mv、install等指令。

 

  這一節還能指定在使用者安裝的系統上,包安裝時啟動並執行指令碼。這樣的指令碼稱為安裝(卸載)指令碼。它可以指定包安裝前、包安裝後、包除去前、包除去後的系統必須啟動並執行外殼程式段。在使用者安裝的系統上,為了驗證一個包是否已經成功安裝的驗證指令碼也可由這一節指定。

 

  (5) Clean節

 

  這一節所描述的內容表示在完成包建立的工作之後,自動執行此節下的指令碼進行附加的清除工作,它是使用節首碼%clean表示的。一般而言,這一節的內容是簡單地使用rm -rf $RPM_BUILD_ROOT命令,不需要指定此節的其它內容。

 

 

(6) 檔案清單

 

  這一節指定構成包的檔案的列表,它是使用節首碼%files表示的。此外,它還包含一系列宏控制安裝後的檔案屬性和配置資訊。

 

  %files 列出應該捆綁到 RPM 中的檔案,並能夠可選地設定許可權和其它資訊。在 %files 中,您可以使用 %defattr 來定義預設的許可權、所有者和組;%defattr(-,root,root) 會安裝 root 使用者擁有的所有檔案,使用當 RPM 從構建系統捆綁它們時它們所具有的任何許可權。

 

  可以用 %attr(permissions,user,group) 覆蓋個別檔案的所有者和許可權。可以在 %files 中用一行包括多個檔案。可以通過在行中添加 %doc 或 %config 來標記檔案。%doc 告訴 RPM 這是一個文檔檔案,因此如果使用者安裝軟體包時使用 --excludedocs,將不安裝該檔案。您也可以在 %doc 下不帶路徑列出檔案名稱,RPM 會在構建目錄下尋找這些檔案並在 RPM 檔案中包括它們,並把它們安裝到 /usr/share/doc/%{name}-%{version}。以 %doc 的形式包括 README 和 ChangeLog 這樣的檔案是個好主意。

 

  %config 告訴 RPM 這是一個設定檔。在升級時,RPM 將會試圖避免用 RPM 打包的預設設定檔覆蓋使用者仔細修改過的配置。

 

  注意:如果在 %files 下列出一個目錄名,RPM 會包括該目錄下的所有檔案。通常這不是您想要的,特別對於 /bin 這樣的目錄。

 

  (7) 改動日誌

 

  這一節主要描述軟體的開發記錄,它是使用節首碼%changlog表示的。這個段的內容是為了開發人員能詳細的瞭解該軟體的開發過程,對於包的維護極有好處。

 

  3.2 建立RPM包

 

  如果我們需要對RPM包作修改,那麼我們首先需要將源碼包取來,比如我們要修改核心,那麼我們可以從網上或光碟片中取到核心的原始碼RPM包,如kernel-2.6.5-1.358.src.rpm,將源碼包解開:rpm -i kernel-2. 6.5-1.358.src.rpm,則該RPM中的內容將存放在目錄/usr/src/redhat/SOURCES和/usr/src/redhat/SPEC目錄中,前者存放的是源碼、補丁以及一些設定檔等,後者存放的是包對應的spec檔案,如kernel-2.6.spec,現在你就可以對核心進行修改。假定我們想另外再對核心打一個補丁,比如說:mypatch-2.6.5.patch,你需要將這個補丁檔案複製到/usr/src/redhat/SOURCES/目錄下,然後編輯kernel-2.6.spec檔案。你需要先在定義補丁檔案的最後加入對你補丁檔案的初始定義,如:

 

 

 

 

…………

Patch10000: linux-2.6.0-compile.patch

# Patch10010: linux-2.6.0-module-license.patch

Patch10030: mypatch-2.6.5.patch   /*新加入的補丁檔案的定義*/

# END OF PATCH DEFINITIONS

…………

 

  然後在檔案的後面加入對核心打補丁命令:

 

 

 

…………

%patch10000 -p1

%patch10030 -p1   /*新加入的打補丁命令*/

# END OF PATCH APPLICATIONS

…………

 

  如果你還想對核心做其它的修改,你可以修改相應的檔案或添加相應的檔案,然後修改kernel-2.6.spec檔案。當spec檔案修改完成之後,你只需要執行 rpmbuild -ba kernel-2.6.spec 就可以產生所需要的RPM包了。另外需要注意的是,以產生核心包為例,假如我們想產生kernel-smp-2.6.5-1.358.i686.rpm包,在kernel-2.6.spec檔案中包含有一些開關選項,比如,在檔案的開頭需要定義建立哪些核心的RPM包,如:

 

 

 

%define buildup 1

%define buildsmp 0

%define buildsource 1

 

  在通常情況下,在執行rpmbuild -ba kernel-2.6.spec 命令後,會建立一個kernel-2.6.5-1.358.i386.rpm、kernel-source-2.6.5-1.358.i386.rpm和源碼RPM包kernel-2.6.5-1.358.src.rpm。因此,當你需要建立支援SMP的核心的RPM包時,需要修改kernel-2.6.spec檔案開頭時的定義為:

 

 

 

%define buildup 1

%define buildsmp 1

%define buildsource 1

%define -target_cpu  i686

 

  此外,在檔案的開頭還需要定義-target_cpu 為i686,從而建立i686的核心RPM包,並且需要對/usr/lib/rpm目錄下面的一些宏重新定義,比如目前的目錄下面的macros檔案,需要重新定義arch 和build_arch為i686。最後,執行命令 rpmbuild -ba kernel-2.6.spec --with smp 就可以。當然,如果對核心進行了相應的修改,就必鬚生成多個核心RPM包,以適用於多個arch,如kernel-2.4.18-3-i586-smp.rpm, kernel-2.4.18-3-athlon.rpm等。

 

 

 4 作業系統安裝盤的定製過程

 

  你需要將原來作業系統發布盤上的內容拷貝到本機硬碟中,根據有幾張發布盤而產生幾個目錄,比如Fedora Core 2有四張盤,你則需要在系統上產生四個目錄,如disc1、disc2、disc3、disc4,分別將這四張盤上內容拷貝到這四個目錄中,然後對相應的RPM包進行更新。

 

  首先找到你想更新的RPM包,將新的RPM替換舊包。當然你也可以根據你的需要新增或刪除RPM包,需要注意的是,你需要在comps.xml檔案中將新增加或刪除的RPM包名加入某個組件中,並且注意其與其它RPM包的依賴關係,也就是說你所放置的包的位置要恰當,否則它會依賴於在它之前而沒有加入系統的某個RPM包。

 

  4.1 編輯comps.xml檔案

 

  在產生安裝盤之前,需要注意對comps.xml檔案進行修改。這個檔案用來告知安裝程式anaconda,使用者選擇了某個組是應該有哪些包需要安裝,定義了在安裝過程中,包是如何被捆綁在一起的。在Red Hat 8.0以前版本的發布盤中,對應的檔案為comps,它只是一個簡單的文字檔,在Red Hat 8.0之後的版本中,用comps.xml代替了原來的comps檔案。comps.xml是一個XML檔案,易於對內容進行分析和說明。

 

  comps.xml檔案開始是說明xml的版本和DTD斷言,然後進入以標記開始的檔案的主體內容。如:

 

 

 

<?xml version="1.0" encoding="UTF-8"?>

 

  comps.xml主要由三部分組成,首先是組列表,它描述了在安裝過程中需要的不同的組(或組件),包括組名、組的描述和包含的RPM包;其次是組的階層,它將組分成不同的類,並定義了組的一個順序,從而可以決定哪些組需要先安裝;最後為一系列RPM包以及它們之間的依賴關係。

 

  下面分別介紹comps.xml檔案的這三部分:

 

  (1) 組列表

 

  在系統安裝時,需要用到一個組中的一些屬性,下面就是屬性列表以及它們如何使用。一個組被定義在和標記之內.

 

  一個簡單的組定義可以是:

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.