Linux’ta her şey neden birer dosyadır?
--
Bu flood’da “Linux’ta her şey bir dosyadır” (Everything is a file) önermesini neden ve nasıl sorularını sorarak, örneklerle ele alacağız.
Linux’ta aygıtlar (klavye, fare, ekran, yazıcı, vb), TCP/UDP soketler, Unix domain soketler, prosesler, prosesler arası iletişim kurmaya yarayan pipe
adı verilen mekanizmalar, vb bütün sistem bileşenleri ya birer dosyadır, ya dosya sistemi (file system
) üzerinde dosya gibi görünür ya da bunlara olan erişim bir dosyaya erişimle benzer şekilde tasarlandığı için dosyalar üzerinde yapılan işlemler bu bileşenler üzerinde de yapılabilir. Linux’ta yönetilen bütün kaynaklar bu üç kategoriden birine girdiği için "Linux’ta her şey bir dosyadır" denir.
Önceki flood’larda Linux’ta proseslerle ilgili bilgilere dosya sistemindeki /proc
dizininden erişilebileceğini söylemiştik. Aşağıdaki gibi sistemde bulunan işlemciler ve memory ile ilgili bilgiler ekstra bir araca ihtiyaç duyulmadan dosya sistemi üzerinden alınabilmektedir.
Görüldüğü üzere sistem kaynaklarının işletim sistemi tarafından dosya arabirimi üzerinden sunulması, gerek dosyalarla nasıl etkileşime geçeceğini bilen kullanıcıların işini gerekse çalışmak için bu bilgiye ihtiyacı bulunan programların yazımını kolaylaştırmaktadır. Karşılaştırma olması açısından Windows ile yönetilen bir sistemde, sistemin ne kadar zamandır ayakta olduğunu anlamak için uptime
veya systeminfo
gibi bir araç kullanılır. uptime
bilgisini elde etmek isteyen kişi ya anılan programları kullanmalı ya da Windows'un sağladığı API ile, API'ın desteklediği programlama dillerinden biri ile bir program yazmalıdır. Aynı kişi, Linux'ta metin dosyası okuma fonksiyonu sunan herhangi bir araç (cat
) veya bir programlama dili ile /proc/uptime
dosyası okunarak sistemin ne kadar süredir açık olduğu öğrenilebilir.
/proc
dizinine benzer şekilde /dev
dizini altında işletim sisteminin yönettiği bütün cihazlar bulunmaktadır. Aşağıdaki ekran görüntüsünde sistemde bulunan disk bölümleri (disk partition
) listelenmiş ve bu bölümlerin /dev/
dizininde bulunduğu gösterilmiştir.
Yukarıdaki /dev
dizininin görüntülendiği ekran çıktısında (/dev/null
, /dev/zero
ve /dev/random
) özel aygıtları bulunmaktadır. Bu aygıtlar "Linux'ta her şey neden dosya olmalıdır?" sorusuna çok güzel birer örnek oluşturdukları için onları anlatarak devam edelim.
/dev/null
dosyası üzerine yazılan karakterleri sonsuz bir boşluğa atar. Bazen çalıştırılan aracın ekrana yazdığı çıktılarla ilgilenmeyip sadece çıkış kodu ile ilgilenebiliriz. Bu gibi durumlarda aşağıda olduğu gibi ilgili aracın verdiği çıktıyı /dev/null
'a yönlendirebiliriz.
/dev/zero
dosyası okunmak üzere açıldığında, her okumada okuyan programa 0 - ASCII NUL
karakterini verir ve bunu sonsuza kadar yapabilir :-) Yani bu dosyayı sonsuz sayıda 0
içeren bir dosya gibi düşünebiliriz. /dev/zero
'dan yapılan okumalar bir dosyaya yönlendirilirse istenen büyüklükte içeriği 0
olan bir dosya elde edilir. dd
aracı dosyalar arasında dönüşüm yapmak üzere kullanılır. Aşağıda dd
ile 1 GB'lık bir dosya oluşturulmuştur. bs
(block size) parametresi dd
'nin okuma/yazma işlemlerini kaçar byte ile yapacağını belirler.
/dev/zero
'nun bir kullanım alanı da dd
'ye of - output file
parametresi ile bir disk bölümünün (örneğin /dev/sda1
) verilmesi ve partition'ın içeriğinin 0
'lar ile doldurulmasıdır. Bu sayede ilgili disk bölümündeki bütün veriler silinebilir. !DİKKAT BİLGİ KAYBI RİSKİ!
dd
ile disk 0
'lar ile doldurulsa bile bazı özel teknikler kullanılarak verilerin tutulduğu manyetik alandan diskte verinin daha uzun süre durduğu state öğrenebilmektedir. Bu sebeple disk içeriği temizleme için üreticinin sağladığı güvenli silme yöntemi tercih edilmelidir.
/dev/random
dosyası ise her okumada okuyucusuna rassal (random
) bir karakter vermektedir. /dev/random
rassallığı en üst düzeyde sağlayabilmek için device driver
'lardan diskin dönüş hızı, ağdan paketlerin gelişi vb parametreleri seed olarak kullanarak karakterleri üretir.
/dev/random
dosyası rastsallığı garanti edecek yeterli entropy bulamadığında yeni bir karakter döndürmez ve okuyucuyu bloklar, bu da zaman zaman çok yavaş çalışmasına sebep olur. Alternatif olarak, eldeki entropy ile rassal sayı üretmek için /dev/urandom
kullanılabilir.
Son olarak ilerleyen flood’ların birinde detaylı şekilde ele alacağımız FUSE (File System User Space)
ile çekirdek (kernel
) seviyesinde kod değişikliği gerekmeden kullanıcı seviyesinde ihtiyaca uygun olarak dosya sistemleri geliştirilebilir. Örneğin GDriveFS
aracı, Google Drive'da bulunan dosyalar lokal dosya sistemindeki bir klasöre mount edilip kullanılabilir. Benzer şekilde Wikipedia yazılarını okumak için WikipediaFS
ve Amazon S3'teki bir bucket'ı sanki lokal dosya sisteminde kullanmak için de s3fs-fuse
kullanılabilir.