Fazendo o kernel 2.6 resolver o problema da montagem de discos USB
Você tem um monte de discos USB (USB disks, câmeras digitais que montam como Mass Storage, leitores de cartões de memória etc) e gostaria de montar cada um em seu lugar? Talvez o kernel 2.6 possa lhe ajudar...
Resolvendo o problema
Dois grandes avanços no kernel 2.6 são, sem dúvidas, o
subsistema USB, bem mais rápido, confiável e estável; e o
suporte a hotplug. Vamos, rapidamente, utilizá-los em
conjunto com o sysfs para resolvermos um problema
chato como o meu, e que certamente é de muita gente.
Eu tenho um USB disk, essas "canetas" que todo mundo têm hoje em dia; tenho um Sony Clié, que permite montar o conteúdo da Memory Stick como se fosse um drive; e um leitor desses 6-em-1, que lêem SecureDigital/MultiMedia Card, SmartMedia, CompactFlash e Memory Stick. Estou sempre usando os três, e convenhamos é um saco ficar toda hora olhando no /proc pra ver quem pegou qual posição no bus SCSI. Certamente é mais fácil dar um "nome" a cada um deles, não? Mas como fazer isso???
Primeiro, é importante garantirmos que temos pelo menos três pacotes instalados:
No Fedora Core 2, por exemplo, precisei baixar o sysfsutils em:
hotplug e udev estavam dentro do exigido.
Pluguei todos ao mesmo tempo e procurei um atributo que os diferenciasse. Descobri que 'model' resolveria meu problema:
# systool -vb scsi | grep model
Daí editei o arquivo /etc/udev/udev.rules, onde estão as regras de nomeamento que udev utiliza, para entender o que eu queria:
Eu tenho um USB disk, essas "canetas" que todo mundo têm hoje em dia; tenho um Sony Clié, que permite montar o conteúdo da Memory Stick como se fosse um drive; e um leitor desses 6-em-1, que lêem SecureDigital/MultiMedia Card, SmartMedia, CompactFlash e Memory Stick. Estou sempre usando os três, e convenhamos é um saco ficar toda hora olhando no /proc pra ver quem pegou qual posição no bus SCSI. Certamente é mais fácil dar um "nome" a cada um deles, não? Mas como fazer isso???
Primeiro, é importante garantirmos que temos pelo menos três pacotes instalados:
- sysfsutils-0.4.0 ou mais novo; (sysfsutils é um conjunto de programas para ler o diretório /sys, onde o kernel 2.6 deixa importantes informações sobre os objetos do kernel, que udev e hotplug utilizam);
- hotplug-2004_01_05 ou mais novo;
- udev-016 ou mais novo.
No Fedora Core 2, por exemplo, precisei baixar o sysfsutils em:
hotplug e udev estavam dentro do exigido.
Pluguei todos ao mesmo tempo e procurei um atributo que os diferenciasse. Descobri que 'model' resolveria meu problema:
# systool -vb scsi | grep model
model = "USB Reader-SMC"
model = "USB Reader-CF"
model = "USB Reader-SD"
model = "USB Reader-MS"
model = "ZZZZZZZZZZZZZZZï¿¿"
model = "PEG Mass Storage"
Daí editei o arquivo /etc/udev/udev.rules, onde estão as regras de nomeamento que udev utiliza, para entender o que eu queria:
# USB Mass Storage Clie
BUS="scsi", SYSFS{model}="PEG Mass Storage", NAME{all_partitions}="clie"
# My pen drives
BUS="scsi", SYSFS{model}="ZZZZZZZZ*", NAME{all_partitions}="pendrive"
# My reader
BUS="scsi", SYSFS{model}="USB Reader-SMC*", NAME{all_partitions}="smartmedia"
BUS="scsi", SYSFS{model}="USB Reader-CF*", NAME{all_partitions}="cf"
BUS="scsi", SYSFS{model}="USB Reader-SD*", NAME{all_partitions}="sd"
BUS="scsi", SYSFS{model}="USB Reader-MS*", NAME{all_partitions}="mstick"
BUS="scsi", SYSFS{model}="PEG Mass Storage", NAME{all_partitions}="clie"
# My pen drives
BUS="scsi", SYSFS{model}="ZZZZZZZZ*", NAME{all_partitions}="pendrive"
# My reader
BUS="scsi", SYSFS{model}="USB Reader-SMC*", NAME{all_partitions}="smartmedia"
BUS="scsi", SYSFS{model}="USB Reader-CF*", NAME{all_partitions}="cf"
BUS="scsi", SYSFS{model}="USB Reader-SD*", NAME{all_partitions}="sd"
BUS="scsi", SYSFS{model}="USB Reader-MS*", NAME{all_partitions}="mstick"
NOTA: O Fedora Core 2 coloca os arquivos de regras de udev dentro do diretório /etc/udev/rules.d. Apenas criei o arquivo 10-udev.rules com o conteúdo acima. Mas o caso geral é /etc/udev/udev.rules.
O que eu fiz? Se, em /sys/bus/scsi (lembrem-se que dispositivos USB Mass Storage são vistos no bus USB), tiver algum dispositivo em que o campo 'model' for igual a, por exemplo, "PEG Mass Storage", todas as partições serão nomeadas clie. Ou seja, o udev cria /udev/clie (o dispositivo em si) e /udev/clie1 a /udev/clie15 (as partições).
Detalhe: os asteriscos depois dos nomes dos modelos foram colocados para encher o espaço, porque os nomes dos modelos têm menos de 16 caracteres.
Despluguei tudo e editei o /etc/fstab:
/udev/clie1 /remov/clie vfat user,noauto,owner,rw 0 0 /udev/pendrive1 /remov/pendrive vfat user,noauto,owner,rw 0 0 /udev/smartmedia1 /remov/smartmedia vfat user,noauto,owner,rw 0 0 /udev/cf1 /remov/cf vfat user,noauto,owner,rw 0 0 /udev/sd1 /remov/sd vfat user,noauto,owner,rw 0 0 /udev/mstick1 /remov/mstick vfat user,noauto,owner,rw 0 0
Para testar, pluguei o meu USB disk (64MB). Depois de alguns segundos:
# fdisk -l /udev/pendrive
Disk /udev/pendrive: 65 MB, 65208320 bytes
64 heads, 32 sectors/track, 62 cylinders
Units = cilindros of 2048 * 512 = 1048576 bytes
Dispositivo Boot Start End Blocks Id System
/udev/pendrive1 * 1 62 63472 6 FAT16
# cat /proc/scsi/scsi
Attached devices: Host: scsi7 Channel: 00 Id: 00 Lun: 00 Vendor: ZZZZZZZZ Model: ZZZZZZZZZZZZZZZ Rev: Type: Direct-Access ANSI SCSI revision: 02
Agora liguei o meu Clié com um cartão de 32MB, coloquei no cradle e liguei o programa que exporta o cartão Memory Stick como se fosse um disco:
# fdisk -l /udev/clie
Disk /udev/clie: 32 MB, 32473088 bytes 4 heads, 16 sectors/track, 991 cylinders Units = cilindros of 64 * 512 = 32768 bytes Dispositivo Boot Start End Blocks Id System /udev/clie1 * 1 990 31670+ 1 FAT12
# cat /proc/scsi/scsi
Attached devices: Host: scsi7 Channel: 00 Id: 00 Lun: 00 Vendor: ZZZZZZZZ Model: ZZZZZZZZZZZZZZZ Rev: Type: Direct-Access ANSI SCSI revision: 02 Host: scsi8 Channel: 00 Id: 00 Lun: 00 Vendor: Sony Model: PEG Mass Storage Rev: 0100 Type: Direct-Access ANSI SCSI revision: 02
Para completar, pluguei o meu 6-em-1 e coloquei uma Memory Stick de 64MB. Observem que a ordem em que pluguei desta vez foi diferente da vez anterior.
# fdisk -l /udev/mstick
Disk /udev/mstick: 64 MB, 64946176 bytes 8 heads, 16 sectors/track, 991 cylinders Units = cilindros of 128 * 512 = 65536 bytes Dispositivo Boot Start End Blocks Id System /udev/mstick1 * 1 990 63340+ 1 FAT12
# cat /proc/scsi/scsi
Attached devices: Host: scsi7 Channel: 00 Id: 00 Lun: 00 Vendor: ZZZZZZZZ Model: ZZZZZZZZZZZZZZZ Rev: Type: Direct-Access ANSI SCSI revision: 02 Host: scsi8 Channel: 00 Id: 00 Lun: 00 Vendor: Sony Model: PEG Mass Storage Rev: 0100 Type: Direct-Access ANSI SCSI revision: 02 Host: scsi9 Channel: 00 Id: 00 Lun: 00 Vendor: Generic Model: USB Reader-SMC Rev: 2002 Type: Direct-Access ANSI SCSI revision: 02 Host: scsi9 Channel: 00 Id: 00 Lun: 01 Vendor: Generic Model: USB Reader-CF Rev: 2002 Type: Direct-Access ANSI SCSI revision: 02 Host: scsi9 Channel: 00 Id: 00 Lun: 02 Vendor: Generic Model: USB Reader-SD Rev: 2002 Type: Direct-Access ANSI SCSI revision: 02 Host: scsi9 Channel: 00 Id: 00 Lun: 03 Vendor: Generic Model: USB Reader-MS Rev: 2002 Type: Direct-Access ANSI SCSI revision: 02
Daí foi simplesmente mandar o Nautilus montar o meu novo /etc/fstab. Na figura abaixo está o resultado:
E funciona! :)
Referência:
- http://www.tldp.org/HOWTO/Flash-Memory-HOWTO/linux-2.6.html (parte da Flash-Memory-HOWTO)
Um sistema que costumo usar é o devfs do próprio kernel, ele é meio louco, ele deixa o /dev vazio, depois ele vai criando os dispositivos dinamicamente, eu espetei o camera do meu irmão aqui e o devfs já crou um /dev/sda1, mas achei o udev mais prático por poder não fixar a partição, isso resolve a montagem de discos zip, pois já vi alguns com partição sda1 ao invéz do padrão sda4.
Falou procê!