
Es gibt spezielle Dateien in Linux, die keine echten Dateien sind.
Die bemerkenswertesten und klarsten Beispiele hierfür finden sich im dev
Ordner „Dateien“ wie:
/dev/null
- Ignoriert alles, was Sie in die Datei schreiben/dev/random
- Gibt zufällige Daten anstelle des Inhalts einer Datei aus/dev/tcp
- Sendet alle Daten, die Sie in diese Datei schreiben, über das Netzwerk
Zunächst einmal: Wie heißen diese Arten von „Dateien“, bei denen es sich in Wirklichkeit um eine Art getarntes Skript oder Binärprogramm handelt?
Zweitens, wie werden sie erstellt? Sind diese Dateien auf Kernelebene in das System integriert oder gibt es eine Möglichkeit, selbst eine „magische Datei“ zu erstellen (wie wäre es mit einer /dev/rickroll
)?
Antwort1
/dev/zero
ist ein Beispiel für eine „spezielle Datei“ — insbesondere ein „Geräteknoten“. Normalerweise werden diese beim Installationsprozess der Distribution erstellt, aber Sie könnentotalErstellen Sie sie selbst, wenn Sie möchten.
Wenn Sie Fragen haben ls
zu /dev/zero
:
# ls -l /dev/zero
crw-rw-rw- 1 root root 1, 5 Nov 5 09:34 /dev/zero
Das „c“ am Anfang sagt Ihnen, dass es sich um ein „Zeichengerät“ handelt; der andere Typ ist ein „Blockgerät“ (ausgedruckt als ls
„b“). Ganz grob gesagt sind wahlfreie Geräte wie Festplatten eher Blockgeräte, während sequentielle Geräte wie Bandlaufwerke oder Ihre Soundkarte eher Zeichengeräte sind.
Der Teil „1, 5“ ist die „Hauptgerätenummer“ und die „Nebengerätenummer“.
Mit diesen Informationen können wir den mknod
Befehl verwenden, um unseren eigenen Geräteknoten zu erstellen:
# mknod foobar c 1 5
Dadurch wird eine neue Datei mit dem Namen foobar
im aktuellen Ordner erstellt, diegenaudasselbe wie /dev/zero
. (Sie können natürlich andere Berechtigungen festlegen, wenn Sie möchten.) Diese „Datei“ enthält eigentlich nur die drei oben genannten Elemente – Gerätetyp, Hauptnummer, Nebennummer. Sie können verwenden, ls
um die Codes für andere Geräte nachzuschlagen und diese ebenfalls neu zu erstellen. Wenn Sie sich langweilen, verwenden Sie einfach, rm
um die gerade erstellten Geräteknoten zu entfernen.
Im Grunde sagt die Hauptnummer dem Linux-Kernel, mit welchem Gerätetreiber er kommunizieren soll, und die Nebennummer sagt dem Gerätetreiber, mit welchem Gerät Sie sprechen. (Beispiel: Sie haben wahrscheinlich einen SATA-Controller, aber möglicherweise sind mehrere Festplatten daran angeschlossen.)
Wenn Sie wollenerfindenneue Geräte, die etwas Neues tun... nun, Sie müssen den Quellcode für den Linux-Kernel bearbeiten und Ihren eigenen benutzerdefinierten Kernel kompilieren. Also lassen wir das! :-) Aber Sie können problemlos Gerätedateien hinzufügen, die die bereits vorhandenen duplizieren. Ein automatisiertes System wie udev beobachtet im Grunde nur Geräteereignisse und ruft mknod
/ rm
automatisch für Sie auf. Nichts ist magischer als das.
Es gibt nochandereArten von Spezialdateien:
Linux betrachtet ein Verzeichnis als eine spezielle Art von Datei. (Normalerweise können Sie ein Verzeichnis nicht direkt öffnen, aber wenn Sie könnten, würden Sie feststellen, dass es sich um eine normale Datei handelt, die Daten in einem speziellen Format enthält und dem Kernel mitteilt, wo sich alle Dateien in diesem Verzeichnis befinden.)
Ein Symlink ist eine spezielle Datei. (Ein Hardlink hingegen nicht.) Sie können Symlinks mit dem
ln -s
Befehl erstellen. (Lesen Sie dazu die Manpage.)Es gibt auch etwas, das man "Named Pipe" oder "FIFO" (First-In, First-Out-Warteschlange) nennt. Sie können eine solche Warteschlange mit erstellen
mkfifo
. Eine FIFO ist eine magische Datei, die geöffnet werden kann durchzweiProgramme gleichzeitig – eines zum Lesen, eines zum Schreiben. Wenn dies geschieht, funktioniert es wie eine normale Shell-Pipe. Aber Sie können jedes Programm separat starten ...
Eine Datei, die in keiner Weise „speziell“ ist, wird als „normale Datei“ bezeichnet. In Unix-Dokumentationen wird dies gelegentlich erwähnt. Das ist die Bedeutung: eine Datei, die kein Geräteknoten, kein symbolischer Link oder sonst etwas ist. Einfach eine normale, alltägliche Datei ohne magische Eigenschaften.
Antwort2
Die meisten /dev
Einträge sind Blockgeräte-Inodes oder Zeichengeräte-Inodes.Wikipedia hat viele Detailsdarüber, was ich nicht wiederholen werde.
Was in Ihrer Frage erwähnt wird, wird jedoch /dev/tcp
in keiner der vorhandenen Antworten erklärt. /dev/tcp
und /dev/udp
unterscheiden sich von den meisten anderen /dev
Einträgen. Die Block- und Zeichengeräte werden vom Kernel implementiert, aber /dev/tcp
und /dev/udp
werden im Benutzermodus implementiert.
Die Bash-Shell ist ein Programm, das eine Implementierung von /dev/tcp
und hat /dev/udp
(kopiert von ksh93
). Wenn Sie versuchen, einen Pfad unterhalb dieser mit Bash-Umleitungsoperatoren zu öffnen, wird kein normaler open
Systemaufruf ausgeführt. Stattdessen erstellt Bash einen TCP-Socket und verbindet ihn mit dem angegebenen Port.
Dies ist im Benutzermodus und nur in einigen Programmen implementiert, wie im folgenden Beispiel zu sehen ist, das den Unterschied zwischen dem Öffnen bash
und cat
dem Versuch demonstriert/dev/tcp/::1/22
$ cat /dev/tcp/::1/22
cat: /dev/tcp/::1/22: No such file or directory
$ cat < /dev/tcp/::1/22
SSH-2.0-OpenSSH_6.6.1p1 Ubuntu-2ubuntu2.3
Ein Unterschied ksh93
besteht darin, dass bash
nur TCP-Verbindungen mit Umleitungsoperatoren hergestellt werden, nicht an anderen Stellen, an denen möglicherweise Dateien geöffnet werden, wie etwa die integrierten source
oder .
die.
Antwort3
Zusätzlich zu den in anderen Antworten erläuterten Geräteknoten (erstellt mitmknod(2)oder von einigen geliefertdevfs), Linux hat andere "magische" Dateien, die von speziellenvirtuelle Dateisysteme, insbesondere in /proc/
(sieheproc(5), lesen überprocfs) und in /sys/
(lesen Sie übersysfs).
Diese Pseudodateien (die beispielsweise dazu dienen,Statistik(2)- als normale Dateien, nicht als Geräte) sind eine virtuelle Ansicht, die vom Kernel bereitgestellt wird; insbesondere das Lesen von /proc/
(z. B. mit cat /proc/$$/maps
oder durchöffnen(2)-ing /proc/self/status
in Ihrem Programm) erfordert im Allgemeinen keinen physischen I/O von der Festplatte oder dem Netzwerk und ist daher recht schnell.
Um zusätzliche Pseudodateien zu erstellen, /proc/
sollten Sie im Allgemeinen Ihre eigenenKernelmodulund laden Sie es (siehe zBDas).
Antwort4
Wie andere Benutzer bereits ausführlich erklärt haben, ist für spezielle Dateien Code zum Sichern erforderlich. Allerdings scheint niemand erwähnt zu haben, dass Linux mehrere Möglichkeiten bietet, diesen Code im Userspace zu schreiben:
A. SICHERUNG(Dateisystem im USErspace) ermöglicht es Ihnen, etwas wie zu schreiben, /proc
ohne den Kernel zum Absturz zu bringen und dies in einer Sprache/Runtime Ihrer Wahl zu tun, wie zum BeispielGehen,Node.js,Perl,PHP,Python, Rubin,Rost,usw..
Es bietet außerdem den Vorteil, dass FUSE-Dateisysteme ohne gemountet werden können, sudo
da sie als der Benutzer ausgeführt werden, der das Mounten durchführt.
Hier sind einige Beispiele für Dinge, die Leute mit FUSE geschrieben haben:
- mp3fs(Sehen Sie Ihre FLAC-Dateien als MP3-Dateien an, die spontan erstellt werden, wenn Sie sie auf Ihren MP3-Player kopieren/klicken und ziehen.)
- PyTagsFS(Zeigen Sie Ihre Medien in einem Baum virtueller Ordner an, der aus den Metadaten-Tags erstellt wurde)
- Sicherung-Reißverschluss(ZIP-Dateien als Ordner mounten)
- SicherungISO(ISOs ohne Rootberechtigung mounten)
- iFUSE(iDevices einbinden)
- FuseDAV(WebDAV-Freigaben mounten)
- Sicherung-Exfat(Mounten Sie exFAT-formatierte Dateisysteme)
- ntfs-3g(DerLinux NTFS-Treiber)
B.Wenn Sie ein virtuelles Eingabegerät wie eine Tastatur, Maus, einen Joystick usw. erstellen möchten (z. B. um einen Userspace-Treiber für ein USB-Gerät zu schreiben, mit dem Sie kommunizieren libusb
), gibt esEingabe.
Bindungen dafür sind schwieriger zu finden, aber ich weiß, dass es sie gibt fürGehen(Nur Tastatur),Python, UndRubin (2).
Beispiele für die Verwendung von UInput in der Praxis sind:
- G15Daemon(Linux-Treiber für das LCD und die Gaming-Tasten der Logitech G15-Gaming-Tastaturen)
- ds4drv(Treiber für Sony DualShock 4-Controller)
- Abonnieren(Alternativer XBox 360 Controller-Treiber und Linux-Äquivalent zux360ceso schlecht gestaltete Spiele wieRunner2: Zukünftige Legende des Rhythmus-Aliensdenken, sie würden mit einem echten XBox-Controller sprechen, obwohl das nicht der Fall ist)
- Die alten Wiimote-Treiber wiecwiiddie erforderlich waren, bevor endlich jemand einen Wiimote-Kerneltreiber schrieb, sodass die Unterstützung standardmäßig verfügbar wäre.
C.Für generische Zeichengeräte gibt esCUSE(Zeichengeräte im USErspace). Es ist jedoch viel weniger beliebt.
Der einzige mir persönlich bekannte Benutzer der CUSE-API ist dasselbe Programm, das zu ihrer Erstellung geführt hat:osspd/dev/dsp
, das , /dev/adsp
, und (die OSS-Audio-API) im Benutzerbereich implementiert /dev/mixer
, sodass sie über PulseAudio oder dmix geroutet werden können.
Die einzige CUSE-Bindung, die ich finden konnte, istAbonnieren, das seit 2010 nicht mehr aktualisiert wurde.
D.Möglicherweise benötigen Sie überhaupt keine neue Spezialdatei.
Sie können beispielsweise die Rohkommunikation mit jedem USB-Gerät herstellen, indem SieAbonnieren(Liste der Bindungen auf der Seite) und kommunizieren Sie dann über einen anderen Mechanismus (TCP/UDP-Sockets, Lesen/Schreiben von stdin/stdout oder regulären Dateien auf der Festplatte usw.) mit anderen Programmen.