Показаны сообщения с ярлыком CommandLine. Показать все сообщения
Показаны сообщения с ярлыком CommandLine. Показать все сообщения

вторник, 1 декабря 2015 г.

Проблемы с DNS внутри systemd-nspawn

Не так давно писал про легковесные контейнеры для разработчика и вот, спустя какое-то время, взялся за настройку ещё одного контейнера... И неожиданно убил кучу времени на проблему с пробросом DNS серверов внутрь этого контейнера. Самое неприятное, что помнишь, что в прошлый раз эту проблему уже решал, но уже забыл как. Ответ на самом деле не прост, а очень прост. Нужно запустить сервис systemd-resolved внутри контейнера, а он получит всю нужную инфу сам. Ну и не забыть подменить стандартный /etc/resolcv.conf на симлинк от systemd

systemctl enable systemd-resolved
systemctl start systemd-resolved
ln -fs /run/systemd/resolve/resolv.conf /etc/resolv.conf

На всякий случай повторюсь, что это делается внутри контейнера. Доп конфигурация хоста не требуется.

четверг, 21 мая 2015 г.

systemd-nspawn для разработчика

На данный момент я работаю в проекте который в качестве целевой платформы установки использует Debian 7 при этом хочется переехать на Debain 8, а сам я сижу на Arch Linux. В результате часто требуется быстренько оказаться в правильном окружении и пособирать свои последние правки. Чаще всего для этого я использовал VirtualBox как наиболее просто конфигурируемое решение, но всегда хотелось побаловаться с лёгкими контейнерами. Правда, всегда отпугивала скорость разворачивания таких решений. Я экспериментировал с LXC и systemd-nspawn, но в первом случае разворачивание виртуалки занимает больше времени чем хочется, а во втором случае всё гладко только если гостевая система использует systemd.

Но вот, свершилось, Debain 8 использует systemd по умолчанию и его можно быстренько разворачивать. Правда, кто-то успел немного подгадить с другой стороны. Теперь в арче сервис systemd-nspawn@ по умолчанию предлагает иметь противоестественные сношения с настройкой идеологически правильного разделения сети между контейнерами добавив ключ --network-veth. Раньше этот сервис позволял запустить контейнер так, что он просто видел хостовый интерфейс и им пользовался, что совершенно не подходит для облачных решений (для которых есть отличные и мощные проекты, такие как OpenVZ и LXC), но очень удобно для нужд разработчиков (а именно для этих целей и позиционировалась разработка systemd-nspawn). Дабы раз и навсегда искоренить этот печальный недостаток, копируем этот сервис из /usr/lib/systemd/system в /etc/systemd/system и уничтожаем использование ненужной "идеологической правильности".

Итак создаём гостевуху:

yaourt -S debootstrap # Если ещё не установлен
sudo debootstrap jessie /var/lib/container/debian8 http://mirror.yandex.ru/debian
sudo systemd-nspawn -D /var/lib/container/debian8
Мы оказались в сверх-минималистичном дебиане с целью задать пароль пользователю root и установить пакет dbus (без него утилита machinectl не сможет подключиться к запущенному контейнеру). Выполнив эти две нехитрые операции нажимаем Ctrl+D чтобы вернуться в основное окружение и честно загрузив контейнер входим в него через парадное крыльцо для дальнейшей настройки:
sudo systemctl start systemd-nspawn@debian8
sudo machinectl login debian8

Вот готово почти всё. Точнее для одноразового использования готово вообще всё. А вот если контейнер планируется использовать для тестов регулярно, то имеет смысл поставить туда ssh и научить systemd автоматически запускать виртуалку при попытке в неё зайти по этому самому ssh. Для этого пишем файл на хосте
/etc/systemd/system/systemd-nspawn@debian8.socket:

[Unit]
Description=The SSH socket of debian8-nspawn container

[Socket]
ListenStream=4022

[Install]
WantedBy=sockets.target
А в гостевой ситеме надо отключить безусловный автозапуск SSH и настроить его активацию через сокет добавив два файла:
/etc/systemd/system/sshd.socket:
[Unit]
Description=SSH Socket for Per-Connection Servers

[Socket]
ListenStream=4022
Accept=yes

[Install]
WantedBy=sockets.target
и /etc/systemd/system/sshd@.service:
[Unit]
Description=SSH Per-Connection Server for %I

[Service]
ExecStart=-/usr/sbin/sshd -i
StandardInput=socket

[Install]
WantedBy=multi-user.target
Alias=sshd.service
После чего в контейнере переключаем SSH на активацию через сокет:
sudo systemctl disable sshd.service
sudo systemctl enable sshd.socket
И на хосте активируем сокет запуска машины:
sudo systemctl enable systemd-nspawn@debian8.socket

Ну вот теперь можно настроить профиль в Konsole и быстренько заходить в виртуалку в два клика. Запуск контейнера до состояния принятия ssh соединения у меня занимает около 2х секунд, что несравнимо меньше времени ожидания старта VirtualBox виртуалки, а сборка кода с помощью ninja эффективно параллелиться по всем процессорам демонстрируя великолепную производительность.

понедельник, 26 сентября 2011 г.

Немного про sudo

В дефолтных настройках sudo запрашивает пароль того пользователя, который пытается его использовать. В тех случаях, когда нужно разрешить пользователю время от времени получать права суперпользователя, это хорошо. Но что если хочется запускать свои приложения из под другого пользователя чей пароль ты не знаешь. Так, например, приезжая в гости к родителям, хочется запустить свой скайп и копете, при это не перелогиниваясь и не прося сестру ввести её пароль в ответ на требование от kdesudo.

Среди опций файла sudoers имеется targetpw который меняет дефолтное поведение sudo. После чтения его описания впадаешь в уныние, так как сказано, что это глобальный флаг, но покопавшись в разделе examples в man 5 sudoers находим, что глобальные опции тоже можно включать избирательно.
 Defaults targetpw  
 Defaults>root !targetpw  

Позволяет требовать пароль пользователя под которым собираешься исполнить команду либо требовать пароль пользователя который пытается использовать sudo ежели целевой пользователь это root.

четверг, 25 августа 2011 г.

Bash 32bit unsigned dec to hex

Конвертируем десятичные числа в шестнадцатеричные в bash и видим, что числа больше 2 миллиардов становятся отрицательными. Тут нужно немного простой математической магии:
 VAL=3123456789  
 printf "%#x%x" $(( ${VAL} / 65536 )) $(( ${VAL} % 65536 ))   

воскресенье, 7 декабря 2008 г.

Полноценный ffmpeg в Ubuntu

В связи с тем, что в некоторых странах (Америка, Австралия) можно патентовать алгоритмы, поддержка некоторых форматов в ffmpeg в Ubuntu искуственно отключена. В частности пострадал формат mp3. Бинарный пакет из репозитория может декодировать mp3, но не может его создавать. Дабы обойти сие ограничение, необходимо пересобрать пакет вручную.

Итак, для начала потребуются кое какие доп пакеты:
 sudo aptitude install build-essential fakeroot  
Достаём исходный код ffmpeg:
 apt-get source ffmpeg  
Будет выкачан и распакован архив с исходным кодом, на него будут наложены специфичные для дистрибутива патчи, и будут добавлены скрипты сборки пакета. Далее необходимо перейти в директорию с исходными кодами ffmpeg-debian... название директории может зависеть от версии пакета.

Теперь необходимо разрешить сборку дополнительных кодеков. Для этого нужно добавить в переменную DEB_BUILD_OPTIONS ключ externalcodecs (это актуально для 8.10, меня терзают смутные сомнения, что раньше нужно было использовать ключ risky):
 export DEB_BUILD_OPTIONS+=externalcodecs  
После этого нужно установить библиотеки необходимые для сборки пакета:
 sudo aptitude build-dep ffmpeg  
Теперь можно собрать и установить deb-пакеты:
 dpkg-buildpackage -b  
 cd ../  
 sudo dpkg -i *.deb  
Теперь можно использовать 100% возможностей ffmpeg

Video watermark

Сняв что-нибудь интересное на видекамеру и потратив пару часиков на редактирование этого самого чего-то интересного, хочется выложить результат куда-нибудь в сеть. Разумеется при этом ещё хочется как-то отметиться, что автор именно я и никто другой. Можно добавить титры, но их с неплохой вероятностью могут вырезать за ненадобностью.

Но есть куда более ндёжный способ. Можно добавить в видео водяной знак. Он отчётливо виден, но не акцентирует на себе внимания, и его достаточно проблемно устранить. Настолько проблемно, что из любительского видео его точно вырезать никто не станет.

Итак, изначально у нас есть полностью отредактированное видео в файле final.dv, мы хотим получить видео с водяным знаком, которое можно раздовать друзьям for_share.dv. Я продпочитаю работать с сырым DV, но, на самом деле, формат не имеет значения, главное, чтобы его понимал ffmpeg. Собственно добавлять водяной знак будет именно он.

Для начала создадим шаблон водяного знака. Это должен быть рисунок с однородным цветом фона, лучше всего если это будет рисунок в оттенках серого. Сам шаблон водяного знака это всё то, что отличается от цвета фона. Я создаю шаблон следующим образом:
 convert -size 1024x576 xc:#000000 -font Bookman-DemiItalic -pointsize 50 -fill "#909090" -draw "text 810,560 'VestniK'" -gaussian 2,10 -shade 180x30 watermark.gif  

для видео в формате 16:9. Если требуется соотношение сторон 4:3, то нужно поменять размер.

Терерь можно подписать исходное видео:
 ffmpeg -i final.dv -vhook '/usr/lib/vhook/watermark.so -f watermark.gif -t 0x7F7F7F' -target dv for_share.dv  


Ещё одна мелочь по поводу видео. На видео хостингах как правило закаченное видео пережимается в flv со звуком в mp3. Если заливать видео в этом формате, то оно пережиматься не будет. Так можно получить больший контроль над качеством видео. Готовый рецепт по сохранению видео для публикации в интернете выглядит следующим образом:
 ffmpeg -i for_share.dv -f flv -vcodec flv -qscale 15 -maxrate 512k -bufsize 1M -s 480x270 -padtop 30 -padbottom 60 -acodec mp3 -ab 128k -ar 44100 for_internet.flv  

Помимо всего прочего здесь я подгоняю видео под соотношение сторон 4:3, так как у меня видокамера снимает видео с соотношением сторон 16:9. Если у вас видео имеет соотношение сторон 4:3, то команда для конвертации видео упростится:
 ffmpeg -i for_share.dv -f flv -vcodec flv -qscale 15 -maxrate 512k -bufsize 1M -s 480x360 -acodec mp3 -ab 128k -ar 44100 for_internet.flv  
.