Linux’ta her şey neden birer dosyadır?

Gökhan Şengün
4 min readFeb 26, 2018

--

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.

--

--

Gökhan Şengün

Full stack dad of two and just curious about things. Stories are from my twitter floods @gokhansengun. Main blog is www.gokhansengun.com