montare hard disk esterno in sola lettura

male.

allora rivediamo i listati dello script e della regola udev, inoltre gli output di:

$ lsusb

e

$ ll ...

sia della regola udev che dello script.

[quote=virus]male.

allora rivediamo i listati dello script e della regola udev, inoltre gli output di:

$ lsusb

[/quote]

[marco@localhost ~]$ lsusb
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 002 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 003 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 004 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 005 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 006 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 007 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 008 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 007 Device 002: ID 0764:0501 Cyber Power System, Inc. CP1500 AVR UPS
Bus 008 Device 002: ID 046d:c05b Logitech, Inc. 
Bus 002 Device 017: ID 04fc:0c25 Sunplus Technology Co., Ltd SATALink SPIF22

Quando accendo l’hard disk, nel log leggo, tra l’altro:

[marco@localhost ~]$ sudo cat /var/log/messages | grep "New USB device found" | grep "Jan 19" | grep "15:38"
Jan 19 15:38:03 localhost kernel: [30465.785632] usb 2-2: New USB device found, idVendor=04fc, idProduct=0c25
[marco@localhost ~]$ 

[quote]
e

$ ll ...

sia della regola udev che dello script.[/quote]

[marco@localhost ~]$ ll /lib/udev/rules.d/99-fantascienza.rules
-rw-r--r--. 1 root root 98 19 gen 15.37 /lib/udev/rules.d/99-fantascienza.rules
[marco@localhost ~]$ cat /lib/udev/rules.d/99-fantascienza.rules
SUBSYSTEM=="usb", ATTRS{idVendor}=="04fc", ATTRS{idProduct}=="0c25", RUN+="/usr/bin/fantascienza"
[marco@localhost ~]$ ll /usr/bin/fantascienza
-rwxrwxr-x. 1 root root 159 19 gen 15.07 /usr/bin/fantascienza
[marco@localhost ~]$ cat /usr/bin/fantascienza
#!/bin/sh
udisks --unmount /dev/disk/by-uuid/C0A84BE8A84BDB92
udisks --mount /dev/disk/by-uuid/C0A84BE8A84BDB92 --mount-options uid=500,ro --mount-fstype ntfs
[marco@localhost ~]$ 

N.B. Per il momento ho lasciato udisks, che non richiede la password di root come mount e umount, per evitare il dubbio che lo script fosse fermo ad una richiesta di password… su un terminale non visibile dentro gnome. Il problema della cartella dove montare lo affronterò in un secondo momento. In ogni caso, com mount e umount era la stessa identica cosa.

N.B.2 La regola viene sicuramente letta, perché se la faccio puntare ad un file non esistente, quando accendo l’hard disk ottengo, tra l’altro, in /var/log/messages:

Jan 19 15:30:12 localhost udevd[11573]: failed to execute '/usr/bin/fantascienza+' '/usr/bin/fantascienza+': No such file or directory
Jan 19 15:30:12 localhost udevd[11575]: failed to execute '/usr/bin/fantascienza+' '/usr/bin/fantascienza+': No such file or directory

Il resto del file di log è perfettamente identico (numero attribuito al device a parte) a quando la regola è corretta.

nella segnalazione c’è una incongruenza, cerca di lanciare /usr/bin/fantascienza+ mentre il file è /usr/bin/fantascienza senza +.
non è che nella regola udev c’è qualche carattere “spurio” e non te ne accorgi ?
consiglio una riscrittura da zero della regola.

insisto per l’uso di mount ed umount invece di udisks, tanto è root che lancia lo script quindi non chiederà mai la password,
e poi udisks te la monta esattamente dove non vuoi tu.

L’incongruenza l’avevo creata apposta per verificare se la regola veniva eseguita, ma ho tolto subito dopo il +, ed ora è a posto.

[quote]
Non è che nella regola udev c’è qualche carattere “spurio” e non te ne accorgi ?[/quote]
Lo escludo

In ogni caso, per togliere ogni dubbio, ho riscritto “a mano” la regola:

cat /lib/udev/rules.d/99-fantascienza.rules
SUBSYSTEM=="usb", ATTRS{idVendor}=="04fc", ATTRS{idProduct}=="0c25", RUN+="/usr/bin/fantascienza"

[quote]
Insisto per l’uso di mount ed umount invece di udisks, tanto è root che lancia lo script quindi non chiederà mai la password,
e poi udisks te la monta esattamente dove non vuoi tu.[/quote]
Non mi sembrava che cambiasse nulla ieri, ma torniamo a

cat /usr/bin/fantascienza
#!/bin/sh
umount /media/Fantascienza
mount -o uid=500,ro UUID=C0A84BE8A84BDB92 /Windows/Film/Fantascienza

Riprovato, e confermo che non funziona. Viene montato SOLO in /media/Fantascienza, e in lettura-scrittura. Ma tu sei sicuro che debba funzionare? Lo hai provato?

[quote=virus]lascia lo script con mount ed umount.

ora a parte che lo monta in /media
lo monta anche in /Windows/Film/Fantascienza ?[/quote]
Ah, tra l’altro, a me risulta che non sia possibile montare in due posti diversi la stessa partizione: ecco il risultato, con /media/fantascienza montato:

[marco@localhost ~]$ sudo mount -o uid=500,ro UUID=C0A84BE8A84BDB92 /Windows/Film/Fantascienza
[sudo] password for marco: 
Mount is denied because the NTFS volume is already exclusively opened.
The volume may be already mounted, or another software may use it which
could be identified for example by the help of the 'fuser' command.
[marco@localhost ~]$ 

Aggiornamento: ho provato con una chiavetta formattata in fat, per escludere che il problema derivasse da ntfs, e mount e umount vengono ignorati.
La cosa strana è che sembra che lo script venga eseguito. Infatti, dopo aver dato

[marco@localhost ~]$ ps -e | grep gnome-shell
13764 ?        00:06:30 gnome-shell
13774 ?        00:00:00 gnome-shell-cal

ho modificato il file da eseguire in

[marco@localhost ~]$ cat /home/marco/bin/prova
#!/bin/sh
kill -9 13764

risultato: appena ho inserito la chiavetta sono sparite finestre e icone; dopo qualche secondo è riconparso tutto, e ho visto che

[marco@localhost ~]$ ps -e | grep gnome-shell
14863 ?        00:00:04 gnome-shell
14885 ?        00:00:00 gnome-shell-cal

Quindi mi viene il dubbio che mount, umount e udisks vadano per qualche motivo in errore, ma non riesco a capire il motivo né come verificarlo.

Come sospettavo: mount e umount vanno in errore.

Nuova versione di /usr/bin/fantascienza:

#!/bin/sh
umount /media/Fantascienza
echo "Errore umount: $?" > /home/marco/Scrivania/errore.txt
mount -o uid=500,ro UUID=C0A84BE8A84BDB92 /Windows/Film/Fantascienza
echo "Errore mount: $?" >> /home/marco/Scrivania/errore.txt

Contenuto del file /home/marco/Scrivania/errore.txt dopo aver acceso l’hard disk:

Errore umount: 1
Errore mount: 32

Ora, che umount vada in errore è giusto (non poteva essere montato da spento!), ma mi domando cosa significhi l’errore 32 di mount. sempre tenendo presente che digitando

su -c /usr/bin/fantascienza

il risultato è

Errore umount: 0
Errore mount: 0
[marco@localhost ~]$ man mount | grep -A16 "return codes" | tr "\n" "?" | sed 's/??/?/g' | tr "?" "\n"
       mount has the following return codes (the bits can be ORed):
       0      success
       1      incorrect invocation or permissions
       2      system error (out of memory, cannot fork, no more loop devices)
       4      internal mount bug
       8      user interrupt
       16     problems writing or locking /etc/mtab
       32     mount failure
       64     some mount succeeded
[marco@localhost ~]$ 

Notare che, se provo a montare una partizione già montata, ottengo l’errore 16, e non 32 come con la regola di udev.

Ho capito il problema (ma non la soluzione):

[marco@localhost ~]$ cat /usr/bin/fantascienza
#!/bin/sh
echo "umount:" >/home/marco/Scrivania/errore.txt
umount /media/Fantascienza >>/home/marco/Scrivania/errore.txt 2>&1
echo "Errore $?" >>/home/marco/Scrivania/errore.txt
echo "Errore mount:" >>/home/marco/Scrivania/errore.txt
mount -v -t ntfs-3g -o uid=500,ro UUID=C0A84BE8A84BDB92 /Windows/Film/Fantascienza >>/home/marco/Scrivania/errore.txt 2>&1
echo "Errore $?" >>/home/marco/Scrivania/errore.txt
[marco@localhost ~]$ 

Risultato:

[marco@localhost Scrivania]$ cat /home/marco/Scrivania/errore.txt
umount:
umount: /media/Fantascienza: not found
Errore 1
Errore mount:
ntfs-3g: Failed to access volume 'UUID=C0A84BE8A84BDB92': No such file or directory
[CUT]
Errore 11
[marco@localhost Scrivania]$ 

Direi proprio che lo script venge eseguito troppo presto, quando ancora l’hard disk è “staccato” (è il termine giusto?) dal file system.

Forse ho risolto.
Aggiungendo uno sleep 20 all’inizio dello script, per la prima volta, ha funzionato. Ora devo trovare un valore ragionevole, e poi posto il risultato.

va bene.
visto che la cosa ci sta dando problemi, cambiamo modo.

facciamo diventare questo disco agli occhi del sistema un disco interno invece di un disco esterno , per cui udisks non dovrebbe montarlo in automatico.

vediamo se questa prima cosa funziona, poi ci dedichiamo al problema montaggio.
modifica la regola udev, in maniera che udisks venga inibito, in questo modo:

# gedit /lib/udev/rules.d/99-fantascienza.rules

SUBSYSTEM=="usb", ATTRS{idVendor}=="04fc", ATTRS{idProduct}=="0c25", ENV{UDISKS_SYSTEM_INTERNAL}="1", ENV{UDISKS_PRESENTATION_HIDE}="1"

se leggi le altre variabili di ambiente in:

$ man 7 udisks

potresti trovare anche quella che fa esattamente quello che cerchi.

No, no, forse ti è sfuggito l’ultimo messaggio che ho postato: ora funziona. E, a ben vedere, nella discussione che mi avevi indicato, era indicata la necessità di un’attesa prima di montare l’hard disk.

La soluzione:

[marco@localhost ~]$ cat /lib/udev/rules.d/99-fantascienza.rulesSUBSYSTEM=="usb", ATTRS{idVendor}=="04fc", ATTRS{idProduct}=="0c25", RUN+="/usr/bin/monta_film_fantascienza"
[marco@localhost ~]$ cat /usr/bin/monta_film_fantascienza
#!/bin/sh
sleep 3
umount /media/Fantascienza
mount -t ntfs-3g -o uid=500,ro UUID=C0A84BE8A84BDB92 /Windows/Film/Fantascienza

E ora funziona. come ho già detto, lo sleep è necessario perché altrimenti il sistema non è ancora in grado di riconoscere la presenza di una partizione con UUID=C0A84BE8A84BDB92, e mount fallisce.

Una sola cosa strana: quando redirigevo ancora l’output su file, mi sono reso conto che il file /usr/bin/monta_film_fantascienza viene eseguito due volte (la seconda volta, ovviamente, fallisce, visto che la partizione è già montata). Curioso. Ma la sostanza è che quando accendo l’hard disk la partizione che contiene viene montata dove e con le opzioni che dico io.

Grazie.

Ah, volendo fare il pignolo… sarebbe utile avere ugualmente in computer:/// di nautilus e sulla Scrivania l’icona per smontare o rimuovere la partizione.

Mi sono accorto di avere un problema:

Bus 002 Device 036: ID 04fc:0c25 Sunplus Technology Co., Ltd SATALink SPIF225A
Bus 002 Device 038: ID 04fc:0c25 Sunplus Technology Co., Ltd SATALink SPIF225A

Entrambi gli hard disk hanno lo stesso identificativo. Coime faccio a montarne uno da una parte e uno dall’altra???

Come non detto, funziona lo stesso. Forse mi conviene creare un’unica regola, e un unico file per montare entrambi gli hard disk.

Rimane da capire se si può fare in modo da far comparire l’icona della partizione montata per smontarla o rimuovere l’unità.

bene. ottimo lavoro.

Sì. direi che adesso funziona. L’unico problema rimasto è che quando accendo insieme tutti e 3 gli hard disk il mio script viene eseguito 3 volte (in realtà 6, visto che, non ho capito perché, viene richiamato due volte per ogni hard disk acceso), con il risultato che è una lotta tra me e udisks a chi monta per ultimo la partizione. Con il risultato di finestre (quelle che chiedono di aprire o di espellere) che compaiono e scompaiono in basso al centro. Inoltre, non vorrei che di tanto in tanto “vincesse” udisks.

Qui avevi accennato alla possibilità di inibire del tutto di montare gli hard disk in /media/label. Mi puoi spiegare come si fa?

inibisci udisks con la regola del post 31 da aggiungere a quella già esistente, anzi mettila prima, cioè chiamala 90 invece di 99.

Ho provato, ma non cambia niente. È sempre una gara tra il mio script e udisks a chi monta per ultimo. La vinco io, ma si vedono le icone in computer:/// di nautilus e gli avvisi in basso al centro di gnome che appaiono e scompaiono.

[marco@localhost rules.d]$ cat /lib/udev/rules.d/90-hd_esterni.rules
SUBSYSTEM=="usb", ATTRS{idVendor}=="04fc", ATTRS{idProduct}=="0c25", ENV{UDISKS_SYSTEM_INTERNAL}="1", ENV{UDISKS_PRESENTATION_HIDE}="1"
SUBSYSTEM=="usb", ATTRS{idVendor}=="05e3", ATTRS{idProduct}=="0718", ENV{UDISKS_SYSTEM_INTERNAL}="1", ENV{UDISKS_PRESENTATION_HIDE}="1" 
[marco@localhost rules.d]$ cat /lib/udev/rules.d/99-hd_esterni.rules
SUBSYSTEM=="usb", ATTRS{idVendor}=="04fc", ATTRS{idProduct}=="0c25", RUN+="/usr/bin/mountusb"
SUBSYSTEM=="usb", ATTRS{idVendor}=="05e3", ATTRS{idProduct}=="0718", RUN+="/usr/bin/mountusb"

Dunque, effettivamente lo script funziona nel senso che gli hard disk usb vengono montati automaticamente dal mio script quando li accendo A volte vengono montati prima da udisks, e poi il mio script li smonta e li rimonta come e dove dico io, e non è il massimo, ma comunque funziona.

Quello che non va è che, se smonto gli hard disk usb, udisks immediatamente li monta come e dove dice lui. Io, invece, se li smonto, vorrei che rimanessero smontati. La regola

[marco@localhost rules.d]$ cat /lib/udev/rules.d/90-hd_esterni.rules
SUBSYSTEM=="usb", ATTRS{idVendor}=="04fc", ATTRS{idProduct}=="0c25", ENV{UDISKS_SYSTEM_INTERNAL}="1", ENV{UDISKS_PRESENTATION_HIDE}="1"
SUBSYSTEM=="usb", ATTRS{idVendor}=="05e3", ATTRS{idProduct}=="0718", ENV{UDISKS_SYSTEM_INTERNAL}="1", ENV{UDISKS_PRESENTATION_HIDE}="1"

non sembra funzionare, nel senso che probabilmente impedisce di visualizzare l’avviso che la partizione è stata montata, ma non di montarla.

Mi correggo: non viene montata, ma viene visualizzata in nautilus computer:/// l’icona della partizione. Ma cliccando sulì’icona viene comunque montata come e dove dice udisks.

non ho capito cosa esegue la regola 90-hd_esterni.rules, puoi chiarire ?

ps: ho cancellato [risolto in parte], perché consideriamo i problemi o risolti o non risolti, non pensiamo che ci sia una via di mezzo.