Visualizzazione post con etichetta ipkg-opt. Mostra tutti i post
Visualizzazione post con etichetta ipkg-opt. Mostra tutti i post

mercoledì 24 ottobre 2012

Iomega StorCenter IX2-200: servizi al boot

Come detto già in precedenza, le modifiche fatte in /etc sullo Iomega StorCenter IX2-200 non sono persistenti ed a ogni riavvio vengono perse... questo impedisce di poter gestire il dispositivo come una normale distribuzione linux, qui dobbiamo considerare che abbiamo a che fare con una gestione di tipo optware.
Cercando all'interno del file system troviamo un file molto interessante che contiene l'elenco di tutti i servizi che vengono avviati al boot: /mnt/apps/usr/local/cfg/sohoProcs.xml, ma se proviamo a modificarlo vediamo che il file è read only... dobbiamo quindi approfondire e capire da dove arriva quel file...
Con l'aiuto dei comandi df e losetup -a cerchiamo di trovarne l'origine e vediamo che proviene dall'interfaccia di loopback collegata al file /sysroot/boot/images/apps:

/dev/loop0: [fd00]:81927 (/sysroot/boot/images/apps) <--- /dev/loop0 <--- /mnt/apps
/dev/loop1: [fd00]:81922 (sysroot/boot/images/config)
/dev/loop2: [fd00]:81924 (/sysroot/boot/images/oem)

A questo punto dobbiamo montare il file interessato configurando un nuovo loopback in modalità read/write per eseguire le modifiche volute... dato che questa procedura probabilmente la utilizzeremo più volte ed io odio riscrivere gli stessi comandi più volte, conviene scrivere uno script che riassuma tutte le operazioni in /opt/bin/service2boot.sh (e ne approfitteremo anche per fare il backup del file prima delle modifiche):

#!/bin/bash
#
# Crea un loopback device per poi montarlo in scrittura
if [ -e /dev/loop3 ]; then
    umount /dev/loop3;
    losetup -d /dev/loop3;
fi;
mknod -m0660 /dev/loop3 b 7 3
chown root.disk /dev/loop3;
mkdir -pm 755 /tmp/apps;
mount -o loop /boot/images/apps /tmp/apps;
cp /tmp/apps/usr/local/cfg/sohoProcs.xml /tmp/apps/usr/local/cfg/sohoProcs.xml.$(date +%Y%m%d%H%M);
vi /tmp/apps/usr/local/cfg/sohoProcs.xml;
umount /tmp/apps;
losetup -d /dev/loop3;
rm /dev/loop3;


Ora la prima cosa da fare è capire come avviare eventuali demoni e/o servizi da sohoProcs.xml... osservando il file, possiamo notare che vi sono 3 sezioni ben definite:

Group Level="0"
Group Level="1"
Group Level="2"

Non avendo trovato documentazione, posso solamente ipotizzare che il level 0 sia per inizializzare il dispositivo, il level 1 contenga i servizi per l'autoconfigurazione e per i demoni "ufficiali" e che il level 2 contenga servizi e/o comandi necessari a livello applicativo evoluto... quindi decido di inserire i riferimenti ai servizi, demoni e/o comandi che voglio eseguire in questa sezione.
Ora rimane solamente più da individuare individuare come utilizzare le opzioni possibili per eseguire demoni, servizi e/o comandi... ma cercando un po' in rete si riesce a trovare la seguente spiegazione:

<Program Name="PROGNAME" Path="PERCORSO">
    <Args>OPZIONE_1</Args>
    <Args>OPZIONE_2</Args>
    <SysOption MaxMem="MAXMEM" Restart="-1"/>
</Program>


Dove i parametri hanno i seguenti significati:
  • Program Name - deve essere univoco.
  • Path - il percorso del file eseguibile, può essere sh, /bin/sh o /bin/bash per eseguire gli script.
  • Args - ogni argomento da passare allo script; possono essere assenti od essercene uno o più.
  • SysOptions - si spiega da sola, è tutto il contenuto è opzionale e può essere:
            - MaxMem - massima occupazione di RAM consentita
            - Nice - imposta il livello di priorità del processo
            - Restart - quante volte rieseguirlo quando termina; "-1" significa di eseguirlo infinite volte, ma attenzione ad utilizzarlo con programmi che vengono eseguiti come demoni, essi terminano dopo il fork e se il Restart è abilitato inizia un loop infinito; l'altra possibilità per evitare che succeda è far sì che il demone non esegua il fork rimanendo in foreground
            - InitOnly - impostazione specifica per l'utilizzo con i demoni
            - NoErrors - dovrebbe ignorare i codici di uscita in caso di fallimento
            - DelayStart - ritardo di esecuzione, probabilmente in secondi
            - Days, Scheduled, StartTime, RandomDelay - parametri per la schedulazione


Direi che adesso avete abbastanza elementi per divertirvi e fare le prove per configurare il sistema a vostro gusto... attenzione che se sbagliate ad eseguire le modifiche ed il boot non termina rischiate di non riuscire neanche a collegarvi in SSH; in questo caso l'unica possibilità, oltre a rasare tutto e ripartire da zero reinstallando il firmware, è quella di utilizzare linux per accedere fisicamente al disco e modificare nuovamente il file sohoProcs.xml rimuovendo le modifiche fatte, ma questo verrà trattato in un prossimo appuntamento.

Per adesso buon divertimento ed attenzione a cosa modificate!

martedì 23 ottobre 2012

Iomega StorCenter IX2-200: servizio ddclient per IP dinamici

Adesso che è ovvio che l'utilizzo dello Iomega StorCenter IX2-200 non è più limitato alle funzionalità di NAS, e se state seguendo questi tutorial vuole dire che vorreste avere un sistema con funzionalità da server, dobbiamo far sì di poterlo raggiungere anche da postazioni remote (e non parlo di porte e del loro forwarding sul router che è essenziale, ma di indirizzo IP pubblico), ma quando l'indirizzo non è statico insorgono i problemi... quindi anche in questo caso dovremo studiarci una soluzione e questa si chiama DNS dinamico.
Logicamente mantenerlo a mano è abbastanza scomodo e se non siamo collegati al router dello StorCenter è improbabile conoscerne direttamente l'IP da impostare manualmente, quindi quello che andremo a fare è utilizzare uno dei servizi gratuiti di DNS dinamico e configurarlo per l'update automatico tramite il software ddclient. Questo si occupa di verificare ogni tot tempo che l'host configurato venga risolto con l'indirizzo ip del router e, se così non fosse, provvede ad aggiornare il record di tipo A nel DNS provider.
Ora cominciamo con una lista di siti che offrono servizi di DNS dinamico ed hanno protocolli di aggiornamento standard e compatibili con ddclient (magari ce ne sono anche altri, ma questi li avevo provati):
  • www.no-ip.com
  • www.dnsdynamic.org
  • freedns.afraid.org
  • www.dtdns.com
  • www.sitelutions.com
  • www.zoneedit.com
Il file di configurazione è /opt/etc/ddclient/ddclient.conf ed al suo interno, per ogni servizio di dns dinamico dato che possiamo averne più di uno, troviamo tutte le possibili opzioni da configurare; molta attenzione è da porre nella scelta del sistema per l'identificazione dell'indirizzo IP... io per comodità utilizzo sempre quella web.
Qui di seguito riporto un esempio di configurazione per dtdns:

server=www.dtdns.com, protocol=dtdns, client=ddclient, login=username, password='password', use=web, web=myip.dnsdynamic.com
hostname.suroot.com

Dato che non era presente alcuno script per avviare il servizio, mi sono basato su quelli già presenti all'interno di /opt/etc/init.d, creandone uno adhoc... /opt/etc/init.d/S99ddclient, con il seguente contenuto:


#!/bin/bash
#
# Startup script for ddclient
#
# Stop myself if running
DAEMON=/opt/sbin/ddclient
PIDFILE=/opt/var/run/ddclient.pid
[ -f ${PIDFILE} ] && kill `cat ${PIDFILE}`
${DAEMON} -daemon 100 -web checkip.dyndns.com -web-skip 'Current IP Address:' -file "/opt/etc/ddclient/ddclient.conf" -pid ${PIDFILE};

Logicamente questo script dovrà essere reso avviabile (chmod 755 /opt/etc/init.d/S99ddclient.sh) e dovremo assicurarci che venga eseguito ad ogni avvio, come per openVPN, ma lo vedremo nella prossima puntata.

A presto!

mercoledì 17 ottobre 2012

Iomega StorCenter IX2-200: openvpn

L'installazione di openvpn su sistemi tradizionali l'ho già trattata in precedenza ed anche la gestione dei certificati, quindi queste informazioni le considero acquisite... tratterò solamente l'installazione di openvpn ed il funzionamento del demone con l'ausilio di xinetd... riporterò inoltre le modifiche apportate agli script dato che per come sono concepiti non hanno funzionato sul mio sistema.
Per prima cosa dobbiamo installare il software desiderato, quindi:

ipkg-opt openvpn openssl xinetd

Cominciamo con i problemi dello script per l'avvio del demone... la versione originale non funziona perchè ricerca il modulo tun.o per inizializzare le interfacce di tipo tun che in realtà sono già compilate all'interno del kernel (è presente /dev/net/tun), quindi lo script di avvio /opt/etc/init.d/S20openvpn dovrà risultare come il seguente:

#!/bin/sh
#
# Startup script for openvpn server
#
# Make sure IP forwarding is enabled
echo 1 > /proc/sys/net/ipv4/ip_forward
# Make device if not present (not devfs)
if [ ! -c /dev/net/tun ]; then
    # Make sure the tunnel driver is loaded
    if ( !(lsmod | grep -q "^tun") ); then
        # Make /dev/net directory if needed
        if [ ! -d /dev/net ]; then
            mkdir -m 755 /dev/net;
        fi;
        insmod /opt/lib/modules/tun.o;
    else
        exit -1;
    fi;
    mknod /dev/net/tun c 10 200;
fi;

# If you want a standalone server (not xinetd), then comment out the return statement below
return 0

## This is for standalone servers only!!!!
# Kill old server if still there
if [ -n "`/opt/bin/pidof openvpn`" ]; then
    /opt/bin/killall openvpn 2>/dev/null;
fi
# Start the openvpn daemon - add as many daemons as you want
/opt/sbin/openvpn --daemon --cd /opt/etc/openvpn --config openvpn.conf
# [EOF]


A questo punto dobbiamo solamente più configurarte xinetd affinchè accetti le connessioni per openvpn e quindi editiamo il file /opt/etc/xinetd.d/openvpn ed abilitiamo la linea "only_from += 0.0.0.0" controllando che il servizio non sia disabilitato.

Ora rimane solamente più da avviare il servizio con /opt/etc/init.d/S10xinetd... ma per avviarlo ad ogni boot ci sarà da fare ancora qualche modifica fuori programma dato che la configurazione in /etc non è persistente e viene eliminata ad ogni riavvio, ma questo argomento sarà la discussione del nostro prossimo appuntamento.

Alla prossima!

martedì 16 ottobre 2012

Iomega StorCenter IX2-200: source code del dispositivo

Nella precedente guida mi sono arenato alla compilazione del kernel e dei sui moduli, ma non mi sono ostinato dato che la versione del kernel che era presente in optware e quella dello Iomega StorCenter IX2-200 erano diverse... ho quindi deciso di trovare lo stesso kernel sorgente del dispositivo (che non è quello ufficiale di kernel.org). So che questa ricerca è possibile e che il produttore deve renderlo disponibile perchè questo è uno dei "vantaggi" per gli utenti e sviluppatori che applicano le licenze di tipo GPL.

Come prima cosa andiamo a cercarlo sul sito di supporto della Iomega (https://iomega-na-en.custhelp.com/), cerchiamo il nostro dispositivo Iomega StorCenter IX2-200 e vediamo cosa riusciamo a trovare... wow, dove si parla di software c'è anche "Any / Not Applicable", lo selezioniamo e leggendo vediamo che c'è l'ultimo firmware disponibile (ed eseguite l'aggiornamento se non lo avete)... bingo! C'è una parte in cui dice "open source code associated"... da qui potrete scaricare il codice sorgente.

Ora che siete in possesso di tutti i sorgenti e/o patch del software, sappiate che potete ricompilare tutto quello che volete, provando ad ottimizzarlo o ad adattarlo alle vostre esigenze... importantissime, e fonte di "ispirazione" per sapere cosa è in grado di fare il kernel, le patch del kernel, da applicare al kernel ufficiale che si scarica da kernel.org, ed il file config del nostro dispositivo, da cui potrete capire che moduli e funzionalità sono incluse nel kernel e quali no.

A questo punto il mio "interesse" nel proseguire la compilazione del kernel è terminata, ero giunto fino qui cercando informazioni sulla compilazione del kernel con lo scopo di far funzionare openvpn dato che mi segnalava l'impossibilità di trovare il modulo tun.o, ma verificando il file di configurazione del kernel ho visto che l'interfaccia tun è compilata all'interno dello stesso e quindi non vi è bisogno di alcun modulo (ed anche ipkg comunque avvisava di questa "finta" mancanza, quindi mi ero fidato)... adesso sappiamo che i messaggi ricevuti sono solamente un bug da eliminare a livello di script di avvio.

In un prossimo post mi occuperò delle modifiche necessarie a far funzionare openvpn tramite xinetd.

A presto!

Iomega StorCenter IX2-200: compilazione del software

Fin'ora ci siamo appoggiati a software precompilato da altre persone e reso disponibile attraverso i repository ipkg, ma non sempre è tutto cosi facile e semplice, soprattutto se dovete partire dai sorgenti per compilarvi il software non presente.

Prima di tutto sappiate che ci sono due possibili strade da seguire per compilare il software:
  • native (compilazione nativa a bordo del dispositivo)
  • cross (compilazione del codice su di un'altra piattaforma)
La compilazione nativa ha il pregio di richiedere solamente la preparazione dell'ambiente a bordo del dispositivo, ma spazio disco, potenza di calcolo del processore e memoria fisica spesso sono limitati dato che il dispositivo non è fatto per quello.

La compilazione di tipo cross esula dai limiti di spazio e potenza computazionale del dispositivo, ma potrebbe richiedere operazioni molto complesse per la sua preparazione.

Ora vedremo a grandi linee come fare, ma se non sapete nulla di compilazione, o non avete molto interesse (e dovrete usare bene i motori di ricerca in caso di problemi), lasciate stare e leggete qualcos'altro.

Partiamo con la preparazione dell'ambiente di cross compiling supponendo di avere a che fare con una distribuzione di tipo Debian-based installando i seguenti pacchetti:

apt-get update
apt-get install gcc cvs flex bison make pkg-config rsync gettext libglib2.0-dev autoconf libtool automake automake1.9 sudo patch bzip2 gzip wget sed texinfo subversion


Ora procuriamoci l'ambiente di compilazione optware dal repository SVN:

svn co http://svn.nslu2-linux.org/svnroot/optware/trunk optware

Sapendo che l'architettura che ci interessa è cs08q1armel, definiamo il target del nostro ambiente con i seguenti comandi:

cd optware; make cs08q1armel-target

Da qui in poi tutto quello che compileremo verrà compilato per questa tipologia di processore, ma dobbiamo ancora creare i tool di base del sistema e con i seguenti comandi verrà scaricato ed impostato molto software (compreso un kernel in versione "vecchia"):

cd cs08q1armel; make directories ipkg-utils toolchain

Come ultima prova per testare il funzionamento possiamo provare a compilare con i seguenti comandi:

make hello-dirclean hello-check

Per capire come fare a compilare altro software esaminate e cercate di interpretare la struttura dei seguenti file:
  • make/hello.mk
  • make/template.mk
Per compilare dei "Pre" specifici come i moduli del kernel, ci sono diverse destinazioni da specificare (la directory di partenza è sempre optware) e dovrete usare i seguenti comandi:

make pre-targetcd pre; make directories ipkg-utils toolchain

Da qui in poi sappiate che non sono stato in grado di verificare la documentazione letta dato che avevo degli errori che non ho ancora risolto...

A questo punto dovreste essere in grado di compilare e riconfigurare i moduli del kernel:

make kernel-modules-ipk

Per la riconfigurazione dei kmods:

rm -f builds/kernel/.configured
make kernel-modules-config KERNEL_CONFIG_METHOD=menuconfig
cp builds/kernel/.config sources/kernel-modules/pre/defconfig


Ora, parlando dell'ambiente di tipo "native" sappiate che la procedura è la stessa, tranne che partirete direttamente dall'SVN fatto all'interno della /opt del dispositivo targhet... buon divertimento!

Direi che per oggi è tutto... a presto ed alla prossima puntata!

domenica 14 ottobre 2012

Iomega StorCenter IX2-200: installazione del software

Lo Iomega StorCenter IX2-200 che ho in mano (firmware 3.2.6.21659), funziona grazie ad una distribuzione Linux Debian 5.0 per ARMv5, repository armel e come gestore dei pacchetti utilizza ipkg (questo sistema di distribuzione dei pacchetti si chiama optware e principalmente viene utilizzato da router/nas per ambienti soho).

Potete trovare ulteriori informazioni tecniche al seguente link:
http://iomega.nas-central.org/wiki/Category:Ix2-200

D'ora in poi considereremo di operare solamente tramite l'accesso SSH abilitato in precedenza ed è IMPORTANTE considerare che qualunque modifica fatta sulla root, e non contenuta in /opt, è altamente probabile che venga persa allo spegnimento od al riavvio del dispositivo; inoltre eseguendo un df possiamo notare che il root filesystem è molto piccolo, mentre c'è molto spazio libero in /mnt/system, e /opt è un link simbolico alla directory /mnt/system/opt.

Per mantenere eventuali configurazioni software, normalmente in salvate in /etc, vedremo più avanti come fare... e se avete notato non è neanche presente la home dell'utente root.

Per poter installare il software è necessario configurare i repository IPKG da utilizzare... nel nostro caso sono mantenuti da www.nslu2-linux.org; è quindi necessario creare il file di configurazione relativo (unstable è il più aggiornato, ma vi è anche il repository stable, cross o native dipende dalla piattaforma sulla quale è stato compilato):

cat <<EOF > /etc/ipkg.conf
src cross http://ipkg.nslu2-linux.org/feeds/optware/cs08q1armel/cross/unstable
src native http://ipkg.nslu2-linux.org/feeds/optware/cs08q1armel/native/unstable
EOF


A questo punto possiamo tranquillamente operare con i comandi ipkg (o meglio, ipkg-opt come vedremo più avanti):

ipkg update # Aggiornamento della lista del software disponibile
ipkg list | more # Visualizzare il software disponibile
ipkg install <nome_pacchetto> # Installazione del software
ipkg list_installed # Per verificare i pacchetti installati
ipkg upgrade # Per aggiornare i pacchetti installati
ipkg remove <nome_pacchetto> # Rimozione del software


Come detto in precedenza, tutto il software sarà da installare in /opt ed affinchè questo non crei problemi è necessario installare il pacchetto ipkg-opt che si occuperà espressamente di questa operazione, quindi il primo software da installare sarà ipkg-opt:

ipkg install ipkg-opt

A questo punto però dobbiamo aggiungere al path ed alle librerie il contenuto della cartella /opt con i nuovi pacchetti installati nel sistema:

export PATH=/opt/bin:/opt/sbin:$PATH
echo "/opt/lib/" >> /etc/ld.so.conf
ldconfig -v
mv /opt/etc/ipkg.conf /opt/etc/ipkg.conf.old
ln -s /etc/ipkg.conf /opt/etc/ipkg.conf


Per semplificarsi la vita è possibile creare uno script che esegue in automatico le operazioni...

vi /opt/bin/ipkg-opt.sh

#!/bin/bash

(grep "/opt/lib" /etc/ld.so.conf > /dev/null) || (echo "/opt/lib/" >> /etc/ld.so.conf; ldconfig -v);
#(echo $PATH | grep '/opt/bin:/opt/sbin' > /dev/null) || (PATH=${PATH}:/opt/bin:/opt/sbin;);
if [[ ! ":$PATH:" == *":
/opt/bin:/opt/sbin:"* ]]; then export PATH=${PATH}:/opt/bin:/opt/sbin; fi;
[ -L /etc/ipkg.conf ] && mv -f /etc/ipkg.conf /etc/ipkg.conf.old || rm -f /etc/ipkg.conf
[ -L /opt/etc/ipkg.conf ] && mv -f /opt/etc/ipkg.conf /opt/etc/ipkg.conf.old || rm -f /opt/etc/ipkg.conf
echo -e "src cross http://ipkg.nslu2-linux.org/feeds/optware/cs08q1armel/cross/unstable\nsrc native http://ipkg.nslu2-linux.org/feeds/optware/cs08q1armel/native/unstable" > /opt/etc/ipkg.conf
ln -s /opt/etc/ipkg.conf /etc/ipkg.conf;
ipkg-opt update;
 

A questo punto si è pronti per cominciare l'installazione dei software di proprio interesse... riporto un esempio relativo a del software che utilizzo normalmente o che considero indispensabile:

ipkg-opt install unzip bzip2 gzip
ipkg-opt install openvpn xinetd
ipkg-opt install ddclient perl-digest-sha1 perl-io-socket-ssl


Se necessario, il software di gestione dei pacchetti IPKG, si occuperà anche dell'installazione delle dipendenze software.

A presto e continuate a fare esperimenti e divertirvi!