{"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\/it\/blog\/administrirovanie\/linux-mnogolikij-kak-rabotat-na-lyubom-distributive","title":{"rendered":"Linux \u00e8 multifaccettato: come lavorare su qualsiasi distribuzione.","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Linux \u00e8 multifaccettato: come lavorare su qualsiasi distribuzione.\" src=\"\/wp-content\/uploads\/2019\/10\/ee1aaad566204532c974a3ce8f13b915.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nCreare un'applicazione di backup che funzioni su qualsiasi distribuzione \u00e8 una sfida non semplice. Per garantire il funzionamento di Veeam Agent for Linux su distribuzioni da Red Hat 6 a Debian 6, fino a OpenSUSE 15.1 e Ubuntu 19.04, \u00e8 necessario affrontare una serie di problemi, soprattutto considerando che il prodotto include un modulo del kernel.<\/p>\n<p>L'articolo \u00e8 stato creato sulla base di un intervento alla conferenza <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 non \u00e8 solo uno dei sistemi operativi pi\u00f9 popolari. In realt\u00e0, \u00e8 una piattaforma su cui si pu\u00f2 costruire qualcosa di unico, di proprio. Per questo motivo, Linux presenta molte distribuzioni, che si differenziano per il set di componenti software. Qui si presenta un problema: affinch\u00e9 un prodotto software funzioni su qualsiasi distribuzione, \u00e8 necessario tenere conto delle specificit\u00e0 di ciascuna.<\/p>\n<h2>Gestori pacchetti: .deb vs .rpm<\/h2>\n<p>\nIniziamo con il problema evidente della distribuzione del prodotto per le diverse distribuzioni.<br \/>\nIl modo pi\u00f9 comune di distribuire prodotti software \u00e8 caricare un pacchetto su un repository affinch\u00e9 il gestore pacchetti integrato nel sistema possa installarlo da l\u00ec.<br \/>\nTuttavia, abbiamo due formati di pacchetti popolari: <i>rpm<\/i> e <i>deb<\/i>. Quindi, dovremo sostenere ognuno.<\/p>\n<p>Nel mondo dei pacchetti deb, il livello di compatibilit\u00e0 \u00e8 impressionante. Lo stesso pacchetto si installa e funziona altrettanto bene su Debian 6 e Ubuntu 19.04. Gli standard del processo di creazione e gestione dei pacchetti, stabiliti nelle vecchie distribuzioni Debian, rimangono attuali anche nelle moderne Linux Mint e elementary OS. Pertanto, per Veeam Agent for Linux \u00e8 sufficiente un solo pacchetto deb per ogni piattaforma hardware.<\/p>\n<p>Nel mondo dei pacchetti rpm, invece, ci sono grandi differenze. In primo luogo, perch\u00e9 ci sono due distributori completamente indipendenti, Red Hat e SUSE, per i quali non \u00e8 necessaria alcuna compatibilit\u00e0. In secondo luogo, questi distributori hanno distribuzioni con supporto tecnico ed altre sperimentali. Tra di loro, la compatibilit\u00e0 non \u00e8 necessaria. Risultiamo avere pacchetti diversi per el6, el7 ed el8. Un pacchetto separato per Fedora. Pacchetti per SLES11 e 12 e uno separato per openSUSE. Il problema principale riguarda le dipendenze e i nomi dei pacchetti. <\/p>\n<h2>Problema delle dipendenze<\/h2>\n<p>\nPurtroppo, gli stessi pacchetti si trovano spesso con nomi diversi in distribuzioni diverse. Di seguito un elenco non completo delle dipendenze del pacchetto veeam.<\/p>\n<p>Per EL7:<br \/>\nPer 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>\nDi conseguenza, l'elenco delle dipendenze risulta unico per la distribuzione. <\/p>\n<p>Pu\u00f2 essere peggio quando una versione aggiornata si nasconde dietro un vecchio nome di pacchetto. <\/p>\n<p><b>Esempio:<\/b><\/p>\n<p>In Fedora 24, il pacchetto \u00e8 stato aggiornato <i>ncurses<\/i> dalla versione 5 alla versione 6. Il nostro prodotto \u00e8 stato compilato proprio con la versione 5, per garantire la compatibilit\u00e0 con le vecchie distribuzioni. Per utilizzare la vecchia versione 5 della libreria su Fedora 24, \u00e8 stato necessario usare il pacchetto <i>ncurses-compat-libs<\/i>. <\/p>\n<p>Pertanto, per Fedora, appaiono due pacchetti, con dipendenze diverse. <\/p>\n<p>Diventa pi\u00f9 interessante. Dopo un ulteriore aggiornamento della distribuzione, il pacchetto <i>ncurses-compat-libs<\/i> con la versione 5 della libreria risulta non disponibile. \u00c8 oneroso per il distributore portare le vecchie librerie nella nuova versione della distribuzione. Dopo un po', il problema si \u00e8 ripresentato anche nelle distribuzioni SUSE.<\/p>\n<p>Di conseguenza, per alcune distribuzioni \u00e8 stato necessario rinunciare alla dipendenza esplicita da <i>ncurses-libs<\/i>, e modificare il prodotto in modo che potesse funzionare con qualsiasi versione della libreria.<\/p>\n<p>A proposito, nella versione 8 di Red Hat non c'\u00e8 pi\u00f9 il meta-pacchetto <i>python<\/i>, che faceva riferimento al vecchio caro <i>python 2.7<\/i>. C'\u00e8 <i>python2<\/i> e <i>python<\/i>3. <\/p>\n<h2>Alternativa ai gestori di pacchetti<\/h2>\n<p>\nIl problema delle dipendenze \u00e8 vecchio e ormai noto. Pensiamo almeno alla dipendenza infernale. <br \/>\nUnire diverse librerie e applicazioni in modo che funzionino stabilmente e non conflittualmente \u00e8, in effetti, il compito che ogni distributore Linux cerca di risolvere.<\/p>\n<p>In modo completamente diverso, il gestore di pacchetti <b>Snappy<\/b> di Canonical. L'idea principale: l'applicazione viene eseguita in un sandbox isolato e protetto dal sistema principale. Se l'applicazione necessita di librerie, queste vengono fornite insieme all'applicazione stessa.<\/p>\n<p><b>Flatpak<\/b> permette anche di eseguire applicazioni in un sandbox utilizzando i contenitori Linux. L'idea del sandbox \u00e8 usata anche da <b>AppImage<\/b>.<\/p>\n<p>Queste soluzioni permettono di creare un unico pacchetto per qualsiasi distribuzione. Nel caso di <b>Flatpak<\/b> l'installazione e l'esecuzione dell'applicazione sono possibili anche senza la conoscenza dell'amministratore.<\/p>\n<p>Il problema principale \u00e8 che non tutte le applicazioni possono funzionare in un sandbox. Alcune necessitano di accesso diretto alla piattaforma. Non parliamo nemmeno dei moduli del kernel, che dipendono rigidamente dal kernel e non si adattano affatto al concetto di sandbox. <\/p>\n<p>Il secondo problema \u00e8 che le distribuzioni popolari nell'ambito enterprise di Red Hat e SUSE non supportano ancora Snappy e Flatpak. <\/p>\n<p>Pertanto, Veeam Agent per Linux non \u00e8 disponibile n\u00e9 su <noindex><a rel=\"nofollow\" href=\"https:\/\/snapcraft.io\/\">snapcraft.io<\/a><\/noindex> n\u00e9 su <noindex><a rel=\"nofollow\" href=\"https:\/\/flathub.org\/home\">flathub.org.<\/a><\/noindex>.<\/p>\n<p>In conclusione, riguardo ai gestori di pacchetti, vorrei notare che esiste la possibilit\u00e0 di rinunciare completamente ai gestori di pacchetti, combinando in un singolo pacchetto file binari e script per la loro installazione. <\/p>\n<p>Tale bundle consente di creare un unico pacchetto per diverse distribuzioni e piattaforme, offrendo un processo di installazione interattivo con la necessaria personalizzazione. Ho incontrato pacchetti di questo tipo per Linux solo da VMware.<\/p>\n<h2>Il problema degli aggiornamenti.<\/h2>\n<p>\n<img decoding=\"async\" alt=\"Linux \u00e8 multifaccettato: come lavorare su qualsiasi distribuzione.\" src=\"\/wp-content\/uploads\/2019\/10\/aa14b10a434c28541574421d97807de7.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nAnche se tutti i problemi di dipendenze sono stati risolti, il programma pu\u00f2 funzionare in modo diverso sulla stessa distribuzione. Questo \u00e8 dovuto agli aggiornamenti.<\/p>\n<p>Esistono 3 strategie di aggiornamento:<\/p>\n<ul>\n<li>La pi\u00f9 semplice \u00e8 non aggiornare mai. Hai configurato il server e te ne sei dimenticato. Perch\u00e9 aggiornare se tutto funziona? I problemi iniziano al primo contatto con il supporto tecnico. L'autore della distribuzione supporta solo la release aggiornata. <\/li>\n<li>\u00c8 possibile fidarsi del distributore e impostare l'aggiornamento automatico. In tal caso, una chiamata al servizio di assistenza \u00e8 probabile subito dopo un aggiornamento fallito.<\/li>\n<li>L'opzione di aggiornamento manuale, applicata solo dopo una prova su un'infrastruttura di test, \u00e8 la pi\u00f9 sicura, ma costosa e laboriosa. Non tutti possono permettersi questa soluzione.<\/li>\n<\/ul>\n<p>\nPoich\u00e9 gli utenti adottano diverse strategie di aggiornamento, \u00e8 necessario supportare sia l'ultima versione che tutte le versioni precedenti. Questo complica sia il processo di sviluppo che quello di testing, aumentando il carico di lavoro per il servizio di assistenza.<\/p>\n<h2>Diversit\u00e0 delle piattaforme hardware<\/h2>\n<p>\nLe diverse piattaforme hardware rappresentano un problema, particolarmente specifico per il codice nativo. Al minimo, \u00e8 necessario raccogliere i binari per ciascuna piattaforma supportata.<\/p>\n<p>Nel progetto Veeam Agent for Linux non possiamo ancora supportare nulla di RISC.<\/p>\n<p>Non mi soffermer\u00f2 su questo argomento. Indicher\u00f2 solo i principali problemi: tipi dipendenti dalla piattaforma, come <code>size_t<\/code>, allineamento delle strutture e byte order.<\/p>\n<h2>Linking statico e\/o dinamico<\/h2>\n<p>\n<img decoding=\"async\" alt=\"Linux \u00e8 multifaccettato: come lavorare su qualsiasi distribuzione.\" src=\"\/wp-content\/uploads\/2019\/10\/dc473aad4ea0818940af7eafdbc641fd.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nEcco una domanda da discutere: \u00abCome effettuare il linking con le librerie \u2014 in modo dinamico o statico?\u00bb<\/p>\n<p>In genere, le applicazioni C\/C++ su Linux utilizzano il linking dinamico. Questo funziona bene se l'applicazione \u00e8 costruita specificamente per una distribuzione concreta.<\/p>\n<p>Se invece l'obiettivo \u00e8 coprire diverse distribuzioni con un unico file binario, bisogna orientarsi sulla distribuzione pi\u00f9 vecchia supportata. Per noi, questa \u00e8 Red Hat 6. Essa include gcc 4.4, che non supporta nemmeno lo standard C++11. <noindex><a rel=\"nofollow\" href=\"https:\/\/gcc.gnu.org\/projects\/cxx-status.html\">completamente<\/a><\/noindex>.<\/p>\n<p>Compiliamo il nostro progetto usando gcc 6.3, che supporta completamente C++14. Naturalmente, in questo caso, su Red Hat 6 dobbiamo portare con noi le librerie libstdc++ e boost. \u00c8 pi\u00f9 semplice linkarle staticamente.<\/p>\n<p>Purtroppo, non tutte le librerie possono essere collegate staticamente.<\/p>\n<p>In primo luogo, le librerie di sistema, come <i>libfuse<\/i>, <i>libblkid<\/i> devono essere collegate dinamicamente, per garantire la compatibilit\u00e0 con il kernel e i suoi moduli. <\/p>\n<p>In secondo luogo, c'\u00e8 una questione legata alle licenze. <\/p>\n<p>La licenza GPL consente di collegare le librerie solo con codice open source. MIT e BSD consentono il linking statico e permettono di includere librerie nel progetto. D'altra parte, l'LGPL non sembra opporsi al linking statico, ma richiede di fornire accesso ai file necessari per il linking. <\/p>\n<p>In generale, l'uso del linking dinamico protegger\u00e0 dall'obbligo di fornire qualcosa.<\/p>\n<h2>Compilazione di applicazioni C\/C++<\/h2>\n<p>\nPer compilare applicazioni C\/C++ per diverse piattaforme e distribuzioni, \u00e8 sufficiente selezionare o costruire una versione adeguata di gcc e utilizzare i cross-compiler per architetture specifiche, raccogliendo cos\u00ec l'intero set di librerie. Questo lavoro \u00e8 realizzabile, ma piuttosto laborioso. Inoltre, non ci sono garanzie che il compilatore e le librerie scelte garantiranno un'opzione funzionante. <\/p>\n<p>Un chiaro vantaggio: l'infrastruttura \u00e8 notevolmente semplificata, poich\u00e9 l'intero processo di compilazione pu\u00f2 essere eseguito su una sola macchina. Inoltre, \u00e8 sufficiente creare un unico set di file binari per un'architettura e poi impacchettarli in pacchetti per diverse distribuzioni. Questo \u00e8 il modo in cui vengono creati i pacchetti veeam per Veeam Agent for Linux.<\/p>\n<p>In questo caso, \u00e8 possibile preparare una farm di build, ovvero un insieme di macchine per la compilazione. Ogni macchina si occuper\u00e0 della compilazione dell'applicazione e della creazione del pacchetto per una specifica distribuzione e architettura. In questo modo, la compilazione viene effettuata utilizzando gli strumenti predisposti dal distributore. Di conseguenza, la fase di preparazione del compilatore e la selezione delle librerie non sono necessarie. Inoltre, il processo di compilazione pu\u00f2 essere facilmente parallelizzato. <\/p>\n<p>Tuttavia, c'\u00e8 uno svantaggio in questo approccio: per ogni distribuzione all'interno di una stessa architettura, sar\u00e0 necessario compilare il proprio insieme di file binari. Inoltre, un altro svantaggio \u00e8 che \u00e8 necessario gestire un gran numero di macchine, assegnare una grande quantit\u00e0 di spazio su disco e memoria RAM. <\/p>\n<p>In questo modo vengono assemblati i pacchetti KMOD del modulo del kernel veeamsnap per le distribuzioni Red Hat.<\/p>\n<h2>Open Build Service<\/h2>\n<p>\nI colleghi di SUSE hanno tentato di realizzare una sorta di compromesso attraverso un servizio speciale per la compilazione delle applicazioni e la creazione dei pacchetti \u2014 <noindex><a rel=\"nofollow\" href=\"https:\/\/openbuildservice.org\/\">openbuildservice<\/a><\/noindex>.<\/p>\n<p>In sostanza, si tratta di un hypervisor che crea una macchina virtuale, installa tutti i pacchetti necessari, compila l'applicazione e costruisce il pacchetto in quell'ambiente isolato, dopo di che tale macchina virtuale viene liberata.<\/p>\n<p><img decoding=\"async\" alt=\"Linux \u00e8 multifaccettato: come lavorare su qualsiasi distribuzione.\" src=\"\/wp-content\/uploads\/2019\/10\/93d2a70c589a7186ecef85a7863e59e8.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nIl pianificatore implementato in OpenBuildService determiner\u00e0 autonomamente quante macchine virtuali pu\u00f2 avviare per una velocit\u00e0 di costruzione ottimale dei pacchetti. Il meccanismo di firma integrato firmer\u00e0 automaticamente i pacchetti e li caricher\u00e0 nel repository integrato. Il sistema di controllo delle versioni incorporato salver\u00e0 la cronologia delle variazioni e delle costruzioni. Non resta che aggiungere i propri sorgenti a questo sistema. Non \u00e8 nemmeno necessario sollevare un server da soli, si pu\u00f2 utilizzare un server pubblico.<\/p>\n<p>C'\u00e8, tuttavia, un problema: un tale sistema \u00e8 difficile da integrare nell'infrastruttura esistente. Ad esempio, il controllo delle versioni non \u00e8 necessario, poich\u00e9 abbiamo gi\u00e0 il nostro per i sorgenti. Il meccanismo di firma \u00e8 diverso: viene utilizzato un server speciale. Anche il repository non \u00e8 necessario. <\/p>\n<p>Inoltre, il supporto per altre distribuzioni, ad esempio Red Hat, \u00e8 piuttosto scarso, il che \u00e8 comprensibile.<\/p>\n<p>Un vantaggio di questo servizio \u00e8 il supporto rapido per la nuova versione della distribuzione SUSE. Prima dell'annuncio ufficiale del rilascio, i pacchetti necessari per la compilazione vengono resi disponibili nel repository pubblico. Un nuovo pacchetto appare nella lista delle distribuzioni disponibili su OpenBuildService. Basta selezionare la casella, e verr\u00e0 aggiunto al piano di compilazione. In questo modo, l'aggiunta di una nuova versione della distribuzione avviene praticamente con un clic.<\/p>\n<p>Nella nostra infrastruttura, utilizzando OpenBuildService, viene compilata l'intera variet\u00e0 dei pacchetti KMP del modulo del kernel veeamsnap per le distribuzioni SUSE.<\/p>\n<p>Ora vorrei soffermarmi su questioni specifiche relative ai moduli del kernel.<\/p>\n<h2>kernel ABI<\/h2>\n<p>\nI moduli del kernel Linux sono storicamente distribuiti come codice sorgente. Infatti, i creatori del kernel non si preoccupano di garantire un'API stabile per i moduli del kernel, tantomeno a livello binario, noto come kABI.<\/p>\n<p>Per compilare un modulo per il kernel vanilla, sono necessari i header di quel particolare kernel, e funzioner\u00e0 solo su quel kernel. <\/p>\n<p>DKMS consente di automatizzare il processo di compilazione dei moduli durante l'aggiornamento del kernel. Di conseguenza, gli utenti del repository Debian (e dei suoi numerosi parenti) utilizzano i moduli del kernel o dal repository del distributore, oppure compilati dai sorgenti tramite DKMS.<\/p>\n<p>Tuttavia, questa situazione non soddisfa particolarmente il segmento Enterprise. I distributori di codice proprietario desiderano fornire il prodotto sotto forma di binari gi\u00e0 compilati. <\/p>\n<p>Gli amministratori non vogliono mantenere gli strumenti di sviluppo sui server di production per motivi di sicurezza. I distributori di Enterprise Linux, come Red Hat e SUSE, hanno deciso che potrebbero supportare per i loro utenti un kABI stabile. Ne sono conseguiti pacchetti KMOD per Red Hat e pacchetti KMP per SUSE.<\/p>\n<p>L'essenza di questa soluzione \u00e8 piuttosto semplice. Per una specifica versione del distributivo, l'API del kernel viene congelata. Il distributore dichiara di utilizzare precisamente il kernel, ad esempio, 3.10, e apporta solamente correzioni e miglioramenti che non impattano sulle interfacce del kernel, mentre i moduli compilati per il kernel originale possono essere utilizzati per tutti i successivi senza ricompilazione.<\/p>\n<p>Red Hat afferma di mantenere la compatibilit\u00e0 con il kABI per la distribuzione per l'intero ciclo di vita. Ci\u00f2 significa che un modulo compilato per RHEL 6.0 (rilascio di novembre 2010) deve funzionare anche sulla versione 6.10 (rilascio di giugno 2018). E questo \u00e8 quasi un lasso di tempo di 8 anni. Naturalmente, questa \u00e8 un'operazione piuttosto complessa. <br \/>\nAbbiamo registrato diversi casi in cui, a causa di problemi di compatibilit\u00e0 con kABI, il modulo veeamsnap ha smesso di funzionare. <\/p>\n<p>Dopo che il modulo veeamsnap, compilato per RHEL 7.0, \u00e8 risultata incompatibile con il kernel di RHEL 7.5, ma continuava a caricarsi e sicuramente causava il crash del server, abbiamo abbandonato l'uso della compatibilit\u00e0 kABI per RHEL 7 del tutto. <\/p>\n<p>Attualmente, il pacchetto KMOD per RHEL 7 contiene una build per ogni versione del rilascio e uno script che assicura il caricamento del modulo.<\/p>\n<p>SUSE ha affrontato il problema della compatibilit\u00e0 kABI con maggiore cautela. Assicurano la compatibilit\u00e0 kABI solo all'interno di un singolo service pack. <\/p>\n<p>Ad esempio, il rilascio di SLES 12 \u00e8 avvenuto a settembre 2014. SLES 12 SP1 \u00e8 stato invece rilasciato a dicembre 2015, poco pi\u00f9 di un anno dopo. Nonostante entrambi i rilasci utilizzino il kernel 3.12, non sono compatibili con kABI. \u00c8 chiaro che mantenere la compatibilit\u00e0 kABI per un periodo di solo un anno \u00e8 significativamente pi\u00f9 semplice. Un ciclo annuale di aggiornamento del modulo del kernel non dovrebbe presentare problemi per i creatori di moduli. <\/p>\n<p>Grazie a questa politica di SUSE, non abbiamo riscontrato alcun problema di compatibilit\u00e0 kABI con il nostro modulo veeamsnap. Inoltre, il numero di pacchetti per SUSE \u00e8 quasi di un ordine di grandezza superiore.<\/p>\n<h2>Patch e backport<\/h2>\n<p>\nNonostante gli sforzi dei distributori per garantire la compatibilit\u00e0 kABI e la stabilit\u00e0 del kernel, si impegnano anche a migliorare le prestazioni e a correggere i difetti di questo kernel stabile. <\/p>\n<p>Inoltre, oltre al loro \"lavoro di correzione\", gli sviluppatori del kernel enterprise Linux monitorano le modifiche nel kernel vanilla e le trasferiscono nel loro \"stabile\".<\/p>\n<p>A volte ci\u00f2 porta a nuovi <noindex><a rel=\"nofollow\" href=\"https:\/\/access.redhat.com\/solutions\/3658111\">errori<\/a><\/noindex>.<\/p>\n<p>Nell'ultimo aggiornamento di Red Hat 6, in uno dei minori aggiornamenti, si \u00e8 verificato un errore. Questo portava al crash del sistema quando si liberava uno snapshot dal modulo veeamsnap. Confrontando i sorgenti del kernel prima e dopo l'aggiornamento, abbiamo scoperto che la colpa era di un backport. Un fix simile \u00e8 stato effettuato nel kernel vanilla versione 4.19. Tuttavia, nel kernel vanilla quel fix funzionava normalmente, mentre nel portarlo nel \"stabile\" 2.6.32 \u00e8 emerso un problema di spin-locking.<\/p>\n<p>Certo, gli errori colpiscono tutti e sempre, ma valeva la pena portare il codice da 4.19 a 2.6.32, rischiando la stabilit\u00e0?.. Non ne sono sicuro\u2026<\/p>\n<p>Il peggio \u00e8 quando al tira e molla tra \"stabilit\u00e0\"\"modernizzazione\" si unisce il marketing. Il reparto marketing ha bisogno che il kernel della distribuzione aggiornata sia stabile, da un lato, e allo stesso tempo migliori in termini di prestazioni e abbia nuove funzionalit\u00e0. Questo porta a strani compromessi. <\/p>\n<p>Quando ho provato a compilare un modulo sul kernel 4.4 di SLES 12 SP3, sono rimasto sorpreso di trovare funzionalit\u00e0 del vanilla 4.8. A mio avviso, l'implementazione del blocco di I\/O del kernel 4.4 di SLES 12 SP3 \u00e8 pi\u00f9 simile al kernel 4.8 che alla precedente versione stabile 4.4 di SLES 12 SP2. Non mi azzardo a giudicare quale percentuale del codice del kernel 4.8 sia stata trasferita nel 4.4 di SLES per SP3, ma non riesco a considerare il kernel come un semplice 4.4 stabile. <\/p>\n<p>La cosa pi\u00f9 sgradevole \u00e8 che nella scrittura di un modulo che funzioni altrettanto bene su diversi kernel, non ci si pu\u00f2 pi\u00f9 affidare alla versione del kernel. Bisogna tenere in considerazione anche la distribuzione. \u00c8 positivo che a volte si possa fare riferimento a una definizione che appare insieme a nuove funzionalit\u00e0, ma questa opportunit\u00e0 non si presenta sempre. <\/p>\n<p>Di conseguenza, il codice si arricchisce di strane direttive di compilazione condizionale.<\/p>\n<p>Esistono anche patch che modificano l'API documentata del kernel. <br \/>\nHo trovato una distribuzione <noindex><a rel=\"nofollow\" href=\"https:\/\/neon.kde.org\/\">KDE neon<\/a><\/noindex> 5.16 e sono rimasto molto sorpreso di vedere che la chiamata a lookup_bdev in questa versione del kernel ha modificato l'elenco dei parametri di input.<\/p>\n<p>Per configurarlo, \u00e8 stato necessario aggiungere uno script al makefile che verifica se il parametro mask \u00e8 presente nella funzione lookup_bdev.<\/p>\n<h2>Firma dei moduli del kernel<\/h2>\n<p>\nTornando alla questione della distribuzione dei pacchetti.<\/p>\n<p>Uno dei vantaggi del kABI stabile \u00e8 che i moduli del kernel possono essere firmati come file binari. In questo modo, lo sviluppatore pu\u00f2 essere certo che il modulo non sia stato accidentalmente danneggiato o modificato intenzionalmente. Questo pu\u00f2 essere verificato con il comando modinfo. <\/p>\n<p>Le distribuzioni Red Hat e SUSE consentono di controllare la firma del modulo e di caricarlo solo se il certificato corrispondente \u00e8 registrato nel sistema. Il certificato rappresenta una chiave pubblica con cui viene firmato il modulo. Lo distribuiamo come pacchetto separato.<\/p>\n<p>Il problema qui \u00e8 che i certificati possono essere incorporati nel kernel (usati dai distributori) oppure devono essere scritti nella memoria non volatile EFI tramite l'utility <i>mokutil<\/i>. Strumento <i>mokutil<\/i> quando si installa il certificato richiede di riavviare il sistema e, prima del caricamento del kernel del sistema operativo, offre all'amministratore di consentire il caricamento del nuovo certificato. <\/p>\n<p>Pertanto, l'aggiunta di un certificato richiede l'accesso fisico dell'amministratore al sistema. Se la macchina si trova in cloud o semplicemente in un server remoto e l'accesso \u00e8 solo tramite rete (ad esempio, via ssh), non sar\u00e0 possibile aggiungere il certificato. <\/p>\n<h2>EFI su macchine virtuali<\/h2>\n<p>\nNonostante l'EFI sia supportato da quasi tutti i produttori di schede madri da molto tempo, l'amministratore potrebbe non pensare alla necessit\u00e0 dell'EFI durante l'installazione del sistema, e potrebbe essere disabilitato. <\/p>\n<p>Non tutti gli hypervisor supportano l'EFI. VMWare vSphere supporta l'EFI a partire dalla versione 5. <br \/>\nMicrosoft Hyper-V ha anche ricevuto supporto per l'EFI, a partire da Hyper-V per Windows Server 2012R2. <\/p>\n<p>Tuttavia, nella configurazione predefinita, questa funzionalit\u00e0 \u00e8 disattivata per le macchine Linux, quindi non \u00e8 possibile installare il certificato. <\/p>\n<p>In vSphere 6.5, l'opzione <b>Secure Boot<\/b> pu\u00f2 essere impostata solo nella vecchia versione dell'interfaccia web, che funziona tramite Flash. L'interfaccia utente web in HTML-5 \u00e8 ancora molto indietro.<\/p>\n<h2>Distribuzioni sperimentali<\/h2>\n<p>\nE infine, diamo un'occhiata alle distribuzioni sperimentali e a quelle senza supporto ufficiale. Da un lato, queste distribuzioni difficilmente si trovano sui server delle organizzazioni serie. Non c'\u00e8 supporto ufficiale per tali distribuzioni. Pertanto, non \u00e8 possibile fornire supporto tecnico per un prodotto basato su di esse. <\/p>\n<p>Tuttavia, queste distribuzioni diventano un'ottima piattaforma per provare nuove soluzioni sperimentali. Ad esempio, Fedora, OpenSUSE Tumbleweed o le versioni instabili di Debian. Sono piuttosto stabili. Contengono sempre nuove versioni dei programmi e un nuovo kernel. Tra un anno, questa funzionalit\u00e0 sperimentale potrebbe diventare parte delle versioni aggiornate di RHEL, SLES o Ubuntu. <\/p>\n<p>Quindi, se qualcosa non funziona su una distribuzione sperimentale, \u00e8 un'opportunit\u00e0 per approfondire il problema e risolverlo. Bisogna essere pronti al fatto che questa funzionalit\u00e0 apparir\u00e0 presto sui server di produzione degli utenti.<\/p>\n<p>L'elenco attuale delle distribuzioni ufficialmente supportate per la versione 3.0 pu\u00f2 essere consultato <noindex><a rel=\"nofollow\" href=\"https:\/\/helpcenter.veeam.com\/docs\/agentforlinux\/userguide\/system_requirements.html?ver=30\">qui<\/a><\/noindex>. Ma l'elenco reale delle distribuzioni su cui il nostro prodotto pu\u00f2 funzionare \u00e8 molto pi\u00f9 ampio.<\/p>\n<p>Personalmente, mi ha interessato l'esperimento con il sistema operativo \u00abElbrus\u00bb. Dopo aver aggiornato il pacchetto veeam, il nostro prodotto si \u00e8 installato e ha funzionato. Di questo esperimento ho scritto su Habr in <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/veeam\/blog\/447960\/\">articolo<\/a><\/noindex>. <\/p>\n<p>La supporto per nuove distribuzioni continua. Aspettiamo la versione 4.0. La beta dovrebbe arrivare presto, quindi seguiteci su <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 4.9.10 - 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 \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\" \/>\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\/it\/blog\/administrirovanie\/linux-mnogolikij-kak-rabotat-na-lyubom-distributive\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 4.9.10\" \/>\n\t\t<meta property=\"og:locale\" content=\"it_IT\" \/>\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 \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\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/it\/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 \u00e8 vario: come lavorare su qualsiasi distribuzione | ProHoster","description":"Creare un'applicazione per il backup che funzioni su qualsiasi distribuzione \u00e8 una sfida. Per garantire il funzionamento di Veeam Agent for Linux su distribuzioni da Red Hat 6 e Debian 6 a OpenSUSE 15.1 e Ubuntu 19.04, bisogna affrontare una serie di problemi, specialmente considerando che il prodotto include un modulo del kernel. L'articolo \u00e8 stato creato basandosi su materiali di una presentazione su","canonical_url":"https:\/\/prohoster.info\/it\/blog\/administrirovanie\/linux-mnogolikij-kak-rabotat-na-lyubom-distributive","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"it_IT","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 \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","og:url":"https:\/\/prohoster.info\/it\/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"},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/posts\/38929","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/comments?post=38929"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/posts\/38929\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/media\/29206"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/media?parent=38929"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/categories?post=38929"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/tags?post=38929"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}