{"id":38929,"date":"2019-10-31T22:26:48","date_gmt":"2019-10-31T19:26:48","guid":{"rendered":"https:\/\/prohoster.info\/blog\/linux-mnogolikij-kak-rabotat-na-lyubom-distributive\/"},"modified":"2019-10-31T22:26:48","modified_gmt":"2019-10-31T19:26:48","slug":"linux-mnogolikij-kak-rabotat-na-lyubom-distributive","status":"publish","type":"post","link":"https:\/\/prohoster.info\/pl\/blog\/administrirovanie\/linux-mnogolikij-kak-rabotat-na-lyubom-distributive","title":{"rendered":"Linux ma wiele twarzy: jak pracowa\u0107 na dowolnej dystrybucji","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Linux ma wiele twarzy: jak pracowa\u0107 na dowolnej dystrybucji\" src=\"\/wp-content\/uploads\/2019\/10\/ee1aaad566204532c974a3ce8f13b915.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nStworzenie aplikacji do tworzenia kopii zapasowych dzia\u0142aj\u0105cej na dowolnej dystrybucji to nie\u0142atwe zadanie. Aby zapewni\u0107 dzia\u0142anie Veeam Agent for Linux na dystrybucjach od Red Hat 6 i Debian 6 do OpenSUSE 15.1 i Ubuntu 19.04, trzeba rozwi\u0105za\u0107 szereg problem\u00f3w, zw\u0142aszcza bior\u0105c pod uwag\u0119, \u017ce w sk\u0142ad produktu wchodzi modu\u0142 j\u0105dra.<\/p>\n<p>Artyku\u0142 powsta\u0142 na podstawie wyst\u0105pienia na konferencji <noindex><a rel=\"nofollow\" href=\"https:\/\/linuxpiter.com\/materials\/2636\"> LinuxPiter 2019<\/a><\/noindex>.<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><br \/>\nLinux to nie tylko jeden z najpopularniejszych system\u00f3w operacyjnych. W istocie jest to platforma, na kt\u00f3rej mo\u017cna stworzy\u0107 co\u015b unikalnego, co\u015b w\u0142asnego. Dzi\u0119ki temu istnieje wiele dystrybucji Linuxa, kt\u00f3re r\u00f3\u017cni\u0105 si\u0119 zestawem komponent\u00f3w programowych. I tu pojawia si\u0119 problem: aby produkt programowy dzia\u0142a\u0142 na ka\u017cdej dystrybucji, trzeba uwzgl\u0119dni\u0107 cechy ka\u017cdej z nich.<\/p>\n<h2>Menad\u017cery pakiet\u00f3w. .deb vs .rpm<\/h2>\n<p>\nZacznijmy od oczywistego problemu rozprzestrzeniania produktu na r\u00f3\u017cne dystrybucje.<br \/>\nNajbardziej typowy spos\u00f3b rozprzestrzeniania produkt\u00f3w programowych to umieszczenie pakietu w repozytorium, aby wbudowany w system menad\u017cer pakiet\u00f3w m\u00f3g\u0142 go stamt\u0105d zainstalowa\u0107.<br \/>\nJednak popularnych format\u00f3w pakiet\u00f3w mamy dwa: <i>rpm<\/i> i <i>deb<\/i>. To oznacza, \u017ce trzeba wspiera\u0107 ka\u017cdy z nich.<\/p>\n<p>W \u015bwiecie pakiet\u00f3w deb kompatybilno\u015b\u0107 jest zdumiewaj\u0105ca. Ten sam pakiet dzia\u0142a r\u00f3wnie dobrze zar\u00f3wno na Debianie 6, jak i na Ubuntu 19.04. Standardy procesu tworzenia pakiet\u00f3w i pracy z nimi, ustalone w starych dystrybucjach Debiana, pozostaj\u0105 aktualne tak\u017ce w modnych dystrybucjach jak Linux Mint i elementary OS. Dlatego w przypadku Veeam Agent for Linux wystarczy jeden pakiet deb dla ka\u017cdej platformy sprz\u0119towej.<\/p>\n<p>A w \u015bwiecie pakiet\u00f3w rpm r\u00f3\u017cnice s\u0105 ogromne. Po pierwsze, dlatego \u017ce s\u0105 dwaj ca\u0142kowicie niezale\u017cni dystrybutorzy Red Hat i SUSE, dla kt\u00f3rych wcale nie jest potrzebna kompatybilno\u015b\u0107. Po drugie, ci dystrybutorzy maj\u0105 dystrybucje z wsparciem technicznym i eksperymentalne. Mi\u0119dzy nimi tak\u017ce nie jest potrzebna kompatybilno\u015b\u0107. Okazuje si\u0119, \u017ce dla el6, el7 i el8 mamy swoje pakiety. Osobno pakiet dla Fedory. Pakiety dla SLES11 i 12 oraz osobny dla openSUSE. G\u0142\u00f3wnym problemem s\u0105 zale\u017cno\u015bci i nazwy pakiet\u00f3w. <\/p>\n<h2>Problem zale\u017cno\u015bci<\/h2>\n<p>\nNiestety, te same pakiety cz\u0119sto wyst\u0119puj\u0105 pod r\u00f3\u017cnymi nazwami w r\u00f3\u017cnych dystrybucjach. Poni\u017cej znajduje si\u0119 niekompletny wykaz zale\u017cno\u015bci pakietu veeam.<\/p>\n<p>Dla EL7:<br \/>\nDla SLES 12:<\/p>\n<ul>\n<li>libblkid<\/li>\n<li>libgcc<\/li>\n<li>libstdc++<\/li>\n<li>ncurses-libs<\/li>\n<li>fuse-libs<\/li>\n<li>file-libs<\/li>\n<li>veeamsnap = 3.0.2.1185<\/li>\n<\/ul>\n<ul>\n<li>libblkid1<\/li>\n<li>libgcc_s1<\/li>\n<li>libstdc++6<\/li>\n<li>libmagic1<\/li>\n<li>libfuse2<\/li>\n<li>veeamsnap-kmp = 3.0.2.1185<\/li>\n<\/ul>\n<p>\nW wyniku tego lista zale\u017cno\u015bci okazuje si\u0119 unikalna dla dystrybucji. <\/p>\n<p>Gorzej, gdy pod star\u0105 nazw\u0105 pakietu zaczyna si\u0119 ukrywa\u0107 zaktualizowana wersja. <\/p>\n<p><b>Przyk\u0142ad:<\/b><\/p>\n<p>W Fedora 24 zaktualizowano pakiet <i>ncurses<\/i> z wersji 5 do wersji 6. Nasz produkt by\u0142 budowany w\u0142a\u015bnie z wersj\u0105 5, aby zapewni\u0107 zgodno\u015b\u0107 ze starszymi dystrybucjami. Aby skorzysta\u0107 ze starej wersji 5 biblioteki w Fedora 24, trzeba by\u0142o u\u017cy\u0107 pakietu <i>ncurses-compat-libs<\/i>. <\/p>\n<p>W wyniku tego dla Fedory pojawiaj\u0105 si\u0119 dwa pakiety, z r\u00f3\u017cnymi zale\u017cno\u015bciami. <\/p>\n<p>Potem jest ciekawiej. Po kolejnej aktualizacji dystrybucji pakiet <i>ncurses-compat-libs<\/i> z wersj\u0105 5 biblioteki okazuje si\u0119 niedost\u0119pny. Dla dystrybutora kosztowne jest \u015bci\u0105ganie starych bibliotek do nowej wersji dystrybucji. Po pewnym czasie problem powt\u00f3rzy\u0142 si\u0119 r\u00f3wnie\u017c w dystrybucjach SUSE.<\/p>\n<p>W wyniku tego dla niekt\u00f3rych dystrybucji trzeba by\u0142o zrezygnowa\u0107 z wyra\u017anej zale\u017cno\u015bci od <i>ncurses-libs<\/i>, a produkt poprawi\u0107 tak, aby m\u00f3g\u0142 wsp\u00f3\u0142pracowa\u0107 z dowoln\u0105 wersj\u0105 biblioteki.<\/p>\n<p>Nota bene, w 8. wersji Red Hat nie ma ju\u017c metapakietu <i>python<\/i>, kt\u00f3ry odnosi\u0142 si\u0119 do starego dobrego <i>python 2.7<\/i>. Jest <i>python2<\/i> i <i>python<\/i>3. <\/p>\n<h2>Alternatywa dla mened\u017cer\u00f3w pakiet\u00f3w<\/h2>\n<p>\nProblem z zale\u017cno\u015bciami jest stary i od dawna oczywisty. Wspomnijmy chocia\u017cby o Dependency hell. <br \/>\nPo\u0142\u0105czy\u0107 r\u00f3\u017cnorodne biblioteki i aplikacje tak, aby wszystkie stabilnie dzia\u0142a\u0142y i nie kolidowa\u0142y \u2014 to w\u0142a\u015bnie to zadanie pr\u00f3buje rozwi\u0105za\u0107 ka\u017cdy dystrybutor Linux.<\/p>\n<p>Zupe\u0142nie inaczej pr\u00f3buje rozwi\u0105za\u0107 ten problem mened\u017cer pakiet\u00f3w <b>Snappy<\/b> od Canonical. G\u0142\u00f3wna idea: aplikacja dzia\u0142a w izolowanej i chronionej od g\u0142\u00f3wnego systemu piaskownicy. Je\u015bli aplikacja potrzebuje bibliotek, s\u0105 one dostarczane razem z sam\u0105 aplikacj\u0105.<\/p>\n<p><b>Flatpak<\/b> umo\u017cliwia r\u00f3wnie\u017c uruchamianie aplikacji w piaskownicy, korzystaj\u0105c z Linux Containers. Pomys\u0142 piaskownicy wykorzystuje r\u00f3wnie\u017c <b>AppImage<\/b>.<\/p>\n<p>Te rozwi\u0105zania pozwalaj\u0105 na tworzenie jednego pakietu dla wszystkich dystrybucji. W przypadku <b>Flatpak<\/b> instalacja i uruchomienie aplikacji s\u0105 mo\u017cliwe nawet bez wiedzy administratora.<\/p>\n<p>G\u0142\u00f3wny problem polega na tym, \u017ce nie wszystkie aplikacje mog\u0105 dzia\u0142a\u0107 w piaskownicy. Niekt\u00f3re potrzebuj\u0105 bezpo\u015bredniego dost\u0119pu do platformy. Nie m\u00f3wi\u0105c ju\u017c o modu\u0142ach j\u0105dra, kt\u00f3re s\u0105 \u015bci\u015ble zale\u017cne od j\u0105dra i w \u017caden spos\u00f3b nie pasuj\u0105 do koncepcji piaskownicy. <\/p>\n<p>Drugi problem \u2013 popularne w \u015brodowisku enterprise dystrybucje od Red Hat i SUSE jeszcze nie zawieraj\u0105 wsparcia dla Snappy i Flatpak. <\/p>\n<p>W zwi\u0105zku z tym Veeam Agent for Linux nie jest dost\u0119pny ani na <noindex><a rel=\"nofollow\" href=\"https:\/\/snapcraft.io\/\">snapcraft.io<\/a><\/noindex> ani na <noindex><a rel=\"nofollow\" href=\"https:\/\/flathub.org\/home\">flathub.org<\/a><\/noindex>.<\/p>\n<p>Na zako\u0144czenie pytania o mened\u017cery pakiet\u00f3w zauwa\u017cam, \u017ce istnieje mo\u017cliwo\u015b\u0107 ca\u0142kowitego ich zaniechania, \u0142\u0105cz\u0105c w jeden pakiet pliki binarne i skrypt do ich instalacji. <\/p>\n<p>Taki bundle pozwala stworzy\u0107 jeden wsp\u00f3lny pakiet dla r\u00f3\u017cnych dystrybucji i platform, przeprowadzaj\u0105c interaktywny proces instalacji z niezb\u0119dn\u0105 personalizacj\u0105. Spotka\u0142em si\u0119 z takimi pakietami dla systemu Linux tylko od VMware.<\/p>\n<h2>Problem z aktualizacjami<\/h2>\n<p>\n<img decoding=\"async\" alt=\"Linux ma wiele twarzy: jak pracowa\u0107 na dowolnej dystrybucji\" src=\"\/wp-content\/uploads\/2019\/10\/aa14b10a434c28541574421d97807de7.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nNawet je\u015bli wszystkie problemy z zale\u017cno\u015bciami zosta\u0142y rozwi\u0105zane, program mo\u017ce dzia\u0142a\u0107 r\u00f3\u017cnie na tej samej dystrybucji. Chodzi o aktualizacje.<\/p>\n<p>Istniej\u0105 3 strategie aktualizacji:<\/p>\n<ul>\n<li>Najprostsza \u2013 nigdy nie aktualizowa\u0107. Skonfigurowa\u0142em serwer i zapomnia\u0142em. Po co aktualizacje, skoro wszystko dzia\u0142a? Problemy zaczynaj\u0105 si\u0119 przy pierwszym kontakcie z pomoc\u0105 techniczn\u0105. Tw\u00f3rca dystrybucji wspiera tylko zaktualizowan\u0105 wersj\u0119. <\/li>\n<li>Mo\u017cna zaufa\u0107 dystrybutorowi i skonfigurowa\u0107 automatyczne aktualizacje. W takim przypadku kontakt z pomoc\u0105 techniczn\u0105 jest prawdopodobny zaraz po nieudanej aktualizacji.<\/li>\n<li>Opcja r\u0119cznej aktualizacji dopiero po przetestowaniu na infrastrukturze testowej \u2013 jest najpewniejsza, ale kosztowna i pracoch\u0142onna. Niewiele os\u00f3b mo\u017ce sobie na ni\u0105 pozwoli\u0107.<\/li>\n<\/ul>\n<p>\nPoniewa\u017c r\u00f3\u017cni u\u017cytkownicy stosuj\u0105 r\u00f3\u017cne strategie aktualizacji, konieczne jest wsparcie zar\u00f3wno najnowszej wersji, jak i wszystkich wcze\u015bniejszych wyda\u0144. To komplikuje zar\u00f3wno proces rozwoju, jak i testowania, zwi\u0119kszaj\u0105c b\u00f3l g\u0142owy zespo\u0142u wsparcia.<\/p>\n<h2>R\u00f3\u017cnorodno\u015b\u0107 platform sprz\u0119towych<\/h2>\n<p>\nR\u00f3\u017cne platformy sprz\u0119towe to problem w du\u017cej mierze specyficzny dla kodu native. Co najmniej trzeba zbiera\u0107 binarki dla ka\u017cdej wspieranej platformy.<\/p>\n<p>W projekcie Veeam Agent for Linux nie mo\u017cemy wci\u0105\u017c wspiera\u0107 niczego opartego na RISC.<\/p>\n<p>Nie b\u0119d\u0119 szczeg\u00f3\u0142owo zatrzymywa\u0142 si\u0119 na tym zagadnieniu. Wskaz\u0119 jedynie g\u0142\u00f3wne problemy: rodzaje zale\u017cne od platformy, takie jak <code>size_t<\/code>, wyr\u00f3wnanie struktur i kolejno\u015b\u0107 bajt\u00f3w.<\/p>\n<h2>Linkowanie statyczne i\/lub dynamiczne<\/h2>\n<p>\n<img decoding=\"async\" alt=\"Linux ma wiele twarzy: jak pracowa\u0107 na dowolnej dystrybucji\" src=\"\/wp-content\/uploads\/2019\/10\/dc473aad4ea0818940af7eafdbc641fd.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nA kwestia \u201eJak linkowa\u0107 z bibliotekami \u2014 dynamicznie czy statycznie?\u201d wymaga om\u00f3wienia.<\/p>\n<p>Zazwyczaj aplikacje w C\/C++ na Linuxie korzystaj\u0105 z dynamicznego linkowania. Dzia\u0142a to \u015bwietnie, je\u015bli aplikacja jest zbudowana specjalnie dla danej dystrybucji.<\/p>\n<p>Je\u015bli celem jest obj\u0119cie r\u00f3\u017cnorodnych dystrybucji jednym plikiem binarnym, nale\u017cy kierowa\u0107 si\u0119 najstarsz\u0105 wspieran\u0105 dystrybucj\u0105. Dla nas jest to Red Hat 6. Zawiera on gcc 4.4, kt\u00f3ry nawet standard C++11 wspiera nie <noindex><a rel=\"nofollow\" href=\"https:\/\/gcc.gnu.org\/projects\/cxx-status.html\">w pe\u0142ni<\/a><\/noindex>.<\/p>\n<p>Budujemy nasz projekt przy u\u017cyciu gcc 6.3, kt\u00f3ry w pe\u0142ni wspiera C++14. Oczywi\u015bcie, w takim przypadku na Red Hat 6 bibliotek\u0119 libstdc++ i boost trzeba mie\u0107 ze sob\u0105. Najpro\u015bciej jest linkowa\u0107 z nimi statycznie.<\/p>\n<p>Niestety, nie ze wszystkimi bibliotekami mo\u017cna linkowa\u0107 statycznie.<\/p>\n<p>Po pierwsze, biblioteki systemowe, takie jak <i>libfuse<\/i>, <i>libblkid<\/i> nale\u017cy linkowa\u0107 dynamicznie, aby mie\u0107 pewno\u015b\u0107, \u017ce s\u0105 zgodne z j\u0105drami i jego modu\u0142ami. <\/p>\n<p>Po drugie, jest kwestia licencji. <\/p>\n<p>Licencja GPL w zasadzie zezwala na linkowanie bibliotek tylko z kodem opensource. MIT i BSD zezwalaj\u0105 na linkowanie statyczne i pozwalaj\u0105 na do\u0142\u0105czanie bibliotek do projektu. Z kolei LGPL zdaje si\u0119, \u017ce nie sprzeciwia si\u0119 linkowaniu statycznemu, ale wymaga udost\u0119pnienia plik\u00f3w potrzebnych do linkowania. <\/p>\n<p>W og\u00f3lnym przypadku u\u017cycie linkowania dynamicznego ochroni przed konieczno\u015bci\u0105 udost\u0119pniania czegokolwiek.<\/p>\n<h2>Kompilacja aplikacji C\/C++<\/h2>\n<p>\nAby skompilowa\u0107 aplikacje C\/C++ dla r\u00f3\u017cnych platform i dystrybucji, wystarczy dobra\u0107 lub skompilowa\u0107 gcc odpowiedniej wersji i skorzysta\u0107 z krzy\u017cowych kompilator\u00f3w dla specyficznych architektur, skompilowa\u0107 ca\u0142y zestaw bibliotek. Praca ta jest ca\u0142kowicie wykonalna, ale do\u015b\u0107 uci\u0105\u017cliwa. I nie ma pewno\u015bci, \u017ce wybrany kompilator i biblioteki zapewni\u0105 dzia\u0142aj\u0105c\u0105 wersj\u0119. <\/p>\n<p>Oczywist\u0105 zalet\u0105 jest znaczne uproszczenie infrastruktury, poniewa\u017c ca\u0142y proces kompilacji mo\u017cna wykona\u0107 na jednej maszynie. Ponadto wystarczy skompilowa\u0107 jeden zestaw plik\u00f3w binarnych dla jednej architektury, a nast\u0119pnie mo\u017cna je spakowa\u0107 w paczki dla r\u00f3\u017cnych dystrybucji. W ten spos\u00f3b tworzone s\u0105 paczki veeam dla Veeam Agent for Linux.<\/p>\n<p>W przeciwie\u0144stwie do tej opcji, mo\u017cna po prostu przygotowa\u0107 farm\u0119 do budowania, czyli kilka maszyn do kompilacji. Ka\u017cda taka maszyna zapewni kompilacj\u0119 aplikacji oraz stworzenie pakietu dla konkretnego dystrybucji i okre\u015blonej architektury. W takim przypadku kompilacja odbywa si\u0119 za pomoc\u0105 narz\u0119dzi przygotowanych przez dystrybutora. To znaczy, etap przygotowania kompilatora i dob\u00f3r bibliotek odpada. Ponadto, proces budowy mo\u017ce by\u0107 \u0142atwo zr\u00f3wnoleglony. <\/p>\n<p>S\u0105 jednak te\u017c wady takiego podej\u015bcia: dla ka\u017cdej dystrybucji w ramach tej samej architektury trzeba b\u0119dzie zbiera\u0107 sw\u00f3j zestaw plik\u00f3w binarnych. Kolejn\u0105 wad\u0105 jest to, \u017ce takie wiele maszyn wymaga obs\u0142ugi, przydzielenia du\u017cej ilo\u015bci miejsca na dysku oraz pami\u0119ci operacyjnej. <\/p>\n<p>W ten spos\u00f3b zbierane s\u0105 pakiety KMOD modu\u0142u j\u0105dra veeamsnap pod dystrybucje Red Hat.<\/p>\n<h2>Open Build Service<\/h2>\n<p>\nKoledzy z SUSE pr\u00f3bowali wprowadzi\u0107 pewnego rodzaju z\u0142oty \u015brodek w postaci specjalnej us\u0142ugi do kompilacji aplikacji i budowy pakiet\u00f3w \u2014 <noindex><a rel=\"nofollow\" href=\"https:\/\/openbuildservice.org\/\">openbuildservice<\/a><\/noindex>.<\/p>\n<p>Jest to de facto hypervisor, kt\u00f3ry tworzy maszyn\u0119 wirtualn\u0105, instaluje w niej wszystkie niezb\u0119dne pakiety, przeprowadza kompilacj\u0119 aplikacji oraz tworzy pakiet w tym izolowanym \u015brodowisku, po czym taka maszyna wirtualna zostaje zwolniona.<\/p>\n<p><img decoding=\"async\" alt=\"Linux ma wiele twarzy: jak pracowa\u0107 na dowolnej dystrybucji\" src=\"\/wp-content\/uploads\/2019\/10\/93d2a70c589a7186ecef85a7863e59e8.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nZaimplementowany w OpenBuildService harmonogram samodzielnie okre\u015bli, ile maszyn wirtualnych mo\u017ce uruchomi\u0107 dla optymalnej pr\u0119dko\u015bci budowy pakiet\u00f3w. Wbudowany mechanizm podpisywania automatycznie podpisze pakiety i umie\u015bci je w wbudowanym repozytorium. Wbudowany system kontroli wersji zapisze histori\u0119 zmian i budowy. Wystarczy jedynie doda\u0107 do tego systemu swoje \u017ar\u00f3d\u0142a. Nie ma potrzeby uruchamiania w\u0142asnego serwera, mo\u017cna skorzysta\u0107 z otwartego.<\/p>\n<p>Jest jednak problem: taki kombajn trudno wkomponowa\u0107 w istniej\u0105c\u0105 infrastruktur\u0119. Na przyk\u0142ad, kontrola wersji nie jest potrzebna, mamy ju\u017c swoj\u0105 dla \u017ar\u00f3de\u0142. Nasz mechanizm podpisywania r\u00f3\u017cni si\u0119: wykorzystujemy specjalny serwer. Repozytorium r\u00f3wnie\u017c nie jest potrzebne. <\/p>\n<p>Ponadto wsparcie dla innych dystrybucji \u2014 na przyk\u0142ad Red Hat \u2014 jest do\u015b\u0107 ubogie, co w pe\u0142ni mo\u017cna zrozumie\u0107.<\/p>\n<p>Zalet\u0105 tej us\u0142ugi jest szybkie wsparcie dla kolejnej wersji dystrybucji SUSE. Do oficjalnego og\u0142oszenia o wydaniu, niezb\u0119dne pakiety do kompilacji s\u0105 publikowane w publicznym repozytorium. Na li\u015bcie dost\u0119pnych dystrybucji w OpenBuildService pojawia si\u0119 nowa. Zaznaczamy pole, a ona jest dodawana do planu kompilacji. W ten spos\u00f3b dodanie nowej wersji dystrybucji odbywa si\u0119 praktycznie za jednym klikni\u0119ciem.<\/p>\n<p>W naszej infrastrukturze z u\u017cyciem OpenBuildService przygotowywane s\u0105 wszystkie r\u00f3\u017cnorodne pakiety KMP modu\u0142u j\u0105dra veeamsnap dla dystrybucji SUSE.<\/p>\n<p>Nast\u0119pnie chcia\u0142bym skupi\u0107 si\u0119 na kwestiach specyficznych dla modu\u0142\u00f3w j\u0105dra.<\/p>\n<h2>kernel ABI<\/h2>\n<p>\nModu\u0142y j\u0105dra Linux historycznie by\u0142y udost\u0119pniane w postaci kodu \u017ar\u00f3d\u0142owego. Tw\u00f3rcy j\u0105dra nie obci\u0105\u017caj\u0105 si\u0119 dbaniem o wsparcie stabilnego API dla modu\u0142\u00f3w j\u0105dra, a tym bardziej na poziomie binarnym, p\u00f3\u017aniej kABI.<\/p>\n<p>Aby skompilowa\u0107 modu\u0142 dla waniliowego j\u0105dra, niezb\u0119dne s\u0105 nag\u0142\u00f3wki w\u0142a\u015bnie tego j\u0105dra, a dzia\u0142a\u0107 b\u0119dzie tylko na tym j\u0105drze. <\/p>\n<p>DKMS umo\u017cliwia automatyzacj\u0119 procesu kompilacji modu\u0142\u00f3w przy aktualizacji j\u0105dra. W wyniku tego u\u017cytkownicy repozytori\u00f3w Debiana (i jego licznych kuzyn\u00f3w) korzystaj\u0105 z modu\u0142\u00f3w j\u0105dra albo z repozytori\u00f3w dystrybutor\u00f3w, albo kompilowanych ze \u017ar\u00f3de\u0142 przy u\u017cyciu DKMS.<\/p>\n<p>Jednak taka sytuacja niezbyt zadowala segment Enterprise. Dystrybutorzy kodu zastrze\u017conego chc\u0105 rozprowadza\u0107 produkt w postaci gotowych binari\u00f3w. <\/p>\n<p>Administratorzy nie chc\u0105 trzyma\u0107 narz\u0119dzi deweloperskich na serwerach produkcyjnych ze wzgl\u0119d\u00f3w bezpiecze\u0144stwa. Dystrybutorzy Enterprise Linux, tacy jak Red Hat i SUSE, zdecydowali, \u017ce dla swoich u\u017cytkownik\u00f3w b\u0119d\u0105 mog\u0142y wspiera\u0107 stabilne kABI. W rezultacie pojawi\u0142y si\u0119 pakiety KMOD dla Red Hat oraz pakiety KMP dla SUSE.<\/p>\n<p>Istota tego rozwi\u0105zania jest do\u015b\u0107 prosta. Dla konkretnej wersji dystrybucji API j\u0105dra jest zamra\u017cane. Dystrybutor og\u0142asza, \u017ce wykorzystuje konkretne j\u0105dro, na przyk\u0142ad 3.10, i wprowadza tylko poprawki oraz usprawnienia, kt\u00f3re w \u017caden spos\u00f3b nie wp\u0142ywaj\u0105 na interfejsy j\u0105dra, a modu\u0142y skompilowane dla pierwszego j\u0105dra mog\u0105 by\u0107 wykorzystywane dla wszystkich nast\u0119pnych bez rekompilacji.<\/p>\n<p>Red Hat og\u0142asza, \u017ce kABI jest zgodne przez ca\u0142y okres \u017cycia dystrybucji. Oznacza to, \u017ce zbudowany modu\u0142 dla RHEL 6.0 (wydanie z listopada 2010 roku) powinien r\u00f3wnie\u017c dzia\u0142a\u0107 na wersji 6.10 (wydanie z czerwca 2018 roku). To niemal 8 lat. Oczywi\u015bcie, to do\u015b\u0107 skomplikowane zadanie. <br \/>\nOdnotowali\u015bmy kilka przypadk\u00f3w, kiedy z powodu problem\u00f3w ze zgodno\u015bci\u0105 kABI modu\u0142 veeamsnap przesta\u0142 dzia\u0142a\u0107. <\/p>\n<p>Po tym, jak modu\u0142 veeamsnap, zbudowany dla RHEL 7.0, okaza\u0142 si\u0119 niesp\u00f3jny z j\u0105drem z RHEL 7.5, a jednocze\u015bnie \u0142adowa\u0142 si\u0119 i gwarantowanie zawiesza\u0142 serwer, zrezygnowali\u015bmy z u\u017cywania zgodno\u015bci kABI dla RHEL 7 w og\u00f3le. <\/p>\n<p>Obecnie pakiet KMOD dla RHEL 7 zawiera zestaw dla ka\u017cdej wersji wydania oraz skrypt, kt\u00f3ry zapewnia \u0142adowanie modu\u0142u.<\/p>\n<p>SUSE podesz\u0142o do zadania zgodno\u015bci kABI bardziej ostro\u017cnie. Zapewniaj\u0105 zgodno\u015b\u0107 kABI tylko w ramach jednego service pack. <\/p>\n<p>Na przyk\u0142ad wydanie SLES 12 mia\u0142o miejsce we wrze\u015bniu 2014 roku. A SLES 12 SP1 ju\u017c w grudniu 2015 roku, co oznacza, \u017ce min\u0119\u0142o nieco ponad rok. Mimo \u017ce oba wydania wykorzystuj\u0105 j\u0105dro 3.12, s\u0105 one kABI niesp\u00f3jne. Oczywiste jest, \u017ce utrzymanie zgodno\u015bci kABI przez jedynie rok jest znacznie prostsze. Roczny cykl aktualizacji modu\u0142u j\u0105dra nie powinien sprawia\u0107 problem\u00f3w tw\u00f3rcom modu\u0142\u00f3w. <\/p>\n<p>W wyniku takiej polityki SUSE nie odnotowali\u015bmy \u017cadnych problem\u00f3w ze zgodno\u015bci\u0105 kABI w naszym module veeamsnap. Prawda jest taka, \u017ce liczba pakiet\u00f3w dla SUSE jest niemal dziesi\u0119ciokrotnie wi\u0119ksza.<\/p>\n<h2>\u0141atki i backporty<\/h2>\n<p>\nMimo \u017ce dystrybutorzy staraj\u0105 si\u0119 zapewni\u0107 zgodno\u015b\u0107 kABI oraz stabilno\u015b\u0107 j\u0105dra, tak\u017ce staraj\u0105 si\u0119 poprawi\u0107 wydajno\u015b\u0107 i usun\u0105\u0107 wady tego stabilnego j\u0105dra. <\/p>\n<p>Przy tym, opr\u00f3cz w\u0142asnej \u00abpracy nad b\u0142\u0119dami\u00bb, programi\u015bci j\u0105dra enterprise linux \u015bledz\u0105 zmiany w j\u0105drze waniliowym i przenosz\u0105 je do swojego \u00abstabilnego\u00bb.<\/p>\n<p>Czasami prowadzi to do nowych <noindex><a rel=\"nofollow\" href=\"https:\/\/access.redhat.com\/solutions\/3658111\">b\u0142\u0119d\u00f3w<\/a><\/noindex>.<\/p>\n<p>W ostatnim wydaniu Red Hat 6, w jednym z drobnych aktualizacji, wyst\u0105pi\u0142 b\u0142\u0105d. Prowadzi\u0142 on do tego, \u017ce modu\u0142 veeamsnap gwarantowanie zawiesza\u0142 system podczas zwalniania migawki. Por\u00f3wnuj\u0105c \u017ar\u00f3d\u0142a j\u0105dra przed i po aktualizacji, odkryli\u015bmy, \u017ce winowajc\u0105 by\u0142 backport. Podobny fix zosta\u0142 wprowadzony w waniliowym j\u0105drze wersji 4.19. Tylko \u017ce w waniliowym j\u0105drze ten fix dzia\u0142a\u0142 poprawnie, a przy przenoszeniu go do \u00abstabilnego\u00bb 2.6.32 wyst\u0105pi\u0142 problem ze spin-lockiem.<\/p>\n<p>Oczywi\u015bcie, b\u0142\u0119dy zdarzaj\u0105 si\u0119 wszystkim i zawsze, ale czy warto by\u0142o przenosi\u0107 kod z 4.19 do 2.6.32, ryzykuj\u0105c stabilno\u015b\u0107?.. Nie jestem pewny...<\/p>\n<p>Najgorsze jest to, gdy do przeci\u0105gania liny \u201estabilno\u015b\u0107\u201d\u201emodernizacja\u201d w\u0142\u0105cza si\u0119 marketing. Dzia\u0142 marketingu potrzebuje, aby j\u0105dro zaktualizowanego dystrybucji by\u0142o stabilne z jednej strony, a z drugiej, aby by\u0142o lepsze pod wzgl\u0119dem wydajno\u015bci i mia\u0142o nowe funkcje. To prowadzi do dziwnych kompromis\u00f3w. <\/p>\n<p>Kiedy spr\u00f3bowa\u0142em skompilowa\u0107 modu\u0142 na j\u0105drze 4.4 z SLES 12 SP3, z zdziwieniem odkry\u0142em, \u017ce ma funkcjonalno\u015b\u0107 z waniliowego 4.8. Moim zdaniem, implementacja blokowego wej\u015bcia\/wyj\u015bcia j\u0105dra 4.4 z SLES 12 SP3 bardziej przypomina j\u0105dro 4.8 ni\u017c poprzedni\u0105 wersj\u0119 stabilnego 4.4 j\u0105dra z SLES 12 SP2. Nie podejmuj\u0119 si\u0119 oceny, jaki procent kodu zosta\u0142 przeniesiony z j\u0105dra 4.8 do SLES-owego 4.4 dla SP3, jednak nie potrafi\u0119 uzna\u0107 j\u0105dra za wci\u0105\u017c stabilne 4.4. <\/p>\n<p>Najbardziej nieprzyjemne jest to, \u017ce przy pisaniu modu\u0142u, kt\u00f3ry mia\u0142by dzia\u0142a\u0107 r\u00f3wnie dobrze na r\u00f3\u017cnych j\u0105drach, nie mo\u017cna ju\u017c opiera\u0107 si\u0119 na wersji j\u0105dra. Trzeba te\u017c bra\u0107 pod uwag\u0119 dystrybucj\u0119. Dobrze, \u017ce czasem mo\u017cna si\u0119 oprze\u0107 na definicji, kt\u00f3ra pojawia si\u0119 wraz z now\u0105 funkcjonalno\u015bci\u0105, jednak taka mo\u017cliwo\u015b\u0107 nie zawsze jest dost\u0119pna. <\/p>\n<p>W rezultacie kod obrosn\u0105\u0142 dziwacznymi dyrektywami kompilacji warunkowej.<\/p>\n<p>Pojawiaj\u0105 si\u0119 te\u017c \u0142atki, kt\u00f3re zmieniaj\u0105 udokumentowane API j\u0105dra. <br \/>\nNatkn\u0105\u0142em si\u0119 na dystrybucj\u0119 <noindex><a rel=\"nofollow\" href=\"https:\/\/neon.kde.org\/\">KDE neon<\/a><\/noindex> 5.16 i by\u0142em bardzo zaskoczony, widz\u0105c, \u017ce wywo\u0142anie lookup_bdev w tej wersji j\u0105dra zmieni\u0142o list\u0119 parametr\u00f3w wej\u015bciowych.<\/p>\n<p>Aby skompilowa\u0107, musia\u0142em doda\u0107 skrypt do makefile, kt\u00f3ry sprawdza, czy parametr mask jest obecny w funkcji lookup_bdev.<\/p>\n<h2>Podpisy modu\u0142\u00f3w j\u0105dra<\/h2>\n<p>\nAle wr\u00f3\u0107my do pytania o dystrybucj\u0119 pakiet\u00f3w.<\/p>\n<p>Jedn\u0105 z zalet stabilnego kABI jest to, \u017ce modu\u0142y j\u0105dra w postaci pliku binarnego mo\u017cna podpisa\u0107. W takim przypadku deweloper mo\u017ce by\u0107 pewny, \u017ce modu\u0142 nie zosta\u0142 przypadkowo uszkodzony ani celowo zmieniony. Mo\u017cna to sprawdzi\u0107 poleceniem modinfo. <\/p>\n<p>Dystrybucje Red Hat i SUSE umo\u017cliwiaj\u0105 sprawdzenie podpisu modu\u0142u i za\u0142adowanie go tylko wtedy, gdy w systemie zarejestrowany jest odpowiedni certyfikat. Certyfikat jest publicznym kluczem, kt\u00f3rym podpisywany jest modu\u0142. Rozprowadzamy go w postaci oddzielnego pakietu.<\/p>\n<p>Problem polega na tym, \u017ce certyfikaty mog\u0105 by\u0107 albo wbudowane w j\u0105dro (ich u\u017cywaj\u0105 dystrybutorzy), albo musz\u0105 by\u0107 zapisane w nieulotnej pami\u0119ci EFI za pomoc\u0105 narz\u0119dzia <i>mokutil<\/i>. Narz\u0119dzie <i>mokutil<\/i> podczas instalacji certyfikatu wymaga ponownego uruchomienia systemu i jeszcze przed za\u0142adowaniem j\u0105dra systemu operacyjnego oferuje administratorowi zgod\u0119 na za\u0142adowanie nowego certyfikatu. <\/p>\n<p>Tak wi\u0119c dodanie certyfikatu wymaga fizycznego dost\u0119pu administratora do systemu. Je\u015bli maszyna znajduje si\u0119 w chmurze lub po prostu w zdalnym serwerze i dost\u0119p jest tylko przez sie\u0107 (na przyk\u0142ad przez ssh), dodanie certyfikatu b\u0119dzie niemo\u017cliwe. <\/p>\n<h2>EFI na maszynach wirtualnych<\/h2>\n<p>\nMimo \u017ce EFI jest ju\u017c d\u0142ugo wspierane przez prawie wszystkich producent\u00f3w p\u0142yt g\u0142\u00f3wnych, administrator mo\u017ce nie pomy\u015ble\u0107 o potrzebie EFI podczas instalacji systemu, i mo\u017ce by\u0107 ono wy\u0142\u0105czone. <\/p>\n<p>Nie wszyscy hypervisorzy wspieraj\u0105 EFI. VMWare vSphere wspiera EFI od wersji 5. <br \/>\nMicrosoft Hyper-V r\u00f3wnie\u017c zyska\u0142 wsparcie dla EFI, od Hyper-V dla Windows Server 2012R2. <\/p>\n<p>Jednak w domy\u015blnej konfiguracji ta funkcjonalno\u015b\u0107 dla maszyn Linux jest wy\u0142\u0105czona, co oznacza, \u017ce certyfikatu nie mo\u017cna zainstalowa\u0107. <\/p>\n<p>W vSphere 6.5 opcj\u0119 <b>Secure Boot<\/b> mo\u017cna ustawi\u0107 tylko w starej wersji interfejsu sieciowego, kt\u00f3ry dzia\u0142a przez Flash. Interfejs lokalny w HTML-5 jest wci\u0105\u017c znacznie op\u00f3\u017aniony.<\/p>\n<h2>Eksperymentalne dystrybucje<\/h2>\n<p>\nNa zako\u0144czenie rozwa\u017cmy kwesti\u0119 eksperymentalnych dystrybucji oraz dystrybucji bez oficjalnego wsparcia. Z jednej strony, takich dystrybucji raczej nie spotkasz na serwerach powa\u017cnych organizacji. Takie dystrybucje nie maj\u0105 oficjalnego wsparcia. Dlatego te\u017c zapewnianie wsparcia technicznego produktu na takiej dystrybucji nie jest mo\u017cliwe. <\/p>\n<p>Jednak\u017ce takie dystrybucje staj\u0105 si\u0119 wygodn\u0105 platform\u0105 do wypr\u00f3bowania nowych rozwi\u0105za\u0144 eksperymentalnych. Na przyk\u0142ad Fedora, OpenSUSE Tumbleweed czy niestabilne wersje Debiana. S\u0105 one do\u015b\u0107 stabilne. Zawieraj\u0105 zawsze nowe wersje oprogramowania i zawsze nowe j\u0105dro. Za rok ta eksperymentalna funkcjonalno\u015b\u0107 mo\u017ce znale\u017a\u0107 si\u0119 w zaktualizowanym RHEL, SLES lub Ubuntu. <\/p>\n<p>Tak wi\u0119c, je\u015bli co\u015b nie dzia\u0142a na eksperymentalnej dystrybucji \u2014 to jest to pow\u00f3d, aby zbada\u0107 problem i go rozwi\u0105za\u0107. Nale\u017cy by\u0107 gotowym na to, \u017ce ta funkcjonalno\u015b\u0107 wkr\u00f3tce pojawi si\u0119 na serwerach produkcyjnych u\u017cytkownik\u00f3w.<\/p>\n<p>Obecna lista oficjalnie wspieranych dystrybucji dla wersji 3.0 jest dost\u0119pna do przestudiowania. <noindex><a rel=\"nofollow\" href=\"https:\/\/helpcenter.veeam.com\/docs\/agentforlinux\/userguide\/system_requirements.html?ver=30\">tutaj<\/a><\/noindex>Jednak rzeczywista lista dystrybucji, na kt\u00f3rych nasz produkt mo\u017ce dzia\u0142a\u0107, jest znacznie szersza.<\/p>\n<p>Osobi\u015bcie interesowa\u0142 mnie eksperyment z systemem operacyjnym 'Elbrus'. Po dostosowaniu pakietu veeam nasz produkt zainstalowa\u0142 si\u0119 i dzia\u0142a\u0142. O tym eksperymencie pisa\u0142em na Habra w <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/veeam\/blog\/447960\/\">artyku\u0142<\/a><\/noindex>. <\/p>\n<p>Wsparcie dla nowych dystrybucji trwa. Oczekujemy na premier\u0119 wersji 4.0. Wkr\u00f3tce powinna pojawi\u0107 si\u0119 wersja beta, wi\u0119c \u015bled\u017acie <noindex><a rel=\"nofollow\" href=\"https:\/\/www.veeam.com\/whats-new-linux-agent.html\">whats-new<\/a><\/noindex>!<br \/>\n<br \/>\u0179r\u00f3d\u0142o: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/veeam\/blog\/471226\/\">habr.com<\/a><\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u0421\u043e\u0437\u0434\u0430\u0442\u044c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0434\u043b\u044f \u0440\u0435\u0437\u0435\u0440\u0432\u043d\u043e\u0433\u043e \u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f, \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0449\u0435\u0435 \u043d\u0430 \u043b\u044e\u0431\u043e\u043c \u0434\u0438\u0441\u0442\u0440\u0438\u0431\u0443\u0442\u0438\u0432\u0435 \u2014 \u0437\u0430\u0434\u0430\u0447\u043a\u0430 \u043d\u0435\u043f\u0440\u043e\u0441\u0442\u0430\u044f. \u0427\u0442\u043e\u0431\u044b \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0442\u044c \u0440\u0430\u0431\u043e\u0442\u0443 Veeam Agent for Linux \u043d\u0430 \u0434\u0438\u0441\u0442\u0440\u0438\u0431\u0443\u0442\u0438\u0432\u0430\u0445 \u043e\u0442 Red Hat 6 \u0438 Debian 6, \u0434\u043e OpenSUSE 15.1 \u0438 Ubuntu 19.04 \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0440\u0435\u0448\u0430\u0442\u044c \u0441\u043f\u0435\u043a\u0442\u0440 \u043f\u0440\u043e\u0431\u043b\u0435\u043c, \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e \u0435\u0441\u043b\u0438 \u0443\u0447\u0435\u0441\u0442\u044c, \u0447\u0442\u043e \u0432 \u0441\u043e\u0441\u0442\u0430\u0432 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u043d\u043e\u0433\u043e \u043f\u0440\u043e\u0434\u0443\u043a\u0442\u0430 \u0432\u0445\u043e\u0434\u0438\u0442 \u043c\u043e\u0434\u0443\u043b\u044c \u044f\u0434\u0440\u0430. \u0421\u0442\u0430\u0442\u044c\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0430 \u043f\u043e \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u0430\u043c \u0432\u044b\u0441\u0442\u0443\u043f\u043b\u0435\u043d\u0438\u044f \u043d\u0430 [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":29206,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-38929","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-administrirovanie"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.1.1 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u0421\u043e\u0437\u0434\u0430\u0442\u044c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0434\u043b\u044f \u0440\u0435\u0437\u0435\u0440\u0432\u043d\u043e\u0433\u043e.\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/pl\/blog\/administrirovanie\/linux-mnogolikij-kak-rabotat-na-lyubom-distributive\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.1.1\" \/>\n\t\t<meta property=\"og:locale\" content=\"pl_PL\" \/>\n\t\t<meta property=\"og:site_name\" content=\"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"\ud83e\udd47Linux \u043c\u043d\u043e\u0433\u043e\u043b\u0438\u043a\u0438\u0439: \u043a\u0430\u043a \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u043d\u0430 \u043b\u044e\u0431\u043e\u043c \u0434\u0438\u0441\u0442\u0440\u0438\u0431\u0443\u0442\u0438\u0432\u0435 | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u0421\u043e\u0437\u0434\u0430\u0442\u044c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0434\u043b\u044f \u0440\u0435\u0437\u0435\u0440\u0432\u043d\u043e\u0433\u043e.\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/pl\/blog\/administrirovanie\/linux-mnogolikij-kak-rabotat-na-lyubom-distributive\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:width\" content=\"350\" \/>\n\t\t<meta property=\"og:image:height\" content=\"350\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2019-10-31T19:26:48+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2019-10-31T19:26:48+00:00\" \/>\n\t\t<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"\ud83e\udd47Linux jest r\u00f3\u017cnorodny: jak pracowa\u0107 na dowolnej dystrybucji | ProHoster","description":"Utw\u00f3rz aplikacj\u0119 do tworzenia kopii zapasowych.","canonical_url":"https:\/\/prohoster.info\/pl\/blog\/administrirovanie\/linux-mnogolikij-kak-rabotat-na-lyubom-distributive","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"pl_PL","og:site_name":"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b","og:type":"article","og:title":"\ud83e\udd47Linux \u043c\u043d\u043e\u0433\u043e\u043b\u0438\u043a\u0438\u0439: \u043a\u0430\u043a \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u043d\u0430 \u043b\u044e\u0431\u043e\u043c \u0434\u0438\u0441\u0442\u0440\u0438\u0431\u0443\u0442\u0438\u0432\u0435 | ProHoster","og:description":"\u0421\u043e\u0437\u0434\u0430\u0442\u044c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0434\u043b\u044f \u0440\u0435\u0437\u0435\u0440\u0432\u043d\u043e\u0433\u043e.","og:url":"https:\/\/prohoster.info\/pl\/blog\/administrirovanie\/linux-mnogolikij-kak-rabotat-na-lyubom-distributive","og:image":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:secure_url":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:width":350,"og:image:height":350,"article:published_time":"2019-10-31T19:26:48+00:00","article:modified_time":"2019-10-31T19:26:48+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"38929","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"seo_analyzer_scan_date":"2026-01-23 23:59:19","breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-03-01 01:00:26","updated":"2026-01-23 23:59:19","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/posts\/38929","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/comments?post=38929"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/posts\/38929\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/media\/29206"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/media?parent=38929"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/categories?post=38929"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/tags?post=38929"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}