Archivio della categoria 'Sistema'

Directory public_html con uno script bash

Apache, Open Source, Shell, Sistema, Tips & tricks Nessun commento »

Mi è capitato spesso di dover mettere mano a server UNIX/Linux con una gestione dei VirtualHost di Apache compromessa da anni di utilizzo incontrollato del server da parte di amministratori di sistema non proprio ordinati. Il risultato di solito è un grande numero di utenti con home directory strutturate in maniera differente l’una dall’altra.

In particolare, in un caso recente mi sono ritrovato un centinaio di utenti dei quali una certa parte aveva la DocumentRoot nella propria home directory, altri invece ce l’avevano sotto /var/www/users/, cosa che io raccomando in quanto evita di avere problemi con SUEXEC nelle versioni di Apache precompilate.

Per sistemare una situazione così caotica ho deciso di mettere tutto correttamente sotto /var/www/users/ e mi si è presentata la necessità di creare automaticamente le directory mancanti e i relativi link simbolici alle varie home directory. L’ho fatto con un semplicissimo script in bash, che pubblico qui nel caso possa essere utile anche a qualcun altro. Ci ho messo anche un po’ di output per rendere il codice chiaro anche a chi è alle prima armi con la bash.

Attenzione! Alla riga 18 viene fatta la copia di un fast-cgi presente nella directory /var/www/users/ivan/. Ovvio che dovete sostituire ivan con il nome di un utente presente sul vostro server.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#!/bin/bash
 
echo "Inizializzazione script..."
 
for i in $( ls /home/ ); do
  echo "  Sto processando '$i'"
  if [ -L /home/$i/public_html ]; then
    echo "    Il link simbolico /home/$i/public_html esiste gia' ... salto!"
  else
    echo "    Il link simbolico /home/$i/public_html non esiste: provo a crearlo ... "
    if [ -d /var/www/users/$i ]; then
      echo "La directory /var/www/users/$i esiste, non mi resta che linkarla ... "
      /bin/ln -s /var/www/users/$i /home/$i/public_html
    else
      echo "    La directory /var/www/users/$i NON esiste, ora la creo ... "
      /bin/mkdir /var/www/users/$i
      echo "    Copio il FAST-CGI ... "
      /bin/cp /var/www/users/ivan/fast-cgi /var/www/users/$i/
      echo "    Sistemo i permessi per la directory creata ... "
      /bin/chown -R $i:$i /var/www/users/$i
      /bin/chmod 700 /var/www/users/$i
      echo "    Creo il link simbolico ... "
      /bin/ln -s /var/www/users/$i /home/$i/public_html
    fi
  fi
done
Condividi:
  • del.icio.us
  • Google
  • Digg
  • Sphinn
  • Facebook
  • Technorati
  • YahooMyWeb

Installazione di Debian Etch su RAID + LVM

Debian, Open Source, Sistema, Tips & tricks Nessun commento »

In questo post descrivo con la massima sinteticità e senza alcuna pretesa di completezza come si possa realizzare un RAID 1 (software) durante l’installazione di Debian Etch e come si configuri correttamente il LVM.

Su una delle mie workstation ho due hard disk identici da 320GB. Ho deciso di installarci l’ennesima Debian Etch e di mettere i due dischi in RAID. Ho avviato l’installazione e in un paio di minuti sono arrivato allo step in cui vanno effettuati i settaggi per il partizionamento dei dischi. Trattandosi di dischi S-ATA, il debian-installer me li ha riconosciuti come segue:

  • SCSI1 (0,0,0) (sda)
  • SCSI2 (0,0,0) (sdb)

Lo stesso discorso vale comunque anche per dischi IDE, in quel caso il debian-installer li vederebbe così:

  • IDE1 (hda)
  • IDE2 (hdc)

A questo punto ho creato una prima partizione di booting, di dimensioni minime (solo 512MB):

  1. selezionare il primo disco SCSI1
  2. scegliere come metodo di partizionamento “Manuale”
  3. selezionare la voce “SPAZIO LIBERO” sotto SCSI1
  4. scegliere “Crea una nuova partizione”
  5. selezionare “Inizio” come posizione della nuova partizione
  6. selezionare “Primaria” come tipo della nuova partizione
  7. inserire 512M come dimensione della nuova partizione
  8. scegliere “Volume fisico per il RAID” come modo d’uso della nuova partizione
  9. scegliere “Preparazione di questa partizione completata”

Poi ho creato la partizione destinata a contenere il filesystem vero e proprio:

  1. selezionare il primo disco SCSI1
  2. scegliere come metodo di partizionamento “Manuale”
  3. selezionare la voce “SPAZIO LIBERO” sotto SCSI1
  4. scegliere “Crea una nuova partizione”
  5. selezionare “Inizio” come posizione della nuova partizione
  6. selezionare “Primaria” come tipo della nuova partizione
  7. inserire 95% come dimensione della nuova partizione
  8. scegliere “Volume fisico per il RAID” come modo d’uso della nuova partizione
  9. scegliere “Preparazione di questa partizione completata”

Perché al punto 7 ho scelto di utilizzare solo il 95% del disco? Semplicemente perché, nel caso io debba sostituire uno dei due dischi, non avrò mai la certezza assoluta che il nuovo disco abbia esattamente lo stesso numero di cilindri etc. rispetto al disco originale, nemmeno se lo compero della stessa marca e dello stesso taglio. Ho bisogno quindi di un gap di tolleranza per mettermi al sicuro da possibili perdite di dati o inconsistenze durante la ricostruzione dei volumi. Certo, si spreca dello spazio che non verrà mai utilizzato, ma con dischi di queste dimensioni ce lo possiamo pure permettere.

Ora è necessario ripetere le operazioni appena descritte anche per il secondo disco (SCSI2) assicurandoci di avere effettuato esattamente le stesse scelte fatte per il primo.

Fatto questo, possiamo configurare il RAID 1 software. Per prima cosa creiamo il device multidisk destinato a contenere la partizione di boot:

  1. scegliere “Configurare il RAID software”
  2. confermare “Scrivere i cambiamenti sui dispositivi…”
  3. scegliere “Creare un device multidisk (MD)”
  4. selezionare “RAID1″ come tipo di device multidisk
  5. confermare “2″ come numero di device attivi per l’array RAID1
  6. confermare “0″ come numero di device “spare”
  7. abilitare solo /dev/sda1 e /dev/sdb1 come device attivi
  8. scegliere “Terminare”

Poi creiamo il device multidisk destinato a contenere il filesystem vero e proprio:

  1. scegliere “Configurare il RAID software”
  2. confermare “Scrivere i cambiamenti sui dispositivi…”
  3. scegliere “Creare un device multidisk (MD)”
  4. selezionare “RAID1″ come tipo di device multidisk
  5. confermare “2″ come numero di device attivi per l’array RAID1
  6. confermare “0″ come numero di device “spare”
  7. abilitare solo /dev/sda2 e /dev/sdb2 come device attivi
  8. scegliere “Terminare”

Ora possiamo passare alla creazione dei volumi logici. Per prima cosa creo il volume destinato a fare da swap del sistema:

  1. scegliere “Configurare il Logical Volume Manager”
  2. confermare “Scrivere le modifiche sui dischi e …”
  3. scegliere “Creare i gruppi di volumi”
  4. scrivere “VG00″ come nome del gruppo di volumi
  5. abilitare solo /dev/md/1 come device per il nuovo gruppo di volumi
  6. scegliere “Creare un volume logico”
  7. selezionare il gruppo di volumi “VG00″
  8. scrivere “swap” come nome del volume logico
  9. scrivere “4GB” come dimensione del volume logico (almeno il doppio della RAM)

Poi creo il volume destinato al filesystem vero e proprio:

  1. scegliere “Creare un volume logico”
  2. selezionare il gruppo di volumi “VG00″
  3. scrivere “filesys” come nome del volume logico
  4. confermare il valore massimo disponibile proposto come dimensione del volume logico
  5. scegliere “Terminare”

A questo punto posso creare le partizioni:

  1. selezionare il n° 1 sotto “LVM VG VG00 LV filesys”
  2. creare la partizione normalmente (scegliendo “Ext3″ come modo d’uso e “/” come mount point)
  3. scegliere “Terminare”
  4. selezionare il n° 1 sotto “LVM VG VG00 LV swap”
  5. creare la partizione di swap normalmente (scegliendo “swap area” come modo d’uso)
  6. confermare “Scrivere le modifiche sui dischi e …”

Fatto questo, è sufficiente procedere con l’installazione di Debian come di consueto.

Condividi:
  • del.icio.us
  • Google
  • Digg
  • Sphinn
  • Facebook
  • Technorati
  • YahooMyWeb

Montare una partizione NTFS in scrittura con OpenSUSE

Open Source, Sistema, Tips & tricks Nessun commento »

Dopo avere installato OpenSUSE 11.0 su una delle mie workstation portatili mi sono accorto che l’accesso alle due partizioni NTFS riservate a Windows è possibile in scrittura solo per l’utente root. Rapida occhiata al file /etc/fstab per scoprire che si tratta di una scelta di default dell’installer di OpenSUSE, scelta che senz’altro è dettata da motivi di sicurezza ma che è altrettanto facilmente aggirabile. È sufficiente infatti modificare come segue i valori fmask e dmask nello stesso file /etc/fstab:

# /dev/disk/by-id/scsi-SATA_FUJITSU_MHV2100_NS91T5B26UKA-part2 /windows/D           ntfs-3g    users,gid=users,fmask=133,dmask=022,locale=it_IT.UTF-8 0 0
/dev/disk/by-id/scsi-SATA_FUJITSU_MHV2100_NS91T5B26UKA-part2 /windows/D           ntfs-3g    users,gid=users,fmask=113,dmask=002,locale=it_IT.UTF-8 0 0

Nell’esempio ho commentato la riga originale (fatelo sempre anche voi: non si sa mai…) ed ho cambiato il valore di fmask da 133 a 113 e quello di dmask da 022 a 002. In questo modo l’accesso in scrittura viene concesso non solo all’owner del filesystem ma anche a tutti gli utenti del gruppo users.

Fatto questo, ricordate di smontare e rimontare il filesystem perché le modifiche abbiano effetto immediato:

# umount /windows/D
# mount /windows/D

Condividi:
  • del.icio.us
  • Google
  • Digg
  • Sphinn
  • Facebook
  • Technorati
  • YahooMyWeb

Piccola guida ai principali comandi Linux

Debian, Open Source, Segnalazioni, Shell, Sistema, Tips & tricks Nessun commento »

Riproduco in questo post la tabella realizzata da Pádraig Brady e pubblicata sul suo sito Internet ufficiale (http://www.pixelbeat.org). La tabella mostra alcuni fra i principali comandi per amministrare un server Linux, con una breve spiegazione e - in alcuni casi - link a pagine di approfondimento.

This is a linux command line reference for common operations. Examples marked with • are valid/safe to paste without modification into a terminal, so you may want to keep a terminal window open while reading this so you can cut & paste. All these commands have been tested both on Fedora and Ubuntu.

Leggi il resto »

Condividi:
  • del.icio.us
  • Google
  • Digg
  • Sphinn
  • Facebook
  • Technorati
  • YahooMyWeb

Utilizzare al meglio l’editor Vim

Open Source, Sistema, Tips & tricks Nessun commento »

Ci sono funzionalità avanzate di Vim che spesso non utilizziamo, certi come siamo che lavorare da remoto in linea di comando debba significare necessariamente anche avere poche comodità a disposizione.

Una fra le funzionalità più misconosciute riguarda la possibilità di editare contemporaneamente più file. Grazie al suo particolare metodo di buffering, Vim può gestire contemporaneamente un numero pressoché illimitato di file. Il solo, vero limite consiste nella modalità di visualizzazione: per poter lavorare contemporaneamente su più file l’interfaccia di Vim viene suddivisa - orizzontalmente o verticalmente, si veda oltre - riducendo progressivamente l’area destinata ad ognuno dei file.

Per aprire due file contemporaneamente dividendo l’area di lavoro orizzontalmentesi ricorre all’opzione -o:

$ vim -o file1.txt file2.txt

Per aprire due file contemporaneamente dividendo l’area di lavoro orizzontalmente si ricorre all’opzione -O:

$ vim -O file1.txt file2.txt

Per passare da una finestra all’altra si utilizzano le seguenti shortcut:

  1. CTRL + W + <freccia sinistra> attiva la finestra a sinistra
  2. CTRL + W + <freccia destra> attiva la finestra a destra
  3. CTRL + W + <freccia su> attiva la finestra in alto
  4. CTRL + W + <freccia giù> attiva la finestra in basso
  5. CTRL-W + CTRL-W (due volte CTRL+W) si sposta rapidamente da una finestra all’altra

Per chiudere la finestra corrente, è sufficiente procedere con la consueta sequenza

[ESC]+:q

proprio come quando stiamo editando un solo file per volta.

Per aprire un nuovo file dall’interno di Vim si utilizza la sequenza

[ESC]+:new nomefile.txt

Se il file esiste verrà editato, in caso contrario verrà creato ex novo.

Per ridimensionare la finestra corrente, prima si digita il numero corrispondente alla quantità di righe che vogliamo ridimensionare e poi si procede con la combinazione di tasti “CTRL-W + +/-”:

[ESC] + 5 + CTRL + W + -

Nell’esempio abiamo ridotto la finestra corrente di 5 righe.

Dopo avere lavorato contemporaneamente su più file, può rendersi necessario chiudere tutto e andarsene un poco a spasso. Questi sono i comandi con cui chiudere una sessione multipla di Vim:

[ESC]+:wqall
[ESC]+:qall!

Nel primo caso si chiudono tutte le finestre dopo avere salvato le modifiche di ognuno. Nel secondo si chiede di chiudere tutto ignorando qualsiasi modifica effettuata sui file.

Condividi:
  • del.icio.us
  • Google
  • Digg
  • Sphinn
  • Facebook
  • Technorati
  • YahooMyWeb

Bash e velocità di un hard disk SCSI

Open Source, Sistema, Tips & tricks Nessun commento »

Supponiamo di volere stabilire la velocità di un hard disk SCSI montato su un server a cui possiamo accedere solo da remoto. Ci sono più modi per ottenere questo tipo di informazioni. Il più semplice consiste nel ricavare modello e/o numero seriale del disco. Queste due informazioni contengono infatti quasi sempre indicazioni chiare circa la tipologia del dispositivo e le sue caratteristiche principali. Si tratta solo di conoscere la sintassi esatta del seriale, che varia a seconda del produttore. Prendiamo ad esempio un hard disk Seagate etichettato come modello #ST373355SS. Scomponendo il codice come segue otteniamo una serie di informazioni preziose:

  1. ST = identidicatore del brand
  2. 3 = formato dell’unità disco (3=3.5″)
  3. 73 = Capacità del disco (in GB)
  4. 3 = Campo riservato per usi futuri
  5. 5 = RPM (5=15k, 0=10K)
  6. 5 = numero della generazione del modello
  7. SS = interfaccia (SS=SCSI)

Per individuare il modello e/o il seriale del disco da linea di comando possiamo semplicemente fare un `cat` di /proc/scsi/scsi:

# cat /proc/scsi/scsi

Oppure ricorrere alle sg3-utils per interrogare direttamente il dispositivo SCSI:

# sginfo -g /dev/sda

Nel caso le sg3-utils non fossero installate:

# apt-get install sg3-utils

Anche se più elegante, questo secondo approccio è di gran lunga più macchinoso del necessario: una volta ottenuto il seriale mediante il `cat` indicato sopra, se non siamo in grado di decodificarlo è sufficiente visitare il sito Internet del produttore e ricavare le informazioni che ci servono direttamente dalla scheda tecnica del prodotto.

Condividi:
  • del.icio.us
  • Google
  • Digg
  • Sphinn
  • Facebook
  • Technorati
  • YahooMyWeb

Kernel 2.6.25 con Debian Etch e Backports

Debian, Kernel, Open Source, Sistema, Tips & tricks Nessun commento »

Attenzione! Questo è soltanto l’aggiornamento di un post pubblicato mesi fa, la cui lettura raccomando vivamente prima di procedere oltre, a meno che non si conosca già sufficientemente l’argomento. Clicca qui per accedere al vecchio post.

Fatta questa piccola - ma doverosa - premessa, ecco le istruzioni per compilare il nuovo kernel 2.6.25 per l’attuale stable release di Debian GNU/Linux (nome in codice: Etch).

Per prima cosa è necessario scaricare i sorgenti del nuovo kernel Linux 2.6.25:

# apt-get -t etch-backports install linux-source-2.6.25

Poi procediamo come di consueto:

  1. Spostiamoci nella directory dove sono collocati i nuovi sorgenti e scompattiamoli:
    # cd /usr/src
    # tar xjf linux-2.6.25.tar.bz2
    # ln -s linux-2.6.25 linux
    # cd /usr/src/linux
  2. Resettiamo (opzionale) tutti i parametri di compilazione e rivediamoli per maggiore sicurezza:
    # make clean && make mrproper
    # cp /boot/config-`uname -r` ./.config
    # make menuconfig
  3. Compiliamo i sorgenti e prepariamo i pacchetti .deb:
    # make-kpkg clean
    # fakeroot make-kpkg --initrd --append-to-version=-tetragono kernel_image kernel_headers
  4. Installiamo i pacchetti .deb:
    # cd ..
    # dpkg -i linux-image-2.6.25-tetragono_2.6.25-tetragono-10.00.Custom_i386.deb
    # dpkg -i linux-headers-2.6.25-tetragono_2.6.25-tetragono-10.00.Custom_i386.deb

Ed ecco il kernel installato e perfettamente funzionante:

That’s all, folks ;)

Condividi:
  • del.icio.us
  • Google
  • Digg
  • Sphinn
  • Facebook
  • Technorati
  • YahooMyWeb

Ricompilare un pacchetto con Debian GNU/Linux

Debian, Open Source, Sistema, Tips & tricks Nessun commento »

Premetto che questo non vuole essere un tutorial esaustivo, ma solo una sorta di manabile - ma ve li ricordate i manabili? - utile soprattutto per chi vuole provare a ricompilare da sé un pacchetto Debian e non ha il tempo di approfondire la teoria.

Per prima cosa è necessario installare i pacchetti fondamentali per questo tipo di operazione:

# apt-get install devscripts build-essential

Poi vanno scaricati i sorgenti del pacchetto che vogliamo ricompilare:

# apt-get source nome_pacchetto

Attenzione! Il pacchetto verrà scaricato nella directory corrente!

Il nome del pacchetto lo si può ricavare facilmente greppando l’output di dpkg:

# dpkg -l | grep -i openoffice

Nell’esempio abbiamo effettuato una ricerca per trovare il nome corretto del pacchetto openoffice.org.

Ora dobbiamo procedere alla generazione delle dipendenze:

# apt-get build-dep nome_pacchetto

Dritta! Nella directory debian si trovano alcuni script e file di configurazione che potrebbero richiedere modifiche specifiche, magari proprio quelle per cui si è deciso di ricompilare il pacchetto. Tra questi i più importanti sono rules (opzioni di compilazione) e changelog (il nome dovrebbe essere autoesplicativo).

Per ricompilare il pacchetto:

# cd nome_pacchetto
# debuild -us -uc

Una volta terminatala compilazione, troverete i pacchetti .deb nella directory superiore, pronti per l’installazione:

# cd ..
# dpkg -i *.deb

Per maggiore chiarezza vediamo un esempio concreto:

# apt-get source mysql-server-5.0
# apt-get build-dep mysql-server-5.0
# cd mysql-dfsg-5.0-5.0.32
# debuild -us -uc
# cd ..
# dpkg -i *.deb

Have a lot of fun!

Condividi:
  • del.icio.us
  • Google
  • Digg
  • Sphinn
  • Facebook
  • Technorati
  • YahooMyWeb

Cambiare i permessi di una directory ricorsivamente

Open Source, Shell, Sistema, Tips & tricks 2 commenti »

Pubblico qui una tip di poche, pochissime parole per una persona che mi ha chiesto come si possano cambiare ricorsivamente i permessi di tutto il contenuto di una directory in maniera corretta e - soprattutto - indolore. Posto che vogliamo assegnare ai file permessi 644 e alle directory 755 - come sempre andrebbe fatto - è sufficiente spostarsi nella directory in questione e lanciare i comandi che seguono:

find . -type f -print0 | xargs -0 chmod 644

find . -type d -print0 | xargs -0 chmod 755

Altro non serve…

Condividi:
  • del.icio.us
  • Google
  • Digg
  • Sphinn
  • Facebook
  • Technorati
  • YahooMyWeb

Monitoraggio delle code di posta con Postfix

Open Source, Shell, Sistema, Tips & tricks Nessun commento »

Postfix è considerato da tempo uno tra i migliori MTA in circolazione. Scritto inizialmente da Wietse Zweitze Venema e rilasciato sotto IBM Public License, Postfix può vantare una solidità ed una facilità di interazione introvabili in altri demoni di posta SMTP.

La scelta di distribuire le sue funzionalità su diversi demoni - ognuno dei quali svolge una funzione specifica - e l’attribuzione di diritti minimi di esecuzione ad ognuno di essi, garantisce che un eventuale bug o exploit non possa compromettere l’intero MTA. Un solo processo deve essere eseguito con privilegi di root, tutti gli altri hanno diritti minimi e spesso un file di configurazione proprio.

Questa distribuzione di compiti si traduce anche nella disponibilità di diversi strumenti specificamente dedicati a svolgere funzioni di monitoraggio e di amministrazione dei processi generati da Postfix. Alcuni di questi strumenti sono parte integrante di Postfix, mentre altri costituiscono elementi accessori - spesso sviluppati da terze parti - che interagiscono con esso a vari livelli.

Il monitoraggio delle code di posta, ad esempio, può avvenire mediante il programma `mailq`:

# mailq
-Queue ID- --Size-- ----Arrival Time---- -Sender/Recipient-------
6CC39230001* 1389 Wed Jun 25 01:17:51 5tanya.wuhc@msa.hinet.net
test@dominio.it

Rimando i newbie al solito `man mailq` per le informazioni principali su come funziona il programma. Quello che segue è invece un esempio di come si possa utilizzare al meglio `mailq` per rimuovere la posta bloccata dallo spool locale:

# exim -Mg `mailq | grep frozen | awk '{ print $3 }'`

Il normale utilizzo di `mailq` può essere ostacolato dalla presenza di code di posta molto voluminose. In questi casi è bene ricorrere allo script `qshape` per avere una quadro chiaro su cosa abbia determinato l’accumulo di messaggi e quando sia accaduto:

$ qshape -s deferred | head
T 5 10 20 40 80 160 320 640 1280 1280+
TOTAL 1250 0 1 2 4 5 22 34 118 242 822
spammer123.com 462 0 1 0 1 1 3 7 15 53 381
zzfinder.com 64 0 0 0 0 0 1 0 0 4 59
socket4you.biz 53 0 0 0 0 0 0 0 0 0 53
junglex.com 36 0 0 0 0 0 1 3 7 15 10
myemessage.com 36 0 0 0 0 0 0 0 0 0 36
stock911.us 35 0 0 0 0 0 0 0 0 0 35
linuxassistance.it 33 0 0 0 0 0 0 0 0 0 33
agliardi.biz 29 0 0 0 0 0 0 0 0 3 26

Qui si vede come ci siano 1250 messaggi in coda per i quali è stato fatto almeno un tentativo di spedizione (deferred), di cui 462 sono indirizzati al dominio spammer123.com. Delle email inviate a questo dominio 1 è in coda per un periodo di tempo compreso fra 5 e 10 minuti, mentre 381 sono in attesa da più di 1280 minuti.

Il comando che segue serve invece per visualizzare le statistiche legate al numero di destinatari delle mail presenti nella coda “active” di Postfix:

qshape active | less

In questo modo siamo in grado di individuare in ogni momento eventuali “colli di bottiglia”, ovvero invii di posta elettronica anomali che si accumulano nella coda di Postfix degradandone nettamente le prestazioni. Una volta individuati simili processi, li si può debellare con l’ausilio del comando `postsuper`:

postsuper [-psv] [-c directory_file_conf] [-d][-h][-H][-r] [id_coda] [directory_coda]

Per eliminare, ad esempio, il messaggio con ID di coda 6CC39230001 (ovvero quello riportato nell’esempio fatto sopra) è sufficiente lanciare il comando:

# postsuper -d 6CC39230001

Se invece, a vostro rischio e pericolo, volete svuotare completamente le code di posta, potete sempre ricorrere al seguente comando:

# postsuper -d ALL deferred

Ma se mai doveste perdere messaggi di posta elettronica a causa dell’utilizzo di questo secondo esempio, non ve la prendete con me.

Condividi:
  • del.icio.us
  • Google
  • Digg
  • Sphinn
  • Facebook
  • Technorati
  • YahooMyWeb