Содержание
Домашний Wi-Fi маршрутизатор
Пришла пора сменить домашний сервер на домашний маршрутизатор!
Заодно перевести домашнюю сеть на скоростной Wi-Fi стандарта 802.11n. Теоретически скорость передачи файлов с файлового сервера через маршрутизатор к беспроводным клиентам будет упираться в 100 Mb/s lan-интерфейса, т.е. останется такой же как и прежде. А практически - станет известно только после установки, настройки и тестирования.
Итак, поехали…
Маршрутизатор построен на базе платформы Alix2d13 с напаянным процессором AMD Geode 500 MHz и памятью объёмом 256 MB на борту. Беспроводную сеть обеспечивает miniPCI адаптер Compex WLM200N5 с двумя антеннами. В качестве носителя для операционной системы использована Compact Flash карта на 4 GB. Всё это упаковано в замечательный алюминиевый корпус красного цвета.
Сервер сетевой загрузки
Так как карт-ридера для Compact Flash у меня нет, а плата Alix умеет грузиться по сети, то было решено устанавливать Debian с помощью PXE-загрузки. Для этого понадобилось создать сервер сетевой загрузки. Я использовал уже имеющийся у меня на домашнем сервере DHCP-демон dnsmasq, который также умеет работать в режиме PXE и TFTP-сервера. Так как DHCP уже настроен, то оставалось сделать:
- установка PXE-сервера (DHCP + TFTP + PXE → dnsmasq)
скачивание установочных файловраспаковка файлов в tftp-корень- настройка PXE и TFTP
- /etc/dnsmasq.d/pxe.conf
# Config for dnsmasq # enable-tftp # Chainload to iPXE dhcp-boot=/var/lib/tftpboot/undionly.kpxe # To prevent endless loop set tag dhcp-userclass=set:ipxe_tag,"iPXE" # Boot chainloaded client dhcp-boot=tag:ipxe_tag,"/var/lib/tftpboot/menu.ipxe"
- создание menu-файла для iPXE (указываем параметры ядра для доступа через консоль)
- /var/lib/tftpboot/menu.ipxe
#!ipxe # dhcp kernel http://ftp.nl.debian.org/debian/dists/squeeze/main/installer-i386/current/images/netboot/debian-installer/i386/linux console=tty0 console=ttyS0,38400n8 initrd http://ftp.nl.debian.org/debian/dists/squeeze/main/installer-i386/current/images/netboot/debian-installer/i386/initrd.gz boot exit 0
- создание меню с несколькими пунктами
- скачивание iPXE с http://ipxe.org
- компиляция iPXE
make bin/undionly.kpxe
Подключение и загрузка Alix
Тут всё просто:
- вставил CF-карту
- подключился через последовательный интерфейс к плате:
screen /dev/ttyUSB0 38400
- включил и во время теста памяти нажал S для входа в меню установок tinyBIOS
- для включения загрузки по сети нажал E
Установка ОС
После загрузки платы по сети началась стандартная установка операционной системы Debian Linux. Карта памяти определилась как диск /dev/sda. Процесс установки прошёл как обычно, за исключением настройки файловой системы для работы на CF-карте (см. следующие разделы):
- В окне «Partition disks» выбираем «Go Back», затем «Execute a shell»
- Удаляем журнал ФС:
tune2fs -O ^has_journal /dev/sda1
- Проверяем ФС:
e2fsck /dev/sda1
- Командуем
exit
- В конце установки не забываем выбрать «SSH server»
- Устанавливаем загрузчик grub
- Перезагружаемся
Настройка ОС
В процессе установки инсталлятор определил, что используется последовательный терминал и автоматически добавил необходимые параметры. Проверяем и доделываем мелочи:
- Настраиваем grub:
- /etc/default/grub
... GRUB_CMDLINE_LINUX="console=ttyS0,38400n8" ... # Automagically added by d-i GRUB_TERMINAL=serial GRUB_SERIAL_COMMAND="serial --unit=0 --speed=38400 --word=8 --parity=no --stop=1"
- Обновляем grub
update-grub
- Проверяем inittab. Строки, активизирующие обычные консоли и
xconsole
уже закомментированы:- /etc/inittab
... # Automagically added by d-i T0:23:respawn:/sbin/getty -L ttyS0 38400 vt102 ...
- Отключаем ненужные модули:
- /etc/modprobe.d/alix-blacklist.conf
# Blacklist input module blacklist evdev # Blacklist sound modules blacklist snd_pcm blacklist snd_pcsp blacklist snd_timer blacklist snd blacklist soundcore blacklist snd_page_alloc # Blacklist PC speaker module blacklist pcspkr
- Указываем параметры ядра через sysctl:
- /etc/sysctl.d/ipforward.conf
net.ipv4.ip_forward = 1
- /etc/sysctl.d/panic.conf
kernel.panic_on_oops = 1 kernel.panic = 10
- /etc/sysctl.d/sysrq.conf
kernel.sysrq = 1
Оптимизация ОС
Так как вместо жётского диска используется Compact Flash карта с ограниченным ресурсом циклов записи в ячейки памяти, то пришлось настроить операционную систему для уменьшения операций записи:
- Удалили журнал файловой системы (сделали во время установки, см. раздел «Установка ОС»). Для защиты данных в будущем будет обеспечено бесперебойное питание
- Добавили параметры монтирования корневой ФС, уменьшающие количество операций записи:
- /target/etc/fstab
...noatime,nodiratime,errors=remount-ro...
Разместили SWAP, /home и /var/www на USB диске
Перемещение части ФС в память
Следующим шагом, сильно сокращающим количество циклов записи, стало перемещение часто изменяющихся разделов ФС в память:
- Перемещаем /var/run и /var/lock в tmpfs:
- /etc/default/rcS
... RAMRUN=yes RAMLOCK=yes
- Перемещаем другие разделы в tmpfs: 1)
- /etc/fstab
... tmpfs /tmp tmpfs defaults 0 0 tmpfs /var/log tmpfs defaults 0 0 tmpfs /var/tmp tmpfs defaults 0 0 tmpfs /var/spool tmpfs defaults 0 0 ...
- Чтобы не терять содержимое /var/log и /var/spool после перезагрузки, делаем:
mkdir /var/compressed tar -P -czf /var/compressed/log.tgz /var/log/* tar -P -czf /var/compressed/spool.tgz /var/spool/*
- Создаём init-скрипт для автоматизации: 2)
- /etc/init.d/flash.up
#! /bin/sh # # Carry out specific functions when asked to by the system case "$1" in start) echo "Starting script flash.up " /bin/tar -P -xzf /var/compressed/log.tgz /bin/tar -P -xzf /var/compressed/spool.tgz echo "Completing untar the log and spool files to ram disk..." ;; stop) echo "Stopping script flash.up" /bin/tar -P -czf /var/compressed/log.tgz --exclude=/var/log/cache/* /var/log/* /bin/tar -P -czf /var/compressed/spool.tgz /var/spool/* echo "tar the log and spool files from ram disk to /var/compressed..." ;; *) echo "Usage: /etc/init.d/flash.up {start|stop}" exit 1 ;; esac exit 0
- Добавляем права запуска файлу:
chmod 755 /etc/init.d/flash.up
- Добавляем скрипт в автозагрузку:
update-rc.d flash.up defaults 10
Синхронизация памяти с диском
Для надёжности можно периодически сбрасывать содержимое tmpfs разделов на CF-карту:
- Создаём задание для cron:
- /etc/cron.hourly/compressed
#!/bin/sh # Backup logs to flash /bin/tar -P -czf /var/compressed/log.tgz --exclude=/var/log/cache/* /var/log/* /bin/tar -P -czf /var/compressed/spool.tgz /var/spool/*
- Добавляем права на запуск:
chmod 755 /etc/cron.hourly/compressed
Оптимизация параметров ядра
Так как система работает без раздела подкачки, то необходимо указать ядру ряд параметров для более стабильной работы: 3)
- /etc/sysctl.d/cf.conf
# specific tuning for flash drive vm.swappiness = 0 vm.laptop_mode = 0 vm.dirty_writeback_centisecs = 12000 vm.dirty_expire_centisecs = 12000 vm.dirty_ratio = 10 vm.dirty_background_ratio = 1
Пояснения к параметрам:
- /proc/sys/vm/laptop_mode
How many seconds after a read should a writeout of changed files start (this is based on the assumption that a read will cause an otherwise spun down disk to spin up again). If you don’t need to write dirty data after every read, you sould disable it by setting it to 0.
- /proc/sys/vm/dirty_writeback_centisecs
How often the kernel should check if there is «dirty» (changed) data to write out to disk (in centiseconds).
- /proc/sys/vm/dirty_expire_centisecs
How old «dirty» data should be before the kernel considers it old enough to be written to disk. It is in general a good idea to set this to the same value as dirty_writeback_centisecs above.
- /proc/sys/vm/dirty_ratio
The maximum amount of memory (in percent) to be used to store dirty data before the process that generates the data will be forced to write it out. Setting this to a high value should not be a problem as writeouts will also occur if the system is low on memory.
- /proc/sys/vm/dirty_background_ratio
The lower amount of memory (in percent) where a writeout of dirty data to disk is allowed to stop. This should be quite a bit lower than the above dirty_ratio to allow the kernel to write out chunks of dirty data in one go.
Заключение
Следующие этапы работы: настройка служб Wi-Fi, настройка брандмауэра и NAT, тестирование скорости, обеспечение бесперебойного питания.