воскресенье, 22 апреля 2018 г.

VirtualBox в Debian Stretch

Когда-то я тестировал несколько эмуляторов, о чём написал заметку Эмуляторы VirtualBox и QEmu в Debian. Недавно мне снова понадобилось воспользоваться эмулятором и я решил воспользоваться старыми наработками. Однако, ситуация с тех пор несколько изменилась. Во-первых, VirtualBox теперь отсутствует в стандартных репозиториях Debian, а во-вторых, графическая оболочка qemulator для qemu теперь обросла функциями и сменила название на virtualbricks.

VirtualBricks

Попробуем установить virtualbricks:
# apt-get install virtualbricks
Сразу после запуска программа выводит сообщение об отсутствующих компонентах:

Если проигнорировать это сообщение, создать виртуальную машину и попытаться перейти к её настройке, выводится сообщение о том, что virtualbricks не смог распознать версию qemu:

Если попытаться установить недостающие компоненты, сообщений об отсутствующих компонентах станет меньше.
# apt-get install vde2-cryptcab qemu ksmtuned

Однако делу это совершенно не помогает: если после создания виртуальной машины попытаться перейти к её настройке, то программа по-прежнему продолжает выводить сообщение о нераспознанной версии qemu. Как видно, попытка нарастить функциональности при помощи груды кода на Python, не пошла проекту на пользу. На этом я решил закончить эксперименты с virtualbricks, удалил всё установленное и решил снова попытать судьбу с VirtualBox.

Установка VirtualBox

На официальном сайте проекта в разделе скачивания Download VirtualBox for Linux Hosts имеется рекомендация устанавливать VirtualBox в Debian Jessie из репозитория https://download.virtualbox.org/virtualbox/debian. Пропишем его в файл /etc/apt/sources.list:
deb http://download.virtualbox.org/virtualbox/debian stretch contrib
Обратите внимание, что на официальном сайте указана ссылка, использующая протокол https. Эта ссылка не работает. Чтобы репозиторий подключился без ошибок, нужно поменять в ссылке протокол https на http, как это и было сделано в строчке выше.

Сразу же скачаем и установим в систему PGP-ключи репозитория:
# wget -q https://www.virtualbox.org/download/oracle_vbox_2016.asc -O- | sudo apt-key add -
# wget -q https://www.virtualbox.org/download/oracle_vbox.asc -O- | sudo apt-key add -
Обновим списки пакетов, доступных через репозитории:
# apt-get update
И установим пакет с VirtualBox:
# apt-get install virtualbox-5.2
При попытке запуска созданной виртуальной машины может появиться сообщение об ошибке следующего вида:

Для работы VirtualBox использует собственный модуль ядра vboxdrv. Если этот модуль не загружен, то и VirtualBox не будет работать. Для устранения ошибки нужно подгрузить модуль ядра:
# modprobe vboxdrv
Чтобы этот модуль автоматически загружался при загрузке системы, его можно вписать в файл /etc/modules:
vboxdrv
Если в системе отсутствует модуль ядра vboxdrv для текущей версии ядра, то modprobe будет ругаться следующим образом:
# modprobe vboxdrv
modprobe: FATAL: Module vboxdrv not found in directory /lib/modules/4.9.0-6-amd64
В частности, такая ошибка может появиться, если вы обновляли систему и было установлено ядро новой версии. В таком случае нужно собрать модуль ядра снова. Для этого надо выполнить команду vboxconfig:
# vboxconfig
Если в системе не установлены заголовочные файлы ядра, то команда сообщит об ошибке сборки модуля ядра вот таким образом:
vboxdrv.sh: Building VirtualBox kernel modules.
This system is currently not set up to build kernel modules.
Please install the Linux kernel "header" files matching the current kernel
for adding new hardware support to the system.
The distribution packages containing the headers are probably:
    linux-headers-amd64 linux-headers-4.9.0-6-amd64
Чтобы решить эту проблему, нужно установить пакет с заголовочными файлами ядра:
# apt-get install linux-headers-amd64
Таким образом, нужно сначала установить заголовочные файлы ядра, потом собрать модуль ядра vboxdrv при помощи команды vboxconfig, затем подгрузить модуль ядра и прописать его автозагрузку в файл /etc/modules:
# apt-get install linux-headers-amd64
# vboxconfig
# modprobe vboxdrv
# vim /etc/modules
Последняя команда в списке запускает текстовый редактор для редактирования файла /etc/modules, куда нужно вписать одну строчку:
vboxdrv

Настройка виртуальной машины

После установки запустим VirtualBox при помощи команды virtualbox, создадим и настроим виртуальную машину:

Виртуальная машина в целом создана, теперь просмотрим и отредактируем остальные её свойства:

Для установки Windows в виртуальную машину уберём из виртуальной машины дисковод для дискет и вставим в CD-ROM виртуальной машины образ установочного диска:

Настройка общей папки, через которую впоследствии можно будет обмениваться файлами между компьютером и виртуальной машиной:

Установка Windows и Oracle VM VirtualBox Guest Additions

Запустим созданную виртуальную машину:

На этом экране можно видеть сводку свойств виртуальной машины:

После установки Windows в виртуальную машину (не показано), стоит поставить в неё Oracle VM VirtualBox Guest Additions - дополнительные драйверы и программы, делающие работу с виртуальной машиной более комфортной:



После установки Oracle VM VirtualBox Guest Additions заработал общий каталог с хост-системой, ради чего, преимущественно, эти дополнения и ставились:

воскресенье, 15 апреля 2018 г.

Локальный просмотр роликов с Youtube: утилиты cclive, mpv, rename

Иногда я скачиваю файлы с Youtube, чтобы смотреть их на телевизоре. Иногда это бывают сериалы. В таких случаях мне пригождается несколько утилит: cclive, mpv и rename. Рассмотрим их использование на примере мультсериала Гравити Фоллз.

cclive

cclive - это утилита командной строки, при помощи которой можно скачать ролик с Youtube. Утилита есть в репозиториях Debian, поэтому установить её очень легко. Для этого нужно установить одноимённый пакет:
# apt-get install cclive
Использование очень простое - надо вызвать эту программу, указав ей в качестве аргумента ссылку на страницу Youtube с роликом. Стоит заключить ссылку в одиночные кавычки, чтобы знаки амперсанда и вопроса не интерпретировались оболочкой:
$ cclive 'https://www.youtube.com/watch?v=uKjjDctxD6w&list=PLVtYY3Ujl33NFDWuw_E-OJcngyWayn7pA'
После скачивания в текущем каталоге появится файл с именем "Гравити Фолз Зомбикараоке Серия 1 Сезон 2.webm".

mpv

Мой медиаплеер WD TV Play, про который я ранее уже писал в заметке Настройка MiniDLNA для цифрового мультимедийного плеера WD TV Play и при помощи которого я смотрю видео на телевизоре, имеет ограниченную поддержку видеоформатов и кодеков. В частности, он не умеет воспроизводить видео в контейнере WebM, не поддерживает кодеки VP8 и Vorbis. Чтобы просматривать такие ролики на этом плеере, их нужно перекодировать. Пожалуй самым широко распространённым сочетанием контейнеров и кодеков, которое поддерживается большинством видеоплееров, являются контейнер AVI и кодеки MPEG4 и MP3.

Ранее в целях перекодирования видео я пользовался утилитой mencoder, которая разрабатывалась вместе с видеоплеером mplayer. Одно из достоинств этой утилиты заключалось в том, что она поддерживала двухпроходное кодирование, что позволяло достичь наилучшего качества при необходимости уместить результат в файл определённого размера. Это было очень полезно для перекодирования DVD-дисков в 700-мегабайтные AVI-файлы, которые умещались на компакт-диск. В репозиториях Debian Jessie пакет mencoder отсутствовал, поэтому тогда я подыскал замену для mencoder'а - утилиту mpv, которая совмещает в себе как функции видеоплеера, так и функции перекодировщика.

Установим mpv при помощи команды:
# apt-get install mpv
Теперь внесём ряд правок в файл /etc/mpv/encoding-profiles.conf с настройками профилей перекодирования.

Во-первых, я задал битрейт 128 килобит/с, частоту дискретизации 22 килогерца - для фильмов этого, как правило, бывает достаточно и 16-битные целочисленные отсчёты со знаком:
[enc-a-mp3]
profile-desc = "MP3 (LAME)"
oac = libmp3lame
oacopts = b=128k
audio-samplerate = 22050
audio-format = s16
Во-вторых, задал изменение соотношения сторон видео. Для телевизоров с электронно-лучевой трубкой не имеет особого смысла делать ширину видео более 720 пикселей, т.к. физическое разрешение электронно-лучевой трубки такого телевизора составляет 768x576 пикселей. На деле размер видимой области может оказаться и того меньше - 640x480 пикселей. В настройках укажем, что ширина видео должна равняться 720 пикселям, а высота должна рассчитываться исходя из отображаемого на экране соотношения сторон. Бывает что видео имеет не квадратный пиксель и при отображении дополнительно растягивается, чтобы убрать искажения. Опция предписывает использовать именно отображаемое соотношение сторон, чтобы при воспроизведении видео не нужно было масштабировать с разными коэффициентами по разным осям.
[enc-v-mpeg4]
profile-desc = "MPEG-4 Part 2 (FFmpeg)"
ovc = mpeg4
ovcopts = qscale=4
vf = scale=720:-2
В-третьих, оба профиля объединяются в один общий:
[enc-f-avi]
profile-desc = "MPEG-4 + MP3 (for AVI)"
of = avi
ocopyts = no
oautofps = yes
profile = enc-v-mpeg4
profile = enc-a-mp3
ofopts-clr = yes
Перекодировать видео с использованием этого профиля можно при помощи такой команды:
$ mpv --profile=enc-f-avi "Гравити Фолз Зомбикараоке Серия 1 Сезон 2.webm" -o "Гравити Фолз Зомбикараоке Серия 1 Сезон 2.avi"
Для последовательного перекодирования всех файлов с расширением webm в текущем каталоге можно воспользоваться таким однострочным скриптом:
$ ls *.webm | while read webm ; do avi=`echo "$webm" | sed 's/\.webm$/\.avi/g'` ; mpv --profile=enc-f-avi "$webm" -o "$avi" ; done

rename

rename - это утилита командной строки, позволяющая переименовывать файлы в соответствии с регулярными выражениями в стиле Perl. К слову, сама утилита представляет собой крохотный скрипт на Perl, использующий пару модулей. Утилита написана самим "великим и ужасным" Ларри Уоллом, если вам это о чём-то говорит. Утилита, несмотря на кажущуюся простоту, очень мощная и удобная. Во всяком случае, для тех, кто знает регулярные выражения Perl. Тот самый случай, когда подход Unix одерживает верх надо всеми приложениями с графическим интерфейсом.

Установка, как и в предыдущих случаях, очень проста:
# apt-get install rename
Для отладки регулярного выражения для переименования файлов можно воспользоваться опцией n:
$ rename -n 's/^Гравити Фолз (.*) Серия (\d+) Сезон (\d+).avi$/Гравити Фолз, E$3S$2 - $1.avi/' *.avi
После того, как результат будет соответствовать ожиданиям, можно выполнить ту же команду уже без опции n:
$ rename -n 's/^Гравити Фолз (.*) Серия (\d+) Сезон (\d+).avi$/Гравити Фолз, E$3S$2 - $1.avi/' *.avi
Вот ещё пример регулярного выражения - к номерам серий, состоящим из одной цифры, слева добавляется ноль:
$ rename 's/^Гравити Фолз, E(\d+)S(\d{1}) - (.*)\.avi$/Гравити Фолз, E$1S0$2 - $3\.avi/' *.avi
Остаётся положить файлы в каталог, к которому имеет доступ minidlna, чтобы через медиаплеер файлы можно было просматривать на телевизоре.

P.S. Медиаплеер WD TV Play позволяет просматривать ролики с Youtube прямо из интернета, но мне такой способ просмотра не кажется удобным, поэтому я им не пользуюсь.