Estou interessado em entender melhor o que acontece, no nível do sistema operacional, quando um novo dispositivo (pendrive ou disco rígido ide/sata) é conectado a um PC, ou seja, do nível do kernel ao nível do espaço do usuário. Além disso, gostaria de saber em que nível o comando "dd" funciona.
O que eu entendi é que, uma vez que uma unidade externa é conectada, o kernel "intercepta" esse evento e informa o sistema udev que está sempre ouvindo graças ao daemon udevd. Udisks é a instância para coletar informações sobre dispositivos de bloco. O Udisks precisa do udev para isso. Udisks está conectado ao d-bus (dbus não é algo usado apenas por udisks; muitos programas usam dbus para trocar informações). Via d-bus, qualquer pessoa pode se conectar a udisks e perguntar qual é a lista atual de dispositivos.
Pergunta: quando eu inicio o comando dd, talvez ele se conecte ao d-bus para copiar/imagem de uma unidade?
Também anexei uma foto tirada da wikipedia que mostra os níveis do Linux. Você pode me dizer, por favor, nessa foto, o caminho que começa do dispositivo conectado até a instância do comando dd ?
Desde já, obrigado.
Vincenzo.
Na verdade são duas perguntas:
1)
dd
é um aplicativo de usuário normal, assim comocp
. Assim comocp
, ele copia emitindo chamadas de sistema de "leitura", obtendo o resultado e, em seguida, emitindo chamadas de sistema de "gravação". Ao contráriocp
de , você pode definir o tamanho do bloco paradd
, e é por issodd
que sempre foi tradicionalmente usado para copiar dispositivos de bloco. Mas hoje,cp /dev/sdb /dev/sdc
fará exatamente a mesma coisa quedd
, e igualmente rápido, pois as versões modernas decp
(ao contrário talvez das versões antigas) também sempre lerão e gravarão blocos completos.Nem
cp
tampoucodd
faz algo especial para obter um "layout de disco" ou algo assim, eles apenas leem até o sistema operacional sinalizar que estão no final.2)
O kernel realmente não intercepta esse evento, pois todas as ações no nível do driver já estão acontecendo no kernel. Portanto, quando você conecta um dispositivo USB, o hardware do controlador de host USB percebe isso, gera uma interrupção e o driver do controlador de host USB reage a isso e, em seguida, as várias partes da pilha USB começam a enumerar o novo dispositivo, identificam seu tipo, identificar potenciais drivers, anexar novos dispositivos de bloco criados por esses drivers, etc.
udev
é apenas um mecanismo para o kernel comunicar esses eventos ao espaço do usuário, para que o espaço do usuário possa reagir a eles, por exemplo, criando links simbólicos.udisks
é um desktop demon que o desktop usa para obter informações sobre dispositivos de bloco, porque o desktop gosta de fazer tudo no D-Bus. Você realmente não precisaudisks
se não estiver executando um desktop D-Bus (e, de fato, não funciona em algumas das minhas máquinas).Você pode fazer isso igualmente bem por outros meios, por exemplo, olhando
/dev
ou as informações em/sys
.Toda a cadeia udev - udisk - Desktop só é necessária para que a área de trabalho seja informada quando novos dispositivos de bloco aparecem ou o estado de mudança de dispositivo de bloco existente, para que a área de trabalho possa exibir janelas sofisticadas ou qualquer outra coisa. Se você usa o Linux da maneira tradicional e não precisa de uma janela sofisticada ao colocá-lo em um pendrive, não precisa disso.