В Linux есть такая штука как laptop_mode, которая призвана делать так, чтобы обращения к жёсткому диску были сгруппированы пачками, между которыми диск можно останавливать.
У меня в этом режиме оно действительно меняет ситуацию (диск поднимается через секунд 10 вместо 2), но в целом оно выглядит больше как «соседи попросили не обращаться к винту», а не как «командир приказал не обращаться к винту», и тишину получалось организовать только на весьма непродолжительное время. (А ещё я хочу чтобы было «mount -o atime» - мне нужна будет потом статистика).
Не найдя хорошего решения, я написал пару патчей, которые позволят замораживать жёсткий диск в режиме «командир приказал». Естественно, при этом многие процессы начнут уходить в D-sleep, но это уже издержки.
Мне показалось, что проще всего будет это реализовать как специальный io scheduler, что я и сделал, назвав его hung-iosched (зависший). Выбираешь его - блочное устройство зависает. Ставишь обратно нормальный - отвисает.
Протестировав его на UML /* User Mode Linux */ (дольше было времени ожидать пока соберётся UML, чем собственно писать hung-iosched), перенёс в виде патча в своё ядро и протестировал на ноутбуке (получилось даже без перезагрузки).
Заработало. Но fsync/fdatasync тут же дали о себе знать. Второй патч уже потребовал перезагрузки. Зато теперь могу останавливать жёсткий диск и использовать свой Acer Extensa 5220 в тишине.
- http://vi-server.org/vi/0001-block-Introduce-hung-iosched.patch
- http://vi-server.org/vi/0001-fs-Introduce-sync-enable-flag.patch
Включение режима:
sync
hdparm -S 1 /dev/sda
echo hung > /sys/block/sda/queue/scheduler
echo 0 > /proc/sys/fs/sync-enable
hdparm -y /dev/sda
Выключение режима:
echo 1 > /proc/sys/fs/sync-enable
echo cfq > /sys/block/sda/queue/scheduler
hdparm -S 0 /dev/sda
Критика, вопросы/предложения, предостережения?