Como manter o Linux rodando após a remoção do disco rígido?

3

Estou trabalhando em um dispositivo Linux incorporado com um disco rígido USB. Existe um arquivo de troca nesta unidade. O disco rígido pode ser desligado a qualquer momento antes de ser ligado novamente alguns segundos depois. Isso leva a várias mensagens de erro, como:

Write-error on swap-device
Kernel panic - not syncing: Attempted to kill init!

ou exceções em vários aplicativos, o que é compreensível, pois algumas solicitações de entrada / saída de página falharam. (Note que este pânico do kernel também é reproduzível em um desktop comum Linux).

Meu objetivo é impedir que isso aconteça e recuperar o sistema sem reiniciar o sistema operacional.

Eu posso adiar a falha chamando scsi_block_requests , mas não posso mantê-los bloqueados para sempre.

Eu tentei matar algumas tarefas do modo de usuário (usando send_sig_info ) em resposta a USB_DEVICE_REMOVE notification, mas continuo recebendo exceções.

Também estou pensando se é possível impedir que o dispositivo SCSI seja destruído quando o dispositivo USB for removido, mas mantenha-o em contato e reconecte-o ao novo dispositivo USB, que será criado alguns segundos depois quando o dispositivo USB for alimentado novamente. Como esse é o mesmo disco, talvez eu possa retomar todas as solicitações pendentes sem montar novamente o disco.

Qual é a sua opinião? Pode algo assim ser feito? Ou é impossível recuperar o sistema operacional após a remoção do disco rígido?

    
por jhnlmn 21.12.2011 / 00:32

2 respostas

3

Matar o aplicativo que usa mais RAM do que você não garante que o arquivo de troca não seja usado. Se esse aplicativo estivesse em execução, suas demandas de memória poderiam fazer com que qualquer outro processo tivesse algumas de suas páginas trocadas para o dispositivo de troca. Matar o processo com fome de memória não trará as páginas de volta até que sejam recarregadas.

Uma possibilidade seria acabar com o dispositivo de troca de nível do kernel e reescrever o processo problemático para que, em vez de malloc ing mais memória do que o sistema tenha acesso e contando com o kernel para tratar swap, apenas mmap do dispositivo USB (ou um arquivo no dispositivo se o dispositivo também for usado para outras coisas) e manipular manualmente suas necessidades de memória no espaço do usuário além da memória disponível (implementar efetivamente um heap adicional que resida no seu dispositivo USB). Então, quando o dispositivo precisar desaparecer, basta matar ou suspender esse processo para impedir que o sistema tente acessar o dispositivo.

    
por 21.12.2011 / 04:10
1

Uma opção a ser considerada seria o compcache , que compacta as páginas de memória, utilizando sua RAM com mais eficiência para que você não use Não é necessário um arquivo de troca. Além disso, a única maneira de resolver o problema é por meio de um hacking hardcore do código de troca no kernel.

    
por 21.12.2011 / 03:55