Bölüm 16: Linux

İşletim Sistemleri · Çalışma Soruları
Tarihçe ve KabukSüreçler ve SinyallerÇizelgeleme ve Önyükleme/proc ve Süreç BilgisiDosya Sistemleriİzinler ve Konteynerler
Sercan KÜLCÜ · Giresun Üniversitesi

Giriş

Nasıl Çalışalım?

1 · Önce çözünHer slaytta bir soru var. Cevabı açmadan önce kâğıda kendi cevabınızı ve gerekçenizi yazın.
2 · Sonra açın“Cevabı göster” kutusu doğru seçeneği ve kısa bir açıklamayı verir. Yanlış seçeneklerin neden yanlış olduğunu da düşünün.
3 · Adım adım izleyinHesap ve kod sorularından sonra gelen “Adım Adım Çözüm” slaytında ‹ › düğmeleriyle çözümü ilerletin.

Kurallar (aksi belirtilmedikçe): komutlar bash kabuğunda, sıradan bir kullanıcıyla çalıştırılır; C örneklerinde gerekli başlık dosyaları eklenmiş kabul edilir ve sistem çağrıları başarılıdır.

Soru 1 · Tarihçe ve Kabuk

Linux Nasıl Doğdu?

Çoktan seçmeli

Linux çekirdeğinin ortaya çıkışı için hangisi doğrudur?

  1. AT&T’nin UNIX kaynak kodunun doğrudan kopyalanmasıyla yazıldı.
  2. Linus Torvalds çekirdeği MINIX üzerinde geliştirdi; çekirdek GNU projesinin derleyici, kabuk ve araçlarıyla birleşerek kullanılabilir bir sistem oldu.
  3. Berkeley’deki BSD ekibinin bir alt projesidir.
  4. Tanenbaum’un yazdığı MINIX’in yeni adıdır.
  5. Baştan bir mikroçekirdek olarak tasarlandı.
Cevabı göster

Doğru cevap: B) Linus Torvalds çekirdeği MINIX üzerinde geliştirdi; çekirdek GNU projesinin derleyici, kabuk ve araçlarıyla birleşerek kullanılabilir bir sistem oldu.

Linux UNIX kodu içermez; POSIX arayüzünü yeniden gerçekler. Tanenbaum MINIX’i öğretim için yazmıştı; Torvalds onun üzerinde kendi monolitik çekirdeğini geliştirdi ve GNU araçlarıyla birleştirdi. Bu yüzden tam sistem için “GNU/Linux” adı da kullanılır.

Soru 2 · Tarihçe ve Kabuk

“Linux” Neyin Adı?

Doğru / Yanlış

Aşağıdaki ifade doğru mu, yanlış mı? Gerekçenizi yazın.

““Linux” sözcüğü tam anlamıyla Ubuntu, Fedora ya da Pardus gibi bir dağıtımın bütününün adıdır.”

Cevabı göster

Yanlış. Linux tam olarak yalnızca çekirdeğin adıdır. Dağıtım çekirdeğe C kütüphanesi (glibc, musl), kabuk ve araçlar, paket yöneticisi (apt, dnf, pacman), init sistemi (systemd) ve masaüstü ekler. Android de Linux çekirdeğini kullanır ama GNU kullanıcı alanı yoktur.

Soru 3 · Tarihçe ve Kabuk

Boru Hattının Çıktısı

Kod izleme

Aşağıdaki komut ne yazdırır? sort komutu uniq -c’den önce neden gereklidir?

printf "b\na\nb\nc\na\nb\n" | sort | uniq -c | sort -rn | head -1
  1. 3 b
  2. 2 a
  3. 1 c
  4. 3 a
Cevabı göster

Doğru cevap: A) 3 b

      3 b

uniq -c yalnızca ardışık tekrarları sayar; önce sort aynı satırları yan yana getirmezse b’ler üç ayrı grup olarak sayılırdı. sort -rn sayıya göre büyükten küçüğe dizer, head -1 ilk satırı alır.

Soru 3 · Çözüm

Adım Adım Çözüm

Kabuk 5 süreç ve 4 boru kurar; her aşama yalnızca kendi stdin’ini okur, stdout’una yazar.

printf → b a b c a bsort → a a b b b cuniq -c → 2 a | 3 b | 1 csort -rn → 3 b | 2 a | 1 chead -1 → 3 b

printf altı satır üretir; sort tüm girdiyi okuduktan sonra sıralı yazar.

printf → b a b c a bsort → a a b b b cuniq -c → 2 a | 3 b | 1 csort -rn → 3 b | 2 a | 1 chead -1 → 3 b

uniq -c ardışık aynı satırları sayıp “sayı satır” biçiminde yazar.

printf → b a b c a bsort → a a b b b cuniq -c → 2 a | 3 b | 1 csort -rn → 3 b | 2 a | 1 chead -1 → 3 b

Sayıya göre ters sıralanır (-n sayısal, -r ters); head -1 en sık satırı bırakır: 3 b.

Soru 4 · Tarihçe ve Kabuk

Yönlendirmenin Sırası

Çoktan seçmeli

/yok dizini mevcut değil. Hangi komutta ls’in hata mesajı ekrana yazılır, dosyaya gitmez?

  1. ls /yok /tmp > cikti.txt 2>&1
  2. ls /yok /tmp 2>&1 > cikti.txt
  3. ls /yok /tmp &> cikti.txt
  4. ls /yok /tmp 2> cikti.txt
Cevabı göster

Doğru cevap: B) ls /yok /tmp 2>&1 > cikti.txt

Yönlendirmeler soldan sağa uygulanır. B’de 2>&1 önce stderr’i stdout’un o anki hedefine (terminal) kopyalar; ardından yalnızca stdout dosyaya çevrilir. A’da önce stdout dosyaya gider, sonra stderr ona eşlenir; C ikisini birden, D yalnız stderr’i dosyaya yollar.

Soru 5 · Tarihçe ve Kabuk

Boru Uçlarını Kapatmak

Açık uçlu

Kabuk ls | wc -l satırını pipe, fork, dup2 ve exec ile kurar. Adımları sırayla yazın. Kabuk kendi elindeki yazma ucunu kapatmayı unutursa ne olur?

Cevabı göster
  1. pipe(fd): okuma ucu (ör. 3) ve yazma ucu (4).
  2. 1. çocuk: dup2(4, 1), fazla uçları kapatır, exec("ls").
  3. 2. çocuk: dup2(3, 0), fazla uçları kapatır, exec("wc").
  4. Kabuk iki ucu da kapatır ve iki çocuğu wait ile bekler.

Yazma ucu herhangi bir süreçte açık kaldıkça wc EOF görmez: ls bitse bile wc sonsuza dek bekler, kabuk da onu.

Soru 6 · Süreçler ve Sinyaller

fork Sonrası Değişkenler

Kod izleme

Program ne yazdırır? Çıktı sırası her çalıştırmada aynı mıdır?

int main(void) {
    int x = 5;
    pid_t p = fork();
    if (p == 0) {
        x += 10;
        printf("çocuk %d\n", x);
        exit(0);
    }
    waitpid(p, NULL, 0);
    x -= 1;
    printf("ebeveyn %d\n", x);
    return 0;
}
  1. çocuk 15, ebeveyn 14
  2. çocuk 15, ebeveyn 4
  3. ebeveyn 4, çocuk 15 (sıra belirsiz)
  4. çocuk 15, ebeveyn 5
Cevabı göster

Doğru cevap: B) çocuk 15, ebeveyn 4

çocuk 15
ebeveyn 4

fork sonrası iki sürecin ayrı adres uzayı vardır (COW): çocuğun x += 10’u ebeveyni etkilemez. Ebeveyn waitpid’de çocuğu beklediği için sıra her zaman aynıdır.

Soru 6 · Çözüm

Adım Adım Çözüm

E: ebeveyn (PID 700), Ç: çocuk (PID 701). fork bir kez çağrılır, iki kez döner.

Tek süreç var; x = 5.

fork: ebeveynde p = çocuğun PID’i, çocukta p = 0. Sayfalar paylaşılır, yazılınca kopyalanır.

Hangisi önce CPU alırsa alsın, ebeveyn çocuk bitene kadar waitpid’de bloke kalır.

Çocuk kendi x kopyasını 15 yapar ve yazar. Ebeveynin x’i hâlâ 5.

Çocuk biter; çıkış durumu okunana kadar zombidir, ebeveyne SIGCHLD gider.

waitpid döner, zombi toplanır. Ebeveyn x’i 4 yapar ve yazar.

int main(void) {
    int x = 5;
    pid_t p = fork();
    if (p == 0) {
        x += 10;
        printf("çocuk %d\n", x);
        exit(0);
    }
    waitpid(p, NULL, 0);
    x -= 1;
    printf("ebeveyn %d\n", x);
    return 0;
}

Soru 7 · Süreçler ve Sinyaller

Kaç Süreç Oluşur?

Kod izleme

main içinde yalnızca aşağıdaki iki satır var. Program sonunda kaç tane x yazılır (ilk süreç dahil kaç süreç çalışır)?

if (fork() && fork())
    fork();
printf("x\n");
  1. 3
  2. 4
  3. 6
  4. 8
Cevabı göster

Doğru cevap: B) 4

4. && kısa devre yapar: ilk fork’ta çocuk 0 alır, koşul yanlıştır, başka fork yapmaz. Ebeveyn ikinci fork’u yapar; oradaki çocuk da 0 alıp çıkar. Yalnız ilk süreç üçüncü fork’a ulaşır. Toplam: ilk süreç + 3 çocuk = 4 süreç, 4 satır.

Soru 7 · Çözüm

Adım Adım Çözüm

a && b: a yanlışsa (0) b hiç değerlendirilmez. fork çocuğa 0, ebeveyne pozitif PID döndürür.

fork #1: P → Ç1 (Ç1’de sonuç 0 → koşul yanlış)fork #2: yalnız P yapar → Ç2 (Ç2’de 0 → yanlış)koşul P’de doğru → fork #3: P → Ç3printf: P, Ç1, Ç2, Ç3 → 4 satır

İlk fork iki süreç yaratır. Çocukta sonuç 0 olduğundan && kısa devre yapar: Ç1 doğrudan printf’e gider.

fork #1: P → Ç1 (Ç1’de sonuç 0 → koşul yanlış)fork #2: yalnız P yapar → Ç2 (Ç2’de 0 → yanlış)koşul P’de doğru → fork #3: P → Ç3printf: P, Ç1, Ç2, Ç3 → 4 satır

Ebeveynde ilk sonuç pozitif; ikinci fork çağrılır. Ç2’de sonuç 0, koşul yanlış.

fork #1: P → Ç1 (Ç1’de sonuç 0 → koşul yanlış)fork #2: yalnız P yapar → Ç2 (Ç2’de 0 → yanlış)koşul P’de doğru → fork #3: P → Ç3printf: P, Ç1, Ç2, Ç3 → 4 satır

Yalnız P’de iki sonuç da pozitif: üçüncü fork Ç3’ü yaratır. printf’i 4 süreç çalıştırır.

Soru 8 · Süreçler ve Sinyaller

Yakalanamayan Sinyal

Çoktan seçmeli

Bir süreç sigaction ile aşağıdaki sinyallerden hangisi için işleyici kuramaz ya da onu yok sayamaz?

  1. SIGINT (Ctrl-C)
  2. SIGTERM (kill komutunun varsayılanı)
  3. SIGKILL (kill -9)
  4. SIGHUP
  5. SIGUSR1
Cevabı göster

Doğru cevap: C) SIGKILL (kill -9)

SIGKILL ve SIGSTOP yakalanamaz, engellenemez, yok sayılamaz; yöneticinin süreci her durumda durdurabilmesi için. kill PID varsayılan olarak SIGTERM (15) gönderir: süreç kaynaklarını temizleyip nazikçe çıkabilir. Önce SIGTERM, ancak gerekirse SIGKILL denenmelidir.

Soru 9 · Süreçler ve Sinyaller

Çocuk Bitince Ne Kalır?

Doğru / Yanlış

Aşağıdaki ifade doğru mu, yanlış mı? Gerekçenizi yazın.

“Ebeveyni henüz wait çağırmamışken sonlanan bir çocuk süreç, çekirdek tablolarından hemen ve tamamen silinir.”

Cevabı göster

Yanlış. Çocuğun belleği ve dosyaları serbest bırakılır, ama PID’i ve çıkış durumu ebeveyn okuyana kadar saklanır: süreç zombi (Z) olur. Ebeveyn hiç beklemezse zombiler birikir; ebeveyn ölürse çocuk PID 1’e (ya da bir alt toplayıcıya) devredilir ve orada toplanır.

Soru 10 · Süreçler ve Sinyaller

Süreç ve İş Parçacığı Linux’ta

Çoktan seçmeli

Linux’ta süreç ile iş parçacığı arasındaki ilişki için hangisi doğrudur?

  1. Çekirdekte iş parçacıkları için ayrı, süreçlerden tamamen farklı bir yapı vardır.
  2. İkisi de bir görevdir (task_struct); fark clone() bayraklarıyla neyin paylaşıldığıdır. İş parçacıkları CLONE_VM, CLONE_FILES, CLONE_SIGHAND, CLONE_THREAD ile adres uzayını ve tanımlayıcıları paylaşır, aynı TGID’dedir.
  3. İş parçacıkları yalnızca kullanıcı alanında vardır; çekirdek onları bilmez (N:1 model).
  4. fork() ile oluşturulan çocuk ebeveynle aynı adres uzayını paylaşır.
Cevabı göster

Doğru cevap: B) İkisi de bir görevdir (task_struct); fark clone() bayraklarıyla neyin paylaşıldığıdır. İş parçacıkları CLONE_VM, CLONE_FILES, CLONE_SIGHAND, CLONE_THREAD ile adres uzayını ve tanımlayıcıları paylaşır, aynı TGID’dedir.

NPTL 1:1 modelidir: her pthread bir çekirdek görevidir. Kullanıcının gördüğü PID aslında TGID’dir. fork ise her yapının kopyasını alan (bellek COW) bir clone’dur.

Soru 11 · Çizelgeleme ve Önyükleme

Hangi Sınıf Önce?

Çoktan seçmeli

Aynı CPU’da aynı anda üç görev hazır: biri SCHED_DEADLINE, biri SCHED_FIFO (öncelik 50), biri normal (SCHED_OTHER, nice −20). Çizelgeleyici önce hangisini çalıştırır?

  1. nice −20 olan normal görev, çünkü nice değeri en düşüktür
  2. SCHED_FIFO görevi
  3. SCHED_DEADLINE görevi
  4. Üçü eşit pay alır
Cevabı göster

Doğru cevap: C) SCHED_DEADLINE görevi

Çizelgeleme sınıfları sırayla sorulur: deadline > gerçek zamanlı (FIFO/RR) > adil (EEVDF) > boşta. Üst sınıfta hazır görev varken alttakiler beklemek zorundadır. nice yalnızca adil sınıfın içindeki payı etkiler.

Soru 12 · Çizelgeleme ve Önyükleme

nice ve Sanal Çalışma Süresi

Hesaplama

Adil sınıfta ağırlıklar: nice 0 → 1024, nice 5 → 335, nice −5 → 3121. Sanal çalışma süresi artışı Δv = gerçek süre × 1024 / ağırlık. (a) Her görev 6 ms çalışırsa vruntime’ı ne kadar ilerler? (b) Sürekli hazır bir nice 0 ve bir nice 5 görevi tek CPU’yu yaklaşık hangi oranda paylaşır?

Cevabı göster
  • (a) nice 0: 6 × 1024 / 1024 = 6 ms; nice 5: 6 × 1024 / 335 ≈ 18,34 ms; nice −5: 6 × 1024 / 3121 ≈ 1,97 ms.
  • (b) Pay ağırlıkla orantılıdır: 1024 / (1024 + 335) ≈ %75,3 ve 335 / 1359 ≈ %24,7.

Düşük ağırlıklı görevin vruntime’ı hızlı ilerlediği için daha seyrek seçilir; EEVDF ayrıca yalnızca “uygun” (v ≤ V) görevler arasında en erken sanal son tarihi seçer.

Soru 12 · Çözüm

Adım Adım Çözüm

Sanal zaman, gerçek zamanın ağırlıkla ölçeklenmiş hâlidir; çizelgeleyici geride kalanı öne alır.

nice 0: Δv = 6 × 1024 / 1024 = 6 msnice 5: Δv = 6 × 1024 / 335 ≈ 18,34 msnice −5: Δv = 6 × 1024 / 3121 ≈ 1,97 mspay = 1024 / (1024 + 335) ≈ %75,3

nice 0 için ağırlık 1024: sanal zaman gerçek zamanla aynı hızda ilerler.

nice 0: Δv = 6 × 1024 / 1024 = 6 msnice 5: Δv = 6 × 1024 / 335 ≈ 18,34 msnice −5: Δv = 6 × 1024 / 3121 ≈ 1,97 mspay = 1024 / (1024 + 335) ≈ %75,3

nice 5 görev aynı 6 ms için ≈ 3 kat, nice −5 görev ≈ 3 kat yavaş “yaşlanır”.

nice 0: Δv = 6 × 1024 / 1024 = 6 msnice 5: Δv = 6 × 1024 / 335 ≈ 18,34 msnice −5: Δv = 6 × 1024 / 3121 ≈ 1,97 mspay = 1024 / (1024 + 335) ≈ %75,3

Uzun vadede her görev ağırlığı oranında CPU alır: ≈ %75 ve ≈ %25.

Soru 13 · Çizelgeleme ve Önyükleme

Önyükleme Sırası

Çoktan seçmeli

Bir Linux makinesinin açılışı için doğru sıra hangisidir?

  1. systemd → UEFI → önyükleyici → çekirdek → initramfs
  2. UEFI ürün yazılımı → önyükleyici (çekirdek + initramfs yüklenir) → çekirdek başlatma → initramfs gerçek kökü bağlar → PID 1 (systemd) servisleri başlatır → giriş
  3. Önyükleyici → UEFI → systemd → çekirdek → giriş
  4. Çekirdek → UEFI → initramfs → önyükleyici → systemd
Cevabı göster

Doğru cevap: B) UEFI ürün yazılımı → önyükleyici (çekirdek + initramfs yüklenir) → çekirdek başlatma → initramfs gerçek kökü bağlar → PID 1 (systemd) servisleri başlatır → giriş

initramfs, kök dosya sistemini bağlamak için gereken sürücüleri (NVMe, RAID, şifreli disk) çekirdek bağlamadan önce RAM’de sağlar ve switch_root yapar. Güvenli önyükleme açıksa her aşama bir sonrakinin imzasını doğrular.

Soru 14 · /proc ve Süreç Bilgisi

Boyutu Sıfır Görünen Dosya

Çoktan seçmeli

ls -l /proc/meminfo dosya boyutunu 0 gösteriyor, ama cat /proc/meminfo onlarca satır yazıyor. Bunun nedeni nedir?

  1. Dosya sıkıştırılmış olarak diskte saklanır.
  2. /proc diskte yer kaplamayan sanal bir dosya sistemidir (procfs); içerik her okumada çekirdek tarafından o anki değerlerle üretilir.
  3. Dosya yalnızca root’a görünür olduğu için boyutu gizlenir.
  4. ls komutu metin dosyalarının boyutunu göstermez.
Cevabı göster

Doğru cevap: B) /proc diskte yer kaplamayan sanal bir dosya sistemidir (procfs); içerik her okumada çekirdek tarafından o anki değerlerle üretilir.

procfs’teki dosyalar çekirdek veri yapılarına açılan pencerelerdir: ps, top ve free verilerini buradan okur. Aynı fikir “her şey dosyadır” ilkesinin bir uygulamasıdır; ayrıntılı aygıt modeli ise /sys (sysfs) altındadır.

Soru 15 · /proc ve Süreç Bilgisi

Açık Dosyaları Nerede Görürüz?

Çoktan seçmeli

PID’i 4321 olan bir sunucu sürecinin şu an hangi dosyaları ve soketleri açık tuttuğunu görmek istiyorsunuz. En doğrudan kaynak hangisidir?

  1. /proc/4321/maps
  2. /proc/4321/fd/ dizini
  3. /proc/sys/fs/file-max
  4. /proc/filesystems
  5. /etc/fstab
Cevabı göster

Doğru cevap: B) /proc/4321/fd/ dizini

/proc/PID/fd/ altında her açık dosya tanımlayıcısı için bir sembolik bağ bulunur (0, 1, 2, 3 …); hedefi dosya yolunu ya da socket:[…] biçimini gösterir. maps bellek eşlemelerini, file-max sistem geneli sınırı, filesystems desteklenen dosya sistemi türlerini verir.

Soru 16 · /proc ve Süreç Bilgisi

Yanlış Eşleştirme

Çoktan seçmeli

Aşağıdaki /proc yolu ile içeriği eşleştirmelerinden hangisi yanlıştır?

  1. /proc/PID/maps → sürecin sanal bellek bölgeleri (kod, öbek, yığın, kütüphaneler) ve izinleri
  2. /proc/PID/status → durum, PPid, uid/gid, bellek kullanımı gibi okunabilir özet
  3. /proc/PID/cmdline → süreci başlatan komut satırı argümanları
  4. /proc/sys/vm/swappiness → çalışırken okunup değiştirilebilen bir çekirdek parametresi
  5. /proc/loadavg → çekirdek sürümü ve derleyici bilgisi
Cevabı göster

Doğru cevap: E) /proc/loadavg → çekirdek sürümü ve derleyici bilgisi

/proc/loadavg son 1, 5 ve 15 dakikanın yük ortalamalarını ve çalışabilir/toplam görev sayısını verir. Çekirdek sürümü ve derleme bilgisi /proc/version dosyasındadır.

Soru 17 · /proc ve Süreç Bilgisi

/proc/self Kimi Gösterir?

Kod izleme

Kabukta echo $$ komutu 4100 yazdırıyor. Ardından aşağıdaki komut çalıştırılıyor. Çıkan Pid ve PPid değerleri için hangisi doğrudur?

cat /proc/self/status | grep -E "^(Pid|PPid):"
  1. Pid 4100, PPid 1
  2. Pid cat’in PID’i (4100 değil), PPid 4100
  3. Pid grep’in PID’i, PPid cat’in PID’i
  4. Pid 4100, PPid 4100
Cevabı göster

Doğru cevap: B) Pid cat’in PID’i (4100 değil), PPid 4100

/proc/self, dosyayı açan sürecin kendi dizinidir; dosyayı cat açar. Kabuk boru hattındaki her komut için ayrı çocuk süreç oluşturduğundan Pid cat’in yeni PID’idir, PPid ise kabuğun PID’i olan 4100’dür.

Soru 18 · /proc ve Süreç Bilgisi

Çekirdek Parametresini Değiştirmek

Çoktan seçmeli

Hangi komut, root olarak çalıştırıldığında sysctl -w vm.swappiness=10 ile aynı etkiyi yapar?

  1. echo 10 > /proc/sys/vm/swappiness
  2. echo 10 > /proc/meminfo
  3. echo vm.swappiness=10 >> /proc/version
  4. chmod 10 /proc/sys/vm
Cevabı göster

Doğru cevap: A) echo 10 > /proc/sys/vm/swappiness

sysctl adındaki noktalar /proc/sys altındaki dizin ayırıcılarına karşılık gelir. Bu değişiklik bir sonraki açılışa kadar geçerlidir; kalıcı olması için /etc/sysctl.d/ altındaki bir dosyaya yazılır. meminfo ve version salt okunurdur.

Soru 19 · /proc ve Süreç Bilgisi

Yetim Sürecin Ebeveyni

Doğru / Yanlış

Aşağıdaki ifade doğru mu, yanlış mı? Gerekçenizi yazın.

“Ebeveyni sonlanan ama kendisi çalışmaya devam eden bir sürecin PPID değeri 0 olur ve süreç ağacının dışında kalır.”

Cevabı göster

Yanlış. Yetim süreç ölmeden önce yeniden ebeveynlenir: PID 1’e (systemd) ya da kendini “alt toplayıcı” ilan etmiş bir sürece devredilir; PPID buna göre güncellenir. Böylece çocuk bittiğinde onu wait ile toplayacak biri her zaman vardır. pstree -p ve ps -ef --forest bu ebeveyn–çocuk ilişkisini ağaç olarak gösterir.

Soru 20 · /proc ve Süreç Bilgisi

Her Şey Dosyadır

Açık uçlu

Linux süreç ve çekirdek bilgisini neden özel sistem çağrıları yerine /proc ve /sys altında dosya olarak sunar? Bu tasarımın iki yararını ve bir sınırını yazın.

Cevabı göster
  • Yarar 1: aynı araçlar her yerde çalışır: cat, grep, kabuk betikleri, yönlendirme. Yeni bir bilgi için yeni sistem çağrısı gerekmez.
  • Yarar 2: erişim denetimi dosya izinleriyle yapılır (ör. başka kullanıcının /proc/PID/environ’u okunamaz; /proc/sys’e yalnız root yazar).
  • Sınır: metin biçimini her okumada ayrıştırmak yavaştır ve biçim değişirse araçlar bozulabilir; bazı aygıt işlemleri dosya modeline sığmaz ve ioctl gibi “kaçış kapılarına” yığılır.

Soru 21 · Dosya Sistemleri

Sert ve Sembolik Bağ

Kod izleme

Komutlar sırayla çalıştırılıyor (stat -c %h sert bağ sayısını yazar). Çıktıyı yazın.

echo veri > a.txt
ln a.txt b.txt
ln -s a.txt c.txt
stat -c %h b.txt
rm a.txt
stat -c %h b.txt
cat b.txt
cat c.txt
  1. 2, 1, veri, hata (c.txt sarkar)
  2. 2, 2, veri, veri
  3. 1, 1, hata, veri
  4. 2, 1, hata, hata
Cevabı göster

Doğru cevap: A) 2, 1, veri, hata (c.txt sarkar)

Son satır: “Böyle bir dosya ya da dizin yok”. Sert bağ aynı i-node’a ikinci addır: rm bir adı siler, sayaç 1’e iner, veri kalır. Sembolik bağ hedefin yolunu tutar; hedef silinince sarkar.

Soru 21 · Çözüm

Adım Adım Çözüm

i-node 500: verinin bulunduğu i-node. c.txt kendi i-node’u olan küçük bir dosyadır, içinde “a.txt” yolu yazar.

a.txt oluşturulur; i-node 500, bağ sayısı 1.

Sert bağ: b.txt dizine aynı i-node numarasıyla eklenir.

Sembolik bağ: ayrı bir i-node, içeriği hedef yol. i500’ün sayacı değişmez.

b.txt’nin i-node’unda bağ sayısı 2.

rm (unlink) a.txt adını siler; sayaç 1. Veri, sayaç 0 olana ve açık fd kalmayana kadar serbest bırakılmaz.

b.txt veriye hâlâ ulaşır.

c.txt “a.txt” yolunu çözmeye çalışır; ad yok: bağ sarkar.

echo veri > a.txt
ln a.txt b.txt
ln -s a.txt c.txt
stat -c %h b.txt
rm a.txt
stat -c %h b.txt
cat b.txt
cat c.txt

Soru 22 · Dosya Sistemleri

Paylaşılan Dosya Konumu

Hesaplama

Bir süreç fd = open("kayit.dat", O_RDONLY) yapıyor, ardından read(fd, buf, 100). Sonra fork() çağrılıyor; çocuk read(fd, buf, 40) yapıp çıkıyor. Ebeveyn çocuğu bekledikten sonra lseek(fd, 0, SEEK_CUR) çağırırsa ne döner?

  1. 100
  2. 140
  3. 40
  4. 0
Cevabı göster

Doğru cevap: B) 140

140. fork çocuğa tanımlayıcı tablosunun kopyasını verir, ama iki tablo da aynı açık dosya nesnesini (struct file) gösterir; konum (f_pos) bu nesnededir. Çocuğun 40 baytlık okuması ebeveynin konumunu da ilerletir. İlgisiz bir süreç dosyayı ayrıca açsaydı kendi konumu olurdu.

Soru 23 · Dosya Sistemleri

ext4 Sıralı Günlükleme

Çoktan seçmeli

ext4’ün varsayılan data=ordered kipinde bir dosyaya yazılıp fsync yapıldığında hangisi doğrudur?

  1. Veri de üst veri de önce günlüğe, sonra asıl yerlerine yazılır.
  2. Veri blokları önce asıl yerlerine yazılır; üst veri (i-node, bit eşlem, extent) günlüğe bir işlem olarak yazılır ve commit kaydıyla kalıcı olur.
  3. Hiçbir şey günlüğe yazılmaz; çökme sonrası tam fsck taraması yapılır.
  4. Yalnızca veri blokları günlüğe yazılır; üst veri hiç korunmaz.
Cevabı göster

Doğru cevap: B) Veri blokları önce asıl yerlerine yazılır; üst veri (i-node, bit eşlem, extent) günlüğe bir işlem olarak yazılır ve commit kaydıyla kalıcı olur.

Veri önce yazıldığı için üst veri hiçbir zaman çöp içeren bir bloğu göstermez. Çökme sonrası commit’li işlemler yeniden oynatılır, yarım kalanlar atılır; saniyeler içinde tutarlılık sağlanır. data=journal veriyi de günlüğe yazar (en güvenli, en yavaş).

Soru 24 · Dosya Sistemleri

st_ctime Oluşturma mı?

Doğru / Yanlış

Aşağıdaki ifade doğru mu, yanlış mı? Gerekçenizi yazın.

“stat çıktısındaki st_ctime alanı dosyanın oluşturulduğu (creation) zamanı gösterir.”

Cevabı göster

Yanlış. st_ctime i-node’un son değişme (change) zamanıdır: izin, sahip, bağ sayısı ya da içerik değiştiğinde güncellenir. st_mtime son içerik değişikliği, st_atime son erişimdir. Oluşturma zamanı yalnızca statx() ile (stx_btime) ve destekleyen dosya sistemlerinde alınabilir.

Soru 25 · İzinler ve Konteynerler

umask Hesabı

Hesaplama

umask 033 iken (a) touch not.txt ile oluşan dosyanın ve (b) mkdir arsiv ile oluşan dizinin izinleri nedir? (c) “666 − 033 = 633” hesabı neden yanlıştır?

Cevabı göster
  • (a) 666 & ~033 = 644 → rw-r--r--.
  • (b) 777 & ~033 = 744 → rwxr--r--.
  • (c) umask bir bit maskesidir: maskedeki bitler silinir, çıkarma yapılmaz. 033’ün x bitleri dosyada zaten yoktur; çıkarma 633’ü (rw--wx-wx) verir ve yanlış bitleri açar.

Soru 25 · Çözüm

Adım Adım Çözüm

Yeni dosya 666, yeni dizin 777 ister; umask’ta 1 olan bitler kapatılır: istenen & ~umask.

r1w1-0r1w1-0r1w1-0sahipgrupdiğer

Dosya için istenen izin 666 = rw-rw-rw-.

-0-0-0-0w1x1-0w1x1sahipgrupdiğer

umask 033 = 000 011 011: grup ve diğerlerinde w ve x bitleri silinecek (turuncu).

r1w1-0r1-0-0r1-0-0sahipgrupdiğer

(a) 666 & ~033: grup ve diğerlerinin w biti kapanır, x zaten yoktu → 644 = rw-r--r--.

r1w1x1r1-0-0r1-0-0sahipgrupdiğer

(b) Dizin: 777 & ~033 → 744 = rwxr--r--. Grup ve diğerleri dizini listeleyebilir ama içine giremez (x yok).

Soru 26 · İzinler ve Konteynerler

Sembolik chmod

Hesaplama

İzni rw-r----- (640) olan bir dosyaya chmod u+x,g+w,o+r dosya uygulanıyor. Yeni izin sekizli ve sembolik olarak nedir?

  1. 764, rwxrw-r--
  2. 751, rwxr-x--x
  3. 744, rwxr--r--
  4. 124, --x-w-r--
Cevabı göster

Doğru cevap: A) 764, rwxrw-r--

Sembolik kip mevcut bitlere ekleme yapar: sahip rw- + x = rwx (7), grup r-- + w = rw- (6), diğer --- + r = r-- (4) → 764, rwxrw-r--. Sekizli chmod 764 ise eski bitlere bakmadan doğrudan atama yapar.

Soru 27 · İzinler ve Konteynerler

Özel İzin Bitleri

Çoktan seçmeli

Sekizli izin ile ls -l gösterimi eşleştirmelerinden hangisi yanlıştır?

  1. 4755 → rwsr-xr-x (setuid)
  2. 1777 → rwxrwxrwt (yapışkan bit)
  3. 2750 → rwsr-x--- (setgid)
  4. 4644 → rwSr--r-- (setuid, sahipte x yok)
  5. 0640 → rw-r-----
Cevabı göster

Doğru cevap: C) 2750 → rwsr-x--- (setgid)

setgid (2xxx) grup üçlüsünün x yerinde görünür: 2750 → rwxr-s---. Küçük s/t altta x olduğunu, büyük S/T x olmadığını gösterir. Yapışkan bit /tmp’de herkesin yazıp yalnız kendi dosyasını silebilmesini sağlar.

Soru 28 · İzinler ve Konteynerler

İzin Denetiminin Sırası

Çoktan seçmeli

proje.txt dosyasının izni ----rwxr-- (0074), sahibi ali, grubu dev. Ali de dev grubunun üyesi. ali, veli (dev üyesi) ve ayse (başka grup) dosyayı okumaya çalışıyor. Kimler okuyabilir?

  1. Üçü de
  2. Yalnız veli ve ayse
  3. Yalnız ali ve veli
  4. Yalnız veli
  5. Hiçbiri
Cevabı göster

Doğru cevap: B) Yalnız veli ve ayse

Çekirdek ilk eşleşen sınıfa bakar: euid sahibe eşitse yalnız sahip bitleri (---) kullanılır ve grup üyeliği hiç denetlenmez → ali okuyamaz. veli grup bitlerini (rwx), ayse diğer bitlerini (r--) alır; ikisi de okur. (Sahip izni chmod ile kendine geri verebilir.)

Soru 29 · İzinler ve Konteynerler

Ad Alanı mı, cgroup mu?

Çoktan seçmeli

Bir konteynerin (a) yalnızca kendi süreçlerini görmesini ve kendi içinde PID 1 olmasını, (b) en fazla 512 MB bellek kullanabilmesini hangi Linux özellikleri sağlar?

  1. (a) cgroup, (b) PID ad alanı
  2. (a) PID ad alanı, (b) cgroup memory.max
  3. (a) seccomp, (b) chroot
  4. (a) SELinux, (b) ulimit
  5. (a) ve (b) ikisi de ağ ad alanı
Cevabı göster

Doğru cevap: B) (a) PID ad alanı, (b) cgroup memory.max

Ad alanları ne görüleceğini (PID, bağlama, ağ, ana makine adı, kullanıcı eşlemesi), cgroups ne kadar kullanılacağını (cpu.max, memory.max, pids.max) belirler. seccomp sistem çağrılarını, SELinux/AppArmor erişimi kısıtlar; hepsi birlikte konteyneri oluşturur.

Soru 30 · İzinler ve Konteynerler

Konteynerdeki PID 1

Doğru / Yanlış

Aşağıdaki ifade doğru mu, yanlış mı? Gerekçenizi yazın.

“Konteyner içinde PID 1 olarak görünen uygulama, konak makinede de PID 1’dir ve konağın systemd sürecinin yerini alır.”

Cevabı göster

Yanlış. PID ad alanı yalnızca bir görünüm sağlar: içeride PID 1 olan süreç konakta sıradan bir PID’e (ör. 48213) sahiptir; konaktaki PID 1 systemd’dir. Konteynerler konak çekirdeğini paylaşır: VM’den çok hafiftir, ama bir çekirdek açığı tüm konteynerleri etkileyebilir.

Özet

Özet: Sık Yapılan Hatalar

  • uniq’in tüm tekrarları saydığını sanmak: yalnız ardışık satırları birleştirir; önce sort gerekir.
  • Yönlendirme sırasını önemsiz saymak: 2>&1 > dosya ile > dosya 2>&1 farklıdır.
  • fork sonrası değişkenlerin paylaşıldığını düşünmek: bellek ayrıdır (COW); açık dosya nesnesi ve konumu ise paylaşılır.
  • /proc’u diskteki bir dizin sanmak: çekirdeğin o anki durumunu üreten sanal dosya sistemidir; /proc/self onu açan süreçtir.
  • umask’ı izinden çıkarmak: umask bit temizler (istenen & ~umask); 666 − 033 hesabı yanlış bitleri açar.
  • Sahibin grup veya diğer bitlerinden de yararlanabildiğini sanmak: ilk eşleşen sınıf (sahip → grup → diğer) kazanır.
  • Sert bağ ile sembolik bağı karıştırmak: sert bağ aynı i-node’dur, dosya sistemi sınırını aşamaz; sembolik bağ yolu tutar ve sarkabilir.

Son

Bölüm 16: Linux
Dersin son çalışma seti
1 / 1