Инструменты пользователя

Инструменты сайта


blog:2010:1117_ssd_optimization

Настройка Linux для работы на бюджетном SSD

На моём домашнем сервере поселился самосборный SSD-диск, основанный на карте Compact Flash. Про то, как его собрать можно почитать в прошлом логе под названием Бюджетный SSD. А как я оптимизировал Debian Lenny и переносил систему на этот самосбор я напишу здесь…

<html> <span style=«color:red;font-size:150%;»>Внимание! Ниже приводятся инструкции, которые при необдуманном использовании могут уничтожить все ваши данные. Будьте осторожны!</span> </html>

Что имеем:

  • обычный жёсткий диск /dev/sda;
  • Бюджетный SSD, поддерживающий режим UDMA с карточкой Transcend Compact Flash 266x на 4ГБ /dev/sdb;

Чего хотим: переместить Linux с жёсткого диска на бюджетный SSD.

Как делаем:

  • нарочно НЕ создаём раздел подкачки (должно быть много памяти!). Если необходимо, можно добавить файл подкачки, и (лучше) пересоздавать его при каждой загрузке;
  • создаём раздел для системы ext3 размером во всю карточку;
echo 0,,,* | sudo sfdisk /dev/sdb -O cf-ssd-sfdisk.backup
  • создаём файловую систему:
sudo mkfs.ext3 -L ROOT /dev/sdb1
  • устанавливаем rsync:
sudo aptitude install rsync
  • останавливаем работающие сервисы:
for i in /etc/init.d/{apache2,bind9,cron,dnsmasq,exim4,hostapd,nut}; do sudo $i stop; done;
  • копируем систему:
sudo mkdir /mnt/ssd && sudo mount /dev/sdb1 /mnt/ssd
sudo rsync -ax / /mnt/ssd/
  • устанавливаем загрузчик:
echo "(hd0) /dev/sdb" | sudo tee /mnt/ssd/boot/grub/device.map
sudo grub-install --root-directory=/mnt/ssd --no-floppy /dev/sdb
echo "(hd0) /dev/sda" | sudo tee /mnt/ssd/boot/grub/device.map
  • меняем конфигурацию загрузчика на новом диске (не забываем про writeback, иначе не загрузится!):
/mnt/ssd/boot/grub/menu.lst
...
# kopt=root=LABEL=ROOT rootflags=data=writeback ro
...
kernel          /boot/vmlinuz-2.6.32-bpo.5-486 root=LABEL=ROOT rootflags=data=writeback ro
...
  • добавляем в конфигурацию текущего загрузчика пункт для загрузки с SSD. Если загрузка не удастся, то достаточно будет перезагрузить сервер, чтобы вернуться в старую работающую систему 1):
/boot/grub/menu.lst
default		saved
timeout		5
 
title           Debian GNU/Linux, kernel 2.6.32-bpo.5-486
root            (hd0,0)
kernel          /boot/vmlinuz-2.6.32-bpo.5-486 root=UUID=ca08484c-1fe1-4bc0-80cc-19940214b601 ro
initrd          /boot/initrd.img-2.6.32-bpo.5-486
savedefault
 
title           Debian GNU/Linux, kernel 2.6.32-bpo.5-486
root            (hd1,0)
kernel          /boot/vmlinuz-2.6.32-bpo.5-486 root=LABEL=ROOT rootflags=data=writeback ro
initrd          /boot/initrd.img-2.6.32-bpo.5-486
savedefault     0
  • включаем одноразовую загрузку второго пункта меню:
sudo grub-set-default 1
  • настраиваем перезагрузку системы через минуту в случае паники:
/mnt/ssd/etc/sysctl.d/panic.conf
kernel.panic = 60
  • сильно меняем поведение системы относительно использования памяти и подкачки. Добавляем в /etc/sysctl.d/cf.conf 2):
# configure settings in /proc/sys/vm/*
# агрессивность использования swap
vm.swappiness = 0
# как часто ядро должно находить незаписанные в ФС данные и писать их
vm.dirty_writeback_centisecs = 6000
# сколько времени должно пройти, чтобы ядро посчитало незаписанные в ФС данные достаточно устаревшими для их записи
vm.dirty_expire_centisecs = 6000
# сколько процентов памяти могут занимать незаписанные в ФС данные
vm.dirty_ratio = 80
# если незаписанные данные занимают меньше памяти в процентах, то их можно не записывать сейчас
vm.dirty_background_ratio = 20

Внимание! БОльшая часть этих настроек увеличивает использование памяти. Что, в свою очередь, увеличивает риск её полного заполнения, что может вызвать принудительное закрытие программ ядром. Такое может случиться даже при наличии свободной памяти, но если ядру вдруг понадобится зарезервировать большую непрерывную область памяти, а доступны будут только фрагментированные участки. Рекомендую внимательно следить за использованием памяти и подстраивать настройки под своё оборудование 3) 4)

  • меняем /mnt/ssd/etc/fstab строку монтирования корневой ФС, отключаем swap и добавляем опции монтирования (опция commit=x включает режим обновления журнала каждые x секунд вместо 5 по-умолчанию) 5):
/mnt/ssd/etc/fstab
...
LABEL=ROOT / ext3 noatime,nodiratime,data=writeback,commit=50,rw,suid,dev,exec,auto,nouser,async,errors=remount-ro 0 1
  • отключаем раздел с карточкой
sudo umount /mnt/ssd
  • перезагружаемся!
  • если загрузилось, можно выключать, вытаскивать старый диск и загружаться с SSD;
  • удаляем mlocate;
sudo aptitude remove mlocate
  • настраиваем syslogd: добавляем - (минус) в начало каждой директивы;

Подробнее про оборудование и другие настройки моего домашнего сервера - в следующих логах.

~~DISCUSSION~~

blog/2010/1117_ssd_optimization.txt · Последнее изменение: 2022-02-19 18:15 — 127.0.0.1