[{"data":1,"prerenderedAt":1833},["ShallowReactive",2],{"blog-current-shopware-5-parallele-miniaturbildererstellung-de":3,"blog-previous-shopware-5-parallele-miniaturbildererstellung-de":598,"blog-next-shopware-5-parallele-miniaturbildererstellung-de":614,"blog-alt-de-shopware-5-parallele-miniaturbildererstellung-de":627,"blog-alt-en-shopware-5-parallele-miniaturbildererstellung-de":628,"employee-bernd-helm":630,"content-query-yFFm3xXL85":736,"content-query-L6Pt7i9jc4":1217,"content-query-1PFeYVQSzn":1769,"related-refs-shopware--de":1805},{"_path":4,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":8,"description":9,"author":10,"image":11,"releaseDate":12,"blogCategories":13,"articleTags":16,"tags":18,"body":20,"_type":592,"_id":593,"_source":594,"_file":595,"_stem":596,"_extension":597},"/blog/shopware-5-parallele-miniaturbildererstellung","blog",false,"","Shopware 5 - Parallele Hochgeschwindigkeits-Miniaturbildererstellung","Wie man den integrierten SW5-Mechanismus so abstimmt, dass er mehr als 22 Mal schneller arbeitet! Shopware 5 - Parallele Thumbnail-Generierung nach dem Umzug eines Shopware 5 Systems auf einen anderen Server Wir hatten einen Kunden mit 400k Bildern und 1600k Thumbnails, der von einem alten hdd-basierten Server auf einen neuen ssd-Server umziehen musste ...","bernd-helm","/images/shopware.svg","2021-04-29",[14,15],"Shopware","DevOps",[17],"VPN",[19],"shopware",{"type":21,"children":22,"toc":587},"root",[23,32,38,50,84,90,95,114,123,128,133,483,488,493,498,503,515,567,575,581],{"type":24,"tag":25,"props":26,"children":28},"element","h2",{"id":27},"shopware-5-parallele-thumbnail-generierung-nach-dem-verschieben-eines-shopware-5-systems-auf-einen-anderen-server",[29],{"type":30,"value":31},"text","Shopware 5 - Parallele Thumbnail-Generierung nach dem Verschieben eines Shopware 5-Systems auf einen anderen Server",{"type":24,"tag":33,"props":34,"children":35},"p",{},[36],{"type":30,"value":37},"Wir hatten einen Kunden mit 400k Bildern und 1600k Thumbnails, der von einem alten hdd-basierten Server auf einen neuen ssd-basierten umziehen musste. Das Problem war, dass der alte Server so langsam war, dass er bereits 2 Tage brauchte, um alle Bilder durchzuzählen, ganz zu schweigen vom Kopieren der Bilder.",{"type":24,"tag":33,"props":39,"children":40},{},[41,43],{"type":30,"value":42},"Also haben wir beschlossen, nur die Originalbilder zu kopieren und die Thumbnails neu zu generieren. Um die Originalbilder zu kopieren, habe ich einen kleinen Konsolenbefehl erstellt, der alle Pfade der Originalbilder, die wir kopieren müssen, exportiert: ",{"type":24,"tag":44,"props":45,"children":47},"a",{"href":46},"https://gist.github.com/bhelm/2d30f0cebcf4a7d8ea41c532ec67cd62",[48],{"type":30,"value":49},"ExportImagesCommand.php",{"type":24,"tag":33,"props":51,"children":52},{},[53,55,61,63,68,70,75,77,82],{"type":30,"value":54},"Diese Dateiliste kann mit den Optionen ",{"type":24,"tag":56,"props":57,"children":58},"em",{},[59],{"type":30,"value":60},"tar -T",{"type":30,"value":62}," oder ",{"type":24,"tag":56,"props":64,"children":65},{},[66],{"type":30,"value":67},"rsync --files-from=",{"type":30,"value":69}," verwendet werden, die diese Tools anweisen, nur die aufgelisteten Dateien zu verarbeiten. Für den anfänglichen Kopiervorgang ist ",{"type":24,"tag":56,"props":71,"children":72},{},[73],{"type":30,"value":74},"tar",{"type":30,"value":76}," sehr zu empfehlen, da es nur die aufgelisteten Dateien abholt, ohne irgendeine \"Berechnung\" wie bei ",{"type":24,"tag":56,"props":78,"children":79},{},[80],{"type":30,"value":81},"rsync",{"type":30,"value":83}," vorzunehmen.",{"type":24,"tag":25,"props":85,"children":87},{"id":86},"sw5-standard-thumbnails-generieren-hätte-80-stunden-gedauert",[88],{"type":30,"value":89},"SW5 Standard-Thumbnails generieren hätte 80 Stunden gedauert",{"type":24,"tag":33,"props":91,"children":92},{},[93],{"type":30,"value":94},"... und würde nur die Hälfte eines Kerns nutzen.",{"type":24,"tag":33,"props":96,"children":97},{},[98,100,105,107,112],{"type":30,"value":99},"Ich war neugierig, ob ich diesen Generierungsprozess beschleunigen kann. Der Server selbst hat 32 Kerne zur Verfügung, also habe ich den Befehl ",{"type":24,"tag":56,"props":101,"children":102},{},[103],{"type":30,"value":104},"generate thumbnail",{"type":30,"value":106}," aus sw5 kopiert und ihn so modifiziert, dass er mit dem Parameter ",{"type":24,"tag":56,"props":108,"children":109},{},[110],{"type":30,"value":111},"--batch",{"type":30,"value":113}," in Batches arbeitet:",{"type":24,"tag":33,"props":115,"children":116},{},[117],{"type":24,"tag":44,"props":118,"children":120},{"href":119},"https://gist.github.com/bhelm/2015d3829d4a3f24f9760f6e4e1aac1f",[121],{"type":30,"value":122},"ParallelThumbnailGenerateCommand.php",{"type":24,"tag":33,"props":124,"children":125},{},[126],{"type":30,"value":127},"Damit es funktioniert, habe ich einfach den Shopware-Kern unter engine/Shopware/Models/Media/Repository.php geändert",{"type":24,"tag":33,"props":129,"children":130},{},[131],{"type":30,"value":132},"Ich habe einfach die getAlbumMediaQuery Funktion geändert in:",{"type":24,"tag":134,"props":135,"children":139},"pre",{"className":136,"code":137,"language":138,"meta":7,"style":7},"language-cpp shiki shiki-themes github-dark github-dark monokai","public function getAlbumMediaQuery($albumId, $filter = null, $orderBy = null, $offset = null, $limit = null, $validTypes = null, $batch = null)\n{\n$builder = $this->getAlbumMediaQueryBuilder($albumId, $filter, $orderBy, $validTypes);\nif (is_numeric($batch)) {\n$builder->andWhere('MOD(media.id, 1000) = ?3');\n$builder->setParameter(3, $batch);\n}\n\n    if ($limit !== null) {\n        $builder->setFirstResult($offset)\n                ->setMaxResults($limit);\n    }\n\n    return $builder->getQuery();\n}\n","cpp",[140],{"type":24,"tag":141,"props":142,"children":143},"code",{"__ignoreMap":7},[144,223,232,271,295,325,353,362,372,396,415,434,443,451,475],{"type":24,"tag":145,"props":146,"children":149},"span",{"class":147,"line":148},"line",1,[150,156,162,167,173,178,182,187,191,196,200,205,209,214,218],{"type":24,"tag":145,"props":151,"children":153},{"style":152},"--shiki-default:#E1E4E8;--shiki-dark:#E1E4E8;--shiki-sepia:#F8F8F2",[154],{"type":30,"value":155},"public function ",{"type":24,"tag":145,"props":157,"children":159},{"style":158},"--shiki-default:#B392F0;--shiki-dark:#B392F0;--shiki-sepia:#A6E22E",[160],{"type":30,"value":161},"getAlbumMediaQuery",{"type":24,"tag":145,"props":163,"children":164},{"style":152},[165],{"type":30,"value":166},"($albumId, $filter ",{"type":24,"tag":145,"props":168,"children":170},{"style":169},"--shiki-default:#F97583;--shiki-dark:#F97583;--shiki-sepia:#F92672",[171],{"type":30,"value":172},"=",{"type":24,"tag":145,"props":174,"children":175},{"style":152},[176],{"type":30,"value":177}," null, $orderBy ",{"type":24,"tag":145,"props":179,"children":180},{"style":169},[181],{"type":30,"value":172},{"type":24,"tag":145,"props":183,"children":184},{"style":152},[185],{"type":30,"value":186}," null, $offset ",{"type":24,"tag":145,"props":188,"children":189},{"style":169},[190],{"type":30,"value":172},{"type":24,"tag":145,"props":192,"children":193},{"style":152},[194],{"type":30,"value":195}," null, $limit ",{"type":24,"tag":145,"props":197,"children":198},{"style":169},[199],{"type":30,"value":172},{"type":24,"tag":145,"props":201,"children":202},{"style":152},[203],{"type":30,"value":204}," null, $validTypes ",{"type":24,"tag":145,"props":206,"children":207},{"style":169},[208],{"type":30,"value":172},{"type":24,"tag":145,"props":210,"children":211},{"style":152},[212],{"type":30,"value":213}," null, $batch ",{"type":24,"tag":145,"props":215,"children":216},{"style":169},[217],{"type":30,"value":172},{"type":24,"tag":145,"props":219,"children":220},{"style":152},[221],{"type":30,"value":222}," null)\n",{"type":24,"tag":145,"props":224,"children":226},{"class":147,"line":225},2,[227],{"type":24,"tag":145,"props":228,"children":229},{"style":152},[230],{"type":30,"value":231},"{\n",{"type":24,"tag":145,"props":233,"children":235},{"class":147,"line":234},3,[236,241,245,250,256,261,266],{"type":24,"tag":145,"props":237,"children":238},{"style":152},[239],{"type":30,"value":240},"$builder ",{"type":24,"tag":145,"props":242,"children":243},{"style":169},[244],{"type":30,"value":172},{"type":24,"tag":145,"props":246,"children":247},{"style":152},[248],{"type":30,"value":249}," $",{"type":24,"tag":145,"props":251,"children":253},{"style":252},"--shiki-default:#79B8FF;--shiki-dark:#79B8FF;--shiki-sepia:#FD971F",[254],{"type":30,"value":255},"this",{"type":24,"tag":145,"props":257,"children":258},{"style":152},[259],{"type":30,"value":260},"->",{"type":24,"tag":145,"props":262,"children":263},{"style":158},[264],{"type":30,"value":265},"getAlbumMediaQueryBuilder",{"type":24,"tag":145,"props":267,"children":268},{"style":152},[269],{"type":30,"value":270},"($albumId, $filter, $orderBy, $validTypes);\n",{"type":24,"tag":145,"props":272,"children":274},{"class":147,"line":273},4,[275,280,285,290],{"type":24,"tag":145,"props":276,"children":277},{"style":169},[278],{"type":30,"value":279},"if",{"type":24,"tag":145,"props":281,"children":282},{"style":152},[283],{"type":30,"value":284}," (",{"type":24,"tag":145,"props":286,"children":287},{"style":158},[288],{"type":30,"value":289},"is_numeric",{"type":24,"tag":145,"props":291,"children":292},{"style":152},[293],{"type":30,"value":294},"($batch)) {\n",{"type":24,"tag":145,"props":296,"children":298},{"class":147,"line":297},5,[299,304,309,314,320],{"type":24,"tag":145,"props":300,"children":301},{"style":152},[302],{"type":30,"value":303},"$builder->",{"type":24,"tag":145,"props":305,"children":306},{"style":158},[307],{"type":30,"value":308},"andWhere",{"type":24,"tag":145,"props":310,"children":311},{"style":152},[312],{"type":30,"value":313},"(",{"type":24,"tag":145,"props":315,"children":317},{"style":316},"--shiki-default:#9ECBFF;--shiki-dark:#9ECBFF;--shiki-sepia:#E6DB74",[318],{"type":30,"value":319},"'MOD(media.id, 1000) = ?3'",{"type":24,"tag":145,"props":321,"children":322},{"style":152},[323],{"type":30,"value":324},");\n",{"type":24,"tag":145,"props":326,"children":328},{"class":147,"line":327},6,[329,333,338,342,348],{"type":24,"tag":145,"props":330,"children":331},{"style":152},[332],{"type":30,"value":303},{"type":24,"tag":145,"props":334,"children":335},{"style":158},[336],{"type":30,"value":337},"setParameter",{"type":24,"tag":145,"props":339,"children":340},{"style":152},[341],{"type":30,"value":313},{"type":24,"tag":145,"props":343,"children":345},{"style":344},"--shiki-default:#79B8FF;--shiki-dark:#79B8FF;--shiki-sepia:#AE81FF",[346],{"type":30,"value":347},"3",{"type":24,"tag":145,"props":349,"children":350},{"style":152},[351],{"type":30,"value":352},", $batch);\n",{"type":24,"tag":145,"props":354,"children":356},{"class":147,"line":355},7,[357],{"type":24,"tag":145,"props":358,"children":359},{"style":152},[360],{"type":30,"value":361},"}\n",{"type":24,"tag":145,"props":363,"children":365},{"class":147,"line":364},8,[366],{"type":24,"tag":145,"props":367,"children":369},{"emptyLinePlaceholder":368},true,[370],{"type":30,"value":371},"\n",{"type":24,"tag":145,"props":373,"children":375},{"class":147,"line":374},9,[376,381,386,391],{"type":24,"tag":145,"props":377,"children":378},{"style":169},[379],{"type":30,"value":380},"    if",{"type":24,"tag":145,"props":382,"children":383},{"style":152},[384],{"type":30,"value":385}," ($limit ",{"type":24,"tag":145,"props":387,"children":388},{"style":169},[389],{"type":30,"value":390},"!==",{"type":24,"tag":145,"props":392,"children":393},{"style":152},[394],{"type":30,"value":395}," null) {\n",{"type":24,"tag":145,"props":397,"children":399},{"class":147,"line":398},10,[400,405,410],{"type":24,"tag":145,"props":401,"children":402},{"style":152},[403],{"type":30,"value":404},"        $builder->",{"type":24,"tag":145,"props":406,"children":407},{"style":158},[408],{"type":30,"value":409},"setFirstResult",{"type":24,"tag":145,"props":411,"children":412},{"style":152},[413],{"type":30,"value":414},"($offset)\n",{"type":24,"tag":145,"props":416,"children":418},{"class":147,"line":417},11,[419,424,429],{"type":24,"tag":145,"props":420,"children":421},{"style":169},[422],{"type":30,"value":423},"                ->",{"type":24,"tag":145,"props":425,"children":426},{"style":158},[427],{"type":30,"value":428},"setMaxResults",{"type":24,"tag":145,"props":430,"children":431},{"style":152},[432],{"type":30,"value":433},"($limit);\n",{"type":24,"tag":145,"props":435,"children":437},{"class":147,"line":436},12,[438],{"type":24,"tag":145,"props":439,"children":440},{"style":152},[441],{"type":30,"value":442},"    }\n",{"type":24,"tag":145,"props":444,"children":446},{"class":147,"line":445},13,[447],{"type":24,"tag":145,"props":448,"children":449},{"emptyLinePlaceholder":368},[450],{"type":30,"value":371},{"type":24,"tag":145,"props":452,"children":454},{"class":147,"line":453},14,[455,460,465,470],{"type":24,"tag":145,"props":456,"children":457},{"style":169},[458],{"type":30,"value":459},"    return",{"type":24,"tag":145,"props":461,"children":462},{"style":152},[463],{"type":30,"value":464}," $builder->",{"type":24,"tag":145,"props":466,"children":467},{"style":158},[468],{"type":30,"value":469},"getQuery",{"type":24,"tag":145,"props":471,"children":472},{"style":152},[473],{"type":30,"value":474},"();\n",{"type":24,"tag":145,"props":476,"children":478},{"class":147,"line":477},15,[479],{"type":24,"tag":145,"props":480,"children":481},{"style":152},[482],{"type":30,"value":361},{"type":24,"tag":33,"props":484,"children":485},{},[486],{"type":30,"value":487},"Es ist ein optionaler Parameter und wird nichts kaputt machen. Wenn man ein Shopware-Update durchführt, würde dies verschwinden, aber da ich auf der Suche nach einer einmaligen Aufgabe war, um die Dinge zu beschleunigen, habe ich es einfach im Kern geändert, anstatt eine langfristige Lösung zu finden.",{"type":24,"tag":33,"props":489,"children":490},{},[491],{"type":30,"value":492},"Diese Funktion berechnet ein Modulo von 1000 auf der Medien-ID und vergleicht es mit der Chargen-ID. Wir haben also im Grunde 1000 Stapel zu verarbeiten, bis alle Arbeit erledigt ist.",{"type":24,"tag":33,"props":494,"children":495},{},[496],{"type":30,"value":497},"Jetzt müssen wir nur noch alle 1000 Stapel parallel starten. Dazu habe ich das sehr hilfreiche Tool parallel verwendet, das unter Linux verfügbar ist:",{"type":24,"tag":33,"props":499,"children":500},{},[501],{"type":30,"value":502},"Es startet 64 Batches parallel und setzt seine Arbeit fort, bis alle 1000 Batches fertig sind.",{"type":24,"tag":33,"props":504,"children":505},{},[506,508,513],{"type":30,"value":507},"Und so sieht es bei ",{"type":24,"tag":56,"props":509,"children":510},{},[511],{"type":30,"value":512},"htop",{"type":30,"value":514}," aus:",{"type":24,"tag":134,"props":516,"children":520},{"className":517,"code":518,"language":519,"meta":7,"style":7},"language-bash shiki shiki-themes github-dark github-dark monokai","parallel -j 64 ./bin/console my:image:generate:thumbnails --batch ::: {0..999}\n","bash",[521],{"type":24,"tag":141,"props":522,"children":523},{"__ignoreMap":7},[524],{"type":24,"tag":145,"props":525,"children":526},{"class":147,"line":148},[527,532,537,542,547,552,557,562],{"type":24,"tag":145,"props":528,"children":529},{"style":158},[530],{"type":30,"value":531},"parallel",{"type":24,"tag":145,"props":533,"children":534},{"style":344},[535],{"type":30,"value":536}," -j",{"type":24,"tag":145,"props":538,"children":539},{"style":344},[540],{"type":30,"value":541}," 64",{"type":24,"tag":145,"props":543,"children":544},{"style":316},[545],{"type":30,"value":546}," ./bin/console",{"type":24,"tag":145,"props":548,"children":549},{"style":316},[550],{"type":30,"value":551}," my:image:generate:thumbnails",{"type":24,"tag":145,"props":553,"children":554},{"style":344},[555],{"type":30,"value":556}," --batch",{"type":24,"tag":145,"props":558,"children":559},{"style":316},[560],{"type":30,"value":561}," :::",{"type":24,"tag":145,"props":563,"children":564},{"style":316},[565],{"type":30,"value":566}," {0..999}\n",{"type":24,"tag":568,"props":569,"children":574},"img",{"alt":512,"aspect-ratio":570,"height":571,"object-fit":572,"src":573},"2",300,"contain","/blog/htop.png",[],{"type":24,"tag":25,"props":576,"children":578},{"id":577},"schließlich-ist-die-ganze-arbeit-jetzt-in-35-stunden-statt-in-80-stunden-erledigt",[579],{"type":30,"value":580},"Schließlich ist die ganze Arbeit jetzt in 3,5 Stunden statt in 80 Stunden erledigt.",{"type":24,"tag":582,"props":583,"children":584},"style",{},[585],{"type":30,"value":586},"html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html .sepia .shiki span {color: var(--shiki-sepia);background: var(--shiki-sepia-bg);font-style: var(--shiki-sepia-font-style);font-weight: var(--shiki-sepia-font-weight);text-decoration: var(--shiki-sepia-text-decoration);}html.sepia .shiki span {color: var(--shiki-sepia);background: var(--shiki-sepia-bg);font-style: var(--shiki-sepia-font-style);font-weight: var(--shiki-sepia-font-weight);text-decoration: var(--shiki-sepia-text-decoration);}",{"title":7,"searchDepth":225,"depth":225,"links":588},[589,590,591],{"id":27,"depth":225,"text":31},{"id":86,"depth":225,"text":89},{"id":577,"depth":225,"text":580},"markdown","common:blog:9.shopware-5-parallele-miniaturbildererstellung.md","common","blog/9.shopware-5-parallele-miniaturbildererstellung.md","blog/9.shopware-5-parallele-miniaturbildererstellung","md",{"_path":599,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":600,"description":601,"author":10,"image":602,"releaseDate":603,"blogCategories":604,"articleTags":607,"tags":609,"_type":592,"_id":611,"_source":594,"_file":612,"_stem":613,"_extension":597},"/blog/btrfs-auffinden-und-reparieren-stark-fragmentierter-dataien","BTRFS: Auffinden und Reparieren stark fragmentierter Dateien","Die meisten der besten BTRFS-Funktionen werden durch die Copy-on-Write-Technologie ermöglicht. Wenn eine Anwendung einen Teil einer Datei umschreiben will, wie z.B. das erste MegaByte, werden die Daten nicht an Ort und Stelle geschrieben, sondern in einer sogenannten Erweiterung. Dadurch ist BTRFS in der Lage, mehrere Versionen von teilweise umgeschriebenen Dateien aufzubewahren, wobei nur die ...","/blog/thumbnails/BTRFS_white.png","2020-10-21",[605,606],"Das bewegt uns","Infrastruktur",[608],"BTRFS",[610],"devops","common:blog:8.btrfs-auffinden-und-reparieren-stark-fragmentierter-dataien.md","blog/8.btrfs-auffinden-und-reparieren-stark-fragmentierter-dataien.md","blog/8.btrfs-auffinden-und-reparieren-stark-fragmentierter-dataien",{"_path":615,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":616,"description":617,"author":10,"image":618,"releaseDate":619,"blogCategories":620,"articleTags":621,"tags":623,"_type":592,"_id":624,"_source":594,"_file":625,"_stem":626,"_extension":597},"/blog/wie-man-verschiedene-dns-server-fuer-bestimter-domaens-verwendet","Wie man verschiedene DNS-Server für die Namensauflösung bestimmter Domänen verwendet - VPN Use-Case","Wie man ausgewählte Domains über VPN unter Linux auflöst. In der heutigen Welt nutzen mehr Menschen als je zuvor VPN-Dienste, um aus der Ferne zu arbeiten. In manchen Fällen ist es jedoch nicht wünschenswert, den gesamten Datenverkehr und alle Domainnamenauflösungen über die VPN-Verbindung zu leiten.","/blog/thumbnails/VPN.png","2022-04-21",[605,15],[17,622],"Linux",[610],"common:blog:10.wie-man-verschiedene-dns-server-fuer-bestimter-domaens-verwendet.md","blog/10.wie-man-verschiedene-dns-server-fuer-bestimter-domaens-verwendet.md","blog/10.wie-man-verschiedene-dns-server-fuer-bestimter-domaens-verwendet",{"_path":4},{"_path":629},"/en/blog/shopware-5-parallel-thumbnail-generation",{"_path":631,"_dir":632,"_draft":6,"_partial":6,"_locale":7,"slug":10,"teams":633,"primaryTeam":635,"firstName":636,"lastName":637,"prefixTitle":7,"suffixTitle":7,"education":638,"executiveRole":643,"role":644,"workingSince":652,"inTheCompanySince":653,"techSkills":654,"skills":699,"projects":712,"contactDetails":725,"_image":729,"image":730,"_id":731,"_type":732,"title":733,"_source":632,"_file":734,"_stem":735,"_extension":732},"/employees/bernd-helm","employees",[634,635],"ai","devOps","Bernd","Helm",[639],[640,641,642],"B. Sc. Angewandte Informatik","FHDW Dresden","2010","CTO",[645,646,635,647,648,649,650,651],"founder","chiefTechnologyOfficer","databaseSpecialist","admin","softwareDeveloper","backendDeveloper","consultant","2005","2008",[655,659,661,663,666,668,671,673,675,677,680,684,687,690,693,696],{"name":656,"level":657,"icon":658},"Docker","expert","/images/Docker.svg",{"name":622,"level":657,"icon":660},"/images/linux_os-mono.svg",{"name":662,"level":657},"Zabbix",{"name":664,"level":657,"icon":665},"MariaDB ColumnStore","/images/maria-db-logo.svg",{"name":667,"level":657},"OpenAI",{"name":669,"level":657,"icon":670},"Pytorch","/images/PyTorch.svg",{"name":672,"level":657},"PHP",{"name":674,"level":657},"Java",{"name":676,"level":657},"Python",{"name":678,"level":657,"icon":679},"SQL","/images/SQL.svg",{"name":681,"level":682,"icon":683},"C++","advanced","/images/cpp-logo.svg",{"name":685,"level":682,"icon":686},"C#","/images/csharp.svg",{"name":688,"level":682,"icon":689},"CSS","/images/css.svg",{"name":691,"level":682,"icon":692},"HTML","/images/html.svg",{"name":694,"level":682,"icon":695},"OpenCV","/images/OpenCV.svg",{"name":697,"level":682,"icon":698},"Vue.js","/images/vuejs.svg",[700,702,704,706,708,710],{"name":701,"level":657},"artificialIntelligence",{"name":703,"level":657},"codingGuidelines",{"name":705,"level":657},"databases",{"name":707,"level":657},"linuxServerAdministration",{"name":709,"level":657},"softwareArchitect",{"name":711,"level":682},"qualityAssurance",[713,716,718,720,723],{"project":714,"position":715},"Gridside","Technical Consultant",{"project":717,"position":715},"Herole",{"project":719,"position":715},"Montagespezis",{"project":721,"position":722},"Orsee","Technical Manager",{"project":724,"position":715},"Vipr",{"eMail":726,"phone":727,"visibility":728},"bernd.helm@helmundwalter.de","+49 351 799 035 20","1","images/employees/Portraits/bernd_helm.webp","images/employees/Portraits/BerndHelm_MS.webp","employees:employees:1.bernd-helm.json","json","Bernd Helm","employees/1.bernd-helm.json","employees/1.bernd-helm",{"_path":599,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":600,"description":601,"author":10,"image":602,"releaseDate":603,"blogCategories":737,"articleTags":738,"tags":739,"body":740,"_type":592,"_id":611,"_source":594,"_file":612,"_stem":613,"_extension":597},[605,606],[608],[610],{"type":21,"children":741,"toc":1207},[742,748,760,766,771,777,782,823,829,834,840,852,970,988,994,1150,1155,1161,1197,1203],{"type":24,"tag":25,"props":743,"children":745},{"id":744},"was-ist-btrfs-fragmentierung",[746],{"type":30,"value":747},"Was ist BTRFS-Fragmentierung?",{"type":24,"tag":33,"props":749,"children":750},{},[751,753,758],{"type":30,"value":752},"Die meisten der besten BTRFS-Funktionen beruhen auf der ",{"type":24,"tag":56,"props":754,"children":755},{},[756],{"type":30,"value":757},"Copy-on-Write-Technologie",{"type":30,"value":759},". Wenn eine Anwendung einen Teil einer Datei umschreiben will, z.B. das erste MegaByte, werden die Daten nicht an Ort und Stelle geschrieben, sondern in einer sogenannten Erweiterung. Dadurch ist BTRFS in der Lage, mehrere Versionen von teilweise umgeschriebenen Dateien aufzubewahren, wobei nur der den Änderungen zugewiesene Speicherplatz beansprucht wird und nicht mehrere vollständige Kopien einer Datei. Die alten Daten können zu einem bestimmten Zeitpunkt verworfen werden (z.B. wenn sie nicht mehr von Snapshots verwendet werden) und die Erweiterung dient der aktuellen Version der Datei.",{"type":24,"tag":25,"props":761,"children":763},{"id":762},"btrfs-fragmentierung-kann-die-leistung-ihres-systems-beeinträchtigen",[764],{"type":30,"value":765},"BTRFS-Fragmentierung kann die Leistung Ihres Systems beeinträchtigen",{"type":24,"tag":33,"props":767,"children":768},{},[769],{"type":30,"value":770},"Sie können sich vorstellen, dass das Lesen einer Datei mit 100k+ Erweiterungen und das Hinzufügen weiterer Erweiterungen eine Menge Buchführung und Speichersuchvorgänge von Ihrem System erfordert. Diese 10 GB große Datei ist intern in 100k+ Teile zerlegt, die gesammelt werden müssen, wenn Sie die gesamte Datei lesen wollen. Dies erhöht eindeutig die Komplexität - und verringert die Leistung.",{"type":24,"tag":25,"props":772,"children":774},{"id":773},"btrfs-fragmentierung-kann-große-mengen-an-speicherplatz-blockieren",[775],{"type":30,"value":776},"BTRFS-Fragmentierung kann große Mengen an Speicherplatz blockieren",{"type":24,"tag":33,"props":778,"children":779},{},[780],{"type":30,"value":781},"Ja, BTRFS muss die Speicherorte dieser 100k Erweiterungen irgendwo speichern, was leicht einige zusätzliche GB an belegtem Speicherplatz zu Ihrem System hinzufügen kann. Das Schlimme daran ist, dass BTRFS Ihnen das nicht mitteilt.",{"type":24,"tag":33,"props":783,"children":784},{},[785,787,793,795,800,802,807,809,814,816,821],{"type":30,"value":786},"Wenn Sie sehen, dass Ihr btrfs-Dateisystem ",{"type":24,"tag":788,"props":789,"children":790},"strong",{},[791],{"type":30,"value":792},"80GB",{"type":30,"value":794}," in ",{"type":24,"tag":56,"props":796,"children":797},{},[798],{"type":30,"value":799},"df",{"type":30,"value":801}," und ",{"type":24,"tag":56,"props":803,"children":804},{},[805],{"type":30,"value":806},"btrfs fi show",{"type":30,"value":808}," verwendet, während ",{"type":24,"tag":56,"props":810,"children":811},{},[812],{"type":30,"value":813},"du -hsx",{"type":30,"value":815}," nur ",{"type":24,"tag":788,"props":817,"children":818},{},[819],{"type":30,"value":820},"54GB",{"type":30,"value":822}," anzeigt, gibt es nur zwei Gründe, die mir bekannt sind: entweder Sie haben Snapshots, die alte Erweiterungen behalten - oder Sie haben eine massive Fragmentierung.",{"type":24,"tag":25,"props":824,"children":826},{"id":825},"btrfs-dateisystem-defragmentieren",[827],{"type":30,"value":828},"BTRFS-Dateisystem defragmentieren",{"type":24,"tag":33,"props":830,"children":831},{},[832],{"type":30,"value":833},"Es ist möglich, das BTRFS-Dateisystem auf dem gesamten Dateisystem zu defragmentieren, aber das führt dazu, dass alle Snapshots die Daten duplizieren. Es verursacht auch eine Menge IO, so dass dies nichts ist, was Sie auf Ihrem Produktionsserver ohne Grund tun wollen. Es macht wirklich keinen Sinn, statische Dateien zu defragmentieren, die fast nie geändert werden.",{"type":24,"tag":25,"props":835,"children":837},{"id":836},"finden-sie-die-am-meisten-fragmentierten-dateien-auf-ihrem-system",[838],{"type":30,"value":839},"Finden Sie die am meisten fragmentierten Dateien auf Ihrem System",{"type":24,"tag":33,"props":841,"children":842},{},[843,845,850],{"type":30,"value":844},"Es gibt ein Linux-Tool namens ",{"type":24,"tag":56,"props":846,"children":847},{},[848],{"type":30,"value":849},"filefrag",{"type":30,"value":851},", das anzeigt, aus wie vielen Fragmenten eine Datei besteht. Also dachte ich ... \"warum nicht versuchen, die am meisten fragmentierten Dateien zu finden und nur diese zu reparieren?\" Hier ist es:",{"type":24,"tag":134,"props":853,"children":855},{"className":517,"code":854,"language":519,"meta":7,"style":7},"find / -xdev -type f| xargs filefrag 2>/dev/null | sed 's/^\\(.*\\): \\([0-9]\\+\\) extent.*/\\2 \\1/' | awk -F ' ' '$1 > 500' | sort -n -r\n",[856],{"type":24,"tag":141,"props":857,"children":858},{"__ignoreMap":7},[859],{"type":24,"tag":145,"props":860,"children":861},{"class":147,"line":148},[862,867,872,877,882,887,892,897,902,907,912,917,922,927,931,936,941,946,951,955,960,965],{"type":24,"tag":145,"props":863,"children":864},{"style":158},[865],{"type":30,"value":866},"find",{"type":24,"tag":145,"props":868,"children":869},{"style":316},[870],{"type":30,"value":871}," /",{"type":24,"tag":145,"props":873,"children":874},{"style":344},[875],{"type":30,"value":876}," -xdev",{"type":24,"tag":145,"props":878,"children":879},{"style":344},[880],{"type":30,"value":881}," -type",{"type":24,"tag":145,"props":883,"children":884},{"style":316},[885],{"type":30,"value":886}," f",{"type":24,"tag":145,"props":888,"children":889},{"style":169},[890],{"type":30,"value":891},"|",{"type":24,"tag":145,"props":893,"children":894},{"style":158},[895],{"type":30,"value":896}," xargs",{"type":24,"tag":145,"props":898,"children":899},{"style":316},[900],{"type":30,"value":901}," filefrag",{"type":24,"tag":145,"props":903,"children":904},{"style":169},[905],{"type":30,"value":906}," 2>",{"type":24,"tag":145,"props":908,"children":909},{"style":316},[910],{"type":30,"value":911},"/dev/null",{"type":24,"tag":145,"props":913,"children":914},{"style":169},[915],{"type":30,"value":916}," |",{"type":24,"tag":145,"props":918,"children":919},{"style":158},[920],{"type":30,"value":921}," sed",{"type":24,"tag":145,"props":923,"children":924},{"style":316},[925],{"type":30,"value":926}," 's/^\\(.*\\): \\([0-9]\\+\\) extent.*/\\2 \\1/'",{"type":24,"tag":145,"props":928,"children":929},{"style":169},[930],{"type":30,"value":916},{"type":24,"tag":145,"props":932,"children":933},{"style":158},[934],{"type":30,"value":935}," awk",{"type":24,"tag":145,"props":937,"children":938},{"style":344},[939],{"type":30,"value":940}," -F",{"type":24,"tag":145,"props":942,"children":943},{"style":316},[944],{"type":30,"value":945}," ' '",{"type":24,"tag":145,"props":947,"children":948},{"style":316},[949],{"type":30,"value":950}," '$1 > 500'",{"type":24,"tag":145,"props":952,"children":953},{"style":169},[954],{"type":30,"value":916},{"type":24,"tag":145,"props":956,"children":957},{"style":158},[958],{"type":30,"value":959}," sort",{"type":24,"tag":145,"props":961,"children":962},{"style":344},[963],{"type":30,"value":964}," -n",{"type":24,"tag":145,"props":966,"children":967},{"style":344},[968],{"type":30,"value":969}," -r\n",{"type":24,"tag":33,"props":971,"children":972},{},[973,975,980,982,986],{"type":30,"value":974},"Sie sollten diese Liste überprüfen. Wenn es etwas mit mehr als 10k Erstreckungen gibt, ist es ein Kandidat, um als ",{"type":24,"tag":56,"props":976,"children":977},{},[978],{"type":30,"value":979},"nodatacow",{"type":30,"value":981}," gekennzeichnet zu werden. In meinem Fall habe ich festgestellt, dass die Fail2ban-Sqlite-Datenbank 170k Erweiterungen verwendet, was sehr viel ist! Wenn Sie Datenbankdateien mit einer hohen Fragmentierung haben, während Sie ",{"type":24,"tag":56,"props":983,"children":984},{},[985],{"type":30,"value":979},{"type":30,"value":987}," verwenden, ist es besser, eine \"optimize table\" auf ihnen laufen zu lassen, da dies auch die datenbankbezogene Fragmentierung von häufig neu geschriebenen Tabellen bereinigt. Wenn Sie Snapshots verwenden, stellen Sie sicher, dass Sie etwas freien Speicherplatz haben, da die Defragmentierung eine Kopie der Dateien an Ort und Stelle erstellt, während Snapshots die Freigabe der alten Version blockieren.",{"type":24,"tag":25,"props":989,"children":991},{"id":990},"wenn-alles-in-ordnung-ist-können-sie-fortfahren-und-alle-dateien-in-dieser-liste-defragmentieren",[992],{"type":30,"value":993},"Wenn alles in Ordnung ist, können Sie fortfahren und alle Dateien in dieser Liste defragmentieren",{"type":24,"tag":134,"props":995,"children":997},{"className":517,"code":996,"language":519,"meta":7,"style":7},"find / -xdev -type f| xargs filefrag 2>/dev/null | sed 's/^\\(.*\\): \\([0-9]\\+\\) extent.*/\\2 \\1/' |\nawk -F ' ' '$1 > 500' | cut -d ' ' -f2 2>/dev/null | xargs -r btrfs fi defrag -f -v\n",[998],{"type":24,"tag":141,"props":999,"children":1000},{"__ignoreMap":7},[1001,1061],{"type":24,"tag":145,"props":1002,"children":1003},{"class":147,"line":148},[1004,1008,1012,1016,1020,1024,1028,1032,1036,1040,1044,1048,1052,1056],{"type":24,"tag":145,"props":1005,"children":1006},{"style":158},[1007],{"type":30,"value":866},{"type":24,"tag":145,"props":1009,"children":1010},{"style":316},[1011],{"type":30,"value":871},{"type":24,"tag":145,"props":1013,"children":1014},{"style":344},[1015],{"type":30,"value":876},{"type":24,"tag":145,"props":1017,"children":1018},{"style":344},[1019],{"type":30,"value":881},{"type":24,"tag":145,"props":1021,"children":1022},{"style":316},[1023],{"type":30,"value":886},{"type":24,"tag":145,"props":1025,"children":1026},{"style":169},[1027],{"type":30,"value":891},{"type":24,"tag":145,"props":1029,"children":1030},{"style":158},[1031],{"type":30,"value":896},{"type":24,"tag":145,"props":1033,"children":1034},{"style":316},[1035],{"type":30,"value":901},{"type":24,"tag":145,"props":1037,"children":1038},{"style":169},[1039],{"type":30,"value":906},{"type":24,"tag":145,"props":1041,"children":1042},{"style":316},[1043],{"type":30,"value":911},{"type":24,"tag":145,"props":1045,"children":1046},{"style":169},[1047],{"type":30,"value":916},{"type":24,"tag":145,"props":1049,"children":1050},{"style":158},[1051],{"type":30,"value":921},{"type":24,"tag":145,"props":1053,"children":1054},{"style":316},[1055],{"type":30,"value":926},{"type":24,"tag":145,"props":1057,"children":1058},{"style":169},[1059],{"type":30,"value":1060}," |\n",{"type":24,"tag":145,"props":1062,"children":1063},{"class":147,"line":225},[1064,1069,1073,1077,1081,1085,1090,1095,1099,1104,1108,1112,1116,1120,1125,1130,1135,1140,1145],{"type":24,"tag":145,"props":1065,"children":1066},{"style":158},[1067],{"type":30,"value":1068},"awk",{"type":24,"tag":145,"props":1070,"children":1071},{"style":344},[1072],{"type":30,"value":940},{"type":24,"tag":145,"props":1074,"children":1075},{"style":316},[1076],{"type":30,"value":945},{"type":24,"tag":145,"props":1078,"children":1079},{"style":316},[1080],{"type":30,"value":950},{"type":24,"tag":145,"props":1082,"children":1083},{"style":169},[1084],{"type":30,"value":916},{"type":24,"tag":145,"props":1086,"children":1087},{"style":158},[1088],{"type":30,"value":1089}," cut",{"type":24,"tag":145,"props":1091,"children":1092},{"style":344},[1093],{"type":30,"value":1094}," -d",{"type":24,"tag":145,"props":1096,"children":1097},{"style":316},[1098],{"type":30,"value":945},{"type":24,"tag":145,"props":1100,"children":1101},{"style":344},[1102],{"type":30,"value":1103}," -f2",{"type":24,"tag":145,"props":1105,"children":1106},{"style":169},[1107],{"type":30,"value":906},{"type":24,"tag":145,"props":1109,"children":1110},{"style":316},[1111],{"type":30,"value":911},{"type":24,"tag":145,"props":1113,"children":1114},{"style":169},[1115],{"type":30,"value":916},{"type":24,"tag":145,"props":1117,"children":1118},{"style":158},[1119],{"type":30,"value":896},{"type":24,"tag":145,"props":1121,"children":1122},{"style":344},[1123],{"type":30,"value":1124}," -r",{"type":24,"tag":145,"props":1126,"children":1127},{"style":316},[1128],{"type":30,"value":1129}," btrfs",{"type":24,"tag":145,"props":1131,"children":1132},{"style":316},[1133],{"type":30,"value":1134}," fi",{"type":24,"tag":145,"props":1136,"children":1137},{"style":316},[1138],{"type":30,"value":1139}," defrag",{"type":24,"tag":145,"props":1141,"children":1142},{"style":344},[1143],{"type":30,"value":1144}," -f",{"type":24,"tag":145,"props":1146,"children":1147},{"style":344},[1148],{"type":30,"value":1149}," -v\n",{"type":24,"tag":33,"props":1151,"children":1152},{},[1153],{"type":30,"value":1154},"Dies gibt alle Dateinamen aus, die verarbeitet wurden.",{"type":24,"tag":25,"props":1156,"children":1158},{"id":1157},"eine-kurze-erklärung-des-befehls",[1159],{"type":30,"value":1160},"Eine kurze Erklärung des Befehls",{"type":24,"tag":33,"props":1162,"children":1163},{},[1164,1168,1170,1175,1177,1181,1183,1188,1190,1195],{"type":24,"tag":56,"props":1165,"children":1166},{},[1167],{"type":30,"value":866},{"type":30,"value":1169}," ermittelt alle Dateien auf dem angegebenen Pfad (/), ohne in andere eingehängte Dateisysteme zu gehen (-xdev). Dann bestimmt filefrag die Fragmentierung, der Befehl ",{"type":24,"tag":56,"props":1171,"children":1172},{},[1173],{"type":30,"value":1174},"sed",{"type":30,"value":1176}," formatiert die Ausgabe so um, dass die Anzahl der Erweiterungen an erster Stelle steht, gefolgt vom Dateinamen. Dann analysiert ",{"type":24,"tag":56,"props":1178,"children":1179},{},[1180],{"type":30,"value":1068},{"type":30,"value":1182}," diese Liste und filtert nur Dateien, die mehr als 500 Erweiterungen haben. Danach wird die Ausgabe so \"geschnitten\", dass sie nur die Dateinamen enthält, und an ",{"type":24,"tag":56,"props":1184,"children":1185},{},[1186],{"type":30,"value":1187},"btrfs defrag",{"type":30,"value":1189}," zur Defragmentierung übergeben. Die Option ",{"type":24,"tag":56,"props":1191,"children":1192},{},[1193],{"type":30,"value":1194},"-v",{"type":30,"value":1196}," des Defrag-Befehls gibt alle verarbeiteten Dateien aus. Werfen Sie auch einen Blick auf die langfristige IO-Nutzung vor und nach der Defragmentierung, um zu sehen, wie groß der Unterschied in der realen Welt ist.",{"type":24,"tag":25,"props":1198,"children":1200},{"id":1199},"viel-spaß",[1201],{"type":30,"value":1202},"Viel Spaß!",{"type":24,"tag":582,"props":1204,"children":1205},{},[1206],{"type":30,"value":586},{"title":7,"searchDepth":225,"depth":225,"links":1208},[1209,1210,1211,1212,1213,1214,1215,1216],{"id":744,"depth":225,"text":747},{"id":762,"depth":225,"text":765},{"id":773,"depth":225,"text":776},{"id":825,"depth":225,"text":828},{"id":836,"depth":225,"text":839},{"id":990,"depth":225,"text":993},{"id":1157,"depth":225,"text":1160},{"id":1199,"depth":225,"text":1202},{"_path":615,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":616,"description":617,"author":10,"image":618,"releaseDate":619,"blogCategories":1218,"articleTags":1219,"tags":1220,"body":1221,"_type":592,"_id":624,"_source":594,"_file":625,"_stem":626,"_extension":597},[605,15],[17,622],[610],{"type":21,"children":1222,"toc":1764},[1223,1229,1234,1239,1255,1268,1274,1302,1320,1326,1331,1344,1357,1386,1413,1434,1488,1504,1531,1574,1603,1653,1672,1685,1728,1740,1760],{"type":24,"tag":25,"props":1224,"children":1226},{"id":1225},"wie-man-ausgewählte-domains-über-vpn-unter-linux-auflöst",[1227],{"type":30,"value":1228},"Wie man ausgewählte Domains über VPN unter Linux auflöst",{"type":24,"tag":33,"props":1230,"children":1231},{},[1232],{"type":30,"value":1233},"In der heutigen Welt nutzen mehr Menschen als je zuvor VPN-Dienste, um aus der Ferne zu arbeiten. In manchen Fällen ist\nes jedoch nicht wünschenswert, den gesamten Datenverkehr und alle Domainnamenauflösungen über die VPN-Verbindung zu\nleiten. Selbst wenn der VPN-Server möchte, dass der Client genau so\nkonfiguriert werden soll, kann der Client so konfiguriert werden, dass er die Anforderung, den gesamten Datenverkehr\nüber die VPN-Verbindung zu leiten, ignoriert.",{"type":24,"tag":33,"props":1235,"children":1236},{},[1237],{"type":30,"value":1238},"Zum Beispiel kann bei Openvpn die Option",{"type":24,"tag":134,"props":1240,"children":1244},{"className":1241,"code":1242,"language":1243,"meta":7,"style":7},"language-apache shiki shiki-themes github-dark github-dark monokai","pull-filter ignore redirect-gateway\n","apache",[1245],{"type":24,"tag":141,"props":1246,"children":1247},{"__ignoreMap":7},[1248],{"type":24,"tag":145,"props":1249,"children":1250},{"class":147,"line":148},[1251],{"type":24,"tag":145,"props":1252,"children":1253},{"style":152},[1254],{"type":30,"value":1242},{"type":24,"tag":33,"props":1256,"children":1257},{},[1258,1260,1266],{"type":30,"value":1259},"verwendet werden, um den ",{"type":24,"tag":141,"props":1261,"children":1263},{"className":1262},[],[1264],{"type":30,"value":1265},"openvpn-client",{"type":30,"value":1267}," anzuweisen, alle \"route all\"-Anfragen des Servers zu ignorieren.",{"type":24,"tag":25,"props":1269,"children":1271},{"id":1270},"fritzbox-beispiel",[1272],{"type":30,"value":1273},"FRITZ!Box Beispiel",{"type":24,"tag":33,"props":1275,"children":1276},{},[1277,1279,1284,1286,1292,1294,1300],{"type":30,"value":1278},"Kürzlich musste ich eine VPN-Verbindung zu einer ",{"type":24,"tag":788,"props":1280,"children":1281},{},[1282],{"type":30,"value":1283},"FRITZ!Box",{"type":30,"value":1285}," nutzen. Das ist ein sehr beliebter Router in Deutschland,\nder nicht nur\neinfache\nVPN-Verbindungen anbietet, sondern auch alle Hosts in seinem Netzwerk zu seinem eigenen DNS hinzufügt. Wenn Sie mit\neinem Rechner mit dem Namen ",{"type":24,"tag":141,"props":1287,"children":1289},{"className":1288},[],[1290],{"type":30,"value":1291}," workstation",{"type":30,"value":1293}," ansprechen wollen, können Sie ihn über den dns-Namen \"workstation.fritz.box\" erreichen. Die fritz-box\nselbst ist auch unter dem\ndns-Namen ",{"type":24,"tag":141,"props":1295,"children":1297},{"className":1296},[],[1298],{"type":30,"value":1299},"fritz.box",{"type":30,"value":1301},".",{"type":24,"tag":33,"props":1303,"children":1304},{},[1305,1307,1312,1314,1318],{"type":30,"value":1306},"In meinem Fall ziehe ich es aus Geschwindigkeits- und Datenschutzgründen vor, meinen eigenen DNS-Server für alle\nAbfragen zu verwenden - das heißt, ich möchte nur\ndie Domains mit dem Suffix ",{"type":24,"tag":141,"props":1308,"children":1310},{"className":1309},[],[1311],{"type":30,"value":1299},{"type":30,"value":1313}," über die ",{"type":24,"tag":788,"props":1315,"children":1316},{},[1317],{"type":30,"value":1283},{"type":30,"value":1319}," auflösen.",{"type":24,"tag":25,"props":1321,"children":1323},{"id":1322},"lösung-mit-einem-lokalen-dns-server-dnsmasq",[1324],{"type":30,"value":1325},"Lösung mit einem lokalen DNS-Server - dnsmasq",{"type":24,"tag":33,"props":1327,"children":1328},{},[1329],{"type":30,"value":1330},"Dnsmasq ist ein leichtgewichtiger DNS-Server, den man auf dem eigenen Rechner laufen lassen kann, um die Kontrolle über\ndie Namensauflösung zu bekommen. Ein netter Nebeneffekt ist, dass er seinen eigenen DNS-Cache hat, was wiederkehrende\nDNS-Abfragen schneller macht. Hier ist, wie ich ihn eingerichtet habe:",{"type":24,"tag":33,"props":1332,"children":1333},{},[1334,1336,1342],{"type":30,"value":1335},"Bevor Sie beginnen, müssen Sie herausfinden, welcher DNS-Server im VPN verwendet wird. Normalerweise ist es das\nStandard-Gateway, das normalerweise\nein ",{"type":24,"tag":141,"props":1337,"children":1339},{"className":1338},[],[1340],{"type":30,"value":1341},".1",{"type":30,"value":1343}," am Ende hat. Sie können die VPN-Protokolle genau beobachten, um herauszufinden, welcher DNS-Server bei der\nVerbindung verwendet wird.",{"type":24,"tag":33,"props":1345,"children":1346},{},[1347,1349,1355],{"type":30,"value":1348},"Es gibt ein Tool namens ",{"type":24,"tag":141,"props":1350,"children":1352},{"className":1351},[],[1353],{"type":30,"value":1354},"dig",{"type":30,"value":1356},", das DNS-Abfragen über bestimmte DNS-Server durchführen kann, zum Beispiel",{"type":24,"tag":134,"props":1358,"children":1360},{"className":517,"code":1359,"language":519,"meta":7,"style":7},"dig @192.168.1.1 a fritz.box\n\n",[1361],{"type":24,"tag":141,"props":1362,"children":1363},{"__ignoreMap":7},[1364],{"type":24,"tag":145,"props":1365,"children":1366},{"class":147,"line":148},[1367,1371,1376,1381],{"type":24,"tag":145,"props":1368,"children":1369},{"style":158},[1370],{"type":30,"value":1354},{"type":24,"tag":145,"props":1372,"children":1373},{"style":316},[1374],{"type":30,"value":1375}," @192.168.1.1",{"type":24,"tag":145,"props":1377,"children":1378},{"style":316},[1379],{"type":30,"value":1380}," a",{"type":24,"tag":145,"props":1382,"children":1383},{"style":316},[1384],{"type":30,"value":1385}," fritz.box\n",{"type":24,"tag":33,"props":1387,"children":1388},{},[1389,1391,1397,1399,1404,1406,1412],{"type":30,"value":1390},"wird den DNS-Server ",{"type":24,"tag":141,"props":1392,"children":1394},{"className":1393},[],[1395],{"type":30,"value":1396},"192.168.1.1",{"type":30,"value":1398}," nach der IP von ",{"type":24,"tag":141,"props":1400,"children":1402},{"className":1401},[],[1403],{"type":30,"value":1299},{"type":30,"value":1405}," fragen. Dig ist sehr praktisch bei der Fehlersuche bei DNS-Problemen und Ihrer Einrichtung zu testen.  Sie müssen es eventuell auf Ihrem System installieren. Unter Debian befindet es sich in einem Paket namens ",{"type":24,"tag":141,"props":1407,"children":1409},{"className":1408},[],[1410],{"type":30,"value":1411},"dnsutils",{"type":30,"value":1301},{"type":24,"tag":33,"props":1414,"children":1415},{},[1416,1418,1424,1426,1432],{"type":30,"value":1417},"Installieren Sie zuerst ",{"type":24,"tag":141,"props":1419,"children":1421},{"className":1420},[],[1422],{"type":30,"value":1423},"dnsmasq",{"type":30,"value":1425}," auf Ihrem Linux und bearbeiten Sie seine Konfiguration (normalerweise in ",{"type":24,"tag":141,"props":1427,"children":1429},{"className":1428},[],[1430],{"type":30,"value":1431},"/etc/dnsmasq.conf",{"type":30,"value":1433},"). Fügen Sie diese Zeilen\nhier ein:",{"type":24,"tag":134,"props":1435,"children":1437},{"className":1241,"code":1436,"language":1243,"meta":7,"style":7},"resolv-datei=/etc/resolv.dnsmasq.conf\nserver=/fritz.box/192.168.1.1\n",[1438],{"type":24,"tag":141,"props":1439,"children":1440},{"__ignoreMap":7},[1441,1449],{"type":24,"tag":145,"props":1442,"children":1443},{"class":147,"line":148},[1444],{"type":24,"tag":145,"props":1445,"children":1446},{"style":152},[1447],{"type":30,"value":1448},"resolv-datei=/etc/resolv.dnsmasq.conf\n",{"type":24,"tag":145,"props":1450,"children":1451},{"class":147,"line":225},[1452,1457,1462,1466,1471,1475,1479,1483],{"type":24,"tag":145,"props":1453,"children":1454},{"style":152},[1455],{"type":30,"value":1456},"server=/fritz.box/",{"type":24,"tag":145,"props":1458,"children":1459},{"style":344},[1460],{"type":30,"value":1461},"192",{"type":24,"tag":145,"props":1463,"children":1464},{"style":152},[1465],{"type":30,"value":1301},{"type":24,"tag":145,"props":1467,"children":1468},{"style":344},[1469],{"type":30,"value":1470},"168",{"type":24,"tag":145,"props":1472,"children":1473},{"style":152},[1474],{"type":30,"value":1301},{"type":24,"tag":145,"props":1476,"children":1477},{"style":344},[1478],{"type":30,"value":728},{"type":24,"tag":145,"props":1480,"children":1481},{"style":152},[1482],{"type":30,"value":1301},{"type":24,"tag":145,"props":1484,"children":1485},{"style":344},[1486],{"type":30,"value":1487},"1\n",{"type":24,"tag":33,"props":1489,"children":1490},{},[1491,1496,1498,1503],{"type":24,"tag":141,"props":1492,"children":1494},{"className":1493},[],[1495],{"type":30,"value":1299},{"type":30,"value":1497}," ist die Domain, die über den VPN-Dnsserver aufgelöst werden soll, in diesem Beispiel ",{"type":24,"tag":141,"props":1499,"children":1501},{"className":1500},[],[1502],{"type":30,"value":1396},{"type":30,"value":1301},{"type":24,"tag":33,"props":1505,"children":1506},{},[1507,1509,1514,1516,1521,1523,1529],{"type":30,"value":1508},"Die ",{"type":24,"tag":788,"props":1510,"children":1511},{},[1512],{"type":30,"value":1513},"Resolv-Datei",{"type":30,"value":1515}," wird ",{"type":24,"tag":141,"props":1517,"children":1519},{"className":1518},[],[1520],{"type":30,"value":1423},{"type":30,"value":1522}," mitteilen, wie es seine DNS-Anfragen auflösen soll, falls es keine anderen Regeln\ngibt, also erstellen wir ",{"type":24,"tag":141,"props":1524,"children":1526},{"className":1525},[],[1527],{"type":30,"value":1528},"/etc/resolv.dnsmasq.conf",{"type":30,"value":1530},"\nmit dem Inhalt",{"type":24,"tag":134,"props":1532,"children":1534},{"className":1241,"code":1533,"language":1243,"meta":7,"style":7},"Nameserver 1.1.1.1\n",[1535],{"type":24,"tag":141,"props":1536,"children":1537},{"__ignoreMap":7},[1538],{"type":24,"tag":145,"props":1539,"children":1540},{"class":147,"line":148},[1541,1546,1550,1554,1558,1562,1566,1570],{"type":24,"tag":145,"props":1542,"children":1543},{"style":152},[1544],{"type":30,"value":1545},"Nameserver ",{"type":24,"tag":145,"props":1547,"children":1548},{"style":344},[1549],{"type":30,"value":728},{"type":24,"tag":145,"props":1551,"children":1552},{"style":152},[1553],{"type":30,"value":1301},{"type":24,"tag":145,"props":1555,"children":1556},{"style":344},[1557],{"type":30,"value":728},{"type":24,"tag":145,"props":1559,"children":1560},{"style":152},[1561],{"type":30,"value":1301},{"type":24,"tag":145,"props":1563,"children":1564},{"style":344},[1565],{"type":30,"value":728},{"type":24,"tag":145,"props":1567,"children":1568},{"style":152},[1569],{"type":30,"value":1301},{"type":24,"tag":145,"props":1571,"children":1572},{"style":344},[1573],{"type":30,"value":1487},{"type":24,"tag":33,"props":1575,"children":1576},{},[1577,1579,1585,1587,1593,1595,1601],{"type":30,"value":1578},"Wenn Sie eine statische Netzwerkkonfiguration verwenden, können Sie diese jetzt einfach bearbeiten, um ",{"type":24,"tag":141,"props":1580,"children":1582},{"className":1581},[],[1583],{"type":30,"value":1584},"127.0.0.1",{"type":30,"value":1586}," als\nNameserver zu verwenden. Wenn Sie\nautomatische IP-Konfiguration mit dhcp verwenden, müssen Sie Ihren dhcp-Client so konfigurieren, dass er den neuen\nlokalen DNS-Server verwendet. Unter Debian,\nist der Standard ",{"type":24,"tag":141,"props":1588,"children":1590},{"className":1589},[],[1591],{"type":30,"value":1592},"dhclient",{"type":30,"value":1594},". In diesem Fall editieren Sie ",{"type":24,"tag":141,"props":1596,"children":1598},{"className":1597},[],[1599],{"type":30,"value":1600},"/etc/dhcp/dhclient.conf",{"type":30,"value":1602}," und fügen hinzu:",{"type":24,"tag":134,"props":1604,"children":1606},{"className":1241,"code":1605,"language":1243,"meta":7,"style":7},"domain-name-servers 127.0.0.1 vorangestellt;\n\n",[1607],{"type":24,"tag":141,"props":1608,"children":1609},{"__ignoreMap":7},[1610],{"type":24,"tag":145,"props":1611,"children":1612},{"class":147,"line":148},[1613,1618,1623,1627,1632,1636,1640,1644,1648],{"type":24,"tag":145,"props":1614,"children":1615},{"style":152},[1616],{"type":30,"value":1617},"domain-name-servers ",{"type":24,"tag":145,"props":1619,"children":1620},{"style":344},[1621],{"type":30,"value":1622},"127",{"type":24,"tag":145,"props":1624,"children":1625},{"style":152},[1626],{"type":30,"value":1301},{"type":24,"tag":145,"props":1628,"children":1629},{"style":344},[1630],{"type":30,"value":1631},"0",{"type":24,"tag":145,"props":1633,"children":1634},{"style":152},[1635],{"type":30,"value":1301},{"type":24,"tag":145,"props":1637,"children":1638},{"style":344},[1639],{"type":30,"value":1631},{"type":24,"tag":145,"props":1641,"children":1642},{"style":152},[1643],{"type":30,"value":1301},{"type":24,"tag":145,"props":1645,"children":1646},{"style":344},[1647],{"type":30,"value":728},{"type":24,"tag":145,"props":1649,"children":1650},{"style":152},[1651],{"type":30,"value":1652}," vorangestellt;\n",{"type":24,"tag":33,"props":1654,"children":1655},{},[1656,1658,1663,1665,1670],{"type":30,"value":1657},"Das war's. Alles, was Sie jetzt noch tun müssen, ist ",{"type":24,"tag":141,"props":1659,"children":1661},{"className":1660},[],[1662],{"type":30,"value":1423},{"type":30,"value":1664}," neu zu starten, damit es seine Konfiguration neu lädt und ",{"type":24,"tag":141,"props":1666,"children":1668},{"className":1667},[],[1669],{"type":30,"value":1592},{"type":30,"value":1671}," neu zu verbinden/starten\n(das Trennen und erneute Verbinden des Netzwerks kann funktionieren, im Zweifelsfall starten Sie den Rechner neu).",{"type":24,"tag":33,"props":1673,"children":1674},{},[1675,1677,1683],{"type":30,"value":1676},"Jetzt können Sie überprüfen, ob die Datei ",{"type":24,"tag":141,"props":1678,"children":1680},{"className":1679},[],[1681],{"type":30,"value":1682},"/etc/resolv.conf",{"type":30,"value":1684}," folgendes enthält",{"type":24,"tag":134,"props":1686,"children":1688},{"className":1241,"code":1687,"language":1243,"meta":7,"style":7},"nameserver 127.0.0.1\n",[1689],{"type":24,"tag":141,"props":1690,"children":1691},{"__ignoreMap":7},[1692],{"type":24,"tag":145,"props":1693,"children":1694},{"class":147,"line":148},[1695,1700,1704,1708,1712,1716,1720,1724],{"type":24,"tag":145,"props":1696,"children":1697},{"style":152},[1698],{"type":30,"value":1699},"nameserver ",{"type":24,"tag":145,"props":1701,"children":1702},{"style":344},[1703],{"type":30,"value":1622},{"type":24,"tag":145,"props":1705,"children":1706},{"style":152},[1707],{"type":30,"value":1301},{"type":24,"tag":145,"props":1709,"children":1710},{"style":344},[1711],{"type":30,"value":1631},{"type":24,"tag":145,"props":1713,"children":1714},{"style":152},[1715],{"type":30,"value":1301},{"type":24,"tag":145,"props":1717,"children":1718},{"style":344},[1719],{"type":30,"value":1631},{"type":24,"tag":145,"props":1721,"children":1722},{"style":152},[1723],{"type":30,"value":1301},{"type":24,"tag":145,"props":1725,"children":1726},{"style":344},[1727],{"type":30,"value":1487},{"type":24,"tag":33,"props":1729,"children":1730},{},[1731,1733,1738],{"type":30,"value":1732},"als ersten Nameserver enthält. Wenn dies der Fall ist, sollte die ausgewählte Domain (in meinem Beispiel ",{"type":24,"tag":141,"props":1734,"children":1736},{"className":1735},[],[1737],{"type":30,"value":1299},{"type":30,"value":1739},")\nnun aufgelöst werden.",{"type":24,"tag":33,"props":1741,"children":1742},{},[1743,1745,1750,1752,1758],{"type":30,"value":1744},"Bei ",{"type":24,"tag":141,"props":1746,"children":1748},{"className":1747},[],[1749],{"type":30,"value":1423},{"type":30,"value":1751}," können Sie mehrere ",{"type":24,"tag":141,"props":1753,"children":1755},{"className":1754},[],[1756],{"type":30,"value":1757},"server=",{"type":30,"value":1759},"-Zeilen hinzufügen, was praktisch ist, wenn Sie mehrere Domains haben, die\nüber verschiedene DNS-Server aufgelöst werden müssen.",{"type":24,"tag":582,"props":1761,"children":1762},{},[1763],{"type":30,"value":586},{"title":7,"searchDepth":225,"depth":225,"links":1765},[1766,1767,1768],{"id":1225,"depth":225,"text":1228},{"id":1270,"depth":225,"text":1273},{"id":1322,"depth":225,"text":1325},{"_path":631,"_dir":632,"_draft":6,"_partial":6,"_locale":7,"slug":10,"teams":1770,"primaryTeam":635,"firstName":636,"lastName":637,"prefixTitle":7,"suffixTitle":7,"education":1771,"executiveRole":643,"role":1773,"workingSince":652,"inTheCompanySince":653,"techSkills":1774,"skills":1791,"projects":1798,"contactDetails":1804,"_image":729,"image":730,"_id":731,"_type":732,"title":733,"_source":632,"_file":734,"_stem":735,"_extension":732},[634,635],[1772],[640,641,642],[645,646,635,647,648,649,650,651],[1775,1776,1777,1778,1779,1780,1781,1782,1783,1784,1785,1786,1787,1788,1789,1790],{"name":656,"level":657,"icon":658},{"name":622,"level":657,"icon":660},{"name":662,"level":657},{"name":664,"level":657,"icon":665},{"name":667,"level":657},{"name":669,"level":657,"icon":670},{"name":672,"level":657},{"name":674,"level":657},{"name":676,"level":657},{"name":678,"level":657,"icon":679},{"name":681,"level":682,"icon":683},{"name":685,"level":682,"icon":686},{"name":688,"level":682,"icon":689},{"name":691,"level":682,"icon":692},{"name":694,"level":682,"icon":695},{"name":697,"level":682,"icon":698},[1792,1793,1794,1795,1796,1797],{"name":701,"level":657},{"name":703,"level":657},{"name":705,"level":657},{"name":707,"level":657},{"name":709,"level":657},{"name":711,"level":682},[1799,1800,1801,1802,1803],{"project":714,"position":715},{"project":717,"position":715},{"project":719,"position":715},{"project":721,"position":722},{"project":724,"position":715},{"eMail":726,"phone":727,"visibility":728},[1806,1821],{"_path":1807,"_dir":1808,"_draft":6,"_partial":368,"_locale":7,"name":1809,"slug":1808,"text":1810,"hoverText":1811,"image":1812,"customer":1813,"tags":1814,"_id":1816,"_type":1817,"title":1818,"_source":594,"_file":1819,"_stem":1820,"_extension":1817},"/portfolio/bitburger/_teaser","bitburger","Bitburger B2B- und Marken-Shops","Launch des B2B Shops und Migration der Markenshops auf eine neue Plattform","Die Bitburger Braugruppe modernisierte ihr digitales Angebot. Nach dem Start des B2B Shops wurden fünf Markenshops auf eine gemeinsame Plattform migriert und weiterentwickelt.","/images/portfolio/bitburger/Bitburger_HuW_Glaeser.jpg","Bitburger Braugruppe",[19,1815],"e-commerce","common:portfolio:900.bitburger:_teaser.yaml","yaml","Teaser","portfolio/900.bitburger/_teaser.yaml","portfolio/900.bitburger/_teaser",{"_path":1822,"_dir":1823,"_draft":6,"_partial":368,"_locale":7,"name":1824,"slug":1823,"text":1825,"hoverText":1826,"image":1827,"customer":1828,"tags":1829,"_id":1830,"_type":1817,"title":1818,"_source":594,"_file":1831,"_stem":1832,"_extension":1817},"/portfolio/purize/_teaser","purize","Purize Filters","E-Commerce für hochwertige Aktivkohlefilter","Wir unterstützen PURIZE® Filters mit einem vollständigen E-Commerce-Service inklusive Fulfillment-Lösung und Anbindung an Versanddienstleister. Unsere Expertise im Online-Handel ermöglicht dem Hersteller qualitativ hochwertiger Aktivkohlefilter \"Made in Germany\" eine reibungslose Abwicklung ihrer Bestellprozesse.","/images/portfolio/barcode-machine-verdandijpg.jpg","PURIZE® Filters",[19,1815],"common:portfolio:9000.purize:_teaser.yaml","portfolio/9000.purize/_teaser.yaml","portfolio/9000.purize/_teaser",1782284041412]