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

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


blog:2012:0418_alix

Домашний 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:

Оптимизация ОС

Так как вместо жётского диска используется 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, тестирование скорости, обеспечение бесперебойного питания.

blog/2012/0418_alix.txt · Последнее изменение: 2022-02-19 18:16 — 127.0.0.1