## 22.4 SRPM 的使用 : rpmbuild (Optional)
談完了 RPM 類型的軟件之后,再來我們談一談包含了 Source code 的 SRPM 該如何使用呢?假如今天我們由網絡上面下載了一個 SRPM 的文件,該如何安裝他?又,如果我想要修改這個 SRPM 里面源代碼的相關設置值,又該如何訂正與重新編譯呢? 此外,最需要注意的是,新版的 rpm 已經將 RPM 與 SRPM 的指令分開了,SRPM 使用的是 rpmbuild 這個指令,而不是 rpm 喔!
### 22.4.1 利用默認值安裝 SRPM 文件 (--rebuid/--recompile)
假設我下載了一個 SRPM 的文件,又不想要修訂這個文件內的源代碼與相關的設置值, 那么我可以直接編譯并安裝嗎?當然可以!利用 rpmbuild 配合選項即可。選項主要有下面兩個:
| | |
| --- | --- |
| --rebuild | 這個選項會將后面的 SRPM 進行“編譯”與“打包”的動作,最后會產生 RPM 的文件,但是產生的 RPM 文件并沒有安裝到系統上。當你使用 --rebuild 的時候,最后通常會發現一行字體: `Wrote: /root/rpmbuild/RPMS/x86_64/pkgname.x86_64.rpm` 這個就是編譯完成的 RPM 文件啰!這個文件就可以用來安裝啦!安裝的時候請加絕對路徑來安裝即可! |
| --recompile | 這個動作會直接的“編譯”“打包”并且“安裝”啰!請注意, rebuild 僅“編譯并打包”而已,而 recompile 不但進行編譯跟打包,還同時進行“安裝”了! |
不過,要注意的是,這兩個選項都沒有修改過 SRPM 內的設置值,僅是通過再次編譯來產生 RPM 可安裝軟件文件而已。 一般來說,如果編譯的動作順利的話,那么編譯過程所產生的中間暫存盤都會被自動刪除,如果發生任何錯誤, 則該中間文件會被保留在系統上,等待使用者的除錯動作!
問:請由 [http://vault.centos.org/](http://vault.centos.org/) 下載正確的 CentOS 版本中, 在 updates 軟件庫當中的 ntp 軟件 SRPM,請下載最新的那個版本即可,然后進行編譯的行為。答:目前 (2015/09) 最新的版本為:ntp-4.2.6p5-19.el7.centos.1.src.rpm 這一個,所以我是這樣作的:
* 先下載軟件:
wget http://vault.centos.org/7.1.1503/updates/Source/SPackages/ntp-4.2.6p5-19.el7.centos.1.src.rpm
* 再嘗試直接編譯看看:
rpmbuild --rebuild ntp-4.2.6p5-19.el7.centos.1.src.rpm
* 上面的動作會告訴我還有一堆相依軟件沒有安裝~所以我得要安裝起來才行:
yum install libcap-devel openssl-devel libedit-devel pps-tools-devel autogen autogen-libopts-devel
* 再次嘗試編譯的行為:
rpmbuild --rebuild ntp-4.2.6p5-19.el7.centos.1.src.rpm
* 最終的軟件就會被放置到:
/root/rpmbuild/RPMS/x86_64/ntp-4.2.6p5-19.el7.centos.1.x86_64.rpm
上面的測試案例是將一個 SRPM 文件抓下來之后,依據你的系統重新進行編譯。一般來說,因為該編譯可能會依據你的系統硬件而最優化, 所以可能性能會好一些些,但是...人類根本感受不到那種性能優化的效果~所以并不建議你這么作。此外, 這種情況也很能發生在你從不同的 Linux distribution 所下載的 SRPM 拿來想要安裝在你的系統上,這樣作才算是有點意義。
一般來說,如果你有需要用到 SRPM 的文件,大部分的原因就是...你需要重新修改里面的某些設置,讓軟件加入某些特殊功能等等的。 所以啰,此時就得要將 SRPM 拆開,編輯一下編譯配置文件,然后再予以重新編譯啦!下個小節我們來玩玩修改設置的方式!
### 22.4.2 SRPM 使用的路徑與需要的軟件
SRPM 既然含有 source code ,那么其中必定有配置文件啰,所以首先我們必需要知道,這個 SRPM 在進行編譯的時候會使用到哪些目錄呢?這樣一來才能夠來修改嘛! 不過從 CentOS 6.x 開始 (當然包含我們的 CentOS 7.x 啰),因為每個用戶應該都有能力自己安裝自己的軟件,因此 SRPM 安裝、設置、編譯、最終結果所使用的目錄都與操作者的主文件夾有關~鳥哥假設你用 root 的身份來進行 SRPM 的操作, 那么你應該就會使用到下列的目錄喔:
| | |
| --- | --- |
| /root/rpmbuild/SPECS | 這個目錄當中放置的是該軟件的配置文件,例如這個軟件的信息參數、設置項目等等都放置在這里; |
| /root/rpmbuild/SOURCES | 這個目錄當中放置的是該軟件的原始文件 (*.tar.gz 的文件) 以及 config 這個配置文件; |
| /root/rpmbuild/BUILD | 在編譯的過程中,有些暫存的數據都會放置在這個目錄當中; |
| /root/rpmbuild/RPMS | 經過編譯之后,并且順利的編譯成功之后,將打包完成的文件放置在這個目錄當中。里頭有包含了 x86_64, noarch.... 等等的次目錄。 |
| /root/rpmbuild/SRPMS | 與 RPMS 內相似的,這里放置的就是 SRPM 封裝的文件啰!有時候你想要將你的軟件用 SRPM 的方式釋出時, 你的 SRPM 文件就會放置在這個目錄中了。 |

**Tips** 早期要使用 SRPM 時,必須是 root 的身份才能夠使用編譯行為,同時源代碼都會被放置到 /usr/src/redhat/ 目錄內喔! 跟目前放置到 /~username/rpmbuild/ 的情況不太一樣!
此外,在編譯的過程當中,可能會發生不明的錯誤,或者是設置的錯誤,這個時候就會在 /tmp 下面產生一個相對應的錯誤文件,你可以根據該錯誤文件進行除錯的工作呢! 等到所有的問題都解決之后,也編譯成功了,那么剛剛解壓縮之后的文件,就是在 /root/rpmbild/{SPECS, SOURCES, BUILD} 等等的文件都會被殺掉,而只剩下放置在 /root/rpmbuild/RPMS 下面的文件了!
由于 SRPM 需要重新編譯,而編譯的過程當中,我們至少需要有 make 與其相關的程序,及 gcc, c, c++ 等其他的編譯用的程序語言來進行編譯,更多說明請參考[第二十一章源代碼所需基礎軟件](../Text/index.html#tarball_pack)吧。 所以,如果你在安裝的過程當中沒有選取軟件開發工具之類的軟件,這時就得要使用上一小節介紹的 yum 來安裝就是了! 當然,那個 "Development Tools" 的軟件群組請不要忘記安裝了!
問:嘗試將上個練習下載的 ntp 的 SRPM 軟件直接安裝到系統中 (不要編譯),然后查閱一下所有用到的目錄為何?答:
```
# 1\. 鳥哥這里假設你用 root 的身份來進行安裝的行為喔!
[root@study ~]# rpm -ivh ntp-4.2.6p5-19.el7.centos.1.src.rpm
Updating / installing...
1:ntp-4.2.6p5-19.el7.centos.1 ################################# [100%]
warning: user mockbuild does not exist - using root
warning: group mockbuild does not exist - using root
# 會有一堆 warning 的問題,那個不要理它!可以忽略沒問題的!
# 2\. 查閱一下 /root/rpmbuild 目錄的內容!
[root@study ~]# ll -l /root/rpmbuild
drwxr-xr-x. 3 root root 39 Sep 8 16:16 BUILD
drwxr-xr-x. 2 root root 6 Sep 8 16:16 BUILDROOT
drwxr-xr-x. 4 root root 32 Sep 8 16:16 RPMS
drwxr-xr-x. 2 root root 4096 Sep 9 09:43 SOURCES
drwxr-xr-x. 2 root root 39 Sep 9 09:43 SPECS # 這個家伙最重要!
drwxr-xr-x. 2 root root 6 Sep 8 14:51 SRPMS
[root@study ~]# ll -l /root/rpmbuild/{SOURCES,SPECS}
/root/rpmbuild/SOURCES:
-rw-rw-r--. 1 root root 559 Jun 24 07:44 ntp-4.2.4p7-getprecision.patch
-rw-rw-r--. 1 root root 661 Jun 24 07:44 ntp-4.2.6p1-cmsgalign.patch
.....(中間省略).....
/root/rpmbuild/SPECS:
-rw-rw-r--. 1 root root 41422 Jun 24 07:44 ntp.spec # 這就是重點!
```
### 22.4.3 配置文件的主要內容 (*.spec)
如前一個小節的練習,我們知道在 /root/rpmbuild/SOURCES 里面會放置原始文件 (tarball) 以及相關的修補檔 (patch file), 而我們也知道編譯需要的步驟大抵就是 ./configure, make, make check, make install 等,那這些動作寫入在哪里呢? 就在 SPECS 目錄中啦!讓我們來瞧一瞧 SPECS 里面的文件說些什么吧!
```
[root@study ~]# cd /root/rpmbuild/SPECS
[root@study SPECS]# vim ntp.spec
# 1\. 首先,這個部分在介紹整個軟件的基本相關信息!不論是版本還是釋出次數等。
Summary: The NTP daemon and utilities # 簡易的說明這個軟件的功能
Name: ntp # 軟件的名稱
Version: 4.2.6p5 # 軟件的版本
Release: 19%{?dist}.1 # 軟件的釋出版次
# primary license (COPYRIGHT) : MIT # 下面有很多 # 的注解說明!
.....(中間省略).....
License: (MIT and BSD and BSD with advertising) and GPLv2
Group: System Environment/Daemons
Source0: http://www.eecis.udel.edu/~ntp/ntp_spool/ntp4/ntp-4.2/ntp-%{version}.tar.gz
Source1: ntp.conf # 寫 SourceN 的就是源代碼!
Source2: ntp.keys # 源代碼可以有很多個!
.....(中間省略).....
Patch1: ntp-4.2.6p1-sleep.patch # 接下來則是補丁文件,就是 PatchN 的目的!
Patch2: ntp-4.2.6p4-droproot.patch
.....(中間省略).....
# 2\. 這部分則是在設置相依屬性需求的地方!
URL: http://www.ntp.org # 下面則是說明這個軟件的相依性,
Requires(post): systemd-units # 還有編譯過程需要的軟件有哪些等等!
Requires(preun): systemd-units
Requires(postun): systemd-units
Requires: ntpdate = %{version}-%{release}
BuildRequires: libcap-devel openssl-devel libedit-devel perl-HTML-Parser
BuildRequires: pps-tools-devel autogen autogen-libopts-devel systemd-units
.....(中間省略).....
%package -n ntpdate # 其實這個軟件包含有很多次軟件喔!
Summary: Utility to set the date and time via NTP
Group: Applications/System
Requires(pre): shadow-utils
Requires(post): systemd-units
Requires(preun): systemd-units
Requires(postun): systemd-units
.....(中間省略).....
# 3\. 編譯前的預處理,以及編譯過程當中所需要進行的指令,都寫在這里
# 尤其 %build 下面的數據,幾乎就是 makefile 里面的信息啊!
%prep # 這部份大多在處理補丁的動作!
%setup -q -a 5
%patch1 -p1 -b .sleep # 這些 patch 當然與前面的 PatchN 有關!
%patch2 -p1 -b .droproot
.....(中間省略).....
%build # 其實就是 ./configure, make 等動作!
sed -i 's|$CFLAGS -Wstrict-overflow|$CFLAGS|' configure sntp/configure
export CFLAGS="$RPM_OPT_FLAGS -fPIE -fno-strict-aliasing -fno-strict-overflow"
export LDFLAGS="-pie -Wl,-z,relro,-z,now"
%configure \ # 不就是 ./configure 的意思嗎!
--sysconfdir=%{_sysconfdir}/ntp/crypto \
--with-openssl-libdir=%{_libdir} \
--without-ntpsnmpd \
--enable-all-clocks --enable-parse-clocks \
--enable-ntp-signd=%{_localstatedir}/run/ntp_signd \
--disable-local-libopts
echo '#define KEYFILE "%{_sysconfdir}/ntp/keys"' >> ntpdate/ntpdate.h
echo '#define NTP_VAR "%{_localstatedir}/log/ntpstats/"' >> config.h
make %{?_smp_mflags} # 不就是 make 了嗎!
.....(中間省略).....
%install # 就是安裝過程所進行的各項動作了!
make DESTDIR=$RPM_BUILD_ROOT bindir=%{_sbindir} install
mkdir -p $RPM_BUILD_ROOT%{_mandir}/man{5,8}
sed -i 's/sntp\.1/sntp\.8/' $RPM_BUILD_ROOT%{_mandir}/man1/sntp.1
mv $RPM_BUILD_ROOT%{_mandir}/man{1/sntp.1,8/sntp.8}
rm -rf $RPM_BUILD_ROOT%{_mandir}/man1
.....(中間省略).....
# 4\. 這里列出,這個軟件釋出的文件有哪些的意思!
%files # 這軟件所屬的文件有哪些的意思!
%dir %{ntpdocdir}
%{ntpdocdir}/COPYRIGHT
%{ntpdocdir}/ChangeLog
.....(中間省略).....
# 5\. 列出這個軟件的更改歷史紀錄檔!
%changelog
* Tue Jun 23 2015 CentOS Sources <bugs@centos.org> - 4.2.6p5-19.el7.centos.1
- rebrand vendorzone
* Thu Apr 23 2015 Miroslav Lichvar <mlichvar@redhat.com> 4.2.6p5-19.el7_1.1
- don't step clock for leap second with -x option (#1191122)
.....(后面省略).....
```
要注意到的是 ntp.sepc 這個文件,這是主要的將 SRPM 編譯成 RPM 的配置文件,他的基本規則可以這樣看:
1. 整個文件的開頭以Summary為開始,這部份的設置都是最基礎的說明內容;
2. 然后每個不同的段落之間,都以 % 來做為開頭,例如 %prep 與 %install 等;
我們來談一談幾個常見的 SRPM 設置段落:
* 系統整體信息方面:
剛剛你看到的就有下面這些重要的咚咚啰:
| 參數 | 參數意義 |
| --- | --- |
| Summary | 本軟件的主要說明,例如上表中說明了本軟件是針對 NTP 的軟件功能與工具等啦! |
| Name | 本軟件的軟件名稱 (最終會是 RPM 文件的文件名構成之一) |
| Version | 本軟件的版本 (也會是 RPM 文件名的構成之一) |
| Release | 這個是該版本打包的次數說明 (也會是 RPM 文件名的構成之一)。由于我們想要動點手腳,所以請將“ 19%{?dist}.1 ” 修改為“ 20.vbird ” 看看 |
| License | 這個軟件的授權模式,看起來涵蓋了所有知名的 Open source 授權啊!! |
| Group | 這個軟件在安裝的時候,主要是放置于哪一個軟件群組當中 (yum grouplist 的特點!); |
| URL | 這個源代碼的主要官方網站; |
| SourceN | 這個軟件的來源,如果是網絡上下載的軟件,通常一定會有這個信息來告訴大家這個原始文件的來源! 此外,如果有多個軟件來源,就會以 Source0, Source1... 來處理源代碼喔! |
| PatchN | 就是作為補丁的 patch file 啰!也是可以有好多個! |
| BuildRoot | 設置作為編譯時,該使用哪個目錄來暫存中間文件 (如編譯過程的目標文件/鏈接文件等檔)。 |
| 上述為必須要存在的項目,下面為可使用的額外設置值 |
| Requires | 如果你這個軟件還需要其他的軟件的支持,那么這里就必需寫上來,則當你制作成 RPM 之后,系統就會自動的去檢查啦!這就是“相依屬性”的主要來源啰! |
| BuildRequires | 編譯過程中所需要的軟件。Requires 指的是“安裝時需要檢查”的,因為與實際運行有關,這個 BuildRequires 指的是“編譯時”所需要的軟件,只有在 SRPM 編譯成為 RPM 時才會檢查的項目。 |
上面幾個數據通常都必需要寫啦!但是如果你的軟件沒有相依屬性的關系時,那么就可以不需要那個 Requires 啰! 根據上面的設置,最終的文件名就會是“{Name}-{Version}-{Release}.{Arch}.rpm”的樣式, 以我們上面的設置來說,文件名應該會是“ntp-4.2.6p5-20.vbird.x86_64.rpm”的樣子啰!
* %description:
將你的軟件做一個簡短的說明!這個也是必需要的。還記得使用“ rpm -qi 軟件名稱 ”會出現一些基礎的說明嗎? 上面這些東西包括 Description 就是在顯示這些重要信息的啦!所以,這里記得要詳加解釋喔!
* %prep:
pre 這個關鍵字原本就有“在...之前”的意思,因此這個項目在這里指的就是“尚未進行設置或安裝之前,你要編譯完成的 RPM 幫你事先做的事情”,就是 prepare 的簡寫啰!那么他的工作事項主要有:
1. 進行軟件的補丁 (patch) 等相關工作;
2. 尋找軟件所需要的目錄是否已經存在?確認用的!
3. 事先創建你的軟件所需要的目錄,或者事先需要進行的任務;
4. 如果待安裝的Linux系統內已經有安裝的時候可能會被覆蓋掉的文件時,那么就必需要進行備份(backup)的工作了!
在本案例中,你會發現程序會使用 patch 去進行補丁的動作啦!所以程序的源代碼才會更新到最新啊!
* %build:
build 就是創建啊!所以當然啰,這個段落就是在談怎么 make 編譯成為可執行的程序啰! 你會發現在此部分的程序碼方面,就是 ./configure, make 等項目哩!一般來說,如果你會使用 SRPM 來進行重新編譯的行為, 通常就是要重新 ./configure 并給予新的參數設置!于是這部份就可能會修改到!
* %install:
編譯完成 (build) 之后,就是要安裝啦!安裝就是寫在這里,也就是類似 Tarball 里面的 make install 的意思啰!
* %files:
這個軟件安裝的文件都需要寫到這里來,當然包括了“目錄”喔!所以連同目錄請一起寫到這個段落當中!以備查驗呢!^_^ !此外,你也可以指定每個文件的類型,包括文檔文件 (%doc 后面接的) 與配置文件 (%config 后面接的) 等等。
* %changelog:
這個項目主要則是在記錄這個軟件曾經的更新紀錄啰!星號 (*) 后面應該要以時間,修改者, email 與軟件版本來作為說明, 減號 (-) 后面則是你要作的詳細說明啰!在這部份鳥哥就新增了兩行,內容如下:
```
%changelog
* Wed Sep 09 2015 VBird Tsai <vbird@mail.vbird.idv.tw>- 4.2.6p5-20.vbird
- only rbuild this SRPM to RPM
* Tue Jun 23 2015 CentOS Sources <bugs@centos.org> - 4.2.6p5-19.el7.centos.1
- rebrand vendorzone
....(下面省略)....
```
修改到這里也差不多了,您也應該要了解到這個 ntp.spec 有多么重要!我們用 rpm -q 去查詢一堆信息時, 其實都是在這里寫入的!這樣了解否?接下來,就讓我們來了解一下如何將 SRPM 給他編譯出 RPM 來吧!
### 22.4.4 SRPM 的編譯指令 (-ba/-bb)
要將在 /root/rpmbuild 下面的數據編譯或者是單純的打包成為 RPM 或 SRPM 時,就需要 rpmbuild 指令與相關選項的幫忙了!我們只介紹兩個常用的選項給您了解一下:
```
[root@study ~]# rpmbuild -ba ntp.spec <==編譯并同時產生 RPM 與 SRPM 文件
[root@study ~]# rpmbuild -bb ntp.spec <==僅編譯成 RPM 文件
```
這個時候系統就會這樣做:
1. 先進入到 BUILD 這個目錄中,亦即是: /root/rpmbuild/BUILD 這個目錄;
2. 依照 *.spec 文件內的 Name 與 Version 定義出工作的目錄名稱,以我們上面的例子為例,那么系統就會在 BUILD 目錄中先刪除 ntp-4.2.6p5 的目錄,再重新創建一個 ntp-4.2.6p5 的目錄,并進入該目錄;
3. 在新建的目錄里面,針對 SOURCES 目錄下的來源文件,也就是 *.spec 里面的 Source 設置的那個文件,以 tar 進行解壓縮,以我們這個例子來說,則會在 /root/rpmbuild/BUILD/ntp-4.2.6p5 當中,將 /root/rpmbuild/SOURCES/ntp-* 等等多個源代碼文件進行解壓縮啦!
4. 再來開始 %build 及 %install 的設置與編譯!
5. 最后將完成打包的文件給他放置到該放置的地方去,如果你的系統是 x86_64 的話,那么最后編譯成功的 *.x86_64.rpm文件就會被放置在 /root/rpmbuild/RPMS/x86_64 里面啰!如果是 noarch 那么自然就是 /root/rpmbuild/RPMS/noarch 目錄下啰!
整個步驟大概就是這樣子!最后的結果數據會放置在 RPMS 那個目錄下面就對啦!我們這個案例中想要同時打包 RPM 與 SRPM , 因此請您自行處理一下“ rpmbuild -ba ntp.spec ”吧!
```
[root@study ~]# cd /root/rpmbuild/SPECS
[root@study SPECS]# rpmbuild -ba ntp.spec
.....(前面省略).....
Wrote: /root/rpmbuild/SRPMS/ntp-4.2.6p5-20.vbird.src.rpm
Wrote: /root/rpmbuild/RPMS/x86_64/ntp-4.2.6p5-20.vbird.x86_64.rpm
Wrote: /root/rpmbuild/RPMS/noarch/ntp-perl-4.2.6p5-20.vbird.noarch.rpm
Wrote: /root/rpmbuild/RPMS/x86_64/ntpdate-4.2.6p5-20.vbird.x86_64.rpm
Wrote: /root/rpmbuild/RPMS/x86_64/sntp-4.2.6p5-20.vbird.x86_64.rpm
Wrote: /root/rpmbuild/RPMS/noarch/ntp-doc-4.2.6p5-20.vbird.noarch.rpm
Wrote: /root/rpmbuild/RPMS/x86_64/ntp-debuginfo-4.2.6p5-20.vbird.x86_64.rpm
Executing(%clean): /bin/sh -e /var/tmp/rpm-tmp.xZh6yz
+ umask 022
+ cd /root/rpmbuild/BUILD
+ cd ntp-4.2.6p5
+ /usr/bin/rm -rf /root/rpmbuild/BUILDROOT/ntp-4.2.6p5-20.vbird.x86_64
+ exit 0
[root@study SPECS]# find /root/rpmbuild -name 'ntp*rpm'
/root/rpmbuild/RPMS/x86_64/ntp-4.2.6p5-20.vbird.x86_64.rpm
/root/rpmbuild/RPMS/x86_64/ntpdate-4.2.6p5-20.vbird.x86_64.rpm
/root/rpmbuild/RPMS/x86_64/ntp-debuginfo-4.2.6p5-20.vbird.x86_64.rpm
/root/rpmbuild/RPMS/noarch/ntp-perl-4.2.6p5-20.vbird.noarch.rpm
/root/rpmbuild/RPMS/noarch/ntp-doc-4.2.6p5-20.vbird.noarch.rpm
/root/rpmbuild/SRPMS/ntp-4.2.6p5-20.vbird.src.rpm
# 上面分別是 RPM 與 SRPM 的文件文件名!
```
您瞧!嘿嘿~有 vbird 的軟件出現了!相當有趣吧!另外,有些文件軟件是與硬件等級無關的 (因為單純的文件啊!),所以如上表所示, 你會發現 ntp-doc-4.2.6p5-20.vbird.noarch.rpm 是 noarch 喔!有趣吧!
### 22.4.5 一個打包自己軟件的范例
這個就有趣了!我們自己來編輯一下自己制作的 RPM 怎么樣?會很難嗎?完全不會! 我們這里就舉個例子來玩玩吧!還記得我們在前一章談到 Tarball 與 make 時,曾經談到的 [main](../Text/index.html#make) 這個程序嗎?現在我們將這個程序加上 Makefile 后, 將他制作成為 main-0.1-1.x86_64.rpm 好嗎?那該如何進行呢?下面就讓我們來處理處理吧!
* 制作源代碼文件 tarball 產生:
因為鳥哥的網站并沒有直接釋出 main-0.2,所以假設官網提供的是 main-0.l 版本之外,同時提供了一個 patch 文件~ 那我們就得要這樣作:
* main-0.1.tar.gz 放在 /root/rpmbuild/SOURCES/
* main_0.1_to_0.2_patch 放在 /root/rpmbuild/SOURCES/
* main.spec 自行撰寫放在 /root/rpmbuild/SPECS/
```
# 1\. 先來處理源代碼的部份,假設你的 /root/rpmbuild/SOURCES 已經存在了喔!
[root@study ~]# cd /root/rpmbuild/SOURCES
[root@study SOURCES]# wget http://linux.vbird.org/linux_basic/0520source/main-0.1.tgz
[root@study SOURCES]# wget http://linux.vbird.org/linux_basic/0520source/main_0.1_to_0.2.patch
[root@study SOURCES]# ll main*
-rw-r--r--. 1 root root 703 Sep 4 14:47 main-0.1.tgz
-rw-r--r--. 1 root root 1538 Sep 4 14:51 main_0.1_to_0.2.patch
```
接下來就是 spec 文件的創建啰!
* 創建 *.spec 的配置文件
這個文件的創建是所有 RPM 制作里面最重要的課題!你必須要仔細的設置他,不要隨便處理!仔細看看吧! 有趣的是,CentOS 7.x 會主動的將必要的設置參數列出來喔!相當有趣! ^_^
```
[root@study ~]# cd /root/rpmbuild/SPECS
[root@study SPECS]# vim main.spec
Name: main
Version: 0.1
Release: 1%{?dist}
Summary: Shows sin and cos value.
Group: Scientific Support
License: GPLv2
URL: http://linux.vbird.org/
Source0: main-0.1.tgz # 這兩個文件名要正確喔!
Patch0: main_0.1_to_0.2.patch
%description
This package will let you input your name and calculate sin cos value.
%prep
%setup -q
%patch0 -p1 # 要用來作為 patch 的動作!
%build
make clean main # 編譯就好!不要安裝!
%install
mkdir -p %{buildroot}/usr/local/bin
install -m 755 main %{buildroot}/usr/local/bin # 這才是順利的安裝行為!
%files
/usr/local/bin/main
%changelog
* Wed Sep 09 2015 VBird Tsai <vbird@mail.vbird.idv.tw> 0.2
- build the program
```
* 編譯成為 RPM 與 SRPM
老實說,那個 spec 文件創建妥當后,后續的動作就簡單的要命了!開始來編譯吧!
```
[root@study SPECS]# rpmbuild -ba main.spec
.....(前面省略).....
Wrote: /root/rpmbuild/SRPMS/main-0.1-1.el7.centos.src.rpm
Wrote: /root/rpmbuild/RPMS/x86_64/main-0.1-1.el7.centos.x86_64.rpm
Wrote: /root/rpmbuild/RPMS/x86_64/main-debuginfo-0.1-1.el7.centos.x86_64.rpm
```
很快的,我們就已經創建了幾個 RPM 文件啰!接下來讓我們好好測試一下打包起來的成果吧!
* 安裝/測試/實際查詢
```
[root@study ~]# yum install /root/rpmbuild/RPMS/x86_64/main-0.1-1.el7.centos.x86_64.rpm
[root@study ~]# rpm -ql main
/usr/local/bin/main <==自己嘗試執行 main 看看!
[root@study ~]# rpm -qi main
Name : main
Version : 0.1
Release : 1.el7.centos
Architecture: x86_64
Install Date: Wed 09 Sep 2015 04:29:08 PM CST
Group : Scientific Support
Size : 7200
License : GPLv2
Signature : (none)
Source RPM : main-0.1-1.el7.centos.src.rpm
Build Date : Wed 09 Sep 2015 04:27:29 PM CST
Build Host : study.centos.vbird
Relocations : (not relocatable)
URL : http://linux.vbird.org/
Summary : Shows sin and cos value.
Description :
This package will let you input your name and calculate sin cos value.
# 看到沒?屬于你自己的軟件喔!真是很愉快的啦!
```
用很簡單的方式,就可以將自己的軟件或者程序給他修改與設置妥當!以后你就可以自行設置你的 RPM 啰!當然,也可以手動修改你的 SRPM 的來源文件內容啰!
- 鳥哥的Linux私房菜:基礎學習篇 第四版
- 目錄及概述
- 第零章、計算機概論
- 0.1 電腦:輔助人腦的好工具
- 0.2 個人電腦架構與相關設備元件
- 0.3 數據表示方式
- 0.4 軟件程序運行
- 0.5 重點回顧
- 0.6 本章習題
- 0.7 參考資料與延伸閱讀
- 第一章、Linux是什么與如何學習
- 1.1 Linux是什么
- 1.2 Torvalds的Linux發展
- 1.3 Linux當前應用的角色
- 1.4 Linux 該如何學習
- 1.5 重點回顧
- 1.6 本章習題
- 1.7 參考資料與延伸閱讀
- 第二章、主機規劃與磁盤分區
- 2.1 Linux與硬件的搭配
- 2.2 磁盤分區
- 2.3 安裝Linux前的規劃
- 2.4 重點回顧
- 2.5 本章習題
- 2.6 參考資料與延伸閱讀
- 第三章、安裝 CentOS7.x
- 3.1 本練習機的規劃--尤其是分區參數
- 3.2 開始安裝CentOS 7
- 3.3 多重開機安裝流程與管理(Option)
- 3.4 重點回顧
- 3.5 本章習題
- 3.6 參考資料與延伸閱讀
- 第四章、首次登陸與線上求助
- 4.1 首次登陸系統
- 4.2 文字模式下指令的下達
- 4.3 Linux系統的線上求助man page與info page
- 4.4 超簡單文書編輯器: nano
- 4.5 正確的關機方法
- 4.6 重點回顧
- 4.7 本章習題
- 4.8 參考資料與延伸閱讀
- 第五章、Linux 的文件權限與目錄配置
- 5.1 使用者與群組
- 5.2 Linux 文件權限概念
- 5.3 Linux目錄配置
- 5.4 重點回顧
- 5.5 本章練習
- 5.6 參考資料與延伸閱讀
- 第六章、Linux 文件與目錄管理
- 6.1 目錄與路徑
- 6.2 文件與目錄管理
- 6.3 文件內容查閱
- 6.4 文件與目錄的默認權限與隱藏權限
- 6.5 指令與文件的搜尋
- 6.6 極重要的復習!權限與指令間的關系
- 6.7 重點回顧
- 6.8 本章習題:
- 6.9 參考資料與延伸閱讀
- 第七章、Linux 磁盤與文件系統管理
- 7.1 認識 Linux 文件系統
- 7.2 文件系統的簡單操作
- 7.3 磁盤的分區、格式化、檢驗與掛載
- 7.4 設置開機掛載
- 7.5 內存交換空間(swap)之創建
- 7.6 文件系統的特殊觀察與操作
- 7.7 重點回顧
- 7.8 本章習題 - 第一題一定要做
- 7.9 參考資料與延伸閱讀
- 第八章、文件與文件系統的壓縮,打包與備份
- 8.1 壓縮文件的用途與技術
- 8.2 Linux 系統常見的壓縮指令
- 8.3 打包指令: tar
- 8.4 XFS 文件系統的備份與還原
- 8.5 光盤寫入工具
- 8.6 其他常見的壓縮與備份工具
- 8.7 重點回顧
- 8.8 本章習題
- 8.9 參考資料與延伸閱讀
- 第九章、vim 程序編輯器
- 9.1 vi 與 vim
- 9.2 vi 的使用
- 9.3 vim 的額外功能
- 9.4 其他 vim 使用注意事項
- 9.5 重點回顧
- 9.6 本章練習
- 9.7 參考資料與延伸閱讀
- 第十章、認識與學習BASH
- 10.1 認識 BASH 這個 Shell
- 10.2 Shell 的變量功能
- 10.3 命令別名與歷史命令
- 10.4 Bash Shell 的操作環境:
- 10.5 數據流重導向
- 10.6 管線命令 (pipe)
- 10.7 重點回顧
- 10.8 本章習題
- 10.9 參考資料與延伸閱讀
- 第十一章、正則表達式與文件格式化處理
- 11.1 開始之前:什么是正則表達式
- 11.2 基礎正則表達式
- 11.3 延伸正則表達式
- 11.4 文件的格式化與相關處理
- 11.5 重點回顧
- 11.6 本章習題
- 11.7 參考資料與延伸閱讀
- 第十二章、學習 Shell Scripts
- 12.1 什么是 Shell scripts
- 12.2 簡單的 shell script 練習
- 12.3 善用判斷式
- 12.4 條件判斷式
- 12.5 循環 (loop)
- 12.6 shell script 的追蹤與 debug
- 12.7 重點回顧
- 12.8 本章習題
- 第十三章、Linux 帳號管理與 ACL 權限設置
- 13.1 Linux 的帳號與群組
- 13.2 帳號管理
- 13.3 主機的細部權限規劃:ACL 的使用
- 13.4 使用者身份切換
- 13.5 使用者的特殊 shell 與 PAM 模塊
- 13.6 Linux 主機上的使用者訊息傳遞
- 13.7 CentOS 7 環境下大量創建帳號的方法
- 13.8 重點回顧
- 13.9 本章習題
- 13.10 參考資料與延伸閱讀
- 第十四章、磁盤配額(Quota)與進階文件系統管理
- 14.1 磁盤配額 (Quota) 的應用與實作
- 14.2 軟件磁盤陣列 (Software RAID)
- 14.3 邏輯卷軸管理員 (Logical Volume Manager)
- 14.4 重點回顧
- 14.5 本章習題
- 14.6 參考資料與延伸閱讀
- 第十五章、例行性工作調度(crontab)
- 15.1 什么是例行性工作調度
- 15.2 僅執行一次的工作調度
- 15.3 循環執行的例行性工作調度
- 15.4 可喚醒停機期間的工作任務
- 15.5 重點回顧
- 15.6 本章習題
- 第十六章、程序管理與 SELinux 初探
- 16.1 什么是程序 (process)
- 16.2 工作管理 (job control)
- 16.3 程序管理
- 16.4 特殊文件與程序
- 16.5 SELinux 初探
- 16.6 重點回顧
- 16.7 本章習題
- 16.8 參考資料與延伸閱讀
- 第十七章、認識系統服務 (daemons)
- 17.1 什么是 daemon 與服務 (service)
- 17.2 通過 systemctl 管理服務
- 17.3 systemctl 針對 service 類型的配置文件
- 17.4 systemctl 針對 timer 的配置文件
- 17.5 CentOS 7.x 默認啟動的服務簡易說明
- 17.6 重點回顧
- 17.7 本章習題
- 17.8 參考資料與延伸閱讀
- 第十八章、認識與分析登錄文件
- 18.1 什么是登錄文件
- 18.2 rsyslog.service :記錄登錄文件的服務
- 18.3 登錄文件的輪替(logrotate)
- 18.4 systemd-journald.service 簡介
- 18.5 分析登錄文件
- 18.6 重點回顧
- 18.7 本章習題
- 18.8 參考資料與延伸閱讀
- 第十九章、開機流程、模塊管理與 Loader
- 19.1 Linux 的開機流程分析
- 19.2 核心與核心模塊
- 19.3 Boot Loader: Grub2
- 19.4 開機過程的問題解決
- 19.5 重點回顧
- 19.6 本章習題
- 19.7 參考資料與延伸閱讀
- 第二十章、基礎系統設置與備份策略
- 20.1 系統基本設置
- 20.2 服務器硬件數據的收集
- 20.3 備份要點
- 20.4 備份的種類、頻率與工具的選擇
- 20.5 鳥哥的備份策略
- 20.6 災難復原的考慮
- 20.7 重點回顧
- 20.8 本章習題
- 20.9 參考資料與延伸閱讀
- 第二十一章、軟件安裝:源代碼與 Tarball
- 20.1 開放源碼的軟件安裝與升級簡介
- 21.2 使用傳統程序語言進行編譯的簡單范例
- 21.3 用 make 進行宏編譯
- 21.4 Tarball 的管理與建議
- 21.5 函數庫管理
- 21.6 檢驗軟件正確性
- 21.7 重點回顧
- 21.8 本章習題
- 21.9 參考資料與延伸閱讀
- 第二十二章、軟件安裝 RPM, SRPM 與 YUM
- 22.1 軟件管理員簡介
- 22.2 RPM 軟件管理程序: rpm
- 22.3 YUM 線上升級機制
- 22.4 SRPM 的使用 : rpmbuild (Optional)
- 22.5 重點回顧
- 22.6 本章習題
- 22.7 參考資料與延伸閱讀
- 第二十三章、X Window 設置介紹
- 23.1 什么是 X Window System
- 23.2 X Server 配置文件解析與設置
- 23.3 顯卡驅動程序安裝范例
- 23.4 重點回顧
- 23.5 本章習題
- 23.6 參考資料與延伸閱讀
- 第二十四章、Linux 核心編譯與管理
- 24.1 編譯前的任務:認識核心與取得核心源代碼
- 24.2 核心編譯的前處理與核心功能選擇
- 24.3 核心的編譯與安裝
- 24.4 額外(單一)核心模塊編譯
- 24.5 以最新核心版本編譯 CentOS 7.x 的核心
- 24.6 重點回顧
- 24.7 本章習題
- 24.8 參考資料與延伸閱讀