Kernel panic ao ler de / dev / sdb via pv

0

Eu tenho um disco rígido Hitachi externo que tem o recurso "Advanced Power Management" irritante, que coloca o dispositivo em suspensão, se eu não usá-lo por um minuto. Também não é possível desativar esse recurso usando "sudo hdparm -B 128".

Por exemplo quando faço uma pausa em um vídeo para fazer uma pequena pausa, o player não está funcionando corretamente e pula meio minuto até que o disco rígido seja ativado.

A fim de enganar o HDD eu escrevi um pequeno script de shell, que constantemente lê a partir do dispositivo, por isso nunca adormece. Ele funciona muito bem, mas toda vez que eu uso esse script, fico com um kernel panick depois de algum tempo.

Aqui está o meu script de shell:

#!/bin/bash

if [[ "$(id -u)" != "0" ]]
then
  sudo -s <<EOF
  ionice -c3 pv -s 4000784052224 -q -L 1m '/dev/sdb' &> /dev/null
  while [ $?==0 ]
  do
    sleep 1
    ionice -c3 pv -s 4000784052224 -q -L 1m '/dev/sdb' &> /dev/null
  done
EOF
else
  ionice -c3 pv -s 4000784052224 -q -L 1m '/dev/sdb' &> /dev/null
  while [ $?==0 ]
  do
    sleep 1
    ionice -c3 pv -s 4000784052224 -q -L 1m '/dev/sdb' &> /dev/null
  done
fi

Estou usando o Linux Mint 17.1 com a versão do kernel 3.16.0-031600-generic (o problema também é acumulado no kernel original).

Você tem alguma ideia, por que isso está acontecendo?

    
por user1861174 12.01.2015 / 21:49

1 resposta

0

Eu descobri por que um kernel panic está ocorrendo. Aparentemente, o Linux está armazenando em cache essa interminável transferência de dados, então a solução simples é desativar o cachache com o nocache.

Então, minha solução atual agora são os seguintes arquivos:

/etc/udev/rules.d:

KERNEL=="sd*", SUBSYSTEMS=="usb", ATTRS{manufacturer}=="HGST", ATTRS{product}=="Touro Desk 3.0", ATTRS{serial}=="31001312300002100125", ACTION=="add", RUN+="/usr/local/bin/touro_read_loop"
ACTION=="remove",  ENV{ID_SERIAL=="HGST_Touro_Desk_3.0_31001312300002100125"}, RUN+="/usr/local/bin/touro_read_stop"

/ usr / local / bin / touro_read_loop:

#!/bin/bash

if [ ! -e /tmp/.apm_pids ]
then
    setsid /usr/local/bin/touro_read_loop_main >/dev/null 2>&1 < /dev/null &
fi

/ usr / local / bin / touro_read_loop_main:

#!/bin/bash

if [[ "$(id -u)" == "0" ]]
then
  while test -e '/dev/disk/by-id/usb-HGST_Touro_Desk_3.0_31001312300002100125-0:0'
    do
    setsid nice -n19 ionice -c3 nocache pv -s 4000784052224 -q -L 1m '/dev/disk/by-id/usb-HGST_Touro_Desk_3.0_31001312300002100125-0:0' >/dev/null 2>&1 < /dev/null &
    PV_ID=$(pgrep -nx pv)
    echo -ne "$$\n$PV_ID\n" > /tmp/.read_loop_pids

    while test -d "/proc/$PV_PID"
    do
      sleep 30
    done
  done
fi

/ usr / local / bin / touro_read_stop:

#!/bin/bash

cat /tmp/.apm_pids | sudo xargs -i kill {}
sudo rm /tmp/.read_loop_pids

Com isso, meu disco rígido fica sempre ativo sempre que eu o conecto ao meu laptop, então não há mais gerenciamento avançado de energia.

    
por 13.01.2015 / 16:27