I comandi Linux: i package | ALTRI capitoli | |||
Il codice sorgente (source code) Il codice sorgente è il codice di un programma scritto, dal programmatore, in un qualche linguaggio di programmazione, come una sequenza di istruzioni espresse in un linguaggio umano, come espressioni testuali. Il codice sorgente è comprensibile al programmatore, ma incomprensibile a qualsiasi processore. Per poter essere compreso da un processore, il codice sorgente deve essere tradotto in linguaggio macchina (codice oggetto). Questa traduzione viene eseguita da un compilatore. Il linguaggio macchina è comprensibile al processore, ma incomprensibile all'uomo. In senso stretto, un file binario è un file non codificato come testo, quindi non leggibile. Normalmente, però, con il termine "binario" si intende indicare un file che è stato compilato, contenente codice eseguibile dal processore. Un file che contiene codice eseguibile, però, non sempre è un file direttamente eseguibile, come nel caso delle librerie, che contengono codice binario compilato, la cui esecuzione, però, deve essere attivata da un programma esterno. Un file binario che può essere eseguito come programma standalone è un file eseguibile ( "executable" ). Un package è un archivio di file, composto o da file binari eseguibili precompilati, oppure da file di codice sorgente. "Un archivio è un singolo file, che contiene un certo numero di altri file. Esistono diversi programmi che creano archivi di file, ma il procedimento è simile per tutti questi programmi: salvare in sequenza tutti i file da archiviare, creare un indice (index) che contenga l'offset, la lunghezza, il nome ed altre proprietà dei file originali, così da renderne possibile l'estrazione". Per poter accedere ai file archiviati in un package, è necessario scompattare (de-archiviare) il package. "Esistono molte distribuzioni del sistema operativo Linux che si occupano di trovare, scaricare, impostare i package software più diffusi. Molte distribuzioni arrivano anche a compilare i package, mettendo a disposizione degli utenti direttamente i file binari (eseguibili). Tra i vantaggi di questa tendenza, troviamo una maggiore velocità di installazione, la comodità di avere una sola fonte di approvvigionamento software, la costante offerta di aggiornamenti rilevanti, soprattutto nel campo della sicurezza. Tuttavia, le varie distribuzioni Linux non includono le versioni più recenti del software. Se pensate di aver bisogno della versione più recente di un software, potrebbe essere necessario compilarlo voi stessi. Inoltre, il software, solitamente, è altamente personalizzabile, in fase di installazione, permettendo all'utente di escludere quelle funzionalità di cui non avrà mai bisogno. Una distribuzione Linux, dovendosi rivolgere ad una vasta platea di utilizzatori, tenderà sempre ad includere, nella versione precompilata del software, tutte le funzionalità esistenti. Voi, in qualità di utilizzatori finali, dovreste essere in grado di tarare al meglio un'applicazione, conformemente alle vostre esigenze, compilandola voi stessi. Però, attenzione: le distribuzioni Linux, normalmente, includono un software, chiamato package manager, che mantiene un database di tutto il software installato nel sistema. Non è una buona idea installare o modificare il software aggirando il package manager del vostro sistema operativo, perchè potreste incorrere in molti problemi, in futuro. Leggete la documentazione relativa al vostro package manager installato, per capire come installare nuovo software, senza mettere in confusione il vostro package manager. Normalmente, il vostro package manager vi chiede di scrivere le specifiche del package da installare, per poi compilarlo ed installarlo usando il vostro package manager." (Beginner's Guide to Installing from Source ). Il comando tar crea archivi di file ed estrae file dagli archivi. Il formato .tar dei file di archivio è il formato più diffuso, soprattutto nelle comunità open-source. L'acronimo tar indica: tape archive, ma tar lavora anche su disco. Gli archivi tar memorizzano, dei file originali, i nomi, i proprietari ( owner id ) ed i permessi. L'identificativo (ID) del proprietario del file è, spesso, inutile, come informazione, a meno che l'archivio non venga creato nella stessa macchina in cui verrà, poi, scompattato. Il comando tar non esegue alcuna compressione dei file da archiviare, ma normalmente, i file archivio, dopo essere stati creati, vengono compressi, utilizzando una generica applicazione di compressione, quale: gzip, che genera file con estensione:
o:
oppure, bzip2, che genera file con estensione:
oppure, ancora, xz, che genera file con estensione:
A volte, i file archivio vengono distribuiti in formato zip, un formato più comune in ambiente DOS o Windows, oppure in stretta relazione con Java. Il formato zip opera come una combinazione di tar e gzip, usando la stessa compressione di quest'ultimo, ma con un suo indice interno. I file zip non conservano gli ID dei proprietari ( owner id ) ed i permessi associati ai file. Per decompattare file archivio zip, è necessario ricorrere al comando unzip (Beginner's Guide to Installing from Source ). Il comando tar ha subito, nel tempo, molte implementazioni: questo significa che le opzioni disponibili sulla riga di comando variano considerevolmente, a seconda della versione che state usando. Anche le funzionalità disponibili dipendono dalla versione in uso: per esempio, alcune versioni possono rilevare se il file archivio è stato compresso e, in caso di risposta positiva, eseguire automaticamente la decompressione, mentre altre versioni richiedono le selezione dei parametri da passare alla linea di comando, per poter gestire la decompressione, mentre altre versioni ancora richiedono che il file archivio venga decompresso prima di passarlo a tar. Per esempio, eseguite il seguente comando, in una delle seguenti versioni, tutte equivalenti tra loro:
per estrarre i file dall'archivio ARCHIVE.tar.gz. Dovrebbe funzionare per file compressi con gzip e con bzip. È possibile, comunque, specificare il tipo di (de)compressione da attuare:
È possibile anche eseguire la decompressione prima, utilizzando il programma adatto al tipo di file, per poi passare il file decompresso a tar:
Il primo argomento di tar è sempre una funzione, a seconda di ciò che deve essere fatto, e rappresenta un'operazione da eseguire su uno o più file, tra:
dove:
appende file tar ad un archivio esistente. Il file ( o i file ) posti alla fine della riga di comando (file.tar, nel nostro esempio ) verrà appeso all'archivio segnalato dall'opzione --file (Tofile.tar.gz, nel nostro esempio). Una delle operazioni fondamentali di tar è, ovviamente, la creazione di un archivio:
In questo esempio, stiamo chiedendo a tar di creare l'archivio afiles.tar, immettendovi i 3 file apple angst aspic. Il comando tar lavora nella directory corrente. È molto importante, quindi, assicurarsi, prima di eseguire questo comando, che la directory corrente non contenga già un archivio con lo stesso nome del nuovo archivio: tar, infatti, in fase di creazione del nuovo archivio, sovrascriverà l'eventuale file archivio già presente nella directory corrente, se esistente, senza chiedervi alcuna conferma, cancellandone, quindi, il contenuto preesistente. Allo stesso modo, in fase di estrazione, tar sovrascriverà tutti i file preesistenti nella cartella corrente, che abbiano lo stesso nome di uno dei file contenuti nell'archivio in fase di estrazione. Per precauzione, è meglio evitare l'utilizzo di opzioni che spingano tar ad operare in directory diverse dalla corrente, quali:
oppure:
che chiede a tar di utilizzare i percorsi assoluti, nel nome dei file da estrarre, se esistenti. Quando tar estrae i file di un archivio, elimina la slash iniziale del percorso del file:
in modo da rendere il nome del file relativo alla directory corrente e non assoluto. Quindi, se nell'archivio fosse memorizzato il nome:
tar lo estrarrebbe nominandolo:
a meno che non utilizziate l'opzione -P (-absolute-names) e a patto che il nome del file fosse memorizzato con il percorso assoluto. Perchè tar elimina, di default, la slash iniziale nel nome dei file anche in fase di creazione dell'archivio. Il file:
verrebbe archiviato come:
a meno che non utilizziate l'opzione -P (-absolute-names). Un effetto non secondario della tendenza di tar a lavorare nella directory corrente è che un comando come il seguente:
che chiede a tar di archiviare tutti i file presenti nella directory corrente nel file archivio foo.tar, potrebbe generare un loop infinito, in alcune implementazioni di tar, proprio perchè l'archivio foo.tar dovrebbe contenere anche l'archivio stesso in costruzione. L'implementazione GNU di tar, invece, escluderebbe l'archiviazione del file archivio, avvisando l'utente:
È possibile archiviare anche le directory, specificandone il nome a tar, tra i nomi degli altri file. Se uno dei nomi di file del nostro ultimo esempio fosse una directory, per esempio:
la directory verrebbe archiviata con tutto il suo contenuto e, ad ogni estrazione, verrebbe ricreata con tutto il suo contenuto di file. Per esempio, la directory:
identifica l'intero filesystem. È anche possibile creare un archivio vuoto, dicendo a tar di prelevare i nomi dei file da inserire nel nuovo archivio da un file esterno, specificando come nome del file esterno un file senza nome:
per poi archiviare i file in un secondo tempo, usando l'operazione append:
Attenzione: usando append per aggiungere un file ad un archivio, se il file ha lo stesso nome di un file già presente nell'archivio, il vecchio file non verrà sovrascritto, poichè tar permette di conservare più copie di uno stesso file. Alcune operazioni di tar trattano i file di un archivio che abbiano lo stesso nome come qualsiasi altro file. Altre operazioni di tar, invece, trattano questi file multipli in modo non sempre adeguato alle nostre esigenze: per esempio, quando si chiede a tar di eseguire l'estrazione dei file di un archivio:
tar estrarrà, di un file di cui esistano più versioni, solo la versione aggiunta all'archivio più recentemente. Questo accade perchè tar estrae i file di un archivio nello stesso ordine in cui i file furono archiviati: in questo modo, la versione più vecchia di un file verrà estratta per prima, ma verrà immediatamente sostituita, all'interno della directory corrente, dalla versione più recente, che verrà estratta dopo. Se si desidera estrarre solo la versione più vecchia, quindi la versione archiviata per prima, occorre utilizzare l'opzione:
Nel caso i file con nome identico fossero più di due, è possibile specificare quale versione estrarre:
Nel dubbio sul contenuto di un file archivio, è possibile elencarlo:
È possibile anche specificare uno o più file da selezionare:
In questo caso, tar elencherà solo il file o i file specificati (apple e aspic, nel primo esempio, apple nel secondo). Attenzione: poichè tar memorizza l'intero nome di un file, comprensivo del percorso da attraversare per raggiungerlo, percorso relativo alla directory in cui l'archivio è stato creato, sarà necessario specificare, nella ricerca, il nome del file completo. Nel nostro esempio, il comando corretto dovrebbe essere simile al seguente:
Oppure, il seguente:
che utilizza i globbing patterns, segnalati a tar dall'opzione --wildcards. Chiedendo una maggiore verbosità, tar pubblicherà anche le informazioni sui file:
Se si indica il nome di una directory, invece che il nome di un file, tar agirà su tutti i file presenti in quella directory (comprese le sottodirectory). Nell'usare le opzioni, ricordarsi che la sintassi esatta di tar è la seguente:
dove il primo argomento deve essere la funzione che si desidera eseguire sul file, il secondo argomento è l'insieme delle opzioni, nel nostro esempio:
il terzo argomento è l'insieme dei percorsi da cercare:
a partire, come già visto, dalla directory corrente. Per estrarre un intero archivio, è sufficiente indicare a tar il file archivio su cui operare:
Per estrarre uno o più file di un archivio, invece, si dovranno indicare a tar i nomi dei file da estrarre, così come riportati dall'opzione:
oltre al nome dell'archivio su cui operare:
Nell'estrazione, tar creerà l'intera struttura di direcory e file salvati nel file archivio. Nel caso dell'ultimo esempio, quindi, all'interno della directory corrente, in cui è salvato il file archivio, dopo la richiesta di estrazione dei due file, troveremo le seguenti directory ed i seguenti file:
È possibile modificare questo comportamento di tar e salvare i file o il file estratto in una cartella superiore, per esempio nella cartella corrente:
In entrambi i casi, il file aspic verrà salvato nella directory corrente, perchè l'opzione strip, o strip-components, ha chiesto a tar di togliere dal nome completo del file 2 componenti, in questo caso home e myself. Attenzione: eventuali file già esistenti nella directory corrente o in una delle sottodirectory, verranno sovrascritti da tar, senza una preventiva verifica delle date di modifica, sempre che abbiano lo stesso nome dei file estratti. Se desideriamo che il contenuto del file o dei file estratti venga anche stampato sullo standard output (solitamente, lo schermo), basterà indicarlo a tar con l'opzione -O (lettera O maiuscola):
Al giorno d'oggi, la quasi totalità dei programmi hanno bisogno di utilizzare funzioni contenute in applicazioni o librerie di codice esterne. In linguaggio Linux, queste funzioni esterne vengono chiamate dipendenze: senza di esse, il nuovo programma non è in grado di funzionare correttamente. Le dipendenze esistono in tutti i sistemi operativi, Windows compreso. Spesso, un programma, installato in un sistema Windows, non funziona correttamente perchè non trova una libreria di funzioni particolare, dalla quale il programma dipende. Per evitare le dipendenze, un programmatore dovrebbe includere, nel codice sorgente del suo nuovo programma, tutte le funzioni necessarie al suo funzionamento, anche quelle funzioni che un qualche altro programmatore ha già scritto e messo a disposizione di tutti, in una qualche libreria di sistema. In ambiente Linux, queste librerie sono, solitamente, salvate nelle directory:
Ipotizziamo che desideriate installare il package chiamato "unrar", un package che scompatta i file compressi
Questo significa che il programma "unrar" deve trovare già installati questi tre package ( nelle versioni indicate ). In caso contrario, l'installazione di "unrar" verrebbe interrotta, oppure completata, ma con conseguenze sul corretto funzionamento del programma stesso. E' ovvio che anche ciascuno dei package indicati come dipendenze per "unrar" prevede le sue dipendenze. Quindi, se uno dei tre package non fosse già installato nel sistema, dovrebbe essere immediatamente installato, con tutte le sue eventuali dipendenze. Com'è facile intuire, il processo di installazione di un solo package potrebbe richiedere, in via preventiva, l'installazione di molti altri package. Chi mantiene le informazioni sulle dipendenze di ciascun package? Ovviamente, l'autore del package. Dove scrive, l'autore, queste informazioni? In un file README o INSTALL, contenuto nel package. Le dipendenze vanno installate, manualmente, una per una? Non necessariamente. Esistono, infatti, alcuni programmi che fanno esattamente questo mestiere: gestiscono i package, sia quelli installati nel sistema, sia quelli da installare, e si occupano della loro installazione e rimozione, preoccupandosi di installare o rimuovere eventuali dipendenze. Questi programmi si chiamano Package Management System. Se il package da installare è rilasciato da una distribuzione Linux, solitamente viene messo a disposizione nelle due versioni: come package binario precompilato, oppure come package contenente i file sorgente ( testuali ). Nel primo caso, l'installazione può essere eseguita da un programma chiamato Package Management System, sempre compreso nella distribuzione. Nel secondo caso, invece, prima dell'installazione dovremo preoccuparci della compilazione dei file sorgente. Un Package Management System è un vero e proprio sistema di gestione dei package. Ciascuna distribuzione Linux ha il suo Package Management System preferenziale. Un Package Management System prevede l'esistenza di server, i repository, sui quali i curatori della distribuzione Linux si preoccupano di far trovare tutti i package disponibili per quella distribuzione particolare. Quindi, installare nuovi package utilizzando un Package Management System e i repository ufficiali offre una certa garanzia di qualità e sicurezza, visto che il materiale presente sui repository dovrebbe essere stato verificato dalla comunità Linux, responsabile di una determinata distribuzione. Non solo: i repository conterranno sempre la versione più aggiornata di un particolare package, dando, così, la possibilità al vostro Package Management System preferito di occuparsi anche dell'aggiornamento del vostro sistema. Ma, non sempre sarà possibile reperire un package sui server di una distribuzione Linux. A volte, sarete costretti a scaricare un package manualmente, senza l'ausilio del vostro Package Management System preferito. In questo caso, dovrete decidere quale programma usare per installare quel package nel vostro sistema.
Verificare l'integrità di un nuovo package Solitamente, per scaricare un package, che è un archivio di file, sul proprio computer, si utilizza un browser web. Questi download, solitamente, vengono effettuati utilizzando il protocollo HTTP, oppure il datato protocollo FTP. Nei sistemi Linux, è possibile utilizzare anche uno dei due comandi a riga di comando:
che utilizzano gli stessi protocolli. I siti che ospitano package software molto richiesti si servono, spesso, di siti mirror (specchio), sparsi per il mondo, in cui installano copie dei file di package. Questo, per due motivi: per risparmiare banda, da parte dell'autore del package, e per permettere download più veloci agli utenti. Nel sito originale, solitamente, viene mantenuto un elenco di questi siti mirror disponibili. I protocolli HTTP e FTP sono protocolli di rete che permettono a soggetti terzi di intercettare e modificare i dati in transito. I siti mirror, invece, potrebbero non contenere gli stessi file ospitati sul server originale, poichè un soggetto terzo potrebbe averli modificati. Occorre, quindi, verificare che ciò che si è scaricato nel proprio computer è esattamente ciò che l'autore del package voleva che si scaricasse. (Beginner's Guide to Installing from Source ). Questa verifica dovrebbe garantire sia l'integrità del file, sia l'identità di chi lo invia. La prima viene verificata attraverso una funzione di hash che crea la cosiddetta impronta digitale ( fingerprint, oppure digest, oppure checksum ), mentre la seconda viene verificata attraverso il cosiddetto certificato digitale. Gli algoritmi per la creazione di un digest ( o checksum ) hanno molto in comune con le tecniche di cifratura dei messaggi, ma il loro scopo è verificare che il messaggio non sia stato modificato. Per questo motivo, il risultato di una funzione di hash non è mai reversibile. Anche se lo stesso messaggio produrrà sempre lo stesso risultato ( digest, checksum ), almeno nei casi in cui si utilizzi lo stesso algoritmo, quale MD5, dal risultato finale ( digest ) sarà impossibile risalire al messaggio originale. Quindi, una funzione di hash MD5 applicata su una stringa vuota produrrà sempre lo stesso risultato ( impronta digitale ), dal quale, però, sarà impossibile risalire alla stringa vuota:
I siti che ospitano i file dei package (repository) rendono pubbliche le checksum (digest) di ciascun archivio di file ospitato sul server. Queste checksum vengono conservate in file chiamati md5sum. Per verificare l'integrità di un package appena scaricato, dovremo eseguire su di esso una funzione di hash, che dovrà restituirci la stessa checksum ( digest ) contenuta nel file md5sum scaricato dal server del repository:
oppure:
Se l'impronta digitale ( checksum ) del file archivio appena scaricato è identica all'impronta digitale dichiarata dal server in cui è ospitato il file originale, allora il file appena scaricato è identico al file originale. È importante che il file md5sum, dal quale prelevare la checksum del file di package originale, venga scaricato, possibilmente con protocollo HTTPS (SecureHTTP), dal server originale (repository) e non da uno dei suoi server mirror. Il file md5sum, a volte, contiene le checksum di più package, con un elenco di coppie:
In questo caso, si potrà eseguire il comando:
che eseguirà il calcolo della checksum di ciascun file elencato nel file md5sum presente nel computer locale e confronterà il risultato con il valore riportato nel file md5sum. Una volta appurato che il file archivio appena scaricato è identico al file archivio originale, come posso appurare che il soggetto che mi ha inviato il file archivio sia davvero chi dice di essere, cioè l'autore del file archivio? Solitamente, l'autore di un package appone anche la sua firma digitale sul file del package, in modo che chiunque possa verificare la sua identità. Nel caso di un package, l'autore dovrebbe criptare l'intero file archivio, usando la sua chiave di cifratura privata. In un sistema di cifratura a chiave pubblica, ciò che viene criptato utilizzando la propria chiave pubblica può essere descriptato utilizzando la propria chiave privata, mentre ciò che viene criptato utilizzando la propria chiave privata può essere descriptato utilizzando la propria chiave pubblica. Quindi, se l'autore del package criptasse il file archivio utilizzando la sua chiave di cifratura privata, l'utente, per poter utilizzare quel file, dovrebbe decriptarlo, utilizzando la chiave pubblica del suo autore. Se l'operazione di decifratura dovesse riuscire, l'utente avrebbe anche la conferma dell'identità dell'autore del package. La soluzione di criptare l'intero file archivio, tuttavia, renderebbe l'intero meccanismo un po' complicato, viste le dimensioni dei file archivio e vista la complessità del sistema di crittografia a chiave pubblica, che comporterebbe un dispendio di risorse e di tempo poco auspicabile. La soluzione universalmente adottata, quindi, per la firma digitale dei package è la seguente: l'autore del package calcola l'impronta digitale ( checksum o digest ) del file archivio e appone la sua firma digitale solo sull'impronta digitale, criptandola utilizzando la sua chiave privata e salvando l'impronta digitale criptata in un file (di dimensioni ridottissime, a questo punto) che ha lo stesso nome del file archivio, ma estensione asc o sig (signature). L'utente, a sua volta, dovrà scaricare, oltre al file archivio, anche il file contenente la firma digitale, recuperare il certificato digitale dell'autore del package, contenente la sua chiave pubblica, importare la chiave pubblica appena recuperata nel suo file keyring pubblico:
e verificare la validità della firma digitale contenuta nel file con estensione asc o sig:
La verifica consiste nel decriptare il file con estensione asc o sig, utilizzando la chiave pubblica dell'autore, recuperare, così, l'impronta digitale (checksum) del file archivio originale, calcolare l'impronta digitale del file archivio reale, appena scaricato, e confrontare il risultato con l'impronta digitale del file archivio originale, appena estratta dal file asc o sig. Quando un package viene installato da un Package Management System come APT, le verifiche dell'impronta digitale e della firma digitale vengono effettuate dal programma stesso, che si preoccupa di effettuare il download del certificato digitale originale. Se, al contrario, dovessimo installare manualmente un nuovo package, il recupero del certificato digitale del suo autore dovrà essere effettuato da noi. Invece di utilizzare il comando
il quale importa i certifcati nel file keyring del Package Management System APT. Da questo momento in poi, il vostro Package Management System sarà in grado di verificare automaticamente l'attendibilità del package ricevuto dal repository.
|
||||
I comandi Linux: i package | Le guide di .bit: contenuto originale |