Por que acessar sr0 fecha a bandeja, mas retorna um erro enquanto a unidade seleciona CD / DVD / Blu-Ray?

1

Eu já vi esse comportamento nas distribuições (provavelmente também nos sistemas operacionais) e nas marcas / modelos de unidades de mídia ótica. Aparece qualquer unidade de CD, DVD e / ou Blu-Ray, se for feita uma tentativa de open() /dev/sr0 enquanto a bandeja estiver aberta, a bandeja será fechada e até terminar de fechar a chamada para open() irá bloquear. Quando a bandeja termina de fechar, a unidade entra em um estado de "identificação" no qual tentará determinar que tipo de mídia está nela (se há um CD, DvD, Blu-Ray ou qualquer outra coisa nela e, portanto, qual laser deve usar), que normalmente leva alguns segundos, durante os quais qualquer chamada para open() no dispositivo (incluindo a chamada que fez com que a bandeja seja fechada em primeiro lugar) falhará com um erro sem mídia.

Coloque de outra forma:

  1. A bandeja do CD é aberta e um disco é colocado pelo usuário.

  2. Será executado algum comando que abrirá / dev / sr0 para leitura ou gravação (por exemplo, mount , dd , dvdbackup etc.)

  3. A bandeja de CD se fechará e o comando será bloqueado até que a bandeja seja totalmente fechada.

  4. Quando a bandeja terminar de fechar, o comando informará imediatamente que não há mídia e sai. A unidade começa a identificar a mídia recém-carregada.
  5. O usuário tenta executar o comando novamente antes da conclusão da fase de identificação (durante a qual alguns sinalizadores de "presente de mídia" não estão configurados). O comando falha instantaneamente com o mesmo erro Sem Mídia.
  6. Após alguns segundos, a unidade está pronta para ler a mídia.
  7. O usuário executa o comando pela terceira vez. Desta vez, o comando é bem sucedido.

Minha teoria sobre o que está acontecendo (isso é apenas uma teoria):

  1. Durante o passo 2 acima, o Linux faz uma solicitação à unidade. A unidade vê que sua bandeja está aberta e a fecha.
  2. A bandeja termina de fechar, e a unidade informa ao sistema operacional que entrou em uma fase de identificação, provavelmente definindo algum sinalizador "ocupado" e limpando "presente de mídia" ou o que você tem.
  3. O Linux, vendo que o sinalizador "presente de mídia" está desimpedido, informa imediatamente ao aplicativo que não há nada para fazer.

Minha primeira pergunta é: por que isso acontece? Por que o Linux não verifica a bandeira de ocupado? O Windows faz (ou pelo menos parece que sim; em algumas versões um ícone de CD aparece ao lado do cursor durante essa fase de identificação). Minha segunda pergunta é, há alguma maneira de contornar isso? Existe alguma maneira de saber, sem ignorar completamente o kernel, se a unidade de DVD está em fase de identificação ou se realmente não há mídia nela?

    
por wallefan 19.08.2018 / 00:07

0 respostas