Zum Inhalt springen

„Copy-On-Write“ – Versionsunterschied

aus Wikipedia, der freien Enzyklopädie
[gesichtete Version][gesichtete Version]
Inhalt gelöscht Inhalt hinzugefügt
Keine Bearbeitungszusammenfassung
Dirty-COW: spezifisches Problem des Linux-Kernels
Zeile 1: Zeile 1:
{{Belege}}
Das '''Copy-On-Write'''-Verfahren (kurz '''COW''' genannt, {{enS}} wörtlich für „Kopieren-beim-Schreiben“) ist in der [[Datenverarbeitung]] eine Optimierungsmethode zur Vermeidung unnötiger Kopien und Kopiervorgänge, beispielsweise zwischen [[Prozess (Informatik)|Prozess]]en unter [[Unixartiges Betriebssystem|unixartigen Systemen]], insbesondere bei oder nach einem [[Fork (Unix)|fork]]-Systemaufruf.
Das '''{{lang|en|Copy-On-Write}}'''-Verfahren (kurz '''COW''' genannt, {{enS}} wörtlich für „Kopieren-beim-Schreiben“) ist in der [[Datenverarbeitung]] eine Optimierungsmethode zur Vermeidung unnötiger Kopien und Kopiervorgänge, beispielsweise zwischen [[Prozess (Informatik)|Prozess]]en unter [[Unixartiges Betriebssystem|unixartigen Systemen]], insbesondere bei oder nach einem [[Fork (Unix)|fork]]-Systemaufruf.


Die Grundidee des Verfahrens ist, dass die Kopie erst dann „real“ angefertigt wird, sobald sie von einem der Beteiligten verändert wird. Solange alle Beteiligten ihre Kopie nicht verändert haben, reicht es, das Original ein einziges Mal zu speichern. Die Kopie erfolgt also zunächst „virtuell“ – üblicherweise durch das Setzen ''[[harte Verknüpfung|harter Verknüpfungen]]'' – und wird erst bei einer ersten Änderung verzögert angelegt.
Die Grundidee des Verfahrens ist, dass die Kopie erst dann „real“ angefertigt wird, sobald sie von einem der Beteiligten verändert wird. Solange alle Beteiligten ihre Kopie nicht verändert haben, reicht es, das Original ein einziges Mal zu speichern. Die Kopie erfolgt also zunächst „virtuell“ – üblicherweise durch das Setzen ''[[harte Verknüpfung|harter Verknüpfungen]]'' – und wird erst bei einer ersten Änderung verzögert angelegt.
Zeile 9: Zeile 10:


== Dateisystem ==
== Dateisystem ==
Bei [[Dateisystem]]en bedeutet Copy-On-Write, dass geänderte [[Datenblock|Blöcke]] nicht überschrieben, sondern zunächst vollständig an einen freien Platz kopiert werden. Danach werden Verweise auf den Block in den [[Metadaten]] aktualisiert. Copy-On-Write ermöglicht [[Transaktion (Informatik)|transaktion]]sbasierende Dateisysteme, die unter anderem ohne Verzögerung [[Speicherabbild]]er (oder [[Schnappschuss (Informationstechnik)|Schnappschüsse]] derselben) anlegen können. Alte Metadaten und Blöcke werden dabei nicht gelöscht, sondern dem jeweiligen Speicherabbild zugeordnet.
Bei [[Dateisystem]]en bedeutet {{lang|en|Copy-On-Write}}, dass geänderte [[Datenblock|Blöcke]] nicht überschrieben, sondern zunächst vollständig an einen freien Platz kopiert werden. Danach werden Verweise auf den Block in den [[Metadaten]] aktualisiert. {{lang|en|Copy-On-Write}} ermöglicht [[Transaktion (Informatik)|transaktion]]sbasierende Dateisysteme, die unter anderem ohne Verzögerung [[Speicherabbild]]er (oder [[Schnappschuss (Informationstechnik)|Schnappschüsse]] derselben) anlegen können. Alte Metadaten und Blöcke werden dabei nicht gelöscht, sondern dem jeweiligen Speicherabbild zugeordnet.


[[ZFS (Dateisystem)|ZFS]], [[Btrfs]], [[APFS_(Dateisystem)|APFS]] sowie [[Write Anywhere File Layout|WAFL]] (Netapp) sind bekannte Vertreter von Dateisystemen, die auf ''Copy-on-Write'' bauen.
[[ZFS (Dateisystem)|ZFS]], [[Btrfs]], [[APFS_(Dateisystem)|APFS]] sowie [[Write Anywhere File Layout|WAFL]] (Netapp) sind bekannte Vertreter von Dateisystemen, die auf ''{{lang|en|Copy-on-Write}}'' bauen.

== Dirty-COW ==
Im Oktober 2016 wurde eine Schwachstelle im Linux-Kernel entdeckt<ref>[https://access.redhat.com/security/vulnerabilities/2706661],Kernel Local Privilege Escalation "Dirty COW" - CVE-2016-5195</ref>, welche durch Ausnutzen einer [[Race-Condition]] der Copy-On-Write-Funktion den Schreibzugriff auf ansonsten nur lesbare Daten erlaubt. Dadurch wird eine [[Rechteausweitung|Ausweitung der Benutzerrechte]] bis auf [[root]]-Ebene möglich. Die Schwachstelle erhielt die [[Common Vulnerabilities and Exposures|CVE]]-Nummer ''CVE-2016-5195'' und wurde auf den Namen ''Dirty-COW'' getauft. Der Name ist ein Wortspiel mit dem Begriff ''dirty bits'', welcher Daten bezeichnet, die aus einem [[Cache|Schreibcache]] geschrieben werden müssen, da sie durch einen Schreibzugriff ''verunreinigt'' wurden. Zusätzlich kann es als ''unsauberes Copy-On-Write'' gelesen werden, was den Bug treffend beschreibt: Wenn ein Prozess in einem Thread eine Schreib-Operation auf einen geschützten Speicherbereich durchführt (somit ein Copy-On-Write auslöst) und in einem anderen Thread immer wieder dem Betriebssystem signalisiert, dass die Kopie nicht mehr gebraucht wird und gelöscht werden kann, kommt es vor, dass der Schreibzugriff stattdessen auf das Original erfolgt.

Kurze Zeit später wurde nachgewiesen, dass die Schwachstelle auch [[Android (Betriebssystem)|Android]] betrifft.<ref>[https://heise.de/-3359434],Root-Exploits: Android anfällig für Dirty Cow und Rowhammer</ref>


== Siehe auch ==
== Siehe auch ==

* [[Deduplikation]]
* [[Deduplikation]]

== Einzelnachweise ==
<references />


[[Kategorie:Speicherverwaltung]]
[[Kategorie:Speicherverwaltung]]

Version vom 23. April 2017, 16:44 Uhr

Das Copy-On-Write-Verfahren (kurz COW genannt, englisch wörtlich für „Kopieren-beim-Schreiben“) ist in der Datenverarbeitung eine Optimierungsmethode zur Vermeidung unnötiger Kopien und Kopiervorgänge, beispielsweise zwischen Prozessen unter unixartigen Systemen, insbesondere bei oder nach einem fork-Systemaufruf.

Die Grundidee des Verfahrens ist, dass die Kopie erst dann „real“ angefertigt wird, sobald sie von einem der Beteiligten verändert wird. Solange alle Beteiligten ihre Kopie nicht verändert haben, reicht es, das Original ein einziges Mal zu speichern. Die Kopie erfolgt also zunächst „virtuell“ – üblicherweise durch das Setzen harter Verknüpfungen – und wird erst bei einer ersten Änderung verzögert angelegt.

Hauptspeicher

Wenn der Kernel eine Speicherseite im Adressraum eines anderen Prozesses verfügbar machen muss, ist es nicht nötig, die Daten tatsächlich zu kopieren oder ein weiteres mal im Hauptspeicher anzulegen, wenn die Daten lediglich ausgelesen, aber nicht beschrieben werden. Es genügt, wenn erst einmal die beiden Prozesse auf ein und dieselbe Speicherseite zugreifen. Erst wenn einer der beiden Prozesse die Daten zu ändern versucht, müssen diese tatsächlich (und dann auch nur teilweise) kopiert werden, da sich die Inhalte der Speicherseiten dann unterscheiden.

Dies wird auf modernen Hauptprozessoren meist mit Hilfe von Paging realisiert, wobei die beiden Prozesse auf die gleiche Speicherseite zugreifen. Sowohl im Adressraum des Besitzers des Originals, als auch in dem des Besitzers der Kopie wird dieser gemeinsame Speicherbereich als „nur lesbar“ markiert. Findet ein Schreibzugriff statt, wird das Betriebssystem informiert, so dass dieses vor dem tatsächlichen Schreibzugriff die betroffene Speicherseite durch eine tatsächliche Kopie ersetzen kann.

Dateisystem

Bei Dateisystemen bedeutet Copy-On-Write, dass geänderte Blöcke nicht überschrieben, sondern zunächst vollständig an einen freien Platz kopiert werden. Danach werden Verweise auf den Block in den Metadaten aktualisiert. Copy-On-Write ermöglicht transaktionsbasierende Dateisysteme, die unter anderem ohne Verzögerung Speicherabbilder (oder Schnappschüsse derselben) anlegen können. Alte Metadaten und Blöcke werden dabei nicht gelöscht, sondern dem jeweiligen Speicherabbild zugeordnet.

ZFS, Btrfs, APFS sowie WAFL (Netapp) sind bekannte Vertreter von Dateisystemen, die auf Copy-on-Write bauen.

Siehe auch