How-to`s — Домашний медиацентр на основе ArchLinux и XBMC
Мне давно не дает покоя идея замены надоевшего телевизора на связку 24" монитор + нормальный медиацентр с автообновлениями, рейтингом, возможностью смотреть YouTube, TED Talks, Discovery...
В этой статье я остановлюсь на програмной части. Базой для создаваемой системы я решил выбрать ArchLinux из-за его минималистичности. По сути, для медиацентра не нужны крутые DE — достаточно чистых иксов для запуска оболочки да пары скриптов для управления с пульта.
Итак, программная часть в себя включает:
— ArchLinux 2010.05 с Xorg 1.8 и ядром 2.6.35;
— Облочку медиацентра XBMC;
— AnyRemote для управления медиацентром при помощи мобильного телефона с Bluetooth.
Ну что, поехали?
0. Устанавливаем на будущий медиацентр чистый Арч (детали см. в арчевики). Настраиваем звук, интернет, обновляем систему до актуального состояния:
1. Устанавливаем необходимые пакеты: Xorg, видеодрайвер, стек Bluetooth и компилятор (зачем — обьясню ниже).
Если вы желаете пользоваться проприетарными драйверами ATI, то они доступны в пользовательском репозитории AUR. Для доступа к AUR необходимо установить yaourt:
Для уменьшения головной боли в последствии не забудьте включить автосборку модуля ядра:
2. Оболочка XBMC находится в репозитории Community, но я рекомендую собрать ее SVN-версию из AUR — она имеет гораздо больше возможностей, в частности, доступ к YouTube, TED Talks и Discovery, а также неплохой выбор пользовательский расширений (например, для записи дисков).
Сборка длится достаточно долго — за это время вполне можно выпить не одну чашку чаю :)
3. Также необходимо установить все аудио/видеокодеки, с которыми придется иметь дело:
Подробности — см. в арчевики.
4. Для управления с оснащенного Bluetooth телефона необходимо поставить программу AnyRemote, которая есть в AUR:
Не забудьте также скачать и установить J2ME-клиент на мобильный телефон.
Ну что ж, весь необходимый софт в системе установлен. Займемся настройкой.
0. Создадим пользователя с именем, например, xbmc:
1. Добавим в /etc/rc.conf в секцию DAEMONS необходимый нам демон Bluetooth:
2. Надо создать файл ~/.anyremote.cfg, который осуществлял бы контроль XBMC. Содержимое этого файла примерно такое:
3. Отредактируем стартовый скрипт иксов (~/.xinitrc) так, чтобы сначала запускался AnyRemote, а затем XBMC:
4. Теперь надо настроить автовход пользователя xbmc в систему, чтобы не приходилось всякий раз подключать клавиатуру при загрузке медиацентра.
Для осуществления задуманного нам понадобится поставить mingetty, в которой есть функция автовхода. Она доступна в AUR:
После чего нам надо отредактировать /etc/inittab:
изменить:
на:
Также следует автоматически запускать иксы при логине. Для этого надо отредактировать файл ~/.bash_profile следующим образом:
Если этого файла еще нет, можно скопировать шаблон их /etc/skel/.bash_profile. После внесенных изменений сразу после логина пользователя будут запущены иксы, которые, в свою очередь, запустят AnyRemote и XBMC.
5. Перезагружаемся, проверяем, всё ли в порядке. Отключаем клавиатуру и мышь, осваиваемся с управлением при помощи AnyRemote. Наслаждаемся полученным результатом!
О недостатках предлагаемого решения:
1. За рамками этой статьи остается вопрос об организации хранилища медиаданных. Если остановиться на варианте встроенного винчестера, неясным становится вопрос о заливке новой музыки/видео. Я предлагаю сам медиацентр строить на основе небольшого SSD (8/16 Гб хватит за глаза) или вообще флешки (тут придется позаботиться об отключении swap-раздела для продления времени жизни носителя), а для хранения фильмов/музыки использовать переносной USB-диск — это позволит вам как с легкостью как заливать новые файлы с основного рабочего компьютера, так и делиться ими с друзьями. Учтите, что если фильмы/музыка будут храниться на NTFS-разделе, вам придется поставить пакет ntfs-3g и настроить соответствующим образом fstab.
Если вы решите остановиться всё-таки на встроенном винчестере, одним из вариантов организации обновления медиасодержимого может стать создание беспроводной домашней сети. Мне это видится в виде такой схемы:
— Медиацентр подключается напрямую к интернету, в него ставится WiFi-адаптер, настраивается NFS, iptables и раздача интернета.
— Все прочие ПК/ноутбуки/КПК/телефоны/айпады выходят в интернет через этот импровизированный роутер, который можно настраивать через SSH.
Данный вариант является довольно трудоемким и подразумевает достаточно высокий уровень подготовки пользователя. Пока что все эти настройки выходят за рамки этой статьи ввиду отсутствия требуемой аппаратуры.
2. Подразумевается, что медиацентр является универсальной заменой телевизору, поэтому я и предлагаю настроить автовход пользователя в систему и отключить клавиатуру/мышь для уменьшения количества проводов и управлять системой при помощи мобильного телефона. Но оптимальным, ИМХО, всё-таки был бы вариант управления при помощи ИК-пульта. Настройка пульта описана в этой статье.
3. При желании обновить систему придется подключать клавиатуру, жать Ctrl+Alt+F1 и производить настройку из консоли. Ввиду отсутствия какого-либо DE/WM это может вызвать определенные трудности у начинающего пользователя, но, в то же время, и стать отличным стимулом для более детального изучения тонкостей линукса вообще и Арча в частности :)
В завершение скажу пару слов об аппаратной части. Лично моя мечта — небольшая barebone-система на подобии MacMini, но хорошим выходом станет покупка неттопа с возможностью крепления его за монитором, например, Acer Aspire REVO. Как вариант — собрать медиацентр в любом Medium Tower и спрятать в близлежащий шкаф. При таком подходе, в случае управления с ИК-пульта, не забудьте купить удлинитель для вынесения приемника поближе к монитору. Если вы пользуетесь Bluetooth, никаких лишних телодвижений делать не придется.
В этой статье я вкратце описал свой dream setup. Хотелось бы увидеть в комментариях ваши мысли по поводу возможных программно-аппаратных вариантов обустройства линукс-медиацентров и прочие лайфхаки.
Благодарю за внимание. Если есть советы по улучшению статьи — напишите мне, я с удовольствием исправлю и дополню это мини-руководство.
В этой статье я остановлюсь на програмной части. Базой для создаваемой системы я решил выбрать ArchLinux из-за его минималистичности. По сути, для медиацентра не нужны крутые DE — достаточно чистых иксов для запуска оболочки да пары скриптов для управления с пульта.
Итак, программная часть в себя включает:
— ArchLinux 2010.05 с Xorg 1.8 и ядром 2.6.35;
— Облочку медиацентра XBMC;
— AnyRemote для управления медиацентром при помощи мобильного телефона с Bluetooth.
Ну что, поехали?
0. Устанавливаем на будущий медиацентр чистый Арч (детали см. в арчевики). Настраиваем звук, интернет, обновляем систему до актуального состояния:
# pacman -Syu
1. Устанавливаем необходимые пакеты: Xorg, видеодрайвер, стек Bluetooth и компилятор (зачем — обьясню ниже).
# pacman -S xorg-server [xg86-video-ati/xg86-video-radeon/nv/mesa/etc...] bluez gcc
Если вы желаете пользоваться проприетарными драйверами ATI, то они доступны в пользовательском репозитории AUR. Для доступа к AUR необходимо установить yaourt:
# pacman -S yaourt
# yaourt -S catalyst
# yaourt -S catalyst
Для уменьшения головной боли в последствии не забудьте включить автосборку модуля ядра:
# catalyst_build_module auto
2. Оболочка XBMC находится в репозитории Community, но я рекомендую собрать ее SVN-версию из AUR — она имеет гораздо больше возможностей, в частности, доступ к YouTube, TED Talks и Discovery, а также неплохой выбор пользовательский расширений (например, для записи дисков).
# yaourt -S xbmc-svn
Сборка длится достаточно долго — за это время вполне можно выпить не одну чашку чаю :)
3. Также необходимо установить все аудио/видеокодеки, с которыми придется иметь дело:
# pacman -S gstreamer0.10-{base,good,bad,ugly}-plugins gstreamer0.10-ffmpeg
Подробности — см. в арчевики.
4. Для управления с оснащенного Bluetooth телефона необходимо поставить программу AnyRemote, которая есть в AUR:
# yaourt -S anyremote
Не забудьте также скачать и установить J2ME-клиент на мобильный телефон.
Ну что ж, весь необходимый софт в системе установлен. Займемся настройкой.
0. Создадим пользователя с именем, например, xbmc:
# useradd -m -g users -G audio,lp,optical,storage,video,wheel,games,power -s /bin/bash xbmc
# passwd xbmc
# passwd xbmc
1. Добавим в /etc/rc.conf в секцию DAEMONS необходимый нам демон Bluetooth:
DAEMONS=(... @blueooth)
2. Надо создать файл ~/.anyremote.cfg, который осуществлял бы контроль XBMC. Содержимое этого файла примерно такое:
% STATUS unknown
% XTEST yes
% SOUND no
% ENV no
GuiAppName=XBox_Media_Center
GuiAppBinary=xbmc
GuiAppRun=echo 'A=`ps -ef|grep xbmc|grep -v grep`; if [ "x$A" == "x" ]; then echo NOK; else echo OK; fi' | bash -f -s
GuiAppIcon=xbmc.png
GuiAppType=Application
GuiAppProtocols=Server
[Protocol]=Server
% redefine joystick keys
UP =Macro(XBMC_UP)
DOWN =Macro(XBMC_DOWN)
LEFT =Macro(XBMC_LEFT)
RIGHT =Macro(XBMC_RIGHT)
FIRE =Macro(XBMC_OK)
% redefine side-buttons
% 4118=Macro(VOLUM_UP)
% 4119=Macro(VOLUM_DOWN)
% VOLUM_UP=Emulate(key,+)
% VOLUM_DOWN=Emulate(key,-)
% 4144=Macro(CALL)
% CALL=Emulate(key,Escape)
% 4101=Macro(OK)
% OK=Emulate(key,o)
XBMC_RUN=Exec(echo 'P=`ps -ef|grep "/usr/share/xbmc/xbmc.bin"|grep -v grep|grep -v edit|grep -v anyremote`; if [ "x$P" == "x" ]; then xbmc& fi' |bash -f -s);
XBMC_RUN_STOP=Exec(echo 'P=`ps -ef|grep "/usr/share/xbmc/xbmc.bin"|grep -v grep|grep -v edit|grep -v anyremote`; if [ "x$P" == "x" ]; then xbmc& else killall xbmc; fi' |bash -f -s);
XBMC_UP =Emulate(key,Up);
XBMC_DOWN =Emulate(key,Down);
XBMC_LEFT =Emulate(key,Left);
XBMC_RIGHT =Emulate(key,Right);
XBMC_OK =Emulate(key,Return)
XBMC_NOWPLAYING =Emulate(key,space)
XBMC_INFO =Emulate(key,i)
XBMC_VISUALIZAT =Emulate(key,Tab)
XBMC_ZOOM =Emulate(key,z)
XBMC_FULLSCREEN =Emulate(key,backslash)
XBMC_PLAY_PAUSE =Emulate(key,P)
XBMC_STOP =Emulate(key,X)
XBMC_ACTIONS =Emulate(key,m)
XBMC_OPTIONS =Emulate(key,c)
XBMC_PREVIOUS =Emulate(key,comma)
XBMC_NEXT =Emulate(key,period)
XBMC_SUBTITLE =Emulate(key,t)
XBMC_RESTART =Emulate(key,r)
XBMC_MAINMENU =Emulate(key,Escape)
XBMC_CANCEL =Emulate(key,BackSpace)
XBMC_EXIT_MENU =Emulate(key,s)
XBMC_MUTE =Exec(amixer -c $(MixerCard) sset $(MixerChannel),0 toggle -q)
XBMC_VOL_UP =Exec(amixer -c $(MixerCard) sset $(MixerChannel),0 5%+ -q)
XBMC_VOL_DOWN =Exec(amixer -c $(MixerCard) sset $(MixerChannel),0 5%- -q)
% XBMC_VOL_UP =Emulate(key,plus,key,plus,key,plus)
% XBMC_VOL_DOWN =Emulate(key,minus,key,minus,key,minus)
(Init)=Include($(CfgDir)/Utils/aliases-server.cfg);
(Connect)=Set(icons,XBMC,1,refresh,2,file,3,fit,4,play,5,fullscreen,6,stop,7,vol_down,8,minus,9,vol_up,*,file,0,folder,#,no);\
Set(skin,default,keypad_only);\
Macro(ALLIN1MENU);\
Macro(XBMC_RUN);
Cancel=Exit
Back=Set(text,close);Macro(ALLIN1MENU)
1=Macro(XBMC_NOWPLAYING)
2=Macro(XBMC_INFO);
3=Macro(XBMC_VISUALIZAT);
4=Macro(XBMC_PLAY_PAUSE);
5=Macro(XBMC_OK);
6=Macro(XBMC_STOP);
7=Macro(XBMC_VOL_DOWN)
8=Macro(XBMC_CANCEL);
9=Macro(XBMC_VOL_UP)
* *=Set(text,replace,Help, *0 Options\n *2 Page up\n *8 Page down\n ** Help\n 0 Main menu\n #0 Exit from menu\n ## Run/Quit);
* 0=Macro(XBMC_OPTIONS);
* 2=Emulate(key,Page_Up)
* 8=Emulate(key,Page_Down)
0=Macro(XBMC_MAINMENU);
# 0=Macro(XBMC_EXIT_MENU);
* #=Macro(XBMC_RUN_STOP)
# #=Macro(XBMC_RUN_STOP)
[End]
% XTEST yes
% SOUND no
% ENV no
GuiAppName=XBox_Media_Center
GuiAppBinary=xbmc
GuiAppRun=echo 'A=`ps -ef|grep xbmc|grep -v grep`; if [ "x$A" == "x" ]; then echo NOK; else echo OK; fi' | bash -f -s
GuiAppIcon=xbmc.png
GuiAppType=Application
GuiAppProtocols=Server
[Protocol]=Server
% redefine joystick keys
UP =Macro(XBMC_UP)
DOWN =Macro(XBMC_DOWN)
LEFT =Macro(XBMC_LEFT)
RIGHT =Macro(XBMC_RIGHT)
FIRE =Macro(XBMC_OK)
% redefine side-buttons
% 4118=Macro(VOLUM_UP)
% 4119=Macro(VOLUM_DOWN)
% VOLUM_UP=Emulate(key,+)
% VOLUM_DOWN=Emulate(key,-)
% 4144=Macro(CALL)
% CALL=Emulate(key,Escape)
% 4101=Macro(OK)
% OK=Emulate(key,o)
XBMC_RUN=Exec(echo 'P=`ps -ef|grep "/usr/share/xbmc/xbmc.bin"|grep -v grep|grep -v edit|grep -v anyremote`; if [ "x$P" == "x" ]; then xbmc& fi' |bash -f -s);
XBMC_RUN_STOP=Exec(echo 'P=`ps -ef|grep "/usr/share/xbmc/xbmc.bin"|grep -v grep|grep -v edit|grep -v anyremote`; if [ "x$P" == "x" ]; then xbmc& else killall xbmc; fi' |bash -f -s);
XBMC_UP =Emulate(key,Up);
XBMC_DOWN =Emulate(key,Down);
XBMC_LEFT =Emulate(key,Left);
XBMC_RIGHT =Emulate(key,Right);
XBMC_OK =Emulate(key,Return)
XBMC_NOWPLAYING =Emulate(key,space)
XBMC_INFO =Emulate(key,i)
XBMC_VISUALIZAT =Emulate(key,Tab)
XBMC_ZOOM =Emulate(key,z)
XBMC_FULLSCREEN =Emulate(key,backslash)
XBMC_PLAY_PAUSE =Emulate(key,P)
XBMC_STOP =Emulate(key,X)
XBMC_ACTIONS =Emulate(key,m)
XBMC_OPTIONS =Emulate(key,c)
XBMC_PREVIOUS =Emulate(key,comma)
XBMC_NEXT =Emulate(key,period)
XBMC_SUBTITLE =Emulate(key,t)
XBMC_RESTART =Emulate(key,r)
XBMC_MAINMENU =Emulate(key,Escape)
XBMC_CANCEL =Emulate(key,BackSpace)
XBMC_EXIT_MENU =Emulate(key,s)
XBMC_MUTE =Exec(amixer -c $(MixerCard) sset $(MixerChannel),0 toggle -q)
XBMC_VOL_UP =Exec(amixer -c $(MixerCard) sset $(MixerChannel),0 5%+ -q)
XBMC_VOL_DOWN =Exec(amixer -c $(MixerCard) sset $(MixerChannel),0 5%- -q)
% XBMC_VOL_UP =Emulate(key,plus,key,plus,key,plus)
% XBMC_VOL_DOWN =Emulate(key,minus,key,minus,key,minus)
(Init)=Include($(CfgDir)/Utils/aliases-server.cfg);
(Connect)=Set(icons,XBMC,1,refresh,2,file,3,fit,4,play,5,fullscreen,6,stop,7,vol_down,8,minus,9,vol_up,*,file,0,folder,#,no);\
Set(skin,default,keypad_only);\
Macro(ALLIN1MENU);\
Macro(XBMC_RUN);
Cancel=Exit
Back=Set(text,close);Macro(ALLIN1MENU)
1=Macro(XBMC_NOWPLAYING)
2=Macro(XBMC_INFO);
3=Macro(XBMC_VISUALIZAT);
4=Macro(XBMC_PLAY_PAUSE);
5=Macro(XBMC_OK);
6=Macro(XBMC_STOP);
7=Macro(XBMC_VOL_DOWN)
8=Macro(XBMC_CANCEL);
9=Macro(XBMC_VOL_UP)
* *=Set(text,replace,Help, *0 Options\n *2 Page up\n *8 Page down\n ** Help\n 0 Main menu\n #0 Exit from menu\n ## Run/Quit);
* 0=Macro(XBMC_OPTIONS);
* 2=Emulate(key,Page_Up)
* 8=Emulate(key,Page_Down)
0=Macro(XBMC_MAINMENU);
# 0=Macro(XBMC_EXIT_MENU);
* #=Macro(XBMC_RUN_STOP)
# #=Macro(XBMC_RUN_STOP)
[End]
3. Отредактируем стартовый скрипт иксов (~/.xinitrc) так, чтобы сначала запускался AnyRemote, а затем XBMC:
#!/bin/bash
exec anyremote -log -s bluetooth:19 &
exec xbmc
exec anyremote -log -s bluetooth:19 &
exec xbmc
4. Теперь надо настроить автовход пользователя xbmc в систему, чтобы не приходилось всякий раз подключать клавиатуру при загрузке медиацентра.
Для осуществления задуманного нам понадобится поставить mingetty, в которой есть функция автовхода. Она доступна в AUR:
# yaourt -S mingetty
После чего нам надо отредактировать /etc/inittab:
изменить:
c1:2345:respawn:/sbin/agetty -8 38400 tty1 linux
на:
c1:2345:respawn:/sbin/mingetty --autologin xbmc tty1 linux
Также следует автоматически запускать иксы при логине. Для этого надо отредактировать файл ~/.bash_profile следующим образом:
if [[ -z "$DISPLAY" ]] && [[ $(tty) = /dev/tty1 ]]; then
xinit
logout
fi
xinit
logout
fi
Если этого файла еще нет, можно скопировать шаблон их /etc/skel/.bash_profile. После внесенных изменений сразу после логина пользователя будут запущены иксы, которые, в свою очередь, запустят AnyRemote и XBMC.
5. Перезагружаемся, проверяем, всё ли в порядке. Отключаем клавиатуру и мышь, осваиваемся с управлением при помощи AnyRemote. Наслаждаемся полученным результатом!
О недостатках предлагаемого решения:
1. За рамками этой статьи остается вопрос об организации хранилища медиаданных. Если остановиться на варианте встроенного винчестера, неясным становится вопрос о заливке новой музыки/видео. Я предлагаю сам медиацентр строить на основе небольшого SSD (8/16 Гб хватит за глаза) или вообще флешки (тут придется позаботиться об отключении swap-раздела для продления времени жизни носителя), а для хранения фильмов/музыки использовать переносной USB-диск — это позволит вам как с легкостью как заливать новые файлы с основного рабочего компьютера, так и делиться ими с друзьями. Учтите, что если фильмы/музыка будут храниться на NTFS-разделе, вам придется поставить пакет ntfs-3g и настроить соответствующим образом fstab.
Если вы решите остановиться всё-таки на встроенном винчестере, одним из вариантов организации обновления медиасодержимого может стать создание беспроводной домашней сети. Мне это видится в виде такой схемы:
— Медиацентр подключается напрямую к интернету, в него ставится WiFi-адаптер, настраивается NFS, iptables и раздача интернета.
— Все прочие ПК/ноутбуки/КПК/телефоны/айпады выходят в интернет через этот импровизированный роутер, который можно настраивать через SSH.
Данный вариант является довольно трудоемким и подразумевает достаточно высокий уровень подготовки пользователя. Пока что все эти настройки выходят за рамки этой статьи ввиду отсутствия требуемой аппаратуры.
2. Подразумевается, что медиацентр является универсальной заменой телевизору, поэтому я и предлагаю настроить автовход пользователя в систему и отключить клавиатуру/мышь для уменьшения количества проводов и управлять системой при помощи мобильного телефона. Но оптимальным, ИМХО, всё-таки был бы вариант управления при помощи ИК-пульта. Настройка пульта описана в этой статье.
3. При желании обновить систему придется подключать клавиатуру, жать Ctrl+Alt+F1 и производить настройку из консоли. Ввиду отсутствия какого-либо DE/WM это может вызвать определенные трудности у начинающего пользователя, но, в то же время, и стать отличным стимулом для более детального изучения тонкостей линукса вообще и Арча в частности :)
В завершение скажу пару слов об аппаратной части. Лично моя мечта — небольшая barebone-система на подобии MacMini, но хорошим выходом станет покупка неттопа с возможностью крепления его за монитором, например, Acer Aspire REVO. Как вариант — собрать медиацентр в любом Medium Tower и спрятать в близлежащий шкаф. При таком подходе, в случае управления с ИК-пульта, не забудьте купить удлинитель для вынесения приемника поближе к монитору. Если вы пользуетесь Bluetooth, никаких лишних телодвижений делать не придется.
В этой статье я вкратце описал свой dream setup. Хотелось бы увидеть в комментариях ваши мысли по поводу возможных программно-аппаратных вариантов обустройства линукс-медиацентров и прочие лайфхаки.
Благодарю за внимание. Если есть советы по улучшению статьи — напишите мне, я с удовольствием исправлю и дополню это мини-руководство.