Персональный
сайт
Игоря
Сысоева


 
english
обо мне
 
sysoev.ru
 
nginx
 
mod_accel
mod_realip
mod_deflate
программирование
всякая всячина
windows
freebsd
apache
pppd
unix
web
 
 

Патч для softupdates

 

29.10.2005

31 июля 2005 Stephan Uphoff исправил ошибку в softupdates, из-за которой на дисках могло очень быстро заканчиваться свободное место и единственным выходом была только перезагрузка машины, после чего все диски проверялись fsck'ом. Я впервые столкнулся с этой проблемой в начале 2002 года на FreeBSD 4.5 и с тех пор наблюдал её неоднократно. Наиболее частым проявлением этой ошибки было именно быстрое исчезновение свободного места. Если же на дисках часто создавались файлы малого или нулевого размера, то быстрее могли закончиться свободные inode'ы. А один раз машина просто перестала работать из-за того, что закончились vnode'ы. Если в такой ситуации запустить top -S, то ядерный процесс syncer будет постоянно находиться в состоянии getblk. Во время перезагрузки ядро быстро останавливает ядерные процессы vnlru и bufdaemon и ждёт целую минуту, пока остановится syncer. После этого ядро пытается записать оставшиеся в памяти буфера примерно так:

syncing disks, buffers remaining... 5 5 3 2 2 2 2 2 2
giving up on 2 buffers

Число буферов, которое не удалось записать на диск, может быть самым разным, от одного до сотен. В результате на всех файловых системах оказывается не сброшен бит dirty и при следующей загрузке все файловые системы будет проверять fsck. Попытки размонтировать эти файловые системы до перезагрузки безуспешны — umount просто зависает.

К концу августа исправление этой ошибки появилось во FreeBSD 4.11-STABLE, FreeBSD 5.4-STABLE и FreeBSD 6.0-BETA, однако, во FreeBSD 4.11-RELEASE-p13 и FreeBSD 5.4-RELEASE-p8 исправления нет. Если нужно исправить эти или более ранние версии, то можно воспользоваться патчем. Устанавливается он так:

patch -d /usr < patch.softdep.txt

Если ядро уже собрано, то достаточно перейти в каталог с объектными файлами ядра:

cd /usr/src/sys/compile/KERNEL
или
cd /usr/obj/usr/src/sys/KERNEL
пересобрать ядро:
make kernel
make install
и перегрузиться.

(C) Игорь Сысоев
http://sysoev.ru