it-swarm-tr.com

/ Dev ve alt dizinlerini ve dosyalarını anlama

$ ls -l /dev/stdin /dev/fd/0
lrwx------ 1 tim tim 64 2011-08-07 09:53 /dev/fd/0 -> /dev/pts/2
lrwxrwxrwx 1 root root 15 2011-08-06 08:14 /dev/stdin -> /proc/self/fd/0
$ ls -l /dev/pts/2 /proc/self/fd/0
crw--w---- 1 tim tty  136, 2 2011-08-07 09:54 /dev/pts/2
lrwx------ 1 tim tim     64 2011-08-07 09:54 /proc/self/fd/0 -> /dev/pts/2
  1. /dev Ve alt dizinleri altındaki tüm dosyaların tüm aygıt tanımlayıcıları olup olmadığını merak ediyordum.
  2. Neden birbirinden bu kadar çok bağlantı var? Örneğin, /dev/fd/0, /dev/stdin, /proc/self/fd/0, /dev/pts/2 İçin bağlantılar.
  3. lrwx------ İçindeki l bağlantı anlamına geliyorsa, crw--w---- İçindeki c ne anlama geliyor?
55
Tim

/dev Altındaki dosyaların neredeyse tamamı cihaz dosyaları şeklindedir. Normal bir dosyayı okumak ve yazmak, verileri bir diskte veya başka bir dosya sisteminde saklarken, bir aygıt dosyasına erişmek, çekirdekteki bir sürücü ile iletişim kurar ve bu da genellikle bir donanım (bir donanım aygıtı, dolayısıyla adı) ile iletişim kurar.

İki tür cihaz dosyası vardır: cihazları engelle (ls -l Çıktısındaki ilk karakter olarak b ile gösterilir) ve karakter cihazları (c ile gösterilir). Blok ve karakter aygıtları arasındaki ayrım tamamen evrensel değildir. Blok cihazlar, büyük, sabit boyutlu dosyalar gibi davranan diskler gibi şeylerdir: belirli bir ofsette bir bayt yazar ve daha sonra bu ofsetteki cihazdan okursanız, o baytı geri alırsınız. Karakter aygıtları, bayt yazmanın hemen bir etkiye sahip olduğu (örneğin bir seri satırda yayıldığı) ve bir bayt okumanın da birtakım etkiye sahip olduğu başka bir şeydir (örneğin seri porttan okunur).

Bir aygıt dosyasının anlamı, adına göre numarasına göre belirlenir (ad, uygulamalar için önemlidir, ancak çekirdek için önemli değildir). Sayı aslında iki sayıdır: büyük sayı bu aygıttan hangi sürücünün sorumlu olduğunu gösterir ve küçük sayı sürücünün birden fazla aygıt kullanmasına izin verir¹. Bu sayılar, normalde dosya boyutunu bulacağınız ls -l Listesinde görünür. Örneğin. brw-rw---- 1 root disk 8, 0 Jul 12 15:54 /dev/sda → bu cihaz büyük 8, küçük 0.

/dev Altındaki bazı cihaz dosyaları donanım cihazlarına karşılık gelmiyor. Her unix sisteminde var olan bir tane /dev/null; ona yazmanın bir etkisi yoktur ve ondan okumak hiçbir veri döndürmez. Bir komuttan (>/dev/null) Çıktıyı yoksaymak veya girişsiz bir komut çalıştırmak istediğinizde (</dev/null) Shell komut dosyalarında genellikle kullanışlıdır. Diğer yaygın örnekler /dev/zero (Boş bayt ad infinitum ) /dev/urandom = (rastgele bayt reklam sonsuzunu döndürür ).

Birkaç cihaz dosyasının erişen işleme bağlı bir anlamı vardır. Örneğin, /dev/stdin Geçerli işlemin standart girdisini belirtir; 'den açılması, işlemin standart girdisi olarak açılan orijinal dosyayı açmakla yaklaşık olarak aynı etkiye sahiptir. Benzer şekilde /dev/tty, İşlemin bağlı olduğu terminali belirtir. Linux'ta, günümüzde, /dev/stdin Ve arkadaşları karakter aygıtları olarak değil, her dosya tanımlayıcısına başvuruda bulunulmasına izin veren daha genel bir mekanizmaya sembolik bağlantılar olarak uygulanmaktadır (yalnızca 0, 1 ve 2 yerine geleneksel yöntem); örneğin /dev/stdin, /proc/self/fd/0 için sembolik bir bağlantıdır. Bkz. /dev/fd/proc/self/fd/? ile ilişkilidir.

/dev Altında bir dizi sembolik bağlantı bulacaksınız. Bu, tarihsel nedenlerle ortaya çıkabilir: bir aygıt dosyası bir addan diğerine taşındı, ancak bazı uygulamalar yine de eski adı kullanıyor. Örneğin, /dev/scd0, Linux altında /dev/sr0 Öğesine sembolik bir bağlantıdır; her ikisi de ilk CD aygıtını belirler. Sembolik bağlantıların bir başka nedeni de organizasyon: Linux altında sabit disklerinizi ve bölümlerinizi birkaç yerde bulacaksınız: /dev/sda Ve /dev/sda1 Ve arkadaşlar (her disk rastgele bir harf ve bölümler ile gösterilir) bölüm düzenine göre), /dev/disk/by-id/* (benzersiz bir seri numarasıyla gösterilen diskler), /dev/disk/by-label/* (insan tarafından seçilen bir etiketle gösterilen dosya sistemli bölümler); ve dahası. Sembolik bağlantılar, genel bir aygıt adı birkaç taneden biri olduğunda da kullanılır; örneğin /dev/dvd, /dev/sr0 için sembolik bir bağlantı olabilir veya iki CD okuyucunuz varsa ve ikincisi varsayılan DVD olacaksa /dev/sr1 okuyucu.

Son olarak, geleneksel nedenlerle /dev Altında bulabileceğiniz birkaç dosya daha var. Her sistemde aynı şeyi bulamazsınız. Çoğu birleşimde, /dev/log, Programların günlük iletileri göndermek için kullandığı socket şeklindedir. /dev/MAKEDEV, /dev İçinde girişler oluşturan bir komut dosyasıdır. Modern Linux sistemlerinde, /dev/ İçindeki kayıtlar udev , eski MAKEDEV tarafından otomatik olarak oluşturulur.

¹ Bu aslında Linux altında artık geçerli değil, ancak bu ayrıntı yalnızca aygıt sürücüsü yazarları için önemlidir.

  1. Evet - doğrudan veya sembolik olarak - /dev/ Bunun için.
  2. Çeşitli amaçlar için: bazen adlandırma düzenleri arasındaki uyumluluk için bazen çalışma ortamı için gereklidir - /dev/stdin Örneğinde olduğu gibi. Bu statik olarak /dev/pts/2 Veya diğer - sadece başka bir terminale geçin ve göreceksiniz. /dev/stdin, geçerli terminal oturumunuzun standart girdisidir. Bu aynı zamanda bir sembolik bağlantısı olması gereken bir örnektir.
  3. Bkz. man mknod Ve info coreutils 'mknod invocation'. Genel olarak, c bir karakter cihazı türünü temsil eder.
14
rozcietrzewiacz

İlk sorunuz için, dosya tanımlayıcıları değil, cihaz dosyalarıdır. (diğer adıyla "dev düğümleri")

Bu dosyalar, büyük ve küçük numaralar kullanarak aygıtı kullanan sürücüye bağlıdır. (Örneğin, ls çıktınızdaki "136, 2", büyük sayı 136'ya bağlı aygıt sürücüsünü belirtir ve bu sürücü tarafından işlenen # 2 aygıtını belirtir.)

ls -l, cihaz dosyalarında cihaz tipidir. 'C' ise bir karakter cihazı veya 'b' ise bir blok cihazıdır.

İkinci sorunuz için yukarıdaki rozcietrzewiacz cevabına bakınız.

11
rulingminds