Пришла пора сменить домашний сервер на домашний маршрутизатор!
Заодно перевести домашнюю сеть на скоростной 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 уже настроен, то оставалось сделать:
# 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"
#!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
make bin/undionly.kpxe
Тут всё просто:
screen /dev/ttyUSB0 38400
После загрузки платы по сети началась стандартная установка операционной системы Debian Linux. Карта памяти определилась как диск /dev/sda. Процесс установки прошёл как обычно, за исключением настройки файловой системы для работы на CF-карте (см. следующие разделы):
tune2fs -O ^has_journal /dev/sda1
e2fsck /dev/sda1
exit
В процессе установки инсталлятор определил, что используется последовательный терминал и автоматически добавил необходимые параметры. Проверяем и доделываем мелочи:
... 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"
update-grub
xconsole
уже закомментированы: ... # Automagically added by d-i T0:23:respawn:/sbin/getty -L ttyS0 38400 vt102 ...
# 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
net.ipv4.ip_forward = 1
kernel.panic_on_oops = 1 kernel.panic = 10
kernel.sysrq = 1
Так как вместо жётского диска используется Compact Flash карта с ограниченным ресурсом циклов записи в ячейки памяти, то пришлось настроить операционную систему для уменьшения операций записи:
...noatime,nodiratime,errors=remount-ro...
Следующим шагом, сильно сокращающим количество циклов записи, стало перемещение часто изменяющихся разделов ФС в память:
... RAMRUN=yes RAMLOCK=yes
... 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 ...
mkdir /var/compressed tar -P -czf /var/compressed/log.tgz /var/log/* tar -P -czf /var/compressed/spool.tgz /var/spool/*
#! /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-карту:
#!/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)
# 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
Пояснения к параметрам:
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.
How often the kernel should check if there is «dirty» (changed) data to write out to disk (in centiseconds).
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.
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.
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, тестирование скорости, обеспечение бесперебойного питания.