Visualizzazione post con etichetta sistema. Mostra tutti i post
Visualizzazione post con etichetta sistema. Mostra tutti i post

lunedì 22 febbraio 2010

Creare pacchetti .deb da sorgente

Creare un pacchetto .deb dai sorgenti, e' un'operazione d'obbligo se vogliamo avere un'installazione tracciabile dei nostri programmi.
Problema: Seguiamo un progetto e suoi sviluppi, e dobbiamo compilare i sorgenti per ottenere gli eseguibili. In questo caso compilando i sorgenti non possiamo tenere d'occhio tutti i file installati nel sistema dal file di configurazione in fase di compilazione. E siamo costretti a tenere la directory di compilazione per un'eventuale disinstallazione.
La soluzione e' la creazione di un pacchetto. Ogni distribuzione ha un suo formato di cui i piu' diffusi sono sicuramente i .deb (Debian e derivati, quindi anche Ubuntu), e .rpm (OpenSuse e derivate). Per una conversione tra i due formati si puo' utilizzare alien, di cui abbiamo gia' parlato, ma qui discuteremo la creazione ex-novo di un pacchetto avendo solamente i sorgenti. Lo so, in giro per la rete si trovano migliaia di guide su come creare pacchetti, ma qui voglio approfondire l'argomento, dato che l'operazione di impacchettamento non e' univoca, e ci possono essere svariati problemi, dipendenti dal linguaggio utilizzato, e dal toolkit di compilazione.
Per aver un maggior controllo sulla creazione del pacchetto, vediamo innanzittutto la sua struttura.
All'interno di un file .deb, sono contenuti un file "debian-binary" (che specifica la versione del formato Deb), e due tarball:
control.tar.gz
data.tar.gz
L'archivio control.tar.gz contiene informazioni riguardanti il pacchetto, le sue dipendenze e gli script che vengono lanciati per l'installazione o la rimozione. In particolare il file "control" contiene informazioni come il nome del pacchetto, la sua versione, la priorita', l'architettura, le dipendenze, ecc.

L'archivio data.tar.gz, contiene tutti i file che effettivamente verranno installati nel sistema. Quindi, per prima cosa, si devono compilare i sorgenti e nel caso in cui il programma sia scritto in Python, si puo' procedere subito alla creazione del pacchetto.
A questo punto possiamo utilizzare due strade.

  • La prima e' creare la struttura richiesta da un file .deb, manualmente, creando il file control e le directory necessarie:
dirPacchetto/DEBIAN/control
La directory DEBIAN, va creata all'interno del directory dirPacchetto, al cui interno verra' creato il file "control", editato seguendo le specifiche spiegate sopra.

dirPacchetto/usr/bin
All'interno di questa directory, ci deve trovare posto l'eseguibile principale, contenente la classe main.py
dirPacchetto/usr/share
All'interno vi possono essere create 3 directory opzionali: "application", "doc", "nomeProgramma"
Se presenti, in "doc", ovviamente ci saranno tutti i file di documentazione, nonche' le licenze d'uso e d'installazione.
In "Application", ci sara' il file nomeProgramma.desktop che specifica dove mettere il collegamento al programma nel menu di sistema.
E la directory "nomeProgramma", conterra' ovviamente tutti i file componenti il programma, in questo caso, si deve modificare la directory dirPacchetto/usr/bin, inserendo un file testo "nomeProgramma", contenente 3 righe, e che va reso eseguibile:
#!/bin/bash
cd /usr/share/nomeProgramma #prova è il nome del programma
env python Main.py #Main.py è la classe main del programma nomeProgramma.

  • La seconda opzione per creare la struttura necessaria alla creazione del pacchetto, e' utilizzare un comando (dh_make), che creera' per noi tutto quello che e' necessario, e che si potra' poi modificare in base alle nostre esigenze.
Innanzitutto ci servono dei tool di sviluppo, che installeremo con il seguente comando:

sudo apt-get install dpkg-dev dh-make

Creiamo una directory con il nome del programma seguito dal numero di versione (per fare un'esempio, "mypaint-0.80") e vi copiamo all'interno il file tar.gz contenente i sorgenti. Scompattiamo il file tar.gz all'interno della directory creata.
A questo punto tramite il comando "cd", ci portiamo all'interno della directory e diamo un comando del tipo:

dh_make -e lomdav@tin.it -c GPL -f NomeDelFile.tar.gz

Le opzioni che abbiamo usato del comando dh_make sono:
-e specifica l'indirizzo email del maintainer (colui che ha creato il pacchetto)
-c specifica la licenza di distribuzione (in questo caso la licenza GPL, e' pienamente libera, e intende la ridistribuzione dei sorgenti per future modifiche).
-f specifica la tarball contente i sorgenti.

Il comando dh_make ci chiedera' il tipo di pacchetto se non specificato tramite opzioni sulla riga di comando (per esempio -s per binario singolo), che puo' essere di diversi tipi:
singolo, multiplo, libreria, modulo kernel o cdbs.
Il caso piu' comune e' che il programma sia un singolo binario.
Per creare il pacchetto si utilizzera' il comando:
dpkg-deb -b directoryProgramma nomeProgramma_versione_architettura.deb
Il formato del nome del pacchetto include oltre al numero di versione, anche l'architettura del sistema per cui e' stato compilato il sorgente, tipo i386, i686, amd64, oppure all (se e' indipendente dal processore utilizzato).

Nota bene: come mi ha fatto notare Sandro, se si vuole appronfondire l'argomento e' bene che si legga il Debian Policy Manual, disponibile anche in Italiano.

giovedì 21 gennaio 2010

Gestire il crash dei dati.

Essenzialmente, i malfunzionamenti dei dischi rigidi sono di due tipi:

* Quelli prevedibili, in cui i malfunzionamenti, specialmente dovuti all'usura o all'invecchiamento, si manifestano gradualmente. Un sistema di monitoraggio può individuarli, come la spia della temperatura nella strumentazione di un'automobile può mettere in guardia il guidatore — prima che accadano seri danni — che il motore sta cominciando a surriscaldarsi.
* Quelli imprevedibili, dove i malfunzionamenti accadono improvvisamente e senza preavviso, come nel caso di un componente elettronico che si brucia.

Il monitoraggio di un disco rigido può predire circa il 60% dei possibili malfunzionamenti. S.M.A.R.T. ha lo scopo di avvisare l'utente o l'amministratore di sistema che il disco rigido sta per guastarsi, in modo che questi abbia il tempo di copiare i dati su un altro dispositivo di archiviazione.

http://it.wikipedia.org/wiki/Self-Monitoring,_Analysis_and_Reporting_Technology

Cinque giorni fa.....dopo un certo tempo la cpu comincia a caricarsi inspiegabilmente, la luce che indica lo stato di lavoro dell'hard-disk sempre accesa e le applicazioni di una lentezza esasperante...tipico comportamento da Windows affetto da virus (pero' io utilizzo linux) oppure si poteva ipotizzare un ipotetico bug nel sistema dovuto all'utilizzo dell'ext4 in condizioni estreme (memoria residua 0kb)....in entrambi i casi, ho deciso di formattare e reinstallare il sistema avendo l'accortezza di utilizzare l'ext3.
Nei primi tempi tutto bene (dato che l'utilizzo non era prolungato), ma poi il rumore si e' ripresentato, questa volta piu' forte, e quindi mi sono reso bene conto che era l'hardisk, e il carico di cpu e la lentezza erano dovuti alla fatica di reperire i dati dalla memoria di massa.
Ad un riavvio del sistema mi appare una finestra di Palinsest che mi avverte: diversi blocchi dati dell'hard-disk sono danneggiati.
Se si prova a fare una ricerca sui vari forum si vedranno centinaia di messaggi in cui si lamentano messaggi troppo allarmistici da parte di palinsest. Io posso solo dare alcuni consigli per prevenire la perdita dei propri dati:

Se palinsest avvisa di un qualche malfunzionamento e' meglio verificare ulteriormente.

sudo badblocks -vns /dev/xxx

dove /dev/xxx sarà il nome dell’HD che si vuole controllare (es:. /dev/hda1)

se non siamo soddisfatti e si vuole indagare piu' a fondo si possono utilizzare delle utility che leggono i dati dall'elettronica di diagnostica dell'harddisk (S.M.A.R.T):

sudo apt-get install smartmontools

per analizzare il disco

sudo smartctl -H /dev/sda

dove /dev/sda è il nome del mio disco che si desidera controllare.
Se il test ha esito positivo otterremmo un messaggio tipo:
come output del comando smartctl sul mio disco ottengo:

=== START OF READ SMART DATA SECTION ===
SMART overall-health self-assessment test result: PASSED

Per effettuare un controllo completo:

sudo smartctl -a /dev/sda1

Si deve fare particolare attenzione alla voce Load_Cycle_Count; se il valore restituito e' alto ed in continuo aumento al ripetersi del comando di diagnostica, si deve intervenire con un comando del genere:

sudo hdparm -B 254 /dev/sda1

su questo wiki, si trovano maggior informazioni:
http://wiki.ubuntu-it.org/Hardware/DispositiviPartizioni/BugPosizionamentoTestina

Il parametro Load_cycle_count, indica il numero di movimenti che il braccio della testina fa per posizionarsi in una sicura ("safe area"), in modo da minimizzare l'usura della superficie del disco. Tipicamente la vita di un'hard-disk da 2.5" si aggira dai 300.000 ai 600.000 Load_cycle, ed e' per questo importante tenere sottocchio questo parametro.

domenica 20 dicembre 2009

Convertire da un formato a un'altro: .rpm, .deb, .tgz

Alien e' un programma che permette di convertire i formati dei pacchetti da una distribuzione ad un'altra. I formati supportati sono .rpm, .deb. stampede .slp e slackware .tgz.
Nel caso in cui un determinato programma, sia compilato per una distribuzione diversa dalla nostra, e ci si presentano problemi di compilazione, possiamo provare ad usare Alien che e' presente nei repositori ufficiali di Ubuntu (e delle piu' diffuse distribuzioni), quindi accessibile tramite Synaptic o con un classico comando:

apt-get update
sudo apt-get install alien

L'uso di Alien non va abusato; l'installazione di pacchetti inerenti la gestione del sistema vanno convertiti con cautela e possono avere come conseguenza la generazione di errori e instabilita' del sistema in quanto tra le varie distribuzione ci possono essere differenze strutturali sostanziali.

Detto questo la sintassi del comando e' la seguente:
sudo alien [opzioni] nome_file

-d genera un pacchetto in formato .deb
-r genera un pacchetto in formato .rpm
-t genera un pacchetto in formato .tgz
-i Installa il pacchetto appena generato e cancella il file.

esempi:
sudo alien -d nome_pacchetto.rpm
converte il pacchetto .rpm in formato .deb
sudo alien -r nome_pacchetto.deb
converte il pacchetto .deb in formato .rpm
sudo alien -i nome_pacchetto.rpm
converte il pacchetto .rpm in formato .deb (l'opzione -d e' d default) e lo installa.




Related Posts Plugin for WordPress, Blogger...