Итак, в один прекрасный момент ты понял, что окружающий мир угнетает тебя обилием ярких красок и дружественностью предоставляемых интерфейсов. Тебе захотелось чего-то брутального, монохромного и нетривиального. Поздравляем — ты вступил на путь воена красноглазия!
На следующее после прозрения утро ты проснулся среди разбросанного по квартире хлама и пустых бутылок из-под «Буратино». Еще не совсем разлепив веки, пошел на кухню готовить традиционную яичницу, и тут тебя атаковал голос из головы: «Откажись от иксов». «Что за?..» — хотел было ты возразить, но дверной косяк сурово прервал ваш диалог. Голос подытожил: «Только консоль, только хардкор!»
Ну что ж, коли дело приняло столь серьезный оборот, ты решил действовать. Но с чего же начать? Спокойствие! Мы дадим тебе несколько советов.
Введение
Дабы сохранить на первых порах хоть какую-то связь с внешним миром, в консоли тебе понадобятся аналоги тех программ, к которым ты привык во времена своей беззаботной GUI-шной молодости.
Будем отталкиваться от следующего типичного для большинства людей списка действий:
- серфинг в браузере;
- взаимодействие с почтой;
- общение по джабберу/аське;
- прослушивание аутентичных аудиокомпозиций с бокалом «Шато Берно» 1789 года;
- просмотр классики кинематографа;
- просмотр картинок/PDF/DJVU.
Перед тем как перейти к описанию нужного для выполнения всех этих действий ПО, заострим свое внимание на подготовке видеоплацдарма. Другими словами, добавим в нашу систему поддержку фреймбуфера. Для осуществления задуманного нам необходимо будет установить и настроить uvesafb.
Uvesafb представляет собой framebuffer-драйвер для консоли, привнесенный в ядро начиная с версии 2.6.24. От стандартного vesafb его отличает поддержка большего количества функций и более высокая карма, чем в системах на базе видеокарт NVIDIA с установленным проприетарным видеодрайвером. При этом требования к поддержке оборудования остались такими же, как и для vesafb.
Особенность драйвера, о котором идет речь, в том, что для своей пристойной работы он требует демон виртуализации v86d, работающий в третьем кольце. Предназначение такого костыля — обеспечить совместимость с архитектурами, отличными от архитектуры x86. Понеслись!
Устанавливаем v86d (здесь и далее я буду действовать на примере Arch Linux):
# pacman -S v86d
WARNING
В процессе тестирования на подпольных машинах у нас вылезла ошибочка при загрузке uvesafb:
[15.063336] uvesafb: NVIDIA Corporation, G96 Board * 07880500, Chip Rev , OEM: NVIDIA, VBE v3.0
[15.198285] uvesafb: VBIOS/hardware doesn't support DDC transfers
[15.198288] uvesafb: no monitor limits have been set, default refresh rate will be used
[15.198770] uvesafb: scrolling: redraw
[15.198775] uvesafb: request region 0x3c0-0x3e0 failed
[15.199764] uvesafb: probe of uvesafb.0 failed with error -5
Исправили ее путем модификации /etc/default/grub строчки
GRUB_CMDLINE_LINUX="video=vesa:off vga=normal"
Не забываем после этого пересобирать конфиг командой
# grub-mkconfig -o /boot/grub/grub.cfg
Стремительно переходим к настройке uvesafb... Для начала удаляем любые параметры ядра, относящиеся к работе фреймбуфера:
- vga=xxx принудительно загружает старый vesafb;
- video=xxx не использует uvesafb, если последний скомпилирован в качестве модуля (как в стандартном ядре Arch Linux).
Затем отключаем KMS, дабы во время загрузки не пытаться постигнуть Дао Красноглазия, которое явится в виде абсолютно черного экрана (помни: твоя психика еще не настолько окрепла, чтобы выдержать подобные испытания). Если мы счастливые обладатели видеокарточек от Intel — добавляем в конфиг GRUB’а строчки i915.modeset=0.
Комментируем строку GRUBGFXPAYLOADLINUX=keep в конфиге /etc/default/grub. Пересобираем grub.cfg:
# grub-mkconfig -o /boot/grub/grub.cfg
Добавляем v86d в секцию HOOKS конфига /etc/mkinitcpio.conf:
HOOKS="base udev v86d ..."
Все параметры для драйвера uvesafb задаются в его конфигурационном файле /usr/lib/modprobe.d/uvesafb.conf:
# This file sets the parameters for uvesafb module.
# The following format should be used:
# options uvesafb mode_option=<xres>x<yres>[-<bpp>][@<refresh>] scroll=<ywrap|ypan|redraw> ...
#
# For more details see:
# http://www.kernel.org/doc/Documentation/fb/uvesafb.txt
#
options uvesafb mode_option=1280x800-32 scroll=ywrap
Документация по установке режимов при помощи опции mode_option может быть найдена в Git-репозиториях твоего ядра по пути tree/Documentation/fb/modedb.txt. Чтобы обезопасить настройки от перезаписи в процессе обновления пакета v86d, скопируй эти самые настройки от греха подальше в /etc/modprobe.d/uvesafb.conf и затем добавь запись, указывающую на твои настройки, в секцию FILES конфига /etc/mkinitcpio.conf:
FILES="/etc/modprobe.d/uvesafb.conf"
Теперь нам необходимо пересобрать образ initramfs для ядра:
# mkinitcpio -p linux
Перегружаем систему и наблюдаем за изменениями...
Список возможных разрешений может быть получен командой
$ cat /sys/bus/platform/drivers/uvesafb/uvesafb.0/vbe_modes
Собственно, потом эти разрешения можно попробовать подставить в конфиг /etc/modprobe.d/uvesafb.conf. После того как ядрышко загрузилось, при помощи следующей команды (или использовать fbset -i) можно проверить, не обманули ли нас с разрешением:
$ cat /sys/class/graphics/fb0/virtual_size
Теперь можно и заняться непосредственно улучшением своих аскетичных условий существования в консоли. Начнем с выбора браузера...
Браузер
Выбор наш пал на links, да только не простой, а с поддержкой вывода через фреймбуфер. Чтобы заполучить это чудо природы, необходимо сначала скачать его с AUR-репозитория.
# wget -c https://aur.archlinux.org/packages/li/links-g-directfb/links-g-directfb.tar.gz
Разархивируем:
# tar xzvf links-g-directfb.tar.gz
# cd links-g-directfb
# makepkg
# pacman -U links-g-directfb-2.8-1-x86_64.pkg.tar.xz
Пользуемся на здоровье:
$ links -g google.ru
Почта
В роли почтового клиента будем использовать mutt, для получения почты воспользуемся getmail, для отправки — msmtp. Начнем с получения почты. Устанавливаем getmail:
# pacman -S getmail
$ mkdir ~/.getmail
$ chmod 700 ~/.getmail
Создаем файл настроек ~/.getmail/getmailrc и пихаем туда следующий текст:
[retriever]
type = SimpleIMAPRetriever
server = imap.server.ru
port = 143
username = user@server.ru
password = password
[destination]
type = Maildir
path = ~/.mail/
[options]
delete = true
message_log = ~/.getmail/getmail-log
В зависимости от настроек сервера в качестве type для секции retriever можно использовать следующие фразы:
- SimplePOP3Retriever;
- BrokenUIDLPOP3Retriever;
- SimpleIMAPRetriever;
- SimplePOP3SSLRetriever;
- BrokenUIDLPOP3SSLRetriever;
- SimpleIMAPSSLRetriever;
- MultidropPOP3Retriever;
- MultidropPOP3SSLRetriever;
- MultidropSDPSRetriever;
- MultidropIMAPRetriever;
- MultidropIMAPSSLRetriever.
Например, если ты задался целью настроить доступ к почте на Gmail, то секция retriever будет выглядеть примерно следующим образом:
[retriever]
type = SimpleIMAPSSLRetriever
server = imap.gmail.com
mailboxes = ("[Gmail]/All Mail",)
username = USER
password = PASS
Проверить настройки можно при помощи команды getmail без указания параметров. Плавно переходим к процессу отправки почты... Устанавливаем msmtp:
# pacman -S msmtp
Создаем конфигурационный файл ~/.msmtprc (в качестве примера идет конфиг на несколько аккаунтов) и пишем туда следующее:
# Accounts will inherit settings from this section
defaults
auth on
tls on
tls_trust_file /usr/share/ca-certificates/mozilla/Thawte_Premium_Server_CA.crt
# A first gmail address
account gmail
host smtp.gmail.com
port 587
from username@gmail.com
user username@gmail.com
password password
tls_trust_file /etc/ssl/certs/ca-certificates.crt
# A second gmail address
account gmail2 : gmail
from username2@gmail.com
user username2@gmail.com
password password2
# A freemail service
account freemail
host smtp.freemail.example
from joe_smith@freemail.example
user joe.smith
password secret
# A provider’s service
account provider
host smtp.provider.example
# Set a default account
account default : gmail
Устанавливаем права на вновь созданный конфиг, в противном случае msmtp откажется работать:
$ chmod 600 ~/.msmtprc
Переходим к заключительной стадии настройки почты. Устанавливаем клиент mutt:
# pacman -S mutt
$ vim ./.muttrc
Создаем конфигурационный файл ~/.muttrc и пишем туда следующее:
set mbox_type=maildir
set folder=$HOME/.mail
set spoolfile=+/
set header_cache=~/.hcache
set sendmail="/usr/bin/msmtp"
set from="user@server.ru"
В конфиге указываем, что почта будет отправляться при помощи msmtp, папкой для почты будет ~/.mail/, а адрес отправителя будет иметь вид user@server.ru. Далее нам необходимо создать несколько папок, в которых эта самая почта будет храниться:
$ mkdir -p ~/mail/{cur,new,tmp}
Пришло время потестить полученную систему. Качаем почту и открываем mutt:
$ getmail
$ mutt
Пред нашими очами предстанут все полученные письма. Для создания и отправки письма жмем m, после чего следуем инструкциям. Для автоматического получения писем добавим соответствующую запись в crontab:
$ crontab -e
В возникшем редакторе вставляем следующую строку:
*/10 * * * * /usr/bin/getmail
С этого момента getmail будет запускаться каждые десять минут, конечно же, если crond включен. Для включения crond:
# systemctl enable cronie.service
Джаббер
В этом вопросе нам поможет mcabber — текстовый Jabber-клиент, включающий в себя такие функции, как поддержка SSL, поддержка UTF8, история переписки (конференции), автодополнение команд и возможность создания собственных команд (триггеров). Недолго думая вбиваем в консоли:
# pacman -S mcabber
После установки cоздаем папку ~/.mcabber и копируем в нее файл /usr/share/mcabber/example/mcabberrc:
$ mkdir ~/.mcabber
$ cp /usr/share/mcabber/example/mcabberrc ~/.mcabber/mcabberrc
Устанавливаем права доступа на вновь созданную папку:
$ chmod 0700 ~/.mcabber
Затем переходим к редактированию конфига (он хорошо документирован, поэтому проблем в настройке возникнуть не должно). Необходимый минимум, который нужно изменить в конфигурационном файле mcabberrc:
set username = твой JID
set password = твой пароль (если не указать, будет запрошен при соединении)
set server = твой сервер
Если сервер поддерживает SSL, то мы можем воспользоваться этой прекрасной особенностью, прописав в конфиг следующие строчки:
set ssl = 1
set ssl_verify = 0
При этом сертификаты с сервера будут подгружены автоматически. Вкратце опишем интерфейс. Слева — ростер (он же список контактов). Правее — окно чата. Прямо под ним — окно системных сообщений. И в самом низу — строка ввода, в которую мы будем вводить команды и сообщения. Перемещение по ростеру происходит при помощи кнопок Page up / Page down. Enter — переход в состояние чата для текущего JID или конференции. Чтобы увидеть команды, поддерживаемые mcabber’ом, вбиваем в строку ввода команду /help и медитируем...
Аудио
В качестве аудиоплеера поставим moc — отличный вариант для тех, кто хочет наслаждаться музыкой из консоли, но при этом не желает заморачиваться с настройкой MPD.
# pacman -S moc
Запускаем:
$ mocp
В левой части данного плеера располагается панель для навигации по файловой системе, в правой — плей-лист, в который можно перекидывать файлы. Основные хоткеи (описание всех хоткеев можно увидеть, нажав «?»):
- a — добавить файл в плей-лист;
- A — рекурсивно добавить директорию в плей-лист;
- enter — начать воспроизведение музыкальной композиции;
- s — остановить воспроизведение;
- n — перейти к следующей музыкальной композиции;
- b — перейти к предыдущей музыкальной композиции;
- u — передвинуть композицию в плей-листе на строчку вверх;
- j — передвинуть композицию в плей-листе на строчку вниз;
- p — пауза;
- > — увеличить громкость воспроизведения;
- < — уменьшить громкость воспроизведения;
- m — перейти в каталог музыки;
- g — поиск композиции в текущей папке или плей-листе;
- C — очистить плей-лист;
- V — сохранить плей-лист;
- q — перевести программу в фоновый режим (исполнение музыкальных композиций при этом не прекращается);
- Q — выйти из программы.
Для конфигурирования плеера перекидываем дефолтный конфиг /usr/share/doc/moc/config.example в папку ~/.moc. Обзываем его просто config. Конфигурационный файл хорошо прокомментирован, поэтому при желании не составит никакого труда разобраться, что к чему. Тем не менее пройдемся по основным пунктам настроек:
# Путь к папке, в которой хранится твоя музыкальная коллекция. Если в плеере нажать m, то попадешь именно сюда
MusicDir = "/path/to/your/music/dir"
# Включение автоповтора при запуске плеера
Repeat = yes
# Включение shuffle-режима
Shuffle = yes
# Включение автопереключения треков
AutoNext = yes
# Не показывать скрытые файлы в панели навигации по файловой системе
ShowHiddenFiles = no
# Плеер запускается из твоей папки с музыкальной коллекцией
StartInMusicDir = yes
# Сохранение плей-листа после выхода из плеера
SavePlaylist = yes
Видео
Для просмотра произведений кинематографа мы будем использовать всем известный MPlayer. Установка не отличается оригинальностью:
# pacman -S mplayer
MPlayer поддерживает различные модули вывода. Посмотреть их список можно при помощи следующей команды:
# mpl -vo help
MPlayer SVN-r36498-snapshot-4.8.2 (C) 2000-2013 MPlayer Team
206 audio & 433 video codecs
<...>
Поскольку в данный момент мы находимся в голой консоли, то нас могут заинтересовать, к примеру, fbdev/fbdev2 или же aa/caca, если мы являемся настоящими ценителями прекрасного. В простейшем случае запуск будет выглядеть следующим образом:
$ mplayer -vo fbdev2 video.avi
Или так:
$ mplayer -vo caca video.avi
Теперь можно вальяжно развалиться на диване/стуле и наслаждаться кинокартиной.
Просмотрщики
Оторвемся на минутку от выбранного на предыдущем шаге фильма и сосредоточим все свое внимание на проблеме просмотра различных форматов изображений, а также файлов формата PDF и DJVU. Для начала установим пакет fbida, который разом решит все наши проблемы с просмотром картинок и чтением DJVU-файлов:
# pacman -S fbida
Теперь для того, чтобы почитать интересную DJVU’шку, нам надо будет привести в исполнение следующую команду:
$ fbdjvu file.djvu
Чтобы увидеть все изображения (к примеру, формата JPG) в текущей папке, вбиваем в консоли:
$ fbi *.jpg
Остались PDF’ки, но мы и их сейчас одолеем. Качаем пакет fbpdf-git из AUR, распаковываем, собираем, устанавливаем:
# wget -c https://aur.archlinux.org/packages/fb/fbpdf-git/fbpdf-git.tar.gz
Инициируем процесс разархивирования:
# tar xzvf fbpdf-git.tar.gz
# cd fbpdf-git
Если у тебя нет в наличии установленного пакета openjpeg2, то быстрей исправляй это недоразумение:
# pacman -S openjpeg2
Собираем fbpdf-git:
# makepkg
# pacman -U fbpdf-git-0.r75.db5da40-1-x86_64.pkg.tar.xz
Пользуемся на здоровье:
$ fbpdf file.pdf
Сочетания для fbpdf:
- J или <^ + f> — перейти на следующую страницу;
- K или <^ + b> — перейти на предыдущую страницу;
- h — сместиться по странице влево;
- l — сместиться по странице вправо;
- k — сместиться по странице вверх;
- j или пробел — сместиться по странице вниз;
- <^ + d> — прыгнуть на самый низ страницы;
- Backspace — прыгнуть на самый верх страницы;
- <[0–9] + G> — переход на страницу с заданным номером;
- <[0–9] + z> — зум в угадай-число раз;
- q — выйти из программы.
Остальное
Ну и на десерт... Консольный переводчик sdcv. Для перевода программа использует словари stardict, так что они у тебя уже должны иметься. Если это не так, то надо будет их скачать и поместить в директорию со словарями. Устанавливаем:
# pacman -S sdcv
Если ты пожелаешь сделать снимки экрана в консоли, то мы предложим тебе воспользоваться услугами fbgrab:
# pacman -S fbgrab
И в конце концов, если тебе потребуются уместные и нужные советы, ты всегда сможешь получить их при помощи небольшого однострочника (скажем спасибо товарищу muhas), который можно оформить и в виде скрипта и запихать на него алиас в .bashrc:
/usr/bin/printf "$(echo -e `curl -s http://fucking-great-advice.ru/api/random | awk -F \" '{print $8}'` | sed 's/\ / /g')"\\n
Заключение
Если ты все-таки немного утомился от столь ярой аскетичности и не можешь себе представить жизнь без иксов, то предлагаем обратить взор на тайловые оконные менеджеры, например на xmonad. Суть подобных программ состоит в стремлении помочь пользователю максимально эффективно управлять окнами без помощи мыши. Так что если ты мышефоб, но голая консоль тебе не пришлась по вкусу, то этот вариант, скорее всего, заставит трепетать твое сознание.
Ну а тем, кого все-таки захватила консоль, хотелось бы пожелать не останавливаться на этом сложном пути истинного воена красноглазия и продолжать избавляться от излишних интерфейсов, мешающих постигнуть Дао. Следующий шаг — отказ от монитора, но это уже другая история...