{"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\/pt\/blog\/administrirovanie\/linux-mnogolikij-kak-rabotat-na-lyubom-distributive","title":{"rendered":"Linux \u00e9 multifacetado: como trabalhar em qualquer distribui\u00e7\u00e3o","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Linux \u00e9 multifacetado: como trabalhar em qualquer distribui\u00e7\u00e3o\" src=\"\/wp-content\/uploads\/2019\/10\/ee1aaad566204532c974a3ce8f13b915.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nCriar um aplicativo de backup que funcione em qualquer distribui\u00e7\u00e3o \u00e9 uma tarefa desafiadora. Para garantir o funcionamento do Veeam Agent for Linux em distribui\u00e7\u00f5es do Red Hat 6 ao Debian 6, passando pelo OpenSUSE 15.1 e Ubuntu 19.04, \u00e9 preciso resolver uma variedade de problemas, especialmente considerando que o produto inclui um m\u00f3dulo do n\u00facleo.<\/p>\n<p>Este artigo foi criado com base na apresenta\u00e7\u00e3o conferida na <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 n\u00e3o \u00e9 apenas um dos sistemas operacionais mais populares. Na verdade, \u00e9 uma plataforma na qual \u00e9 poss\u00edvel criar algo \u00fanico, algo pessoal. Por causa disso, existem muitas distribui\u00e7\u00f5es Linux, que diferem em conjunto de componentes de software. E aqui surge o problema: para que o produto funcione em qualquer distribui\u00e7\u00e3o, \u00e9 necess\u00e1rio levar em conta as particularidades de cada uma.<\/p>\n<h2>Gerenciadores de pacotes: .deb vs .rpm<\/h2>\n<p>\nCome\u00e7aremos pelo problema evidente de distribuir o produto para diferentes distribui\u00e7\u00f5es.<br \/>\nA maneira mais t\u00edpica de distribuir produtos de software \u00e9 disponibilizar um pacote em um reposit\u00f3rio, para que o gerenciador de pacotes integrado ao sistema possa instal\u00e1-lo a partir da\u00ed.<br \/>\nNo entanto, temos dois formatos de pacotes populares: <i>rpm<\/i> e <i>deb<\/i>. Portanto, ser\u00e1 necess\u00e1rio dar suporte a cada um deles.<\/p>\n<p>No mundo dos pacotes deb, o n\u00edvel de compatibilidade \u00e9 impressionante. O mesmo pacote \u00e9 instalado e funciona igualmente bem tanto no Debian 6 quanto no Ubuntu 19.04. Os padr\u00f5es do processo de constru\u00e7\u00e3o de pacotes e seu uso, estabelecidos nas antigas distribui\u00e7\u00f5es Debian, permanecem relevantes nas modernas Linux Mint e elementary OS. Portanto, no caso do Veeam Agent for Linux, basta um \u00fanico pacote deb para cada plataforma de hardware.<\/p>\n<p>Por outro lado, no mundo dos pacotes rpm, as diferen\u00e7as s\u00e3o grandes. Em primeiro lugar, porque existem dois distribuidores completamente independentes, Red Hat e SUSE, para os quais a compatibilidade n\u00e3o \u00e9 necess\u00e1ria. Em segundo lugar, esses distribuidores t\u00eam distribui\u00e7\u00f5es com suporte t\u00e9cnico e experimentais. Entre elas, a compatibilidade tamb\u00e9m n\u00e3o \u00e9 necess\u00e1ria. Assim, temos pacotes espec\u00edficos para el6, el7 e el8. Um pacote separado para Fedora. Pacotes para SLES11 e 12 e outro separado para openSUSE. O principal problema est\u00e1 nas depend\u00eancias e nomes dos pacotes. <\/p>\n<h2>Problema de depend\u00eancias<\/h2>\n<p>\nInfelizmente, os mesmos pacotes frequentemente t\u00eam nomes diferentes em diferentes distribui\u00e7\u00f5es. Abaixo, uma lista incompleta de depend\u00eancias do pacote veeam.<\/p>\n<p>Para EL7:<br \/>\nPara 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>\nComo resultado, a lista de depend\u00eancias se torna \u00fanica para a distribui\u00e7\u00e3o. <\/p>\n<p>Pior \u00e9 quando uma vers\u00e3o atualizada come\u00e7a a se esconder sob o antigo nome do pacote. <\/p>\n<p><b>Exemplo:<\/b><\/p>\n<p>No Fedora 24, o pacote foi atualizado <i>ncurses<\/i> da vers\u00e3o 5 para a vers\u00e3o 6. Nosso produto foi constru\u00eddo especificamente com a vers\u00e3o 5, para garantir compatibilidade com distribui\u00e7\u00f5es antigas. Para utilizar a antiga vers\u00e3o 5 da biblioteca no Fedora 24, foi necess\u00e1rio usar o pacote <i>ncurses-compat-libs<\/i>. <\/p>\n<p>Como resultado, o Fedora passa a ter dois pacotes, com depend\u00eancias diferentes. <\/p>\n<p>A seguir, as coisas ficam mais interessantes. Ap\u00f3s outra atualiza\u00e7\u00e3o da distribui\u00e7\u00e3o, o pacote <i>ncurses-compat-libs<\/i> com a vers\u00e3o 5 da biblioteca se torna indispon\u00edvel. Para o distribuidor, \u00e9 custoso carregar bibliotecas antigas para a nova vers\u00e3o da distribui\u00e7\u00e3o. Depois de algum tempo, o problema ocorreu novamente em distribui\u00e7\u00f5es SUSE.<\/p>\n<p>Como resultado, para algumas distribui\u00e7\u00f5es foi necess\u00e1rio abrir m\u00e3o da depend\u00eancia expl\u00edcita de <i>ncurses-libs<\/i>, e corrigir o produto para que ele pudesse funcionar com qualquer vers\u00e3o da biblioteca.<\/p>\n<p>Ali\u00e1s, na vers\u00e3o 8 do Red Hat, n\u00e3o h\u00e1 mais o meta-pacote <i>python<\/i>, que referenciava o bom e velho <i>python 2.7<\/i>. H\u00e1 <i>python2<\/i> e <i>python<\/i>3. <\/p>\n<h2>A alternativa aos gerenciadores de pacotes<\/h2>\n<p>\nO problema com depend\u00eancias \u00e9 antigo e j\u00e1 \u00e9 bem conhecido. Basta recordar o que chamam de \"Dependency hell\". <br \/>\nCombinar diversas bibliotecas e aplica\u00e7\u00f5es de modo que todas funcionem de forma est\u00e1vel e sem conflitos \u2014 essa \u00e9, na verdade, a tarefa que qualquer distribuidor de Linux tenta resolver.<\/p>\n<p>Totalmente diferente tenta resolver esse problema o gerenciador de pacotes <b>Snappy<\/b> da Canonical. A ideia principal: o aplicativo executa em uma sandbox isolada e protegida do sistema principal. Se o aplicativo precisa de bibliotecas, elas s\u00e3o fornecidas junto com o pr\u00f3prio aplicativo.<\/p>\n<p><b>Flatpak<\/b> tamb\u00e9m permite executar aplicativos em uma sandbox, utilizando Linux Containers. A ideia da sandbox \u00e9 aproveitada tamb\u00e9m por <b>AppImage<\/b>.<\/p>\n<p>Essas solu\u00e7\u00f5es permitem criar um \u00fanico pacote para quaisquer distribui\u00e7\u00f5es. No caso do <b>Flatpak<\/b> a instala\u00e7\u00e3o e execu\u00e7\u00e3o do aplicativo \u00e9 poss\u00edvel mesmo sem o conhecimento do administrador.<\/p>\n<p>O principal problema \u00e9 que nem todos os aplicativos podem funcionar na sandbox. Alguns precisam de acesso direto \u00e0 plataforma. N\u00e3o estou nem mencionando os m\u00f3dulos do n\u00facleo, que dependem fortemente do n\u00facleo e n\u00e3o se encaixam de forma alguma na concep\u00e7\u00e3o da sandbox. <\/p>\n<p>O segundo problema \u00e9 que as distribui\u00e7\u00f5es populares no ambiente corporativo da Red Hat e SUSE ainda n\u00e3o suportam Snappy e Flatpak. <\/p>\n<p>Em rela\u00e7\u00e3o a isso, o Veeam Agent for Linux n\u00e3o est\u00e1 dispon\u00edvel nem em <noindex><a rel=\"nofollow\" href=\"https:\/\/snapcraft.io\/\">snapcraft.io<\/a><\/noindex> nem em <noindex><a rel=\"nofollow\" href=\"https:\/\/flathub.org\/home\">flathub.org<\/a><\/noindex>.<\/p>\n<p>Para concluir a quest\u00e3o sobre gerenciadores de pacotes, vale a pena mencionar que existe a op\u00e7\u00e3o de abrir m\u00e3o completamente dos gerenciadores de pacotes, juntando os arquivos bin\u00e1rios e um script para sua instala\u00e7\u00e3o em um \u00fanico pacote. <\/p>\n<p>Esse bundle permite criar um \u00fanico pacote para diferentes distribui\u00e7\u00f5es e plataformas, realizando um processo de instala\u00e7\u00e3o interativo e permitindo a personaliza\u00e7\u00e3o necess\u00e1ria. Eu s\u00f3 encontrei pacotes desse tipo para Linux da VMware.<\/p>\n<h2>O problema das atualiza\u00e7\u00f5es<\/h2>\n<p>\n<img decoding=\"async\" alt=\"Linux \u00e9 multifacetado: como trabalhar em qualquer distribui\u00e7\u00e3o\" src=\"\/wp-content\/uploads\/2019\/10\/aa14b10a434c28541574421d97807de7.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nMesmo que todos os problemas de depend\u00eancias estejam resolvidos, o programa pode funcionar de maneira diferente na mesma distribui\u00e7\u00e3o. O problema est\u00e1 nas atualiza\u00e7\u00f5es.<\/p>\n<p>Existem 3 estrat\u00e9gias de atualiza\u00e7\u00e3o:<\/p>\n<ul>\n<li>A mais simples \u00e9 n\u00e3o atualizar nunca. Configurou o servidor e esqueceu. Para que atualiza\u00e7\u00f5es, se tudo funciona? Os problemas come\u00e7am assim que se faz o primeiro contato com o suporte t\u00e9cnico. O criador da distribui\u00e7\u00e3o s\u00f3 oferece suporte \u00e0 vers\u00e3o atualizada. <\/li>\n<li>\u00c9 poss\u00edvel confiar no distribuidor e configurar atualiza\u00e7\u00f5es autom\u00e1ticas. Nesse caso, uma liga\u00e7\u00e3o para o suporte t\u00e9cnico \u00e9 prov\u00e1vel logo ap\u00f3s uma atualiza\u00e7\u00e3o malsucedida.<\/li>\n<li>A op\u00e7\u00e3o de atualiza\u00e7\u00e3o manual s\u00f3 ap\u00f3s test\u00e1-la em uma infraestrutura de teste \u00e9 a mais segura, mas cara e trabalhosa. Nem todos conseguem arcar com isso.<\/li>\n<\/ul>\n<p>\nComo diferentes usu\u00e1rios aplicam diferentes estrat\u00e9gias de atualiza\u00e7\u00e3o, \u00e9 necess\u00e1rio manter tanto a vers\u00e3o mais recente quanto todas as vers\u00f5es anteriores. Isso complica o processo de desenvolvimento e de testes, al\u00e9m de trazer dor de cabe\u00e7a ao suporte t\u00e9cnico.<\/p>\n<h2>A diversidade de plataformas de hardware<\/h2>\n<p>\nDiversas plataformas de hardware s\u00e3o um problema que, em grande parte, \u00e9 espec\u00edfico para c\u00f3digo nativo. No m\u00ednimo, \u00e9 preciso compilar bin\u00e1rios para cada plataforma suportada.<\/p>\n<p>No projeto Veeam Agent for Linux, ainda n\u00e3o conseguimos suportar nada que seja RISC.<\/p>\n<p>N\u00e3o vou me aprofundar mais nesse assunto. Vou apenas destacar os principais problemas: tipos dependentes da plataforma, como <code>size_t<\/code>, alinhamento de estruturas e ordem dos bytes.<\/p>\n<h2>Linkagem est\u00e1tica e\/ou din\u00e2mica<\/h2>\n<p>\n<img decoding=\"async\" alt=\"Linux \u00e9 multifacetado: como trabalhar em qualquer distribui\u00e7\u00e3o\" src=\"\/wp-content\/uploads\/2019\/10\/dc473aad4ea0818940af7eafdbc641fd.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nA quest\u00e3o \"Como se linkar com bibliotecas - dinamicamente ou estaticamente?\" deve ser discutida.<\/p>\n<p>Normalmente, aplicativos C\/C++ no Linux usam linkagem din\u00e2mica. Isso funciona muito bem quando o aplicativo \u00e9 constru\u00eddo especificamente para uma distribui\u00e7\u00e3o espec\u00edfica.<\/p>\n<p>Se o objetivo \u00e9 cobrir diversas distribui\u00e7\u00f5es com um \u00fanico arquivo bin\u00e1rio, \u00e9 preciso se orientar pela distribui\u00e7\u00e3o mais antiga suportada. Para n\u00f3s, isso \u00e9 o Red Hat 6. Ele cont\u00e9m o gcc 4.4, que nem mesmo suporta totalmente o padr\u00e3o C++11. <noindex><a rel=\"nofollow\" href=\"https:\/\/gcc.gnu.org\/projects\/cxx-status.html\">totalmente<\/a><\/noindex>.<\/p>\n<p>N\u00f3s compilamos nosso projeto usando o gcc 6.3, que suporta totalmente C++14. Naturalmente, nesse caso, no Red Hat 6, \u00e9 preciso incluir a biblioteca libstdc++ e boost. O mais f\u00e1cil \u00e9 linkar com elas estaticamente.<\/p>\n<p>Mas, infelizmente, nem todas as bibliotecas podem ser linkadas estaticamente.<\/p>\n<p>Primeiro, bibliotecas do sistema, como <i>libfuse<\/i>, <i>libblkid<\/i> , precisam ser linkadas dinamicamente para garantir a compatibilidade com o n\u00facleo e seus m\u00f3dulos. <\/p>\n<p>Em segundo lugar, h\u00e1 uma quest\u00e3o relacionada \u00e0s licen\u00e7as. <\/p>\n<p>A licen\u00e7a GPL, em princ\u00edpio, permite linkar bibliotecas apenas com c\u00f3digo opensource. MIT e BSD permitem a linkagem est\u00e1tica e permitem incluir bibliotecas no projeto. J\u00e1 a LGPL parece n\u00e3o ter obje\u00e7\u00f5es \u00e0 linkagem est\u00e1tica, mas exige que os arquivos necess\u00e1rios para o linking sejam disponibilizados publicamente. <\/p>\n<p>De um modo geral, o uso da linkagem din\u00e2mica evitar\u00e1 a necessidade de fornecer algo.<\/p>\n<h2>Compila\u00e7\u00e3o de aplicativos C\/C++<\/h2>\n<p>\nPara compilar aplicativos C\/C++ para diferentes plataformas e distribui\u00e7\u00f5es, \u00e9 suficiente escolher ou compilar a vers\u00e3o apropriada do gcc e utilizar compiladores cruzados para arquiteturas espec\u00edficas, reunindo todo o conjunto de bibliotecas. Esse trabalho \u00e9 bastante realiz\u00e1vel, mas \u00e9 bastante trabalhoso. E n\u00e3o h\u00e1 garantias de que o compilador e as bibliotecas escolhidas produzir\u00e3o uma vers\u00e3o funcional. <\/p>\n<p>Uma vantagem \u00f3bvia: a infraestrutura \u00e9 simplificada, pois todo o processo de constru\u00e7\u00e3o pode ser realizado em uma \u00fanica m\u00e1quina. Al\u00e9m disso, \u00e9 suficiente compilar um \u00fanico conjunto de arquivos bin\u00e1rios para uma arquitetura e pode-se empacot\u00e1-los em pacotes para diferentes distribui\u00e7\u00f5es. \u00c9 assim que os pacotes do veeam s\u00e3o constru\u00eddos para o Veeam Agent for Linux.<\/p>\n<p>Em contraste com essa op\u00e7\u00e3o, pode-se simplesmente preparar uma build farm, ou seja, v\u00e1rias m\u00e1quinas para compila\u00e7\u00e3o. Cada uma dessas m\u00e1quinas garantir\u00e1 a compila\u00e7\u00e3o do aplicativo e a constru\u00e7\u00e3o de pacotes para uma distribui\u00e7\u00e3o espec\u00edfica e uma arquitetura determinada. Nesse caso, a compila\u00e7\u00e3o \u00e9 realizada com as ferramentas preparadas pelo distribuidor. Ou seja, a etapa de prepara\u00e7\u00e3o do compilador e sele\u00e7\u00e3o de bibliotecas \u00e9 dispensada. Al\u00e9m disso, o processo de constru\u00e7\u00e3o pode ser facilmente paralelizado. <\/p>\n<p>No entanto, h\u00e1 uma desvantagem nessa abordagem: para cada distribui\u00e7\u00e3o dentro de uma mesma arquitetura, ser\u00e1 necess\u00e1rio construir seu pr\u00f3prio conjunto de arquivos bin\u00e1rios. Outra desvantagem \u00e9 que esse grande n\u00famero de m\u00e1quinas precisa ser mantido, exigindo uma quantidade consider\u00e1vel de espa\u00e7o em disco e mem\u00f3ria RAM. <\/p>\n<p>Assim, s\u00e3o constru\u00eddos pacotes KMOD do m\u00f3dulo do kernel veeamsnap para distribui\u00e7\u00f5es Red Hat.<\/p>\n<h2>Open Build Service<\/h2>\n<p>\nOs colegas da SUSE tentaram implementar um meio-termo por meio de um servi\u00e7o especial para compilar aplicativos e construir pacotes \u2014 <noindex><a rel=\"nofollow\" href=\"https:\/\/openbuildservice.org\/\">openbuildservice<\/a><\/noindex>.<\/p>\n<p>Na ess\u00eancia, trata-se de um hipervisor que cria uma m\u00e1quina virtual, instala todos os pacotes necess\u00e1rios nela, realiza a compila\u00e7\u00e3o do aplicativo e constr\u00f3i o pacote nesse ambiente isolado, ap\u00f3s o que a m\u00e1quina virtual \u00e9 liberada.<\/p>\n<p><img decoding=\"async\" alt=\"Linux \u00e9 multifacetado: como trabalhar em qualquer distribui\u00e7\u00e3o\" src=\"\/wp-content\/uploads\/2019\/10\/93d2a70c589a7186ecef85a7863e59e8.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nO planejador implementado no OpenBuildService determinar\u00e1 quantas m\u00e1quinas virtuais ele pode iniciar para otimizar a velocidade de constru\u00e7\u00e3o dos pacotes. O mecanismo de assinatura embutido assinar\u00e1 os pacotes automaticamente e os disponibilizar\u00e1 no reposit\u00f3rio integrado. O sistema de controle de vers\u00e3o integrado salvar\u00e1 o hist\u00f3rico de altera\u00e7\u00f5es e compila\u00e7\u00f5es. Resta apenas adicionar seus c\u00f3digos-fonte a esse sistema. Mesmo o servidor n\u00e3o precisa ser levantado manualmente, podendo-se utilizar o aberto.<\/p>\n<p>Aqui, de fato, existe um problema: tal combinador \u00e9 dif\u00edcil de se encaixar na infraestrutura existente. Por exemplo, o controle de vers\u00e3o n\u00e3o \u00e9 necess\u00e1rio, j\u00e1 temos o nosso para os c\u00f3digos-fonte. O mecanismo de assinatura que temos \u00e9 diferente: utiliza um servidor especial. O reposit\u00f3rio tamb\u00e9m n\u00e3o \u00e9 necess\u00e1rio. <\/p>\n<p>Al\u00e9m disso, o suporte para outras distribui\u00e7\u00f5es \u2014 por exemplo, Red Hat \u2014 \u00e9 implementado de forma bastante limitada, o que \u00e9 compreens\u00edvel.<\/p>\n<p>Uma das vantagens desse servi\u00e7o \u00e9 o suporte r\u00e1pido \u00e0 nova vers\u00e3o da distribui\u00e7\u00e3o SUSE. Antes do an\u00fancio oficial do lan\u00e7amento, os pacotes necess\u00e1rios para a compila\u00e7\u00e3o s\u00e3o disponibilizados no reposit\u00f3rio p\u00fablico. Uma nova entrada aparece na lista de distribui\u00e7\u00f5es dispon\u00edveis no OpenBuildService. Marcamos a op\u00e7\u00e3o e ela \u00e9 adicionada ao plano de compila\u00e7\u00e3o. Assim, a adi\u00e7\u00e3o de uma nova vers\u00e3o da distribui\u00e7\u00e3o \u00e9 feita praticamente com um clique.<\/p>\n<p>Em nossa infraestrutura, utilizando o OpenBuildService, s\u00e3o compiladas todas as variedades de pacotes KMP do m\u00f3dulo do n\u00facleo veeamsnap para distribui\u00e7\u00f5es SUSE.<\/p>\n<p>A seguir, gostaria de focar em quest\u00f5es espec\u00edficas relacionadas aos m\u00f3dulos do n\u00facleo.<\/p>\n<h2>kernel ABI<\/h2>\n<p>\nOs m\u00f3dulos do n\u00facleo Linux historicamente foram distribu\u00eddos na forma de c\u00f3digos-fonte. Isso se deve ao fato de que os criadores do n\u00facleo n\u00e3o se preocupam em manter uma API est\u00e1vel para os m\u00f3dulos, especialmente a n\u00edvel bin\u00e1rio, conhecido como kABI.<\/p>\n<p>Para compilar um m\u00f3dulo para o n\u00facleo vanilla, s\u00e3o exatamente os headers desse n\u00facleo que s\u00e3o necess\u00e1rios, e ele funcionar\u00e1 apenas nesse n\u00facleo. <\/p>\n<p>O DKMS permite automatizar o processo de compila\u00e7\u00e3o de m\u00f3dulos durante a atualiza\u00e7\u00e3o do n\u00facleo. Como resultado, os usu\u00e1rios do reposit\u00f3rio Debian (e seus muitos parentes) utilizam m\u00f3dulos do n\u00facleo ou do reposit\u00f3rio do distribuidor, ou compilados a partir do c\u00f3digo-fonte usando DKMS.<\/p>\n<p>No entanto, essa situa\u00e7\u00e3o n\u00e3o agrada muito ao segmento Enterprise. Os distribuidores de c\u00f3digo propriet\u00e1rio desejam oferecer o produto na forma de bin\u00e1rios compilados. <\/p>\n<p>Os administradores n\u00e3o querem manter ferramentas de desenvolvimento em servidores de produ\u00e7\u00e3o por motivos de seguran\u00e7a. Distribuidores de Enterprise Linux \u2014 como Red Hat e SUSE \u2014 decidiram que poderiam suportar uma kABI est\u00e1vel para seus usu\u00e1rios. Como resultado, surgiram pacotes KMOD para Red Hat e pacotes KMP para SUSE.<\/p>\n<p>A ess\u00eancia dessa solu\u00e7\u00e3o \u00e9 bastante simples. Para uma vers\u00e3o espec\u00edfica da distribui\u00e7\u00e3o, a API do n\u00facleo \u00e9 congelada. O distribuidor afirma que utiliza, por exemplo, o n\u00facleo 3.10, e faz apenas corre\u00e7\u00f5es e melhorias que n\u00e3o afetam as interfaces do n\u00facleo, permitindo que os m\u00f3dulos compilados para o n\u00facleo original sejam utilizados em todos os subsequentes sem recompila\u00e7\u00e3o.<\/p>\n<p>A Red Hat afirma que h\u00e1 compatibilidade kABI para sua distribui\u00e7\u00e3o ao longo de todo o ciclo de vida. Ou seja, um m\u00f3dulo compilado para RHEL 6.0 (lan\u00e7amento de novembro de 2010) tamb\u00e9m deve funcionar na vers\u00e3o 6.10 (lan\u00e7amento de junho de 2018). Isso representa quase 8 anos. Naturalmente, essa tarefa \u00e9 bastante complexa. <br \/>\nRegistramos v\u00e1rios casos em que, devido a problemas de compatibilidade kABI, o m\u00f3dulo veeamsnap parou de funcionar. <\/p>\n<p>Ap\u00f3s o m\u00f3dulo veeamsnap, compilado para RHEL 7.0, se mostrar incompat\u00edvel com o n\u00facleo do RHEL 7.5, embora carregasse e garantidamente derrubasse o servidor, desistimos de usar a compatibilidade kABI para RHEL 7 completamente. <\/p>\n<p>Atualmente, o pacote KMOD para RHEL 7 cont\u00e9m uma compila\u00e7\u00e3o para cada vers\u00e3o de lan\u00e7amento e um script que garante o carregamento do m\u00f3dulo.<\/p>\n<p>A SUSE abordou a quest\u00e3o da compatibilidade kABI de maneira mais cautelosa. Eles garantem a compatibilidade kABI apenas dentro de um \u00fanico service pack. <\/p>\n<p>Por exemplo, o lan\u00e7amento do SLES 12 ocorreu em setembro de 2014. E o SLES 12 SP1 j\u00e1 em dezembro de 2015, ou seja, passou pouco mais de um ano. Apesar de ambas as vers\u00f5es utilizarem o n\u00facleo 3.12, elas s\u00e3o incompat\u00edveis com kABI. \u00c9 evidente que manter a compatibilidade kABI durante apenas um ano \u00e9 significativamente mais f\u00e1cil. Um ciclo de atualiza\u00e7\u00e3o do m\u00f3dulo do n\u00facleo anual n\u00e3o deve apresentar problemas para os criadores de m\u00f3dulos. <\/p>\n<p>Como resultado dessa pol\u00edtica da SUSE, n\u00e3o registramos nenhum problema de compatibilidade kABI com nosso m\u00f3dulo veeamsnap. Na verdade, o n\u00famero de pacotes para SUSE \u00e9 quase uma ordem de magnitude maior.<\/p>\n<h2>Corre\u00e7\u00f5es e backports<\/h2>\n<p>\nEmbora os distribuidores se esforcem para garantir a compatibilidade kABI e a estabilidade do n\u00facleo, tamb\u00e9m buscam melhorar o desempenho e corrigir defeitos desse n\u00facleo est\u00e1vel. <\/p>\n<p>Al\u00e9m de seu pr\u00f3prio \"trabalho de corre\u00e7\u00e3o de erros\", os desenvolvedores do n\u00facleo enterprise linux monitoram as mudan\u00e7as no n\u00facleo vanilla e as transferem para seu \"est\u00e1vel\".<\/p>\n<p>Isso \u00e0s vezes leva a novos <noindex><a rel=\"nofollow\" href=\"https:\/\/access.redhat.com\/solutions\/3658111\">erros<\/a><\/noindex>.<\/p>\n<p>Na \u00faltima vers\u00e3o do Red Hat 6, em uma das atualiza\u00e7\u00f5es menores, ocorreu um erro. Isso fazia com que o m\u00f3dulo veeamsnap derrubasse o sistema ao liberar o snapshot. Comparando os c\u00f3digos-fonte do n\u00facleo antes e depois da atualiza\u00e7\u00e3o, descobrimos que a causa era o backport. Uma corre\u00e7\u00e3o semelhante foi feita no n\u00facleo vanilla vers\u00e3o 4.19. No entanto, no n\u00facleo vanilla, essa corre\u00e7\u00e3o funcionou corretamente, mas ao ser transferida para o \"est\u00e1vel\" 2.6.32, surgiu um problema com a bloqueio spin.<\/p>\n<p>Claro, todos cometem erros de vez em quando, mas valeu a pena arrastar o c\u00f3digo de 4.19 para 2.6.32, em risco da estabilidade?.. N\u00e3o tenho certeza...<\/p>\n<p>O pior \u00e9 quando o marketing entra na disputa entre \"estabilidade\"  \"moderniza\u00e7\u00e3o\". O departamento de marketing precisa que o n\u00facleo da nova distribui\u00e7\u00e3o seja est\u00e1vel, por um lado, e ao mesmo tempo, melhor em desempenho e com novas fun\u00e7\u00f5es. Isso leva a compromissos estranhos. <\/p>\n<p>Quando tentei compilar um m\u00f3dulo no n\u00facleo 4.4 do SLES 12 SP3, fiquei surpreso ao descobrir recursos do 4.8 vanilla. Na minha opini\u00e3o, a implementa\u00e7\u00e3o de I\/O em bloco do n\u00facleo 4.4 do SLES 12 SP3 se parece mais com o n\u00facleo 4.8 do que com a vers\u00e3o anterior est\u00e1vel 4.4 do n\u00facleo do SLES 12 SP2. N\u00e3o me atrevo a julgar qual foi a porcentagem de c\u00f3digo transferido do n\u00facleo 4.8 para o 4.4 do SLES para SP3, mas n\u00e3o consigo chamar o n\u00facleo de 4.4 est\u00e1vel. <\/p>\n<p>O mais desagrad\u00e1vel \u00e9 que, ao escrever um m\u00f3dulo que funcione igualmente bem em diferentes n\u00facleos, n\u00e3o se pode mais confiar apenas na vers\u00e3o do n\u00facleo. Tamb\u00e9m \u00e9 necess\u00e1rio levar em conta a distribui\u00e7\u00e3o. \u00c9 bom que \u00e0s vezes se possa se basear em uma defini\u00e7\u00e3o que aparece com novas funcionalidades, mas essa possibilidade nem sempre est\u00e1 dispon\u00edvel. <\/p>\n<p>Como resultado, o c\u00f3digo se acumula em diretrizes peculiares de compila\u00e7\u00e3o condicional.<\/p>\n<p>Tamb\u00e9m existem patches que alteram a API documentada do n\u00facleo. <br \/>\nEncontrei a distribui\u00e7\u00e3o <noindex><a rel=\"nofollow\" href=\"https:\/\/neon.kde.org\/\">KDE neon<\/a><\/noindex> 5.16 e fiquei muito surpreso ao ver que a chamada lookup_bdev nesta vers\u00e3o do n\u00facleo alterou a lista de par\u00e2metros de entrada.<\/p>\n<p>Para compilar, tive que adicionar um script ao makefile que verifica se o par\u00e2metro mask est\u00e1 na fun\u00e7\u00e3o lookup_bdev.<\/p>\n<h2>Assinatura dos m\u00f3dulos do n\u00facleo<\/h2>\n<p>\nMas voltemos \u00e0 quest\u00e3o da distribui\u00e7\u00e3o de pacotes.<\/p>\n<p>Uma das vantagens da kABI est\u00e1vel \u00e9 que os m\u00f3dulos do n\u00facleo podem ser assinados como arquivos bin\u00e1rios. Nesse caso, o desenvolvedor pode ter certeza de que o m\u00f3dulo n\u00e3o foi acidentalmente corrompido ou alterado intencionalmente. Isso pode ser verificado com o comando modinfo. <\/p>\n<p>As distribui\u00e7\u00f5es Red Hat e SUSE permitem verificar a assinatura do m\u00f3dulo e carreg\u00e1-lo apenas se a chave correspondente estiver registrada no sistema. O certificado \u00e9 a chave p\u00fablica com a qual o m\u00f3dulo \u00e9 assinado. N\u00f3s o distribu\u00edmos como um pacote separado.<\/p>\n<p>O problema aqui \u00e9 que os certificados podem ser incorporados ao n\u00facleo (usados pelos distribuidores) ou devem ser gravados na mem\u00f3ria n\u00e3o vol\u00e1til EFI usando uma ferramenta. <i>mokutil<\/i>. A ferramenta <i>mokutil<\/i> ao instalar o certificado, exige que o sistema reinicie e, ainda antes de carregar o n\u00facleo do sistema operacional, oferece ao administrador a op\u00e7\u00e3o de permitir a carga do novo certificado. <\/p>\n<p>Assim, adicionar um certificado requer acesso f\u00edsico do administrador ao sistema. Se a m\u00e1quina estiver localizada em algum lugar na nuvem ou simplesmente em um servidor remoto com acesso apenas pela rede (por exemplo, via ssh), ent\u00e3o n\u00e3o ser\u00e1 poss\u00edvel adicionar o certificado. <\/p>\n<h2>EFI em m\u00e1quinas virtuais<\/h2>\n<p>\nApesar de j\u00e1 faz tempo que o EFI \u00e9 suportado praticamente por todos os fabricantes de placas-m\u00e3e, ao instalar o sistema, o administrador pode n\u00e3o considerar a necessidade do EFI, e ele pode estar desativado. <\/p>\n<p>Nem todos os hypervisores suportam EFI. O VMWare vSphere suporta EFI a partir da vers\u00e3o 5. <br \/>\nO Microsoft Hyper-V tamb\u00e9m ganhou suporte ao EFI, come\u00e7ando com o Hyper-V para Windows Server 2012R2. <\/p>\n<p>Entretanto, na configura\u00e7\u00e3o padr\u00e3o, essa funcionalidade para m\u00e1quinas Linux est\u00e1 desativada, o que significa que n\u00e3o \u00e9 poss\u00edvel instalar o certificado. <\/p>\n<p>No vSphere 6.5, a op\u00e7\u00e3o <b>Secure Boot<\/b> s\u00f3 pode ser configurada na vers\u00e3o antiga da interface web, que funciona atrav\u00e9s do Flash. A interface web em HTML-5 ainda est\u00e1 bastante atrasada.<\/p>\n<h2>Distribui\u00e7\u00f5es experimentais<\/h2>\n<p>\nPor fim, vamos considerar a quest\u00e3o das distribui\u00e7\u00f5es experimentais e das distribui\u00e7\u00f5es sem suporte oficial. Por um lado, essas distribui\u00e7\u00f5es dificilmente ser\u00e3o encontradas em servidores de organiza\u00e7\u00f5es s\u00e9rias. N\u00e3o h\u00e1 suporte oficial para essas distribui\u00e7\u00f5es. Portanto, n\u00e3o se pode garantir o suporte t\u00e9cnico do produto em uma dessas distribui\u00e7\u00f5es. <\/p>\n<p>No entanto, essas distribui\u00e7\u00f5es se tornam uma plataforma conveniente para experimentar novas solu\u00e7\u00f5es. Por exemplo, Fedora, OpenSUSE Tumbleweed ou vers\u00f5es inst\u00e1veis do Debian. Elas s\u00e3o bastante est\u00e1veis. Sempre apresentam novas vers\u00f5es de programas e um n\u00facleo novo. Em um ano, essa funcionalidade experimental pode aparecer em uma vers\u00e3o atualizada do RHEL, SLES ou Ubuntu. <\/p>\n<p>Assim, se algo n\u00e3o funcionar em uma distribui\u00e7\u00e3o experimental, \u00e9 um bom motivo para investigar o problema e resolv\u00ea-lo. \u00c9 preciso estar preparado para o fato de que essa funcionalidade em breve aparecer\u00e1 em servidores de produ\u00e7\u00e3o dos usu\u00e1rios.<\/p>\n<p>A lista atual dos distribui\u00e7\u00f5es oficialmente suportados para a vers\u00e3o 3.0 pode ser consultada <noindex><a rel=\"nofollow\" href=\"https:\/\/helpcenter.veeam.com\/docs\/agentforlinux\/userguide\/system_requirements.html?ver=30\">aqui<\/a><\/noindex>. Mas a lista real de distribui\u00e7\u00f5es em que nosso produto pode operar \u00e9 muito mais extensa.<\/p>\n<p>Pessoalmente, fiquei interessado na experi\u00eancia com o sistema operacional \"Elbrus\". Ap\u00f3s a atualiza\u00e7\u00e3o do pacote veeam, nosso produto foi instalado e funcionou. Escrevi sobre essa experi\u00eancia no Habr em <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/veeam\/blog\/447960\/\">artigo<\/a><\/noindex>. <\/p>\n<p>Apoio para novas distribui\u00e7\u00f5es continua. Estamos aguardando o lan\u00e7amento da vers\u00e3o 4.0. A vers\u00e3o beta deve sair a qualquer momento, ent\u00e3o fique atento ao <noindex><a rel=\"nofollow\" href=\"https:\/\/www.veeam.com\/whats-new-linux-agent.html\">whats-new<\/a><\/noindex>!<br \/>\n<br \/>Fonte: <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.3 - 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\/pt\/blog\/administrirovanie\/linux-mnogolikij-kak-rabotat-na-lyubom-distributive\" \/>\n\t\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.3\" \/>\n\t\t<meta property=\"og:locale\" content=\"pt_PT\" \/>\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\/pt\/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 \u00e9 multifacetado: como trabalhar em qualquer distribui\u00e7\u00e3o | ProHoster","description":"Criar um aplicativo para backup.","canonical_url":"https:\/\/prohoster.info\/pt\/blog\/administrirovanie\/linux-mnogolikij-kak-rabotat-na-lyubom-distributive","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"pt_PT","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\/pt\/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\/pt\/wp-json\/wp\/v2\/posts\/38929","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/comments?post=38929"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/posts\/38929\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/media\/29206"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/media?parent=38929"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/categories?post=38929"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/tags?post=38929"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}