{"id":3447,"date":"2018-04-24T08:11:39","date_gmt":"2018-04-24T08:11:39","guid":{"rendered":"https:\/\/anexia.com\/blog\/de\/?p=3447"},"modified":"2022-04-15T15:21:07","modified_gmt":"2022-04-15T13:21:07","slug":"speicherplatzgrenzen-fuer-dateisysteme-in-go","status":"publish","type":"post","link":"https:\/\/anexia.com\/blog\/de\/speicherplatzgrenzen-fuer-dateisysteme-in-go\/","title":{"rendered":"Speicherplatzgrenzen f\u00fcr Dateisysteme in Go"},"content":{"rendered":"<p>Die Verwaltung von Grenzen f\u00fcr den Speicherplatzverbrauch basiert auf einem recht simplen Konzept. Anstatt jedem Benutzer zu erlauben, den gesamten verf\u00fcgbaren Speicherplatz in einem Dateisystem (oder weniger technisch: einer Festplatte) aufzubrauchen, wird der Speicherplatz je Benutzer durch sogenannte <em>Quotas<\/em> limitiert. Diese Quotas definieren, wie viel Speicherplatz ein einzelner Benutzer oder eine Benutzergruppe verwenden darf.<\/p>\n<p>In seiner ansonsten umfangreichen Standardbibliothek ist derzeit in Go noch kein Support f\u00fcr die Verwaltung von Grenzen f\u00fcr den Speicherplatzverbrauch inkludiert. Leider gibt es auch von Drittanbietern noch keine Bibliotheken, die diese Funktionalit\u00e4t beinhalten. Eines unserer aktuellen Projekte in der <a href=\"https:\/\/anexia.com\/de\/softwareentwicklung\/arbeiten-mit-anexia\/engineering-fe\/\">Anexia R&amp;D Abteilung<\/a> macht eine Speicherplatzbegrenzung in Go erforderlich, somit haben wir selbst eine L\u00f6sung entwickelt: Eine native Implementierung in Go.<\/p>\n<p>Ich m\u00f6chte diese Gelegenheit nutzen, um zu erl\u00e4utern, wie Go mit dem zugrundeliegenden Betriebssystem interagiert &#8211; und zwar im Low-Level Bereich &#8211; dem <em>Syscall<\/em>-Level. Diese Schritte werden w\u00e4hrend der Entwicklung unserer L\u00f6sung nochmals er\u00f6rtert. Dahingehend wird erkl\u00e4rt, auf welche Weise die notwendige Grundlagenrecherche durchgef\u00fchrt wurde und wie wir unsere Quota-Bibliothek entwickelt haben.<\/p>\n<h2>Kernel-Schnittstelle<\/h2>\n<p>In Linux unterst\u00fctzt uns\u00a0<em>libc<\/em> bei der Speicherplatzbegrenzung mithilfe seiner <em>quotactl<\/em> Funktion. <em>musl-libc<\/em> zeigt, dass quotactl als d\u00fcnner\u00a0Wrapper um den zugrundeliegenden System-Call mit dem selben Namen dienen kann:<\/p>\n<pre class=\"lang:go decode:true \">int quotactl(int cmd, const char *special, int id, char *addr)\r\n{\r\n  return syscall(SYS_quotactl, cmd, special, id, addr);\r\n}\r\n<\/pre>\n<p>Diese Funktion, gepaart mit einigen in <em>musl<\/em>&#8217;s <em>include\/sys\/quota.h <\/em>definierten C Pr\u00e4prozessormakros, bietet eine vollumf\u00e4ngliche Quota-L\u00f6sung. Wie man sieht, war f\u00fcr die Verwendung von Quotas in Go nur ein d\u00fcnner Wrapper, wie die in <em>musl-libc<\/em>, notwendig &#8211; und hier beginnen wir mit der Implementierung dieser Funktionalit\u00e4t in Go.<\/p>\n<h2>Ein Testbed vorbereiten<\/h2>\n<p>Bevor man mit dem Testing beginnen kann, ben\u00f6tigt man ein sogenanntes Testbed. Wir w\u00e4hlen hier die Erstellung eines neuen ext4-Dateisystems aus, aktivieren die Quotas und mounten diese Datei mithilfe eines Loop Devices:<\/p>\n<pre class=\"lang:go decode:true \">$ truncate -s 1G \/tmp\/test.ext4\r\n$ \/sbin\/mkfs.ext4 \/tmp\/test.ext4\r\n$ sudo mkdir -p \/mnt\/quota_test\r\n$ sudo mount -o usrjquota=aquota.user,grpjquota=aquota.group,jqfmt=vfsv1 \/tmp\/test.ext4 \/mnt\/quota_test\r\n$ sudo quotacheck -vucm \/mnt\/quota_test\r\n$ sudo quotacheck -vgcm \/mnt\/quota_test\r\n$ sudo quotaon -v \/mnt\/quota_test\r\n<\/pre>\n<p>Eventuell bedarf es zun\u00e4chst der Installation der Quota-Pakete. In Debian und Ubuntu hei\u00dft das ben\u00f6tigte Paket <em>quota<\/em>. Nach erfolgreicher Durchf\u00fchrung der oben beschriebenen Schritte, erhalten wir ein neues Dateisystem mit Begrenzungen f\u00fcr Benutzer und Gruppen unter <em>\/mnt\/quota_test<\/em>. Achte auf den zuletzt aufgerufenen Befehl. Er sollte den Pr\u00e4fix <em>\/dev\/loopN <\/em>haben, wobei <em>N<\/em> eine beliebige Zahl ist. Diese Bezeichnung wird sp\u00e4ter noch ben\u00f6tigt.<\/p>\n<h2>Systemaufrufe (Syscalls) in Go<\/h2>\n<p>Die Standardbibliothek in Go bietet zahlreiche Funktionen, um direkt \u00fcber das <em>syscalls<\/em> Paket mit Systemaufrufen zu arbeiten. Gl\u00fccklicherweise definiert dieses Paket auch die <em>SYS_QUOTACTL<\/em> Konstante &#8211; und beinhaltet die erforderliche Syscall-Nummer. Zus\u00e4tzlich bietet das Paket einige sehr praktische Hilfsfunktionen, wie zum Beispiel <em>BytePtrFromString<\/em> &#8211; zu denen wir sp\u00e4ter noch kommen werden.<\/p>\n<p>Des Weiteren beinhaltet es die <em>Syscall <\/em>und <em>Syscall6<\/em> Funktionen, welche die Systemaufrufe ausl\u00f6sen. Die erste Variante kann bis zu drei Argumente aufrufen und <em>Syscall6<\/em> unterst\u00fctzt &#8211; wie der Name schon sagt &#8211; bis zu sechs. Da man f\u00fcr den <em>quotactl <\/em>Systemaufruf f\u00fcnf Argumente ben\u00f6tigt, f\u00e4llt die Wahl auf Syscall6.<\/p>\n<h2>Durchforsten der man-page<\/h2>\n<p>Auf der\u00a0man-page\u00a0<em>quotactl(2) <\/em>wird die Schnittstelle detailliert beschrieben. F\u00fcr den Anfang ben\u00f6tigen wir allerdings lediglich die Basisfunktionen, n\u00e4mlich die M\u00f6glichkeit, Quotas abzufragen und festzulegen. Diese Funktionalit\u00e4t ist \u00fcber &#8222;Subcommands&#8220; umgesetzt. Einer dieser Subcommands, Q_GETQUOTA, welches eine Abfrage durchf\u00fchrt,\u00a0erwartet einen Pointer auf eine Datenstruktur namens <em>dqblk<\/em>, welche wir in Go umsetzen m\u00fcssen.<\/p>\n<p>Ein weiteres interessantes Detail, das n\u00e4her betrachtet werden muss, ist, wie das cmd Argument f\u00fcr den quotactl Aufruf berechnet wird.\u00a0Auf den man-pages wird das <em>QCMD(subcmd, type)<\/em> Makro beschrieben, welches in<em> sys\/quota.h<\/em> definiert ist und einen \u201eSubcommand\u201c sowie einen \u201eQuota-Typ\u201c ben\u00f6tigt und durch ein bitweises Shiften und eine Maskierung durch ein logisches \u201cAND\u201d den ben\u00f6tigten Wert festlegt.<\/p>\n<pre class=\"\">#define QCMD(cmd, type)\u00a0 (((cmd) &lt;&lt; SUBCMDSHIFT) | ((type) &amp; SUBCMDMASK))<\/pre>\n<div>Da wir lediglich Quota-Informationen abrufen m\u00f6chten, sollten diese neu erworbenen Kenntnisse ausreichen.<\/div>\n<h2>Los geht\u2018s<\/h2>\n<p>Liegen alle ben\u00f6tigten Informationen vor, definieren wir einen Wrapper, welcher dem \u00e4hnelt, den wir in <em>musl-libc<\/em> in Go vorgefunden haben:<\/p>\n<pre class=\"lang:go decode:true\">func quotactl(cmd int, special string, id int, target unsafe.Pointer) (err error) {\r\n  var deviceNamePtr *byte\r\n  if deviceNamePtr, err = syscall.BytePtrFromString(special); err != nil {\r\n    return\r\n  }\r\n  if _, _, errno := syscall.RawSyscall6(syscall.SYS_QUOTACTL, uintptr(cmd), uintptr(unsafe.Pointer(deviceNamePtr)), uintptr(id), uintptr(target), 0, 0); errno != 0 {\r\n    err = os.NewSyscallError(\"quotactl\", errno)\r\n  }\r\n  return\r\n}\r\n<\/pre>\n<p>Da <em>unsafe.Pointer<\/em> wieder und wieder verwendet wird, sollten wir uns diese Funktion einmal genauer ansehen. <em>unsafe.Pointer<\/em> l\u00e4sst sich wohl am besten mit einem void-Pointer in C vergleichen. Der Typ ist unwichtig, wir ben\u00f6tigen nur einen Pointer auf eine Speicherstelle.<\/p>\n<p>Zudem sollte man, wenn man in so tiefe Ebenen einsteigt, sich die Funktion\u00a0<em>syscall.BytePtrFromString<\/em>\u00a0genauer ansehen. Dies ist notwendig, da der String-Typ von Go nicht mit nullterminierten Strings, wie in Kernel oder C verwendet, kompatibel ist. <em>syscall.BytePtrFromString<\/em> wandelt einen Go-String in einen solchen nullterminierten String um,\u00a0und liefert einen\u00a0Pointer auf das erste Byte dieses Strings zur\u00fcck.<\/p>\n<p>Das <em>target-<\/em>Argument ist absichtlich ein <em>unsafe.Pointer<\/em>, da <em>quotactl<\/em> auch andere Datenstrukturen als die erw\u00e4hnten <em>dqblk<\/em>\u00a0bef\u00fcllen kann. Dieser Ansatz erm\u00f6glicht sp\u00e4ter eine einfachere Erweiterung. Was uns direkt zu <em>dqblk<\/em> f\u00fchrt:<\/p>\n<pre class=\"lang:go decode:true\">type Dqblk struct {\r\n    DqbBHardlimit uint64\r\n    DqbBSoftlimit uint64\r\n    DqbCurSpace   uint64\r\n    DqbIHardlimit uint64\r\n    DqbISoftlimit uint64\r\n    DqbCurInodes  uint64\r\n    DqbBTime      uint64\r\n    DqbITime      uint64\r\n    DqbValid      uint32\r\n}<\/pre>\n<p>Wie man sieht, k\u00f6nnen die Feldnamen beliebig ge\u00e4ndert werden, jedoch stellen wir sicher, dass die Feldreihenfolge bestehen bleibt. Die erforderlichen Konstanten sowie eine Funktion zur Implementierung des <em>QCMD-<\/em>Makros in Go zu definieren, wird dem Leser als \u00dcbung \u00fcberlassen.<\/p>\n<h2>Quota-Informationen abrufen<\/h2>\n<p>Jetzt, da wir die Datenstruktur definiert haben und die C-typische Snake-Case-Schreibweise in eine Go-\u00e4hnlichere Camel-Case-Schreibweise umgewandelt haben, k\u00f6nnen wir die erste \u00f6ffentliche Funktion zum Abrufen von Quotas implementieren:<\/p>\n<pre class=\"lang:go decode:true\">func GetQuota(typ int, special string, id int) (result *Dqblk, err error) {\r\n  result = &amp;Dqblk{}\r\n  if err = quotactl(qCmd(qGetQuota, typ), special, id, unsafe.Pointer(result)); err != nil {\r\n    result = nil\r\n  }\r\n  return\r\n}<\/pre>\n<p>Ein m\u00f6glicher Aufruf w\u00e4re beispielsweise <em>GetQuota(UsrQuota, \u201c\/dev\/loop0\u201d, 0)<\/em>, welche die Informationen eines Benutzers, die \u201eUser Quota\u201c, f\u00fcr UID 0 von \u201e\/dev\/loop0\u201c abfragt. Ersetze<em> \/dev\/loop0<\/em> mit der Bezeichnung, die beim Erstellen des Testbeds zur\u00fcckgeliefert wurde, und du wirst sehen, dass der Prototyp funktioniert.<\/p>\n<h2>Zusammenfassung<\/h2>\n<p>In diesem Artikel wurden die notwendigen Schritte beschrieben, um Low-Level Linux Kernel Funktionen von Go zu verwenden. Informationen zu Speicherplatzgrenzen aus Dateisystemen abzurufen, ist mit geringem Programmieraufwand umsetzbar. Dieser Ansatz \u2013 die Funktion nativ in Go zu implementieren \u2013 erlaubt die Erstellung von statisch gelinkten Binaries ohne zus\u00e4tzliche Abh\u00e4ngigkeiten, was\u00a0ein Deployment insgesamt stark vereinfacht.<\/p>\n<p>Den Code zu diesem Artikel findest du unter: <a href=\"https:\/\/github.com\/anexia-it\/wad2018-quotactl\">https:\/\/github.com\/anexia-it\/wad2018-quotactl<\/a>. Eine vollst\u00e4ndigere Go-Bibliothek, welche auf den Recherchen basiert, die auch zu diesem Artikel gef\u00fchrt haben, findest du unter:\u00a0 <a href=\"https:\/\/github.com\/anexia-it\/fsquota\" target=\"_blank\" rel=\"noopener\">https:\/\/github.com\/anexia-it\/fsquota<\/a>.<\/p>\n<p>Ich hoffe diese Reise in die Tiefen von Go und Syscalls war genauso spannend und lustig, wie diesen Artikel zu schreiben.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Hier erkl\u00e4rt Stephan, wie Go mit Betriebssystemen im Low-Level Bereich interagiert und wie wir unsere Quota-Bibliothek in Go entwickelt haben.<\/p>\n","protected":false},"author":5,"featured_media":4149,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[4],"tags":[31,237,14,449,362],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v22.2 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Speicherplatzgrenzen f\u00fcr Dateisysteme in Go - ANEXIA Blog<\/title>\n<meta name=\"description\" content=\"Hier erkl\u00e4rt Stephan, wie Go mit Betriebssystemen im Low-Level Bereich interagiert und wie wir unsere Quota-Bibliothek in Go entwickelt haben.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/anexia.com\/blog\/de\/speicherplatzgrenzen-fuer-dateisysteme-in-go\/\" \/>\n<meta property=\"og:locale\" content=\"de_DE\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Speicherplatzgrenzen f\u00fcr Dateisysteme in Go - ANEXIA Blog\" \/>\n<meta property=\"og:description\" content=\"Hier erkl\u00e4rt Stephan, wie Go mit Betriebssystemen im Low-Level Bereich interagiert und wie wir unsere Quota-Bibliothek in Go entwickelt haben.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/anexia.com\/blog\/de\/speicherplatzgrenzen-fuer-dateisysteme-in-go\/\" \/>\n<meta property=\"og:site_name\" content=\"ANEXIA Blog\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/anexiagmbh\/\" \/>\n<meta property=\"article:published_time\" content=\"2018-04-24T08:11:39+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2022-04-15T13:21:07+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/anexia.com\/blog\/wp-content\/uploads\/2018\/04\/Stephan-Peijnik.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"1600\" \/>\n\t<meta property=\"og:image:height\" content=\"1066\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"Stephan Peijnik\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@_ANEXIA\" \/>\n<meta name=\"twitter:site\" content=\"@_ANEXIA\" \/>\n<meta name=\"twitter:label1\" content=\"Verfasst von\" \/>\n\t<meta name=\"twitter:data1\" content=\"Stephan Peijnik\" \/>\n\t<meta name=\"twitter:label2\" content=\"Gesch\u00e4tzte Lesezeit\" \/>\n\t<meta name=\"twitter:data2\" content=\"6\u00a0Minuten\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\/\/anexia.com\/blog\/de\/speicherplatzgrenzen-fuer-dateisysteme-in-go\/\",\"url\":\"https:\/\/anexia.com\/blog\/de\/speicherplatzgrenzen-fuer-dateisysteme-in-go\/\",\"name\":\"Speicherplatzgrenzen f\u00fcr Dateisysteme in Go - ANEXIA Blog\",\"isPartOf\":{\"@id\":\"https:\/\/anexia.com\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/anexia.com\/blog\/de\/speicherplatzgrenzen-fuer-dateisysteme-in-go\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/anexia.com\/blog\/de\/speicherplatzgrenzen-fuer-dateisysteme-in-go\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/anexia.com\/blog\/wp-content\/uploads\/2018\/04\/Stephan-Peijnik.jpg\",\"datePublished\":\"2018-04-24T08:11:39+00:00\",\"dateModified\":\"2022-04-15T13:21:07+00:00\",\"author\":{\"@id\":\"https:\/\/anexia.com\/blog\/#\/schema\/person\/8f95147348ae0ed7e4c25999bebf0f1d\"},\"description\":\"Hier erkl\u00e4rt Stephan, wie Go mit Betriebssystemen im Low-Level Bereich interagiert und wie wir unsere Quota-Bibliothek in Go entwickelt haben.\",\"breadcrumb\":{\"@id\":\"https:\/\/anexia.com\/blog\/de\/speicherplatzgrenzen-fuer-dateisysteme-in-go\/#breadcrumb\"},\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/anexia.com\/blog\/de\/speicherplatzgrenzen-fuer-dateisysteme-in-go\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\/\/anexia.com\/blog\/de\/speicherplatzgrenzen-fuer-dateisysteme-in-go\/#primaryimage\",\"url\":\"https:\/\/anexia.com\/blog\/wp-content\/uploads\/2018\/04\/Stephan-Peijnik.jpg\",\"contentUrl\":\"https:\/\/anexia.com\/blog\/wp-content\/uploads\/2018\/04\/Stephan-Peijnik.jpg\",\"width\":1600,\"height\":1066,\"caption\":\"Stephan-Peijnik\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/anexia.com\/blog\/de\/speicherplatzgrenzen-fuer-dateisysteme-in-go\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/anexia.com\/blog\/de\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Speicherplatzgrenzen f\u00fcr Dateisysteme in Go\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/anexia.com\/blog\/#website\",\"url\":\"https:\/\/anexia.com\/blog\/\",\"name\":\"ANEXIA Blog\",\"description\":\"[:de] ANEXIA Blog - Technischen Themen, Anexia News und Insights [:]\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/anexia.com\/blog\/?s={search_term_string}\"},\"query-input\":\"required name=search_term_string\"}],\"inLanguage\":\"de\"},{\"@type\":\"Person\",\"@id\":\"https:\/\/anexia.com\/blog\/#\/schema\/person\/8f95147348ae0ed7e4c25999bebf0f1d\",\"name\":\"Stephan Peijnik\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\/\/anexia.com\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/0bfcb213a87f6c6c67ec494bc0ae5585?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/0bfcb213a87f6c6c67ec494bc0ae5585?s=96&d=mm&r=g\",\"caption\":\"Stephan Peijnik\"},\"url\":\"https:\/\/anexia.com\/blog\/author\/spe\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Speicherplatzgrenzen f\u00fcr Dateisysteme in Go - ANEXIA Blog","description":"Hier erkl\u00e4rt Stephan, wie Go mit Betriebssystemen im Low-Level Bereich interagiert und wie wir unsere Quota-Bibliothek in Go entwickelt haben.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/anexia.com\/blog\/de\/speicherplatzgrenzen-fuer-dateisysteme-in-go\/","og_locale":"de_DE","og_type":"article","og_title":"Speicherplatzgrenzen f\u00fcr Dateisysteme in Go - ANEXIA Blog","og_description":"Hier erkl\u00e4rt Stephan, wie Go mit Betriebssystemen im Low-Level Bereich interagiert und wie wir unsere Quota-Bibliothek in Go entwickelt haben.","og_url":"https:\/\/anexia.com\/blog\/de\/speicherplatzgrenzen-fuer-dateisysteme-in-go\/","og_site_name":"ANEXIA Blog","article_publisher":"https:\/\/www.facebook.com\/anexiagmbh\/","article_published_time":"2018-04-24T08:11:39+00:00","article_modified_time":"2022-04-15T13:21:07+00:00","og_image":[{"width":1600,"height":1066,"url":"https:\/\/anexia.com\/blog\/wp-content\/uploads\/2018\/04\/Stephan-Peijnik.jpg","type":"image\/jpeg"}],"author":"Stephan Peijnik","twitter_card":"summary_large_image","twitter_creator":"@_ANEXIA","twitter_site":"@_ANEXIA","twitter_misc":{"Verfasst von":"Stephan Peijnik","Gesch\u00e4tzte Lesezeit":"6\u00a0Minuten"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/anexia.com\/blog\/de\/speicherplatzgrenzen-fuer-dateisysteme-in-go\/","url":"https:\/\/anexia.com\/blog\/de\/speicherplatzgrenzen-fuer-dateisysteme-in-go\/","name":"Speicherplatzgrenzen f\u00fcr Dateisysteme in Go - ANEXIA Blog","isPartOf":{"@id":"https:\/\/anexia.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/anexia.com\/blog\/de\/speicherplatzgrenzen-fuer-dateisysteme-in-go\/#primaryimage"},"image":{"@id":"https:\/\/anexia.com\/blog\/de\/speicherplatzgrenzen-fuer-dateisysteme-in-go\/#primaryimage"},"thumbnailUrl":"https:\/\/anexia.com\/blog\/wp-content\/uploads\/2018\/04\/Stephan-Peijnik.jpg","datePublished":"2018-04-24T08:11:39+00:00","dateModified":"2022-04-15T13:21:07+00:00","author":{"@id":"https:\/\/anexia.com\/blog\/#\/schema\/person\/8f95147348ae0ed7e4c25999bebf0f1d"},"description":"Hier erkl\u00e4rt Stephan, wie Go mit Betriebssystemen im Low-Level Bereich interagiert und wie wir unsere Quota-Bibliothek in Go entwickelt haben.","breadcrumb":{"@id":"https:\/\/anexia.com\/blog\/de\/speicherplatzgrenzen-fuer-dateisysteme-in-go\/#breadcrumb"},"inLanguage":"de","potentialAction":[{"@type":"ReadAction","target":["https:\/\/anexia.com\/blog\/de\/speicherplatzgrenzen-fuer-dateisysteme-in-go\/"]}]},{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/anexia.com\/blog\/de\/speicherplatzgrenzen-fuer-dateisysteme-in-go\/#primaryimage","url":"https:\/\/anexia.com\/blog\/wp-content\/uploads\/2018\/04\/Stephan-Peijnik.jpg","contentUrl":"https:\/\/anexia.com\/blog\/wp-content\/uploads\/2018\/04\/Stephan-Peijnik.jpg","width":1600,"height":1066,"caption":"Stephan-Peijnik"},{"@type":"BreadcrumbList","@id":"https:\/\/anexia.com\/blog\/de\/speicherplatzgrenzen-fuer-dateisysteme-in-go\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/anexia.com\/blog\/de\/"},{"@type":"ListItem","position":2,"name":"Speicherplatzgrenzen f\u00fcr Dateisysteme in Go"}]},{"@type":"WebSite","@id":"https:\/\/anexia.com\/blog\/#website","url":"https:\/\/anexia.com\/blog\/","name":"ANEXIA Blog","description":"[:de] ANEXIA Blog - Technischen Themen, Anexia News und Insights [:]","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/anexia.com\/blog\/?s={search_term_string}"},"query-input":"required name=search_term_string"}],"inLanguage":"de"},{"@type":"Person","@id":"https:\/\/anexia.com\/blog\/#\/schema\/person\/8f95147348ae0ed7e4c25999bebf0f1d","name":"Stephan Peijnik","image":{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/anexia.com\/blog\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/0bfcb213a87f6c6c67ec494bc0ae5585?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/0bfcb213a87f6c6c67ec494bc0ae5585?s=96&d=mm&r=g","caption":"Stephan Peijnik"},"url":"https:\/\/anexia.com\/blog\/author\/spe\/"}]}},"lang":"de","translations":{"de":3447,"en":6685},"amp_enabled":true,"pll_sync_post":[],"_links":{"self":[{"href":"https:\/\/anexia.com\/blog\/wp-json\/wp\/v2\/posts\/3447"}],"collection":[{"href":"https:\/\/anexia.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/anexia.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/anexia.com\/blog\/wp-json\/wp\/v2\/users\/5"}],"replies":[{"embeddable":true,"href":"https:\/\/anexia.com\/blog\/wp-json\/wp\/v2\/comments?post=3447"}],"version-history":[{"count":16,"href":"https:\/\/anexia.com\/blog\/wp-json\/wp\/v2\/posts\/3447\/revisions"}],"predecessor-version":[{"id":6687,"href":"https:\/\/anexia.com\/blog\/wp-json\/wp\/v2\/posts\/3447\/revisions\/6687"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/anexia.com\/blog\/wp-json\/wp\/v2\/media\/4149"}],"wp:attachment":[{"href":"https:\/\/anexia.com\/blog\/wp-json\/wp\/v2\/media?parent=3447"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/anexia.com\/blog\/wp-json\/wp\/v2\/categories?post=3447"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/anexia.com\/blog\/wp-json\/wp\/v2\/tags?post=3447"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}