У меня есть внешний жесткий диск Hitachi с раздражающей функцией "Advanced Power Management", которая переводит устройство в спящий режим, если я не использую его в течение минуты. Также невозможно отключить эту функцию с помощью «sudo hdparm -B 128».

Например, когда я делаю паузу в видео, чтобы сделать небольшой перерыв, проигрыватель не работает должным образом и пропускает полминуты, пока жесткий диск не проснется.

Чтобы обмануть жесткий диск, я написал небольшой сценарий оболочки, который постоянно читает с устройства, чтобы он никогда не засыпал. Он работает просто отлично, но каждый раз, когда я использую этот скрипт, через некоторое время у меня возникает паника ядра.

Вот мой сценарий оболочки:

#!/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

Я использую Linux Mint 17.1 с ядром версии 3.16.0-031600 (проблема также возникла в исходном ядре).

У вас есть идея, почему это происходит?

1 ответ1

0

Я выяснил, почему возникает паника ядра. Очевидно, linux кеширует эту бесконечную передачу данных, поэтому простое решение - отключить кеширование с помощью nocache.

Итак, моё текущее решение - это следующие файлы:

/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 / местные / бен / 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 / местные / бен / 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 / местные / бен / touro_read_stop:

#!/bin/bash

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

При этом мой жесткий диск всегда активен всякий раз, когда я подключаю его к ноутбуку, так что больше нет расширенного управления питанием.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .