---
title: Önyükleyiciler
source: 'https://academia.sh/tr/kurslar/sistem-yonetimi/onyukleyiciler'
course: 'Sistem Yönetimi'
language: tr
updated: '2026-08-17T18:10:05+00:00'
license: 'CC BY-SA 4.0'
---

# Ö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.

Ö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:

```text
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:

```text
$ 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.

## Menü ve Zaman Aşımı

Ö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.

```python
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.
