Bagaimana cara membangun paket RPM dari file yang diinstal?

8

Ada dua mesin, versi identik / lengkungan SLES.

Pada mesin #A ada perangkat lunak "foo" yang diinstal yang dapat kita lihat menggunakan rpm -qa.

Pada mesin #B, perangkat lunak "foo" perlu diinstal.

Tidak foo.rpmtersedia dari sumber apa pun, dari internet, dll.

Pertanyaan

Karena paket foo.rpmdiinstal pada mesin #A, dapatkah kita membuat foo.rpmfile di atasnya dari file yang sudah diinstal?

Ada skrip pra / posting di rpm, juga, saya pikir. Jadi foo.rpm( dengan dependensi? ) Dapat diinstal.

evachristine
sumber
Anda hampir dapat menemukan semua paket rpm dari sini. rpmfind.net/linux/RPM
Ramesh

Jawaban:

11

Itu mungkin tetapi sangat sulit untuk dilakukan sehingga dilakukan dengan benar. Jika Anda putus asa, Anda dapat membuat .specfile RPM baru dan membuat file RPM (SRPM) sumber "palsu" yang kemudian dapat Anda gunakan untuk membuat file RPM yang dihasilkan menggunakan rpmbuild --rebuild.

Saya akan terus mencari RPM yang sebenarnya. Anda tidak menyatakan yang mana dalam pertanyaan Anda, tetapi merupakan pengalaman saya bahwa Anda dapat menemukan apa pun di internet jika Anda tahu cara mencarinya. Saya telah menemukan versi kuno RPM untuk distro Red Hat yang belum digunakan selama 10+ tahun jadi saya merasa sulit untuk percaya bahwa tidak ada sisa RPM ini di mana pun.

Anda juga sering dapat kembali ke sumber aplikasi yang ada di dalam RPM dan menggunakannya untuk merekonstruksi RPM juga. Sering kali aplikasi sumber akan menyertakan .specfile yang diperlukan yang digunakan untuk membangun kembali RPM.

Terakhir Anda bisa mendapatkan sumber dan .specfile dari layanan build seperti distro berbasis Koji untuk Red Hat. SuSE juga mempertahankan layanan build serupa sehingga Anda dapat mencari melalui ini untuk mendapatkan artefak build lama.

Mengambil binari apa adanya

Anda dapat menggunakan metode ini untuk mengangkat executable aktual dari satu sistem dan menaruhnya di atas untuk ditempatkan di sistem lain.

mesin A

$ rpm -ql <packageNameHere> | xargs tar -zcvf /tmp/program.tgz

mesin B

$ tar -zxvf /path/to/your/program.tgz

RPM versi SLES

Menurut salah satu posting di utas ini: Re: Cara membuat RPM rpm dari paket yang diinstal pada SLES konon memiliki saklar --repackage. Ini tidak ada pada versi Red Hat (di Fedora atau CentOS). Tetapi menurut pos Anda dapat menggunakannya seperti:

$ rpm -e --repackage <somepackage>

Setelah selesai, Anda akan menemukan RPM Anda dapat diakses di sini:

/var/spool/repackage

Menggunakan rpmerizor

Rpmerizor adalah alat / skrip pihak ketiga yang dapat Anda instal yang akan mengemas ulang file sumber ke dalam RPM yang sesuai. Penggunaan skrip ini dapat diakses di sini, berjudul: Halaman manual rpmerizor .

kutipan

Rpmerizor adalah skrip yang memungkinkan Anda membuat paket RPM dari file yang diinstal. Anda cukup menentukan file pada baris perintah dan menjawab beberapa pertanyaan interaktif untuk mengisi meta-data rpm (nama paket, versi ...). Anda juga dapat menggunakannya dalam mode batch dengan opsi baris perintah untuk meta-data.

Menggunakan rpmrebuild

Tidak perlu bingung dengan alat build rpmbuild, rpmrebuildadalah skrip pihak ketiga lain yang dapat Anda gunakan untuk melakukan pengemasan ulang RPM yang sudah diinstal.

kutipan

rpmrebuild adalah alat untuk membangun file RPM dari paket yang telah diinstal dalam penggunaan dasar, rpmrebuild tidak memerlukan pengetahuan pembangunan rpm. (Pada debian, produk yang setara adalah dpkg-repack).

Contoh

Katakanlah kita ingin mengemas kembali openssh-server.

$ rpm -aq | grep openssh-server
openssh-server-6.2p2-8.fc19.x86_64

Sekarang kemas:

$ rpmrebuild openssh-server-6.2p2-8.fc19.x86_64
/usr/lib/rpmrebuild/rpmrebuild.sh: WARNING: some files have been modified:
..?......  c /etc/ssh/sshd_config
..?......  c /etc/sysconfig/sshd
Do you want to continue ? (y/N) y
Do you want to change release number ? (y/N) n
result: /root/rpmbuild/RPMS/x86_64/openssh-server-6.2p2-8.fc19.x86_64.rpm

Referensi

slm
sumber
Bagaimanapun, ini: jdk-1.6.0_02-fcs.rpm :) Ini bukan di "internet"
evachristine
Anda bisa mendapatkan RPM resmi untuk versi JDK apa pun dari sini: oracle.com/technetwork/java/javase/downloads/… . Itu akan membawa Anda ke 1.6u2 yang merupakan versi yang sama.
slm
bagaimana Anda bisa tahu bahwa "jdk-1.6.0_02-fcs.rpm" adalah "1.6u2"? : O
evachristine
1
Aku menemukannya!! TERIMA KASIH! namanya: jdk-6u2-linux-i586.rpm TERIMA KASIH!
evachristine
1
@ evachristine - ya itu orangnya, senang bisa menyelesaikannya.
slm
0

Sebagai aturan umum no.

Dengan sedikit keberuntungan rpm -qidan rpm -q --changelogmemberikan wawasan ke mana paket itu berasal.

Jika itu dibangun pada sistem yang sedang berjalan Anda mungkin masih memiliki file spesifikasi yang digunakan untuk membuat rpm yang sebenarnya, jika tidak keduanya.

Sebagai aturan umum saya tidak merekomendasikan menyalin file / binari tetapi sebagian besar informasi meta ada di database RPM dan Anda memiliki file yang sebenarnya.

rpm -q --list <pkg_name> memperlihatkan semua file yang disebarkan paket.

rpm -q --scripts <pkg_name> untuk menunjukkan skrip apa pun yang dijalankan dengan menginstal (atau menghapus) paket mungkin memberikan setidaknya sebanyak wawasan tentang tujuannya sebagai file yang bisa digunakan.

Dan segala ketergantungan yang harus diinstal dapat ditemukan bersama rpm -q --requires <pkg_name>.

HBruijn
sumber