Паника ядра при чтении из /dev/sdb через pv
У меня есть внешний жесткий диск 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 ответ
Я выяснил, почему возникает паника ядра. Очевидно, 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
При этом мой жесткий диск всегда активен всякий раз, когда я подключаю его к ноутбуку, так что больше нет расширенного управления питанием.