GNU/Linux >> Belajar Linux >  >> Linux

Cara membuat paket rpm

Saya telah menggunakan manajer paket berbasis rpm untuk menginstal perangkat lunak di Red Hat dan Fedora Linux sejak saya mulai menggunakan Linux lebih dari 20 tahun yang lalu. Saya telah menggunakan rpm program itu sendiri, yum , dan DNF , yang merupakan turunan dekat dari yum, untuk menginstal dan memperbarui paket di host Linux saya. Alat yum dan DNF adalah pembungkus di sekitar utilitas rpm yang menyediakan fungsionalitas tambahan, seperti kemampuan untuk menemukan dan menginstal dependensi paket.

Lebih banyak sumber daya Linux

  • Lembar contekan perintah Linux
  • Lembar contekan perintah Linux tingkat lanjut
  • Kursus online gratis:Ikhtisar Teknis RHEL
  • Lembar contekan jaringan Linux
  • Lembar contekan SELinux
  • Lembar contekan perintah umum Linux
  • Apa itu container Linux?
  • Artikel Linux terbaru kami

Selama bertahun-tahun saya telah membuat sejumlah skrip Bash, beberapa di antaranya memiliki file konfigurasi terpisah, yang ingin saya instal di sebagian besar komputer dan mesin virtual baru saya. Itu mencapai titik yang membutuhkan banyak waktu untuk menginstal semua paket ini, jadi saya memutuskan untuk mengotomatiskan proses itu dengan membuat paket rpm yang dapat saya salin ke host target dan menginstal semua file ini di lokasi yang tepat. Meskipun rpm alat ini sebelumnya digunakan untuk membangun paket rpm, fungsi itu telah dihapus dan alat baru, rpmbuild, diciptakan untuk membangun rpm baru.

Ketika saya memulai proyek ini, saya menemukan sangat sedikit informasi tentang membuat paket rpm, tetapi saya berhasil menemukan sebuah buku, RPM Maksimum , yang membantu saya mengetahuinya. Buku itu sekarang agak ketinggalan zaman, seperti sebagian besar informasi yang saya temukan. Itu juga tidak dicetak, dan salinan bekas berharga ratusan dolar. Versi online dari RPM Maksimum tersedia tanpa biaya dan selalu diperbarui. Situs web RPM juga memiliki tautan ke situs web lain yang memiliki banyak dokumentasi tentang rpm. Informasi lain yang ada cenderung singkat dan tampaknya mengasumsikan bahwa Anda sudah memiliki banyak pengetahuan tentang prosesnya.

Selain itu, setiap dokumen yang saya temukan mengasumsikan bahwa kode tersebut perlu dikompilasi dari sumber seperti dalam lingkungan pengembangan. Saya bukan pengembang. Saya seorang sysadmin, dan kami sysadmin memiliki kebutuhan yang berbeda karena kami tidak—atau tidak seharusnya—mengkompilasi kode yang akan digunakan untuk tugas administratif; kita harus menggunakan skrip shell. Jadi kami tidak memiliki kode sumber dalam arti bahwa itu adalah sesuatu yang perlu dikompilasi menjadi executable biner. Apa yang kami miliki adalah sumber yang juga dapat dieksekusi.

Untuk sebagian besar, proyek ini harus dilakukan sebagai siswa pengguna non-root. Rpms tidak boleh dibangun oleh root, tetapi hanya oleh pengguna yang tidak memiliki hak istimewa. Saya akan menunjukkan bagian mana yang harus dijalankan sebagai root dan mana yang oleh pengguna non-root dan tidak memiliki hak istimewa.

Persiapan

Pertama, buka satu sesi terminal dan su untuk mengakar. Pastikan untuk menggunakan - opsi untuk memastikan bahwa lingkungan root lengkap diaktifkan. Saya tidak percaya bahwa sysadmin harus menggunakan sudo untuk setiap tugas administrasi. Cari tahu alasannya di posting blog pribadi saya:SysAdmins asli tidak sudo .

[siswa@testvm1 ~]$ su -
Sandi:
[root@testvm1 ~]#

Buat pengguna siswa yang dapat digunakan untuk proyek ini dan setel sandi untuk pengguna tersebut.

[root@testvm1 ~]# useradd -c "Pengguna Siswa" siswa 
[root@testvm1 ~]# passwd siswa
Mengubah kata sandi untuk siswa pengguna.
Kata sandi baru:
Ketik ulang kata sandi baru:
passwd:semua token otentikasi berhasil diperbarui.
[root@testvm1 ~]#

Membangun paket rpm memerlukan rpm-build paket, yang kemungkinan besar belum diinstal. Instal sekarang sebagai root. Perhatikan bahwa perintah ini juga akan menginstal beberapa dependensi. Jumlahnya dapat bervariasi, tergantung pada paket yang sudah diinstal pada host Anda; itu menginstal total 17 paket pada VM pengujian saya, yang cukup minim.

dnf install -y rpm-build 

Sisa dari proyek ini harus dilakukan sebagai siswa pengguna kecuali jika diarahkan secara eksplisit. Buka sesi terminal lain dan gunakan su untuk beralih ke pengguna tersebut untuk melakukan langkah-langkah selanjutnya. Unduh tarball yang telah saya siapkan dari struktur direktori pengembangan, utils.tar, dari GitHub menggunakan perintah berikut:

wget https://github.com/opensourceway/how-to-rpm/raw/master/utils.tar 

Tarball ini mencakup semua file dan skrip Bash yang akan diinstal oleh rpm terakhir. Ada juga file spesifikasi lengkap, yang dapat Anda gunakan untuk membangun rpm. Kami akan membahas detail tentang setiap bagian dari file spesifikasi.

Sebagai siswa pengguna, dengan menggunakan direktori home Anda sebagai direktori kerja Anda saat ini (pwd), untar tarball.

[student@testvm1 ~]$ cd ; tar -xvf utils.tar  

Gunakan tree perintah untuk memverifikasi bahwa struktur direktori ~/development dan file yang terkandung terlihat seperti output berikut:

[student@testvm1 ~]$ tree development/
development/
├── license
│   Copyright.and.GPL.Notice.txt
│  ── GPL_LICENSE.txt
├── skrip
│   create_motd
│   die
│   mymotd
│   sysdata
└── spec
    └── utils.spec

3 direktori, 7 file
[student@testvm1 ~]$

mymotd skrip membuat aliran data "Pesan Hari Ini" yang dikirim ke stdout. create_motd skrip menjalankan mymotd skrip dan mengarahkan output ke file /etc/motd. File ini digunakan untuk menampilkan pesan harian kepada pengguna yang login dari jarak jauh menggunakan SSH.

die skrip adalah skrip saya sendiri yang membungkus kill perintah dalam sedikit kode yang dapat menemukan program yang sedang berjalan yang cocok dengan string tertentu dan mematikannya. Ini menggunakan kill -9 untuk memastikan bahwa mereka tidak dapat mengabaikan pesan pembunuhan.

sysdata skrip dapat memuntahkan puluhan ribu baris data tentang perangkat keras komputer Anda, versi Linux yang diinstal, semua paket yang diinstal, dan metadata dari hard drive Anda. Saya menggunakannya untuk mendokumentasikan keadaan Host pada suatu titik waktu. Saya nanti bisa menggunakannya untuk referensi. Saya biasa melakukan ini untuk menyimpan catatan host yang saya instal untuk pelanggan.

Anda mungkin perlu mengubah kepemilikan file dan direktori ini menjadi student.student. Lakukan ini, jika perlu, menggunakan perintah berikut:

chown -R student.student development 

Sebagian besar file dan direktori di pohon ini akan diinstal pada sistem Fedora dengan rpm yang Anda buat selama proyek ini.

Membuat struktur direktori build

rpmbuild perintah membutuhkan struktur direktori yang sangat spesifik. Anda harus membuat struktur direktori ini sendiri karena tidak ada cara otomatis yang disediakan. Buat struktur direktori berikut di direktori home Anda:

~ ─ rpmbuild
    RPMS
      noarch
    SUMBER
    SPECS
    SRPMS

Kami tidak akan membuat direktori rpmbuild/RPMS/X86_64 karena itu akan menjadi arsitektur khusus untuk binari yang dikompilasi 64-bit. Kami memiliki skrip shell yang tidak spesifik arsitektur. Pada kenyataannya, kami juga tidak akan menggunakan direktori SRPMS, yang akan berisi file sumber untuk kompiler.

Memeriksa file spesifikasi

Setiap file spesifikasi memiliki sejumlah bagian, beberapa di antaranya dapat diabaikan atau dihilangkan, tergantung pada keadaan spesifik dari build rpm. File spesifikasi khusus ini bukan contoh file minimal yang diperlukan untuk bekerja, tetapi ini adalah contoh yang baik dari file spesifikasi yang cukup kompleks yang mengemas file yang tidak perlu dikompilasi. Jika diperlukan kompilasi, kompilasi akan dilakukan di %build bagian, yang dihilangkan dari file spesifikasi ini karena tidak diperlukan.

Pembukaan

Ini adalah satu-satunya bagian dari file spesifikasi yang tidak memiliki label. Ini terdiri dari banyak informasi yang Anda lihat ketika perintah rpm -qi [Package Name] dijalankan. Setiap datum adalah satu baris yang terdiri dari tag, yang mengidentifikasinya dan data teks untuk nilai tag.

################################################################ ##############################
# File spesifikasi untuk utils
##### ############################################################# ########################
# Dikonfigurasi untuk dibangun oleh siswa pengguna atau pengguna non-root lainnya
### ############################################################# ###########################
#
Ringkasan:Skrip utilitas untuk menguji pembuatan RPM
Nama:utils
Versi:1.0.0
Rilis:1
Lisensi:GPL
URL:http://www.both.org
Grup:Sistem
Packager:David Both
Memerlukan:bash
Memerlukan:screen
Memerlukan:mc
Memerlukan:dmidecode
BuildRoot:~/rpmbuild/

# Bangun dengan sintaks berikut:
# rpmbuild --target noarch -bb utils.spec

Baris komentar diabaikan oleh rpmbuild program. Saya selalu ingin menambahkan komentar ke bagian ini yang berisi sintaks yang tepat dari rpmbuild perintah yang diperlukan untuk membuat paket. Tag Ringkasan adalah deskripsi singkat dari paket. Tag Nama, Versi, dan Rilis digunakan untuk membuat nama file rpm, seperti pada utils-1.00-1.rpm. Meningkatkan rilis dan nomor versi memungkinkan Anda membuat rpm yang dapat digunakan untuk memperbarui yang lama.

Tag Lisensi mendefinisikan lisensi di mana paket dirilis. Saya selalu menggunakan variasi GPL. Menentukan lisensi penting untuk memperjelas fakta bahwa perangkat lunak yang terkandung dalam paket adalah open source. Ini juga mengapa saya menyertakan pernyataan lisensi dan GPL dalam file yang akan diinstal.

URL biasanya halaman web proyek atau pemilik proyek. Dalam hal ini, ini adalah halaman web pribadi saya.

Tag Grup menarik dan biasanya digunakan untuk aplikasi GUI. Nilai tag Grup menentukan grup ikon mana dalam menu aplikasi yang akan berisi ikon untuk dieksekusi dalam paket ini. Digunakan bersama dengan tag Ikon (yang tidak kita gunakan di sini), tag Grup memungkinkan penambahan ikon dan informasi yang diperlukan untuk meluncurkan program ke dalam struktur menu aplikasi.

Tag Packager digunakan untuk menentukan orang atau organisasi yang bertanggung jawab untuk memelihara dan membuat paket.

Pernyataan Memerlukan mendefinisikan dependensi untuk rpm ini. Masing-masing adalah nama paket. Jika salah satu paket yang ditentukan tidak ada, utilitas instalasi DNF akan mencoba mencarinya di salah satu repositori yang ditentukan di /etc/yum.repos.d dan menginstalnya jika ada. Jika DNF tidak dapat menemukan satu atau lebih paket yang diperlukan, itu akan menimbulkan kesalahan yang menunjukkan paket mana yang hilang dan dihentikan.

Baris BuildRoot menentukan direktori tingkat atas tempat rpmbuild alat akan menemukan file spesifikasi dan di mana ia akan membuat direktori sementara saat membangun paket. Paket yang telah selesai akan disimpan di subdirektori noarch yang telah kita tentukan sebelumnya. Komentar yang menunjukkan sintaks perintah yang digunakan untuk membangun paket ini menyertakan opsi –target noarch , yang mendefinisikan arsitektur target. Karena ini adalah skrip Bash, mereka tidak terkait dengan arsitektur CPU tertentu. Jika opsi ini dihilangkan, build akan ditargetkan ke arsitektur CPU tempat build dilakukan.

rpmbuild program dapat menargetkan banyak arsitektur yang berbeda, dan menggunakan --target option memungkinkan kita untuk membangun paket arsitektur khusus pada host dengan arsitektur yang berbeda dari yang di mana pembangunan dilakukan. Jadi saya bisa membuat paket yang dimaksudkan untuk digunakan pada arsitektur i686 pada host x86_64, dan sebaliknya.

Ubah nama pembuat paket menjadi milik Anda dan URL ke situs web Anda sendiri jika ada.

%deskripsi

%description bagian dari file spesifikasi berisi deskripsi paket rpm. Ini bisa sangat pendek atau dapat berisi banyak baris informasi. %description Our kami bagian ini agak singkat.

%description
Koleksi skrip utilitas untuk menguji pembuatan RPM.

%persiapan

%prep bagian adalah skrip pertama yang dieksekusi selama proses pembuatan. Skrip ini tidak dijalankan selama instalasi paket.

Skrip ini hanyalah skrip shell Bash. Ini mempersiapkan direktori build, membuat direktori yang digunakan untuk build sesuai kebutuhan dan menyalin file yang sesuai ke direktori masing-masing. Ini akan mencakup sumber yang diperlukan untuk kompilasi lengkap sebagai bagian dari build.

Direktori $RPM_BUILD_ROOT mewakili direktori root dari sistem yang diinstal. Direktori yang dibuat di direktori $RPM_BUILD_ROOT adalah jalur yang sepenuhnya memenuhi syarat, seperti /user/local/share/utils, /usr/local/bin, dan seterusnya, dalam sistem file langsung.

Dalam hal paket kami, kami tidak memiliki sumber pra-kompilasi karena semua program kami adalah skrip Bash. Jadi, kami cukup menyalin skrip dan file lain tersebut ke direktori di mana mereka berada di sistem yang diinstal.

%persiapan
######################################################### ######################################
# Buat pohon build dan salin file dari direktori pengembangan    #
# ke dalam pohon pembangunan. #
######################################################### #################################
echo "BUILDROOT =$RPM_BUILD_ROOT"
mkdir -p $RPM_BUILD_ROOT/usr/local/bin/
mkdir -p $RPM_BUILD_ROOT/usr/local/share/utils

cp /home/student/development/utils/scripts/* $RPM_BUILD_ROOT/usr/local/bin
cp /home/student/development/utils/license/* $RPM_BUILD_ROOT/usr/local/share/utils
cp /home/student/development/utils/spec /* $RPM_BUILD_ROOT/usr/local/share/utils

keluar

Perhatikan bahwa pernyataan keluar di akhir bagian ini diperlukan.

%file

Bagian dari file spesifikasi ini mendefinisikan file yang akan diinstal dan lokasinya di pohon direktori. Itu juga menentukan atribut file dan pemilik dan pemilik grup untuk setiap file yang akan diinstal. Izin dan kepemilikan file adalah opsional, tetapi saya menyarankan agar mereka diatur secara eksplisit untuk menghilangkan kemungkinan atribut tersebut menjadi salah atau ambigu saat diinstal. Direktori dibuat sesuai kebutuhan selama instalasi jika belum ada.

%files
%attr(0744, root, root) /usr/local/bin/*
%attr(0644, root, root) /usr/local/share/utils/*

%pra

Bagian ini kosong di file spesifikasi proyek lab kami. Ini akan menjadi tempat untuk meletakkan skrip apa pun yang diperlukan untuk dijalankan selama penginstalan rpm tetapi sebelum penginstalan file.

%posting

Bagian dari file spesifikasi ini adalah skrip Bash lainnya. Yang ini berjalan setelah instalasi file. Bagian ini dapat berupa apa saja yang Anda butuhkan atau inginkan, termasuk membuat file, menjalankan perintah sistem, dan memulai ulang layanan untuk menginisialisasi ulang setelah melakukan perubahan konfigurasi. %post skrip untuk paket rpm kami melakukan beberapa tugas tersebut.

%posting
##################################################### ###################################
# Menyiapkan skrip MOTD                                          br />############################################################### ################################
cd /etc
# Simpan MOTD lama jika itu ada
jika [ -e motd ]
lalu
   cp motd motd.orig
fi
# Jika belum ada, Tambahkan tautan ke create_motd ke cron.daily
cd /etc/cron.daily
jika [ ! -e create_motd ]
lalu
   ln -s /usr/local/bin/create_motd
fi
# buat MOTD untuk pertama kalinya
/usr/local/ bin/mymotd> /etc/motd

Komentar yang disertakan dalam skrip ini harus memperjelas tujuannya.

%postun

Bagian ini berisi skrip yang akan dijalankan setelah paket rpm di-uninstall. Menggunakan rpm atau DNF untuk menghapus sebuah paket akan menghapus semua file yang terdaftar di %files bagian, tetapi tidak menghapus file atau tautan yang dibuat oleh %post bagian, jadi kita perlu menanganinya di bagian ini.

Skrip ini biasanya terdiri dari tugas pembersihan yang tidak dapat diselesaikan dengan menghapus file yang sebelumnya diinstal oleh rpm. Dalam kasus paket kami, ini termasuk menghapus tautan yang dibuat oleh %post skrip dan memulihkan file motd asli yang disimpan.

%postun
# menghapus file dan tautan yang diinstal
rm /etc/cron.daily/create_motd

# Mengembalikan MOTD asli jika telah dicadangkan
if [ -e /etc/motd.orig ]
lalu
   mv -f /etc/motd.orig /etc/motd
fi

%bersih

Script Bash ini melakukan pembersihan setelah proses build rpm. Dua baris di %clean bagian di bawah ini menghapus direktori build yang dibuat oleh rpm-build memerintah. Dalam banyak kasus, pembersihan tambahan mungkin juga diperlukan.

%clean
rm -rf $RPM_BUILD_ROOT/usr/local/bin
rm -rf $RPM_BUILD_ROOT/usr/local/share/utils

%changelog

Bagian teks opsional ini berisi daftar perubahan rpm dan file yang dikandungnya. Perubahan terbaru dicatat di bagian atas bagian ini.

%changelog
* Rab Aug 29 2018 Nama Anda
  - Paket asli menyertakan beberapa skrip yang berguna. ini
    terutama dimaksudkan untuk digunakan untuk menggambarkan proses
    membangun RPM.

Ganti data di baris header dengan nama dan alamat email Anda sendiri.

Membangun rpm

File spesifikasi harus berada di direktori SPECS dari pohon rpmbuild. Saya merasa paling mudah untuk membuat tautan ke file spesifikasi aktual di direktori itu sehingga dapat diedit di direktori pengembangan dan tidak perlu menyalinnya ke direktori SPECS. Jadikan direktori SPECS sebagai pwd Anda, lalu buat tautannya.

cd ~/rpmbuild/SPECS/
ln -s ~/development/spec/utils.spec

Jalankan perintah berikut untuk membangun rpm. Hanya perlu beberapa saat untuk membuat rpm jika tidak terjadi kesalahan.

rpmbuild --target noarch -bb utils.spec 

Periksa di direktori ~/rpmbuild/RPMS/noarch untuk memverifikasi bahwa rpm baru ada di sana.

[student@testvm1 ~]$ cd rpmbuild/RPMS/noarch/
[student@testvm1 noarch]$ ll
total 24
-rw-rw-r--. 1 siswa siswa 24364 30 Agustus 10:00 utils-1.0.0-1.noarch.rpm
[student@testvm1 noarch]$

Menguji rpm

Sebagai root, instal rpm untuk memverifikasi bahwa itu menginstal dengan benar dan bahwa file diinstal di direktori yang benar. Nama pasti dari rpm akan bergantung pada nilai yang Anda gunakan untuk tag di bagian Pembukaan, tetapi jika Anda menggunakan yang ada di sampel, nama rpm akan seperti yang ditunjukkan pada contoh perintah di bawah ini:

[root@testvm1 ~]# cd /home/student/rpmbuild/RPMS/noarch/
[root@testvm1 noarch]# ll
total 24
-rw-rw-r --. 1 siswa siswa 24364 30 Agustus 10:00 utils-1.0.0-1.noarch.rpm
[root@testvm1 noarch]# rpm -ivh utils-1.0.0-1.noarch.rpm
Mempersiapkan ...                          ############################### [100%]
Memperbarui / memasang...
   1:utils-1.0.0-1                    ####################################################### [100%]

Periksa /usr/local/bin untuk memastikan bahwa file baru ada di sana. Anda juga harus memverifikasi bahwa tautan create_motd di /etc/cron.daily telah dibuat.

Gunakan rpm -q --changelog utils perintah untuk melihat changelog. Lihat file yang diinstal oleh paket menggunakan rpm -ql utils perintah (itu adalah huruf kecil L di ql .)

[root@testvm1 noarch]# rpm -q --changelog utils
* Rab Aug 29 2018 Nama Anda
- Paket asli menyertakan beberapa skrip yang berguna. ini
    terutama dimaksudkan untuk digunakan untuk menggambarkan proses
    membangun RPM.

[root@testvm1 noarch]# rpm -ql utils
/usr/ local/bin/create_motd
/usr/local/bin/die
/usr/local/bin/mymotd
/usr/local/bin/sysdata
/usr/local/ share/utils/Copyright.and.GPL.Notice.txt
/usr/local/share/utils/GPL_LICENSE.txt
/usr/local/share/utils/utils.spec
[ root@testvm1 noarch]#

Hapus paket.

rpm -e utils 

Bereksperimen

Sekarang Anda akan mengubah file spesifikasi untuk meminta paket yang tidak ada. Ini akan mensimulasikan ketergantungan yang tidak dapat dipenuhi. Tambahkan baris berikut tepat di bawah baris Memerlukan yang ada:

Requires: badrequire 

Bangun paket dan coba instal. Pesan apa yang ditampilkan?

Kami menggunakan rpm perintah untuk menginstal dan menghapus utils kemasan. Coba instal paket dengan yum atau DNF. Anda harus berada di direktori yang sama dengan paket atau menentukan jalur lengkap ke paket agar ini berfungsi.

Kesimpulan

Ada banyak tag dan beberapa bagian yang tidak kami bahas dalam tinjauan dasar-dasar pembuatan paket rpm ini. Sumber daya yang tercantum di bawah ini dapat memberikan informasi lebih lanjut. Membangun paket rpm tidak sulit; Anda hanya perlu informasi yang tepat. Saya harap ini membantu Anda—saya butuh waktu berbulan-bulan untuk mencari tahu sendiri.

Kami tidak membahas pembangunan dari kode sumber, tetapi jika Anda seorang pengembang, itu harus menjadi langkah sederhana dari titik ini.

Membuat paket rpm adalah cara lain yang baik untuk menjadi sysadmin yang malas dan menghemat waktu dan tenaga. Ini menyediakan metode mudah untuk mendistribusikan dan menginstal skrip dan file lain yang kita sebagai sysadmin perlu instal di banyak host.

Sumber daya

  • Edward C. Baily, RPM Maksimum , Sams Publishing, 2000, ISBN 0-672-31105-4

  • Edward C. Baily, RPM Maksimum , versi online yang diperbarui

  • Dokumentasi RPM :Halaman web ini mencantumkan sebagian besar dokumentasi online yang tersedia untuk rpm. Ini mencakup banyak tautan ke situs web lain dan informasi tentang rpm.


Linux
  1. Cara Menginstal Paket Dari Repositori Tertentu Di Linux

  2. Cara membuat paket RPM Linux

  3. Cara Mendaftar Semua Paket yang Terinstal Di Linux

  1. Cara Menginstal Paket RPM Di Ubuntu

  2. Cara memeriksa integritas paket rpm di Linux

  3. Cara Memeriksa vendor paket RPM yang diinstal di Linux

  1. Bagaimana membangun sebuah Flatpak

  2. Cara Menggunakan Perintah apt untuk Mengelola Paket di Linux

  3. Apakah mungkin membangun distro Linux yang mendukung paket RPM dan .deb?