O que exatamente acontece quando um dispositivo USB é ejetado em um Mac?

1

Quando um dispositivo USB é ejetado usando a GUI no Finder, o que exatamente acontece em um nível baixo? Existem certos sinais enviados para o dispositivo?

O motivo pelo qual estou perguntando é porque estou tentando imitar a ejeção manual de um dispositivo adicionando e removendo o módulo de armazenamento de arquivos por meio do console de um dispositivo que executa o Linux embarcado. Apenas removendo o módulo funciona bem em um PC, mas um Mac me dá o erro "não corretamente ejetado", eo kernel do Linux "entra em pane" e recebe um erro de ponteiro nulo do kernel.

Aqui estão algumas informações extras:

Estou usando um dispositivo USB Gumstix COM que executa o Linux embarcado. O dispositivo é conectado a um host (Windows ou Mac) e eu emule removê-lo fisicamente removendo o módulo de armazenamento em massa no kernel Linux do dispositivo, fazendo com que o host não o veja mais como um dispositivo de armazenamento. Eu faço isso com modprobe -r g_file_storage .

Isso funciona sem problemas no Windows. Ele não está funcionando em um Mac, porque eu recebo um erro no host Mac dizendo que o dispositivo não foi ejetado corretamente. Isso causa um erro de ponteiro nulo no kernel do Linux do dispositivo e entra em pânico.

Isso me leva a acreditar que existe algo que SOMENTE o Mac faz quando ejeta corretamente um dispositivo USB que eu preciso emular no meu script no dispositivo.

Basicamente, quero saber se preciso fazer algum tratamento de sinal ou algo no dispositivo para emular adequadamente a ejeção nos hosts do Mac.

    
por N-C 03.10.2012 / 18:03

2 respostas

2

O conceito de 'ejetar' no nível do usuário pode significar várias coisas diferentes, enquanto desmontar sempre significa apenas desmontar.

Para mídia ótica, ejetar causa ejeção física do disco após a desmontagem.

Para algumas mídias, como mídias flash removíveis (cartões de memória USB; qualquer coisa que apareça como uma unidade branca de carregamento de slots no Finder), ejeta a desmontagem de todos os volumes do dispositivo e impede qualquer interação posterior com esse dispositivo até que seja fisicamente removido - o dispositivo permanece na árvore de dispositivos USB, mas os dispositivos de bloqueio em /dev são removidos e não são mais listados no Utilitário de Disco ou diskutil list .

Para outros tipos de mídia, como discos rígidos removíveis (qualquer coisa que apareça como um invólucro de plástico amarelo no Finder), a ejeção simplesmente desmontará o volume e o deixará acessível para montagem ou gravação no dispositivo de bloco.

Não sei exatamente quais são os critérios para qual comportamento é aplicado a qual tipo de dispositivo. Eu testei com um monte de unidades de disco rígido criptografadas CoreStorage / FileVault 2 e um monte de drives flash USB. O número de volumes no dispositivo em questão parece fazer pouca diferença, mas o bloco de interação pode ser decidido pelo CoreStorage ou pela diferença no tipo de mídia.

O OS X não recusa se você desconectar um dispositivo que não foi ejetado, mas teve todos os seus volumes desmontados.

    
por 03.10.2012 / 22:15
0

Quando você usa ferramentas GUI no Mac e Linux para "ejetar" o dispositivo USB, a GUI normalmente verifica se o dispositivo está ocupado ou não e, se não estiver ocupado, desmonta o dispositivo USB do sistema de arquivos.

A maioria dos sistemas Unix / Linux tem um comando desmontar, que é o que as ferramentas GUI fazem quando você “ejeta” o dispositivo USB. Este comando deve ser executado antes que o dispositivo seja fisicamente removido (no entanto, existem opções para forçá-lo a remover as referências ao dispositivo, mas elas nem sempre funcionam).

Confira as páginas de manual para umount . Uma cópia pode ser encontrada aqui .

    
por 03.10.2012 / 19:56

Tags