この記事では、スクリプトをRPMファイルにパッケージ化して、Linuxシステムに簡単にインストール、更新、および削除する方法を説明します。詳細に入る前に、RPMパッケージとは何か、およびインストール、クエリ、削除、そして最も重要なこととして、自分で作成する方法について説明します。
この記事の内容:
- RPMパッケージとは
- RPMパッケージを作成する方法。
- RPMパッケージをインストール、クエリ、および削除する方法。
RPMパッケージとは何ですか?
RPMはRedHat Package Managerの略です 。これはRedHatによって開発され、主にRed HatベースのLinuxオペレーティングシステム(Fedora、CentOS、RHELなど)で使用されます。
RPMパッケージは.rpm
を使用します 拡張子であり、さまざまなファイルのバンドル(コレクション)です。次のものを含めることができます:
- 実行可能ファイルとも呼ばれるバイナリファイル(
nmap
、stat
、xattr
、ssh
、sshd
、など)。 - 構成ファイル(
sshd.conf
、updatedb.conf
、logrotate.conf
など)。 - ドキュメントファイル(
README
、TODO
、AUTHOR
など)。
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の技術概要。 ]