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:
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:
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 -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:
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:
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:
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:
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
:
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:
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:
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:
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
/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:
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:
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 :)