Script per lo spindown automatico dei dischi esterni USB

Pubblicato il Pubblicato in #sysadmin

Prima di tutto -per chi non lo sapesse- lo spindown è lo spegnimento del motore di un hard disk. Alcuni hard disk esterni hanno la possibilità di essere impostati indipendentemente dal sistema operativo per effettuare lo spindown come risparmio energetico dopo un tot tempo di inattività, ma la maggior parte degli hard disk (esterni ed interni) no: girano all’infinito anche se non sono utilizzati.

Oltre ad un fattore energetico (un hard disk è un dispositivo meccanico e tra quelli che consumano più energia in un sistema) c’è un fattore acustico dato dal rumore prodotto dal motore (che può essere più o meno fastidioso, anche più o meno conciliante la notte se ti ci abitui) e c’è un fattore termico: girando il disco si surriscalda ed anche se deve riscaldarsi proprio parecchio per danneggiarsi non mi piace affatto l’idea di avere un hard disk termosifone, soprattutto in estate.

Per i dischi che non vengono gestiti dal sottosistema SCSI di Linux si può impostare il valore di timeout per lo spindown con il buon vecchio hdparm:

hdparm -S valore-in-multipli-di-5-secondi /dev/hdX

Per i dischi che invece vengono gestiti dal sottosistema SCSI la questione è un po’ più complicatuccia perchè hdparm non funziona e sdparm non sempre ci azzecca. E’ comunque possibile forzare lo spindown con un comando e la soluzione più compatibile è fare uno script periodico che metta in spindown il disco se non è stata rilevata un’attività recente.

Uno dei migliori che ho trovato sta qui: http://www.linuxquestions.org/questions/linux-hardware-18/howto-spin-down-external-usb-firewire-hard-drives-on-idle-593192/.

Per i più pigri l’ho messo in questo file: idle-drive.sh.gz. Necessita di sdparm e gawk quindi:

sudo apt-get install sdparm gawk

Prende come argomento l’uuid del disco che si vuole monitorare, io l’ho installato in /usr/local/bin/idle-drive.sh e lo richiamo ogni 5 minuti tramite cron:

echo '*/5 * * * * root /usr/local/bin/idle-drive.sh uuid=1703f12f-e133-356f-aee2-ecb75cca15b2' > /etc/cron.d/idle-drive

MySQL: Ripristinare un solo DB da un dump completo

Pubblicato il Pubblicato in #sysadmin

Un buon DBA sa come si fa… io l’ho imparato ieri perchè ancora non mi era mai capitato!

Ipotizziamo che abbiamo fatto un backup dell’intero DB con

mysqldump -h host -p'password' --all-databases > dump.sql

all’occorrenza è possibile ripristinare solamente un database con

mysql -h host -p'password' --one-database database < dump.sql

per tutto il resto c’è mysqlimport

OpenBSD, Impostare il livello fisico per una scheda di rete che fa i capricci

Pubblicato il Pubblicato in #sysadmin

Quando si ha a che fare con schede di rete vecchiotte, specie se c’è un hub economico di mezzo, si possono avere dei problemi con l’autonegoziazione della modalità di trasmissione a livello fisico. Praticamente la scheda di rete non riesce a mettersi d’accordo con quelle delle altre macchine in lan su quale velocità utilizzare.

I led si accendono, segnalano che il collegamento c’è… ma il dhcp non funziona e nemmeno impostando a mano l’indirizzo si riesce a pingare.

Molto probabilmente servirà impostare a mano la scheda a 10 mbit/s.
Questa –triste– operazione generalmente si fa con ifconfig (opzione media) anche se su linux c’è il comando apposito mii-tool, tra l’altro molto comodo per verificare al volo se c’è un collegamento fisico, magari quando potrebbe esserci un cavo difettoso.

Come si imposta questa opzione su OpenBSD?
Lo script che si occupa di configurare la rete su OpenBSD è /etc/netstart. Per ogni scheda di rete rilevata cerca il file /etc/hostname.nomeInterfaccia e da in pasto ad ifconfig ogni sua riga.

Nel mio caso l’interfaccia si chiama xl0, dunque:
# cat /etc/hostname.xl0
media 10baseT
dhcp

Se non vi è mai capitato, date un’occhiata alle man page di ifconfig e mii-tool! ;)

Zimbra su Reverse Proxy (apache2)

Pubblicato il Pubblicato in #sysadmin

Visto che devo ancora mettere a punto l’installazione di Zimbra in chroot per ora vediamo come fare ad affacciare al pubblico un’installazione di Zimbra in una macchina interna alla lan tramite un reverse proxy apache2!

Ci sono due cose utili da sapere su Zimbra:

  • Il suo webserver non è configurato per servire virtualhosts: le richieste all’IP ed al nome di dominio/alias che vi punta vengono servite alla stessa maniera. Questo ci evita complicazioni con il reverse proxy.
  • Ha bisogno di tre percorsi per funzionare: /zimbra/, /service/, /home/. Quindi bisogna mettere anche quelli dietro il reverse proxy.

Tuttavia questi tre percorsi non si possono cambiare, questo vuol dire che con un reverse proxy semplice dovremo accontentarci di tenerci il percorso finale http://nomedominio.it/zimbra. Se cambiassimo /zimbra/ in /webmail/ (ad esempio) incorreremo in degli errori dopo il login perchè verremmo comunque rediretti ad un percorso su /zimbra/. Per ovviare a questo bisogna utilizzare il modulo proxy_html che fa anche un rewrite. E’ un pò più complesso e lo tratterò successivamente, magari.

La porzione di configurazione da inserire in apache (aggiungendola ad un virtualhost o in quella generale, a seconda delle esigenze) è questa, 10.0.0.2 è la macchina sulla quale gira Zimbra:

ProxyRequests Off

<Proxy *>
Order deny,allow
Allow from all
</Proxy>

<Location "/service">
ProxyPass http://10.0.0.2/service
ProxyPassReverse http://10.0.0.2/service
ProxyPassReverse /
#SetOutputFilter proxy-html
ProxyHTMLExtended On
ProxyHTMLURLMap /service /service
</Location>

<Location "/zimbra">
ProxyPass http://10.0.0.2/zimbra
ProxyPassReverse http://10.0.0.2/zimbra
ProxyPassReverse /
ProxyHTMLExtended On
#SetOutputFilter proxy-html
ProxyHTMLURLMap /zimbra /zimbra
</Location>

<Location "/home">
ProxyPass http://10.0.0.2/home
ProxyPassReverse http://10.0.0.2/home
ProxyPassReverse /
ProxyHTMLExtended On
#SetOutputFilter proxy-html
ProxyHTMLURLMap /zimbra /zimbra
</Location>

Personalmente, come spiegato nel mio precedente articolo, ho preferito mettere questa porzione di configurazione in /etc/apache2/conf.d/zimbra (con conf.d disattivato in apache2.conf) per poi includerla nella configurazione di un virtualhost, in maniera tale da poter rendere disponibile zimbra solo ai virtualhosts che desidero senza reincollare porzioni di configurazione ma solo inserendo una direttiva Include.

Praticamente:
<VirtualHost *:80>
ServerAdmin webmaster@trinhackria.org
ServerName trinhackria.org
Include /etc/apache2/conf.d/zimbra

Ovviamente tutto questo non riguarda il pannello di amministratore di dominio. Visto che è in ascolto sulla porta 7071 ed usa SSL non si può mettere dietro reverse proxy alla stessa maniera detta sopra. E’ un po’ più complesso e tratterò anche questo argomento successivamente, magari.

:%s/magari/quando ci proverò/g :D

Impostare la data con il comando ‘date’

Pubblicato il 1 commentoPubblicato in #sysadmin

Inutile nascondersi dietro ad un dito! Sembra una cazzata ma a tutti, almeno una volta nella vita, è capitato di trovarsi a dover impostare l’orario di un sistema senza ntp e una connessione ad internet, senza server grafico né utility adeguate: solo il comando date e la sua ostica man page dalla quale non siamo riusciti a capire granchè sul come fare.

In effetti all’inizio della man page, nella sintassi, c’è scritto! Ma con tutte quelle parentesi quadre pensi che sia meglio continuare a leggere cercando un esempio che trovi alla fine della man page ma sei talmente confuso che non lo noti.

Bene: per chi non ci è mai riuscito o per chi se l’era dimenticato il pattern di default che il comando date si aspetta come argomento è

MMDDhhmmAAAA
(mese giorno ore minuti anno)

Per impostare quindi la data alle 18:48 del 25 luglio 2010 basterà un

date 072518482010

;)

Abilitare SNMPD su OSX

Pubblicato il Pubblicato in #sysadmin

Forse non tutti sanno che OSX ha già a disposizione SNMPD ma di default è disabilitato… vediamo come abilitarlo (ad esempio per monitorare con cacti anche il nostro mac).

Vanno editati alcuni file, meglio farlo con un editor da terminale (tipo vi, vim, nano) e da root (sudo):

/etc/hostconfig:
SNMPSERVER=-YES-

/System/Library/LaunchDaemons/org.net-snmp.snmpd.plist:
<dict>
<key>Disabled</key>
<false/>

Fatto :)
Se avete bisogno che il mac sia raggiungibile in snmp dalla vostra lan bisognerà editare anche snmpd.conf ed aggiungere l’accesso a mynetwork indicando la rete.

/etc/snmp/snmpd.conf:
com2sec mynetwork 10.0.0.0/24 public
com2sec local localhost public

A questo punto possiamo riavviare, o lanciare snmpd con
sudo launchctl load /System/Library/LaunchDaemons/org.net-snmp.snmpd.plist

L’SNMPD di Debian Squeeze

Pubblicato il Pubblicato in #sysadmin

Perchè Cacti non riesce a fare tutti grafici di una macchina Debian Squeeze nonostante su quest’ultima snmpd sia installato e configurato correttamente?

Perchè dalla versione 5.4.2.1 di net-snmp sono sorti dei conflitti di licenza contro i file MIB di IETF e IANA che fino alla Debian Lenny erano contenuti nel pacchetto libsnmp-base. Ovviamente la rigorosa politica di Debian riguardo alle licenze free ne ha portato all’esclusione.

Niente panico: questi file su Debian esistono ancora, ma stanno nei repository non-free e nel pacchetto snmp-mibs-downloader (che praticamente è uno script che li scarica ed installa).

Prima di tutto bisogna aggiungere ‘non-free’ ad ogni riga di sources.list… se usate vi/vim e non avete repository di terze parti ve ne uscite con:

vi /etc/apt/sources.list
:%s/main/main non-free/g
:wq!
apt-get update
apt-get install snmp-mibs-downloader

Poi bisogna rettificare la configurazione di snmpd. Se non avete particolari necessità di sicurezza perché siete in una LAN ben protetta dal firewall sicuramente vi basterà configurare snmpd per dare accesso libero in lettura.

(Indico solo le modifiche, non tutto il file di conf!)

/etc/snmp/snmpd.conf:
#agentAddress  udp:127.0.0.1:161
agentAddress udp:161,udp6:[::1]:161

#rocommunity public  default    -V systemonly
rocommunity public  default

/etc/snmp/snmp.conf:
#mibs :

E si riavvia snmpd con un /etc/init.d/snmpd restart.
A questo punto snmpd sarà in grado, grazie ai preziosi file MIB appena installati, di fornire ai client tutte le informazioni che servono.

credits | rigacci.org

Creare un mirror ftp con lftp

Pubblicato il Pubblicato in #sysadmin

Quando serve scaricare tutta una locazione ftp c’è lftp!

sudo apt-get install lftp

Ecco il classico scenario dove serve scaricare diversi file e dirs per preparare un server tftp:

lftp -c "open http://people.debian.org/~joeyh/d-i/images/daily/netboot/debian-installer/i386/; mirror ."

Compilare Stackless Python su Linux PowerPC (PPC)

Pubblicato il Pubblicato in #sysadmin

IMHO una delle cose più affascinanti del mondo dell’Open Source e del Free Software è che per il 95% delle problematiche c’è già un folle che se ne sta occupando. Per il restante 5% pure, ma è solo questione di tempo… il tempo che i motori di ricerca reindicizzino blog e mailing list.

Io non so quanta gente (in Italia) usi GNU/Linux su processori PowerPC e non so nemmeno quanta gente abbia voglia di smanettare con Netsukuku su processori PowerPC… ma se qualcuno c’è (e mi ci gioco le palle che c’è) e sta sbattendo la testa a cercare di compilare Stackless Python ottenendo solamente un Segmentation Fault… beh forse questo mio post potrebbe essergli utile!

Prima di tutto devo ringraziare Mads Darø Kristensen Aarhus che con il suo post Building Stackless Python on a PS3 (PPC Linux) mi ha dato una direzione sulla quale continuare a smanettare… perchè se lui sulla PS3 ci era riuscito io su un PowerBook G4 no :(

Bene. Non importa se avete scaricato i tarball dei sorgenti o fatto il checkout SVN… spostatevi nella dir dei sorgenti e date un:

./configure --prefix=/test --enable-stacklessfewerregisters

Io ho impostato il prefix in /test per stare tranquillo, di default viene impostato /usr/local ma se avete altra roba installata li forse preferite anche voi installlarlo in una dir separata per non inquinare /usr/local qualora vorreste cancellare del tutto stackless python…

Una volta terminato il ./configure dovete editare il Makefile nella root dei sorgenti (le subdir lo erediteranno) e modificare le var OPT e SLPFLAGS:

  • in OPT cambiare -O2 in -Os
  • in SLPFLAGS modificare -fno-omit-frame-pointer in  -fomit-frame-pointer e -O2 in -Os.

make && sudo make install e poi su /$PREFIX/bin/python avrete il vostro Stackless Python!

Non chiedetemi il perchè… a me ha l’ha compilato solamente così… anzi, se qualche programmatore C passa di qui e me lo spiega gliene sarò grato :)

Il boot… da internet!

Pubblicato il Pubblicato in #sysadmin

L’ultima volta che mi è capitato di mettere su un server per il netboot, configurando il DHCP, mi è sorto l’interrogativo: “ma esistono server TFTP pubblici?”. Non ci ho più pensato e stasera invece ho scoperto netboot.me e boot.kernel.org: due servizi pubblici che permettono di avviare un sistema minimale (tools, installazioni di rete) direttamente da internet! Esatto: se il nostro sistema è cablato ad un router o comunque ha libero accesso ad internet potremo avviare direttamente… da internet.

Entrambi i sistemi necessitano di gPXE, che è un’implementazione opensource del Preboot eXecution Environment (PXE appunto) delle schede di rete. Netboot.me però offre anche un servizio TFTP pubblico e se quindi si ha la possibilità di configurare il server DHCP è possibile dire ai client di andare a cercare le immagini per il netboot direttamente su internet!

Praticamente basta configurare così il server DHCP (ISC):

next-server "tftp.netboot.me"
filename "netbootme.kpxe"

o con DnsMasq:

dhcp-boot=netbootme.kpxe,tftp.netboot.me

boot.kernel.org invece offre solamente il servizio HTTPFS e purtroppo sarà indispensabile  gPXE. Ovviamente la velocità effettiva del boot dipenderà direttamente dalla velocità della connessione ad internet, ma considerando che mediamente le immagini di boot sono sui 50Mb l’attesa comunque non sarebbe straziante.

Pensando da paranoico mi immagino uno scenario futuro apocalittico dove tutti i dispositivi si avviano da un server controllato centrale ed avviano quello che qualcuno ha deciso che tu puoi avviare.

Comunque sia ho trovato casualmente una risposta alla domanda che mi ero posto in passato. Certo… se però non hai un cavetto ethernet a portata di mano perchè solitamente usi il wireless non te ne fai un granchè :)

Non solo FireWire: boot USB esterno da OpenFirmware (PPC)

Pubblicato il 14 commentiPubblicato in #sysadmin

E’ risaputo che tranne alcuni modelli i Mac PPC non possono fare il boot da periferiche USB esterne ma solamente da periferiche FireWire… la cosa è in parte vera: i Mac possono avviarsi da qualsiasi filesystem che sia leggibile da OpenFirmare – solo che purtroppo non ci sono tasti da tenere premuti all’avvio che faccino questo per noi :(

Nel mio caso ho il lettore DVD integrato del mio PowerBook che è un po’ difettoso ed ho la necessità di reinstallare sia Mac OSX che UBUNTU avviando da lettore DVD esterno USB.

Vediamo dunque come fare ad identificare in OpenFirware il percorso della nostra periferica rinnegata ed avviare da essa!
(nel mio caso è un lettore DVD esterno, ma va bene anche per avviare un’hard disk o anche una chiavetta USB)

PREMESSA: ho tagliato le righe di output non interessanti

Prima di tutto una cosa che ci tornerà utile più avanti: identificare la partizione del media da avviare! Da terminale e con il CD/DVD inserito:

$ mount
/dev/disk2s3 on /Volumes/Mac OS X Install DVD (local, nodev, nosuid, read-only)

Dunque ci interessa la partizione numero 3 del media disk2.
(quest’ultima numerazione è variabile in base al numero di periferiche collegate al sistema)

ok, riavviamo in OpenFirmware (CMD+ALT+O+F) e diamo un’occhiata…

il comando dev è un po’ come cd, in pratica cambia percorso nella gerarchia dei device.
Spostiamoci nella radice e diamo un ls:

0 > dev /
0 > dev /  ok
0 > ls
ff978d90: /pci@f2000000
ff9a06a0:   /usb@1a
ffa046e8:     /device@1
ffa04898:       /keyboard@0
ffa04bd8:       /mouse@1
ffa04f10:     /mouse@2
ff9a88d8:   /usb@1b
ffa036c8:     /hub@1
ffa038d8:       /disk@1
ffa03be8:       /hub@2
ffa03df8:         /device@1
ffa03f58:         /device@2
ffa040b0:       /disk@3
ffa043c0:       /mouse@4
ff9b0b68:   /usb@1b,1
ff9b8df8:   /usb@1b,2
ok
0 >

Ho un hub USB al quale sono collegate altre periferiche oltre al lettore DVD: disk@1 è un hard disk esterno mentre disk@3 è proprio il mio lettore.

vediamo se c’è un alias che ci facilita evitando di dover scrivere l’intero percorso dalla radice

0 > devalias
pci                 /pci@f2000000
usb0                /pci@f2000000/usb@1b,1
usb1                /pci@f2000000/usb@1b
usb-1a              /pci@f2000000/@18
usb-1b              /pci@f2000000/@19
usb-1c              /pci@f2000000/@1a
usb-2a              /pci@f2000000/@1b
usb-2b              /pci@f2000000/@1b,1
usb-2c              /pci@f2000000/@1b,2
hd                  /pci@f4000000/ata-6@d/disk@0
cd                  /pci@f2000000/mac-io@17/ata-3@20000/disk@0
ok
0 >

Trovato: nel mio caso è usb1! A questo punto facciamo un test con il comando dir che lista il contenuto di un filesystem. Nella sintassi disk@3:3, dopo i due punti intendiamo la partizione che abbiamo identificato prima e dopo la virgola il percorso sul media!

0 > dir usb1/hub@1/disk@3:3,
0 > dir usb1/hub@1/disk@3:3, 
Size/        GMT                      File/Dir
bytes   date     time   TYPE CRTR     Name
82 09/24/2007 00:45:14              ._Instructions
82 09/24/2007 00:45:14              ._Optional%20Installs
12292 10/12/2007 07:24:19              .DS_Store
10/12/2007 07:27:21              .fseventsd
10/12/2007 04:59:12              .HFS+%20Private%20Directory%20Data%0                                d
09/24/2007 07:08:49              .vol
08/15/2007 19:18:56              Applications
10/12/2007 06:01:52              bin
09/23/2007 21:37:30              dev
11 10/12/2007 05:55:18  slnk rhap   etc
09/24/2007 03:47:20              Install%20Mac%20OS%20X.app
10/12/2007 07:24:19              Instructions
10/12/2007 05:55:18              Library
10243756 10/10/2007 04:38:29              mach_kernel
10/12/2007 07:24:19              Optional%20Installs
10/12/2007 05:55:18              private
10/12/2007 06:01:16              sbin
10/12/2007 05:12:55              System
11 10/12/2007 05:55:19  slnk rhap   tmp
10/12/2007 05:12:55              usr
11 10/12/2007 05:55:19  slnk rhap   var
09/24/2007 07:08:49              Volumes
01/01/1904 00:00:00              HFS+%20Private%20Data
ok
0 >

Abbiamo visto che OpenFirmware è riuscito a leggere il filesystem della periferica e quindi potrà avviare un loader da esso! Lo stesso procedimento va bene per qualsiasi altra periferica… in questo caso è il DVD di installazione di Mac OSX Leopard, facciamolo avviare:

0 > boot usb1/hub@1/disk@3:3,SystemLibraryCoreServicesBootx
0 > boot usb1/hub@1/disk@3:3,SystemLibraryCoreServicesBootx load-size=2a8c4 adler32=86b8074c
parsing <CHRP-BOOT>
evaluating <BOOT-SCRIPT>

Voilà ;)

Adesso che ho installato Leopard mi serve installare Ubuntu/PPC, quindi inserito il CD di installazione vediamo stavolta su quale partizione sta il filesystem che ci interessa!

$ mount
/dev/disk2s2 on /Volumes/Ubuntu_PowerPC_karmic (hfs, local, nodev, nosuid, read-only, noowners)

stavolta sta sulla partizione numero 2, stesso procedimento: diamo un’occhiata al filesystem

0 > dir usb1/hub@1/disk@3:2,
Ubuntu_PowerPC_karmic
Size/        GMT                     File/Dir
bytes   date     time   TYPE CRTR    Name
01/01/1904 00:00:00             .disk
01/01/1904 00:00:00             casper
01/01/1904 00:00:00             dists
01/01/1904 00:00:00             etc
01/01/1904 00:00:00            *install
4047 10/27/2009 22:01:10  ???? ????  md5sum.txt
01/01/1904 00:00:00             pics
01/01/1904 00:00:00             pool
01/01/1904 00:00:00             ppc
01/01/1904 00:00:00             preseed
231 10/27/2009 22:00:55  ???? ????  README.diskdefines
ok
0 >

Perfetto, riesce a leggerlo… avviamolo:

0 > boot usb1/hub@1/disk@3:2,installyaboot

Welcome to Ubuntu 9.10 (Karmic Koala)!

This is an Ubuntu live CDROM,
built on 20091027.2.

The default option is 'live'.
If the system fails to boot at all (the typical
symptom is a white screen which doesn't go away),
use 'live video=ofonly'.
Press the tab key for a list of options, or type
'help' for help.

************************************
If in doubt, just press Enter, and if that
doesn't work, type 'live video=ofonly'.
************************************
Welcome to yaboot version 1.3.13
Enter "help" to get some basic usage information
boot: live

Please wait, loading kernel...
Elf32 kernel loaded...
Loading ramdisk...
ramdisk loaded at 01c00000, size: 5332 Kbytes
OF stdout device is: /packages/telnet
Preparing to boot Linux version 2.6.31-14-powerpc (buildd@adare) (gcc version 4.4.1 (Ubuntu 4.4.1-4ubuntu8) ) #48-Ubuntu Fri Oct 16 14:11:44 UTC 2009 (Ubuntu 2.6.31-14.48-powerpc)
command line:
memory layout at init:
alloc_bottom : 02136000
alloc_top    : 20000000
alloc_top_hi : 20000000
rmo_top      : 20000000
ram_top      : 20000000
found display   : /pci@f0000000/NVDA,Parent@10/NVDA,Display-A@0, opening... done

Certamente non è una cosa velocissima ed intuitiva, ma in caso di emergenza/necessità è così che si fa ;)

‘njoy ;)


Grazie a questo interessante link ho potuto telnettarmi all’openfirmware del mio powerbook da un’altra macchina per poter copiare ed incollare l’output dei comandi!