cli

Monitorare la dimensione di un filesystem

In Linux per conoscere quanto spazio resta ai filesystems si usa il comando df. Un esempio di output del comando è:

root@mazinga:~# df -lh
Filesystem                 Size  Used Avail Use% Mounted on
rootfs                      20G  3.3G   16G  18% /
udev                        10M     0   10M   0% /dev
tmpfs                       50M  144K   50M   1% /run
/dev/disk/by-label/DOROOT   20G  3.3G   16G  18% /
tmpfs                      5.0M     0  5.0M   0% /run/lock
tmpfs                      100M     0  100M   0% /run/shm
root@mazinga:~#

Se si volesse quindi monitorare lo stato di un particolare mount point si può usare uno script come il seguente:

#!/bin/bash
 
# lo script confronta la percenuale di spazio utilizzata nel filesystem / con $SOGLIA
# se la percentuale supera $SOGLIA invia una mail a $RECIPIENTS
 
# imposto una soglia del 90%
SOGLIA=90
 
# imposto i destinatari della mail
RECIPIENTS="pippo@example.com"
 
now=`date +%y%m%d-%H%M%S`
 
perc_root=`df -Ph -x tmpfs -x rootfs | grep "/$" |  tr -s ' ' '\t' | cut -f5 -s | cut -d '%' -f1`
 
found=false
msg="Analizzatore dell'uso dello spazio su disco (SOGLIA impostata a "${SOGLIA}"):\n\n"
 
if [[ "${perc_root}" -ge "${SOGLIA}" ]] ; then
    found=true
    msg+="Il file system '/' sta utilizzando il "${perc_var}"% del suo spazio disponibile\n"
fi
 
if "${found}" ; then
    echo -e ${msg} | mail -s "Controllo su spazio disco del ${now}" $RECIPIENTS
fi

La parte interessante è il comando che ricava la percentuale da df:

  • la prima parte (df -Ph -x tmpfs -x rootfs) invoca il comando df usando il flag -x che permette di escludere un filesystem e il flag -P che imposta l'output in formato POSIX (i dati dei filesystem sono tutti nella stessa riga);
  • la seconda parte ( grep "/$" ) serve a puntare il filesystem desiderato;
  • la terza parte serve a puntare la colonna desiderata e ripulisce il campo dal carattere % in modo da poterlo usare in un test.

Lo script se messo in cron inizierà ad inviarvi una mail non appena lo spazio utilizzato nel filesystem root arriverà a superare il 90%.

Blog: 

Programmazione: 

Backup dei dati su nastro in Linux

Considerata la vasta offerta di spazio disco in cloud, parlare di backup casalingo su nastro potrebbe sembrare anacronistico. Bisogna però considerare che non tutti hanno a disposizione una connessione di rete veloce e con bassa latenza, quindi il trasefrimento di grosse moli di dati risulta ancora oggi un collo di bottiglia non indifferente.

Di seguito descrivo come ho realizzato un piccolo sistema di backup casalingo su nastro usando principalmente devices usati e a buon mercato.

Ho inizialmente rispolverato un vecchio pc dei tempi dell'università nel quale ho inserito una scheda SCSI. Alla scheda SCSI ho collegato un HP Dat-40 trovato usato su ebay, per il quale si trovano ancora cassette nuove sempre su ebay.

Ho quindi installato la debian sul vecchio pc e ho configurato il kernel in modo che il driver st imposti il buffer a 64kb:

 root@goldrake:~# dmesg | grep bufsize
 [   20.258059] st: Version 20101219, fixed bufsize 32768, s/g segs 256
 root@goldrake:~#
 
 # vim /etc/default/grub
     GRUB_CMDLINE_LINUX_DEFAULT="quiet st.buffer_kbs=64"
 # update-grub
 # reboot
 # dmesg | grep bufsize
 [   20.233873] st: Version 20101219, fixed bufsize 65536, s/g segs 256

Questa modifica rende più veloce la lettura/scrittura sul dat. Infatti supponiamo di dover scrivere un file da 2GB, i tempi nel caso di 32K sono:

        $ mkdir temp && cd temp
        $ dd if=/dev/zero of=dati bs=1024k count=2000
        $ find -L . -print0 | cpio --null -ovH crc -C 32768 -O root@goldrake:/dev/st0 --rsh-command=/usr/bin/ssh
 
        real    8m35.567s
        user    0m4.248s
        sys     0m10.189s
 
        $ cd && mkdir temp2 && cd temp2
        $ cpio -ivmud -H crc -C 32768 -I root@goldrake:/dev/st0 --rsh-command=/usr/bin/ssh
 
        real    8m48.068s
        user    0m9.837s
        sys     0m24.074s
 
        $ diff dati ../temp/dati
        $

mentre nel caso dei 64k:

        gtrev@gundam:~/temp$ find -L . -print0 | cpio --null -ovH crc -C 65536 -O root@goldrake:/dev/st0 --rsh-command=/usr/bin/ssh                                    
 
        gtrev@gundam:~/temp$ cd ..
        gtrev@gundam:~$ mkdir temp3
        gtrev@gundam:~$ cd temp3/
        gtrev@gundam:~/temp3$ time cpio -ivmud -H crc -C 65536 -I root@goldrake:/dev/st0 --rsh-command=/usr/bin/ssh
 
        real    7m40.068s
        user    0m9.717s
        sys     0m23.261s
        gtrev@gundam:~/temp3$ diff dati ../temp/dati
        gtrev@gundam:~/temp3$

Poiché la dimensione di una cassetta DAT compatibile con l'HP DAT 40 è di 20GB non compressi, ho definito un filesystem di esattamente 20GB nel server casalingo: questo è il filesystem che viene regolarmente salvato su nastro. Poiché il server è configurato con lvm, devo eseguire le seguenti operazioni per creare il nuovo filesystem:

  • Verifico di avere spazio su disco:
       root@gundam:/# vgdisplay gundam | grep "Free  PE"
         Free  PE / Size       105379 / 411.64 GiB
       root@gundam:/#
  • Creo un nuovo logical volume di nome backup con dimensione 20G:
       root@gundam:/# lvcreate -L20G -nbackup gundam
  • Creo il filesystem ext4 sul LV appena creato:
       root@gundam:/# mkfs.ext4 /dev/gundam/backup
  • Creo la directory dove voglio montare il nuovo filesystem:
       root@gundam:/# mkdir /backup
  • Aggiorno /etc/fstab con la riga:
       /dev/mapper/gundam-backup /backup        ext4    defaults        0       2
  • Monto il filesystem:
       root@gundam:/# mount -a  

A questo punto il backup consiste nell'inserire la cassetta nel dat ed eseguire il seguente comando:

    $ find -L . -print0 | cpio --null -ovH crc -C 65536 -O root@goldrake:/dev/st0 --rsh-command=/usr/bin/ssh

mentre se dobbiamo estrarre i dati dalla cassetta:

    $ cpio -ivmud -H crc -C 65536 -I root@goldrake:/dev/st0 --rsh-command=/usr/bin/ssh

Blog: 

Programmazione: 

Gestione delle immagini iso da riga di comando

Esistono svariati programmi con interfaccia grafica che permettono la creazione e la masterizzazione di immagini ISO. Le stesse funzionalità si ritrovano anche in comandi eseguibili comodamente dalla riga di comando. Di seguito ne vediamo alcuni.

Se dobbiamo creare un'immagine ISO a partire da una directory a filesystem:

 root@debian:~# genisoimage -JR -o /tmp/test.iso /home/gtrev/foto/
I: -input-charset not specified, using utf-8 (detected in locale settings)
  4.24% done, estimate finish Wed Mar  4 22:33:52 2015
  8.48% done, estimate finish Wed Mar  4 22:33:40 2015
 12.71% done, estimate finish Wed Mar  4 22:33:36 2015
 16.96% done, estimate finish Wed Mar  4 22:33:34 2015
 21.19% done, estimate finish Wed Mar  4 22:33:38 2015
 25.42% done, estimate finish Wed Mar  4 22:33:36 2015
 29.66% done, estimate finish Wed Mar  4 22:33:35 2015
 33.91% done, estimate finish Wed Mar  4 22:33:37 2015
 38.14% done, estimate finish Wed Mar  4 22:33:36 2015
 42.38% done, estimate finish Wed Mar  4 22:33:38 2015
 46.61% done, estimate finish Wed Mar  4 22:33:37 2015
 50.84% done, estimate finish Wed Mar  4 22:33:36 2015
 55.08% done, estimate finish Wed Mar  4 22:33:36 2015
 59.32% done, estimate finish Wed Mar  4 22:33:37 2015
 63.55% done, estimate finish Wed Mar  4 22:33:36 2015
 67.79% done, estimate finish Wed Mar  4 22:33:36 2015
 72.03% done, estimate finish Wed Mar  4 22:33:37 2015
 76.27% done, estimate finish Wed Mar  4 22:33:36 2015
 80.50% done, estimate finish Wed Mar  4 22:33:36 2015
 84.75% done, estimate finish Wed Mar  4 22:33:37 2015
 88.99% done, estimate finish Wed Mar  4 22:33:36 2015
 93.22% done, estimate finish Wed Mar  4 22:33:36 2015
 97.46% done, estimate finish Wed Mar  4 22:33:37 2015
Total translation table size: 0
Total rockridge attributes bytes: 26712
Total directory bytes: 0
Path table size(bytes): 10
Max brk space used 42000
118014 extents written (230 MB)
root@debian:~# 

L'opzione -J indica di usare le estensioni Joliet, mentre l'opzione -R di usare quelle Rock Ridge.

Se dobbiamo montare un'immagine ISO il comando da usare è:

root@debian:~# mount -t iso9660 -o ro,loop,noauto debian-7.8.0-amd64-netinst.iso /tmp/iso

Se dobbiamo masterizzare un'immagine su un CD/DVD:

root@debian:~# growisofs -dvd-compat -Z /dev/sr0=/var/tmp/debian-7.8.0-amd64-netinst.iso 
Executing 'builtin_dd if=/var/tmp/debian-7.8.0-amd64-netinst.iso of=/dev/sr0 obs=32k seek=0'
/dev/sr0: "Current Write Speed" is 8.2x1352KBps.
     491520/232783872 ( 0.2%) @0.0x, remaining 31:30 RBU 100.0% UBU   0.0%
   10092544/232783872 ( 4.3%) @2.1x, remaining 2:34 RBU 100.0% UBU  98.6%
   26214400/232783872 (11.3%) @3.5x, remaining 1:18 RBU  99.9% UBU  98.6%
   42434560/232783872 (18.2%) @3.5x, remaining 1:02 RBU 100.0% UBU  98.6%
   58785792/232783872 (25.3%) @3.5x, remaining 0:50 RBU 100.0% UBU  99.0%
   75300864/232783872 (32.3%) @3.6x, remaining 0:41 RBU 100.0% UBU  98.6%
   91914240/232783872 (39.5%) @3.6x, remaining 0:36 RBU 100.0% UBU  98.6%
  108658688/232783872 (46.7%) @3.6x, remaining 0:30 RBU 100.0% UBU  98.6%
  125566976/232783872 (53.9%) @3.7x, remaining 0:26 RBU 100.0% UBU  98.6%
  137428992/232783872 (59.0%) @2.6x, remaining 0:23 RBU 100.0% UBU  98.6%
  152043520/232783872 (65.3%) @3.2x, remaining 0:19 RBU 100.0% UBU  98.1%
  169279488/232783872 (72.7%) @3.7x, remaining 0:15 RBU 100.0% UBU  98.6%
  186613760/232783872 (80.2%) @3.8x, remaining 0:10 RBU 100.0% UBU  98.6%
  204111872/232783872 (87.7%) @3.8x, remaining 0:06 RBU  85.4% UBU  98.1%
  221708288/232783872 (95.2%) @3.8x, remaining 0:02 RBU  33.0% UBU  98.6%
builtin_dd: 113664*2KB out @ average 3.2x1352KBps
/dev/sr0: flushing cache
/dev/sr0: updating RMA
/dev/sr0: closing disc
/dev/sr0: reloading tray
root@debian:~# 

Senza passare per l'immagine è possibile masterizzare direttamente un insieme di file con il comando:

root@debian:~#  growisofs -dvd-compat -Z /dev/sr0 -J -R /home/gtrev/foto

Se invece vogliamo creare un chiavetta USB da utilizzare per fare il boot della nostra immagine ISO di debian:

root@debian:~# dd if=/var/tmp/debian-7.8.0-amd64-netinst.iso of=/dev/sdb oflag=direct bs=1048576                                                                                                               
222+0 record dentro
222+0 record fuori
232783872 byte (233 MB) copiati, 60,0544 s, 3,9 MB/s
root@debian:~#

Blog: 

Programmazione: 

Pagine

Subscribe to RSS - cli