Creare Mount Point Univoci per le nostre periferiche USB.

Mar, 22/03/2005 - 20:04

Creare Mount Point Univoci per le nostre periferiche USB.

Inviato da moreno1 4 commenti

Le periferiche rimovibili stanno invadendo le nostre case, Memory Key, HardDisk USB o FireWire, Telecamere,
Macchine Fotografiche etc. etc.
Oramai il supporto di Linux e Mandrake a queste periferiche è quasi perfetto solo che per seplificare la
vita agli utenti viene a crearsi una situazione caotica.

Ipotizziamo di avere un disco e una memory key USB, quando colleghiamo il disco gli viene assegnato il punto di
mount /mnt/removable e quando inseriamo la memory key gli viene assegnato il mount point /mnt/removable1.
Il risultato si inverte se invertiamo l'ordine di inserzione dei device.
Se uno ha molti dispositivi rimovibili si entra in confusione totale non sapendo esattamente a quale dispositivo
fisico corrisponde il mount point.

Scopo di questa guida è proprio quello di spiegare come assegnare un mount point univoco ad ogni dispositivo in
modo da evitare spiacevoli errori.

Dato i notevoli cambiamenti che sono in corso per quel che riguarda la gestione delle periferiche, il metodo è valido
esclusivamente per le versioni 10.2 di Mandrake (dalla Beta1 in poi) e ovviamente per Cooker.
In futuro sono in cantiere cambiamenti ancora più radicali per cui non è detto che questa guida sia ancora valida
per le prossime versioni di Mandrake.

1)
Per prima cosa apriamo una bella finestra terminale e diventiamo root.

$ su
Password: ***********

2)
Inseriamo il dispositivo removibile che vogliamo identificare nella porta USB o FireWire.

Identificate un dispositivo alla volta altrimenti si rischia di fare una gran confusione.

3)
Per prima cosa dobbiamo capire quale device è stato assegnato al dispositivo.

$ less /etc/fstab

Questo comando ci permette di visualizzare il contenuto di fstab.
Di seguito ci sono le righe che ci interessano.

/dev/sdc1 /mnt/hdusb ext2 pamconsole,exec,noauto,managed 0 0
/dev/sdd1 /mnt/removable auto pamconsole,exec,noauto,noatime,sync,managed 0 0

La prima riga si riferisce ad un dispositivo che ha già subito il trattamento infatti il mount point è /mnt/hdusb.
La seconda riga invece si riferisce invece ad un dispositivo da sistemare.
A noi interessa solo sapere a quale device è assegnato il dispositivo, in questo caso /dev/sdd1.
Usciamo da less

Q

4)
Ora ci interessa ricavare tutte le informazioni utili ad identificare univocamente il dispositivo,
per far ciò si usa il comando lshal.

lshal > hal.txt
less hal.txt

Questo file anche se è un file di testo non è proprio user frendly.
Esso è composto da oggetti logici che hanno un tipo come volume, storage e usb etc.
Ogni oggetto ha un suo identificativo univoco chiamato udi e gli oggetti sono collegati fra di loro
usando proprio questo udi come riferimento.
Oltre all'udi ogni oggetto ha un certo numero di proprietà di vario genere (testo, numerico booleano etc).
Il nostro dispositivo viene descritto più o meno così:

Oggetto Dispositivo USB --> Oggetto Disco --> Oggetto Partizione

Di seguito è riportato tutto il testo relativi al dispositivo collegato a /dev/sdd1.

udi = '/org/freedesktop/Hal/devices/block_8_49'
volume.mount_point = '/mnt/removable' (string)
volume.policy.mount_option.noatime = true (bool)
volume.policy.mount_option.sync = true (bool)
volume.policy.desired_mount_point = 'removable' (string)
volume.policy.mount_filesystem = 'auto' (string)
volume.policy.should_mount = true (bool)
info.udi = '/org/freedesktop/Hal/devices/block_8_49' (string)
volume.size = 130793472 (0x7cbc000) (uint64)
volume.block_size = 512 (0x200) (int)
volume.num_blocks = 255456 (0x3e5e0) (int)
volume.partition.number = 1 (0x1) (int)
volume.is_partition = true (bool)
volume.is_mounted = true (bool)
volume.is_disc = false (bool)
volume.uuid = '' (string)
volume.label = '' (string)
volume.fsversion = '' (string)
volume.fsusage = 'filesystem' (string)
volume.fstype = 'vfat' (string)
info.product = 'Volume' (string)
block.storage_device = '/org/freedesktop/Hal/devices/block_8_48' (string)
block.minor = 49 (0x31) (int)
block.major = 8 (0x8) (int)
info.capabilities = 'block volume' (string)
info.category = 'volume' (string)
info.parent = '/org/freedesktop/Hal/devices/block_8_48' (string)
block.device = '/dev/sdd1' (string)
block.is_volume = true (bool)
block.have_scanned = false (bool)
block.no_partitions = false (bool)
linux.sysfs_path_device = '/sys/block/sdd/sdd1' (string)
linux.sysfs_path = '/sys/block/sdd/sdd1' (string)
info.bus = 'block' (string)

udi = '/org/freedesktop/Hal/devices/block_8_48'
storage.policy.should_mount = true (bool)
info.udi = '/org/freedesktop/Hal/devices/block_8_48' (string)
storage.requires_eject = false (bool)
storage.hotpluggable = true (bool)
storage.removable = true (bool)
info.product = 'Flash Drive' (string)
info.vendor = 'STF' (string)
storage.drive_type = 'disk' (string)
block.storage_device = '/org/freedesktop/Hal/devices/block_8_48' (string)
storage.physical_device = '/org/freedesktop/Hal/devices/usb_usb_device_ea0_6828_110_-1_8324B3BF3D696C49_0' (string)
storage.vendor = 'STF' (string)
storage.model = 'Flash Drive' (string)
storage.automount_enabled_hint = true (bool)
storage.no_partitions_hint = false (bool)
storage.media_check_enabled = false (bool)
storage.bus = 'usb' (string)
block.minor = 48 (0x30) (int)
block.major = 8 (0x8) (int)
info.capabilities = 'block storage' (string)
info.category = 'storage' (string)
info.parent = '/org/freedesktop/Hal/devices/scsi_3_0_0_0' (string)
block.device = '/dev/sdd' (string)
block.is_volume = false (bool)
block.have_scanned = false (bool)
block.no_partitions = false (bool)
linux.sysfs_path_device = '/sys/block/sdd' (string)
linux.sysfs_path = '/sys/block/sdd' (string)
info.bus = 'block' (string)

udi = '/org/freedesktop/Hal/devices/usb_usb_device_ea0_6828_110_-1_8324B3BF3D696C49_0'
info.udi = '/org/freedesktop/Hal/devices/usb_usb_device_ea0_6828_110_-1_8324B3BF3D696C49_0' (string)
info.product = 'USB Mass Storage Interface' (string)
usb.interface.subclass = 6 (0x6) (int)
usb.interface.protocol = 80 (0x50) (int)
usb.interface.number = 0 (0x0) (int)
usb.interface.class = 8 (0x8) (int)
usb.configuration_value = 1 (0x1) (int)
usb.device_class = 0 (0x0) (int)
usb.device_protocol = 0 (0x0) (int)
usb.device_subclass = 0 (0x0) (int)
usb.max_power = 100 (0x64) (int)
usb.num_configurations = 1 (0x1) (int)
usb.num_interfaces = 1 (0x1) (int)
usb.device_revision_bcd = 272 (0x110) (int)
usb.is_self_powered = false (bool)
usb.can_wake_up = false (bool)
usb.serial = '8324B3BF3D696C49' (string)
usb.product_id = 26664 (0x6828) (int)
usb.vendor_id = 3744 (0xea0) (int)
usb.vendor = 'Ours Technology, Inc.' (string)
usb.product = 'OTI-6828 Flash Disk' (string)
usb.bus_number = 3 (0x3) (int)
usb.port_number = 2 (0x2) (int)
usb.level_number = 1 (0x1) (int)
usb.linux.device_number = 2 (0x2) (int)
usb.linux.parent_number = 2 (0x2) (int)
usb.num_ports = 0 (0x0) (int)
usb.speed_bcd = 4608 (0x1200) (int)
usb.version_bcd = 272 (0x110) (int)
info.parent = '/org/freedesktop/Hal/devices/usb_device_ea0_6828_110_-1_8324B3BF3D696C49' (string)
usb.linux.sysfs_path = '/sys/devices/pci0000:00/0000:00:0a.1/0000:06:00.1/usb3/3-2/3-2:1.0' (string)
linux.sysfs_path_device = '/sys/devices/pci0000:00/0000:00:0a.1/0000:06:00.1/usb3/3-2/3-2:1.0' (string)
linux.sysfs_path = '/sys/devices/pci0000:00/0000:00:0a.1/0000:06:00.1/usb3/3-2/3-2:1.0' (string)
info.bus = 'usb' (string)

Usciamo da less

Q

Se il nostro dispositivo è sufficientemente moderno ed ha un unica partizione la proprietà che lo caratterizza
in maniera univoca è sicuramente serial
usb.serial = '8324B3BF3D696C49' (string)
Questo numero dovrebbe essere unico per ogni dispositivo.
Se vogliamo andare sul sicuro possiamo anche aggiungere vendor e product
usb.vendor = 'Ours Technology, Inc.' (string)
usb.product = 'OTI-6828 Flash Disk' (string)

Se poi ha più di una partizione occorre utilizzare anche la proprietà uuid
volume.uuid = '' (string)
In questo caso è vuoto perchè le partizioni VFAT non hanno uuid.

Ora dopo avere ricavato tutte le informazioni che ci servono dobbiamo creare il file di configurazione per
il nostro device.

5)
Estraiamo il dispositivo dalla porta USB o FireWire.

6)
Apriamo un editor e scriviamo una cosa più o meno come questa:

<br /><!-- Assegna al mio disco USB il Mount Point mio_mount_point --><br /><deviceinfo version="0.2"><br /><device><br />  <match key="block.is_volume" bool="true"><br />    <match key="volume.fsusage" string="filesystem"><br />      <match key="@block.storage_device:@storage.physical_device:usb.serial" string="8324B3BF3D696C49"><br />        <match key="@block.storage_device:@storage.physical_device:usb.vendor" string="Ours Technology, Inc."><br />          <match key="@block.storage_device:@storage.physical_device:usb.product" string="OTI-6828 Flash Disk"><br />            <merge key="volume.policy.desired_mount_point" type="string"><b>mio_mount_point</b></merge><br />          </match><br />        </match><br />      </match><br />    </match><br />  </match><br /></device><br /></deviceinfo> <br />
Questo è un testo XML fate attenzione ai caratteri vietati che vanno scritti in modo speciale.

Chiaramente i valori di serial, vendor e product saranno diversi ma la struttura rimane invariata.
Affinche alla variabile volume.policy.desired_mount_point sia assegnato il nostro punto di
mount mio_mount_point occorre che si verifichino tutte le condizioni definite dai vari match.

7)
Ora dobbiamo salvare il file in /usr/share/hal/fdi/95userpolicy/mio_mount_point.fdi
(Il nome del file non sembra importante, l'importante è l'estensione fdi).

8) Reinseriamo il dispositivo ed incrociamo le dita.

$ cat /etc/fstab

/dev/sdc1 /mnt/hdusb ext2 pamconsole,exec,noauto,managed 0 0
/dev/sdd1 /mnt/mio_mount_point auto pamconsole,exec,noauto,noatime,sync,managed 0 0

Come avete visto impostare il mount point di un device in modo univoco non è proprio una cosa che si fa al volo,
speriamo che in futuro sviluppino dei tool di configurazione più user frendly.

Scopo di questo documento era esclusivamente quello di creare dei mount_point univoci, non quello di montarli
in automatico.
A questo scopo, fortunatamente, esistono pacchetti come gnome_volume_manager (funziona solo con i DeskTop Manager) o
meglio ivman che essendo un demone si avvia direttamente al boot.

Spero che questa mia fatica vi piaccia.

Ciao Ciao Moreno


In:



Commenti

Ritratto di Stefano
#1

Inviato da Stefano il Mer, 23/03/2005 - 20:32.

Complimenti....

Moreno non si smentisce mai.

Guida fantastica.

Voto: 10

Stefano Mainardi - Founder of ILDN & CEO of Twinbit



Ritratto di Madman
#2

Inviato da Madman il Mer, 23/03/2005 - 21:02.

Re: Complimenti....

Guida interessante e molto ben fatta. Big Grin

Quoto il voto datoti da Stefano. Wink



Ritratto di Moreno
#3

Inviato da Moreno il Mer, 23/03/2005 - 21:33.

Manca un pezzo fondamentale

Ciao

A causa della tipologia del testo che ho inserito in un riquadro esso non viene assolutamente visualizzato.

Provo a ripostarlo qui sperando che si legga.

<?xml version="1.0" encoding="ISO-8859-1"?> <!-- -*- SGML -*- -->

<!-- Assegna al mio disco USB il Mount Point mio_mount_point -->
<deviceinfo version="0.2">
<device>
<match key="block.is_volume" bool="true">
<match key="volume.fsusage" string="filesystem">
<match key="@block.storage_device:@storage.physical_device:usb.serial" string="8324B3BF3D696C49">
<match key="@block.storage_device:@storage.physical_device:usb.vendor" string="Ours Technology, Inc.">
<match key="@block.storage_device:@storage.physical_device:usb.product" string="OTI-6828 Flash Disk">
<merge key="volume.policy.desired_mount_point" type="string">mio_mount_point</merge>
</match>
</match>
</match>
</match>
</match>
</device>
</deviceinfo>

Sì si legge anche se manca l'indentazione.
Questo testo va posto nel riquadro dove appare solo mio_mount_point

Ciao Ciao Moreno

Addio, e grazie per tutto il pesce.
Avatar by moonlight-dream.



Ritratto di Madman
#4

Inviato da Madman il Gio, 24/03/2005 - 01:38.

Re: Manca un pezzo fondamentale

Quel riquadro mi sembrava un po' troppo grande e poi avevo la sensazione che mancasse qualcosa. :-P