Artikel ini menunjukkan kepada Anda cara mengemas skrip ke dalam file RPM untuk kemudahan instalasi, pembaruan, dan penghapusan dari sistem Linux Anda. Sebelum saya masuk ke detailnya, saya akan menjelaskan apa itu paket RPM, dan bagaimana Anda dapat menginstal, menanyakan, menghapus, dan, yang paling penting, membuatnya sendiri.
Artikel ini mencakup:
- Apa itu paket RPM.
- Cara membuat paket RPM.
- Cara menginstal, membuat kueri, dan menghapus paket RPM.
Apa itu paket RPM?
RPM adalah singkatan dari Pengelola Paket Topi Merah . Ini dikembangkan oleh Red Hat dan terutama digunakan pada sistem operasi Linux berbasis Red Hat (Fedora, CentOS, RHEL, dll.).
Paket RPM menggunakan .rpm
ekstensi dan merupakan bundel (kumpulan) file yang berbeda. Ini dapat berisi yang berikut:
- File biner, juga dikenal sebagai executable (
nmap
,stat
,xattr
,ssh
,sshd
, dan seterusnya). - File konfigurasi (
sshd.conf
,updatedb.conf
,logrotate.conf
, dll.). - File dokumentasi (
README
,TODO
,AUTHOR
, dll.).
Nama paket RPM mengikuti format ini:
<name>-<version>-<release>.<arch>.rpm
Contoh:
bdsync-0.11.1-1.x86_64.rpm
Beberapa paket juga menyertakan versi singkatan dari distribusi yang dibuat, seperti:
bdsync-0.11.1-1.el8.x86_64.rpm
[ Anda juga dapat menikmati: Pengelolaan paket Linux dengan YUM dan RPM ]
Cara membuat paket RPM
Anda memerlukan komponen berikut untuk membuat paket RPM:
- Sebuah workstation atau mesin virtual yang menjalankan distribusi berbasis RPM, seperti RHEL atau Fedora.
- Perangkat lunak untuk membuat paket.
- Kode sumber untuk dikemas.
- File SPEC untuk membuat RPM.
Menginstal perangkat lunak yang diperlukan
Paket-paket berikut perlu diinstal untuk membangun paket RPM:
$ sudo dnf install -y rpmdevtools rpmlint
Setelah menginstal rpmdevtools
, buat pohon file yang Anda butuhkan untuk membuat paket RPM:
$ rpmdev-setuptree
Anda membangun paket RPM sebagai pengguna normal (bukan root), jadi lingkungan pembangunan Anda ditempatkan ke direktori home Anda. Ini berisi struktur direktori ini:
rpmbuild/
├── BUILD
├── RPMS
├── SOURCES
├── SPECS
└── SRPMS
- BUILD direktori digunakan selama proses pembuatan paket RPM. Di sinilah file-file sementara disimpan, dipindahkan, dll.
- RPMS direktori menampung paket RPM yang dibuat untuk arsitektur dan noarch yang berbeda jika ditentukan dalam
.spec
file atau selama pembuatan. - SUMBER direktori, seperti namanya, menyimpan sumber. Ini bisa berupa skrip sederhana, proyek C kompleks yang perlu dikompilasi, program pra-kompilasi, dll. Biasanya, sumber dikompresi sebagai
.tar.gz
atau.tgz
file. - SPEC direktori berisi
.spec
file..spec
file mendefinisikan bagaimana sebuah paket dibangun. Lebih lanjut tentang itu nanti. - SRPMS direktori menyimpan
.src.rpm
paket. Paket RPM Sumber bukan milik arsitektur atau distribusi..rpm
yang sebenarnya pembuatan paket didasarkan pada.src.rpm
paket.
Sebuah .src.rpm
paket sangat fleksibel, karena dapat dibangun dan dibangun kembali pada setiap distribusi dan arsitektur berbasis RPM lainnya.
Sekarang Anda akrab dengan isi setiap direktori, jadi sekarang buat skrip sederhana untuk didistribusikan:
$ cat << EOF >> hello.sh
#!/bin/sh
echo "Hello world"
EOF
Ini membuat skrip shell bernama hello.sh
, yang mencetak "Hello world" ke terminal. Sederhana, tapi cukup untuk mendemonstrasikan pengemasan.
Tempatkan skrip di direktori yang ditentukan
Untuk membuat paket untuk skrip Anda, Anda harus meletakkan skrip Anda di direktori yang diharapkan oleh sistem pembangunan RPM. Buat direktori untuk skrip tersebut, menggunakan versi semantik seperti yang dilakukan sebagian besar proyek, lalu pindahkan hello.sh
ke dalamnya:
$ mkdir hello-0.0.1
$ mv hello.sh hello-0.0.1
Sebagian besar kode sumber didistribusikan sebagai arsip, jadi gunakan perintah tar untuk membuat file arsip:
$ tar --create --file hello-0.0.1.tar.gz hello-0.0.1
Kemudian pindahkan tarball yang baru saja Anda buat ke dalam SOURCES
direktori:
$ mv hello-0.0.1.tar.gz SOURCES
Buat file .spec
Paket RPM didefinisikan oleh .spec
mengajukan. Sintaks dari .spec
file ketat, tetapi rpmdev
dapat membuat file boilerplate untuk Anda:
$ rpmdev-newspec hello
Ini menghasilkan file bernama hello.spec
, yang harus Anda pindahkan ke SPECS
direktori. Jalankan tree ~/rpmbuild
untuk melihat seperti apa struktur direktori:
/home/tux/rpmbuild/
├── BUILD
├── BUILDROOT
├── RPMS
├── SOURCES
│ └── hello-0.0.1.tar.gz
├── SPECS
│ └── hello.spec
└── SRPMS
hello.spec
yang dihasilkan file memberikan titik awal yang baik, tetapi tidak memiliki informasi spesifik tentang apa yang Anda bangun. .spec
. yang dihasilkan file mengasumsikan bahwa saya akan mengkompilasi dan membangun perangkat lunak.
Anda sedang mengemas skrip Bash, jadi ada beberapa penyederhanaan yang dapat Anda lakukan. Misalnya, tidak ada Build proses karena tidak ada kode untuk dikompilasi. Saya telah menambahkan BuildArch:noarch karena paket ini valid untuk 32-bit, 64-bit, Arm, dan arsitektur CPU lainnya yang menjalankan Bash.
Saya juga telah menambahkan Persyaratan:bash sehingga paket memastikan bahwa Bash diinstal. Skrip "hello world" sederhana ini tentu saja berjalan pada shell apa pun, tetapi itu tidak berlaku untuk semua skrip, jadi ini adalah cara yang baik untuk mendemonstrasikan dependensi.
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
Seperti yang Anda tahu, ada banyak pintasan di .spec
file. Mereka disebut makro, dan ada daftar bagus tentang apa yang tersedia di dokumentasi pengemasan Fedora. Penting untuk menggunakan makro di .spec
. Anda file. Mereka membantu memastikan konsistensi di semua sistem RPM, membantu Anda menghindari kesalahan dalam nama file dan penomoran versi, dan mempermudah pembaruan .spec
file saat Anda merilis versi baru skrip Anda.
Misalnya, Anda harus menentukan dengan tepat file mana yang diinstal di bawah %files bagian. Di sini saya secara eksplisit meletakkan baris berikut:
%files
%{_bindir}/%{name}.sh
Ini berfungsi karena saya ingin skrip masuk ke %{_bindir} (yang merupakan makro yang diterjemahkan menjadi /usr/bin
secara default, tetapi dapat dikonfigurasi ketika pengguna ingin menginstal ke lokasi yang berbeda, seperti /usr/local/bin
). Anda dapat memverifikasi nilai makro dengan menjalankan:
$ rpm --eval '%{_bindir}'
/usr/bin
Makro berguna lainnya:
%{name}
nama paket (sebagaimana didefinisikan dalam Nama: lapangan)%{version}
versi paket (sebagaimana didefinisikan dalam Versi: lapangan)%{_datadir}
data bersama (/usr/sbin
secara default)%{_sysconfdir}
direktori konfigurasi (/etc
secara default)
Memeriksa file .spec yang error (rpmlint)
rpmlint
perintah dapat menemukan kesalahan di .spec
file:
$ 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.
Ada 2 kesalahan yang dilaporkan, tetapi keduanya dapat diterima. Tidak ada kode untuk dibuat, jadi tidak perlu %build bagian, dan arsip sumber adalah file lokal dan tidak memiliki URL jaringan.
Semuanya terlihat bagus.
Membangun paket (rpmbuild)
Untuk membangun paket RPM, gunakan rpmbuild
memerintah. Sebelumnya dalam tutorial ini, saya menyebutkan perbedaan antara .src.rpm
(Paket RPM Sumber) dan .rpm
paket.
Untuk membuat .src
paket rpm:
$ rpmbuild -bs ~/rpmbuild/SPECS/hello.spec
Bendera -bs
memiliki arti sebagai berikut:
- -b:membangun
- -s:sumber
Untuk membuat paket .rpm biner:
$ rpmbuild -bb ~/rpmbuild/SPECS/rm-ssh-offendingkey.spec
Bendera -bb
memiliki arti sebagai berikut:
- -b:membangun
- -b:biner
Gunakan -ba
untuk membangun keduanya.
Setelah proses build selesai, Anda memiliki struktur direktori berikut:
$ 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
Menginstal paket RPM
Setelah pembuatan paket berhasil, Anda dapat menginstal paket RPM menggunakan dnf
perintah:
$ sudo dnf install ~/rpmbuild/RPMS/noarch/hello-0.0.1-1.el8.noarch.rpm
Itu dapat diinstal secara bergantian dengan rpm
perintah langsung:
$ sudo rpm -ivh ~/rpmbuild/RPMS/noarch/hello-0.0.1-1.el8.noarch.rpm
Verifikasi paket telah diinstal
Untuk memverifikasi bahwa paket telah diinstal dengan benar, jalankan perintah berikut:
$ 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
%log perubahan entri paket dapat dilihat juga:
$ rpm -q hello --changelog
* Sun Nov 08 2020 Valentin Bajrami <[email protected]> - 0.1
- First version being packaged
Lihat apa yang ada di paket RPM
Sangat mudah untuk melihat file mana yang berisi paket RPM:
$ rpm -ql hello
/usr/bin/hello.sh
Menghapus paket RPM
Menghapus paket dari sistem semudah menginstalnya. Anda dapat menggunakan dnf
perintah:
$ sudo dnf remove hello
Atau rpm
perintah langsung:
$ sudo rpm --verbose --erase hello
Pemikiran terakhir
Dalam dokumen ini, saya membahas dasar-dasar pengemasan, termasuk cara membuat, menginstal, dan menghapus paket RPM dari sistem Anda. .spec
file bisa menjadi sangat rumit saat Anda membangun perangkat lunak yang lebih canggih, tetapi Anda dapat membaca contoh nyata di repositori perangkat lunak publik, seperti src.fedoraproject.org, untuk mempelajari lebih lanjut.
[ Kursus online gratis:Ikhtisar teknis Red Hat Enterprise Linux. ]