вівторок, 7 липня 2015 р.

Сетевой media сервер для PS3. Продолжение.

Как я и говорил в предыдущей части Сетевой media сервер для PS3 мы не будем использовать rc-скрипты для управление сервисом, а создадим отдельный контейнер для данного сервиса используя возможности Docker.
Создадим отдельную папку для размещения файла конфигурации создания контейнера и скопируем в него скомпилированый файл (смотрите предедущую часть). Для примера:
$ cd ~/docker/ps3netsrv
$ cp ~/source/ps3netsrv/ps3netsrv ./
Создадим файл конфигурации:
$ vim Dockerfile
FROM sovicua:jessie
MAINTAINER Viktor M. Sytnyk <sovicua@sovic.org.ua>
ENV DEBIAN_FRONTEND=noninteractive
RUN apt-get update && apt-get upgrade -y
RUN groupadd -g 1000 ps3netsrv
RUN useradd -u 1000 -g 1000 -m -c "PS3 Media Server" ps3netsrv
VOLUME /home/ps3netsrv/media
RUN chown ps3netsrv:ps3netsrv /home/ps3netsrv/media
COPY ps3netsrv /home/ps3netsrv/
RUN chown ps3netsrv:ps3netsrv /home/ps3netsrv/ps3netsrv
WORKDIR /home/ps3netsrv
CMD ./ps3netsrv ./media
Создаем образ для данного сервиса:
$ docker build -t sovicua:ps3netsrv .
И запускаем контейнер:
$ docker run --net=host --name=ps3netsrv --user=ps3netsrv -v /mnt/media/ps3netsrv:/home/ps3netsrv/media -i -t -d sovicua:ps3netsrv
- где /mnt/media/ps3netsrv - корневой каталог в основной операционной системе, который монтируется в /home/ps3netsrv/media в контейнере. Все можно проверять работу нашего медиа-сервера на PS3. Думаю что вы сможете дальше не составить труда вам разобрать что и как.
В дальнейшем я планирую выгрузить данный контейнер в общий пул Docker, что бы каждый мог воспользоваться данным готовым контейнером для создания медиа-сервера.
Хотелось бы услышать ваше мнение по данному вопросу.

понеділок, 6 липня 2015 р.

Установка timezone в базовом образе Docker


Как то так случилось что я забыл установить в базовом образе правильную часовую зону, и после этого все контейнеры которые я делал с этого образа понятное дело имели зону UTC вместо Europe/Kiev. Каждый раз устанавливать правильную временную зону меня напрягает, соответственно что бы больше не заморачивать с данной проблемой, я решил обновить базовый образ.
Дополнительно обновим образ и установим еще несколько пакетов которые потребуются нам в дальнейшем.
$ docker run --name=jessie -i -t sovicua:jessie
# export DEBIAN_FRONTEND=noninteractive
# apt-get update && apt-get upgrade -y
# apt-get install -y apt-utils debconf-utils
# echo 'Europe/Kiev' > /etc/timezone
# dpkg-reconfigure tzdata
Выходим из контейнера и обновляем базовый образ.
$ docker commit --author="Viktor M. Sytnyk <sovicua@sovic.org.ua>" jessie sovicua:jessie
Ну вот и все, теперь в базовом образе у нас будет установлена правильная временная зона Europe/Kiev, а не UTC.

Сетевой media сервер для PS3

Давно валялась в черновиках данная заметка, все никак не мог собраться ее оформить и опубликовать. Но как говорят это вечно длится не может, так что приступим к повествовании. Собственно в чем же задача, спросите вы? У кого есть PS3 с установленной CFW, тот знает что записать файл больше 4Гб нельзя на внешний диск, так как это ограничение файловой системы FAT32 (сейчас файловые менеджеры для PS3, такие как Multiman поддерживают возможность чтения с томов NTFS, но эта функциональность появилась довольно недавно). Для решения этой проблемы можно было применить два метода:
  • записывать игру на внутренний диск
  • использовать специальные программы которые разбивали большие файлы на части, которые понимал файловый менеджер PS3 (в конечном итоге он все равно склеивал эти файлы и копировал на внутренний диск приставки) 
Но существовал и еще один метод, это поднять медиа-сервер для "стриминга" контента на PS3. Собственно этим мы займемся :)
У меня на PS3 установлена CFW с функцией Cobra, что позволяет использовать ISO образы, и не требует разворачивания образа в отдельный каталог, как того требуется. Дополнительно у меня еще установлен webMAN что позволяет мне монтировать образы игр не запуская файловый менеджер и даже управлять образами и самой приставкой из веб-браузера (даже с мобильного). Но не это есть предметом данного сообщения. Кому интересно, может обратиться к документации по этому ПО или мне написать личное сообщение.
Собственно, ничего сложного в сборке этого нет (сложно было найти это все в разных форумах и собрать вместе), скачиваем подготовленный архив с исходными файлами. Этот архив предназначен для платформы Linux x86_64, хотя я его собирал и под FreeBSD и даже для роутера ASUS RT-N56U. Я уже не помню всех нюансов сборки под данную платформу, если вас интересует данный вопрос, можете мне написать в личку или почитать Issue 1106: compiling ps3netsrv. В данный архив уже включены измененные файлы "main.cpp" и "netiso.h". Разворачиваем архив и собираем.
$ tar -xzvf ps3netsrv.tar.gz
$ make
Примечание.
В архиве есть скелет rc-скрипта для автоматического запуска/остановки сервиса, но я пошел другим путем и так его и не закончил. 
Запускаем все это очень просто:
$ ./ps3netsrv /mnt/media/ps3netsrv
 - где /mnt/media/ps3netsrv root-директория где будет лежать контент для PS3. Внутри корневой директории создаем папки - GAMES, PS3ISO. В первую складываем обычные распакованые образы, а в вторую образы в формате ISO.

пʼятниця, 3 липня 2015 р.

Собираем и настраиваем DNS сервер bundy (BIND10). Часть 2.

Итак, продолжим наши эксперименты.
После того как закончится сборка, выполняем инсталляцию:
# make install
Подготовка к первому запуску.
По умолчанию сервисы DNS и DHCP не запускаются, их нужно отдельно активировать при помощи утилиты bundyctl. Перед этим нам нужно добавить пользователя от которого мы будем управлять сервисом.
# bundy-cmdctl-usermgr add root
Так же стоит подготовить базу данных для DHCP сервера.
# mysql -u root -p
mysql> CREATE DATABASE bundy;
mysql> CONNECT bundy;
mysql> SOURCE /usr/share/bundy/dhcpdb_create.mysql
mysql> CREATE USER 'bundy'@'localhost' IDENTIFIED BY 'bundy';
mysql> GRANT ALL ON bundy.* TO 'bundy'@'localhost';
mysql> quit
Ну вот и все мы готовы к запуску и посмотреть что же это за зверь такой этот BUNDY 

Поехали...
Из родительской системы выполняем команду запуска, для первого запуска можно даже добавить ключ --verbose
$ docker exec -i -t bundy /usr/sbin/bundy --verbose
В контейнере подключаемся к сервису используя утилиту bundyctl которая позволяет нам  управлять и настраивать все сервисы bundy.
# bundyctl
Username: root
Password:
["login success"]
> help

usage: <module name> <command name> [param1 = value1 [, param2 = value2]]
Type Tab character to get the hint of module/command/parameters.
Type "help(? h)" for help on bundyctl.
Type "<module_name> help" for help on the specific module.
Type "<module_name> <command_name> help" for help on the specific command.

Available module names:
    help        Get help for bundyctl.
    config      Configuration commands.
    execute     Execute a given set of commands
    Stats       Stats daemon
    tsig_keys   The TSIG keyring is stored here
    Init        Init process
    Logging     Logging options
    data_sources
            The sources of authoritative DNS data
    Cmdctl      Interface for command and control
    Msgq        The message queue
>
Как я и говорил выше, по умолчанию сервисы DNS и DHCP (и другие) не запущены, для их инициализации есть готовый скрип который выполняет инициализацию авторизированного DNS сервер. Итак, для начала посмотрим какие у нас процессы запущены до начала инициализации.
> Init show_processes
[
    [
        18493,
        "Socket creator",
        null
    ],
    [
        18494,
        "msgq",
        null
    ],
    [
        18496,
        "cfgmgr",
        "ConfigManager"
    ],
    [
        18498,
        "bundy-stats",
        "Stats"
    ],
    [
        18499,
        "bundy-cmdctl",
        "Cmdctl"
    ]
]
Выполняем скрипт инициализации и снова смотрим что у нас теперь с процессами:
> execute init_authoritative_server
adding Authoritative server component
adding Xfrin component
adding Xfrout component
adding Zone Manager component
Components added. Please enter "config commit" to
finalize initial setup and run the components.
> config commit
> Init show_processes
[
    [
        18493,
        "Socket creator",
        null
    ],
    [
        18494,
        "msgq",
        null
    ],
    [
        18496,
        "cfgmgr",
        "ConfigManager"
    ],
    [
        18498,
        "bundy-stats",
        "Stats"
    ],
    [
        18499,
        "bundy-cmdctl",
        "Cmdctl"
    ],
    [
        18559,
        "bundy-xfrout",
        "Xfrout"
    ],
    [
        18560,
        "bundy-xfrin",
        "Xfrin"
    ],
    [
        18561,
        "bundy-zonemgr",
        "Zonemgr"
    ],
    [
        18562,
        "bundy-auth",
        "Auth"
    ]
]
Думаю, что разница заметна :) У нас появились 4 новых процессов:



  • bundy-xfrout
  • bundy-xfrin
  • bundy-zonemgr
  • bundy-auth

  • Проверим работу DNS сервера через запрос его версии.
    # dig @127.0.0.1 -c CH -t TXT version.bind
    
    ; <<>> DiG 9.9.5-9-Debian <<>> @127.0.0.1 -c CH -t TXT version.bind
    ; (1 server found)
    ;; global options: +cmd
    ;; Got answer:
    ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 27337
    ;; flags: qr aa rd; QUERY: 1, ANSWER: 1, AUTHORITY: 1, ADDITIONAL: 1
    ;; WARNING: recursion requested but not available
    
    ;; OPT PSEUDOSECTION:
    ; EDNS: version: 0, flags:; udp: 4096
    ;; QUESTION SECTION:
    ;version.bind.   CH TXT
    
    ;; ANSWER SECTION:
    version.bind.  0 CH TXT "bundy 1.2.0"
    
    ;; AUTHORITY SECTION:
    bind.   0 CH NS bind.
    
    ;; Query time: 1 msec
    ;; SERVER: 127.0.0.1#53(127.0.0.1)
    ;; WHEN: Fri Jul 03 07:39:41 UTC 2015
    ;; MSG SIZE  rcvd: 79
    

    Ну что же нас можно поздравить - не взирая на всякие препятствия при компиляции, мы смогли запустить и инициализировать  авторизированный DNS сервер BUNDY|BIND10. Думаю что на сегодня достаточно буковок 

    В следующей части мы немного разберемся с модулями которые входят в bundy и кто за что отвечает.

    четвер, 2 липня 2015 р.

    Scala первые впечетления

    Вспомнить все и забыть, так можно описать мое впечатление от знакомства с Scala. Все началось с того, что однажды в выходные я вытянул архив с исходниками что я когда то писал на Java. Посмотрел на все это, мне захотелось что то написать небольшое, так сказать для души... хотя какая может быть душа, если последний раз я что то писал серьезно на Java наверное несколько лет назад.
    У меня иногда случаются такие вот "хотелки", которые возникают после просмотра архивов прошлых работ ☺ И даже иногда я все таки что-то могу написать, но как обычно это просто небольшие программки (даже не программки, а просто скелеты/заготовки) которые в конечном итоге я так и не доводил до готовой программы которую можно было бы использовать.

    Последнее такое мое желание наступило когда мне захотелось написать небольшую программку для Android, что то типа напоминалки и базы данных клиентов в одном флаконе. Для хранение базы клиентов я решил использовать SQLite, ну так как в наше время напрямую с базой практически не работают, зачем писать какие то там SQL-запросы, если все можно типа обернуть в классы и работать с базой через них.
    В общем модно сейчас работать напрямую с базами, но это мое мнение и вы можете с ним не согласиться. По крайней мере для небольших проектов, как мне кажется оно может быть и удобно и позволяет не призываться к особенностям реализации каждой БД. Выдержка с wiki о данной технологии:

    ORM (англ. object-relational mapping, рус. объектно-реляционное отображение) — технология программирования, которая связывает базы данных с концепциями объектно-ориентированных языков программирования, создавая «виртуальную объектную базу данных»

    Собственно для этих целей я выбрал популярный фреймворк для Java - ORMLite, который по отзывам очень не плох как по функционалу так и по производительности.

    ... нда, что-то я отвлекся сильно от темы данного поста.

    Итак, возвращаемся к Scala... правда это наверное будет уже в следующий раз. ☺

    середа, 1 липня 2015 р.

    Собираем и настраиваем DNS сервер bundy (BIND10). Часть 1.

    Как то незаметно ☺ дошли руки все таки потрогать BIND10. Для начала немного истории о данном продукте.
    Первый релиз BIND10 был представлен консорциумом ISC в феврале 2013. 17 апреля 2014 консорциум ISC выпустил последний релиз BIND10 1.2.0, после это передал все наработки сообществу независимых разработчиков. Данного решение было принято в связи с тем что у консорциума нет ресурсов для разработки двух альтернативных проектов. Поэтому они будут развивать только BIND9, а BIND10 полностью переходит в руки сообщества. Для уменьшения путаницы с BIND9, на GitHub был создан новый проект в который перенесли все наработки консорциума по BIND10 и данный проект получил название Bundy.

    Ну что же, думаю можно приступать к эксперименту.

    Создадим новый контейнер и подключаемся к нему:
    $ docker run --name bundy --hostname=bundy -d -i -t sovicua:jessie
    $ docker attach bundy
    

    Как обычно обновляемся и устанавливаем нужные пакеты для сборки.
    # apt-get update
    # apt-get upgrade
    # apt-get install git-core g++ make pkg-config python3-dev sqlite3 libsqlite3-dev libbotan1.10-dev liblog4cplus-dev libboost-dev python3-setproctitle dnsutils net-tools autoconf autoconf-archive automake libtool
    

    Получаем исходные коды проекта и выполняем сборку:
    # git clone https://github.com/bundy-dns/bundy.git
    # cd bundy
    # autoreconf --install
    # ./configure --prefix=/usr --sysconfdir=/etc --without-werror --enable-experimental-resolver
    # make
    

    И получаем ошибку при сборке resolver :(
    Ошибку получаем из-за того что ветке master отсутствуют некоторые файлы, в частности в папки src/lib/xfr которая нужна для сборки resolver. Если собирать без этой опции то все собирается и работает. Но так как мне хотелось попробовать все, то мне пришлось загрузить исходные коды с другой ветки и собирать все снова.
    Дополнительно включаем для сервера DHCP хранение базы в MySQL. В процессе инсталляции нам зададут несколько вопросов на которые думаю не сложно будет ответить ☺
    # wget http://dev.mysql.com/get/mysql-apt-config_0.3.6-1debian8_all.deb
    # dpkg -i mysql-apt-config_0.3.6-1debian8_all.deb
    
    Выбираем самую последнюю версию (DRM - Developer milestone releases)
    Configuring mysql-apt-config
    ----------------------------
    
    MySQL APT Repo features MySQL Server along with a variety of MySQL components. You may select the appropriate product to choose the version that you wish to receive.
    
    Once you are satisfied with the configuration then select last option 'Apply' to save the configuration. Advanced users can always change the configurations later,
    depending on their own needs.
    
      1. Server  2. Connector-Python  3. Utilities  4. Apply
    
    Which MySQL product do you wish to configure? 1
    
    This configuration program will detect the current state of your system, check for any installed MySQL Server packages, and try to select the most appropriate version
    of MySQL Server to be installed. If you are not sure which version to choose for yourself, do not change the auto-selected version. Advanced users can always change
    the version later, depending on their own needs.
    
      1. mysql-5.6  2. mysql-5.7-dmr  3. none
    
    Which server version do you wish to receive? 2
    
    MySQL APT Repo features MySQL Server along with a variety of MySQL components. You may select the appropriate product to choose the version that you wish to receive.
    
    Once you are satisfied with the configuration then select last option 'Apply' to save the configuration. Advanced users can always change the configurations later,
    depending on their own needs.
    
      1. Server  2. Connector-Python  3. Utilities  4. Apply
    
    Which MySQL product do you wish to configure? 4
    
    Если вы решили использовать стабильную версию, то нужно выполнить команду:
    # dpkg-reconfigure mysql-apt-config
    
    ... и выбрать требуемую версию ПО которое вы хотите использовать.
    После этого обновляем данные репозитория и устанавливаем MySQL сервер.
    # apt-get update
    # apt-get install mysql-server libmysqlclient-dev libz-dev
    
    Запускаем сервер MySQL
    # service mysql start
    ..
    [info] MySQL Community Server 5.7.7-rc is started.
    # service mysql status
    [info] MySQL Community Server 5.7.7-rc is running.
    

    Теперь мы готовы к повторной сборке.
    # git clone --branch bundyfork --single-branch https://github.com/bundy-dns/bundy.git
    # cd bundy
    # autoreconf --install
    # ./configure --prefix=/usr --sysconfdir=/etc --without-werror --with-dhcp-mysql --enable-experimental-resolver 
    # make
    ...

    ... первый запуск и инициализация, это мы продолжим в второй части когда закончится сборка ☺

    четвер, 25 червня 2015 р.

    Дополнительная настройка Docker

    Так уж случилось что у меня в моем домашнем типа NAS два диска, один маленький всего 20G  на котором установлена система и второй большой, который я использую для хранения файлов, как обычно говорят - файлопомойка :). С учетом того что я довольно часто играюсь с Docker, и образы его иногда получаются не маленькие, так как я часто пробую делать игровые сервера :)
    REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
    sovicua/games       csgo                72db510df094        2 weeks ago         11.73 GB
    sovicua/games       7dtd                11ec48e2f063        6 weeks ago         3.001 GB
    sovicua/steam       jessie              ad9da57cc230        9 weeks ago         573.2 MB
    
    Понятно что место на системном диске быстро закончится, так как по умолчанию Docker складывает образы контейнеров в /var/lib/docker. Самым простым решением это конечно просто перенести данную директорию в новое место (на большой диск) и сделать простую символическую ссылку. Но в некоторых случаях пишут что это не работает или возникают некоторые проблемы в работе. Более правильно нужно использовать опцию -g /mnt/docker.
    И так, приступаем:
    Останавливаем сервис
    # service docker stop
    Редактируем файл /etc/default/docker, добавляем параметр
    DOCKER_OPTS="-g /mnt/docker"
    Переносим папку /var/lib/docker и для верности еще создаем символическую ссылку :)
    Запускаем сервис
    # service docker start
    Проверяем что у нас сменился Root Dir
    # docker info | grep Root
     Root Dir: /mnt/docker/aufs