/ Dev ve alt dizinlerini ve dosyalarını anlama


51
$ 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. Tüm dosyaların /devve alt dizinlerinin aygıtların tüm dosya 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/0tüm bağlantıları için vardır /dev/pts/2.
  3. Eğer liçinde lrwx------ortalama bağlantı, ne yok ciçinde crw--w---- demek?

3
Ve # 3'ü cevaplamak için, c karakter cihazı veya özel karakter anlamına gelir . b özel blok anlamına gelir .
felixphew

Yanıtlar:


77

Altında Neredeyse tüm dosyaları /devvardır aygıt dosyaları . Normal bir dosyaya okuma ve yazma, verileri bir diskte veya başka bir dosya sisteminde saklarken, bir aygıt dosyasına erişmek, genellikle sırayla bir donanım parçasıyla (yani bir donanım aygıtı adıyla) iletişim kuran çekirdekteki bir sürücü ile iletişim kurar.

İki tür aygıt dosyası vardır: blok aygıtları ( bçıktısının ilk karakteri ile gösterilir ls -l) ve karakter aygıtları (ile gösterilir c). Blok ve karakter cihazları arasındaki fark tamamen evrensel değildir. Blok aygıtları, büyük, sabit boyutlu dosyalar gibi davranan diskler gibi şeylerdir: belirli bir ofsette bir bayt yazarsanız ve daha sonra bu ofsetteki aygıttan okursanız, o baytı geri alırsınız. Karakter aygıtları hemen hemen başka bir şeydir; bayt yazmanın hemen bir etkisi (örneğin seri bir satırda yayınlanır) ve bayt okumak aynı zamanda hemen hemen bir etkisinin olduğu (örneğin seri porttan okunur).

Bir aygıt dosyasının anlamı, adıyla değil, adıyla belirlenir (ad, uygulamalar için önemlidir, ancak çekirdeğe göre). 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 birkaç aygıt kullanmasına izin verir¹. Bu numaralar ls -l, normalde dosya boyutunu bulacağınız listede 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.

Altındaki bazı aygıt dosyaları /devdonanım aygıtlarına karşılık gelmez. Her unix sisteminde var olan /dev/null; ona yazmanın bir etkisi yoktur ve bundan okumak hiçbir zaman veri döndürmez. Kabuk komut dosyalarında, komutun ( >/dev/null) çıktısını yoksaymak veya girişi olmayan bir komutu ( ) çalıştırmak istediğinizde genellikle kullanışlıdır </dev/null. Diğer yaygın örnekler /dev/zero(boş bayt ad sonsuz ) /dev/urandomdöndüren (rastgele bayt ad sonsuz ) döndüren ).

Birkaç cihaz dosyası, erişen işleme bağlı olan bir anlama sahiptir. Örneğin /dev/stdin, mevcut işlemin standart girişini belirler; içinden açmak, işlemin standart girişi olarak açılan orijinal dosyayı açmakla yaklaşık aynı etkiye sahiptir. Bir şekilde benzer şekilde, /dev/ttyişlemin bağlı olduğu terminali belirler. Linux altında, bugünlerde /dev/stdinve arkadaşlar karakter aracı olarak uygulanmaz, bunun yerine her dosya tanımlayıcısının referans verilmesine izin veren daha genel bir mekanizmaya sembolik bağlar (geleneksel yöntemde yalnızca 0, 1 ve 2'nin aksine); örneğin /dev/stdin, sembolik bir bağlantıdır /proc/self/fd/0. Bakınız / dev / fd, / proc / self / fd / ile nasıl ilişkilidir? .

Altında bir dizi sembolik bağlantı bulacaksınız /dev. Bu tarihsel nedenlerden dolayı ortaya çıkabilir: bir aygıt dosyası bir addan diğerine taşındı, ancak bazı uygulamalar hala eski adı kullanıyor. Örneğin, Linux altında /dev/scd0sembolik bir bağlantıdır /dev/sr0; her ikisi de ilk CD aygıtını tanımlar. Sembolik bağlantıların bir başka nedeni de organizasyondur: Linux altında, sabit disklerinizi ve bölümlerinizi birkaç yerde bulacaksınız: /dev/sdave /dev/sda1ve arkadaşlar (her bir disk tarafından rastgele bir harfle /dev/disk/by-id/*belirtilen diskler ve bölüm düzenine göre bölümler), ( benzersiz seri numarası), /dev/disk/by-label/*(insan tarafından seçilen bir etiket ile belirtilen dosya sistemine sahip bölümler); ve dahası. Sembolik bağlantılar, genel bir cihaz adı birkaç kişiden biri olduğunda da kullanılır; Örneğin/dev/dvdiki CD okuyucunuz varsa ve ikincisi varsayılan DVD okuyucuysa /dev/sr0, bu sembolik bir bağlantı olabilir veya bir bağlantı olabilir /dev/sr1.

Son olarak, /devgeleneksel nedenlerden dolayı bulabileceğiniz birkaç dosya daha var . Her sistemde aynı şeyi bulamazsınız. En Unix'lerde, /dev/logbir olan soket programları günlük iletilerini yaymak için kullandıkları. /dev/MAKEDEVGirişleri oluşturan bir betiktir /dev. Modern Linux sistemlerinde, girişler udev/dev/ tarafından otomatik olarak eski haline getirilir .MAKEDEV

¹ 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 önemli.


Teşekkürler! "Bir aygıt dosyasının anlamı, sayısına göre belirlenir" derken, dosya tanımlayıcısını mı kastediyorsunuz?
Tim

@Tim: Hayır, ls -ldosya boyutunu normalde bulduğunuz yerde, tarihten önce, örn. brw-rw---- 1 root disk 8, 0 Jul 12 15:54 /dev/sda→ bu cihaz büyük 8, küçük 0'dır. bir cihazı cihaz yapan şey (en önemlisi, dosya adı değil). Bir dosya tanımlayıcı numarasının yalnızca belirli bir işlemde bir anlamı vardır.
Gilles 'SO- kötülük olmayı'

Hayır, Linux'ta /dev/stdin(=> /proc/self/fd/0) açmak, standart girdiyi kopyalamakla aynı etkiye sahip değildir. Farkı görmek için su - non_root_user, daha sonra exec 5</dev/stdin"İzin engellendi" başarısız olur, ancak exec 5<&0başarılı olacaktır. Ve bu yeni fd farklı bayraklarla açılacağını yönelik değil, dosya nesnesi ( "açık dosya descrip hakkında herşey tion POSIX lingo") (dosya işaretçisi ofset olmayan / engelleme modu, vs) farklı olacaktır.
mosvy

14
  1. Evet - doğrudan ya da sembolik bağlantılar gibi - bunun /dev/için var.
  2. Çeşitli amaçlar için: bazen isimlendirme şemaları arasındaki uyumluluk için, bazen çalışma ortamı için gereklidir - örnekte olduğu gibi /dev/stdin. Bu mu değil işaret statik için /dev/pts/2veya başka herhangi bir - sadece başka terminale geçiş ve göreceksiniz. Geçerli terminal oturumunuzun /dev/stdinstandart girişidir . Bu da neden bir sembolik bağlantı olması gerektiğine bir örnektir.
  3. Bkz man mknodve info coreutils 'mknod invocation'. Genel olarak, cbir karakter aygıtı türü anlamına gelir.

3
"mevcut terminal oturumunuzun standart girişi" biraz belirsiz. /dev/stdinonu açacak olan sürecin standart girişini ifade eder. İçindeki her şey /proc/$pidsürece bağlı verilerdir ve /proc/selfsürecin kendi verilerini gösteren bir tür sihirli bağlantıdır.
Stéphane Gimenez

11

İlk sorunuz için, bunlar dosya tanımlayıcıları değil, aygıt dosyalarıdır. (aka "dev düğümler")

Bu dosyalar, büyük ve küçük sayıları kullanarak cihazı kullanan sürücüye bağlıdır. (Örneğin, lsçıktınızdaki "136, 2", 136 numaralı ana cihaza bağlı olan cihaz sürücüsüne atıfta bulunur ve bu sürücü tarafından kullanılan cihaz # 2'yi belirtir.)

İlk çıktı harfi ls -l, aygıt dosyaları durumunda aygıtın türüdür. Eğer 'c' ise, bir karakter cihazıdır veya 'b' ise, bir blok cihazıdır.

İkinci sorunuz için yukarıdaki cevaba rozcietrzewiacz tarafından bakınız.


1
"Aygıt Sürücülerine Giriş" bağlantısı bozulmuş görünüyor.
Slothworks
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.