# Creato script per mount penne usb

## SilverXXX

Come da oggetto, ho creato un script che funziona tramite udev+hotplug per montare i dispositivi di archiviazione di massa usb (senza linee in fstab). Premetto che ancora non supporta partizione multiple su un solo device e che se anche avete messo delle linee in ftsab per quei device (magari tramite symlink) lui se ne sbatte (ma è tutta roba che sta nel todo, dovrebbe arrivare a breve). Cmq va. In pratica quando hotplug richiama udev, lui a sua volta fa partire questo script, in caso di inserimento che crea una cartella chiamata %s{vendor}-%s{model} (notazione sysfs, in pratica marca-modello es. Toshiba-mk2124) dentro la cartelle /mnt/usb-storage, opzione facilmente modificabile nello script. e in caso di rimozione smonta il device e cancella la cartella.

Ringrazio xchris che mi ha sopportato quando gli rompevo le scatole via chat se non ero capace a fare qualcosa   :Embarassed: 

----------

## SilverXXX

Trovate lo script nella sezione donwload di www.gentoo-italia.net (qui)

per "installarlo", mettete lo script in /etc/dev.d/default/usb-storage.dev; ovviamente deve essere eseguibile.

----------

## otaku

è una paranoia mia... ma non si dovrebbe smontare prima di rimuovere? a volte quando smonto la mia fotocamera il SO la tiene in uso per una manciata di secondi e poi la smonta... per questo ho preferito crearmi uno scriptino che carica e scarica i moduli... qualcuno saprebbe dirmi se è possibile scollegare le usb così "a caldo" è un operazione sicura per l'integrità del filesystem?

----------

## Tùrin_Mormegil

 *otaku wrote:*   

> è una paranoia mia... ma non si dovrebbe smontare prima di rimuovere? a volte quando smonto la mia fotocamera il SO la tiene in uso per una manciata di secondi e poi la smonta... per questo ho preferito crearmi uno scriptino che carica e scarica i moduli... qualcuno saprebbe dirmi se è possibile scollegare le usb così "a caldo" è un operazione sicura per l'integrità del filesystem?

 

cioè dare 

```
umount /mnt/digicam
```

?

----------

## otaku

ho letto che durante l'umount il sitema sincronizza i dati sul device "realmente presenti" con quelli che teoricamente dovrebbero esserci. Però udev si accorge che il device usb è scollegato solo quando è effettivamente scollegato fisicamente, quindi non è possibile la sincronizzazione...oppure i device usb in quanto usb vengono trattati in modo particolare dal kernel?

scusa per il post contorto spero sia comprensibile

----------

## fedeliallalinea

Non dovresti toglierli a caldo i device usb. Neanche con windows dovresti farlo visto che devi smontrarlo anche li a mano.

----------

## Geps

io sapevo che con "sync" nelle opzioni di fstab si risolveva il problema dei dati "volatili".

però attendo conferme.

----------

## fedeliallalinea

 *Geps wrote:*   

> io sapevo che con "sync" nelle opzioni di fstab si risolveva il problema dei dati "volatili".

 

Si ma lo fa ogni quanto il sync?

----------

## SilverXXX

Teoricamente è tutto vero (e anche con lo script, fareste meglio a smontarli), cmq ho aggiunto l'opzione sync in modo che eviti i buffer e copi direttamente nel dispositivo (dovrebbe saltare anche il buffer interno al dispositivo); quindi a meno che non scolleghiate il dispositivo durante la copia, non ci dovrebbero essere problemi

----------

## randomaze

 *SilverXXX wrote:*   

> quindi a meno che non scolleghiate il dispositivo durante la copia, non ci dovrebbero essere problemi

 

Hai fatto bene ad aggiungere il sync, e comunque andrebbero sempre smontati  :Wink: 

----------

## SilverXXX

Piccolo update: rileggendo la pagine man di mount, ho notato che tra le opzioni è meglio aggiungere anche dirsync (come sync, ma per le cartelle)

----------

## SilverXXX

Durante la scrittura della nuova versione (che supporta la ricerca del device anche con link in fstab, e più device con stesso modello e marca, ma ancora niente partizioni multiple) è sorto un problemino: se l'utente smonta la penna, lo script non riesce a cancellare la cartella, perchè è già sparita l'entrata in mtab; dovrei quindi utilizzare un file che mi permetta di segnarmi quali cartelle creo (oppure creo le cartelle di mount dentro tmp, così poi il sistema le pialla lui). Cosa suggerite in proposito?

----------

## cloc3

 *SilverXXX wrote:*   

> ... è sorto un problemino: se l'utente smonta la penna, lo script non riesce a cancellare la cartella, perchè è già sparita l'entrata in mtab ...

 

Ho provato il tuo programmino. Va piuttosto bene. Qualche volta, però, smontando la penna (anzi, la macchina fotografica), il sistema si inceppa completamente e obbliga a forzare lo shutdown.

Ho fatto le prove usando solamente il comando mount per osservare la connessione, quindi senza alcun accesso al dispositivo.

La cosa non è  sistematica, ma può avvenire dopo tre o quattro prove favorevoli.

Usando "ls /mnt/usb-storage", invece, ho visto che, se le cose vanno bene la cartella viene cancellata correttamente.

Ancora: in fase d'avvio compaiono tre messaggi tipo " ... line 13: udevinfo command not found"

----------

## SilverXXX

lo so, era ancora un pò grezzo, adesso vi posto la nuova versione "stabile", che migliora un pò il comportamento generale, e ho spostato le cartelle di mount in /tmp/usb-mount. Sto lavorando al controllo di fstab, ma temo ci vorrà ancora un pò per quello

----------

## SilverXXX

Ecco il nuovo script :

```
#!/bin/bash

# Opzioni

UMSD_MNT_OPTIONS="-o sync,noatime,users,umask=000"

#forse sarebbe meglio passare a /tmp/usb-storage e togliere la cancellazione del dir dallo script

UMSD_MNT_DIR="/tmp/usb-storage"

#variabiler per il controllo di $UMSD_MNT_DIR in tmp; se yes, le cartelle di mount non vengono cancellate

UMSD_TMP_MNT="yes"

#come log, utilizzo UDEV_LOG

UMSD_LOG="/var/log/umsd.log"

#base monta in sda1,sdb1..; ext monta in /%vendor-%model

UMSD_TYPE="ext"

devDir=$(udevinfo -q path -n $DEVNAME)

vendor=""

model=""

mntDir=""

# 1 parametro

# - la stringa da loggare

function logStr {

if [ -n $UMSD_LOG ]

then

        echo $1 >> $UMSD_LOG

fi

}

# 1 parametro

# - la dir da creare

# ritorna con echo la dir effettivamente creata, ritorna 1 (NON con echo) se dàerrore

function createFolder {

if [ ! -d $1 ]

then

        logStr "Directory created"

        mkdir -p $1

        echo $1

        return 0

else

        #se la directory esiste, ma non è montata, la riuso

        if [ -z $(cat '/etc/mtab' | grep $1 ) ]

        then

                logStr "Directory found not mounted"

                echo $1

                return 0

        else

                for i in 1 2 3 4 5 6 7 8 9

                do

                        if [ ! -d $1-$i ]

                        then

                                logStr "Numeric directory created"

                                mkdir $1-$i

                                echo $1-$i

                                return 0

                        fi

                done

        fi

        return 1

fi

}

if [ "$ACTION" = "add"  ]

then

        # se il device è un block device montabile (una partizione) deve contenere la variabile start

        if [ -e /sys/$devDir/start ]

        then

                # ottengo vendor e model del device

                model=$(cat /sys/$devDir/../device/model)

                vendor=$(cat /sys/$devDir/../device/vendor)

                if [ "$UMSD_TYPE" = "base" ]

                then

                        mntDir=$UMSD_MNT_DIR/$(basename $DEVNAME)

                elif [ "$UMSD_TYPE" = "ext" ]

                then

                        mntDir=$UMSD_MNT_DIR/$(echo -n $vendor)-$(echo -n $model)

                fi

                #se non c'è la dir la creo

                mntDir=$(createFolder $mntDir)

                if [ $? = 0 ]

                then

                        logStr "created $mntDir"

                else

                        logStr "errror while creating $mntDir with code $?"

                fi

                #monto  il dev in $mntDir

                if ! mount -t auto $UMSD_MNT_OPTIONS $DEVNAME $mntDir

                then

                        logStr "error while mounting $DEVNAME at $mntDir with code $?"

                else

                        logStr "mounted $DEVNAME at $mntDir with $UMSD_MNT_OPTIONS"

                fi

        fi

elif [ "$ACTION" = "remove" ]

then

        if [ $(cat /etc/mtab | grep $DEVNAME | gawk '{ print $1 }') = $DEVNAME ]#devo trovare il modo di stabilire in maniera univoca se $DEVNAME è un dev smontabile

        then

                mntDir=$(cat /etc/mtab | grep $DEVNAME | gawk '{ print $2 }')

                if umount $DEVNAME

                then

                        logStr "umounted $DEVNAME "

                else

                        logStr "error while umounting $DEVNAME with code $?"

                fi

                if rmdir $mntDir

                then

                        logStr "deleted $mntDir"

                else

                        logStr "error while deleting $mntDir with code $?"

                fi

        fi

fi
```

purtroppo ancora non ho capito dove bisogna mettere lo script per fare in modo che parta solo per i dispositivi usb-storage, se qualcuno lo sa batta un colpo   :Very Happy: 

----------

## fedeliallalinea

Non hai un sito dove mettere il codice cosi' metti nel primo post solo il riferimento e riporti con nuovi post le nuove versioni?

----------

## SilverXXX

Purtroppo no, ma si mi dite dove potrei metterlo, lo faccio volentieri

----------

## FMulder

Ciao, ho provato il tuo script, sembra funzionare bene, grazie  :Wink: 

Una domanda... non credo riguardi direttamente lo script..

in pratica io ho un iPod e una macchina fotografica, tramite udev e hotplug ho già  creato dei mini-script per montarli automaticamente nelle cartelle che voglio io e con i device name e symlink che voglio io..

il tuo script lo sto usando per quando mi può capitare di dover collegare una penna usb generica.. però viene eseguito anche quando connetto l'ipod ad esempio, nonostante venga già  eseguito lo script specifico per l'ipod!

Insomma, lo script dovrebbe venire eseguito come default appunto, e quindi se c'è uno script più "specifico" non dovrebbe venir preso in considerazione..

Certo, non è un grosso problema, funziona tutto comunque, ovviamente non fa un doppio mount, ma è una questione di principio  :Wink: 

Soluzioni?

----------

## SilverXXX

La sto implementando nella nuove versioni   :Very Happy: 

----------

## randomaze

 *SilverXXX wrote:*   

> Purtroppo no, ma si mi dite dove potrei metterlo, lo faccio volentieri

 

Prova con la sezione dowload di gentoo-italia  :Wink: 

----------

## SilverXXX

Una  sola domanda randomaze: mi sono iscritto, ma come faccio ad aggiungere lo script nella sezione download?

----------

## SilverXXX

Ok, è sorto un problemuzzo abbastanza grave al quale non avevo minimamente pensato; nella nuova versione ho fatto il controllo di fstab e va abbastanza bene (fin'ora nessun problema, ma devo ancora testare alcune condizioni), solo che quando monto il mio ngage con questa riga di fstab:

```
/dev/ngage              /mnt/ngage      auto            sync,users,noatime    0 0
```

 non si può entrare nella cartella dove è montato il dispositivo. Come mai?

EDIT: ho dimenticato un altra cosa; io monto un hd portatile con l'opzione users, per poterlo montare, smontare e scrivere da utente (è in fat32); per rendere possibile la scrittura anche dopo che è stato montato come root (dallo script) devo aggiungere umask=000 alle opzioni, giusto?

----------

## gutter

Devi usare user e non users   :Very Happy: 

----------

## FMulder

 *SilverXXX wrote:*   

> EDIT: ho dimenticato un altra cosa; io monto un hd portatile con l'opzione users, per poterlo montare, smontare e scrivere da utente (è in fat32); per rendere possibile la scrittura anche dopo che è stato montato come root (dallo script) devo aggiungere umask=000 alle opzioni, giusto?

 

Devi usare user, come dice gutter, e per poterlo smontare devi prima averlo montato con lo stesso utente, mi sembra... umask=000 è giusto  :Wink: 

----------

## SilverXXX

Appunto ho messo users, se io monto il device dallo script (come root, credo) per poterlo smontare anche da utente normale ho bisogno dell'opzione users. Solo non riesco a spiegarmi perchè non riesco a entrare nella cartella montata dell'ngage.

----------

## gutter

Devi metter user senza la s finale.

----------

## SilverXXX

Ma dopo l'utente non può più smontarlo

----------

## OKreZ

da man mount

```
user   Allow an ordinary user to mount the file system.  The name of the mounting user  is  written  to  mtab  so that he can unmount the file system again. This option implies the options noexec, nosuid, and nodev (unless overridden by subsequent options, as in the option line user,exec,dev,suid).

users  Allow  every  user  to  mount  and  unmount  the file system.  This option implies the options noexec, nosuid, and nodev (unless overridden by subsequent options, as in the option line users,exec,dev,suid)
```

----------

## SilverXXX

Appunto (la pagina man di mount l'avevo letta ovviamente).

----------

## gutter

 *SilverXXX wrote:*   

> Appunto (la pagina man di mount l'avevo letta ovviamente).

 

Mi pare che sia specificato che l'utente la possa smontare   :Wink: 

----------

## SilverXXX

Sì, ma solo l'utente che lo ha montato (che nel caso sia lo script a farlo, dovrebbe essere root); non si può dopo smontarlo velocemente da desktop (click destro -> smonta). Solo che mi dà quel problema dell'accesso alla cartella   :Crying or Very sad: 

----------

## federico

Perdonate la mia ignoranza ma se io utilizzassi udev potrei distinguere le apparecchiature? Mi pongo questo problema perche' ho una chiavetta usb e tra poco un lettore mp3 che si attacca su usb, se fossi in grado di distinguere quale dei due apparecchi e' stato attaccato potrei anche lanciare quando inserito il software piu' adeguato...

----------

## gutter

@federico: si lo puoi fare. Se cerchi nel forum in italiano mi pare che qualcuno avesse postato un howto che tratta ciò.

----------

## SilverXXX

Sì, appena finisco lo script faccio anche un piccolo howto che spiega un pò come usare udev + hotplug (e quindi gli script).

----------

## federico

Sarebbe il massimo, io ho uno script su hotplug che mi monta la penna in maniera intelligente ma vorrei migliorare con altre periferiche. In linea di massima il mio sistema ora monta la penna come root appena inserita, legge in file nella penna che contiene un'associazione macchina/utente, smonta la penna e la rimonta con l'utente giusto su quella macchina (altrimenti ti trovi tutte le periferiche montate come root e sei fregato)

----------

## SilverXXX

Premetto 2 cose, perÃ²: 1 - tramite hotplug e basta, non Ã¨ proprio il massimo, dato che i dev delle periferiche non sono stati creati quando parte lo script (o almeno cosÃ¬ ho letto) e cmq da udev Ã¨ piÃ¹ semplice; 2 - il metodo "corretto" supportato da freedesktop sarebbe l'utilizzo di hal, dbus Ã¨ il programma che li  utilizza, gnome-volume-manager o ivman, per adesso (non chiedetemi cosa fanno i singoli pacchetti, perchÃ¨ non ne ho la minima idea). Cmq, lo script funzia, anche se dÃ  ancora quel maledetto problema, che cmq vedrÃ² di risolvere.

----------

## SilverXXX

Ok, lo script è stato accettato da gentoo-italia, lo trovate nella sezione download

----------

## randomaze

 *SilverXXX wrote:*   

> Ok, lo script è stato accettato da gentoo-italia, lo trovate nella sezione download

 

Mea culpa, mi sa che era da un poco in attesa di approvazione e me ne sono accorto solo entrando nella sezione download  :Embarassed: 

----------

## SilverXXX

Non fa niente   :Very Happy:  , non ti preoccupare

----------

## superfayan

ho emerso udev e piazziato il tuo script.. naturalmente anche emerso hotplug.. ma niente... funziona solo se al posto del mouse metto la chiavetta... allora li si monta senza problemi..  se la piazzo su altre porte niente.. mi dice che non esiste sda..  :Confused: 

----------

## Thrain

Uhm, raga, davvero non voglio fare il guasta feste, anche perché come idea quella di SilverXXX non è comunque niente male... ma non c'è già dbus + hal che fa tutto ciò? Io li ho emersi e fan tutto questo in automatico... certo, dovrei configuarli in modo che creino la directory che voglio io... però ci sono e funzionano bene  :Very Happy:  .

Scusate ancora...

Ciao

----------

## iDreamer

scusate forse sbaglio.. ma non esite già il progetto utopia per questo?

vedi mio howto

https://forums.gentoo.org/viewtopic-t-277679-highlight-.html

che in caso di fotocamera addirittura apre la finestra di gphoto.. in caso di cd vuoto masterizza.. cd audio plauer cd? 

illuminatemi please:)

----------

## randomaze

 *Thrain wrote:*   

> ma non c'è già dbus + hal che fa tutto ciò?

 

 *iDreamer wrote:*   

> scusate forse sbaglio.. ma non esite già il progetto utopia per questo?

 

anche la copia di un file si piò fare con il comando "cp" oppure usando "mc", "rox" o "konquerror".... non capisco le vostre perplessità  :Rolling Eyes: 

----------

## SilverXXX

Il mio era solo una "pezza" finzhè hal+dbus non sono supportati per bene. Adesso con la 3.4 ci dovrebbe essere anche in kde il supporto, gnome2.10 che dovrebbe uscire entro fine marzo migliorerà ancorà il gvm (almeno spero, dato che a me aveva dato dei problemi),e penso che tutti i wm prima o poi lo supportino. Resta da vedere come si evolve la cosa, io sono contrario alla frammentazione delle forze, quindi spero che se ne escano con una soluzione unica e ben funzionante, in modo che la mia faccia la fine che si merita (il cestino).

----------

## Thrain

Bon, le risposte mi risultano soddisfacenti, quindi taccio  :Very Happy: 

Buon lavoro per lo script!

/me, da quando ha comprato un hd usb con settori danneggiati, è allergico a 'ste cose  :Laughing:   :Wink: 

Ciao

----------

## superfayan

hola... inanzitutto coplimenti per lo script.. va molto bene con le chiavette usb

volevo chiedervi come e  se potevo "integrare"  il tuo script con gnome.. 

mi spiego... appena pluggato la chiavetta mi crea come fa di solito gnome una icona sul desktop con il nome...

sarebbe molto comodo oltre ke "Figo" (stile mac os)  :Very Happy: 

altra cosa... ho riscontrato dei problemi con il mio disco esterno... n pratica montava solo una partizione (avendo 2 partizioni una NTFS e una FAT)...

come si può risolvere questo problema ?? a parte fare una unica partizione fat..  :Rolling Eyes: 

----------

## SilverXXX

Fa sempre piacere quando il proprio lavoro vien apprezzato  :Very Happy: 

Cmq, tra scuola, problemi al pc (mi è morto l'hd in cui tenevo gentoo  :Crying or Very sad:  ) e il fatto che hal+dbus+"applicazione a livello utente" ( gvm per gnome, e non so cosa per kde 3.4) siano ormai maturi, lo script non è andato avanti. Io ti consiglierei di usare hal+dbus+gvm, lo tengo sul mio serverino casalingo e non mi ha mai fatto una piega. Per il problema delle partizioni ci avevo pensato, ma non mi ricordo esattamente che problemi erano sorti (ma che cmq erano risolvibili, con del testing). A me kde metteve al icone sul desktop in automatico, se non mi ricordo male, bastava abilitare il display dei dispositivi sul desktop. Gnome lo uso poco, quindi non saprei. Se hai bisogno di qualcosa, basta che fai un fischio.

----------

## superfayan

 *SilverXXX wrote:*   

> Fa sempre piacere quando il proprio lavoro vien apprezzato 
> 
> Cmq, tra scuola, problemi al pc (mi è morto l'hd in cui tenevo gentoo  ) e il fatto che hal+dbus+"applicazione a livello utente" ( gvm per gnome, e non so cosa per kde 3.4) siano ormai maturi, lo script non è andato avanti. Io ti consiglierei di usare hal+dbus+gvm, lo tengo sul mio serverino casalingo e non mi ha mai fatto una piega. Per il problema delle partizioni ci avevo pensato, ma non mi ricordo esattamente che problemi erano sorti (ma che cmq erano risolvibili, con del testing). A me kde metteve al icone sul desktop in automatico, se non mi ricordo male, bastava abilitare il display dei dispositivi sul desktop. Gnome lo uso poco, quindi non saprei. Se hai bisogno di qualcosa, basta che fai un fischio.

 

buono.. appena ho un attimo provo..

 :Wink: 

----------

## SilverXXX

A chi fosse ancora vagamente interessato allo script, ci sto rimettendo mano (anche se il tempo non abbonda, quindi ci vorrà un minimo) per supportare le partizioni multiple, visto che ci ho dato un'occhiata e ho una vaga idea di come fare.

----------

