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/shbir 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.