GNU/Linux >> Linux Esercitazione >  >> Ubuntu

Creazione di applicazioni Linux a distribuzione incrociata con Flatpak

La frammentazione è stata un problema per un po' di tempo nell'ecosistema Linux. Oggi esiste una varietà di distribuzioni, con i propri gestori di pacchetti e le proprie nozioni su cosa consiste in un "sistema di base". Questo è noioso per gli sviluppatori di applicazioni:dopo aver creato pacchetti specifici per la distribuzione e aver mantenuto i repository, devono correggere eventuali bug specifici della distribuzione che potrebbero sorgere. Inoltre, a differenza delle piattaforme mobili come iOS e Android, le applicazioni Linux funzionano senza sandbox con accesso a tutte le funzionalità del sistema di base.

Per affrontare questi problemi, è stata proposta un'ampia varietà di soluzioni. In questo articolo daremo un'occhiata a Flatpak , un modo per distribuire le applicazioni ed eseguirle in una sandbox con restrizioni.

Cos'è Flatpak?

Flatpak è una tecnologia per la creazione, la distribuzione, l'installazione e l'esecuzione di applicazioni, destinata principalmente al desktop Linux. Consente alle applicazioni di raggruppare dipendenze e spedire con i runtime, in modo che le applicazioni non finiscano per dipendere dalle stranezze di una particolare distribuzione. Inoltre, aumenta la sicurezza delle applicazioni Linux isolandole in sandbox.

L'architettura di un'applicazione Flatpak è mostrata nel diagramma seguente:

Ogni applicazione Flatpak è supportata da un "runtime", che contiene le dipendenze di base utilizzate dalle applicazioni. Questi runtime sono condivisi tra le applicazioni. Più runtime e anche versioni diverse dello stesso runtime possono coesistere su un sistema contemporaneamente. In questo modo, le applicazioni hanno un sistema di base abbastanza coerente su cui fare affidamento.

Per creare applicazioni per questo runtime, vengono forniti runtime speciali chiamati SDK (Software Development Kit). Contengono strumenti come compilatori e intestazioni di sviluppo. Se la tua applicazione dipende da librerie non incluse nel runtime, devi compilarle con l'SDK, insieme alla tua applicazione.

Inoltre, ci sono "estensioni", che sono componenti aggiuntivi opzionali per runtime e applicazioni. Vengono spesso utilizzati per separare le informazioni di traduzione e debug dal runtime o dall'applicazione originali.

Uno degli obiettivi di Flatpak è aumentare la sicurezza delle applicazioni isolandole l'una dall'altra. Per impostazione predefinita, Flatpak fornisce un accesso molto limitato alle risorse del sistema host. Se non esplicitamente richiesto, le applicazioni non possono utilizzare la rete, accedere ai file sul sistema di base o parlare con servizi come X, DBus o Pulseaudio. Inoltre, i "portali" consentono l'accesso selettivo alle risorse tramite API di alto livello.

Installazione, comandi Flatpak e convenzioni di denominazione

Flatpak è disponibile nei repository della maggior parte delle distribuzioni. Su Arch Linux e Fedora, devi installare flatpak pacchetto per installare il flatpak comando, che ti aiuta a installare e creare applicazioni.

sudo dnf install flatpak # Fedora
sudo pacman -S flatpak # Arch

Gli utenti di Ubuntu non lo hanno nei repository predefiniti, quindi installarlo è un po' più complicato. Innanzitutto, devi aggiungere questo PPA al tuo sistema:

sudo add-apt-repository ppa:alexlarsson/flatpak

Quindi, puoi installare il pacchetto con:

sudo apt update
sudo apt install flatpak

Mentre il flatpak command può sicuramente aiutarti a creare applicazioni, non è il modo più conveniente. C'è un altro strumento, chiamato flatpak-builder , che ti consente di creare applicazioni Flatpak da un file JSON. (Discuteremo di questo strumento più avanti in questo articolo.) Puoi installare questo strumento con:

sudo dnf install flatpak-builder # Fedora
sudo pacman -S flatpak-builder # Arch
sudo apt install flatpak-builder # Ubuntu

Ora, per installare applicazioni o runtime, devi aggiungere repository all'elenco dei telecomandi di Flatpak. Questi telecomandi possono essere ospitati in una directory locale o online. I runtime/le applicazioni vengono identificati utilizzando un indirizzo DNS inverso, come com.booleanworld.foo . In alcune circostanze, potrebbe essere necessario specificare anche l'architettura e il "ramo" del runtime. Questo viene fatto con l'aiuto di una tripletta separata da barre, come com.booleanworld.foo/x86_64/1.3 .



Il flatpak comando di solito aggiunge software e repository per tutti gli utenti. Tuttavia, questo non è adatto per provare le cose, quindi useremo il --user flag per limitare tali modifiche solo all'utente corrente.

Ora che abbiamo le basi in atto, daremo un'occhiata ad alcune teorie sulla creazione di applicazioni Flatpak.

Struttura dell'applicazione Flatpak

Quando si raggruppa un'applicazione con Flatpak, viene creata automaticamente la seguente struttura di directory:

  • metadata :questo file contiene informazioni sull'SDK e sul runtime su cui verrà eseguita l'applicazione, oltre a un elenco di risorse di sistema di base a cui l'applicazione deve accedere.
  • files :questa directory contiene i file che compongono l'applicazione, inclusi i dati dell'applicazione. Il bin la sottodirectory all'interno di qui contiene gli eseguibili dell'applicazione.
  • export :questa directory contiene tutti i file a cui il sistema di base deve accedere. Gli esempi includono i dati AppStream, il .desktop file e l'icona dell'applicazione. Tutti i file inseriti qui devono essere preceduti dall'identificatore. Ad esempio, un file desktop può avere il nome com.booleanworld.foo.desktop .

Sebbene tu possa costruire questa struttura a mano, questo non è necessario. Flatpak ha strumenti per aiutarti a creare automaticamente questa struttura e richiede pochissima configurazione se hai un tipico progetto basato su autotools. Con i progetti non basati su autotools, di solito è necessario impostare la directory "prefisso" su /app per far funzionare le cose.

Prerequisiti

Le sezioni seguenti dell'articolo presentano alcuni esempi di creazione di applicazioni Flatpak. Come accennato in precedenza, le applicazioni richiedono un runtime per l'esecuzione e un SDK per il processo di compilazione. Pertanto, il primo passaggio consiste nell'aggiungere un repository da cui sono disponibili. Aggiungeremo il repository disponibile su sdk.gnome.org per il nostro uso.

flatpak remote-add --from gnome https://sdk.gnome.org/gnome.flatpakrepo --user

Per creare gli esempi seguenti, abbiamo bisogno di due runtime: org.freedesktop.Platform e org.gnome.Platform e due SDK: org.freedesktop.Sdk e org.gnome.Sdk . Qui abbiamo utilizzato le versioni 1.6 e 3.24 di Freedesktop e Gnome runtime/SDK.

flatpak install --user gnome org.freedesktop.Platform/x86_64/1.6
                             org.freedesktop.Sdk/x86_64/1.6
                             org.gnome.Plaform/x86_64/3.24
                             org.gnome.Sdk/x86_64/3.24

Quindi, controlla il repository flatpak-resources, che contiene tutte le risorse necessarie per seguire questo articolo.

git clone https://github.com/boolean-world/flatpak-resources
cd flatpak-resources

Nelle sezioni seguenti daremo un'occhiata a due esempi di creazione di applicazioni.

Costruire un “gattino”, un “gatto” leggero

In questa sezione impareremo come creare un'applicazione Flatpak di base. L'applicazione è una versione ridotta di cat comando, denominato kitten .

Innanzitutto, devi creare la struttura di directory di cui abbiamo discusso in precedenza. Il build-init comando può farlo per te. Devi assegnargli una directory di build, il nome della tua applicazione e l'SDK e il runtime da usare (in quest'ordine). Puoi anche aggiungere un "nome filiale" facoltativo, ma in questo esempio lo lasceremo fuori.

flatpak build-init kitten-build com.booleanworld.kitten
                                org.freedesktop.Sdk
                                org.freedesktop.Platform

Come accennato in precedenza, la directory dei prefissi delle applicazioni Flatpak è /app e devi creare il bin directory in esso. Quando vuoi eseguire un comando all'interno della directory build, usa il build comando:

flatpak build kitten-build mkdir -p /app/bin

Il prossimo passo è compilare kitten.c con gcc :

flatpak build kitten-build gcc kitten.c -o /app/bin/kitten

Quindi, puoi completare la build con build-finish . Il comando sarà kitten e deve accedere al filesystem dell'host (in modo da poter visualizzare qualsiasi file sul sistema host). Quindi, puoi completare la build con quei parametri impostati:

flatpak build-finish kitten-build --filesystem=host --command=kitten

Ora, se vuoi testare l'applicazione, devi installarla. Il primo passaggio consiste nell'esportare l'applicazione in un repository locale. Nel nostro esempio, la cartella del repository è my-repo :

flatpak build-export my-repo kitten-build

Successivamente, aggiungeremo il repository con il nome test-repo . Dal momento che non stiamo utilizzando firme GPG, informeremo Flatpak con il --no-gpg-verify interruttore.



flatpak remote-add --user --no-gpg-verify test-repo my-repo

Infine, puoi installarlo con:

flatpak install --user test-repo com.booleanworld.kitten

Ora puoi verificare se funziona eseguendo in questo modo:

flatpak run com.booleanworld.kitten ~/.bashrc

Se hai seguito correttamente tutti i passaggi finora, questo dovrebbe visualizzare il contenuto del tuo .bashrc file:

Congratulazioni per aver creato la tua prima app Flatpak!

Finora i passaggi sono stati abbastanza semplici, ma il build-finish il comando merita ulteriori discussioni. Questo è ciò che faremo nella prossima sezione.

Uno sguardo più approfondito al comando "fine costruzione"

Uno degli obiettivi primari di Flatpak è creare applicazioni sandbox e fornire solo un accesso minimo alle risorse del sistema host. Nell'esempio precedente, abbiamo consentito all'app "kitten" di accedere a qualsiasi file sul sistema con build-finish . Di seguito sono elencate le opzioni che puoi utilizzare per consentire l'accesso a varie risorse:

  • --filesystem={path}

Questo interruttore consente l'accesso a percorsi specifici sul sistema. Puoi fornire un percorso specifico (come /usr/share ). home consente l'accesso alla home directory dell'utente e host consente l'accesso a tutti i file del sistema. Inoltre, puoi anche rendere un percorso di sola lettura con :ro . Ad esempio, --filesystem=/usr/share:ro --filesystem=home consente l'accesso in sola lettura a /usr/share e accesso in lettura e scrittura alla home directory dell'utente.

  • --share={type}

Questo interruttore consente l'accesso a risorse particolari. I tipi più comunemente usati sono ipc e network , che consentono l'IPC e l'accesso alla rete. Nella maggior parte delle applicazioni GUI, --share=ipc viene utilizzato per il funzionamento della memoria condivisa X, il che migliora le prestazioni.

  • --socket={type}

Questo interruttore ti consente di utilizzare prese particolari. I tipi di socket a cui si accede più comunemente sono x11 , wayland e pulseaudio . I primi due vengono utilizzati dalle applicazioni per eseguire il rendering degli elementi della GUI e il secondo viene utilizzato per riprodurre l'audio tramite il demone Pulseaudio.

  • --device={device}

Ciò consente alle applicazioni di accedere selettivamente ad alcuni dispositivi. Molto spesso, dri viene utilizzato qui in modo che le applicazioni possano utilizzare il rendering OpenGL.

  • --talk-name={name} e --system-talk-name={name}

Questi switch consentono alle applicazioni di comunicare con servizi denominati tramite il bus di sessione e il bus di sistema di DBus.

  • --env={varname}={value}

Il env switch consente di esportare le variabili di ambiente. {varname} è il nome della variabile, che è impostato sul dato {value} .

Se un'applicazione richiede l'accesso a dconf, è necessario utilizzare le seguenti opzioni:

--filesystem=xdg-run/dconf
--filesystem=~/.config/dconf:ro
--talk-name=ca.desrt.dconf
--env=DCONF_USER_CONFIG_DIR=.config/dconf

Vedremo un esempio pratico che coinvolge queste opzioni in una sezione successiva.

Creazione automatica di applicazioni:flatpak-builder

Sebbene i passaggi coinvolti nella creazione di applicazioni Flatpak siano abbastanza semplici, è comunque noioso costruirli passo dopo passo. flatpak-builder è uno strumento che ti consente di creare applicazioni in modo dichiarativo con manifesti JSON. Finché il codice sorgente è strutturato secondo la "build API", il builder può compilare e installare applicazioni dagli archivi sorgenti. La maggior parte dei software basati su autotools sono già conformi all'API, quindi di solito non sono necessarie ulteriori configurazioni.

Un tipico file manifest di solito ha questo aspetto:

{
  "app-id": "com.booleanworld.kitten",
  "runtime": "org.freedesktop.Platform",
  "runtime-version": "1.6",
  "sdk": "org.freedesktop.Sdk",
  "command": "kitten",
  "finish-args": [
     "--filesystem=host"
  ],
  "modules": [
    {
      "name": "kitten",
      "sources": [
        {
          "type": "archive",
          "url": "https://opensource.example.com/kitten-0.0.1.tar.gz",
          "sha256": "38ecfd39b76a2505376f5a57ebcc7b19d35efaf9f8c724a24382c45aa1378018"
        }
      ]
    }
  ]
}

Come puoi vedere, questo file contiene le stesse informazioni che avevamo specificato in precedenza con vari comandi. Inoltre, contiene un elenco di moduli da costruire. Nell'esempio sopra, c'è un solo modulo. Se hai un'applicazione complessa che dipende da più moduli, dovresti elencarli tutti. Ad esempio, gnome-calculator dipende da mpc e mpfr e il manifest è simile a questo.

Sono supportati diversi tipi di sorgenti. Un altro tipo di sorgente popolare è git , e devi fornire l'URL del repository e, facoltativamente, il ramo che deve essere estratto.

Il manifest è molto potente e supporta l'impostazione di CFLAGS/CXXFLAGS, la ridenominazione dei file per l'esportazione e la rimozione di file non necessari. Nella prossima sezione analizzeremo un'applicazione pratica e impareremo come confezionarla per Flatpak.

Un esempio reale:il galculator per imballaggi

In questa sezione prenderemo galculator, una semplice applicazione calcolatrice e la costruiremo con flatpak-builder . Dobbiamo eseguire un po' di analisi per scoprire quali file devono essere rinominati o eliminati. Pertanto, come primo passo, faremo un'installazione di prova. Quindi, possiamo creare il manifest se necessario.

Poiché galculator è un'applicazione GTK, utilizzeremo il runtime e l'SDK di Gnome. Dovresti installarli ora se non l'hai già fatto. Inoltre, dovresti scaricare l'archivio sorgente da qui. (Abbiamo utilizzato la versione 2.1.4, che è l'ultima versione al momento della stesura di questo articolo.)

Trovare i file che dovrebbero essere esportati/eliminati

Dopo aver scaricato ed estratto l'archivio di origine, dovresti provare a compilarlo utilizzando l'SDK. L'SDK di Gnome contiene anche strumenti come bash, quindi puoi avviarlo utilizzando:

flatpak run --command=bash --filesystem=host --devel org.gnome.Sdk/x86_64/3.24

Ora, spostati nella directory dei sorgenti del galculator e usa l'incantesimo normale per compilarlo. Imposteremo la nostra directory dei prefissi su ~/galculator-test .

./configure --prefix=$HOME/galculator-test
make install

Ora puoi esplorare i file nel galculator-test directory. Come probabilmente puoi vedere, è necessario esportare i seguenti file:

  • Informazioni su AppStream in share/appdata/galculator.appdata.xml
  • Icone in share/icons
  • La voce desktop in share/applications/galculator.desktop

Sfortunatamente, non sono preceduti dal nome dell'applicazione. Pertanto, devi rinominarli con le seguenti proprietà nel manifest:

{
	"rename-appdata-file": "galculator.appdata.xml",
	"rename-icon": "galculator",
	"rename-desktop-file": "galculator.desktop"
}

Una volta rinominati questi file, flatpak-builder li esporterà automaticamente. Una volta creato il pacchetto Flatpak, questo aiuterà a creare voci di menu sul sistema di base.

Inoltre, il share/man e share/pixmaps le directory non sono necessarie, quindi puoi rimuoverle con:

{
    "cleanup": [
        "/share/man",
        "/share/pixmaps"
    ]
}

Configurazione della sandbox

Poiché si tratta di un'applicazione GTK, è necessario consentirle di accedere a X11 e Wayland e condividere i meccanismi IPC. Devi anche consentirgli di utilizzare il rendering OpenGL. Inoltre, galculator ha bisogno dell'accesso a dconf e devi aggiungere le voci di cui abbiamo discusso in precedenza. Gli switch, che sarebbero stati passati a build-finish sono elencati nel finish-args proprietà nel manifest:

{
    "finish-args": [
        "--share=ipc",
        "--socket=x11",
        "--socket=wayland",
        "--device=dri",
        "--filesystem=xdg-run/dconf",
        "--filesystem=~/.config/dconf:ro",
        "--talk-name=ca.desrt.dconf",
        "--env=DCONF_USER_CONFIG_DIR=.config/dconf"
    ]
}

Completamento del manifest

A questo punto, hai configurato la maggior parte delle parti importanti del manifest. La configurazione del resto dovrebbe essere abbastanza semplice e il manifest finale che abbiamo utilizzato è qui. Abbiamo aggiunto un set di build-options , che imposta CFLAGS e CXXFLAGS su -O3 .

Creazione e test dell'applicazione

Infine, possiamo creare l'applicazione. Esegui semplicemente flatpak-builder con una directory build e il manifest. In questo esempio, galculator è la directory di build e org.mnim.galculator.json è il file manifest.

flatpak-builder galculator org.mnim.galculator.json

Quindi, esportalo nel repository come abbiamo fatto in precedenza:

flatpak build-export my-repo galculator

Ora puoi testare l'applicazione installandola:

flatpak install --user test-repo org.mnim.galculator

L'applicazione viene immediatamente installata e ottieni persino voci sul desktop come una normale applicazione! Puoi avviarlo dalla voce di menu o eseguirlo con flatpak run come abbiamo fatto prima.

Distribuzione delle applicazioni

Ora che hai creato un'applicazione, come fai a distribuirla? Il modo più semplice per farlo è trasferire la directory del repository su un server e servirla sul Web. Quindi, puoi chiedere agli utenti di aggiungere il tuo repository al loro elenco e installare le applicazioni in questo modo.

Molte persone preferiscono installare software firmato con GPG, poiché dimostra che l'applicazione proviene effettivamente dal manutentore originale. Puoi creare facilmente chiavi GPG con il gpg2 comando:

gpg2 --quick-key-gen [email protected]

Assicurati di annotare l'ID della chiave poiché ti servirà in seguito. Nel nostro esempio, assumeremo che l'ID chiave sia A318C188C20D410A .

Quindi, puoi creare un repository firmato GPG durante l'esecuzione di build-export così:

flatpak build-export my-repo galculator --gpg-sign=A318C188C20D410A

Se disponi di un repository non firmato esistente, puoi firmarlo in questo modo:

flatpak build-sign my-repo --gpg-sign=A318C188C20D410A
flatpak build-update-repo my-repo --gpg-sign=A318C188C20D410A

Quando desideri pubblicare il repository, assicurati di fornire agli utenti una copia della chiave pubblica. Per esportare la tua chiave pubblica, esegui:

gpg2 --export A318C188C20D410A > public.gpg

Dovresti pubblicare questa chiave sul tuo sito web. Quando i tuoi utenti vogliono aggiungere il tuo repository, dovrebbero scaricare la chiave pubblica. Se l'utente ha scaricato una chiave denominata public.gpg , ora possono aggiungere il repository eseguendo:

flatpak remote-add --gpg-import=public.gpg test-repo https://software.example.com/repo/

Tuttavia, questo metodo è estremamente scomodo per gli utenti. Fortunatamente, puoi semplificare il processo creando file flatpakref e flatpakrepo, che sono discussi in dettaglio nella documentazione.

Conclusione

In questo articolo abbiamo appreso di Flatpak e di come distribuire software utilizzando questa nuova tecnologia. È più orientato alla sicurezza e offre migliori capacità di integrazione e aggiornamento rispetto ai metodi tradizionali come AppImage.

Se sei interessato a leggere di più su questo argomento, la documentazione per gli sviluppatori e il flatpak-manifest la pagina man sono buoni punti di partenza. Se vuoi leggere esempi più complessi di file manifest/flatpakref, dai un'occhiata al repository Gnome-apps e agli esempi Flathub.


Ubuntu
  1. Installa app su Linux con Flatpak

  2. Installa Linux con LVM

  3. Flatpak su Linux:cos'è e come installare app con esso

  4. Come avviare le applicazioni di avvio con un ritardo su Linux

  5. Puoi sviluppare applicazioni Linux con Xamarin?

Ordina il comando in Linux con esempi

Comando IP Linux con esempi

Comando 11 Strace con esempio in Linux

w Comando spiegato con esempi in Linux

Come installare applicazioni Linux offline con Cube

Come installare Flatpak su Linux Mint 20