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
.specfile 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.gzatau.tgzfile. - SPEC direktori berisi
.specfile..specfile mendefinisikan bagaimana sebuah paket dibangun. Lebih lanjut tentang itu nanti. - SRPMS direktori menyimpan
.src.rpmpaket. Paket RPM Sumber bukan milik arsitektur atau distribusi..rpmyang sebenarnya pembuatan paket didasarkan pada.src.rpmpaket.
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 <valentin.bajrami@slimmer.ai> - 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/sbinsecara default)%{_sysconfdir}direktori konfigurasi (/etcsecara 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 <valentin.bajrami@slimmer.ai> - 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. ]