rpmbuild├── BUILD #當我們rpmbuild -ba 構建rpm時會自動在這個目錄下進行編譯├── BUILDROOT #會當成臨時根,會將編譯好的軟體包生成在這個目錄下├── RPMS #編譯好的rpm包會存放在這個文件夾├── SOURCES #放源碼包,一般為tar.gz格式├ ...
RPM manage:
rpm2cpio package_name
| cpio -id #將一個rpm包解壓至當前目錄
rpm -qi package_name #查看一個已安裝的rpm包信息
rpm -qpi package_name #查看一個文件系統上的制定rpm包信息
rpm -Uvh package_name #升級一個rpm包
rpm -e package_name #卸載rpm包 -ivh 顯示詳細信息 --nodpes 忽略依賴
rpm -i package_name #安裝rpm包 -ivh 顯示詳細信息
rpm -qd package_name #查看rpm包生成的文檔路徑
rpm -qc package_name #查看rpm包生成的配置文件路徑
rpm -q --scripts package_name #查看安裝rpm包前運行的腳本
RPM Build:
構建rpm需要創建指定的文件夾:
BUILD BUILDROOT RPMS SOURCES SPECS SRPMS
可以手動創建,也可以在任何目錄下直接運行rpmbuild test.spec
error: failed to stat /root/test.spec: 沒有那個文件或目錄
雖然會報錯,但是這時已經自動在當前目錄下生成了rpmbuild目錄結構了:
rpmbuild
├── BUILD #當我們rpmbuild -ba 構建rpm時會自動在這個目錄下進行編譯
├── BUILDROOT #會當成臨時根,會將編譯好的軟體包生成在這個目錄下
├── RPMS #編譯好的rpm包會存放在這個文件夾
├── SOURCES #放源碼包,一般為tar.gz格式
├── SPECS #.sepc 文件
└── SRPMS #存放src.rpm包【rpm格式的源碼包,可以在不同平臺上進行build】
rpmbuild --showrc #顯示系統定義的macros
rpmbuild --showrc | grep _topdir #顯示系統預設的rpmbuild工作路徑
NOTE: 在macros中 ‘__’表示命令別名(不同的os命令路徑可能不一樣,所以需要使用命令別名),'_'表示環境變數。
SPEC FILE:
macros:
#開頭為註釋,註釋中不能使用%等巨集關鍵字,如要使用#,可以寫成##
%define nginx_user nginx #define macros
%{nginx_user} #use macro
spec文件必須欄位:
name:
不能包含“-”
version:
不能包含“-”
release:
發行號
group:
所屬組,/usr/share/doc/rpm-version/GROUPS 中任意一個
定義能力:
Provides: webserver
#如果定義了能力,別人如果安裝軟體需要依賴的話可以依賴我們自己定義的能力,如果沒有定義預設就是軟體包的名字。
所有步驟:
1.準備階段:
%prep:
1.切換工作目錄,解壓軟體包
2.設置許可權,設置環境變數等
#可以用%setup 控制預設prep的動作
2.編譯階段:
%build:
#如果不需要編譯可以留空。
3.安裝階段:
%install:
#安裝
4.清理階段:
%clean
#刪除build中的文件
%file
#包含哪些文件,如果未完全包含編譯生成的所有文件,那麼構建rpm包時會報錯
%doc file #後面文件類型為文檔
%docdir dir_name #目錄下所有內容都為文檔
%config(noreplace) #內容為配置文件(noreplace)
%defattr #定義文件預設許可權
%attr(mode,user,group) #定義文件許可權,如果不定義則使用定義的預設許可權
eg: %attr(-,root,-)
%defattr(-,root,root,0755)
額外選項:
%pre
#安裝前運行的腳本
%post
#安裝後運行的腳本
%preun
#卸載前運行的腳本
%postun
#卸載後運行的腳本
子包:將一個程式拆分為多個子包
如:將mysql拆分為主包和開發包:
mysql-server.rpm
mysql-devel.rpm
spec file 實例:
Name: nginx Version: 1.10.2 Release: 1%{?dist} Summary: nginx web server Group: Applications/Internet License: fuck URL: http://www.feixiangwl.cn Source0: nginx-1.10.2.tar.gz Source1: readme BuildRoot: %_topdir/BUILDROOT #BuildRequires: #Requires: %description this is my first rpm %package readme #子包(將readme單獨作為一個包) Summary: readme files Group: Applications/Internet %description readme this is my first rpm %prep %setup -q %build ./configure --prefix=/usr/local/nginx --sbin-path=/usr/sbin/nginx --modules-path=/usr/lib64/nginx --conf-path=/etc/nginx/conf/nginx.conf --error-log-path=/var/log/nginx/error.log --without-http_rewrite_module --without-http_gzip_module make %install make install DESTDIR=%{buildroot} %{__install} -p -D -m 0755 %{SOURCE1} %{buildroot}/readme %files %defattr(-,root,root,0755) /usr /etc /var %files readme #(定義上面的子包包含哪些文件) %defattr(-,root,root,0755) /readme %changelog
簽名:防止程式傳播過程中被別人篡改
1.生成密鑰對:
gpg --gen-key
NOTE:必須正確輸入REAL NAME(真實姓名)選項,後期此項作為KEY_NAME使用。
2.查看系統已有的GPG KEY:
gpg --list-key
3.修改rpm巨集使用我們剛纔生成的密鑰對:
# echo %_signature gpg >> ~/.rpmmacros # echo "%_gpg_name <key_name>" >> ~/.rpmmacros 4.對已經存在的rpm包簽名: rpm --addsign <rpm_name> 5.導出公鑰,以備後期其他客戶端對包簽名進行驗證: gpg --export -a "<key_name>" > RPM-GPG-KEY-ECDATA
6. 導入公鑰(要驗證rpm包的機器上導入):
rpm --import RPM-GPG-KEY-ECDATA #RPM-GPG-KEY-ECDATA是公鑰名稱
7.查看已導入的公鑰:
rpm -q gpg-pubkey-*
8.校驗rpm包簽名:
rpm -K <RPM_NAME>
NOTE:但是此時yum安裝還不行,如果想要yum安裝,必須在repo中定義:
enabled=1 gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-6 file:///etc/pki/rpm-gpg/RPM-GPG-KEY-ECDATA #公鑰的路徑