É interessante entender melhor o que acontece, no nível do sistema operacional, quando um novo dispositivo (pendrive USB 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 entendi é que, uma vez conectado um drive externo, o kernel "intercepta" esse evento e informa ao sistema udev que está sempre escutando graças ao daemon udevd. Udisks é a instância para coletar informações sobre dispositivos de bloco. 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 troca de informações). Via d-bus, qualquer pessoa pode se conectar aos 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/criar 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 imagem, o caminho que começa no dispositivo conectado até a instância do comando dd?
Desde já, obrigado.
Vicente.
Responder1
Na verdade, são duas perguntas:
1) dd
é um aplicativo de usuário normal, assim como o cp
. Assim como cp
, ele copia emitindo chamadas de sistema de "leitura", obtendo o resultado e, em seguida, emitindo chamadas de sistema de "gravação". Ao contrário de cp
, você pode definir o tamanho do bloco dd
, por isso dd
sempre foi tradicionalmente usado para copiar dispositivos de bloco. Mas hoje, cp /dev/sdb /dev/sdc
fará exatamente a mesma coisa que dd
, e igualmente rápido, já que as versões modernas cp
(ao contrário das versões antigas) também sempre lerão e escreverão blocos completos.
Nem faz algo especial para obter um "layout cp
de dd
disco" ou algo parecido, eles apenas lêem até o sistema operacional sinalizar que estão no final.
2)
uma vez que uma unidade externa é conectada, o kernel "intercepta" este evento
O kernel realmente não intercepta esse evento, pois todas as ações no nível do driver já estão acontecendo no kernel. Então, quando você conecta um dispositivo USB, o hardware do controlador host USB percebe isso, gera uma interrupção, e o driver do controlador host USB reage a isso, e então as várias partes da pilha USB começam a enumerar o novo dispositivo, identificar seu tipo, identificar possíveis 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.
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.
udisks
é um demônio de desktop 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 precisa udisks
se não estiver executando um desktop D-Bus (e, na verdade, ele não funciona em algumas das minhas máquinas).
Via d-bus, qualquer pessoa pode se conectar aos udisks e perguntar qual é a lista atual de dispositivos.
Você pode fazer isso igualmente bem por outros meios, por exemplo, olhando /dev
ou as informações contidas em /sys
.
Toda a cadeia udev - udisk - Desktop é necessária apenas para que o desktop sejainformadoquando novos dispositivos de bloco aparecem ou o estado de mudança do dispositivo de bloco existente, para que a área de trabalho possa abrir janelas sofisticadas ou qualquer outra coisa. Se você usa Linux da maneira tradicional e não precisa de uma janela sofisticada ao colocar um pendrive, você não precisa disso.