# Container Linux

Container Linux (anche nota come CoreOS) era un sistema operativo open source auto-aggiornante, fondato nel 2013 e basato sul kernel Linux. Nel 2018 il progetto è stato acquisito da Red Hat che ha poi interrotto definitivamente i suoi sviluppi il 26 maggio 2020, migrando verso Fedora CoreOS, una particolare variante ufficiale di Fedora.

## Caratteristiche

È stato progettato specificamente per infrastrutture in cluster e si concentra sull'automazione, l'esecuzione di applicazioni tramite container, la sicurezza, l'affidabilità e la scalabilità. Come sistema operativo, Container Linux fornisce solo le funzionalità minime necessarie per la distribuzione di applicazioni all'interno di software container, insieme a meccanismi integrati per la scoperta di servizi e la condivisione delle configurazioni.
Container Linux condivide il sistema di base con Gentoo Linux, Chrome OS e Chromium OS, attraverso un kit di sviluppo (SDK) basato su Portage. Container Linux aggiunge nuove funzionalità a questo sistema per supportare l'hardware dei server. Container Linux è sviluppato da gennaio 2015, principalmente da Alex Polvi, Brandon Philips e Michael Marineau. Nuove pubblicazioni del sistema operativo avvengono con cadenza bi-settimanale.
Container Linux non fornisce alcun gestore di pacchetti per l'installazione di applicazioni, richiedendo invece che tutti i servizi vengano eseguiti all'interno di software container. Una instanza Container Linux sfrutta le funzionalità del kernel Linux per creare e configurare un numero elevato di software container, che possono essere considerati come singoli sistemi Linux isolati. In questo modo, la ripartizione delle risorse tra i container viene eseguita tramite istanze multiple degli spazi utente, anziché utilizzare un hypervisor e fornire macchine virtuali a pieno titolo. Questo approccio si basa sulle funzionalità dei "cgroup" e dei "namespace" del kernel di Linux che insieme forniscono capacità per limitare, gestire e isolare l'utilizzo delle risorse (CPU, memoria, I/O su disco, ecc.) dei processi.
Inizialmente, Container Linux usava esclusivamente Docker per eseguire software container per supportare un formato comune di creazione e distribuzione delle applicazioni. Nel dicembre 2014, CoreOS ha pubblicato e ha iniziato a sviluppare rkt (inizialmente pubblicato come Rocket) come alternativa a Docker, allo scopo di fornire un formato standard per le immagini dei container, la relativa definizione dell'ambiente di runtime contenitore e un protocollo per scoprire e recuperare le immagini. rkt implementa le specifiche AppC, che descrivone le proprietà richieste per le immagini dei contenitori di applicazioni (ACI); CoreOS ha avviato appc e ACI come un insieme indipendente di comandi guidati da specifiche volte a farli diventare parte dell'Open Container Initiative indipendente dal fornitore e dal sistema operativo (OCI, inizialmente denominato Open Container Project o OCP), che è stato annunciato nel giugno 2015.
Container Linux utilizza gli script di ebuild da Gentoo Linux per la compilazione automatica dei componenti di sistema, e utilizza systemd come sistema primario init con una stretta integrazione tra i meccanismi interni di systemd e di vari sistemi di Container Linux.

## Distribuzione aggiornamenti

Container Linux raggiunge la sicurezza e l'affidabilità aggiuntive dei propri aggiornamenti del sistema operativo impiegando FastPatch come schema a due partizioni per la parte di sola lettura della sua installazione, il che significa che gli aggiornamenti vengono eseguiti nel suo complesso e installati su una partizione di avvio secondaria passiva che diventa attivo su un riavvio o kexec. Questo approccio evita le possibili problematiche derivanti dall'aggiornamento solo di determinate parti del sistema operativo, garantisce un semplice rollback a una versione conosciuta per essere stabile del sistema operativo e consente a ciascuna partizione di avvio di essere firmata per una maggiore sicurezza. La partizione di root e il suo file radice vengono ridimensionati automaticamente per riempire tutto lo spazio disponibile su riavvii; mentre la partizione di root fornisce spazio di archiviazione di lettura e scrittura, il sistema operativo è montato in sola lettura sotto /usr. Per assicurarsi che solo una parte del cluster si riavvii contemporaneamente all'aggiornamento del sistema operativo, mantenendo in tal modo le risorse necessarie per eseguire applicazioni distribuite, CoreOS fornisce locksmith come gestore di riavvio per Container Linux. Utilizzando il locksmith, è possibile selezionare tra diverse strategie di aggiornamento determinate da come vengono eseguiti i riavvi come ultimo passo per l'applicazione degli aggiornamenti; ad esempio, può essere configurato il numero di membri di cluster che possono essere riavviati contemporaneamente. Internamente, il locksmith opera come il demone locksmithd che viene eseguito sui membri del cluster, mentre l'utility della riga di comando di locksmithctl gestisce i parametri di configurazione. Il locksmith è scritto nella lingua Go e distribuito sotto i termini della licenza Apache 2.0.
Il sistema di distribuzione degli aggiornamenti impiegato da Container Linux si basa sul progetto Omaha open-source di Google, che fornisce un meccanismo per lo sviluppo degli aggiornamenti e il protocollo di richiesta-risposta sottostante basato su XML. Inoltre, CoreOS fornisce CoreUpdate come dashboard web per la gestione di aggiornamenti a livello di cluster. Le operazioni disponibili tramite CoreUpdate includono l'assegnazione di membri di cluster a gruppi diversi che condividono le politiche di aggiornamento personalizzate, la revisione delle configurazioni di Container Linux a livello di cluster, l'arresto e il riavvio degli aggiornamenti e la revisione dei registri aggiornati registrati. CoreUpdate fornisce anche un'API basata su HTTP che consente la sua integrazione in utilità di terze parti o sistemi di distribuzione.

## Infrastrutture cluster

CoreOS sviluppa anche etcd, un daemon che esegue tutti i computer in un cluster e fornisce un registro di configurazione dinamica che consente di condividere facilmente e in modo affidabile i vari dati di configurazione tra i membri del cluster. Poiché i dati (coppie di chiavi e valori) immagazzinati in etcd vengono automaticamente distribuiti e replicati con elezioni master e consenso automatico utilizzando l'algoritmo Raft, tutte le modifiche dei dati memorizzati vengono riflesse su tutto il cluster, mentre la ridondanza raggiunta impedisce l'errore di singoli membri del cluster di causare perdita di dati. Oltre alla gestione delle configurazioni, anche la scoperta dei servizi consente di annunciare se stessi e dei servizi che offrono. La comunicazione con etcd viene eseguita tramite un'API REST-based, che utilizza internamente JSON via HTTP; l'API può essere utilizzata direttamente (per esempio tramite curl o wget) o indirettamente tramite etcdctl, un'utilità di riga di comando specializzata.
Container Linux fornisce anche il gestore cluster "fleet", che controlla le istanze systemd separate di Container Linux al livello del cluster. Dal 2017 "fleet" non è più attivamente sviluppato, essendo stato deprecato a favore di Kubernetes. Utilizzando "fleetd", Container Linux crea un sistema distribuito che unisce installazioni separate di nodi in un singolo cluster; internamente il daemon "fleetd" comunica con le istanze systemd locali su D-Bus e con l'implementazione di etcd attraverso l'interfaccia HTTP. L'utilizzo di fleetd consente la distribuzione di software container singoli o multipli in ambito cluster, con opzioni più avanzate, tra cui ridondanza, failover, distribuzione a membri del cluster specifici, dipendenze tra i contenitori e distribuzione distribuita di contenitori. Una utility di riga di comando chiamata fleetctl è usata per configurare e monitorare questo sistema distribuito init; internamente, comunica con il demone fleetd utilizzando un'API basata su JSON via HTTP, che può anche essere utilizzata direttamente. Quando viene utilizzato localmente in un membro del cluster, fleetctl comunica con l'istanza locale fleetd tramite uno Unix socket locale; quando viene utilizzato da un host esterno, viene utilizzato tunneling SSH con l'autenticazione fornita tramite chiavi SSH pubbliche.
Tutti questi software (etcd, etcdctl, fleetd e fleetctl) sono scritti nel linguaggio Go e distribuiti sotto i termini della licenza Apache 2.0.

## Distribuzione

Quando si esegue su hardware dedicato, Container Linux può essere installato in modo permanente per l'archiviazione locale, ad esempio un disco rigido (HDD) o un'unità SSD o avviato in remoto su una rete utilizzando l'ambiente di esecuzione preboot (PXE) in generale o iPXE come una delle sue implementazioni CoreOS supporta inoltre le piattaforme di virtualizzazione hardware, tra cui Amazon EC2, DigitalOcean, Google Compute Engine, Microsoft Azure, OpenStack, QEMU / KVM, Vagrant e VMware.
Il contenitore Linux può anche essere distribuito attraverso la sua distribuzione commerciale denominata Tectonic, che integra inoltre Kubernetes di Google come un'utilità di gestione dei cluster. A partire da aprile 2015, Tectonic è previsto per essere offerto come software beta per selezionare i clienti. Inoltre, CoreOS fornisce Flannel come componente che implementa una rete di sovrapposizione richiesta principalmente per l'integrazione con Kubernetes.
A partire da febbraio 2015, Container Linux supporta solo l'architettura x86-64.