Ana içeriğe geç

Bazı Faydalı RPM Paket Yöneticisi Komutları

RPM, RPM Package Manager için bir kısaltmadır. Tıpkı GNU (GNU is not Unix) gibi, recursive bir isimdir. RPM ayrıca Red Hat Package Manager olarka da bilinir. RPM, Red Hat Enterprise Linux'ta varsayılan paket yöneticisidir. RPM, GPL ile lisanslanmış bir özgür yazılım olduğu için, CentOS (Community Enterprise Operating System) gibi bazı popüler dağıtımlar da paket yöneticisi olarak RPM kullanır.

Öncelikle, denemelerimizi yapabilmek için bir RPM paketi indireceğiz. Denemeler için wget paketini kullanacağım. wget RPM paketini buradan indirebilirsiniz.

RPM Paketlerinde Install, Upgrade, Remove ve Freshen İşlemleri

Bir RPM paketini yüklemek için, -i veya --install opsiyonunu, devamında paket dosyasını belirterek kullanabilirsiniz:

rpm ile paket kurma
root@localhost ~]# ls
anaconda-ks.cfg  wget-1.14-18.el7_6.1.x86_64.rpm
root@localhost ~]# rpm -i wget-1.14-18.el7_6.1.x86_64.rpm 
root@localhost ~]# echo $?
0

Eee? Çalıştı mı? Aslında evet. Herhangi bir hata almadık ve echo $? 0 döndürdü. Paketin başarıyla kurulduğunu söyleyebiliriz.

Bir RPM paketini kaldırmak için, -e veya --erase kullanabilirsiniz. Dikkat edin. Bu komut parametre olarak paket dosyasını değil, paketin adını bekler:

rpm ile paket kaldırma
root@localhost ~]# rpm -e wget
root@localhost ~]# wget
-bash: wget: command not found

Freshen da bir çeşit update'tir. Fakat yalnızca, paketin daha eski bir sürümü yüklüyse çalışır. Eğer argüman olarak verilen paket, kurulu olandan daha yeniyse, güncelleme işlemi yapılır:

rpm ile freshen işlemi
rpm -F wget-1.14-18.el7_6.1.x86_64.rpm 
root@localhost ~]# wget
-bash: wget: command not found

wget paketini zaten kaldırmış olduğumuz için, freshen işlemini yapamadık. Hiçbir şey değişmedi. Sonuç olarak RPM freshen, "zaten yüklü olan bir paketi güncellemeye" yarar.

RPM upgrade ise, freshen'den farklı çalışır. Bu komut, verilen paketin yüklü olup olmadığını kontrol eder. Yüklü değilse, yükler. Paket zaten yüklüyse fakat argüman olarak verilen paket daha yeniyse, rpm -U paketi günceller:

rpm ile paket güncelleme
root@localhost ~]# wget
-bash: wget: command not found
root@localhost ~]# rpm -U wget-1.14-18.el7_6.1.x86_64.rpm 
root@localhost ~]# wget
wget: missing URL

wget paketine sahip olmadığımız için, rpm -U bu paketi kurdu.

Kurulumun sürecini görmek istiyorsanız, -h veya --hash kullanabilirsiniz. Bu opsiyonlar, kurulum sırasında hash (#) karakterleri göstererek kurulumun süreci hakkında sizi bilgilendirecektir:

rpm kurulum süreci
root@localhost ~]# rpm -e wget
root@localhost ~]# rpm -ih wget-1.14-18.el7_6.1.x86_64.rpm 
Updating / installing...
################################# 100%]

Yüklü Tüm RPM Paketlerini Listeleme

Sistemde yüklü tüm RPM paketlerini listelemek için, RPM query (-q) ve all (-a) opsiyonlarının kombinasyonunu kullanabiliriz:

red hat kurulu paketleri listeleme
root@localhost ~]# rpm -qa
openssh-clients-7.4p1-21.el7.x86_64
setup-2.8.71-11.el7.noarch
audit-2.8.5-4.el7.x86_64
ncurses-base-5.9-14.20130511.el7_4.noarch
aic94xx-firmware-30-6.el7.noarch
dracut-config-rescue-033-572.el7.x86_64
.....................
crontabs-1.11-6.20121102git.el7.noarch
openssh-7.4p1-21.el7.x86_64
alsa-tools-firmware-1.1.0-1.el7.x86_64
teamd-1.29-3.el7.x86_64
python-pyudev-0.15-9.el7.noarch

Devamında; bu çıktıyı wc -l ya da nl komutlarına gönderip, sistemde kaç RPM paketi kurulduğunu görebilirsiniz:

red hat kurulu paket sayısını gösterme
root@localhost ~]# rpm -qa | wc -l
302

Bu Dosya Hangi Paketten Geldi?

Varsayalım ki bir konfigürasyon dosyasına denk geldiniz fakat bu dosyanın hangi pakete ait olduğuna dair bir fikriniz yok. RPM kullanarak bu bilgiyi sorgulayabilirsiniz. Sorgu* için -q ve dosya** için -f:

red hat dosyayı sorgulama
root@localhost ~]# ls /etc/crontab 
/etc/crontab
root@localhost ~]# rpm -qf /etc/crontab
crontabs-1.11-6.20121102git.el7.noarch

Görüldüğü üzere, /etc/crontab dosyası crontabs paketi ile gelmiş.

Paketin Bağımlılıklarını Bulma

Bir RPM paketinin bağımlılıklarını bulmak için, sorgularınızda -R (requires) opsiyonunu kullanabilirsiniz. Dikkat edin, bu sorgu paket dosyasını değil, paketin adını argüman olarak bekler:

red hat bağımlılıkları listeleme
root@localhost ~]# rpm -qR wget-1.14-18.el7_6.1.x86_64.rpm 
package wget-1.14-18.el7_6.1.x86_64.rpm is not installed
root@localhost ~]# rpm -qR wget
/bin/sh
/bin/sh
/sbin/install-info
/sbin/install-info
config(wget) = 1.14-18.el7_6.1
libc.so.6()(64bit)
libc.so.6(GLIBC_2.11)(64bit)
libc.so.6(GLIBC_2.14)(64bit)
libc.so.6(GLIBC_2.15)(64bit)
libc.so.6(GLIBC_2.17)(64bit)
libc.so.6(GLIBC_2.2.5)(64bit)
libc.so.6(GLIBC_2.3)(64bit)
libc.so.6(GLIBC_2.3.4)(64bit)
libc.so.6(GLIBC_2.4)(64bit)
libc.so.6(GLIBC_2.8)(64bit)
libcrypto.so.10()(64bit)
libcrypto.so.10(libcrypto.so.10)(64bit)
libdl.so.2()(64bit)
libidn.so.11()(64bit)
libidn.so.11(LIBIDN_1.0)(64bit)
libpcre.so.1()(64bit)
libssl.so.10()(64bit)
libssl.so.10(libssl.so.10)(64bit)
libuuid.so.1()(64bit)
libuuid.so.1(UUID_1.0)(64bit)
libz.so.1()(64bit)
rpmlib(CompressedFileNames) <= 3.0.4-1
rpmlib(FileDigests) <= 4.6.0-1
rpmlib(PayloadFilesHavePrefix) <= 4.0-1
rtld(GNU_HASH)
rpmlib(PayloadIsXz) <= 5.2-1

Paket ile Gelen Tüm Dosyaları Listeleme

Bir paket kurdunuz ve bu paket ile hangi dosyaların geldiğini öğrenmek istiyorsunuz. Konfigürasyon dosyası, binary'ler veya kılavuz sayfaları gibi. Bu durumda sorgularınızda -l veya --list kullanabilirsiniz:

red hat paket dosyalarını listeleme
root@localhost ~]# rpm -ql crontabs
/etc/cron.daily
/etc/cron.hourly
/etc/cron.monthly
/etc/cron.weekly
/etc/crontab
/etc/sysconfig/run-parts
/usr/bin/run-parts
/usr/share/man/man4/crontabs.4.gz
/usr/share/man/man4/run-parts.4.gz

Yukarıdaki çıktıda, crontabs paketi ile birlikte gelen dosyaları görüyorsunuz.

Bir RPM Paketi Nasıl Doğrulanır?

Bazen paketinizin bilgilerinin doğru olup olmadığını kontrol etmek durumunda kalırsınız. rpm -V yüklü dosyaları RPM veritabanındaki bilgilerle karşılaştırır. crontabs paketiyle hangi dosyaların geldiğini zaten biliyoruz. Bir tanesini değiştirelim:

red hat paket doğrulama
root@localhost ~]# rpm -V crontabs
root@localhost ~]# ls -l /etc/crontab 
-rw-r--r--. 1 root root 451 Haz 10  2014 /etc/crontab
root@localhost ~]# chmod 600 /etc/crontab 
root@localhost ~]# ls -l /etc/crontab 
-rw-------. 1 root root 451 Haz 10  2014 /etc/crontab
root@localhost ~]# rpm -V crontabs
.M.......  c /etc/crontab
Burada ne oluyor? Öncelikle, crontabs paketini doğruladık. Hiçbir çıktı gelmedi. Bu nedenle paketin doğrulandığını söyleyebiliriz. Sonrasında, crontabs paketine ait /etc/crontabs dosyasının izinlerini kontrol ettik ve değiştirdik. Bundan sonra, paket doğrulaması hata verdi. Peki bu çıktı ne anlama geliyor?

Son harfe bakın, "c". Bu, dosyanın bir configuration (yapılandırma) dosyası olduğunu gösteriyor. Bazı farklı dosya tiplerini ise şöyle sıralayabiliriz:

  • "d" dokümantasyon dosyası
  • "l" lisans dosyası
  • "r" readme dosyası

Bir de "M"ye dikkat edin.. Bu harf, modeun değiştiğini gösterir. İzinler ya da dosyanın tipi gibi. Bazı farklı attribute'ları (özellik) ise şöyle sıralayabiliriz:

  • S dosya boyutu
  • 5 checksum (MD5'ten geliyor)
  • U kullanıcı sahipliği
  • G grup sahipliği
  • T değiştirme zamanı

Şimdi bu değerlerle biraz oynayalım:

red hat paket doğrulama
root@localhost ~]# ls -l /etc/crontab 
-rw-------. 1 root root 451 Haz 10  2014 /etc/crontab
root@localhost ~]# chown nobody:nobody /etc/crontab
root@localhost ~]# echo "append this" >> /etc/crontab
root@localhost ~]# rpm -V crontabs
SM5..UGT.  c /etc/crontab

Kullanıcı sahipliğini, grup sahipliğini, dosya içeriğini (dolayısıyla dosya boyutunu, değiştirme tarihini ve checksum'ı) değiştirdik. Böylelikle dorğulama hataları aldık.

Doğrulanmamış Bir RPM Paketi Nasıl Düzeltilir?

Paketi düzeltmek için birkaç şey kullanabiliriz. Birincisi, ilgili dosyada yaptığımız değişiklikleri geri alabiliriz. Bu, checksum'ı ve dosya boyutunu eski hâline getirecektir. Fakat değiştirme zamanı eski hâline dönmeyecektir. İzin ve sahiplikleri düzeltmek için ise --setperms ve --setugids opsiyonlarını kullanabiliriz:

red hat doğrulanmamış bir paketi düzeltme
root@localhost ~]# rpm --setperms crontabs
root@localhost ~]# rpm --setugids crontabs
root@localhost ~]# rpm -V crontabs
S.5....T.  c /etc/crontab
root@localhost ~]# vi /etc/crontab 
root@localhost ~]# rpm -V crontabs
.......T.  c /etc/crontab

Bu durumdan memnun değilseniz, paketi yeniden yükleyebilirsiniz. Ya da en baştan bozmamayı tercih edebilirsiniz :)