Использование FreeBSD на десктопе, версия 2.0

24 февраля 2016

Прошло три года с тех пор, как я попрощался с FreeBSD, по крайней мере, как с десктопной операционной системой. Сомнений в том, что FreeBSD по большому счету является неплохой серверной ОС, у меня нет. В частности, веб-сервер, отдающий страницы этого блога, работал и продолжает работать на FreeBSD. А вот о том, изменилось ли что-то в мире FreeBSD в отношении десктопов, достоверных сведений нет. Так что, я решил разобраться в текущем состоянии дел самостоятельно, попробовав установить FreeBSD на ноутбук Toshiba Portege Z930-DKS, который все равно сейчас пылится у меня без дела.

Примечание: Вас также могут заинтересовать мои старые статьи Быстрая установка FreeBSD и настройка воркстейшн и FreeBSD на десктопе — ставим Flash, Skype и OpenOffice.

Вообще, почему FreeBSD?

FreeBSD имеет интересные возможности и особенности, из которых, помимо прочих, хотелось бы отметить: (1) порты, где весь софт всегда самый свежий и в одном месте, а не так, что для каждого приложения нагугли свой PPA и надейся, что автор его не забросит (2) отличную файловую систему ZFS, (3) dtrace, (4) ipfw и pf, фаерволы с нормальным интерфейсом, а не как в iptables, (5) средства виртуализации jails и bhyve, (6) безопасность, уж не знаю, по принципу Неуловимого Джо или потому что код нормальный и (7) превосходную документацию. В Linux вроде как пытаются портировать и ZFS и dtrace. Однако последний раз, когда я узнавал, все эти проекты имели состояние «в разработке» и не годились для использования в боевых условиях.

Дополнение: В Linux теперь есть достойный аналог DTrace в лице bcc/eBPF.

Обратите внимание, что пункт про документацию, возможно, является самым важным. Посмотрите, например, раздел хэндбука, посвященный jails. А теперь покажите мне такую же документацию по LXC. В свое время, чтобы нормально разобраться в LXC, мне потребовалось около месяца кропотливо собирать обрывки информации по спискам рассылок, блогам и ишьюсам на GitHub. Что, как мне кажется, для серьезного проекта просто недопустимо. Да и с интерфейсом у LXC все примерно так же плохо, как у iptables и apt. В общем, документация у FreeBSD действительно прекрасна и содержит ответы на 99% всех возможных вопросов. Вы сами в этом скоро убедитесь, так как при написании этой заметки я часто обращался к документации и потому не единожды ссылаюсь на нее далее по тексту.

Не удивительно, что даже сегодня, несмотря на, казалось бы, доминирующее положение Ubuntu, FreeBSD используется все еще достаточно широко. Из известных примеров можно привести Netflix и WhatsApp. Или тот факт, что PlayStation 4 на самом деле работает под управлением FreeBSD. Также FreeBSD используется на многих хостингах, крутится в недрах Яндекса, и не только. Специально для читателей, считающих, что дела у FreeBSD идут не очень и что проект не развивается, хотелось бы оставить ссылку на Отчет о развитии FreeBSD за четвертый квартал 2015 года. Динамика развития проекта действительно впечатляет!

См также мою старенькую заметку Почти объективно на тему «чем FreeBSD лучше Linux».

Установка

Для своих экспериментов я использовал FreeBSD 10.2 RELEASE, образ для флешки, без UEFI:

FreeBSD-10.2-RELEASE-amd64-memstick.img

Отмечу, что инталлятор стал намного приятнее, чем он был до этого. Я просто воткнул флешку, загрузился с нее, затем жал Next, Next, Next и получил работающую систему. Инталлятор сам настроил сетевой интерфейс, сам сделал ZFS на диске, и так далее. По умолчанию все просто и понятно, но при желании можно залезть и в расширенные настройки.

FreeBSD на ноутбуке Toshiba Portege Z930-DKS

На представленной фотографии вы видите систему в процессе загрузки.

Ставим desktop environment

Во FreeBSD появился новый пакетный менеджер pkg. Стало намного лучше, чем было до этого. Все просто и понятно, не хуже, чем в Ubuntu. Впрочем, старые-добрые порты все так же доступны.

Раз уж из коробки никакого десктоп-окружения по умолчанию во FreeBSD нет, я решил использовать i3. Мне он нравится своей легкостью и эффективным использованием пространства на экране. Впрочем, с тем же успехом ставится и более традиционные окружения, например, Xfce.

Ставим пакеты xorg, i3, i3status, i3lock и dmenu. В ~/.xinitrc дописываем:

exec i3

Правим конфиг ~/.config/i3/config, используя /usr/local/etc/i3/config в качестве шаблона.

Говорим startx, и радуемся. Звук заработал сам собой, ничего дополнительно настраивать не пришлось. Немного пришлось подправить i3status.conf, чтобы в статусной строке i3 правильно отображал количество свободного места на диске, уровень заряда аккумулятора и подобные вещи. Ссылку на репозиторий со всеми конфигами, получившимся в итоге, вы найдете в конце поста.

Дополнение: Заметил, что если воткнуть наушники, звук продолжает идти через спикер. Суть решения описана в последних двух постах данного трэда. Я просто почитал немного man по snd_hda, провел аналогию между выводом dmesg у автора и у себя, после чего поправил соответствующим образом свой device.hints. После первой перезагрузки все заработало, как положено.

Раскладка и локаль

В ~/.xinitrc дописываем:

export LANG=en_US.UTF-8
export MM_CHARSET=UTF-8

setxkbmap -layout 'us,ru' -option 'grp:alt_shift_toggle'

Если использовать локаль ru_RU.UTF-8, все приложения магическим образом получат русскоязычный интерфейс.

Для отображения текущей раскладки в трее можно использовать утилиту gxneur, прописав ее на автозапуск в конце .config/i3/config:

exec gxneur &

В качестве альтернативного варианта можно посоветовать xxkb, про который я как-то рассказывал в посте Мини заметки — выпуск 9. Впрочем, я лично в итоге забил на индикатор текущей раскладки, так как никогда не смотрю на него.

Для работы с русским языком в консоли без X11 в ~/.bash_profile следует написать:

export LANG=en_US.UTF-8

Также в /etc/rc.conf нужно добавить строчку:

keymap="ru"

Переключение раскладки при работе без иксов происходит нажатием Caps Lock.

Разное по мелочи

Для удобства поставил sudo и отредактировал /usr/local/etc/sudoers.

В портах не удалось обнаружить pip3. Как его поставить описано здесь.

Время после установки стояло неправильное, пришлось его поправить:

sudo date 201603081607

Поставил bash, так как я плохо знаю идущий по умолчанию csh:

sudo pkg install bash
sudo chsh -s /usr/local/bin/bash eax

В /etc/rc.conf дописываем:

dbus_enable="YES"

Это нужно, например, для Evince и, вероятно, ряда других приложений.

В ~/.bashrc дописываем:

eval "$(ssh-agent)"
ssh-add

Без этого не будет работать ssh-copy-id. Если напрягает множество файлов с именами вроде .serverauth.1234, которые при этом создаются в домашнем каталоге, здесь рассказано, как это исправить.

Если ставили Git, то в ~/.gitconfig дописываем:

[core]
    pager = less -S

Без этого git diff, git log и прочее выглядят очень странно и непривычно.

Яркость экрана

В пакетах нашлась утилита intel_backlight, позволяющая регулировать яркость экрана:

sudo pkg install intel-backlight
sudo intel_backlight 80

Отлично работает, никаких проблем.

Шрифты

По умолчанию в системе используются шрифты, которые сами по себе вроде бы и неплохи, но выглядят в браузере очень непривычно. И некоторые сайты могут поползти, так как их верстка рассчитана на наличие в системе определенных шрифтов, например Arial, Time New Roman, Courier New, Verdana и других.

Бинарного пакета для этих шрифтов нет, будем ставить из портов:

cd /usr/ports
sudo portsnap fetch extract

Или, если уже успели скачать порты при помощи portsnap, то:

sudo portsnap fetch update

Сама установка:

cd /usr/ports/x11-fonts/webfonts
sudo make install

Готово, веб стал выглядеть нормально!

Более подробно работа с портами описана в заметке Установка и обновление софта во FreeBSD.

Настройка Wi-Fi

С Wi-Fi возникли некоторые трудности. Встроенный в ноутбук Wi-Fi адаптер FreeBSD не подцепила, поэтому я решил заказать маааленький внешний USB-адаптер. На этой странице содержится список поддерживаемых FreeBSD устройств. В итоге я остановился на устройстве TP-LINK TL-WN725N. Согласно Яндекс.Маркету, во многих магазинах также имеется совместимый с FreeBSD адаптер Edimax EW-7811Un.

Работу с Wi-Fi во FreeBSD мы немного затрагивали в заметке Настройка D-Link DIR-320 под FreeBSD. Говорим:

sudo ifconfig wlan0 create wlandev urtwn0
sudo ifconfig wlan0 up scan
# если SSID обрезались, поможет verbose:
sudo ifconfig -v wlan0 scan | grep SSID_START

И… ничего не выводится :( Смотрим в dmesg и видим что-то вроде:

You need to read the LICENSE file in /usr/share/doc/legal/realtek/.
If you agree with the license, set legal.realtek.license_ack=1 in
/boot/loader.conf.

Правим loader.conf, как описано выше, говорим sudo reboot.

После перезагрузки повторяем приведенные выше команды, находим ssid интересующей нас сети.

В /etc/rc.conf дописываем:

wlans_urtwn0="wlan0"
ifconfig_wlan0="WPA DHCP"

В /etc/wpa_supplicant.conf пишем что-то вроде:

network = {
  ssid="tp-link"
  psk="ololotrololo"
}

Говорим:

sudo service netif restart
netstat -nr

Если все было сделано правильно, должны подрубиться к Wi-Fi. В случае возникновения проблем обращайтесь к хэндбуку.

Как альтернативный и более удобный вариант, говорим:

sudo pkg install wifimgr

После правки /etc/rc.conf эта утилита позволит рулить Wi-Fi сетями через GUI. К тому же, у меня ssid при выводе в консоль обрезался до TP-LINK_2.4.... Как это обойти, я так и не выяснил. Пришлось узнать полный ssid из веб-интерфейса роутера, который в общем случае может быть и недоступен. У wifimgr нет такой проблемы.

Поддержка OpenGL

Дополнение: Эта часть статьи успела устареть и теперь представляет собой разве что историческую ценность. Все изменения приняли в CURRENT и они вошли во FreeBSD 11.

Ноутбук оснащен графической картой Intel HD Graphics 4000. В свободное время я потихоньку изучаю OpenGL, и поэтому очень надеялся, что FreeBSD даст на этой железке хотя бы OpenGL 3.3:

sudo pkg install mesa-demos
glxinfo | grep OpenGL

Но мои надежды не оправдались:

OpenGL vendor string: Intel Open Source Technology Center
OpenGL renderer string: Mesa DRI Intel(R) Ivybridge Mobile
OpenGL core profile version string: 3.2 (Core Profile) Mesa 11.0.8
OpenGL core profile shading language version string: 1.50
OpenGL core profile context flags: (none)
OpenGL core profile profile mask: core profile
OpenGL core profile extensions:
OpenGL version string: 3.0 Mesa 11.0.8
OpenGL shading language version string: 1.30
OpenGL context flags: (none)
OpenGL extensions:
OpenGL ES profile version string: OpenGL ES 3.0 Mesa 11.0.8
OpenGL ES profile shading language version: OpenGL ES GLSL ES 3.00
OpenGL ES profile extensions:

Тогда я обратился за помощью в мейлинг листы. Оказалось, что поддержка современного OpenGL у моей видеокарты появится (может быть) только во FreeBSD 11.

Если очень не терпится, можно собрать ядро из исходников самостоятельно, как описано здесь. Если вы успешно загрузились с новым ядром и вроде бы все работает, переименуйте /boot/kernel и /boot/kernel.good, а собранный вами /boot/kernel.i915 — в /boot/kernel. Так система будет постоянно загружаться с новым ядром.

После установки ядра требуется создать группу video с gid 44 и добавить в нее вашего пользователя:

pw groupadd video -g 44 -M eax

Чтобы DDS/DXT текстуры не отображались черным, скажите:

sudo pkg install libtxn_dxtn-20140604

В итоге OpenGL 3.3 удалось завести. Вроде все работает нормально. Следует однако учитывать, что поддержка OpenGL 3.3 для Intel HD Graphics 4000 на момент написания этих строк находится в разработке. Поэтому ядро вполне спокойно может крэшатся. С другой стороны, это прекрасная возможность стать контрибьютором в проект FreeBSD — просто находим способ уронить ядро и шлем корку в рассылку freebsd-x11@. Я лично пару таких корок уже отправил. Приятно чувствовать свой, хоть и небольшой, но все-таки вклад в развитие FreeBSD.

Приложения

Поставил веб-браузер Chromium. После его установки нужно было что-то там дописать в /etc/sysctl.conf, соответствующее сообщение выводится сразу после установки. Вроде все работает, видео с YouTube показывается, и так далее. В качестве терминала для i3 был выбран xfce4-terminal. Для чтения PDF и DjVu поставил Evince, притом собирал его из портов, как раз чтобы была поддержка DjVu. Нативной сборки Sublime Text для FreeBSD нет, а включать в системе эмуляцию Linux (кстати, еще одна из интересных фичей FreeBSD) мне не хотелось. Впрочем, старый-добрый Vim с ctags умеет все то же самое, что и Sublime Text. Раньше без эмуляции Linux не было htop, и приходилось использовать обычный top в сочетании c freecolor. Утилита freecolor упоминалась в посте Мини заметки — выпуск 5. Однако htop версии 2.0 портировали под FreeBSD и он уже доступен в портах.

Еще из приложений можно рекомендовать Claws Mail для почты, Liferea для чтения RSS, scrot для снятия скриншотов, gpicview для их просмотра, Gimp для их редактирования, Transmission для торрентов, XChat для IRC, Psi для Jabber, Pidgin как для Jabber, так и для других IM, openvpn для VPN, SMPlayer для видео, DeadBeef для прослушивания аудио и Audacity для его редактирования, а также Virtualbox для виртуалок. Еще кое-какой софт и игры для FreeBSD упоминаются в заметке Аналоги Windows-программ для Linux/UNIX.

Flash, к счастью, теперь уже практически нигде не нужен. Раньше без него не работало видео на YouTube, не показывались панорамы на Яндекс.Картах и так далее, было грустно. Skype и LibreOffice на этом компьютере мне не особо нужны, но в статьях, упомянутых в самом начале этого поста, рассказывается, как их можно поставить. В качестве открытой альтернативы Skype доступен клиент и сервер Mumble. Есть OpenJDK. В частности, при его наличии отлично работает CLion. Есть и OracleJDK, но он требует эмуляции Linux. Dropbox’а нет, с ним получится работать только через веб-интерфейс. Может, это и к лучшему, так как сегодня вместо Dropbox я предпочитаю держать Syncthing на каком-нибудь DigitalOcean. Еще в свое время под FreeBSD были некоторые проблемы с платежными системами. Сейчас они все поголовно предоставляют веб-интерфейс, так что ни с Яндекс.Деньгами, ни c PayPal, ни даже c WebMoney проблем нет. Это справедливо и в отношении ряда других приложений, например, уже упомянутого Dropbox или, скажем, Telegram. Кстати, для последнего в пакетах даже нашелся клиент, правда, только консольный.

В целом, с софтом все стало намного лучше, чем было до этого. Удивительно, но похоже, что мир идет сторону открытых технологий.

Что с зарядкой

Вроде нормально держит. В режиме «сидеть в интернете через Wi-Fi и держать яркость экрана такой, чтобы глазам было комфортно» без подзарядки ноутбук держит примерно три часа (uptime показал 2 часа 30 минут и 45 минут оставалось согласно i3status). Учитывая, что ноут не супер новый, и что 8 часов на моей памяти он никогда не держал, считаю, что это неплохо.

Для вывода уведомлений о низком заряде аккумулятора я написал небольшой скрипт на Python, исходники которого вы найдете в репозитории со всеми конфигами и скриптами к этой заметке. Этот скрипт я прописал на автозапуск через конфиг i3. В процессе написания скрипта выяснилось, что для вывода уведомлений нужно установить и немного подтюнить штуку под названием dunst.

Дополнение: См также Экономия заряда аккумулятора во FreeBSD, или как прожить до 10 часов без подзарядки.

Прочее

Принтерами и сканерами я практически не пользуюсь, так что тестировать их не стал, но cups и xsane соответственно доступны. Из тех же соображений не тестировал веб-камеру, SD-ридер и bluetooth. На точпаде не эмулируется колесико мышки при касании двумя пальцами, на это тоже забил. Подсветку клавиатуры по идее можно включать и выключать. По крайней мере, в Ubuntu это работало. Тоже поленился разобраться, можно ли это вообще настроить под FreeBSD. Пробовал сон и гибернацию системы. Похоже, что не работают — у FreeBSD с этим всегда были трудности. С другой стороны, а так ли в наше время нужна гибернация, учитывая, загрузка ОС занимает пару секунд, и что большинство приложений восстанавливают свое состояние при запуске?

Дополнение: Скролинг на точпаде заработал после выполнения шагов из этой инструкции. TL;DR — ставим пакет xf86-input-mouse, в /boot/loader.conf пишем:

hw.psm.synaptics_support="1"

Также убедитесь, что в /etc/rc.conf у вас есть строчка:

moused_enable="YES"

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

Заключение

Как ни странно, это работает. Но, несмотря на заметные изменения в лучшую сторону, держать FreeBSD на десктопе — все еще удел скорее энтузиастов, чем прагматиков. По крайней мере, если речь идет о ноутбуках (кстати, по идее FreeBSD должна очень неплохо работать на стареньких маках). FreeBSD хороша, как серверная ОС. Но если вам нужно что-то UNIX-подобное на ноутбуке, пока что я бы все-таки рекомендовал Ubuntu.

Все конфиги к этой заметке вы найдете в этом репозитории. Также вас может заинтересовать вот эта довольно свежая статья. В ней рассказывается, как установить FreeBSD на ноутбук ThinkPad X240.

Как всегда, буду рад вашим вопросам и дополнениям.

Дополнение: Как оказалось, FreeBSD довольно неплохо работает на ноутбуке Fujitsu Lifebook E733. Все подцепилось, включая точпад, встроенную Wi-Fi сетевую карту, подсветку клавиатуры и изменение яркости экрана. При этом если Toshiba Portege Z930-DKS под управлением FreeBSD довольно сильно греется, так, что его становится некомфортно держать на коленях, то у Fujitsu Liefebook E733 такой проблемы нет. Работает даже гибернация, но, увы, после нескольких гибернаций стабильно ломается USB-стек. Кроме того, перед гибернацией приходится тушить все виртуалки, работающие под VirtualBox. Еще из багов — в 11.0 куда-то выпилился пакет libtxn_dxtn, ядро может просто взять и упасть без особых причин.

Метки: .


Вы можете прислать свой комментарий мне на почту, или воспользоваться комментариями в Telegram-группе.