İçeriğe geç
academia.sh

Ders 17 / 20

Paket Yöneticisi Kavramı

Paketin dosya kümesi ve üstveriden oluşması, kurulu paket veritabanının işlevi, bağımlılık çözümlemesinin kısıt problemi olarak yapısı ve sürüm karşılaştırma kuralları.

İçindekiler

Kurs boyunca kullanılan araçların hepsi sistemde hazır bulundu. Bunların oraya nasıl geldiği, nasıl güncellendiği ve nasıl kaldırıldığı sorulmadı.

Soru göründüğünden zordur. Bir programı kurmak, dosyalarını kopyalamaktan ibaret değildir: çalıştırılabilir dosya bir dizine, kütüphaneleri başka bir dizine, yapılandırması /etc altına, belgeleri kılavuz dizinine gider. Dizin hiyerarşisi dersindeki yerleşim standardı tam olarak bu dağılımı tanımlıyordu. Elle yapıldığında hangi dosyanın hangi programa ait olduğu kaydedilmez ve kaldırma işlemi olanaksızlaşır.

Paket Nedir

Paket, kurulacak dosyaları ve bu dosyalar hakkındaki üstveriyi bir arada taşıyan arşivdir. Yapısı, arşivleme dersindeki biçime benzer: dosya ağacı artı başlık bilgisi. Fark, başlığın kurulum kararları için okunmasıdır.

Üstverinin taşıdığı bilgiler paket yöneticisi ailesine göre adlandırma farkları gösterse de alanlar ortaktır:

Alan İşlevi
Ad Paketin kimliği
Sürüm Hangi yayın olduğu
Mimari Hangi işlemci ailesi için derlendiği
Bağımlılıklar Çalışması için gereken diğer paketler
Çakışmalar Aynı anda kurulu olamayacağı paketler
Sağladıkları Karşıladığı soyut yetenek adları
Özetler Her dosyanın içerik özeti
Kurulum betikleri Kurulum öncesi ve sonrası çalışacak adımlar

Son iki alan sık atlanır ama belirleyicidir. Özetler, kurulu dosyaların sonradan değiştirilip değiştirilmediğinin sınanmasını sağlar — dosya aktarımı dersindeki doğrulama yönteminin sistem ölçeğine taşınmış hâlidir. Kurulum betikleri ise dosya kopyalamanın yetmediği durumları — kullanıcı hesabı açma, servis kaydı, veritabanı düzenleme — kapsar ve kök yetkisiyle çalıştıkları için paket güveninin merkezinde dururlar.

Kurulu Paket Veritabanı

Paket yöneticisinin ikinci bileşeni, sistemde kurulu her paketin kaydını tutan yerel bir veritabanıdır. Kayıt, paketin üstverisini ve kurduğu dosyaların tam listesini içerir.

Bu liste olmadan üç işlem yapılamaz:

Kaldırma. Hangi dosyaların silineceği bilinemez; elle kurulan yazılım, kaldırıldığında sistemde artık bırakır.

Yükseltme. Eski sürümün hangi dosyalarının yenisinde bulunmadığı bilinemez; artık dosyalar birikir.

Sahiplik sorgusu. Sistemdeki bir dosyanın hangi pakete ait olduğu sorulamaz; bu sorgu, bir arızayı hangi paketin sorumluluğuna yazacağını belirlemekte kullanılır.

Veritabanının bir başka sonucu, elle değiştirilmiş dosyaların ayırt edilebilmesidir. Yapılandırma dosyaları paketle gelir ama yönetici tarafından değiştirilir; yükseltmede bu değişikliklerin korunması gerekir. Paket yöneticileri, dosyanın özetini kayıttakiyle karşılaştırarak değişip değişmediğini anlar ve değişmişse yükseltmede üzerine yazmak yerine kullanıcıya sorar.

Bağımlılıklar Neden Vardır

Bağımlılık soyut bir kavram değildir; çalıştırılabilir dosyaların kendisinde görülebilir:

$ ldd /usr/bin/ls
	linux-vdso.so.1 (0x0000ffff88cce000)
	libselinux.so.1 => /lib/aarch64-linux-gnu/libselinux.so.1 (0x0000ffff88be0000)
	libc.so.6 => /lib/aarch64-linux-gnu/libc.so.6 (0x0000ffff88a20000)
	/lib/ld-linux-aarch64.so.1 (0x0000ffff88c80000)
	libpcre2-8.so.0 => /lib/aarch64-linux-gnu/libpcre2-8.so.0 (0x0000ffff88970000)

Listeleme komutu tek başına çalışmaz: standart C kütüphanesine, güvenlik etiketleri kütüphanesine ve düzenli ifade kütüphanesine bağlıdır. Parantez içindeki sayılar kütüphanelerin o çalıştırmadaki yükleme adresleridir ve her çağrıda değişir; kütüphane adları değişmez. Bu kütüphaneler ayrı paketlerde gelir. Bilgisayarlar Nasıl Çalışır kursundaki bağlama ve yükleme dersi bu ilişkiyi tanımlamıştı; paket bağımlılıkları o ilişkinin dağıtım düzeyindeki karşılığıdır.

Paylaşılan kütüphane kullanmanın gerekçesi tekrarı önlemektir: yüzlerce program aynı kütüphanenin ayrı kopyasını taşımaz. Bedeli, kurulumun bir bağımlılık çizgesine dönüşmesidir.

Sağlanan yetenek kavramı bu çizgeyi esnetir. Bir paket, somut adının yanında soyut bir yetenek adı da sağlayabilir; başka paketler somut ada değil bu yeteneğe bağlanır. Böylece aynı işi yapan farklı gerçekleştirimler birbirinin yerine geçebilir. Kabuk dersindeki /bin/sh örneğinin paketleme düzeyindeki karşılığıdır: bağımlılık bir role kurulur, role hangi programın atandığı sistemin kararıdır.

Çözümleme Bir Kısıt Problemidir

Bir paketin kurulması istendiğinde çözülmesi gereken soru şudur: kurulu paket kümesine hangi paketler eklenirse tüm bağımlılıklar sağlanır ve hiçbir çakışma oluşmaz?

Bu bir arama problemidir. Küçük bir örnek yapısını gösterir:

Paket Bağımlılık Çakışma
cizim 2.0 grafik ≥ 3
rapor 1.4 grafik ≤ 2
grafik 2.9
grafik 3.1

cizim ile rapor aynı sistemde kurulamaz: biri grafik kütüphanesinin üçüncü sürümünü, diğeri en çok ikinci sürümünü ister. Çözümleyici bunu bildirir ve kullanıcıdan seçim yapmasını bekler. Gerçek sistemlerde bu çizge on binlerce düğüm taşır ve kısıtlar kesişimler, alternatifler ve sürüm aralıklarıyla karmaşıklaşır.

Çözümlemenin sonucu üç durumdan biridir: bir çözüm bulunur ve işlem listesi sunulur; çözüm yoktur ve çakışma bildirilir; ya da birden çok çözüm vardır ve yöneticinin tercih kuralları — hangi depo öncelikli, hangi sürüm yeğlenir — devreye girer.

Bu nedenle kurulum komutları, işlemi yapmadan önce ne yapacaklarını listeler ve onay ister. Liste yalnızca istenen paketi değil, sürüklediği tüm bağımlılıkları ve kaldırılması gerekenleri içerir; okunmadan onaylanmamalıdır.

Sürüm Karşılaştırma

Bağımlılıklar “en az şu sürüm” biçiminde kısıt koyduğuna göre, sürümlerin karşılaştırılabilir olması gerekir. Karşılaştırma sözlük sırasıyla yapılamaz:

  • 1.10 sürümü 1.9’dan büyüktür, ama metin olarak karşılaştırılırsa küçük görünür.
  • 2.0 ile 2.0.0 çoğu kuralda eşit sayılır.
  • 1.0-beta sürümü 1.0’dan küçüktür; harf içeren ekler yayın öncesi anlamına gelir.

Bu yüzden her paket yöneticisi ailesinin tanımlı bir karşılaştırma algoritması vardır: sürüm dizesi sayısal ve harfli parçalara bölünür, sayısal parçalar sayı olarak, harfli parçalar sıralı olarak karşılaştırılır.

Bir de sıralamayı elle bozma gereği doğar. Bir yazılımın sürüm numaralandırma düzeni değiştiğinde, yeni sürüm eskisinden küçük görünebilir. Bunun için sürüm dizesinin önüne, karşılaştırmada her şeyden önce bakılan bir sayı eklenir; bu sayı arttığında sonraki tüm karşılaştırmalar yeni düzeni kazanır.

Paket Yöneticisi Sınıfları

Araçlar iki düzeyde çalışır ve ayrım her ailede vardır.

Alt düzey araç tek bir paket dosyasıyla ilgilenir: açar, dosyaları yerleştirir, veritabanına kaydeder. Bağımlılık çözmez; eksik bağımlılık varsa hata verir. Kurulu paketleri sorgulama işlemleri de bu düzeydedir.

Üst düzey araç depoları bilir, bağımlılıkları çözer, indirir ve alt düzey aracı çağırır. Kullanıcının gündelik olarak kullandığı araç budur.

Ayrım pratik bir sonuç doğurur: elde bir paket dosyası varsa ve alt düzey araçla kurulursa, bağımlılıklar eksik kalabilir. Doğru yaklaşım, dosyayı üst düzey araca vermektir; böylece eksik bağımlılıklar depodan tamamlanır.

Bir de sistem paket yöneticisinin dışında kalan bir alan vardır: programlama dillerinin kendi paket yöneticileri. İkisi ayrı veritabanı tutar ve birbirinden habersizdir. Aynı kütüphane her ikisiyle de kurulursa hangi kopyanın kullanıldığı belirsizleşir. Yaygın uygulama, dil düzeyindeki paketleri sistem dizinlerine değil projeye veya kullanıcıya özgü bir alana kurmaktır.

Özet

  • Paket, kurulacak dosyaları ve üstveriyi taşıyan arşivdir; üstveri bağımlılık, çakışma, özet ve kurulum betiği bilgilerini içerir.
  • Kurulu paket veritabanı, kaldırma, yükseltme ve dosya sahipliği sorgusunu mümkün kılan kayıttır.
  • Bağımlılıklar paylaşılan kütüphanelerin somut sonucudur; soyut yetenek adları farklı gerçekleştirimlerin birbirinin yerine geçmesini sağlar.
  • Kurulum bir kısıt problemidir; çözüm olmayabilir veya birden çok olabilir, bu yüzden araçlar işlem listesini onaya sunar.
  • Sürüm karşılaştırması sözlük sırasıyla yapılamaz; sürüm dizesi sayısal ve harfli parçalara bölünerek karşılaştırılır.
  • Alt düzey araç tek paketle ilgilenir ve bağımlılık çözmez; üst düzey araç depoları bilir ve çözümlemeyi yapar.

Sonraki Adım

Kavramlar kurulduğuna göre işlemlere geçilebilir. Sonraki ders, ailesi ne olursa olsun her paket yöneticisinde karşılığı bulunan işlem kümesini tanıtır: dizin güncelleme, kurma, kaldırma, yapılandırmayla birlikte kaldırma, sorgulama ve doğrulama — ve bu işlemlerin hangilerinin geri alınabilir olduğunu.

İlerlemeni kaydetmek ve not almak için Giriş yap

Notlarım

Not almak için giriş yapmalısın.

Aramak için yazmaya başlayın.

↑↓ Esc gezin · aç · kapat