İçeriğe geç
academia.sh

Ders 01 / 20

Unix Geleneği ve Linux

Çekirdek, dağıtım ve kabuk katmanlarının ayrımı; Unix tasarım geleneğinin taşıdığı varsayımlar ve POSIX'in taşınabilirlik sözü.

İçindekiler

“Linux öğrenmek” ifadesi, tek bir şeyi değil üst üste duran üç ayrı katmanı kapsar: donanımı yöneten çekirdek, çekirdeğin çevresine toplanmış program kümesi ve bu programları çağırmak için kullanılan komut yorumlayıcı. Üçü farklı kurumlarca, farklı zamanlarda ve farklı gerekçelerle üretilmiştir; birbirlerinin yerine geçebilirler.

Bu ders katmanları ayırır ve kursun geri kalanının hangi katmanda geçtiğini belirler. Ayrım gereksiz bir titizlik gibi görünebilir; ancak “komut çalışmıyor” türü sorunların çoğu, sorunun hangi katmanda olduğunu bilmemekten kaynaklanır.

Unix Geleneğinin Varsayımları

Linux, 1970’lerde Bell Laboratuvarları’nda geliştirilen Unix işletim sisteminin tasarım geleneğini sürdürür. Bu gelenek birkaç varsayım üzerine kuruludur ve varsayımlar, komutların bugünkü davranışını doğrudan açıklar.

Her şey bir dosyadır. Yalnızca disk üzerindeki veriler değil; aygıtlar, terminaller, süreçler arası iletişim kanalları da dosya sistemi içinde bir adla temsil edilir. Programlar tek bir arayüzle — aç, oku, yaz, kapat — hepsine erişir.

Küçük araçlar, tek iş. Her program dar bir işi yapar. Karmaşık işler, programları birleştirerek kurulur. Bu birleştirmenin dilbilgisi Kabuk Programlama kursunun konusudur; bu kurs araçların kendisini tanıtır.

Metin ortak arayüzdür. Programlar arasında akan veri, çoğunlukla satırlara bölünmüş düz metindir. Metin, hem insan hem program tarafından okunabildiği için ortak payda olarak seçilmiştir.

Yapılandırma dosyalarda durur. Sistem davranışı, ikili biçimli gizli bir kayıt defterinde değil, okunabilir metin dosyalarında tutulur. Bir ayarı incelemek, ilgili dosyayı okumaktır.

Bu varsayımlar bir tasarım tercihidir, doğa yasası değildir. Bedelleri de vardır: metin tabanlı arayüz, yapılandırılmış veriyi ayrıştırma yükünü her programa dağıtır. Kursun ilerleyen derslerinde bu bedelin nerede ödendiği görünecektir.

Çekirdek

Çekirdek (kernel), donanımla doğrudan konuşan tek yazılım katmanıdır. Sorumlulukları Bilgisayarlar Nasıl Çalışır kursunda tanıtılan kavramlarla örtüşür:

  • Süreç zamanlama: Hangi programın ne zaman işlemciyi kullanacağına karar verir. Bu kararın uygulanması, kesmeler dersinde anlatılan zamanlayıcı kesmesine dayanır.
  • Bellek yönetimi: Her sürece kendi adres uzayını verir; bir sürecin diğerinin belleğini okumasını engeller.
  • Dosya sistemi: Diskteki bloklara ad ve dizin yapısı giydirir.
  • Aygıt sürücüleri: Klavye, disk, ağ arayüzü gibi donanımların ayrıntısını gizler.

Bir program çekirdeğin hizmetine sistem çağrısı (system call) ile ulaşır. Sistem çağrısı, sıradan bir işlev çağrısı değildir: işlemci ayrıcalık düzeyini değiştirir, denetim çekirdeğe geçer, iş bitince geri döner. Dosya açmak, bellek istemek, süreç yaratmak birer sistem çağrısıdır.

Bu sınır önemlidir çünkü taşınabilirliğin de sınırıdır: aynı sistem çağrısı arayüzünü sunan iki farklı çekirdek üzerinde aynı program çalışabilir.

Sistemin hangi çekirdeği çalıştırdığı sorulabilir:

$ uname -s
Linux

uname komutu çekirdeğin adını yazdırır. Aynı komut, Unix geleneğini paylaşan başka bir sistemde başka bir yanıt verir — örneğin macOS üzerinde Darwin. Komutun kendisi her ikisinde de vardır; yanıt farklıdır. Taşınabilirliğin ne demek olduğunun en kısa gösterimi budur.

Dağıtım

Çekirdek tek başına kullanılabilir bir sistem değildir. Dosya kopyalayan, metin görüntüleyen, ağ bağlantısı kuran programlar çekirdeğin parçası değildir; ayrı projelerdir.

Dağıtım (distribution), bir çekirdeği seçilmiş bir program kümesiyle birleştirip kurulabilir bir bütün hâline getiren paketleme çalışmasıdır. Bir dağıtım tipik olarak şu bileşenleri belirler:

  • Çekirdek ve sürücü seçimi
  • Standart C kütüphanesi
  • Temel komut araçları (dosya, metin, süreç araçları)
  • İlk süreci başlatan ve servisleri yöneten sistem
  • Paket yöneticisi ve depo yapılandırması
  • Varsayılan kabuk ve varsayılan editör

Bu seçimler dağıtımdan dağıtıma değişir. Bu kurs, değişen kısımlara değil ortak zemine bağlı kalır: anlatılan komutların çoğu POSIX’te tanımlıdır veya tüm yaygın dağıtımlarda aynı adla bulunur. Dağıtıma özgü davranış geçtiğinde bu açıkça belirtilir.

POSIX, Unix benzeri sistemlerin arayüzünü tanımlayan bir standarttır. Bir komutun POSIX’te tanımlı olması, adının ve temel seçeneklerinin standarda uyan her sistemde aynı anlama geleceği anlamına gelir. Standart, her seçeneği kapsamaz: sistemler standarda ek seçenekler koyar ve bu ekler birbirinden ayrışır. Kurs boyunca bu ayrışmanın en sık görülen örneği olan GNU ve BSD araç aileleri arasındaki farklar, geçtikleri yerde gösterilir.

Kabuk

Kabuk (shell), kullanıcıdan komut satırı alan, onu yorumlayan ve karşılık gelen programları çalıştıran bir programdır. Çekirdeğin parçası değildir; ayrıcalıklı değildir; başka herhangi bir program gibi çalışır ve değiştirilebilir.

Hangi kabuğun çalıştığı, süreç listesinden okunabilir:

$ ps -p $$ -o pid=,comm=
 1076 bash
$ echo $$
1076

$$, kabuğun kendi süreç numarasını tutan bir değişkendir. ps komutu o numaralı sürecin adını yazdırır. Buradaki yanıt kabuğun adıdır — sistemden sisteme ve kullanıcıdan kullanıcıya değişir.

Kabuğun değiştirilebilirliği, sistemin bir yerinde açıkça görünür:

$ ls -l /bin/sh
lrwxrwxrwx 1 root root 4 Mar 31  2024 /bin/sh -> dash

/bin/sh, bir programın kendisi değil, bir role verilmiş addır: “POSIX kabuğu”. Çıktının ilk karakterindeki l harfi, bunun bir bağlantı olduğunu söyler; ok işareti gerçek hedefi gösterir. Bu sistemde rol dash adlı kabuğa verilmiştir; başka bir sistemde başka bir programa verilebilir. Bağlantıların nasıl çalıştığı, dosya işlemleri konusunda ayrıntılı olarak ele alınacaktır.

Ayrım şuraya varır: bir komut “çalışmıyorsa” üç ayrı olasılık vardır. Komut sistemde kurulu değildir (dağıtım katmanı), kabuk komutu bulamıyordur (kabuk katmanı) veya çekirdek işlemi reddediyordur (izin katmanı). Bu kursun konularının sırası bu üç katmanı izler.

Her Şey Bir Dosyadır — Somut Bir Örnek

Varsayımların en soyutu olan “her şey bir dosyadır” ilkesi, aygıtlara bakılarak doğrulanabilir:

$ ls -l /dev/null /dev/zero
crw-rw-rw- 1 root root 1, 3 Jul 26 18:45 /dev/null
crw-rw-rw- 1 root root 1, 5 Jul 26 18:45 /dev/zero

Satır başındaki c harfi, bu girdilerin sıradan dosya değil karakter aygıtı olduğunu söyler. Sıradan bir dosyanın boyutunun bulunduğu sütunda burada iki sayı vardır: aygıtın ana ve alt numarası. Çekirdek bu numaralarla hangi sürücünün çağrılacağını belirler.

/dev/null yazılan her şeyi yutar ve okunduğunda hemen dosya sonu verir; /dev/zero okundukça sıfır bayt üretir. İkisi de disk üzerinde veri tutmaz. Yine de bir program onları sıradan bir dosya gibi açar, okur ve yazar — çünkü arayüz ortaktır.

Kursun Ekseni

Kurs boyunca tek bir örnek üzerinde çalışılacaktır: ev dizini altında kurulan proje/ adlı bir ölçüm çalışması. Bu dizin ağacı her derste bir adım ilerler; ham ölçüm dosyaları eklenir, işlenir, bağlanır, arşivlenir, izinleri düzenlenir ve sonunda bir grupla paylaşılır.

Amaç, komutları listelemek değil, her komutun neden öyle davrandığını aynı somut ağaç üzerinde göstermektir. Bir sonraki ders bu ağacı kurmadan önce, komutların kendisini yorumlayan katmanı — kabuğu — inceler.

Özet

  • Unix geleneği dört varsayıma dayanır: her şey bir dosyadır, araçlar küçük ve tek işlidir, ortak arayüz metindir, yapılandırma okunabilir dosyalarda durur.
  • Çekirdek donanımı yönetir ve hizmetlerini sistem çağrılarıyla sunar; bu sınır aynı zamanda taşınabilirliğin sınırıdır.
  • Dağıtım, bir çekirdeği seçilmiş programlarla birleştiren paketleme çalışmasıdır; değişen kısımdır.
  • POSIX, komut adlarının ve temel seçeneklerinin ortak anlamını tanımlar; sistemlerin standarda eklediği seçenekler birbirinden ayrışır.
  • Kabuk ayrıcalıklı bir bileşen değil, değiştirilebilir bir programdır; /bin/sh bir programın değil bir rolün adıdır.

Sonraki Adım

Katmanlar ayrıldığına göre, sıra en üsttekine gelir. Bir komut satırı yazıldığında kabuk onu tam olarak ne yapar: sözcüklere nasıl böler, hangi kısmı program adı sayar, tırnak işaretleri neyi değiştirir ve bir komutun başarılı olup olmadığı nereden anlaşılır? Sonraki ders kabuğun bu ayrıştırma işini adım adım açar.

İ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