среда, 18 мая 2011 г.

Новые проблемы с hibernate на моем eeepc.

Я уже упоминал о проблемах в работе hibernate (он же suspend to disk) в одном из своих предыдущих постов. Тогда я откатил ядро и отправил баг, на большее времени не хватило.

Теперь я решил вернуться к проблеме, так как она получила новый виток. Началось с того, что после выхода из hibernate перестали запускаться приложения. В dmesg видно, что падения вызывает segfault. Причем падает не все подряд, а только часть.

May 13 07:16:25 dragoncore kernel: [ 4374.516022] egrep[10517]: segfault at 9eef73d ip 080510fa sp bfcd5a8c error 6 in egrep[8048000+18000]
May 18 07:22:56 dragoncore kernel: [10412.759167] urxvt[22902]: segfault at 42a648c8 ip b70e7020 sp bf95d2a0 error 6 in libperl.so.5.10.1[b70a9000+14a000]
По причине того, что проблема не всегда воспроизводится а также хронической нехватки времени я просто перезагружал нетбук и продолжал работу. Сегодня мое терпение лопнуло и я решил разобраться в проблеме. Т.к. у меня стоит debsums, то я первым делом запустил проверку целостности пакетов

sudo debsums | grep -v OK$
Таким образом ищутся файлы, контрольная сумма которых не совпадает с эталоном. Нашло несколько несовпадений
/usr/bin/dbus-daemon                      FAILED
/lib/libdbus-1.so.3.4.0                        FAILED
/usr/lib/libgobject-2.0.so.0.2400.2            FAILED
/bin/zsh4                                      FAILED
После перезарузки проверка была уже без ошибок.

Для чистоты эксперимента система была обновлена до актуального squeeze + ядро до 2.6.32-31. После как и полагается нетбук был перезагружен. Далее для выяснения причины попробовал запустить бесконечный цикл из связки hibernate и debsums. Чтобы не приходилось каждый раз включать ноутбук, я заменил в /etc/uswsusp.conf

shutdown method = platform
на
shutdown method = reboot
Теперь после засыпания на диск происходит перезагрузка, а не отключение питания. Для большей автоматизации был написан скрипт
#!/bin/bash

PREFIX=/var/log
COUNT=0

while true
do
dmesg -c > /dev/null
sync
pm-hibernate
let COUNT=${COUNT}+1
echo -e "DMESG\n\n*****\n\n" | tee ${PREFIX}/hibernate.${COUNT}.log
dmesg | tee -a ${PREFIX}/hibernate.${COUNT}.log
echo -e "\n\nDEBSUMS\n\n*****\n\n" | tee -a ${PREFIX}/hibernate.${COUNT}.log
debsums | tee -a ${PREFIX}/hibernate.${COUNT}.log | grep -v OK$
if [ $? == 0 ]; then
echo -e "\n\nDetected corruption!\n\n" | tee -a ${PREFIX}/hibernate.${COUNT}.log
dmesg | tee -a ${PREFIX}/hibernate.${COUNT}.log
sync
exit 1
fi
done
Скрипт выполнялся до тех пор, пока debsums не находил "поврежденные" файлы. Из двух прогонов за сегодня первая ошибка была на 14-й итерации, а второй раз нашло на 2-ой.
Пока я выкрутился через suspend-hybrid (благо новая батарея это позволяет). Завтра попробую тоже самое, но без использования KMS.