Cet article partage principalement avec vous le processus de packaging RPM sous Linux, en espérant aider tout le monde.
Préparation avant de commencer
Installer le package rpmbuild
yum -y install rpm-build
Générer les répertoires associés
Pour générer des répertoires liés à rpm, vous pouvez les créer manuellement ou via la commande rpmbuild. Par exemple :
[root@yang data]# rpmbuild zabbix_agentd_ops.spec error: File /root/rpmbuild/SOURCES/zabbix-3.0.3.tar.gz: No such file or directory 有报错,无需理会,可以看到rpmbuild目录已经创建完成 [root@yang ~]# tree rpmbuild/ rpmbuild/ ├── BUILD ├── BUILDROOT ├── RPMS ├── SOURCES ├── SPECS └── SRPMS
Écrire le fichier SPEC
Mot-clé SPEC
Nom : Le nom du progiciel, qui peut être référencé ultérieurement en utilisant %{name}
Résumé : Résumé du contenu du progiciel
Version : Le numéro de version réel du logiciel, par exemple : 1.0.1, etc., qui peut être référencé ultérieurement en utilisant %{version}
Release : Numéro de série de la version, Par exemple : 1linuxing, etc., indiquez le nombre de fois à empaqueter, vous pouvez utiliser %{release} pour référencer plus tard
Groupe : regroupement de logiciels, il il est recommandé d'utiliser le regroupement standard
Licence : méthode d'autorisation logicielle, généralement GPL
Source : package de code source, vous pouvez apporter plusieurs sources telles que Source1, Source2, etc., et vous pouvez également utilisez %{source1}, %{source2} plus tard pour référencer
BuildRoot : c'est lors de l'installation ou de la compilation. Le "répertoire virtuel" utilisé, compte tenu de l'environnement multi-utilisateurs, est généralement défini comme : %{tmppath} /{name}-%{version}-%{release}-root ou %{tmppath}/%{name}-% {version}-%{release}-buildroot-%%__id_u} -n}. très important car pendant le processus de génération de rpm, le logiciel sera installé dans le chemin ci-dessus lors de l'exécution de make install. À ce stade, nous nous appuyons également sur le « répertoire virtuel » comme « répertoire racine » pour les opérations. Il peut être référencé ultérieurement à l'aide de la méthode $RPM_BUILD_ROOT.
URL : page d'accueil du logiciel
Fournisseur : informations sur l'éditeur ou l'organisation de conditionnement, telles que RedFlag Co, Ltd
Distribution : identification de la distribution
Patch : Code source du correctif, vous pouvez utiliser Patch1, Patch2, etc. pour identifier plusieurs correctifs, utilisez %patch0 ou %{patch0} pour référencer
Préfixe : %{_prefix} Il s'agit principalement de résoudre le problème qui lorsque l'installation des packages rpm à l'avenir, ce ne sera pas nécessairement la situation d'installation du logiciel dans le répertoire packagé dans rpm. De cette façon, l'identifiant doit être défini ici et référencé lors de l'écriture du script %install pour réaliser la fonction de re-spécification de l'emplacement lors de l'installation de rpm
Préfixe : %{sysconfdir} Cette raison est la même que ci-dessus , mais comme %{prefix} fait référence à /usr, et pour d'autres fichiers, tels que les fichiers de configuration sous /etc, vous devez utiliser la marque %{_sysconfdir}
Build Arch : fait référence au processeur cible compilé architecture, la marque noarch ne précise pas, mais généralement le contenu de /usr/lib/rpm/marcros est utilisé comme valeur par défaut
Obligatoire : le nom du progiciel dont dépend le package rpm Vous. peut utiliser >= ou <= pour indiquer supérieur ou inférieur à une version spécifique, par exemple : libpng-devel >= 1.0.20 zlib ※ Les deux côtés du signe ">=" doivent être séparés par des espaces , et différents noms de logiciels sont également séparés par des espaces, ainsi que PreReq, Requires(pre ), Requires(post), Requires(preun), Requires(postun), BuildRequires, etc. sont tous spécifiés pour les dépendances à différentes étapes
Fournit : Indiquer certaines fonctions spécifiques de ce logiciel afin que d'autres RPM puissent les identifier
Packager : Informations sur le packager
%description Description détaillée du logiciel
Corps du script SPEC
%prep Script de prétraitement
%setup - n %{name}-%{version}** Décompressez et placez le package de code source, généralement à partir du package dans /usr/src/asianux /SOURCES vers /usr/src/asianux/BUILD/%{name}-% dans {version}. Généralement, %setup -c suffit, mais il existe deux situations : l'une consiste à compiler plusieurs packages de code source en même temps, et l'autre est que le nom du package tar de code source n'est pas cohérent avec le répertoire décompressé. Dans ce cas, vous devez utiliser le paramètre -n pour spécifier Pendant un instant.
%patch Lors de l'application de correctifs, les correctifs seront généralement inclus dans le package source tar.gz ou placés dans le répertoire SOURCES. Les paramètres généraux sont :
%patch -p1 Utiliser le Patch défini précédemment -p1 ignore le premier niveau du patch
%Patch2. -p1 -b xxx.patch applique le correctif spécifié, -b fait référence à la génération d'un fichier de sauvegarde
Le supplément
%setup n'ajoute pas Quelle que soit l'option, seul le colis sera ouvert.
%setup -n newdir Décompressez le progiciel dans le répertoire newdir.
%setup -c génère un répertoire avant décompression.
%setup -b num Décompressez le numéro du fichier source.
%setup -T n'utilise pas l'opération de décompression par défaut.
%setup -T -b 0 Décompressez le 0ème fichier de code source.
%setup -c -n newdir spécifie le nom du répertoire newdir et génère le package rpm dans ce répertoire.
%patch est la méthode de patch la plus simple, spécifiant automatiquement le niveau de patch.
%patch 0 utilise le 0ème fichier de patch, équivalent à %patch ?p 0.
%patch -s n'affiche pas les informations sur les correctifs.
%patch -T supprime tous les fichiers de sortie générés lors de l'application des correctifs.
%configure Ce n'est pas un mot-clé, mais une macro-commande standard définie par rpm. Cela signifie exécuter la configuration configure du code source dans le répertoire /usr/src/asianux/BUILD/%{name}-%{version} En utilisant l'écriture standard, les paramètres définis dans /usr/lib/rpm/marcros seront. être référencé. Une autre façon d'écrire non standard est de faire référence à la personnalisation des paramètres dans le code source, par exemple :
引用CFLAGS="$RPM_OPT_FLAGS" CXXFLAGS="$RPM_OPT_FLAGS" ./configure --prefix=%{_prefix}
%build pour commencer à construire le package, dans /usr/src/asianux/BUILD/% {name} - Effectuer make work dans le répertoire %{version}
%install 开始把软件安装到虚拟的根目录中.在/usr/src/asianux/BUILD/%{name}-%{version}目录中进行make install的操作。这个很重要,因为如果这里的路径不对的话,则下面%file中寻找文件的时候就会失败。 常见内容有:
%makeinstall 这不是关键字,而是rpm定义的标准宏命令。也可以使用非标准写法:make DESTDIR=$RPM_BUILD_ROOT install或引用make prefix=$RPM_BUILD_ROOT install
需要说明的是,这里的%install主要就是为了后面的%file服务的。所以,还可以使用常规的系统命令:引用install -d $RPM_BUILD_ROOT/和cp -a * $RPM_BUILD_ROOT/
%clean 清理临时文件
%pre rpm安装前执行的脚本
%post rpm安装后执行的脚本
%preun rpm卸载前执行的脚本
%postun rpm卸载后执行的脚本
%files 定义那些文件或目录会放入rpm中
%defattr (-,root,root)** 指定包装文件的属性,分别是(mode,owner,group),-表示默认值,对文本文件是0644,可执行文件是0755
%changelog 变更日志
实例:
%define zabbix_user zabbix #自定义宏,名字为zabbix_user值为zabbix,%{zabbix_user}引用 Name: zabbix #软件包的名字,后面可用%{name}引用 Version: 3.0.3 #软件的实际版本号,可使用%{version}引用 Release: 1%{?dist} #发布序列号,标明第几次打包 Summary: zabbix_agentd #软件包内容概要 Group: zabbix #软件包分组 License: GPL #授权许可方式 URL: www.yang.com #软件的主页 Source0: zabbix-3.0.3.tar.gz #源代码包,可以有Source0,Source1等源 BuildRequires: gcc, gcc-c++ #制作rpm包时,所依赖的基本库 Requires: gcc, gcc-c++, chkconfig #安装rpm包时,所依赖的软件包 %description #定义rpm包的描述信息 Zabbix agentd 3.0.3 %pre #rpm包安装前执行的脚本 grep zabbix /etc/passwd > /dev/null if [ $? != 0 ] then useradd zabbix -M -s /sbin/nologin fi [ -d /etc/zabbix ]||rm -rf /etc/zabbix* %post #rpm包安装后执行的脚本 sed -i "/^ServerActive=/c\ServerActive=172.30.17.35" /etc/zabbix/etc/zabbix_agentd.conf sed -i "/^Server=/c\Server=172.30.17.35" /etc/zabbix/etc/zabbix_agentd.conf sed -i "/Timeout=3/c\Timeout=30" /etc/zabbix/etc/zabbix_agentd.conf sed -i "/HostMetadata=/c\HostMetadata=PostgreSQL" /etc/zabbix/etc/zabbix_agentd.conf sed -i "/^Hostname=/c\Hostname=PostgreSQL" /etc/zabbix/etc/zabbix_agentd.conf echo "UnsafeUserParameters=1" >>/etc/zabbix/etc/zabbix_agentd.conf echo "EnableRemoteCommands=1" >>/etc/zabbix/etc/zabbix_agentd.conf echo "Include=/etc/zabbix/etc/zabbix_agentd.conf.d/*.conf" >>/etc/zabbix/etc/zabbix_agentd.conf chkconfig zabbix_agentd on %preun #rpm卸载前执行的脚本 systemctl stop zabbix_agentd %postun #rpm卸载后执行的脚本 userdel zabbix rm -rf /etc/zabbix* %prep #这个宏开始 %setup -q #解压并cd到相关目录 %build #定义编译软件包时的操作 ./configure --prefix=/etc/%{name}-%{version} --enable-agent make -j16 %{?_smp_mflags} %install #定义安装软件包,使用默认值即可 test -L %{buildroot}/etc/%{name} && rm -f %{buildroot}/etc/%{name} install -d %{buildroot}/etc/profile.d install -d %{buildroot}/etc/init.d make install DESTDIR=%{buildroot} echo 'export PATH=/etc/zabbix/bin:/etc/zabbix/sbin:$PATH' > %{buildroot}/etc/profile.d/%{name}.sh ln -sf /etc/%{name}-%{version} %{buildroot}/etc/%{name} cp %{_buildrootdir}/postgresql.conf %{buildroot}/etc/%{name}-%{version}/etc/zabbix_agentd.conf.d/postgresql.conf cp %{_buildrootdir}/tcp_connections.sh %{buildroot}/etc/%{name}-%{version}/etc/zabbix_agentd.conf.d/tcp_connections.sh cp %{_buildrootdir}/iostat-collect.sh %{buildroot}/etc/%{name}-%{version}/etc/zabbix_agentd.conf.d/iostat-collect.sh cp %{_buildrootdir}/iostat-parse.sh %{buildroot}/etc/%{name}-%{version}/etc/zabbix_agentd.conf.d/iostat-parse.sh cp %{_buildrootdir}/iostat-zabbix.conf %{buildroot}/etc/%{name}-%{version}/etc/zabbix_agentd.conf.d/iostat-zabbix.conf cp %{_buildrootdir}/zabbix_agentd %{buildroot}/etc/init.d/zabbix_agentd %files #定义rpm包安装时创建的相关目录及文件。在该选项中%defattr (-,root,root)一定要注意。它是指定安装文件的属性,分别是(mode,owner,group),-表示默认值,对文本文件是0644,可执行文件是0755。 /etc/%{name} /etc/%{name}-%{version}/* /etc/init.d/zabbix_agentd /etc/profile.d/%{name}.sh %changelog #主要用于软件的变更日志。该选项可有可无 %clean rm -rf %{buildroot} #清理临时文件
RPM包制作拓展
如果想为zabbix增加启动控制脚本或一些其他的配置文件,可以将其放在SOURCE下,然后复制过去
将启动脚本放在SOURCE目录
[root@yang ~/rpmbuild/SOURCES]# ll total 15116 -rwxr-xr-x 1 root root 362 Aug 1 12:03 hostmonitor.conf -rwxr-xr-x 1 root root 505 Aug 1 12:03 iostat-collect.sh -rwxr-xr-x 1 root root 953 Aug 1 12:03 iostat-parse.sh -rw-r--r-- 1 root root 772 Aug 1 12:03 iostat-zabbix.conf -rwxr-xr-x 1 root root 813 Aug 1 12:03 nginx_monitor.sh -rw-r--r-- 1 root root 14868 Aug 1 12:03 postgresql.conf -rw-r--r-- 1 root root 77 Aug 1 12:03 process.discovery -rw-r--r-- 1 root root 552 Aug 1 12:03 redis_check.conf -rw-r--r-- 1 root root 356 Aug 1 12:03 redis_cluster_check.py -rw-r--r-- 1 root root 363 Aug 1 12:03 redis_multiport_check.py -rwxr-xr-x 1 root root 783 Aug 1 12:03 tcp_connections.sh -rw-r--r-- 1 root root 852 Aug 1 12:03 userparameter_nginx.conf -rw-r--r-- 1 root root 172 Aug 1 12:03 userparameter_process.conf -rw-r--r-- 1 root root 15407273 Jul 20 10:53 zabbix-3.0.3.tar.gz -rwxr-xr-x 1 root root 2182 Aug 1 12:03 zabbix_agentd
编辑 SPEC文件
Source0下增加如下:
Source0: zabbix-3.0.3.tar.gz Source1: zabbix_agentd Source2: nginx_monitor.sh Source3: userparameter_nginx.conf Source4: hostmonitor.conf Source5: process.discovery Source6: userparameter_process.conf Source7: redis_check.conf Source8: redis_cluster_check.py Source9: redis_multiport_check.py Source10: tcp_connections.sh Source11: iostat-collect.sh Source12: iostat-parse.sh Source13: iostat-zabbix.conf
安装区域增加如下行:
make install DESTDIR=%{buildroot} install -p -D -m 0755 %{SOURCE1} %{buildroot}/etc/init.d/zabbix_agentd install -p -D %{SOURCE2} %{buildroot}/etc/%{name}-%{version}/etc/zabbix_agentd.conf.d/nginx_monitor.sh install -p -D %{SOURCE3} %{buildroot}/etc/%{name}-%{version}/etc/zabbix_agentd.conf.d/userparameter_nginx.conf install -p -D %{SOURCE4} %{buildroot}/etc/nginx/conf.d/hostmonitor.conf install -p -D %{SOURCE5} %{buildroot}/etc/%{name}-%{version}/etc/zabbix_agentd.conf.d/process.discovery install -p -D %{SOURCE6} %{buildroot}/etc/%{name}-%{version}/etc/zabbix_agentd.conf.d/userparameter_process.conf install -p -D %{SOURCE7} %{buildroot}/etc/%{name}-%{version}/etc/zabbix_agentd.conf.d/redis_check.conf install -p -D %{SOURCE8} %{buildroot}/etc/%{name}-%{version}/etc/zabbix_agentd.conf.d/redis_cluster_check.py install -p -D %{SOURCE9} %{buildroot}/etc/%{name}-%{version}/etc/zabbix_agentd.conf.d/redis_multiport_check.py install -p -D %{SOURCE10} %{buildroot}/etc/%{name}-%{version}/etc/zabbix_agentd.conf.d/tcp_connections.sh install -p -D %{SOURCE11} %{buildroot}/etc/%{name}-%{version}/etc/zabbix_agentd.conf.d/iostat-collect.sh install -p -D %{SOURCE12} %{buildroot}/etc/%{name}-%{version}/etc/zabbix_agentd.conf.d/iostat-parse.sh install -p -D %{SOURCE13} %{buildroot}/etc/%{name}-%{version}/etc/zabbix_agentd.conf.d/iostat-zabbix.conf
%file区域增加如下行:
%files %defattr (-,root,root,0755) /etc/%{name} /etc/%{name}-%{version}/* /etc/profile.d/%{name}.sh /etc/nginx/conf.d/hostmonitor.conf %attr(0755,root,root) /etc/rc.d/init.d/zabbix_agentd
以下为完整的SPEC文件:
Name: zabbix Version: 3.0.3 Release: 1%{?dist} Summary: zabbix_agentd Group: zabbix License: GPL URL: www.yang.com Source0: zabbix-3.0.3.tar.gz Source1: zabbix_agentd Source2: nginx_monitor.sh Source3: userparameter_nginx.conf Source4: hostmonitor.conf Source5: process.discovery Source6: userparameter_process.conf Source7: redis_check.conf Source8: redis_cluster_check.py Source9: redis_multiport_check.py Source10: tcp_connections.sh Source11: iostat-collect.sh Source12: iostat-parse.sh Source13: iostat-zabbix.conf BuildRequires: gcc, gcc-c++ Requires: gcc, gcc-c++, chkconfig %description Zabbix agentd 3.0.3 %pre grep zabbix /etc/passwd > /dev/null if [ $? != 0 ] then useradd zabbix -M -s /sbin/nologin fi [ -d /etc/zabbix ]||rm -rf /etc/zabbix [ -d /etc/zabbix ]||rm -rf /etc/zabbix-3.0.3 %post sed -i "/^ServerActive=/c\ServerActive=172.30.17." /etc/zabbix/etc/zabbix_agentd.conf sed -i "/^Server=/c\Server=172.30.17." /etc/zabbix/etc/zabbix_agentd.conf sed -i "/Timeout=3/c\Timeout=30" /etc/zabbix/etc/zabbix_agentd.conf sed -i "/HostMetadata=/c\HostMetadata=OPS-TMP" /etc/zabbix/etc/zabbix_agentd.conf sed -i "/^Hostname=/c\Hostname=OPS-TMP" /etc/zabbix/etc/zabbix_agentd.conf echo "UnsafeUserParameters=1" >>/etc/zabbix/etc/zabbix_agentd.conf echo "EnableRemoteCommands=1" >>/etc/zabbix/etc/zabbix_agentd.conf echo "Include=/etc/zabbix/etc/zabbix_agentd.conf.d/*.conf" >>/etc/zabbix/etc/zabbix_agentd.conf chkconfig zabbix_agentd on %preun systemctl stop zabbix_agentd %postun userdel zabbix rm -rf /etc/zabbix* %prep %setup -q %build ./configure --prefix=/etc/%{name}-%{version} --enable-agent make -j16 %{?_smp_mflags} %install test -L %{buildroot}/etc/%{name} && rm -f %{buildroot}/etc/%{name} install -d %{buildroot}/etc/profile.d make install DESTDIR=%{buildroot} install -p -D -m 0755 %{SOURCE1} %{buildroot}/etc/init.d/zabbix_agentd install -p -D %{SOURCE2} %{buildroot}/etc/%{name}-%{version}/etc/zabbix_agentd.conf.d/nginx_monitor.sh install -p -D %{SOURCE3} %{buildroot}/etc/%{name}-%{version}/etc/zabbix_agentd.conf.d/userparameter_nginx.conf install -p -D %{SOURCE4} %{buildroot}/etc/nginx/conf.d/hostmonitor.conf install -p -D %{SOURCE5} %{buildroot}/etc/%{name}-%{version}/etc/zabbix_agentd.conf.d/process.discovery install -p -D %{SOURCE6} %{buildroot}/etc/%{name}-%{version}/etc/zabbix_agentd.conf.d/userparameter_process.conf install -p -D %{SOURCE7} %{buildroot}/etc/%{name}-%{version}/etc/zabbix_agentd.conf.d/redis_check.conf install -p -D %{SOURCE8} %{buildroot}/etc/%{name}-%{version}/etc/zabbix_agentd.conf.d/redis_cluster_check.py install -p -D %{SOURCE9} %{buildroot}/etc/%{name}-%{version}/etc/zabbix_agentd.conf.d/redis_multiport_check.py install -p -D %{SOURCE10} %{buildroot}/etc/%{name}-%{version}/etc/zabbix_agentd.conf.d/tcp_connections.sh install -p -D %{SOURCE11} %{buildroot}/etc/%{name}-%{version}/etc/zabbix_agentd.conf.d/iostat-collect.sh install -p -D %{SOURCE12} %{buildroot}/etc/%{name}-%{version}/etc/zabbix_agentd.conf.d/iostat-parse.sh install -p -D %{SOURCE13} %{buildroot}/etc/%{name}-%{version}/etc/zabbix_agentd.conf.d/iostat-zabbix.conf echo 'export PATH=/etc/zabbix/bin:/etc/zabbix/sbin:$PATH' > %{buildroot}/etc/profile.d/%{name}.sh ln -sf /etc/%{name}-%{version} %{buildroot}/etc/%{name} %files %defattr (-,root,root,0755) /etc/%{name} /etc/%{name}-%{version}/* /etc/profile.d/%{name}.sh /etc/nginx/conf.d/hostmonitor.conf %attr(0755,root,root) /etc/rc.d/init.d/zabbix_agentd %changelog %clean rm -rf %{buildroot}
相关推荐:
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!