图源:
SRPM的使用
在中我们讨论了RPM如何使用,但并没有说明SRPM应该如何使用,这里算是做一个收尾。
安装
rpmbuild
。
比较重要和常用的参数有:
-
--rebuild
:将SRMP软件包进行编译并打包,会产生一个RMP软件包。 -
--recompile
:将SRMP软件包进行编译、打包后安装。
如果相关操作执行成功,将会自动删除编译过程中产生的中间数据。
下面通过一个示例来说明:
[root@xyz rpmbuild]# cd /tmp
[root@xyz tmp]# wget -4 http://vault.centos.org/7.1.1503/updates/Source/SPackages/ntp-4.2.6p5-19.el7.centos.1.src.rpm
--2021-09-21 17:38:29-- http://vault.centos.org/7.1.1503/updates/Source/SPackages/ntp-4.2.6p5-19.el7.centos.1.src.rpm
正在解析主机 vault.centos.org (vault.centos.org)... 54.186.51.210
正在连接 vault.centos.org (vault.centos.org)|54.186.51.210|:80... 已连接。
已发出 HTTP 请求,正在等待回应... 301 Moved Permanently
位置:https://vault.centos.org/7.1.1503/updates/Source/SPackages/ntp-4.2.6p5-19.el7.centos.1.src.rpm [跟随至新的 URL]
--2021-09-21 17:38:29-- https://vault.centos.org/7.1.1503/updates/Source/SPackages/ntp-4.2.6p5-19.el7.centos.1.src.rpm
正在连接 vault.centos.org (vault.centos.org)|54.186.51.210|:443... 已连接。
已发出 HTTP 请求,正在等待回应... 200 OK
长度:4285870 (4.1M) [application/x-rpm]
正在保存至: “ntp-4.2.6p5-19.el7.centos.1.src.rpm”
100%[===========================================================================================>] 4,285,870 1.14MB/s 用时 3.6s
2021-09-21 17:38:34 (1.14 MB/s) - 已保存 “ntp-4.2.6p5-19.el7.centos.1.src.rpm” [4285870/4285870])
[root@xyz tmp]# rpmbuild --rebuild ntp-4.2.6p5-19.el7.centos.1.src.rpm
正在安装 ntp-4.2.6p5-19.el7.centos.1.src.rpm
警告:用户mockbuild 不存在 - 使用root
警告:群组mockbuild 不存在 - 使用root
...省略
警告:用户mockbuild 不存在 - 使用root
警告:群组mockbuild 不存在 - 使用root
错误:构建依赖失败:
libcap-devel 被 ntp-4.2.6p5-19.el7.1.x86_64 需要
libedit-devel 被 ntp-4.2.6p5-19.el7.1.x86_64 需要
perl-HTML-Parser 被 ntp-4.2.6p5-19.el7.1.x86_64 需要
pps-tools-devel 被 ntp-4.2.6p5-19.el7.1.x86_64 需要
autogen 被 ntp-4.2.6p5-19.el7.1.x86_64 需要
autogen-libopts-devel 被 ntp-4.2.6p5-19.el7.1.x86_64 需要
这里是我从CentOS官网上挑选的一个小工具,用来演示。第一次构建出现错误,提示缺少相关工具,安装相应工具后再次尝试:
[root@xyz tmp]# yum install libcap-devel libedit-devel perl-HTML-Parser pps-tools-devel autogen autogen-libopts-devel -y
已加载插件:fastestmirror, langpacks
Loading mirror speeds from cached hostfile
* base: mirrors.aliyun.com
* extras: mirrors.aliyun.com
...省略
[root@xyz tmp]# rpmbuild --rebuild ntp-4.2.6p5-19.el7.centos.1.src.rpm
正在安装 ntp-4.2.6p5-19.el7.centos.1.src.rpm
警告:用户mockbuild 不存在 - 使用root
警告:群组mockbuild 不存在 - 使用root
警告:用户mockbuild 不存在 - 使用root
...省略
执行(%clean): /bin/sh -e /var/tmp/rpm-tmp.BUxGYy
+ umask 022
+ cd /root/rpmbuild/BUILD
+ cd ntp-4.2.6p5
+ /usr/bin/rm -rf /root/rpmbuild/BUILDROOT/ntp-4.2.6p5-19.el7.centos.1.x86_64
+ exit 0
执行(--clean): /bin/sh -e /var/tmp/rpm-tmp.5Cix7t
+ umask 022
+ cd /root/rpmbuild/BUILD
+ rm -rf ntp-4.2.6p5
+ exit 0
可以看到,成功使用SRPM软件包中的源码生成了编译后的RPM软件包。
通常来说我们并不需要使用SRPM来重新编译以生成RPM包,但是如果厂商提供的RPM包无法满足我们的需要,比如我们要修改某个配置或者源码以满足特定的需要,就需要下载SRPM包后,在修改相应的配置文件或源码后执行上边的操作。
SRPM包相关目录
SRPM包在使用过程中会使用下面的目录:
需要注意的是SRPM使用的目录是与当前用户相关的,这里均以
root
用户为准。
-
/root/rpmbuild/
-
BUILD
:编译软件时产生的中间文件。 -
BUILDROOT
:软件的工程目录。 -
RPMS
:编译产生的RPM包。 -
SOURCES
:存放软件源码。 -
SPECS
:存放软件的打包配置文件(打RPM包时候会用到的配置文件)。 -
SRPMS
:SRPM包。
-
此外,如果在编译过程中出现错误,会将错误信息写入/tmp
中,可以使用该错误日志进行debug。
下面解包SRPM软件包。因为之前使用rpmbuild
相关命令在解压编译完成后会自动删除相关的源码以及.spec
文件,所以我们这里要使用rpm -i
命令来解包SRPM
,该操作对于SRPM软件包来说只会将其中的源码和SPEC文件解压到当前目录,而并不会执行任何安装操作(这与对待RPM软件包完全不同):
[root@xyz rpmbuild]# cd ~
[root@xyz ~]# cp /tmp/ntp-4.2.6p5-19.el7.centos.1.src.rpm .
[root@xyz ~]# rpm -ivh ntp-4.2.6p5-19.el7.centos.1.src.rpm
正在升级/安装...
1:ntp-4.2.6p5-19.el7.centos.1 ################################# [100%]
警告:用户mockbuild 不存在 - 使用root
警告:群组mockbuild 不存在 - 使用root
警告:用户mockbuild 不存在 - 使用root
...省略
[root@xyz ~]# rpm -q ntp
未安装软件包 ntp
[root@xyz ~]# ll ./rpmbuild/SPECS/
总用量 152
-rw-rw-r--. 1 root root 41422 6月 24 2015 ntp.spec
-rw-rw-r--. 1 root root 110562 11月 16 2020 python3.spec
[root@xyz ~]# ll ./rpmbuild/SOURCES/*ntp*
-rw-rw-r--. 1 root root 559 6月 24 2015 ./rpmbuild/SOURCES/ntp-4.2.4p7-getprecision.patch
-rw-rw-r--. 1 root root 661 6月 24 2015 ./rpmbuild/SOURCES/ntp-4.2.6p1-cmsgalign.patch
-rw-rw-r--. 1 root root 765 6月 24 2015 ./rpmbuild/SOURCES/ntp-4.2.6p1-linkfastmath.patch
-rw-rw-r--. 1 root root 391 6月 24 2015 ./rpmbuild/SOURCES/ntp-4.2.6p1-retcode.patch
-rw-rw-r--. 1 root root 12358 6月 24 2015 ./rpmbuild/SOURCES/ntp-4.2.6p1-sleep.patch
...省略
-rw-rw-r--. 1 root root 260 6月 24 2015 ./rpmbuild/SOURCES/ntp-wait.service
-rw-rw-r--. 1 root root 324 6月 24 2015 ./rpmbuild/SOURCES/sntp.service
-rw-rw-r--. 1 root root 58 6月 24 2015 ./rpmbuild/SOURCES/sntp.sysconfig
打包配置文件
之前说过SPECS
目录下存放的是软件的打包配置文件,下面我们来看该文件的内容:
[root@xyz ~]# cat ./rpmbuild/SPECS/ntp.spec
Summary: The NTP daemon and utilities
Name: ntp
Version: 4.2.6p5
Release: 19%{?dist}.1
# primary license (COPYRIGHT) : MIT
# ElectricFence/ (not used) : GPLv2
# kernel/sys/ppsclock.h (not used) : BSD with advertising
# include/ntif.h (not used) : BSD
# include/rsa_md5.h : BSD with advertising
# include/ntp_rfc2553.h : BSD with advertising
# lib/isc/commandline.c (not used) : BSD with advertising
# lib/isc/inet_aton.c (not used) : BSD with advertising
# lib/isc/strtoul.c (not used) : BSD with advertising
# lib/isc/unix/file.c : BSD with advertising
# lib/isc/inet_aton.c (not used) : BSD with advertising
# libntp/mktime.c : BSD with advertising
# libntp/ntp_random.c : BSD with advertising
# libntp/memmove.c : BSD with advertising
# libntp/ntp_rfc2553.c : BSD with advertising
# libntp/adjtimex.c (not used) : BSD
# libparse/ : BSD
# ntpd/refclock_jjy.c: MIT
# ntpd/refclock_oncore.c : BEERWARE License (aka, Public Domain)
# ntpd/refclock_palisade.c : BSD with advertising
# ntpd/refclock_jupiter.c : BSD with advertising
# ntpd/refclock_mx4200.c : BSD with advertising
# ntpd/refclock_palisade.h : BSD with advertising
# ntpstat-0.2/ : GPLv2
# sntp/libopts/ (not used) : BSD or GPLv3+
# util/ansi2knr.c (not used) : GPL+
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
Source2: ntp.keys
Source4: ntpd.sysconfig
# http://people.redhat.com/rkeech/#ntpstat
Source5: ntpstat-0.2.tgz
Source6: ntp.step-tickers
Source7: ntpdate.wrapper
Source8: ntp.cryptopw
Source9: ntpdate.sysconfig
Source10: ntp.dhclient
Source12: ntpd.service
Source13: ntpdate.service
Source14: ntp-wait.service
Source15: sntp.service
Source16: sntp.sysconfig
# ntpbz #802
Patch1: ntp-4.2.6p1-sleep.patch
# add support for dropping root to ntpdate
Patch2: ntp-4.2.6p4-droproot.patch
# ntpbz #779
Patch3: ntp-4.2.6p3-bcast.patch
# align buffer for control messages
Patch4: ntp-4.2.6p1-cmsgalign.patch
# link ntpd with -ffast-math on ia64
Patch5: ntp-4.2.6p1-linkfastmath.patch
# ntpbz #2294
Patch6: ntp-4.2.6p5-fipsmd5.patch
# ntpbz #759
Patch7: ntp-4.2.6p1-retcode.patch
# ntpbz #2085
Patch8: ntp-4.2.6p5-rootdisp.patch
# ntpbz #2309
Patch9: ntp-4.2.6p5-hexpw.patch
# ntpbz #898
Patch10: ntp-4.2.6p4-htmldoc.patch
# ntpbz #1402
Patch11: ntp-4.2.6p5-updatebclient.patch
# fix precision calculation on fast CPUs
Patch12: ntp-4.2.4p7-getprecision.patch
# ntpbz #1408
Patch13: ntp-4.2.6p5-logdefault.patch
# add option -m to lock memory
Patch14: ntp-4.2.6p5-mlock.patch
# allow -u and -p options to be used twice (#639101)
Patch15: ntp-4.2.6p5-multiopts.patch
# ntpbz #2040
Patch16: ntp-4.2.6p5-identlen.patch
# ntpbz #1670
Patch17: ntp-4.2.6p3-broadcastdelay.patch
# ntpbz #1671
Patch18: ntp-4.2.6p5-delaycalib.patch
# ntpbz #2019
Patch19: ntp-4.2.6p5-pwcipher.patch
# ntpbz #2320
Patch20: ntp-4.2.6p5-noservres.patch
# ntpbz #2506
Patch21: ntp-4.2.6p5-refreshroute.patch
# ntpbz #2666
Patch22: ntp-4.2.6p5-cve-2014-9294.patch
# ntpbz #2665
Patch23: ntp-4.2.6p5-cve-2014-9293.patch
# ntpbz #2667
Patch24: ntp-4.2.6p5-cve-2014-9295.patch
# ntpbz #2670
Patch25: ntp-4.2.6p5-cve-2014-9296.patch
# ntpbz #2745
Patch36: ntp-4.2.6p5-xleap.patch
# handle unknown clock types
Patch50: ntpstat-0.2-clksrc.patch
# process first packet in multipacket response
Patch51: ntpstat-0.2-multipacket.patch
# use current system variable names
Patch52: ntpstat-0.2-sysvars.patch
# print synchronization distance instead of dispersion
Patch53: ntpstat-0.2-maxerror.patch
# fix error bit checking
Patch54: ntpstat-0.2-errorbit.patch
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
%description
The Network Time Protocol (NTP) is used to synchronize a computer's
time with another reference time source. This package includes ntpd
(a daemon which continuously adjusts system time) and utilities used
to query and configure the ntpd daemon.
Perl scripts ntp-wait and ntptrace are in the ntp-perl package,
ntpdate is in the ntpdate package and sntp is in the sntp package.
The documentation is in the ntp-doc package.
%package perl
Summary: NTP utilities written in Perl
Group: Applications/System
Requires: %{name} = %{version}-%{release}
Requires(post): systemd-units
Requires(preun): systemd-units
Requires(postun): systemd-units
# perl introduced in 4.2.4p4-7
Obsoletes: %{name} < 4.2.4p4-7
BuildArch: noarch
%description perl
This package contains Perl scripts ntp-wait and ntptrace.
%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
%description -n ntpdate
ntpdate is a program for retrieving the date and time from
NTP servers.
%package -n sntp
Summary: Standard Simple Network Time Protocol program
Group: Applications/System
Requires(post): systemd-units
Requires(preun): systemd-units
Requires(postun): systemd-units
%description -n sntp
sntp can be used as a SNTP client to query a NTP or SNTP server and either
display the time or set the local system's time (given suitable privilege).
It can be run as an interactive command or in a cron job.
%package doc
Summary: NTP documentation
Group: Documentation
Requires: %{name} = %{version}-%{release}
BuildArch: noarch
%description doc
This package contains NTP documentation in HTML format.
%global ntpdocdir %{_datadir}/doc/%{name}-%{version}
# pool.ntp.org vendor zone which will be used in ntp.conf
%if 0%{!?vendorzone:1}
%{?fedora: %global vendorzone fedora.}
%{?rhel: %global vendorzone centos.}
%endif
%prep
%setup -q -a 5
%patch1 -p1 -b .sleep
%patch2 -p1 -b .droproot
%patch3 -p1 -b .bcast
%patch4 -p1 -b .cmsgalign
%ifarch ia64
%patch5 -p1 -b .linkfastmath
%endif
%patch6 -p1 -b .fipsmd5
%patch7 -p1 -b .retcode
%patch8 -p1 -b .rootdisp
%patch9 -p1 -b .hexpw
%patch10 -p1 -b .htmldoc
%patch11 -p1 -b .updatebclient
%patch12 -p1 -b .getprecision
%patch13 -p1 -b .logdefault
%patch14 -p1 -b .mlock
%patch15 -p1 -b .multiopts
%patch16 -p1 -b .identlen
%patch17 -p1 -b .broadcastdelay
%patch18 -p1 -b .delaycalib
%patch19 -p1 -b .pwcipher
%patch20 -p1 -b .noservres
%patch21 -p1 -b .refreshroute
%patch22 -p1 -b .cve-2014-9294
%patch23 -p1 -b .cve-2014-9293
%patch24 -p1 -b .cve-2014-9295
%patch25 -p1 -b .cve-2014-9296
%patch36 -p1 -b .xleap
# ntpstat patches
%patch50 -p1 -b .clksrc
%patch51 -p1 -b .multipacket
%patch52 -p1 -b .sysvars
%patch53 -p1 -b .maxerror
%patch54 -p1 -b .errorbit
# set default path to sntp KoD database
sed -i 's|/var/db/ntp-kod|%{_localstatedir}/lib/sntp-kod|' sntp/{sntp.1,main.c}
# fix line terminators
sed -i 's|\r||g' html/scripts/{footer.txt,style.css}
for f in COPYRIGHT ChangeLog; do
iconv -f iso8859-1 -t utf8 -o ${f}{_,} && touch -r ${f}{,_} && mv -f ${f}{_,}
done
# don't regenerate texinfo files as it breaks build with _smp_mflags
touch ntpd/ntpd-opts.texi util/ntp-keygen-opts.texi
# autogen fails to regenerate man pages (#958908), but they won't be used anyway
touch ntpd/ntpd.1 util/ntp-keygen.1
%build
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 \
--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}
sed -i 's|$ntpq = "ntpq"|$ntpq = "%{_sbindir}/ntpq"|' scripts/ntptrace
sed -i 's|ntpq -c |%{_sbindir}/ntpq -c |' scripts/ntp-wait
pushd html
../scripts/html2man
# remove adjacent blank lines
sed -i 's/^[\t\ ]*$//;/./,/^$/!d' man/man*/*.[58]
popd
make -C ntpstat-0.2 CFLAGS="$CFLAGS"
%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
pushd ntpstat-0.2
mkdir -p $RPM_BUILD_ROOT%{_bindir}
install -m 755 ntpstat $RPM_BUILD_ROOT%{_bindir}
install -m 644 ntpstat.1 $RPM_BUILD_ROOT%{_mandir}/man8/ntpstat.8
popd
# fix section numbers
sed -i 's/\(\.TH[a-zA-Z ]*\)[1-9]\(.*\)/\18\2/' $RPM_BUILD_ROOT%{_mandir}/man8/*.8
cp -r html/man/man[58] $RPM_BUILD_ROOT%{_mandir}
mkdir -p $RPM_BUILD_ROOT%{ntpdocdir}
cp -p COPYRIGHT ChangeLog NEWS $RPM_BUILD_ROOT%{ntpdocdir}
# prepare html documentation
find html | grep -E '\.(html|css|txt|jpg|gif)$' | grep -v '/build/\|sntp' | \
cpio -pmd $RPM_BUILD_ROOT%{ntpdocdir}
find $RPM_BUILD_ROOT%{ntpdocdir} -type f | xargs chmod 644
find $RPM_BUILD_ROOT%{ntpdocdir} -type d | xargs chmod 755
pushd $RPM_BUILD_ROOT
mkdir -p .%{_sysconfdir}/{ntp/crypto,sysconfig,dhcp/dhclient.d} .%{_libexecdir}
mkdir -p .%{_localstatedir}/{lib/ntp,log/ntpstats} .%{_unitdir}
touch .%{_localstatedir}/lib/{ntp/drift,sntp-kod}
sed -e 's|VENDORZONE\.|%{vendorzone}|' \
-e 's|ETCNTP|%{_sysconfdir}/ntp|' \
-e 's|VARNTP|%{_localstatedir}/lib/ntp|' \
< %{SOURCE1} > .%{_sysconfdir}/ntp.conf
touch -r %{SOURCE1} .%{_sysconfdir}/ntp.conf
install -p -m600 %{SOURCE2} .%{_sysconfdir}/ntp/keys
install -p -m755 %{SOURCE7} .%{_libexecdir}/ntpdate-wrapper
install -p -m644 %{SOURCE4} .%{_sysconfdir}/sysconfig/ntpd
install -p -m644 %{SOURCE9} .%{_sysconfdir}/sysconfig/ntpdate
sed -e 's|VENDORZONE\.|%{vendorzone}|' \
< %{SOURCE6} > .%{_sysconfdir}/ntp/step-tickers
touch -r %{SOURCE6} .%{_sysconfdir}/ntp/step-tickers
sed -e 's|VENDORZONE\.|%{vendorzone}|' \
< %{SOURCE16} > .%{_sysconfdir}/sysconfig/sntp
touch -r %{SOURCE16} .%{_sysconfdir}/sysconfig/sntp
install -p -m600 %{SOURCE8} .%{_sysconfdir}/ntp/crypto/pw
install -p -m755 %{SOURCE10} .%{_sysconfdir}/dhcp/dhclient.d/ntp.sh
install -p -m644 %{SOURCE12} .%{_unitdir}/ntpd.service
install -p -m644 %{SOURCE13} .%{_unitdir}/ntpdate.service
install -p -m644 %{SOURCE14} .%{_unitdir}/ntp-wait.service
install -p -m644 %{SOURCE15} .%{_unitdir}/sntp.service
mkdir .%{_prefix}/lib/systemd/ntp-units.d
echo 'ntpd.service' > .%{_prefix}/lib/systemd/ntp-units.d/60-ntpd.list
popd
%pre -n ntpdate
/usr/sbin/groupadd -g 38 ntp 2> /dev/null || :
/usr/sbin/useradd -u 38 -g 38 -s /sbin/nologin -M -r -d %{_sysconfdir}/ntp ntp 2>/dev/null || :
%post
%systemd_post ntpd.service
%post -n ntpdate
%systemd_post ntpdate.service
%post -n sntp
%systemd_post sntp.service
%post perl
%systemd_post ntp-wait.service
%preun
%systemd_preun ntpd.service
%preun -n ntpdate
%systemd_preun ntpdate.service
%preun -n sntp
%systemd_preun sntp.service
%preun perl
%systemd_preun ntp-wait.service
%postun
%systemd_postun_with_restart ntpd.service
%postun -n ntpdate
%systemd_postun
%postun -n sntp
%systemd_postun
%postun perl
%systemd_postun
%files
%dir %{ntpdocdir}
%{ntpdocdir}/COPYRIGHT
%{ntpdocdir}/ChangeLog
%{ntpdocdir}/NEWS
%{_sbindir}/ntp-keygen
%{_sbindir}/ntpd
%{_sbindir}/ntpdc
%{_sbindir}/ntpq
%{_sbindir}/ntptime
%{_sbindir}/tickadj
%config(noreplace) %{_sysconfdir}/sysconfig/ntpd
%config(noreplace) %verify(not md5 size mtime) %{_sysconfdir}/ntp.conf
%dir %attr(750,root,ntp) %{_sysconfdir}/ntp/crypto
%config(noreplace) %{_sysconfdir}/ntp/crypto/pw
%dir %{_sysconfdir}/dhcp/dhclient.d
%{_sysconfdir}/dhcp/dhclient.d/ntp.sh
%dir %attr(-,ntp,ntp) %{_localstatedir}/lib/ntp
%ghost %attr(644,ntp,ntp) %{_localstatedir}/lib/ntp/drift
%dir %attr(-,ntp,ntp) %{_localstatedir}/log/ntpstats
%{_bindir}/ntpstat
%{_mandir}/man5/*.5*
%{_mandir}/man8/ntp-keygen.8*
%{_mandir}/man8/ntpd.8*
%{_mandir}/man8/ntpdc.8*
%{_mandir}/man8/ntpq.8*
%{_mandir}/man8/ntpstat.8*
%{_mandir}/man8/ntptime.8*
%{_mandir}/man8/tickadj.8*
%{_prefix}/lib/systemd/ntp-units.d/*.list
%{_unitdir}/ntpd.service
%files perl
%{_sbindir}/ntp-wait
%{_sbindir}/ntptrace
%{_mandir}/man8/ntp-wait.8*
%{_mandir}/man8/ntptrace.8*
%{_unitdir}/ntp-wait.service
%files -n ntpdate
%doc COPYRIGHT
%config(noreplace) %{_sysconfdir}/sysconfig/ntpdate
%dir %{_sysconfdir}/ntp
%config(noreplace) %{_sysconfdir}/ntp/keys
%config(noreplace) %verify(not md5 size mtime) %{_sysconfdir}/ntp/step-tickers
%{_libexecdir}/ntpdate-wrapper
%{_sbindir}/ntpdate
%{_mandir}/man8/ntpdate.8*
%{_unitdir}/ntpdate.service
%files -n sntp
%doc sntp/COPYRIGHT
%config(noreplace) %{_sysconfdir}/sysconfig/sntp
%{_sbindir}/sntp
%{_mandir}/man8/sntp.8*
%ghost %{_localstatedir}/lib/sntp-kod
%{_unitdir}/sntp.service
%files doc
%{ntpdocdir}/html
%changelog
* Tue Jun 23 2015 CentOS Sources <bugs@centos.org> - 4.2.6p5-19.el7.centos.1
- rebrand vendorzone
...省略
这里包含以下的配置项:
参数 | 含义 |
---|---|
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 時才會檢查的項目。 |
摘抄自。
除了上边的配置项以外,还包括以下的特殊内容:
-
%descrption
软件的相关说明。
-
%prep
软件编译前需要执行的命令和操作。
-
%build
编译软件的相关命令和操作,类似于
make
。 -
%install
软件的安装命令,类似于
make install
。 -
%files
软件部署后的目录和文件路径。
-
%changelog
版本更新日志。
编译&打包
有了源码和打包配置文件(.spec
)我们就可以对源码进行编译后打包为RPM软件包或者SRPM软件包。
可以使用以下命令:
-
rpmbuild -ba ntp.spec
:编译后打包为RPM和SRPM软件包。 -
rpmbuild -bb ntp.spec
:编译后打包为RPM软件包。
现在来试一下:
[root@xyz ~]# cd /root/rpmbuild/SPECS/
[root@xyz SPECS]# ll
总用量 152
-rw-rw-r--. 1 root root 41422 6月 24 2015 ntp.spec
-rw-rw-r--. 1 root root 110562 11月 16 2020 python3.spec
[root@xyz SPECS]# rpmbuild -ba ntp.spec
执行(%prep): /bin/sh -e /var/tmp/rpm-tmp.t85taa
+ umask 022
+ cd /root/rpmbuild/BUILD
+ cd /root/rpmbuild/BUILD
...省略
[root@xyz SPECS]# find /root/rpmbuild/ -name 'ntp*rpm'
/root/rpmbuild/RPMS/x86_64/ntp-4.2.6p5-19.el7.1.x86_64.rpm
/root/rpmbuild/RPMS/x86_64/ntpdate-4.2.6p5-19.el7.1.x86_64.rpm
/root/rpmbuild/RPMS/x86_64/ntp-debuginfo-4.2.6p5-19.el7.1.x86_64.rpm
/root/rpmbuild/RPMS/noarch/ntp-perl-4.2.6p5-19.el7.1.noarch.rpm
/root/rpmbuild/RPMS/noarch/ntp-doc-4.2.6p5-19.el7.1.noarch.rpm
/root/rpmbuild/SRPMS/ntp-4.2.6p5-19.el7.1.src.rpm
可以看到生成了RPM和SRPM软件包。
打包自己的软件
类似的,我们也可以将自己为Linux编写的软件进行打包为SRPM或RPM软件包,这样更方便进行传播。
准备源码
先需要在/root/rpmbuild/SOURCES
中准备源码:
[root@xyz SPECS]# cd /root/rpmbuild/SOURCES/
[root@xyz SOURCES]# wget -4 http://linux.vbird.org/linux_basic/0520source/main-0.1.tgz
--2021-09-21 18:52:01-- http://linux.vbird.org/linux_basic/0520source/main-0.1.tgz
正在解析主机 linux.vbird.org (linux.vbird.org)... 140.116.44.180
正在连接 linux.vbird.org (linux.vbird.org)|140.116.44.180|:80... 已连接。
已发出 HTTP 请求,正在等待回应... 200 OK
长度:703 [application/x-gzip]
正在保存至: “main-0.1.tgz”
100%[==================================================================================>] 703 --.-K/s 用时 0s
2021-09-21 18:52:07 (25.3 MB/s) - 已保存 “main-0.1.tgz” [703/703])
[root@xyz SOURCES]# wget -4 http://linux.vbird.org/linux_basic/0520source/main_0.1_to_0.2.patch
--2021-09-21 18:52:18-- http://linux.vbird.org/linux_basic/0520source/main_0.1_to_0.2.patch
正在解析主机 linux.vbird.org (linux.vbird.org)... 140.116.44.180
正在连接 linux.vbird.org (linux.vbird.org)|140.116.44.180|:80... 已连接。
已发出 HTTP 请求,正在等待回应... 200 OK
长度:1538 (1.5K) [application/x-troff-man]
正在保存至: “main_0.1_to_0.2.patch”
100%[==================================================================================>] 1,538 --.-K/s 用时 0s
2021-09-21 18:52:19 (45.1 MB/s) - 已保存 “main_0.1_to_0.2.patch” [1538/1538])
[root@xyz SOURCES]# ll main*
-rw-r--r--. 1 root root 703 9月 4 2015 main-0.1.tgz
-rw-r--r--. 1 root root 1538 9月 4 2015 main_0.1_to_0.2.patch
需要注意的是,源码是以tarball
和.patch
文件的方式提供的。
编写.spec
文件
要进行RPM打包,.spec
打包配置文件是不可或缺的,我们可以仿照其它软件的.spec
文件进行编写:
[root@xyz SOURCES]# cd ../SPECS/
[root@xyz SPECS]# vim main.spec
[root@xyz SPECS]# cat main.spec
Name: main
Version: 0.1
Release: 1%{?dist}
Summary: a test program
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
%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
编译&打包
[root@xyz SPECS]# rpmbuild -ba main.spec
执行(%prep): /bin/sh -e /var/tmp/rpm-tmp.Pk72sI
+ umask 022
+ cd /root/rpmbuild/BUILD
+ cd /root/rpmbuild/BUILD
+ rm -rf main-0.1
...省略
写道:/root/rpmbuild/RPMS/x86_64/main-debuginfo-0.1-1.el7.x86_64.rpm
执行(%clean): /bin/sh -e /var/tmp/rpm-tmp.7EkOFi
+ umask 022
+ cd /root/rpmbuild/BUILD
+ cd main-0.1
+ /usr/bin/rm -rf /root/rpmbuild/BUILDROOT/main-0.1-1.el7.x86_64
+ exit 0
安装&测试
[root@xyz SPECS]# rpm -ivh /root/rpmbuild/RPMS/x86_64/main-0.1-1.el7.x86_64.rpm
准备中... ################################# [100%]
正在升级/安装...
1:main-0.1-1.el7 ################################# [100%]
[root@xyz SPECS]# rpm -ql main
/usr/local/bin/main
[root@xyz SPECS]# rpm -qi main
Name : main
Version : 0.1
Release : 1.el7
Architecture: x86_64
Install Date: 2021年09月21日 星期二 19时06分07秒
Group : Scientific Support
Size : 7200
License : GPLv2
Signature : (none)
Source RPM : main-0.1-1.el7.src.rpm
Build Date : 2021年09月21日 星期二 19时04分13秒
Build Host : xyz.icexmoon.centos
Relocations : (not relocatable)
URL : http://linux.vbird.org/
Summary : a test program
Description :
This package will let you input your name and calculate sin cos value.
利用SRPM编译核心
在中我们学习了编译内核的一般做法。实际上内核可以看做是一个复杂的程序,所以除了使用那种方式以外,还可以借助SRPM软件包的机制来编译和安装内核。
首先我们要从官网下载适用于CentOS版本的内核SRPM。
ELRepo是一个适用于RedHat Enterprice Linux以及相关的发行版(如CentOS)的RPM软件仓库项目。
该项目所属的软件源有诸多镜像站,我这里选择了国内的一个镜像站:
我选择的Linux内核SRPM包是。
内核SRPM分为
kernel-lt-xxx
与kernel-ml-xxx
,前者基于"long term support"分支,后者基于“mainline stable”分支,这里推荐使用后者,更详细的说明见。
先下载SRPM:
[root@xyz ~]# wget -4 https://mirrors.tuna.tsinghua.edu.cn/elrepo/kernel/el7/SRPMS/kernel-ml-5.14.6-1.el7.elrepo.nosrc.rpm
--2021-09-22 13:37:29-- https://mirrors.tuna.tsinghua.edu.cn/elrepo/kernel/el7/SRPMS/kernel-ml-5.14.6-1.el7.elrepo.nosrc.rpm
正在解析主机 mirrors.tuna.tsinghua.edu.cn (mirrors.tuna.tsinghua.edu.cn)... 101.6.15.130
正在连接 mirrors.tuna.tsinghua.edu.cn (mirrors.tuna.tsinghua.edu.cn)|101.6.15.130|:443... 已连接。
已发出 HTTP 请求,正在等待回应... 200 OK
长度:196365 (192K) [application/x-redhat-package-manager]
正在保存至: “kernel-ml-5.14.6-1.el7.elrepo.nosrc.rpm”
100%[===========================================================================================>] 196,365 --.-K/s 用时 0.1s
2021-09-22 13:37:35 (1.44 MB/s) - 已保存 “kernel-ml-5.14.6-1.el7.elrepo.nosrc.rpm” [196365/196365])
需要说明的是,虽然这是内核的SRPM包,但是是不包含内核源码的。我知道这听起来很怪,但的确如此,文件后缀nosrc.rpm
也正是在说明这一点。你可以将这看做是不包含内核源码的SRPM包。所以要使用的话我们还需要去下载该SRPM包对应的内核源码,在这个示例中是5.14.6
这个版本的内核。
在下载内核前先解包:
[root@xyz ~]# rpm -ivh kernel-ml-5.14.6-1.el7.elrepo.nosrc.rpm
警告:kernel-ml-5.14.6-1.el7.elrepo.nosrc.rpm: 头V4 DSA/SHA1 Signature, 密钥 ID baadae52: NOKEY
正在升级/安装...
1:kernel-ml-5.14.6-1.el7.elrepo ################################# [100%]
警告:用户ajb 不存在 - 使用root
警告:群组ajb 不存在 - 使用root
警告:用户ajb 不存在 - 使用root
警告:群组ajb 不存在 - 使用root
警告:用户ajb 不存在 - 使用root
警告:群组ajb 不存在 - 使用root
警告:用户ajb 不存在 - 使用root
警告:群组ajb 不存在 - 使用root
就像在上面介绍的使用rpmbuild
进行编译的做法那样,我们需要在/root/rpmbuild/SOURCE
目录下放置内核源码:
[root@xyz ~]# cd rpmbuild/SOURCES/
[root@xyz SOURCES]# wget -4 https://mirrors.ustc.edu.cn/kernel.org/linux/kernel/v5.x/linux-5.14.6.tar.xz
--2021-09-22 13:45:10-- https://mirrors.ustc.edu.cn/kernel.org/linux/kernel/v5.x/linux-5.14.6.tar.xz
正在解析主机 mirrors.ustc.edu.cn (mirrors.ustc.edu.cn)... 202.141.176.110
正在连接 mirrors.ustc.edu.cn (mirrors.ustc.edu.cn)|202.141.176.110|:443... 已连接。
已发出 HTTP 请求,正在等待回应... 200 OK
长度:120689192 (115M) [application/octet-stream]
正在保存至: “linux-5.14.6.tar.xz”
100%[===========================================================================================>] 120,689,192 9.53MB/s 用时 17s
2021-09-22 13:45:32 (6.95 MB/s) - 已保存 “linux-5.14.6.tar.xz” [120689192/120689192])
[root@xyz SOURCES]# ll -d *5.14.6*
-rw-rw-r--. 1 root root 225710 9月 17 07:21 config-5.14.6-x86_64
-rw-r--r--. 1 root root 120689192 9月 18 19:56 linux-5.14.6.tar.xz
修改内核的配置文件:
[root@xyz SOURCES]# cp config-5.14.6-x86_64 config-5.14.6-x86_64.bak
[root@xyz SOURCES]# vim config-5.14.6-x86_64
[root@xyz SOURCES]# diff config-5.14.6-x86_64 config-5.14.6-x86_64.bak
7386d7385
< CONFIG_VFIO_PCI_VGA=y
这里是使用查找功能找到# CONFIG_VFIO_PCI_VGA is not set
这一行注释,并且在下一行添加上CONFIG_VFIO_PCI_VGA=y
的配置信息。
下面修改打包配置文件(.spec
):
[root@xyz SOURCES]# cd ../SPECS/
[root@xyz SPECS]# ll
总用量 300
-rw-rw-r--. 1 root root 147403 9月 17 07:21 kernel-ml-5.14.spec
-rw-r--r--. 1 root root 477 9月 21 19:03 main.spec
-rw-rw-r--. 1 root root 41422 6月 24 2015 ntp.spec
-rw-rw-r--. 1 root root 110562 11月 16 2020 python3.spec
[root@xyz SPECS]# cp kernel-ml-5.14.spec kernel-ml-5.14.spec.bak
[root@xyz SPECS]# vim kernel-ml-5.14.spec
[root@xyz SPECS]# diff kernel-ml-5.14.spec kernel-ml-5.14.spec.bak
144c144
< Source0: linux-%{LKAver}.tar.xz
---
> Source0: https://www.kernel.org/pub/linux/kernel/v5.x/linux-%{LKAver}.tar.xz
原本打包时候使用的内核代码是网络资源,我们在这里修改为本地下载的Tarball。
最后的步骤就和编译打包软件没有什么区别了:
[root@xyz SPECS]# rpmbuild -bb kernel-ml-5.14.spec
如果一切顺利,你可以获得一个打包好的内核RPM软件安装包,使用yum install kernel-xxx.rpm
就可以像安装普通软件那样进行安装,这会比手动编译和安装内核容易的多。
事实上我并没有真完成之后的内核编译和安装步骤,因为一来我的笔记本性能捉急,每次编译都要个把小时,二来如果你执行上边的操作就会知道,要编译5.X版本的内核需要安装一堆依赖软件,同样是件让人头疼的事情,所以我这里就偷懒了。
以上就是正篇中遗留(偷懒)的部分,这个系列现在是真的告一段落了,谢谢阅读。
文章评论