GNU/Linux >> Linux の 問題 >  >> Linux

LinuxRPMパッケージを作成する方法

この記事では、スクリプトをRPMファイルにパッケージ化して、Linuxシステムに簡単にインストール、更新、および削除する方法を説明します。詳細に入る前に、RPMパッケージとは何か、およびインストール、クエリ、削除、そして最も重要なこととして、自分で作成する方法について説明します。

この記事の内容:

  • RPMパッケージとは
  • RPMパッケージを作成する方法。
  • RPMパッケージをインストール、クエリ、および削除する方法。

RPMパッケージとは何ですか?

RPMはRedHat Package Managerの略です 。これはRedHatによって開発され、主にRed HatベースのLinuxオペレーティングシステム(Fedora、CentOS、RHELなど)で使用されます。

RPMパッケージは.rpmを使用します 拡張子であり、さまざまなファイルのバンドル(コレクション)です。次のものを含めることができます:

  • 実行可能ファイルとも呼ばれるバイナリファイル(nmapstatxattrsshsshd 、など)。
  • 構成ファイル(sshd.confupdatedb.conflogrotate.conf など)。
  • ドキュメントファイル(READMETODOAUTHOR など)。

RPMパッケージの名前は次の形式に従います:

<name>-<version>-<release>.<arch>.rpm

例:

bdsync-0.11.1-1.x86_64.rpm

一部のパッケージには、次のように、それらが構築されたディストリビューションの短縮バージョンも含まれています。

bdsync-0.11.1-1.el8.x86_64.rpm

[お楽しみいただけるかもしれません:YUMとRPMを使用したLinuxパッケージ管理]

RPMパッケージの作成方法

RPMパッケージをビルドするには、次のコンポーネントが必要です。

  • RHELやFedoraなどのRPMベースのディストリビューションを実行しているワークステーションまたは仮想マシン。
  • パッケージをビルドするためのソフトウェア。
  • パッケージ化するソースコード。
  • RPMを構築するためのSPECファイル。

必要なソフトウェアのインストール

RPMパッケージをビルドするには、次のパッケージをインストールする必要があります。

$ sudo dnf install -y rpmdevtools rpmlint

rpmdevtoolsをインストールした後 、RPMパッケージをビルドするために必要なファイルツリーを作成します:

$ rpmdev-setuptree

RPMパッケージは通常の(rootではない)ユーザーとしてビルドするため、ビルド環境はホームディレクトリに配置されます。次のディレクトリ構造が含まれています:

rpmbuild/
├── BUILD
├── RPMS
├── SOURCES
├── SPECS
└── SRPMS
  • ビルド ディレクトリは、RPMパッケージのビルドプロセス中に使用されます。これは、一時ファイルが保存されたり、移動されたりする場所です。
  • RPMS ディレクトリには、さまざまなアーキテクチャ用に構築されたRPMパッケージと、.specで指定されている場合はnoarchが保持されます。 ファイルまたはビルド中。
  • ソース ディレクトリは、その名前が示すように、ソースを保持します。これは、単純なスクリプト、コンパイルが必要な複雑なCプロジェクト、プリコンパイルされたプログラムなどです。通常、ソースは.tar.gzとして圧縮されます。 または.tgz ファイル。
  • SPEC ディレクトリには.specが含まれています ファイル。 .spec fileは、パッケージの構築方法を定義します。これについては後で詳しく説明します。
  • SRPMS ディレクトリは.src.rpmを保持します パッケージ。ソースRPMパッケージは、アーキテクチャまたはディストリビューションに属していません。実際の.rpm パッケージビルドは.src.rpmに基づいています パッケージ。

.src.rpm パッケージは、他のすべてのRPMベースのディストリビューションおよびアーキテクチャでビルドおよび再ビルドできるため、非常に柔軟性があります。

これで、各ディレクトリの内容に慣れたので、配布する簡単なスクリプトを作成します。

$ cat << EOF >> hello.sh
#!/bin/sh
echo "Hello world"
EOF

これにより、hello.shというシェルスクリプトが作成されます。 、端末に「Helloworld」を出力します。シンプルですが、パッケージのデモンストレーションには十分です。

指定されたディレクトリにスクリプトを配置します

スクリプトのパッケージをビルドするには、RPMビルドシステムがスクリプトを想定しているディレクトリにスクリプトを配置する必要があります。ほとんどのプロジェクトと同様にセマンティックバージョニングを使用してスクリプトのディレクトリを作成し、hello.sh それに:

$ mkdir hello-0.0.1
$ mv hello.sh hello-0.0.1

ほとんどのソースコードはアーカイブとして配布されているため、tarコマンドを使用してアーカイブファイルを作成します。

$ tar --create --file hello-0.0.1.tar.gz hello-0.0.1

次に、作成したtarballをSOURCESに移動します ディレクトリ:

$ mv hello-0.0.1.tar.gz SOURCES

.specファイルを作成する

RPMパッケージは、.specによって定義されます。 ファイル。 .specの構文 ファイルは厳密ですが、rpmdev ボイラープレートファイルを生成できます:

$ rpmdev-newspec hello

これにより、hello.specというファイルが生成されます。 、SPECSに移動する必要があります ディレクトリ。 tree ~/rpmbuildを実行します ディレクトリ構造がどのように見えるかを確認するには:

/home/tux/rpmbuild/
├── BUILD
├── BUILDROOT
├── RPMS
├── SOURCES
│   └── hello-0.0.1.tar.gz
├── SPECS
│   └── hello.spec
└── SRPMS

生成されたhello.spec ファイルは良い出発点を提供しますが、あなたが構築しているものについての特定の情報はありません。生成された.spec fileは、ソフトウェアをコンパイルしてビルドすることを前提としています。

Bashスクリプトをパッケージ化しているので、いくつかの簡略化を行うことができます。たとえば、ビルドはありません コンパイルするコードがないため、処理します。 BuildArch:noarchを追加しました このパッケージは、32ビット、64ビット、Arm、およびBashを実行するその他のCPUアーキテクチャに有効であるためです。

必須:bashも追加しました パッケージがBashがインストールされていることを確認します。もちろん、この単純な「hello world」スクリプトはどのシェルでも実行できますが、すべてのスクリプトに当てはまるわけではないため、これは依存関係を示す良い方法です。

Name:           hello
Version:        0.0.1
Release:        1%{?dist}
Summary:        A simple hello world script
BuildArch:      noarch

License:        GPL
Source0:        %{name}-%{version}.tar.gz

Requires:       bash

%description
A demo RPM build

%prep
%setup -q

%install
rm -rf $RPM_BUILD_ROOT
mkdir -p $RPM_BUILD_ROOT/%{_bindir}
cp %{name}.sh $RPM_BUILD_ROOT/%{_bindir}

%clean
rm -rf $RPM_BUILD_ROOT

%files
%{_bindir}/%{name}.sh

%changelog
* Sun Nov  18 2020 Valentin Bajrami <[email protected]> - 0.0.1
- First version being packaged

お分かりのように、.specにはたくさんのショートカットがあります ファイル。それらはマクロと呼ばれ、Fedoraのパッケージドキュメントで利用できるものの優れたリストがあります。 .specでマクロを使用することが重要です ファイル。これらは、すべてのRPMシステム間で一貫性を確保するのに役立ち、ファイル名とバージョン番号の間違いを回避するのに役立ち、.specの更新を容易にします。 スクリプトの新しいバージョンをリリースするときにファイルします。

たとえば、%filesの下にインストールするファイルを正確に指定する必要があります セクション。ここに次の行を明示的に入れました:

%files
%{_bindir}/%{name}.sh

これは、スクリプトを%{_ bindir}に移動させたいために機能します (これは、/usr/binに変換されるマクロです。 デフォルトですが、ユーザーが/usr/local/binなどの別の場所にインストールする場合は構成可能です。 )。次のコマンドを実行して、マクロ値を確認できます。

$ rpm --eval '%{_bindir}'
/usr/bin

その他の便利なマクロ:

  • %{name} パッケージの名前(名前:で定義) フィールド)
  • %{version} パッケージのバージョン(バージョン:で定義) フィールド)
  • %{_datadir} 共有データ(/usr/sbin デフォルト)
  • %{_sysconfdir} 構成ディレクトリ(/etc デフォルト)

エラー時の.specファイルの確認(rpmlint)

rpmlint コマンドは.specでエラーを見つけることができます ファイル:

$ rpmlint ~/rpmbuild/SPECS/hello.spec
SPECS/hello.spec: W: no-%build-section
SPECS/hello.spec: W: invalid-url Source0: hello-0.0.1.tar.gz
0 packages and 1 specfiles checked; 0 errors, 2 warnings.

2つのエラーが報告されていますが、どちらも許容範囲です。ビルドするコードがないため、%buildは必要ありません。 セクションであり、ソースアーカイブはローカルファイルであり、ネットワークURLはありません。

すべてが良さそうです。

パッケージのビルド(rpmbuild)

RPMパッケージをビルドするには、rpmbuildを使用します 指図。このチュートリアルの前半で、.src.rpmの違いについて説明しました。 (ソースRPMパッケージ)および.rpm パッケージ。

.srcを作成するには rpmパッケージ:

$ rpmbuild -bs ~/rpmbuild/SPECS/hello.spec

フラグ-bs 次の意味があります:

  • -b:ビルド
  • -s:ソース

バイナリ.rpmパッケージを作成するには:

$ rpmbuild -bb ~/rpmbuild/SPECS/rm-ssh-offendingkey.spec

フラグ-bb 次の意味があります:

  • -b:ビルド
  • -b:バイナリ

-baを使用する 両方を構築します。

ビルドプロセスが完了すると、次のディレクトリ構造になります。

$ tree ~/rpmbuild/
/home/tux/rpmbuild/
├── BUILD
│   └── hello-0.0.1
│       ├── hello.sh
├── BUILDROOT
├── RPMS
│   └── noarch
│       └── hello-0.0.1-1.el8.noarch.rpm
├── SOURCES
│   └── hello-0.0.1.tar.gz
├── SPECS
│   └── hello.spec
└── SRPMS

RPMパッケージのインストール

パッケージのビルドが成功したら、dnfを使用してRPMパッケージをインストールできます。 コマンド:

$ sudo dnf install ~/rpmbuild/RPMS/noarch/hello-0.0.1-1.el8.noarch.rpm

代わりにrpmでインストールすることもできます 直接コマンド:

$ sudo rpm -ivh ~/rpmbuild/RPMS/noarch/hello-0.0.1-1.el8.noarch.rpm

パッケージがインストールされていることを確認します

パッケージが正しくインストールされていることを確認するには、次のコマンドを実行します。

$ rpm -qi hello
Name        : hello
Version     : 0.0.1
Release     : 1
Architecture: noarch
Install Date: Mon 09 Nov 2020 01:29:51 AM CET
Group       : Unspecified
Size        : 294
License     : GPL
Signature   : (none)
Source RPM  : hello-0.0.1-1.el8.src.rpm
Build Date  : Mon 09 Nov 2020 01:08:14 AM CET
Build Host  : slimmerAI
Summary     : A simple hello world script
Description : A demo RPM build

%changelog パッケージのエントリも表示できます:

$ rpm -q hello --changelog
* Sun Nov 08 2020 Valentin Bajrami <[email protected]> - 0.1
- First version being packaged

RPMパッケージの内容を確認する

RPMパッケージに含まれているファイルを簡単に確認できます:

$ rpm -ql hello
/usr/bin/hello.sh

RPMパッケージの削除

システムからのパッケージの削除は、インストールと同じくらい簡単です。 dnfを使用できます コマンド:

$ sudo dnf remove hello

またはrpm 直接コマンド:

$ sudo rpm --verbose --erase hello

最終的な考え

このドキュメントでは、RPMパッケージをビルド、インストール、およびシステムから削除する方法など、パッケージングの非常に基本的なことについて説明しました。 .spec より高度なソフトウェアを構築すると、ファイルは非常に複雑になる可能性がありますが、src.fedoraproject.orgなどの公開ソフトウェアリポジトリの実際の例を読んで詳細を確認できます。

[無料のオンラインコース:Red HatEnterpriseLinuxの技術概要。 ]


Linux
  1. rpmパッケージをビルドする方法

  2. Linuxコマンドのスクリプトを作成する方法

  3. Linuxでスワップファイルを作成する方法

  1. Linux用のPythonアプリケーションをパッケージ化する方法

  2. LinuxでRPMまたはDEBパッケージからインストールされたファイルを一覧表示する方法

  3. Linuxでスワップを作成する方法

  1. Linuxでpkgsrcを使用する方法

  2. LinuxでSystemdサービスを作成する方法

  3. Linux で rpm パッケージの整合性をチェックする方法