Devido a uma falha udev
na configuração de uma máquina da qual estou tentando resgatar dados (veja este meu post ), estou tentando gravar em um dispositivo "caractere especial" correspondente a uma unidade flash USB, mas estou encontrando dificuldades.
O que eu esperaria é que (com permissões de root) eu pudesse fazer isso:
echo "test 123" > /dev/bus/usb/001/031
Mas eu entendo
bash: echo: write error: Invalid argument
O que está acontecendo? Como posso gravar em um dispositivo de caractere?
PS : isso é de interesse especificamente porque os dispositivos de bloco que eu normalmente esperaria (/dev/sdb
, stuff in/dev/block
) não estão sendo criados por algum motivo. No entanto, notei que um dispositivo de caractere é criado quando insiro uma unidade USB (e removido quando a removo). Se eu pudesse encontrar uma maneira de gravar nesse dispositivo, poderia evitar muitos problemas ao transferir dados lentamente por cabos de áudio (que é minha melhor abordagem atual).
Esses são dispositivos "USB brutos". Usá-los requer várias
ioctl()
funções específicas do USB: apenas gravar dados brutos neles a partir do shell provavelmente não conseguirá muito. Os dados teriam que ser formatados em pacotes USB válidos primeiro, e asioctl()
funções usadas para estabelecer conexão com o terminal USB correto dentro desse dispositivo.E como estamos falando de um dispositivo de armazenamento USB, o procedimento seria ainda mais complicado: dentro desses pacotes USB, deveria haver um dos seis conjuntos de comandos de armazenamento possíveis. Na prática, o conjunto de comandos mais comum é o conjunto de comandos "SCSI transparente" - um protocolo SCSI encapsulado em USB.
Como resultado, primeiro você teria que aprender a escrever em um dispositivo de disco usando
/dev/sg*
dispositivos, criando seus próprios pacotes de comando SCSI. Depois de conseguir isso, você pode adicionar wrappers específicos de USB a esse procedimento e, somente então, poderá gravar blocos brutos em um dispositivo de armazenamento USB usando esses/dev/bus/usb/<busnum>/<devnum>
dispositivos.Na maioria dos casos, usar USBs brutos
ioctl()
é extremamente tedioso, a menos que você precise de algo muito específico: a maioria dos programadores que precisam de acesso USB bruto usarálibusb
ou alguma outra biblioteca (comolibftdi
para acesso em nível de desenvolvedor de hardware a chips conversores FTDI USB para serial) para lidar com a mecânica básica do USB para eles. Resumindo, você já teria que ser um programador de E/S USB bem estabelecido para usar com sucesso o dispositivo de armazenamento USB bruto em uma situação de resgate como a sua.Dito isso, sua outra postagem parece que você teve que realizar uma operação de resgate de dados verdadeiramente épica. Por isso, respeito sua conquista... mas também espero que você tenha aprendido algo sobre a importância dos backups.