Введение
В первой части нашего материала мы рассказали о том, какие нужно внести изменения в аппаратную часть Xbox, чтобы подготовить её к новой жизни в роли полноценного сетевого хранилища NAS и файлового сервера. Во второй части мы показали, как установить web-сервер LAMP и клиента TorrentFlux. В заключительной части мы добавим к получившемуся решению такие возможности, как распределение полосы пропускания между BitTorrent и другими интернет-службами, а также оценим скорость работы получившегося решения.
Предупреждение. Действия, изложенные в третьей части, не являются обязательными. Помните, что если вы что-то испортите, то придётся снова подключать DVD-привод и устанавливать Linux! Конечно, если вы будете следовать нашим инструкциям, то проблем будет меньше. С другой стороны, если всё пройдёт чересчур гладко, то особого удовольствия от работы вы не получите!
При активном использовании клиента BitTorrent, когда на систему одновременно закачивается несколько файлов, скорость работы других приложений наверняка снизится. Это связано с тем, что BitTorrent активно использует всю доступную полосу канала. К сожалению, из-за этого может существенно замедляться работа web или SSH, когда пакеты этих протоколов выстраиваются в очередь вместе с сотнями пакетов BitTorrent.
Замедление касается, в основном, исходящего трафика, поскольку большинство домашних подключений имеют разные скорости для входящего и исходящего трафика, причём скорость исходящего обычно бывает ощутимо ниже скорости входящего (например, 256 кбит/с – входящий и 128 кбит/с – исходящий или 2048 кбит/с – входящий и 256 кбит/с – исходящий). Для борьбы со снижением скорости нам нужно лишь перенести очередь исходящего трафика BitTorrent с ADSL-модема на Xbox и задать приоритеты трафика, исходящего от Xbox, так, чтобы BitTorrent имел наименьший приоритет. К счастью, Linux позволит нам всё это сделать!
Подробности можно прочитать здесь и здесь (последний документ создан именно для дистрибутива Gentoo, хотя дистрибутивы Linux отличаются не сильно). Кроме практической части, в этих материалах вы сможете познакомиться и с теорией. Все документы предполагают, что система на базе Linux является и маршрутизатором, и шлюзом. В нашем случае это не так, и конфигурация окажется более простой.
Обновление ядра
Во-первых, нам нужно обновить ядро системы до версии 2.6. Поскольку ядро является “сердцем” Linux, работа всей системы зависит от него, как игра оркестра зависит от дирижёра. Здесь можно прочитать достаточно подробное описание обновления ядра до версии 2.6 в Xebian. Рекомендуем познакомиться с материалом, поскольку при обновлении ядра мы будем руководствоваться именно им.
Во-первых, нам нужен исходный код ядра. Для этого заходим на сайт http://www.kernel.org и выбираем там последнюю стабильную версию (STABLE). И скачиваем её. Делается это примерно следующим образом.
cd /usr/src wget http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.14.3.tar.bz2 tar xfvj linux-2.6.14.3.tar.bz2 |
В последней строке указана команда создания ссылки (symbolic link) – нечто подобное ярлыку Windows – на каталог, чтобы в дальнейшем не набирать полный путь к нему.
Далее нам нужно найти файл, который подредактирует часть исходного кода для работы на Xbox. Для этого заходим на домашнюю страницу XBOX-Linux и скачиваем патч, который соответствует версии исходного кода скачанного ядра. Например.
wget http://kent.dl.sourceforge.net/sourceforge/xbox-linux/linux-2.6.14-xbox.patch.gz
tar xfvz linux-2.6.14-xbox.patch.gz |
Напоминаем, что команда wget вводится одной строкой.
Патч позволяет изменить исходный код ядра на специфичный, предназначенный для Xbox.
cd linux patch -p1 < linux-2.6.14-xbox.patch |
Ошибок при выполнении указанных действий быть не должно. Патч Xbox создаёт конфигурационный файл, который нам нужно переименовать
cp kernel.config .config |
Теперь нужно выбрать опции для тех частей ядра, которые мы хотим скомпилировать.
make oldconfig |
Добавление контроля трафика и приоритезации пакетов (shaping)
Зададим дополнительные параметры, которые будем использовать в дальнейшем для управления трафиком.
make menuconfig |
Появится текстовое меню. Нужно выбрать следующие опции.
Теперь можно компилировать новое ядро. На это потребуется около одного часа, так что обзаведитесь терпением.
make clean make make modules make modules_install |
Убедитесь, что всё прошло без ошибок на всех этапах. Конечно, могут возникнуть предупреждения. Мы их просто игнорировали, в результате никаких проблем не заметили. При удачном завершении компиляции, должен появиться файл bzImage dв каталоге /usr/src/linux/arch/i386/boot.
Этот файл является скомпилированным ядром. Проверим, работает ли он. Cromwell BIOS использует текстовый файл для того, чтобы определить, откуда загружаться. Для его редактирования запустимvi.
vi /boot/linuxboot.cfg |
Файл должен содержать следующее.
title v2_4 kernel /boot/vmlinuz append root=/dev/ide/host0/bus0/target0/lun0/part2 devfs=mount kbd-reset xbox=hdd xboxfb y |
Измените файл следующим образом.
title v2_6 kernel /usr/src/linux/arch/i386/boot/bzImage append root=/dev/hda2 devfs=mount kbd-reset xbox=hdd xboxfb y title v2_4 default v2_6 |
Сохраняем файл и перезагружаем Xbox (команда “reboot”). Если Xbox не подключена к телевизору, то сообщений об ошибках и предупреждений вы не увидите. При успешной загрузке, примерно через 1-2 минуты, можно подключаться к приставке через SSH, в приветственном сообщении можно увидеть версию ядра.
Если система не работает, то подключите её к телевизору, перезагрузите и следите за сообщениями об ошибках. Для загрузки с использованием старого ядра версии 2.4 нужно воспользоваться клавиатурой с разъёмом USB: выберите соответствующий пункт в меню загрузки Cromwell BIOS, то есть старое ядро, которое у нас называется v2_4.
Если же обновление прошло успешно, нужно сделать изменения постоянными.
cd /usr/src/linux/ make install |
Когда будет предложено создать загрузочный диск, следует отказаться. Файл образа ядра скопируется в каталог /boot/, после чего обновится ссылка vmlinuz, указывающая на ядро. Теперь можно изменить файл linuxboot.config до следующего вида.
title v2_6 kernel /usr/src/vmlinuz append root=/dev/hda2 devfs=mount kbd-reset xbox=hdd xboxfb y title v2_4 default v2_6 |
Кстати, мы обнаружили, что после обновления ядра некоторые модули перестали загружаться. Почему такое произошло, мы не знаем, но в списке компиляции они были! Одна из проблем заключалась в том, что названия модулей клавиатуры и мыши в версиях 2.4 и 2.6 различаются. В версии 2.4 они называются mousedev и keybdev, а в 2.6 – usbmouse и usbkeyb.
Для исправления нужно отредактировать имена в файле /etc/modules.xbox. Честно говоря, ни один из этих модулей нам не требуется, поскольку приставка работает без клавиатуры и мыши, но подключить их всё же не мешает. Другие модули, на загрузку которых жаловалось ядро, нам не нужны, поэтому мы их закомментировали.
loop #input usbkbd #usbmouse #joydev sunrpc lockd nfs #scsi_mod #sd_mod #hid #xpad #xir #lirc_dev #lirc_xir #snd-intel8x0 |
Приоритезация трафика (shaping)
Сейчас мы можем создать скрипт, который будет устанавливать приоритеты трафика. Не будем углубляться в теорию, вся она прекрасно изложена в отдельном материале, о котором мы упоминали ранее (правда, на английском языке).
Возможно, вы захотите поэкспериментировать с параметрами. Мы создадим три скрипта. Первый – для iptables, который будет маркировать пакеты на основании исходящего порта (source port), второй – для контроля трафика (tc), он будет задавать приоритеты для пакетов по маркировке, а третий будет служить для сброса настроек.
Сохраним копию текущего файла iptables.
cd /home/myname mkdir shaping cd shaping iptables-save > blank_iptables |
Создадим текстовый файл.
vi marking_packets.sh |
В нашем случае он выглядел следующим образом.
MARKPRIO1=”1″
# Setting priority marks iptables -t mangle -A OUTPUT -p tcp –sport 22 -j MARK –set-mark $MARKPRIO1 |
Как видим, мы задали максимальный приоритет для трафика SSH, HTTP и Samba. Остального мы не затронули. Сохраняем файл и делаем его исполняемым при помощи следующей команды.
chmod +x marking_packets.sh |
Создаём файл iptables_quotas.sh, который в нашем случае выглядел примерно следующим образом.
Теперь делаем файл исполняемым, как показано выше. Если вам потребуется сбросить настройки iptables и tc, то можно воспользоваться следующим скриптом.
IFACE=eth0 tc qdisc del dev $IFACE root 2> /dev/null > /dev/null tc class del dev $IFACE root 2> /dev/null > /dev/null tc filter del dev $IFACE root 2> /dev/null > /dev/null iptables-restore > blank_iptables |
Теперь запускаем первые два скрипта.
./marking_packets.sh ./iptables_quotas.sh |
Если всё прошло гладко, то ошибок и предупреждений появиться не должно. Проверить работоспособность приоритезации можно, снизив скорость в параметре LAN_RATE, например, до 10 кбит/с, после чего попытаться скопировать файл либо на Xbox, либо с Xbox, и посмотреть, насколько это будет медленно! Также можно поиграть со значениями P2PRATE и PRIORATE4, с учётом скорости вашего подключения. Мы тестировали на канале со скоростью исходящего потока 256 кбит/с и, как нам показалось, всё работало так, как полагается. Несмотря на то, что приоритезация распространяется только на входящий и исходящий трафик Xbox, сейчас клиент TorrentFlux будет вести себя не так прожорливо, поэтому интернет-соединение можно будет использовать и для другой деятельности.
Поздравляем! Сейчас у вас есть полноценное мощное сетевое устройство хранения данных NAS, которому могут позавидовать ваши знакомые! Вообще, проект достаточно универсален. То есть можно установить два ёмких 3,5″ жёстких диска вместо одного 2,5″. Возможно, создать программный RAID? Или подключить к приставке USB-модем и настроить маршрутизацию? Или что-то ещё? Выбор за вами!
Тесты производительности
До проекта Xbox мы использовали внешний жёсткий диск с интерфейсом USB 2, подключенный к медиа-центру на основе обычного ПК. На нём и хранились все общие файлы. Мы используем сеть Fast Ethernet на 100 Мбит/с, да и, к сожалению, возможности обновить Xbox до гигабита нет, иначе мы смогли бы создать просто выдающееся по характеристикам сетевое хранилище NAS.
В качестве быстрого теста мы копировали файл размером 150 Мбайт, результаты оказались следующими.
- Компьютер “А”, с внутреннего диска на второй внутренний диск = 11 секунд.
- Компьютер “А”: с внешнего диска USB2 на внутренний = 13 секунд.
- Сеть: Xbox NAS на внутренний диск компьютера “А” = 19 секунд.
- Сеть: с внутреннего диска компьютера “B” на внутренний диск компьютера “A” = 19 секунд.
Конфигурация машин следующая.
- Компьютер “A”: Athlon XP 3200+, 768 Мбайт ОЗУ, Media Center PC под управлением Windows MCE 2005.
- Компьютер “B”: ноутбук на базе Athlon XP 1600+, 512 Мбайт ОЗУ, под управлением Windows XP Pro.
Как видно, скорость копирования с Xbox оказалась ниже, чем с внешнего диска USB 2, но примерно такой же, как скорость копирования по сети с другого компьютера под управлением Windows XP.
Мы также измерили скорость чтения и записи файловой системы, используя для этого iozone по следующей методике. Все тесты выполнялись на компьютере “А” с Media Center.
Примечание. Скорость чтения или записи данных на диск зависит от множества параметров системы, поэтому результаты теста могут отличаться от результатов, которые вы получите на своей системе. Вообще, теоретический максимум скорости передачи данных по 100-Мбит/с сети составляет около 12 Мбайт/с, то есть значения более 12 Мбайт/с говорят о влиянии кэширования, а не о скорости сети.
Рис. 1. Скорость записи по сети с ПК на Xbox NAS.
Рис. 2. Скорость записи по сети с ПК на ПК.
На Рис. 1 и 2 показана скорость записи по сети на Xbox и на ноутбук с процессором Athlon XP1600+ под управлением Windows XP Pro с 512 Мбайт ОЗУ. Хотя пиковые скорости с учётом кэширования в обоих случаях достигают 300 Мбит/с, Xbox показывает такую скорость для более широких рамок размеров файла и записи, то есть имеет некоторое преимущество в скорости записи.
На Рис. 3 и 4 показаны результаты тестов чтения с обоих ресурсов.
Рис. 3. Скорость чтения по сети с Xbox NAS.
Рис. 4. Скорость чтения по сети с другого ПК.
Как видим, разница в скорости чтения практически не заметна, что подтверждается и результатами теста копирования файла, проведённого ранее.
Во всех тестах мы видим прекрасные результаты при использовании кэширования, но нам нужно оценить скорость без учёта специфики операционной системы. Как показывает наш опыт работы с iozone, эффект от кэширования стремится к нулю при размере файла 128 Мбайт и выше. На Рис. 5 и 6 показано сравнение скорости записи и чтения по сети с Xbox и с ноутбука для файла размером 128 Мбайт при размере записи от 64 до 16384 кбайт.
Рис. 5. Сравнение скорости записи на Xbox или ПК при размере файла 128 Мбайт.
Рис. 6. Сравнение скорости чтения с Xbox или ПК при размере файла 128 Мбайт.
На Рис. 5 видно, что при малых размерах записей преимущество за ноутбуком, однако при размере записи более 512 кбайт вперёд выходит Xbox NAS.
С другой стороны, как видно по Рис. 6, диск ПК имеет более стабильную скорость чтения, чем у Xbox. Однако, как показало копирование файла, это преимущество может никак не проявиться в реальных условиях.
Заключение
На этом наши “развлечения” с Xbox NAS подходят к своему логическому завершению. Как нам кажется, игра стоила свеч. Относительно скромные финансовые затраты на устаревший для многих “пылесборник” в виде Xbox вылились в гибкое и быстрое сетевое хранилище, которое, кроме всего прочего, оснащено встроенным клиентом BitTorrent. Кроме того, мы получили компактный сервер на базе Linux, задачи для которого всегда можно найти.