İçeriğe geç
academia.sh

Ders 10 / 22

Önyükleyiciler

Önyükleyici yapılandırmasının parçaları, çekirdek seçimi ve önyükleme parametreleri kurulur; yirmi dört parametre değişikliğinin kaçının gerçekten iş gördüğü üç doğrulama yöntemiyle sayılır ve geri alınamaz işlemlerin güvenli sınama yolu gösterilir.

İçindekiler

Önceki ders devir zincirinin dört halkasını kurdu ve zincirin sonundaki araçlarla zincirin başındaki hatanın görülemediğini söyledi. Bu ders ikinci halkaya, önyükleyiciye döner. Hangi çekirdeğin yükleneceğini, yanında hangi geçici kökün geleceğini ve çekirdeğe hangi parametrelerin geçirileceğini o belirler.

Buradaki değişikliklerin bir özelliği vardır ve konunun tamamını biçimlendirir: etkileri ancak bir sonraki açılışta görülür. Yapılandırmayı yazan komut başarıyla döner, sistem çalışmaya devam eder, hiçbir şey değişmiş görünmez. Değişikliğin doğru olup olmadığı saatler ya da haftalar sonra, makine yeniden açıldığında anlaşılır. Ölçülen şey, “yapılandırma yazıldı” çıktısından çıkarılan “değişiklik etkili” tanısının kaç kez yanlış olduğudur.

Önyükleyici Girdisi Nelerden Oluşur

Önyükleyici, aralarından seçim yapılabilecek bir girdi listesi tutar. Her girdi dört parçadan oluşur: bir ad, bir çekirdek görüntüsü, o çekirdeğin yanında yüklenecek geçici kök dosya sistemi ve çekirdeğe geçirilecek parametre dizgisi. Aynı makinede birden çok girdi bulunması olağandır; yeni bir çekirdek kurulduğunda eskisi silinmez, listeye yeni bir girdi eklenir. Bu, en ucuz geri dönüş yoludur: yeni çekirdek açılmazsa menüden eski girdi seçilir.

Ürün yazılımının iki tarzı, girdilerin nerede durduğunu belirler. Bir tarzda önyükleyicinin ilk parçası diskin en başındaki tek bir sektöre yazılır; o sektöre sığmayan geri kalanı diskte başka bir yerdedir ve ilk parça onu adresiyle bulur. Diğer tarzda ürün yazılımı bir dosya sistemi okuyabilir; girdiler ayrı bir önyükleme bölümünde düz dosyalar olarak durur ve seçim ürün yazılımının kendi menüsünden yapılabilir. İki tarz aynı makinede yan yana bulunabilir ve bu, hangi yapılandırmanın gerçekten okunduğu sorusunu üretir.

Girdinin nasıl göründüğünü aşağıdaki döküm gösterir. Çalıştırılmamıştır; parçaların yerleşimini göstermek için yazılmış bir örnektir ve dosya biçimi önyükleyiciye göre değişir:

title    Kurgu sunucu
linux    /vmlinuz-kurgu
initrd   /initrd-kurgu.img
options  root=UUID=<kok-aygit-kimligi> ro quiet

linux satırı çekirdek görüntüsünü, initrd satırı geçici kökü, options satırı parametre dizgisini verir. Kök aygıt burada aygıt adıyla değil kalıcı bir kimlikle yazılmıştır; aygıt adları açılıştan açılışa değişebilir, kimlik değişmez. Aygıt adına dayanan bir girdi, makineye ikinci bir disk takıldığında açılmaz duruma gelebilir ve nedeni yapılandırmada görünmez.

Parametreler Ne Yapar

Parametre dizgisi çekirdeğe iletilir ve çekirdek tanımadığı parametreleri kendi kullanmaz, ilk sürece geçirir. Bu davranış konunun en önemli tuzağını üretir: yanlış yazılmış bir parametre hata vermez. Çekirdek onu tanımaz, ilk süreç de tanımaz, ikisi de sessizce yoluna devam eder. Dizgi çalışan sistemin çekirdek komut satırında görünür, göründüğü için de “uygulandı” sanılır.

Parametrelerin işlevleri birkaç öbekte toplanır. Bazıları kök aygıtı ve takma kipini söyler. Bazıları açılış iletilerinin ne kadarının ekrana basılacağını ayarlar. Bazıları bir donanım sürücüsünü devre dışı bırakır. Bazıları da ilk sürece hangi hedefe gitmesi gerektiğini söyler; önceki derste anılan kurtarma hedeflerine ulaşmanın yolu budur. Aynı işi iki farklı parametreyle söylemek mümkündür ve ikisi çeliştiğinde hangisinin kazanacağı sıraya bağlıdır — bu da sessiz bir yanlış davranış kaynağıdır.

Çalışan bir sistemde hangi parametrelerle açıldığı, çekirdeğin sunduğu bir dosyadan okunur. Aşağıdaki döküm çalıştırılmamıştır; okumanın ne döndürdüğünü göstermek için yazılmıştır:

$ cat /proc/cmdline
BOOT_IMAGE=/vmlinuz-kurgu root=UUID=<kok-aygit-kimligi> ro quiet gereksiz=deger

Satırın sonundaki gereksiz=deger uydurma bir parametredir; çekirdek onu tanımaz, ilk süreç de tanımaz, hiçbiri yakınmaz ve dizgi olduğu gibi burada durur. Bu satırı doğrulama olarak kullanan operatör, uydurma parametreyi de uygulanmış sayar. Ölçümdeki komut satırı okuması yöntemi tam olarak bu okumadır ve yanılma nedeni de tam olarak budur: dosya değişikliğin iletildiğini gösterir, iş gördüğünü göstermez.

Önyükleyicinin geri dönüş değeri, tuttuğu girdi listesi kadar menüsünü göstermesine de bağlıdır. Menü bir zaman aşımı süresiyle gelir: o süre içinde tuşa basılmazsa varsayılan girdi açılır. Süre sıfıra çekildiğinde menü hiç görünmez ve açılış birkaç saniye kısalır. Kazanılan birkaç saniyenin karşılığı, arıza anında elde kalan tek düzeltme yolunun kapanmasıdır: menü görünmüyorsa eski girdi seçilemez, tek seferlik düzenleme yapılamaz.

Bu takas uzaktaki bir sunucuda bir kez daha keskinleşir. Konsola erişimi olmayan bir makinede menü zaten kullanılamaz; oradaki geri dönüş yolu menü değil, bir sonraki açılışta bir kez geçerli olacak biçimde işaretlenmiş bir girdidir. Böyle bir girdi bir kez denenir, açılış başarılıysa kalıcı yapılır, başarısızsa makine kendiliğinden eski girdiye döner. Bu düzenek ölçümdeki “tek seferlik” satırın gerçek karşılığıdır.

Yıkıcı Sınır

Bu dersin bazı işlemleri geri alınamaz ve o işlemlerin komutları burada çalıştırılabilir tam biçimde yazılmaz. Sınırı çizen ölçüt şudur: işlemin sonucu, sistem bir daha açılmadan düzeltilemiyorsa komut tam yazılmaz.

Üç işlem bu sınırın içindedir. Birincisi, önyükleyicinin ilk parçasını diskin baştaki sektörüne yazmak: yanlış aygıt adı verildiğinde o aygıtın bölümleme tablosunun bulunduğu alan ezilir ve diskteki bütün bölümler adressiz kalır. İkincisi, önyükleyici yapılandırmasını bir üreticiyle yeniden oluşturmak: üretici mevcut dosyanın üzerine yazar, elle yapılmış değişiklikler kaybolur ve eski dosya geri gelmez. Üçüncüsü, kullanılmayan sanılan bir çekirdek girdisini silmek: silinen girdi tek çalışan girdiyse geri dönüş yolu ortadan kalkar.

Üçünün ortak yanı, hatanın o an görünmemesidir. Komut başarıyla döner, sistem çalışmaya devam eder, arıza bir sonraki açılışta ortaya çıkar. O anda elde durum sorgusu, birim listesi ve günlük yoktur; yalnız ekranda duran bir hata iletisi vardır.

Bu işlemlerin güvenli sınama yolu üç maddedir. Yapılandırma dosyasının bir kopyası alınır ve kopya, aynı makinede geri yüklenebilecek bir yerde tutulur. Değişiklik kalıcı yazılmadan önce önyükleyici menüsünde tek seferlik denenir; menüde yapılan düzenleme diske yazılmaz, yalnız o açılış için geçerlidir. Yeni girdi eklenir, eski girdi silinmez ve yeni girdi bir kez açıldıktan sonra kalıcı yapılır. Sanal bir makinede anlık görüntü alıp deneme yapmak, bu üç maddenin hepsini birden karşılayan dördüncü yoldur.

Ölçüm: Yirmi Dört Değişiklik

Önyükleyici yapılandırmasına yirmi dört değişiklik yapılıyor. Her değişikliğin gerçek sonucu dört türden biri: geçerli (istenen etkiyi yapar), yazım hatalı (tanınmaz, sessizce yok sayılır), çelişen (tanınır ama başka bir parametreyle çakışıp farklı davranış üretir) ve açılmaz (sistem bir daha açılmaz). Üç doğrulama yöntemi karşılaştırılıyor: üreticinin çıktısına bakmak, açılıştan sonra çekirdek komut satırını okumak ve parametrenin değiştirmesi beklenen davranışı gerçekten sınamak.

SV41 — üretici komutu yirmi dört değişikliğin hepsini başarıyla yazar ve hiçbirinde uyarı vermez. SV42 — değişikliğin türü tohumlu üreteçle seçilir. SV43 — yazım hatalı parametre çekirdek komut satırında görünür ama hiçbir etki yapmaz. SV44 — çelişen parametre de görünür ve beklenenden başka bir etki yapar. SV45 — açılmaz duruma düşüren değişiklik komut satırında hiç görünmez, çünkü sistem açılmamıştır. SV46 — komut satırı okuması yalnız dizginin varlığına bakar. SV47 — davranış sınaması parametrenin gerçek etkisini ölçer ve yanılmaz. SV48 — açılmayan bir önyükleme sistem günlüğüne hiçbir satır yazmaz. SV49 — kalıcı yazmada açılmayan her deneme harici ortamla kurtarma gerektirir. SV50 — tek seferlik denemede açılmayan deneme kurtarma gerektirmez; bir yeniden başlatma eski girdiye döner.

TOHUM = 20260218
TUR = ("gecerli", "yazim-hatasi", "celisen", "acilmaz")


def uretec(tohum):
    d = tohum

    def sonraki(n):
        nonlocal d
        d = (d * 1103515245 + 12345) % 2147483648
        return d % n
    return sonraki


def duzenlemeler(tohum=TOHUM, sayi=24):
    """Onyukleyici yapilandirmasina yapilan degisiklikler ve GERCEK sonuclari."""
    r = uretec(tohum)
    liste = []
    for i in range(sayi):
        a = r(100)
        tur = (TUR[0] if a < 50 else TUR[1] if a < 70
               else TUR[2] if a < 88 else TUR[3])
        liste.append({"no": i + 1, "tur": tur, "acilir": tur != "acilmaz",
                      "etkili": tur == "gecerli",
                      "satirda_gorunur": tur != "acilmaz"})
    return liste


def tani(d, yontem):
    """Uc dogrulama yonteminin 'degisiklik etkili mi' cevabi."""
    if yontem == "uretici ciktisi":
        return True
    if yontem == "komut satiri okumasi":
        return d["satirda_gorunur"]
    return d["etkili"]


def kurtarma(liste, kalici):
    """Kalici yazmada acilmayan her deneme harici ortamla kurtarma ister."""
    acilmayan = [d for d in liste if not d["acilir"]]
    return {"acilmayan": len(acilmayan),
            "kurtarma": len(acilmayan) if kalici else 0, "gunluk_satiri": 0}


D = duzenlemeler()
print("kahin:", len(D), "duzenleme |",
      {t: sum(1 for d in D if d["tur"] == t) for t in TUR})
print()
print("dogrulama yontemi      etkili der  gercekte etkili  yanlis tani")
for y in ("uretici ciktisi", "komut satiri okumasi", "davranis sinamasi"):
    der = sum(1 for d in D if tani(d, y))
    yt = sum(1 for d in D if tani(d, y) != d["etkili"])
    print(f"  {y:22s} {der:10d}  {sum(1 for d in D if d['etkili']):15d}  {yt:11d}")
print()
print("yazma bicimi  acilmayan  kurtarma olayi  geriye kalan gunluk satiri")
for kalici, ad in ((True, "kalici"), (False, "tek seferlik")):
    k = kurtarma(D, kalici)
    print(f"  {ad:12s} {k['acilmayan']:9d}  {k['kurtarma']:14d}"
          f"  {k['gunluk_satiri']:25d}")
kahin: 24 duzenleme | {'gecerli': 11, 'yazim-hatasi': 8, 'celisen': 2, 'acilmaz': 3}

dogrulama yontemi      etkili der  gercekte etkili  yanlis tani
  uretici ciktisi                24               11           13
  komut satiri okumasi           21               11           10
  davranis sinamasi              11               11            0

yazma bicimi  acilmayan  kurtarma olayi  geriye kalan gunluk satiri
  kalici               3               3                          0
  tek seferlik         3               0                          0

Üç Sayı

Kâhin: yirmi dört değişikliğin 11’i gerçekten iş görüyor; 8’i yazım hatalı, 2’si çelişen, 3’ü sistemi açılmaz duruma düşürüyor. Araç çıktısı: üretici komutu 24 değişikliğin hepsini yazdığını bildiriyor; çekirdek komut satırı okuması 21 değişikliği “uygulanmış” gösteriyor; davranış sınaması 11 diyor. Yanlış tanı: üretici çıktısına güvenen 13 kez, komut satırı okumasına güvenen 10 kez yanılıyor; davranış sınamasında yanlış tanı 0.

Ortadaki satır kursun ikinci iddiasının bu dersteki biçimidir. Komut satırı okuması üretici çıktısından daha ayrıntılıdır: gerçekten sisteme bakar, gerçekten dizgiyi görür, gerçekten yirmi bir satır üretir. Yanlış tanısı yalnız üçte bir azalıyor ve azalmanın tamamı, açılmayan üç denemenin kendiliğinden dışarıda kalmasından geliyor. Yazım hatalı sekiz değişiklik ile çelişen iki değişikliği bu yöntem hâlâ etkili sayıyor, çünkü ikisi de komut satırında görünüyor. Görünmek ile iş görmek arasındaki farkı yalnız üçüncü yöntem kapatıyor.

Üçüncü yöntemin pahalı olduğu doğrudur ve kolayına kaçılmasının nedeni budur. Bir parametrenin gerçekten iş gördüğünü sınamak, o parametrenin değiştirmesi beklenen davranışı ayrı ayrı ölçmeyi gerektirir: sürücü devre dışı bırakıldıysa aygıtın gerçekten görünmediğini, ileti düzeyi kısıldıysa iletilerin gerçekten azaldığını, hedef değiştirildiyse gerçekten o hedefe gidildiğini görmek gerekir. Yirmi dört değişiklik için yirmi dört ayrı sınama demektir. Buna karşılık üretici çıktısına bakmak tek satır okumaktır. Ölçünün söylediği şey, ucuz yöntemin on üç yanlış tanı bırakması ve bu on üçün onunun davranış sınanmadıkça hiç fark edilmeyecek olmasıdır; kalan üçü ise bir sonraki açılışta en sert biçimde fark edilir. Tanısı sınanmayan çıktı ölçülmemiş sayılır.

Bu dağılım, çalışma sırasının nasıl kurulacağını da söylüyor. Açılmaz duruma düşüren üç değişiklik en pahalı olanlardır ve onları yakalayan şey davranış sınaması değil, tek seferlik denemedir; bir kez açılıp geri dönen makine üçünü de bedelsiz açığa çıkarır. Sessizce etkisiz kalan on değişikliği ise yalnız davranış sınaması yakalar ve bu sınama açılıştan sonra, sistem ayaktayken yapılabilir. İki yöntem birbirinin yerine geçmez; biri açılışı, diğeri etkiyi sınar. Yalnız birini yapan operatör, ölçünün yarısını yapmış olur.

Kanıt Nerede Kalıyor

İkinci tablo kursun üçüncü iddiasını ödüyor. Kalıcı yazmada üç deneme sistemi açılmaz duruma düşürüyor ve üçü de harici ortamla kurtarma gerektiriyor. Tek seferlik denemede aynı üç deneme yine açılmıyor, ama kurtarma olayı 0: bir yeniden başlatma eski girdiye döndürüyor.

İki satırın ortak sütunu daha çarpıcı. Her iki durumda da geriye kalan günlük satırı 0. Açılmayan bir önyükleme sistem günlüğüne hiçbir şey yazmaz, çünkü günlüğü tutan birim henüz çalışmamış ve çoğu yapılandırmada günlüğün yazılacağı dosya sistemi henüz takılmamıştır. Kanıt yalnız ekranda kalır; ekranda kalan kanıt bir sonraki açılışta silinir. Geç bakan az görür; burada geç bakan hiç görmez.

Bu yüzden önyükleyici denemesinin doğru yeri, kanıtın kaydedilebildiği bir yerdir: konsolu kaydedilen bir sanal makine, uzaktan erişilen bir konsol ya da yanında bir kişi bulunan bir makine. Kanıt üretmeyen bir deneme, sonucu ne olursa olsun ölçülmemiş sayılır.

Kurtarma sütununun aradaki farkı da tek başına anlatmaya yetiyor. Kalıcı yazmada üç kurtarma olayının her biri, makineye fiziksel ya da konsol düzeyinde erişim, harici bir ortamdan açılış ve elle düzeltme demektir; uzaktaki bir sunucuda bu, bir insanın makinenin başına gitmesi anlamına gelir. Tek seferlik denemede aynı üç arıza, yalnız bir yeniden başlatma kadar sürer. Değişikliğin içeriği ikisinde de aynı, kâhin ikisinde de aynı; farklı olan tek şey denemenin nasıl yazıldığı. Yanlış tanının bedeli, tanının kendisinden çok onu üreten yönteme bağlı.

İkinci Tohum

Değişiklik türleri tohumlu seçildiği için dağılım tohuma bağlı. İkinci tohumla (20260219) yirmi dört değişiklik 12 geçerli, 5 yazım hatalı, 5 çelişen ve 2 açılmaz çıkıyor. Yanlış tanı sayıları üretici çıktısında 13 ve 12, komut satırı okumasında 10 ve 10, davranış sınamasında 0 ve 0. Büyüklük düzeni korunuyor ve yöntemlerin sırası her iki tohumda aynı. Açılmaz duruma düşen deneme sayısı 3 ve 2; bu sayı küçük olduğu için kurguya bağlıdır ve tek bir koşumdan genellenmez. Genellenebilecek olan, açılmayan denemenin günlük satırının her koşumda sıfır olması.

Özet

  • Önyükleyici girdisi dört parçadır: ad, çekirdek görüntüsü, geçici kök ve parametre dizgisi. Yeni çekirdek eski girdiyi silmez; menüdeki eski girdi en ucuz geri dönüş yoludur.
  • Kök aygıt kalıcı kimlikle yazılır; aygıt adları açılıştan açılışa değişebilir.
  • Yanlış yazılmış bir parametre hata vermez, çekirdek komut satırında görünür ve göründüğü için uygulanmış sanılır.
  • Yirmi dört değişikliğin 11’i iş görüyor; üretici çıktısına güvenmek 13, komut satırı okuması 10, davranış sınaması 0 yanlış tanı üretiyor. Daha ayrıntılı okuma tanıyı yalnız üçte bir düzeltiyor.
  • Açılmayan önyükleme sistem günlüğüne 0 satır bırakır; kanıt ekranda kalır ve bir sonraki açılışta silinir.
  • Kalıcı yazma açılmayan üç denemede 3 kurtarma olayı üretir, tek seferlik deneme 0; değişiklik kalıcı yazılmadan önce menüde denenir ve eski girdi silinmez.

Sonraki Adım

Bu konu birim modelini kurdu, durum sözcüğünün ne sakladığını saydı, politikanın gizlediğini ölçtü, önyükleme zincirini çıkardı ve zincirin başındaki değişikliklerin nasıl sınanacağını gösterdi. Beş dersin ortak sonucu tek cümledir: servis yöneticisinin bastığı satır, sistemin durumunun bir izdüşümüdür ve izdüşüm her zaman kayıp taşır. Son derste kaybın en sert biçimi görüldü: kanıtın hiç yazılmaması. Sıradaki konu tam olarak buradan başlar ve yazılan kanıtı inceler — sistem günlüğü ile servis günlüklerinin nasıl toplandığını, nasıl sorgulandığını ve döndürme yüzünden nasıl kendiliğinden yok olduğunu ölçer.

İ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