"Alles ist eine Datei" ist ein bisschen glib. "Alles erscheint irgendwo im Dateisystem " ist näher an der Marke, und selbst dann ist es eher ein Ideal als ein Gesetz des Systemdesigns.
Zum Beispiel Unix - Domain - Sockets sind keine Dateien, aber sie erscheinen im Dateisystem. Sie können ls -l
einem Domain-Socket seine Attribute, cat
Daten zu / von einem Socket anzeigen , seine Zugriffssteuerung über chmod
usw. ändern .
Obwohl normale TCP / IP-Netzwerk-Sockets mit denselben BSD-Sockets -Systemaufrufen wie Unix-Domänen-Sockets erstellt und bearbeitet werden, werden TCP / IP-Sockets im Dateisystem nicht angezeigt, ¹ obwohl es keinen besonders guten Grund dafür gibt wahr sein.
Ein weiteres Beispiel für nicht-Datei Objekte im Dateisystem erscheinen , ist Linux - /proc
Dateisystem . Diese Funktion stellt dem Benutzer viel Detail über die Laufzeit des Kernels zur Verfügung , hauptsächlich als virtuelle Nur-Text-Dateien. Viele /proc
Einträge sind schreibgeschützt, viele können /proc
jedoch auch geschrieben werden, sodass Sie die Funktionsweise des Systems mit jedem Programm ändern können, das eine Datei ändern kann. Leider haben wir auch hier eine Nichtidealität: Unixe vom Typ BSD werden im Allgemeinen ohne ausgeführt/proc
, und die Unixe von System V bieten viel weniger Möglichkeiten /proc
als Linux.
Ich kann das nicht mit MS Windows vergleichen
Erstens ist vieles, was Sie online und in Büchern über Unix über Datei-E / A und Windows finden, das in dieser Hinsicht "kaputt" ist, obsolet. Windows NT hat vieles behoben.
Moderne Windows-Versionen verfügen wie Unix über ein einheitliches E / A-System, sodass Sie Netzwerkdaten von einem TCP / IP-Socket über ReadFile()
statt über die Windows Sockets-spezifische API lesen können WSARecv()
, wenn Sie dies möchten. Dies entspricht genau der Unixread(2)
- recv(2)
Methode , bei der Sie von einem Netzwerk-Socket entweder mit dem generischen Unix-Systemaufruf oder dem Sockets-spezifischen Aufruf lesen können
Dennoch kann Windows dieses Konzept auch hier im Jahr 2018 nicht auf die gleiche Ebene wie Unix bringen. Es gibt viele Bereiche der Windows-Architektur, auf die über das Dateisystem nicht zugegriffen werden kann oder die nicht als dateiähnlich angesehen werden können. Einige Beispiele:
Fahrer.
Das Windows-Treibersubsystem ist leicht so umfangreich und leistungsstark wie das von Unix. Um jedoch Programme zur Manipulation von Treibern zu schreiben, müssen Sie im Allgemeinen das Windows Driver Kit verwenden , dh C- oder .NET-Code schreiben.
Unter Unix-Betriebssystemen können Sie über die Befehlszeile eine Menge mit Treibern tun. Sie haben dies mit ziemlicher Sicherheit bereits getan, wenn auch nur durch Umleiten unerwünschter Ausgaben nach /dev/null
.³
Programmübergreifende Kommunikation.
Windows-Programme können nicht einfach miteinander kommunizieren.
Unix-Kommandozeilenprogramme kommunizieren problemlos über Textströme und Pipes. GUI-Programme werden häufig entweder auf Befehlszeilenprogrammen erstellt oder exportieren eine Textbefehlsschnittstelle, sodass dieselben einfachen textbasierten Kommunikationsmechanismen auch mit GUI-Programmen funktionieren.
Die Registrierung.
Unix hat kein direktes Äquivalent zur Windows-Registrierung. Die gleichen Informationen werden durch das Dateisystem verstreut, die meisten davon in /etc
, /proc
und /sys
.
Wenn Sie nicht sehen, dass Treiber, Pipes und die Antwort von Unix auf die Windows-Registrierung etwas mit "Alles ist eine Datei" zu tun haben, lesen Sie weiter.
Wie wirkt sich die Philosophie "Alles ist eine Datei" hier aus?
Ich werde das erklären, indem ich meine drei obigen Punkte im Detail anspreche.
Lange Antwort, Teil 1: Laufwerke vs Gerätedateien
Angenommen, Ihr CF-Kartenleser wird E:
unter Windows und /dev/sdc
Linux angezeigt . Welchen praktischen Unterschied macht es?
Es ist nicht nur ein kleiner Syntaxunterschied.
Unter Linux kann ich sagen dd if=/dev/zero of=/dev/sdc
, dass der Inhalt von /dev/sdc
mit Nullen überschrieben werden soll .
Überlegen Sie sich für eine Sekunde, was das bedeutet. Hier habe ich ein normales User-Space-Programm ( dd(1)
), das ich gebeten habe, Daten von einem virtuellen Gerät ( /dev/zero
) einzulesen und das Gelesene /dev/sdc
über das Unified-Unix-Dateisystem auf ein reales physisches Gerät ( ) zu schreiben . dd
weiß nicht, dass es sich um das Lesen und Schreiben auf speziellen Geräten handelt. Es funktioniert genauso gut mit regulären Dateien oder mit einer Mischung aus Geräten und Dateien, wie wir unten sehen werden.
Es gibt keine einfache Möglichkeit, das E:
Laufwerk unter Windows auf Null zu setzen, da Windows zwischen Dateien und Laufwerken unterscheidet und Sie daher nicht dieselben Befehle verwenden können, um sie zu bearbeiten. Am ehesten können Sie ein Festplattenformat ohne die Option "Schnellformatierung" erstellen, bei der der größte Teil des Laufwerksinhalts auf Null gesetzt wird, dann jedoch ein neues Dateisystem darauf geschrieben wird. Was ist, wenn ich kein neues Dateisystem möchte ? Was ist, wenn ich wirklich möchte, dass die Festplatte nur mit Nullen gefüllt ist?
Seien wir großzügig und sagen wir, dass wir wirklich ein neues Dateisystem wollen E:
. Um dies in einem Programm unter Windows zu tun, muss ich eine spezielle Formatierungs-API aufrufen. Unter Linux müssen Sie kein Programm schreiben, um auf die "Format Disk" -Funktionalität des Betriebssystems zuzugreifen. Sie führen nur den entsprechenden User - Space - Programm für die Dateisystem - Typ Sie erstellen möchten: mkfs.ext4
, mkfs.xfs
oder das, was Sie haben. Diese Programme schreiben ein Dateisystem auf die Datei oder den /dev
Knoten, die bzw. den Sie übergeben.
Da mkfs
Typprogramme auf Unixy-Systemen mit Dateien arbeiten, ohne künstlich zwischen Geräten und normalen Dateien zu unterscheiden, kann ich auf meiner Linux-Box ein ext4-Dateisystem in einer normalen Datei erstellen :
$ dd if=/dev/zero of=myfs bs=1k count=1k
$ mkfs.ext4 -F myfs
Das erstellt buchstäblich ein 1-MiB-Disk-Image im aktuellen Verzeichnis namens myfs
. Ich kann es dann mounten, als wäre es ein anderes externes Dateisystem:
$ mkdir mountpoint
$ sudo mount -o loop myfs mountpoint
$ grep $USER /etc/passwd > mountpoint/my-passwd-entry
$ sudo umount mountpoint
Jetzt habe ich ein ext4-Image mit einer aufgerufenen Datei my-passwd-entry
, die den /etc/passwd
Eintrag meines Benutzers enthält .
Wenn ich möchte, kann ich dieses Bild auf meine CF-Karte strahlen:
$ sudo dd if=myfs of=/dev/sdc1
Oder ich kann das Image des Datenträgers packen, per Post an Sie senden und es auf ein Medium Ihrer Wahl schreiben lassen , z. B. einen USB-Speicherstick:
$ gzip myfs
$ echo "Here's the disk image I promised to send you." |
mutt -a myfs.gz -s "Password file disk image" you@example.com
All dies ist unter Linux möglich, da es keine künstliche Unterscheidung zwischen Dateien, Dateisystemen und Geräten gibt. Viele Dinge auf Unix - Systemen entweder sind Dateien, oder werden über das Dateisystem zugegriffen , so dass sie aussehen Dateien oder auf andere Weise sehen ausreichend dateiähnliche dass sie als solche behandelt werden.
Windows 'Konzept des Dateisystems ist ein Durcheinander; Es unterscheidet zwischen Verzeichnissen, Laufwerken und Netzwerkressourcen. Es gibt drei verschiedene Syntaxen, die in Windows alle zusammengeführt werden: das Unix-ähnliche ..\FOO\BAR
Pfadsystem, Laufwerksbuchstaben C:
und UNC-Pfade \\SERVER\PATH\FILE.TXT
. Dies liegt daran, dass es sich um eine Ansammlung von Ideen aus Unix, CP / M , MS-DOS und LAN Manager handelt und nicht um ein einziges zusammenhängendes Design. Aus diesem Grund sind in Windows-Dateinamen so viele ungültige Zeichen enthalten .
Unix hat ein einheitliches Dateisystem, auf das über ein einziges gemeinsames Schema zugegriffen werden kann. Um ein Programm auf einem Feld Linux läuft, gibt es keinen funktionalen Unterschied zwischen /etc/passwd
, /media/CF_CARD/etc/passwd
und /mnt/server/etc/passwd
. Lokale Dateien, externe Medien und Netzwerkfreigaben werden auf dieselbe Weise behandelt
Windows kann ähnliche Ergebnisse erzielen wie das obige Beispiel für ein Festplatten-Image, Sie müssen jedoch spezielle Programme verwenden, die von ungewöhnlich talentierten Programmierern geschrieben wurden. Aus diesem Grund gibt es unter Windows so viele Programme vom Typ "virtuelle DVD" . Das Fehlen einer Kernfunktion des Betriebssystems hat einen künstlichen Markt für Programme geschaffen, um diese Lücke zu schließen. Dies bedeutet, dass Sie eine Menge Leute haben, die im Wettbewerb um das beste virtuelle DVD-Programm stehen. Auf * ix-Systemen benötigen wir solche Programme nicht, da wir ein ISO-Image nur mit einem Loop-Gerät mounten können .
Gleiches gilt für andere Tools wie Disk Wiping- Programme, die wir auch auf Unix-Systemen nicht benötigen. Möchten Sie, dass der Inhalt Ihrer CF-Karte unwiederbringlich verschlüsselt und nicht nur auf Null gesetzt wird? Okay, /dev/random
als Datenquelle verwenden, anstatt /dev/zero
:
$ sudo dd if=/dev/random of=/dev/sdc
Unter Linux erfinden wir solche Laufräder nicht immer wieder neu, da die Kernfunktionen des Betriebssystems nicht nur gut genug funktionieren, sondern auch so gut, dass sie allgegenwärtig sind. Ein typisches Schema zum Booten einer Linux-Box ist ein virtuelles Festplatten-Image, das mit den oben gezeigten Techniken erstellt wurde
Ich halte es nur für fair, darauf hinzuweisen, dass wir, wenn Unix von Anfang an TCP / IP I / O in das Dateisystem integriert hätte, nicht das netcat
vs socat
vs Ncat
vs mess hätten , dessen Ursache die gleiche Designschwäche war, die zu dem führte Verbreitung von Disk-Imaging- und Wiping-Tools unter Windows: Fehlen einer akzeptablen Betriebssystemfunktion.nc
Lange Antwort, Teil 2: Pipes als virtuelle Dateien
Trotz seiner Wurzeln in DOS hatte Windows noch nie eine lange Tradition in der Befehlszeile.
Dies ist nicht zu sagen , dass Windows nicht hat eine Befehlszeile, oder dass es viele Kommandozeilenprogramme fehlt. Windows hat heutzutage sogar eine sehr leistungsfähige Befehls-Shell, die PowerShell genannt wird .
Das Fehlen einer Kommandozeilentradition hat jedoch Konsequenzen. Sie erhalten Tools, wie sie DISKPART
in der Windows-Welt fast unbekannt sind, da die meisten Benutzer die Festplattenpartitionierung und dergleichen über das MMC-Snap-In "Computerverwaltung" ausführen. Wenn Sie dann das Erstellen von Partitionen DISKPART
per Skript ausführen müssen, stellen Sie fest, dass diese nicht wirklich von einem anderen Programm gesteuert werden. Ja, Sie können eine Reihe von Befehlen in eine Skriptdatei schreiben und über ausführen DISKPART /S scriptfile
, aber es ist alles oder nichts. Was Sie in einer solchen Situation wirklich wollen, ist so etwas wie GNUparted
, das einzelne Befehle wie annimmt parted /dev/sdb mklabel gpt
. Dadurch kann Ihr Skript die Fehlerbehandlung Schritt für Schritt durchführen.
Was hat das alles mit "Alles ist eine Datei" zu tun? Einfach: Pipes machen Kommandozeilen-Programm-I / O zu "Dateien". Pipes sind unidirektionale Streams , die nicht wie eine normale Festplattendatei per Direktzugriff abgerufen werden können. In vielen Fällen ist der Unterschied jedoch ohne Bedeutung. Wichtig ist, dass Sie zwei unabhängig voneinander entwickelte Programme anhängen und über einfachen Text kommunizieren lassen. In diesem Sinne können zwei beliebige Programme, die nach dem Unix-Prinzip entwickelt wurden, miteinander kommunizieren.
In den Fällen, in denen Sie wirklich eine Datei benötigen, ist es einfach, die Programmausgabe in eine Datei umzuwandeln:
$ some-program --some --args > myfile
$ vi myfile
Aber warum die Ausgabe in eine temporäre Datei schreiben, wenn die Philosophie "Alles ist eine Datei" Ihnen einen besseren Weg gibt? Wenn Sie nur die Ausgabe dieses Befehls in einen vi
Editorpuffer lesen möchten , vi
können Sie dies direkt für Sie tun. vi
Sagen Sie im "normalen" Modus:
:r !some-program --some --args
Dadurch wird die Ausgabe des Programms an der aktuellen Cursorposition in den aktiven Editorpuffer eingefügt. Unter der Haube vi
werden Pipes verwendet, um die Ausgabe des Programms mit einem Code zu verbinden, der dieselben Betriebssystemaufrufe verwendet, die er zum Lesen aus einer Datei verwenden würde. Es würde mich nicht wundern, wenn die beiden Fälle von :r
- also mit und ohne !
- in allen gängigen Implementierungen von dieselbe generische Datenleseschleife verwenden würden vi
. Ich kann mir keinen guten Grund vorstellen, das nicht zu tun.
Dies ist auch keine neue Funktion von vi
; es geht klar auf den alten ed(1)
Texteditor zurück. «
Diese mächtige Idee taucht in Unix immer wieder auf.
Rufen Sie für ein zweites Beispiel meinen mutt
obigen E-Mail-Befehl auf. Der einzige Grund, warum ich das als zwei separate Befehle schreiben musste, war, dass ich wollte, dass die temporäre Datei benannt wird *.gz
, damit der E-Mail-Anhang korrekt benannt wird. Wenn mir der Dateiname egal gewesen wäre, hätte ich die Prozessersetzung verwenden können , um das Erstellen der temporären Datei zu vermeiden:
$ echo "Here's the disk image I promised to send you." |
mutt -a <(gzip -c myfs) -s "Password file disk image" you@example.com
Das vermeidet das Temporäre, indem die Ausgabe von gzip -c
in ein FIFO (das dateiähnlich ist) oder ein /dev/fd
Objekt (das dateiähnlich ist) umgewandelt wird. (Bash wählt die Methode basierend auf den Funktionen des Systems, da sie /dev/fd
nicht überall verfügbar ist.)
Für noch einen dritten Weg erscheint diese mächtige Idee in Unix, wenn man gdb
an Linux-Systeme denkt. Dies ist der Debugger, der für jede in C und C ++ geschriebene Software verwendet wird. Programmierer, die von anderen Systemen zu Unix kommen, schauen sich das an gdb
und meckern es fast immer: "Yuck, es ist so primitiv!" Dann suchen sie nach einem GUI-Debugger, finden einen von mehreren, die es gibt, und setzen ihre Arbeit gerne fort. Oft wird ihnen nicht bewusst, dass die GUI nur gdb
darunter ausgeführt wird und eine hübsche Shell darauf bereitstellt. Auf den meisten Unix-Systemen gibt es keine konkurrierenden Debugger auf niedriger Ebene, da auf dieser Ebene keine Programme konkurrieren müssen. Alles, was wir brauchen, ist ein gutes Low-Level-Tool, auf das wir alle unsere High-Level-Tools aufbauen können, wenn dieses Low-Level-Tool problemlos über Pipes kommuniziert.
Dies bedeutet, dass wir jetzt eine dokumentierte Debugger-Oberfläche haben, die es ermöglichen würde gdb
, den primären Konkurrenten, gdb
der den reibungslosen Weg nicht eingeschlagen hat, zu ersetzen .
Dennoch ist es zumindest möglich, dass ein Teil der zukünftigen gdb
Ersetzung durch einfaches Klonen der Befehlszeilenschnittstelle transparent wird. Um dasselbe auf einer Windows-Box zu erreichen, mussten die Entwickler des austauschbaren Tools eine Art formales Plugin oder eine Automatisierungs-API definieren. Das bedeutet, dass dies nur mit den beliebtesten Programmen der Fall ist, da es eine Menge Arbeit ist, sowohl eine normale Befehlszeilen-Benutzeroberfläche als auch eine vollständige Programmierschnittstelle zu erstellen.
Diese Magie geschieht durch die Gnade des allgegenwärtigen textbasierten IPC .
Obwohl der Windows-Kernel über anonyme Pipes im Unix-Stil verfügt , werden sie von normalen Benutzerprogrammen nur selten für IPC außerhalb einer Befehlsshell verwendet, da es in Windows an dieser Tradition mangelt, zunächst alle Kerndienste in einer Befehlszeilenversion zu erstellen und dann die GUI aufzubauen oben separat. Dies führt dazu, dass einige Dinge ohne die GUI nicht möglich sind. Dies ist ein Grund, warum es im Vergleich zu Linux so viele Remotedesktopsysteme für Windows gibt: Windows ist ohne die GUI sehr schwer zu verwenden.
Im Gegensatz dazu ist es üblich, Unix-, BSD-, OS X- und Linux-Boxen remote über SSH zu verwalten. Und wie funktioniert das, fragst du? SSH verbindet einen Netzwerk-Socket (der dateiähnlich ist) mit einer Pseudotty unter /dev/pty*
(der dateiähnlich ist). Jetzt ist Ihr Remote-System über eine Verbindung mit Ihrem lokalen System verbunden, die so nahtlos mit der Unix-Methode übereinstimmt, dass Sie bei Bedarf Daten über die SSH-Verbindung weiterleiten können.
Erhalten Sie eine Vorstellung davon, wie leistungsfähig dieses Konzept jetzt ist?
Ein weitergeleiteter Textstrom ist aus der Perspektive eines Programms nicht von einer Datei zu unterscheiden, mit der Ausnahme, dass er unidirektional ist. Ein Programm liest aus einer Pipe genauso wie aus einer Datei: über einen Dateideskriptor . FDs sind der absolute Kern von Unix. Die Tatsache, dass Dateien und Pipes für E / A auf beiden dieselbe Abstraktion verwenden, sollte Ihnen etwas mitteilen
Die Windows-Welt, in der diese Tradition der einfachen Textkommunikation fehlt, kommt mit schwergewichtigen OOP- Schnittstellen über COM oder .NET aus . Wenn Sie ein solches Programm automatisieren müssen, müssen Sie auch ein COM- oder .NET-Programm schreiben. Dies ist ein gutes Stück schwieriger als das Einrichten einer Pipe auf einer Unix-Box.
Windows-Programme, denen diese komplizierten Programmierschnittstellen fehlen, können nur über verarmte Schnittstellen wie die Zwischenablage oder Datei / Speichern, gefolgt von Datei / Öffnen, kommunizieren.
Lange Antwort, Teil 3: Die Registry vs. Konfigurationsdateien
Der praktische Unterschied zwischen der Windows-Registrierung und der Unix-Systemkonfiguration verdeutlicht auch die Vorteile der Philosophie "Alles ist eine Datei".
Auf Unix-Systemen kann ich die Informationen zur Systemkonfiguration über die Befehlszeile anzeigen, indem ich nur die Dateien untersuche. Ich kann das Systemverhalten ändern, indem ich dieselben Dateien ändere. In den meisten Fällen handelt es sich bei diesen Konfigurationsdateien nur um reine Textdateien. Das bedeutet, dass ich jedes Tool unter Unix verwenden kann, um sie zu bearbeiten, das mit einfachen Textdateien arbeiten kann.
Das Skripting der Registrierung ist unter Windows bei weitem nicht so einfach.
Die einfachste Methode besteht darin, Ihre Änderungen über die Benutzeroberfläche des Registrierungseditors auf einem Computer vorzunehmen und diese Änderungenregedit
*.reg
dann blind auf andere Computer mit Via- Dateien anzuwenden . Das ist nicht wirklich "Scripting", da Sie damit nichts Bedingtes tun können: Es ist alles oder nichts.
Wenn Ihre Registrierungsänderungen viel Logik erfordern, ist die nächst einfachere Option das Erlernen von PowerShell , was im Grunde genommen dem Erlernen der .NET-Systemprogrammierung entspricht. Es wäre so, als hätte Unix nur Perl und Sie müssten die gesamte Ad-hoc- Systemadministration über Perl durchführen . Jetzt bin ich ein Perl-Fan, aber nicht jeder ist es. Unter Unix können Sie jedes beliebige Tool verwenden, solange es reine Textdateien manipulieren kann.
Fußnoten:
Plan 9 hat diesen Designfehler behoben und die Netzwerk-E / A über das /net
virtuelle Dateisystem verfügbar gemacht .
Bash hat eine Funktion/dev/tcp
, die Netzwerk-E / A über reguläre Dateisystemfunktionen ermöglicht. Da es sich um eine Bash-Funktion, eher um eine Kernel-Funktion handelt, ist sie außerhalb von Bash oder auf Systemen, die Bash überhaupt nicht verwenden , nicht sichtbar . Dies zeigt zum Beispiel, warum es eine so gute Idee ist, alle Datenressourcen durch das Dateisystem sichtbar zu machen.
Mit "modernem Windows" meine ich Windows NT und alle seine direkten Nachkommen, einschließlich Windows 2000, aller Versionen von Windows Server und aller desktoporientierten Versionen von Windows ab XP. Ich verwende den Begriff, um die DOS-basierten Versionen von Windows auszuschließen, also Windows 95 und seine direkten Nachkommen, Windows 98 und Windows ME sowie deren 16-Bit-Vorgänger.
Sie erkennen den Unterschied am Fehlen eines einheitlichen E / A-Systems in den letztgenannten Betriebssystemen. Unter ReadFile()
Windows 95 können Sie keinen TCP / IP-Socket übergeben. Sie können Sockets nur an die Windows Sockets-APIs übergeben. Weitere Informationen zu diesem Thema finden Sie in Andrew Schulmans wichtigstem Artikel, Windows 95: What It's Not .
Machen Sie keinen Fehler, /dev/null
ist ein echtes Kernel-Gerät auf Unix-Typ-Systemen, nicht nur ein Dateiname in einem speziellen Gehäuse, wie es das oberflächliche Äquivalent NUL
in Windows ist.
Obwohl Windows versucht, Sie daran zu hindern, eine NUL
Datei zu erstellen, ist es möglich, diesen Schutz mit bloßen Tricks zu umgehen und die Parsing-Logik für Windows-Dateinamen zu täuschen. Wenn Sie versuchen, mit cmd.exe
oder über den Explorer auf diese Datei zuzugreifen, wird Windows das Öffnen verweigern. Sie können jedoch über Cygwin darauf schreiben, da Dateien mit ähnlichen Methoden wie im Beispielprogramm geöffnet und über ähnliche Tricks gelöscht werden können .
Im Gegensatz dazu lässt Unix Sie glücklich zu rm /dev/null
, solange Sie Schreibzugriff haben /dev
, und lässt Sie eine neue Datei an ihrer Stelle erstellen, alles ohne Trick, weil dieser Dev-Knoten nur eine andere Datei ist. Während dieser Dev-Knoten fehlt, ist das Null-Gerät des Kernels noch vorhanden. Es ist einfach nicht zugänglich, bis Sie den Dev-Knoten über neu erstellen mknod
.
Sie können sogar an anderer Stelle zusätzliche Null-Geräte-Entwicklungsknoten erstellen: Es spielt keine Rolle, ob Sie sie aufrufen /home/grandma/Recycle Bin
, solange es sich um einen Entwicklungsknoten für das Null-Gerät handelt, der genauso funktioniert wie /dev/null
.
Es gibt tatsächlich zwei High-Level "Format Disk" APIs in Windows: SHFormatDrive()
und Win32_Volume.Format()
.
Es gibt zwei für einen sehr ... na ja ... Windows- Grund. Der erste fordert den Windows Explorer auf, das normale Dialogfeld "Datenträger formatieren" anzuzeigen. Dies bedeutet, dass es unter allen modernen Windows-Versionen funktioniert, jedoch nur, wenn ein Benutzer interaktiv angemeldet ist. Der andere kann ohne Benutzereingabe im Hintergrund aufgerufen werden. Windows wurde es jedoch erst mit Windows Server 2003 hinzugefügt. Richtig, das Verhalten des Kernbetriebssystems war bis 2003 hinter einer grafischen Benutzeroberfläche verborgen, in einer Welt, in der Unix mkfs
ab dem ersten Tag ausgeliefert wurde .
Meine Kopie von Unix V5 aus dem Jahr 1974 enthält /etc/mkfs
eine statisch verknüpfte 4136-Byte- PDP-11- Programmdatei. (Unix wurde erst Ende der 1980er Jahre dynamisch verknüpft , sodass es nicht so ist, als gäbe es irgendwo anders eine große Bibliothek, in der die eigentliche Arbeit /usr/source/s2/mkfs.c
erledigt wird .) Der im V5-System-Image enthaltene Quellcode ist ein vollständig eigenständiger Zeile C Programm. Es gibt nicht einmal irgendwelche #include
Aussagen!
Dies bedeutet, dass Sie nicht nur untersuchen können, was mkfs
auf hohem Niveau funktioniert, sondern auch mit demselben Tool-Set experimentieren können, mit dem Unix vor vier Jahrzehnten erstellt wurde, genau wie Sie Ken Thompson . Versuchen Sie das mit Windows. Der nächste Schritt, den Sie heute unternehmen können, ist das Herunterladen des 2014 erstmals veröffentlichten DOS-Quellcodes , bei dem es sich lediglich um einen Stapel von Assembly- Quellen handelt. Es wird nur mit veralteten Tools erstellt, die Sie wahrscheinlich nicht zur Hand haben, und am Ende erhalten Sie Ihre eigene Kopie von DOS 2.0, einem Betriebssystem, das weitaus weniger leistungsfähig ist als das Unix V5 von 1974 , obwohl es fast ein Jahrzehnt später veröffentlicht wird.
(Warum über Unix V5 sprechen? Weil es das früheste vollständige Unix-System ist, das noch verfügbar ist. Frühere Versionen sind anscheinend zeitlos . Es gab ein Projekt , das ein Unix der V1 / V2-Ära zusammengesetzt hat, aber es scheint mkfs
trotz der Existenz zu fehlen der oben verlinkten V1-Handbuchseite beweisen, dass es irgendwo existiert haben muss, irgendwo. Entweder konnten diejenigen, die dieses Projekt zusammenstellten, keine noch vorhandene Kopie von mkfs
include finden, oder ich finde keine Dateien ohne find(1)
, die es in diesem System auch nicht gibt . :)
)
Vielleicht denken Sie jetzt: "Kann ich nicht einfach anrufen format.com
? Ist das unter Windows nicht dasselbe wie mkfs
unter Unix?" Ach, nein, es ist nicht dasselbe, aus einer Reihe von Gründen:
Erstens format.com
war nicht für Skripte konzipiert. Es fordert Sie auf, "ENTER zu drücken, wenn Sie fertig sind", was bedeutet, dass Sie eine Eingabetaste an die Eingabe senden müssen, oder es bleibt einfach hängen.
Wenn Sie dann mehr als einen Erfolgs- / Fehlerstatuscode wünschen, müssen Sie seine Standardausgabe zum Lesen öffnen, was unter Windows weitaus komplizierter ist als nötig . (Unter Unix kann alles in diesem verlinkten Artikel mit einem einfachen popen(3)
Aufruf ausgeführt werden.)
Nach all diesen Komplikationen ist die Ausgabe von format.com
für Computerprogramme schwerer zu analysieren als die Ausgabe von mkfs
, die in erster Linie für den menschlichen Verzehr bestimmt ist.
Wenn Sie verfolgen , was der format.com
Fall ist, finden Sie , dass es eine Reihe von komplizierten Anrufe tut DeviceIoControl()
, ufat.dll
und so perfekt . Es wird nicht einfach eine Gerätedatei geöffnet und ein neues Dateisystem auf dieses Gerät geschrieben. Dies ist die Art von Design, die Sie von einem Unternehmen erhalten, das 126.000 Mitarbeiter beschäftigt und das diese weiterhin beschäftigen muss.
Wenn ich über Loop-Geräte spreche, spreche ich im Allgemeinen nur über Linux und nicht über Unix, da Loop-Geräte nicht zwischen Unix-Systemen portierbar sind. Es gibt ähnliche Mechanismen in OS X, BSD usw., aber die Syntax variiert etwas .
Früher, als Festplatten so groß wie Waschmaschinen waren und mehr kosteten als das Luxusauto des Abteilungsleiters, teilten sich große Computerlabors im Vergleich zu modernen Computerumgebungen einen größeren Teil ihres gemeinsamen Speicherplatzes. Die Möglichkeit, eine Remote-Festplatte transparent in das lokale Dateisystem zu übertragen, erleichterte die Verwendung solcher verteilten Systeme erheblich. Hier bekommen wir /usr/share
zum Beispiel.
Im Gegensatz zu Windows, bei dem eine Remote-Festplatte normalerweise entweder einem Laufwerksbuchstaben zugeordnet ist oder über einen UNC-Pfad zugegriffen werden muss, anstatt transparent in das lokale Dateisystem integriert zu sein. Laufwerksbuchstaben bieten Ihnen nur wenige Möglichkeiten für den symbolischen Ausdruck. bezieht P:
sich auf den "öffentlichen" Bereich auf BigServer oder auf das Verzeichnis "packages" auf dem Software Mirror Server? UNC-Pfade bedeuten, dass Sie sich merken müssen, auf welchem Server sich Ihre Remotedateien befinden, was in einer großen Organisation mit Hunderten oder Tausenden von Dateiservern schwierig wird.
Windows hat bis zur Veröffentlichung von Windows Vista im Jahr 2007, in der symbolische NTFS-Links eingeführt wurden, keine Symlinks erhalten . Die symbolischen Links von Windows sind ein bisschen leistungsfähiger als die symbolischen Links von Unix - eine Funktion von Unix seit 1977 -, da sie auch auf eine Remote-Dateifreigabe verweisen können, nicht nur auf einen lokalen Pfad. Unix hat das anders gemacht, und zwar über NFS im Jahr 1984 , das auf Unix 'bereits vorhandener Mount-Point- Funktion aufbaut , die es von Anfang an hatte.
Je nachdem, wie Sie es sehen, lag Windows ungefähr zwei oder drei Jahrzehnte hinter Unix.
Auch dann sind symbolische Verknüpfungen aus mehreren Gründen kein normaler Bestandteil der Windows-Benutzererfahrung.
Erstens können Sie sie nur mit dem erstellen rückwärts Kommandozeilenprogramm MKLINK
. Sie können sie aus dem Windows Explorer nicht erstellen, während der Unix - Äquivalente zu Windows Explorer normalerweise tun Sie Symlinks erstellen lassen.
Zweitens verhindert die Windows-Standardkonfiguration, dass normale Benutzer symbolische Links erstellen. Dazu müssen Sie entweder die Befehlsshell als Administrator ausführen oder dem Benutzer die Berechtigung erteilen, diese über einen undurchsichtigen Pfad in einem Tool zu erstellen , das Ihr durchschnittlicher Benutzer noch nie gesehen hat, geschweige denn kennt wie benutzt man. (Und im Gegensatz zu den meisten Problemen mit Administratorrechten in Windows ist die Benutzerkontensteuerung in diesem Fall keine Hilfe.)
Linux-Boxen verwenden in der Startsequenz nicht immer ein virtuelles Festplatten-Image. Es gibt verschiedene Möglichkeiten, dies zu tun .
man ed
Network-Socket-Deskriptoren sind übrigens auch darunterliegende FDs.