LaurVas

Мои впечатления от Gentoo Linux

   linux

КПДВ

Да, здесь должна быть эта устрашающая картинка.

TL;DR: Я рад, что наконец-то осмелился попробовать Gentoo. Да, пришлось потратить время, чтобы заработали самые базовые вещи, но я узнал много нового и многому научился. В Gentoo есть свои интересные фишечки, которых нет в других дистрибутивах.

Gentoo долгое время не давал мне покоя. С одной стороны он отталкивал сложностью, сборкой всего из исходников (о ужас!). С другой стороны все четыре гентушника, с которыми мне случилось познакомиться по жизни, были очень толковыми чуваками.

If you know <distro>, then you know <distro>. If you know Gentoo, then you know Linux

На момент написания статьи я использую Gentoo около года.

Пара слов о том, где я установил Gentoo

Погонять дистр на виртуалке и полностью переехать на новую ОС — это разные степени погружения. Подготовка небольшого сервера и подготовка многоцелевого десктопа (или лэптопа) требует разных усилий. То же самое справедливо для поддержки системы в актуальном состоянии.

Сначала я поставил Gentoo на ноутбук Lenovo x200s по соседству с арчем. Постепенно установил всё необходимое с целью использовать только Gentoo. Затея удалась где-то наполовину. До сих пор я до конца не определился кого из них оставить.

Затем сделал домашний сервер из нетбука Dell Inspiron mini 11. Много провозился с настройкой hostapd и iptables, чтобы получить программную WI-FI точку доступа. Сейчас там крутятся Nginx, Syncthing, vsftpd, hostapd. Этот сервер — моя тренировочная площадка.

USE-флаги

Использование USE-флагов позволяет собрать систему без лишних, ненужных компонентов.
blog.peter23.com

Я был много наслышан про USE-флаги. Но что они реально могут дать? Насколько сильно можно кастомизировать систему с их помощью?

Самое лучшее объяснение механизма USE-флагов нашлось в комментариях в конфигурационном файле /usr/share/portage/config/make.conf.example:

The USE variable is used to enable optional build-time functionality. For example, quite a few packages have optional X, gtk or GNOME functionality that can only be enabled or disabled at compile-time.

То есть USE-флаги позволяют включить/отключить в пакете то, что может быть включено/отключено только на этапе сборки. Практика показывает, что далеко не все программы имеют возможность подобной кастомизации.

Если отключить какую-нибудь фичу глобально через USE-флаг, она будет отключена не во всех пакетах, а только в тех, где это предусмотрено. Например keepassx использует Qt4, но не имеет соответствующего флага. Поэтому он принесёт qt4 в зависимостях. Он просто не может работать иначе!

Флаг qt4 встречается там, где пакет может быть собран и будет работать без Qt4. Например, собирая VirtualBox без qt4 вы теряете графический интерфейс управления виртуалками. Остаётся только консольный. При этом сама виртуализация никак не пострадает.

vas@gentoo$ equery uses virtualbox
[ Legend : U - final flag setting for installation]
[        : I - package is installed with flag     ]
[ Colors : set, unset                             ]
 * Found these USE flags for app-emulation/virtualbox-4.3.32:
 U I
 - - additions                : Install Guest System Tools ISO
 + + alsa                     : Add support for media-libs/alsa-lib (Advanced Linux Sound Architecture)
 - - doc                      : Add extra documentation (API, Javadoc, etc). It is recommended to enable per package instead of globally
 - - extensions               : Install extension module packages
 - - headless                 : Build without any graphic frontend
 - - java                     : Add support for Java
 - - opengl                   : Add support for OpenGL (3D graphics)
 + + pam                      : Add support for PAM (Pluggable Authentication Modules) - DANGEROUS to arbitrarily flip
 - - pulseaudio               : Add support for PulseAudio sound server
 - - python                   : Add optional support/bindings for the Python language
 + + python_targets_python2_7 : Build with Python 2.7
 + + qt4                      : Add support for the Qt GUI/Application Toolkit version 4.x
 - - sdk                      : Enable building of SDK
 - - udev                     : Controls installation of special USB udev rules.
 - - vboxwebsrv               : Build and install the VirtualBox webservice
 - - vnc                      : Enable VNC (remote desktop viewer) support

Другой пример — анализатор трафика Wireshark. Он может иметь гуй на Qt4, Qt5 или Gtk+3.

vas@gentoo$ equery uses wireshark
[ Legend : U - final flag setting for installation]
[        : I - package is installed with flag     ]
[ Colors : set, unset                             ]
 * Found these USE flags for net-analyzer/wireshark-1.12.8:
 U I
 - - adns      : Use the GNU net-dns/c-ares library to resolve DNS names
 + + caps      : Use Linux capabilities library to control privilege
 + + crypt     : Use dev-libs/libgcrypt to decrypt traffic
 - - doc       : Add extra documentation (API, Javadoc, etc). It is recommended to enable per package instead of globally
 - - doc-pdf   : Build documentation in pdf format (US and a4 paper sizes)
 + + filecaps  : Use Linux file capabilities to control privilege rather than set*id (this is orthogonal to USE=caps which uses capabilities at runtime e.g. libcap)
 - - geoip     : Add geoip support for country and city lookup based on IPs
 - - gtk3      : Build the wireshark executable with a GTK+ UI version 3.
 - - ipv6      : Add support for IP version 6
 - - kerberos  : Add kerberos support
 - - lua       : Enable Lua scripting support
 + + netlink   : Use dev-libs/libnl
 + + pcap      : Use net-libs/libpcap for network packet capturing (build dumpcap, rawshark)
 - - portaudio : Add support for the crossplatform portaudio audio API
 + + qt4       : Build the wireshark executable with an experimental Qt UI instead of GTK+.
 - - qt5       : Add support for the Qt 5 application and UI framework
 - - sbc       : Use media-libs/sbc for playing back SBC encoded packets
 - - smi       : Use net-libs/libsmi to resolve numeric OIDs into human readable format
 + + ssl       : Add support for Secure Socket Layer connections
 + + zlib      : Add support for zlib (de)compression

У USE-флагов не всегда понятное описание. Главный вопрос по USE-флагу, на который я хочу видеть ответ: нужен ли он мне или можно выключить? Не всегда это становится понятно из описания. Хорошо если у пакета есть подробная вики-страница, но чаще всего это не так (о документации будет отдельный разговор). Что делать, где искать ответ?

Можно обратиться к Гуглу. Из моей практики запомнился случай с wireless-tools.

vas@gentoo$ equery uses net-wireless/wireless-tools
[ Legend : U - final flag setting for installation]
[        : I - package is installed with flag     ]
[ Colors : set, unset                             ]
 * Found these USE flags for net-wireless/wireless-tools-30_pre9:
 U I
 - - linguas_cs : Czech locale
 - - linguas_fr : French locale
 - - multicall  : Build the most commonly used tools as one binary

Может быть стоит включить multicall? Или оставить выключенным? Ответ я нашёл в рассылке gentoo-user@lists.gentoo.org. Автор письма провёл эксперимент и сделал выводы:

I found the individual binaries a little larger (92K) than the multicall one (83K).
I don’t think this USE flag is useful enough, in the general case, to bother messing with.

Иногда USE-флаг становится понятен только после сборки пакета. Что будет если собрать vlc без qt4? Он будет показывать видео, но никакого интерфейса вы не получите (прогрессбар, кнопочки, меню — вот это всё). Кстати, vlc — это пример пакета с большим количеством USE-флагов:

vas@gentoo$ equery uses vlc
[ Legend : U - final flag setting for installation]
[        : I - package is installed with flag     ]
[ Colors : set, unset                             ]
 * Found these USE flags for media-video/vlc-2.2.1-r1:
 U I
 + + X                 : Enables support for, e.g., fullscreen mode via the X Window System. By itself, this flag does not build a graphical interface.
 - - a52               : Enable support for decoding ATSC A/52 streams used in DVD
 - - aalib             : Add support for media-libs/aalib (ASCII-Graphics Library)
 + + alsa              : Add support for media-libs/alsa-lib (Advanced Linux Sound Architecture)
 - - atmo              : Enables support for AtmoLight (homebrew Ambient Lighting Technology)
 - - audioqueue        : Enables AudioQueue audio module for Mac OS X.
 + + avcodec           : Enables libavcodec support for video/audio encoding/decoding. libavcodec is part of FFmpeg.
 + + avformat          : Enables libformat support for reading and writing various media containers. libavformat is part of FFmpeg.
 - - bidi              : Enable bidirectional language support
 - - bluray            : Enables libbluray for Blu-ray disc support.
 - - cdda              : Add Compact Disk Digital Audio (Standard Audio CD) support
 - - cddb              : Access cddb servers to retrieve and submit information about compact disks
 - - chromaprint       : Enables libchromaprint for Chromaprint based audio fingerprinter support.
 + + cpu_flags_x86_mmx : Use the MMX instruction set
 + + cpu_flags_x86_sse : Use the SSE instruction set
 - - dbus              : Enable dbus support for anything that needs it (gpsd, gnomemeeting, etc)
 - - dc1394            : Enables IIDC cameras support.
 - - debug             : Enable extra debug codepaths, like asserts and extra output. If you want to get meaningful backtraces see https://wiki.gentoo.org/wiki/Project:Quality_Assurance/Backtraces
 - - directfb          : Add support for DirectFB layer (library for FB devices)
 - - dts               : Enable DTS Coherent Acoustics decoder support
 - - dvb               : Add support for DVB (Digital Video Broadcasting)
 + + dvbpsi            : Enables support for Mpeg-TS files (.ts, .m2ts, .mts) via media-libs/libdvbpsi.
 - - dvd               : Add support for DVDs
 + + encode            : Add support for encoding of audio or video files
 - - faad              : Enable AAC audio decoding library support via media-libs/faad2.
 - - fdk               : Enables the Fraunhofer AAC codec library.
 + + ffmpeg            : Enable ffmpeg/libav-based audio/video codec support
 + + flac              : Add support for FLAC: Free Lossless Audio Codec
 - - fluidsynth        : Enables Fluidsynth MIDI software synthesis (with external sound fonts).
 - - fontconfig        : Support for configuring and customizing font access via media-libs/fontconfig
 + + gcrypt            : Enables cryptography support via libgcrypt.
 - - gme               : Enables support for media-libs/game-music-emu for playing various video game music formats.
 - - gnome             : Adds support for GNOME's filesystem abstraction layer, gnome-base/gnome-vfs. This flag is not GUI-related.
 - - gnutls            : Add support for net-libs/gnutls (TLS 1.0 and SSL 3.0 support)
 - - growl             : Enables growl notification support (over UDP for remote access and native on OSX)
 - - httpd             : Enables a web based interface for vlc.
 - - ieee1394          : Enable FireWire/iLink IEEE1394 support (dv, camera, ...)
 + + jack              : Add support for the JACK Audio Connection Kit
 + + jpeg              : Add JPEG image support
 - - kate              : Adds support for Ogg Kate subtitles via libkate.
 - - kde               : Add support for KDE (K Desktop Environment)
 - - libass            : SRT/SSA/ASS (SubRip / SubStation Alpha) subtitle support
 - - libav             : Prefer libav over ffmpeg whenever both are supported
 - - libcaca           : Add support for colored ASCII-art graphics
 - - libnotify         : Enable desktop notification support
 + + libsamplerate     : Build with support for converting sample rates using libsamplerate
 - - libtar            : Uses libtar instead of the built-in tar reader for reading custom skins.
 - - libtiger          : Enables Ogg Kate subtitles rendering using libtiger.
 - - linsys            : Enables support for Linux Linear Systems Ltd. SDI and HD-SDI input cards.
 - - lirc              : Add support for lirc (Linux's Infra-Red Remote Control)
 - - live              : Enables live555 streaming media support (client support for rtsp).
 - - lua               : Enable Lua scripting support, needed for including support for Jamendo (online music platform) and similar things.
 - - matroska          : Enables matroska support using reference libraries (fallback on other existing matroska support if disabled, i.e., matroska enabled FFmpeg)
 - - modplug           : Add libmodplug support for playing SoundTracker-style music files
 + + mp3               : Add support for reading mp3 files
 - - mpeg              : Add libmpeg2 support for mpeg-1 and mpeg-2 video streams
 - - mtp               : Enable support for Media Transfer Protocol
 - - musepack          : Enable support for the musepack audio codec
 + + ncurses           : Add ncurses support (console display library)
 + + ogg               : Add support for the Ogg container format (commonly used by Vorbis, Theora and flac)
 - - omxil             : Enables OpenMAX Integration Layer codec module.
 - - opencv            : Enabled OpenCV (computer vision) filter module.
 - - opengl            : Add support for OpenGL (3D graphics)
 - - optimisememory    : Enable optimisation for memory rather than performance.
 + + png               : Add support for libpng (PNG images)
 + + postproc          : Enables image post-processing via libpostproc (part of FFmpeg).
 - - projectm          : Enables the projectM visualization plugin.
 - - pulseaudio        : Add support for PulseAudio sound server
 + + qt4               : (Restricted to >=media-video/vlc-0.9)
                         Builds a Qt4 based frontend, a graphical interface.
 - - qt5               : (Restricted to >=media-video/vlc-2.2)
                         Builds a Qt5 based frontend, a graphical interface.
 - - rdp               : Enables freerdp for RDP/Remote Desktop client support
 - - rtsp              : Enables real audio and RTSP modules.
 - - run-as-root       : Allows vlc to start for root. Don't enable this unless you have a very specific (e.g. embedded) need for it!
 - - samba             : Add support for SAMBA (Windows File and Printer sharing)
 - - schroedinger      : Enable Dirac video support (an advanced royalty-free video compression format) via libschroedinger (high-speed implementation in C of the Dirac codec).
 - - sdl               : Add support for Simple Direct Layer (media library)
 - - sdl-image         : Enables sdl image video decoder (depends on sdl)
 - - sftp              : Enables libssh2 to support SFTP file transfer.
 - - shout             : Enables libshout output.
 - - sid               : Adds support for playing C64 SID files through media-libs/libsidplay-2.
 - - skins             : Enables support for the skins2 interface.
 - - speex             : Add support for the speex audio codec (used for speech)
 + + svg               : Add support for SVG (Scalable Vector Graphics)
 + + swscale           : Enables image scaling and conversion via libswscale (part of FFmpeg).
 - - taglib            : Enable tagging support with taglib
 - - test              : Workaround to pull in packages needed to run with FEATURES=test. Portage-2.1.2 handles this internally, so don't set it in make.conf/package.use anymore
 - - theora            : Add support for the Theora Video Compression Codec
 - - tremor            : Enables tremor, a fixed-point version of the Ogg Vorbis decoder.
 - - truetype          : Add support for FreeType and/or FreeType2 fonts
 - - twolame           : Enables twolame support (MPEG Audio Layer 2 encoder).
 - - udev              : Enable virtual/udev integration (device discovery, power and storage device support, etc)
 - - upnp              : Enables support for the Intel SDK stack based UPnP discovery module instead of CyberLink.
 - - v4l               : Enable support for video4linux (using linux-headers or userspace libv4l libraries)
 - - vaapi             : Enable Video Acceleration API for hardware decoding
 - - vcdx              : Enables VCD with navigation via libvcdinfo (depends on cdio)
 - - vdpau             : Enable the Video Decode and Presentation API for Unix acceleration interface
 - - vlm               : New videolan (media) manager (vlm), a little manager designed to launch and manage multiple streams from within one instance of VLC.
 - - vnc               : Enable VNC (remote desktop viewer) support
 + + vorbis            : Add support for the OggVorbis audio codec
 - - vpx               : Enables the decoder(s) from the WebM VP8 / VP9 Codec SDK.
 - - wma-fixed         : Enables fixed point WMA decoder.
 + + x264              : Enable h264 encoding using x264
 + + x265              : Support X265 Encoder.
 + + xcb               : Support the X C-language Binding, a replacement for Xlib; !!! you will need this option to be able to integrate video in the Qt interface, see bug #500678.
 - - xml               : Add support for XML files
 - - xv                : Add in optional support for the Xvideo extension (an X API for video playback)
 - - zeroconf          : Support for DNS Service Discovery (DNS-SD)
 - - zvbi              : Enables support for teletext subtitles via the zvbi library.

Иногда выручает способ посмотреть ebuild. Ebuild — это файл, содержащий практически всю информацию о пакете: краткое описание, зависимости, правила конфигурирования и сборки, USE-флаги и т. п. Аналог в Arch Linux — PKGBUILD.

Что означает focused-urgency в rxvt-unicode?

vas@gentoo$ equery uses rxvt-unicode
[ Legend : U - final flag setting for installation]
[        : I - package is installed with flag     ]
[ Colors : set, unset                             ]
 * Found these USE flags for x11-terms/rxvt-unicode-9.21:
 U I
 + + 256-color            : Enable 256 color support
 - - alt-font-width       : Calculate the font width using a different method
 + + blink                : Enable blinking text
 + + buffer-on-clear      : Store visible output to history buffer when clearing the screen with ctrl-l. Read https://bbs.archlinux.org/viewtopic.php?id=129302
 + + fading-colors        : Enable colors fading when off focus
 + + focused-urgency      : Enable the urgent flag when a terminal window is focused
 + + font-styles          : Enable support for bold and italic fonts
 - - iso14755             : Enable ISO-14755 support
 + + mousewheel           : Enable scrolling via mouse wheel or buttons 4 and 5
 + + perl                 : Enable perl script support. You can still disable this at runtime with -pe ""
 - - pixbuf               : Enable transparency support using gtk's pixbuf
 + + secondary-wheel      : Support for wheel scrolling on secondary screens (like mutt). Read http://lists.schmorp.de/pipermail/rxvt-unicode/2011q4/001491.html
 + + startup-notification : Enable application startup event feedback mechanism
 - - unicode3             : Use 21 instead of 16 bits to represent unicode characters
 - - vanilla              : Do not add extra patches which change default behaviour; DO NOT USE THIS ON A GLOBAL SCALE as the severity of the meaning changes drastically
 - - wcwidth              : Enable wide char width support
 - - xft                  : Build with support for XFT font renderer (x11-libs/libXft)

Находим ебилд пакета и замечаем в функции src_prepare():

/usr/portage/x11-terms/rxvt-unicode/rxvt-unicode-9.21.ebuild
# bug #240165
use focused-urgency || epatch "${FILESDIR}"/${PN}-9.06-no-urgency-if-focused.diff

Во-первых есть отсылка на багтрекер. Во-вторых видна логика: если включен флаг focused-urgency, то ничего не делать, иначе наложить патч no-urgency-if-focused.diff. Переменная $PN означает “package name”.

А вот пример флага, который поставил меня в тупик. Должен ли media-libs/tiff уметь jpeg? Всё началось с утилиты feh, которой требуется библиотека imlib2:

vas@gentoo$ qdepends feh
media-gfx/feh-2.9.3: >=media-libs/giblib-1.2.4 media-libs/imlib2[X] >=media-libs/libpng-1.2:0 x11-libs/libX11 media-libs/libexif x11-libs/libXt x11-proto/xproto

vas@gentoo$ equery uses imlib2
[ Legend : U - final flag setting for installation]
[        : I - package is installed with flag     ]
[ Colors : set, unset                             ]
 * Found these USE flags for media-libs/imlib2-1.4.6-r2:
 U I
 + + X           : Add support for X11
 - - abi_x86_32  : 32-bit (x86) libraries
 - - bzip2       : Use the bzlib compression library
 - - doc         : Add extra documentation (API, Javadoc, etc). It is recommended to enable per package instead of globally
 + + gif         : Add GIF image support
 + + jpeg        : Add JPEG image support
 + + mp3         : Add support for reading mp3 files
 + + nls         : Add Native Language Support (using gettext - GNU locale utilities)
 + + png         : Add support for libpng (PNG images)
 - - static-libs : Build static versions of dynamic libraries as well
 + - tiff        : Add support for the TIFF image format
 - - zlib        : Add support for zlib (de)compression

Я не нашёл утилиты, которая показывает влияние USE-флагов на зависимости пакета, поэтому полез прямо в ебилд. В переменной RDEPEND прописываются рантайм-зависимости (а не reverse, как вы могли подумать):

/usr/portage/media-libs/imlib2/imlib2-1.4.6-r2.ebuild
RDEPEND="=media-libs/freetype-2*[${MULTILIB_USEDEP}]
        bzip2? ( >=app-arch/bzip2-1.0.6-r4[${MULTILIB_USEDEP}] )
        zlib? ( >=sys-libs/zlib-1.2.8-r1[${MULTILIB_USEDEP}] )
        gif? ( >=media-libs/giflib-4.1.6-r3[${MULTILIB_USEDEP}] )
        png? ( >=media-libs/libpng-1.6.10:0[${MULTILIB_USEDEP}] )
        jpeg? ( >=virtual/jpeg-0-r2:0[${MULTILIB_USEDEP}] )
        tiff? ( >=media-libs/tiff-4.0.3-r6:0[${MULTILIB_USEDEP}] )
        X? (
                >=x11-libs/libX11-1.6.2[${MULTILIB_USEDEP}]
                >=x11-libs/libXext-1.3.2[${MULTILIB_USEDEP}]
        )
        mp3? ( >=media-libs/libid3tag-0.15.1b-r3[${MULTILIB_USEDEP}] )"

Отсюда мы делаем вывод, что jpeg работает через virtual/jpeg-0-r2, tiff через media-libs/tiff-4.0.3-r6. Ок, включаем флаг tiff и смотрим USE-флаги соответствующего пакета:

vas@gentoo$ equery uses media-libs/tiff
[ Legend : U - final flag setting for installation]
[        : I - package is installed with flag     ]
[ Colors : set, unset                             ]
 * Found these USE flags for media-libs/tiff-4.0.3-r6:
 U I
 - - abi_x86_32  : 32-bit (x86) libraries
 + + cxx         : Build support for C++ (bindings, extra libraries, code generation, ...)
 - - jbig        : Enable jbig-kit support for tiff, Hylafax, ImageMagick, etc
 + + jpeg        : Add JPEG image support
 + + lzma        : Support for LZMA (de)compression algorithm
 - - static-libs : Build static versions of dynamic libraries as well
 - - test        : Workaround to pull in packages needed to run with FEATURES=test. Portage-2.1.2 handles this internally, so don't set it in make.conf/package.use anymore
 + + zlib        : Add support for zlib (de)compression

А здесь зачем jpeg? Опять смотрим ебилд:

/usr/portage/media-libs/tiff/tiff-4.0.3-r6.ebuild
RDEPEND="jpeg? ( >=virtual/jpeg-0-r2:0=[${MULTILIB_USEDEP}] )
        jbig? ( >=media-libs/jbigkit-2.1:=[${MULTILIB_USEDEP}] )
        lzma? ( >=app-arch/xz-utils-5.0.5-r1:=[${MULTILIB_USEDEP}] )
        zlib? ( >=sys-libs/zlib-1.2.8-r1:=[${MULTILIB_USEDEP}] )
        abi_x86_32? (
                !<=app-emulation/emul-linux-x86-baselibs-20130224-r9
                !app-emulation/emul-linux-x86-baselibs[-abi_x86_32(-)]
        )"

и видим, что библиотека tiff будет использовать тот же virtual/jpeg, что и imlib2, если включить соответствующий USE-флаг. Ладно, пусть будет.

USE-флагов слишком много. Установка пакета, богатого USE-флагами, с кучей зависимостей может привести в уныние. Чтобы понять смысл USE-флагов приходится разбираться как работает та или иная программа (тот же vlc). В принципе можно особо не заморачиваться и поставить как есть, но тогда какой смысл использовать Gentoo?

USE-флагов слишком мало. Я ожидал увидеть большой список флагов в крупных программах, таких как Gimp, Chromium, Firefox, Libreoffice, чтобы тонко подстроить их под себя, поотключать лишнее. Фигушки. В Chromium даже нельзя отключить accessability — специальные фичи для слепых и глухих пользователей.

Другой пример. Dmenu имеет множество дополнительных патчей (поддержка Xft шрифтов, fuzzy-матчинг, поддержка мыши, произвольное положение на экране и др.), которые я ожидал увидеть в USE-флагах, но нет.

vas@gentoo$ equery uses x11-misc/dmenu
[ Legend : U - final flag setting for installation]
[        : I - package is installed with flag     ]
[ Colors : set, unset                             ]
 * Found these USE flags for x11-misc/dmenu-4.5-r3:
 U I
 - - xft      : Enable unofficial x11-libs/libXft support
 - - xinerama : Add support for the xinerama X11 extension, which is mandatory if you work in multiple monitors setup

Установка системы

Процесс установки ОС автоматизирован примерно так же, как в Arch Linux, т. е. никак. Мы загружаемся с live-системы без иксов, через консольный браузер выкачиваем архив для распаковки в корневую ФС будущей системы (stage3 tarball) и производим первичную настройку из chroot-окружения. Руководство по установке (тот самый хэндбук) достаточно подробное, все шаги хорошо описаны. Главное — не сходить с тропы.

Слишком много ручной работы. Дело не в компиляции всего из исходников. С ней проблем нет, она выполняется автоматически. Её можно запустить на ночь или в пониженном приоритете. Нет, проблема в другом. Слишком много приходится углубляться во внутренний мир ОС и софта. Какие опции ядра надо включить, чтобы что-нибудь заработало (или перестало работать)? Какие прописать ключи компилятора? Какие дополнительные наборы инструкций поддерживает мой процессор? Какой крон выбрать? Какой конфигурационный файл portage мне сейчас нужен? Как заставить работать wi-fi адаптер? Ок, название драйвера выяснили. А какая ему нужна прошивка (firmware)?

Я застрял на драйверах для железа Lenovo x200s примерно на неделю. Две-три первых версии самосборного ядра отказывались видеть жёсткий диск без начального рам-диска (initrd). Статейка на хабре и команды в помощь:

root@gentoo# lspci -vk
vas@gentoo$ lsmod
vas@gentoo$ modinfo ИМЯ_МОДУЛЯ

Тем не менее сконфигурировать и собрать ядро для своей машины — это круто! Идёшь ты по хэндбуку, делаешь всё по инструкции, и тут бац — и собери себе ядро!

Управление пакетами

Очень понравилось понятие “мира” (world). Это список пакетов, которые вам нужны в системе. Ни в арче, ни в Debian-based дистрибутивах такой штуки нет. Все установленные пакеты в системе — это пакеты из списка world, пакеты из списка system и их зависимости. Благодаря world’у очень легко поддерживать систему в чистоте.

Неожиданно классная цветная консоль и подробный вывод у emerge. Так выглядит обновление системы:

root@gentoo# emerge -NuDa --with-bdeps=y world

These are the packages that would be merged, in order:

Calculating dependencies... done!
[ebuild     U  ] media-libs/libpng-1.6.19 [1.6.18]
[ebuild   R    ] sys-apps/busybox-1.23.1-r1  USE="-pam*"
[ebuild     U  ] sys-apps/less-481 [478]
[ebuild   R    ] media-libs/lcms-2.6-r1  USE="tiff*"
[ebuild   R    ] media-libs/libwebp-0.4.0  USE="tiff*"
[ebuild     U  ] app-misc/colordiff-1.0.15-r1 [1.0.13-r1]
[ebuild     U  ] dev-perl/IO-Socket-SSL-2.12.0 [1.967.0]
[ebuild     U  ] dev-libs/nspr-4.10.10 [4.10.8]
[ebuild  N     ] dev-lang/tcl-8.5.17  USE="threads -debug" ABI_X86="(64) -32 (-x32)"
[ebuild     U  ] app-admin/sudo-1.8.15-r1 [1.8.12]
[ebuild     U  ] dev-lang/python-2.7.10-r1 [2.7.10]
[ebuild     U  ] dev-libs/nss-3.20.1 [3.20]
[ebuild   R    ] www-client/links-2.8-r1  USE="tiff*"
[ebuild     U  ] net-misc/openssh-7.1_p1-r2 [6.9_p1-r2] USE="(-libressl)"
[ebuild     U  ] dev-libs/libxml2-2.9.2-r4 [2.9.2-r1]
[ebuild  N     ] dev-libs/libnatspec-0.2.6-r1  USE="python -doc" PYTHON_TARGETS="python2_7"
[ebuild   R    ] dev-util/boost-build-1.56.0  USE="python*"
[ebuild   R    ] app-arch/unzip-6.0-r3  USE="natspec*"
[ebuild     U  ] dev-libs/libxslt-1.1.28-r5 [1.1.28-r4] USE="-examples%"
[ebuild   R    ] app-arch/zip-3.0-r3  USE="natspec*"
[ebuild   R    ] media-libs/imlib2-1.4.6-r2  USE="tiff*"
[ebuild     U  ] dev-python/simplejson-3.8.1 [3.7.2] PYTHON_TARGETS="(-python3_5)"
[ebuild     U  ] dev-python/six-1.10.0 [1.9.0-r1] PYTHON_TARGETS="(-python3_5)"
[ebuild   R    ] dev-python/ipaddress-1.0.14  PYTHON_TARGETS="(-python3_3%) (-python3_4%*)"
[ebuild     U  ] dev-python/html5lib-0.9999999 [0.99999] PYTHON_TARGETS="(-python3_5)"
[ebuild  N     ] virtual/python-ipaddress-1.0  PYTHON_TARGETS="python2_7 python3_4 (-pypy) (-pypy3) -python3_3 (-python3_5)"
[ebuild     U  ] dev-libs/glib-2.44.1-r1 [2.44.1]
[ebuild     U  ] dev-libs/libcroco-0.6.9 [0.6.8-r1]
[ebuild   R    ] x11-libs/gdk-pixbuf-2.32.1  USE="tiff*"
[ebuild     U  ] x11-libs/pango-1.36.8-r1 [1.36.8] USE="{-test%}"
[ebuild     U  ] dev-util/gtk-update-icon-cache-3.16.7 [3.16.5]
[ebuild     U  ] gnome-base/librsvg-2.40.11 [2.40.10]
[ebuild   R    ] dev-qt/qtgui-4.8.6-r4  USE="tiff*"
[ebuild     U  ] media-video/vlc-2.2.1-r1 [2.1.5-r1] USE="jpeg%* libsamplerate* x265%* -qt5% -vpx% -zeroconf%"
[ebuild     U  ] www-client/firefox-38.4.0 [38.3.0]
[ebuild     U  ] www-client/chromium-46.0.2490.86 [46.0.2490.71]

Would you like to merge these packages? [Yes/No]

Шпаргалка по буквам:

N — new (not yet installed)
S — new SLOT installation (side-by-side versions)
U — updating (to another version)
D — downgrading (best version seems lower)
R — replacing (re-merging same version)
F — fetch restricted (must be manually downloaded)
f — fetch (already downloaded)
B — blocked by an already installed package

Вывод очень информативный, такого я нигде ранее не встречал. Видны все изменения USE-флагов, текущая и устанавливаемая версия пакета. Пакеты из world подсвечены светло-зелёным. Очень наглядно!

Довольно запутанный конфиг у emerge в сравнении с apt в Debian или pacman в Arch, дофига конфигурационных файлов. Общие USE-флаги прописываются в /etc/portage/make.conf. USE-флаги для пакетов прописываются в /etc/portage/package.use. Также есть package.mask, package.unmask, package.accept_keywords, какие-то профили…

В Gentoo очень много цвета в консоли. Есть подсветка в nano и vim для конфигурационных файлов portage — приятно.

Много утилит на букву e: equery, emerge, eselect, eix, ebuild, euse. Но layman. Не меньше утилит на букву q: quse, quickpkg, qmerge, qlist, qlop, qcache, qdepends, qgrep, qpkg, qsize, qcheck, qfile, qsearch. Есть специальные утилиты для чтения логов qlop и elogv; eclean для очистки кэша пакетов. На каждый чих найдётся своя поделка.

Оптимизация под железо

А ничего особенного в CFLAGS нет. Ничего супер-навороченного.

/etc/portage/make.conf
CFLAGS="-march=native -O2 -pipe"

Всякие приплюхи процессора, такие как SSE, SSE2, MMX почти нигде не используются. Среди пакетов, установленных у меня, только в vlc есть поддержка расширенного набора инструкций процессора. И видимо его придётся пересобрать, потому что на некоторых видео появляются артефакты. А в арче всё норм.

Документация

С первого взгляда складывается приятное впечатление от Gentoo Wiki: современный дизайн, выполненный в единой цветовой гамме, веб-шрифты, всевозможные иконочки. Наглядно видно какую команду следует выполнять от рута, а какую от обычного юзера. Если надо что-то в файле прописать или конфиг ядра подкрутить, то это тоже очень наглядно.

Вот только сама по себе документация скудновата. Её просто мало. За что я люблю вики в арче — в ней есть всё, что надо знать по данной теме. Возьмём для сравнения стараницы о wicd в Gentoo и Arch.

В Gentoo примерно треть страницы занимает бесполезная таблица с USE-флагами пакета. Весь этот список я могу получить одной командой, примеры вы видели выше. Дальше приведена команда установки пакета. Ценность её спорная. Раз уж я дошёл до установки пакетов в Gentoo, значит я установил систему, т. е. читал хэндбук и знаю как устанавливать, обновлять и удалять пакеты.

Дальше указано что надо включить в ядре, чтобы wicd заработал. Это очень полезная инфа. Есть ещё скромный раздел по конфигурированию, два пункта в Troubleshooting и всё.

В арчвики шрифт более мелкий и плотность текста выше, и всё равно страница больше!

Arch — сложный дистрибутив. Но эта сложность компенсируется хорошей документацией. Gentoo ещё сложнее (в значении complex, а не difficult). Но эта сложность не компенсируется богатой документацией. Она видимо компенсируется упорством гентушника.

Интересно что есть gentoo-wiki.info — архивы какой-то старой вики. Подозреваю что не всё это присутствует в новой. Непорядок.

Выводы

  • На удивление правдивая статья про Gentoo в луркморе.

  • Чтобы поставить Gentoo на десктоп или ноутбук и добиться идеальной работы, придётся хорошенько потрахаться. Возможно вам это понравится. Я же вернусь на Arch на ноутбуке. Сервачок останется на Gentoo.

  • Gentoo требует внимания. Приготовьтесь уделять ему время.

  • Критически относитесь к Gentoo в продакшене, даже если вы (или ваш админ) знаете все тонкости Gentoo и не видите сложностей в поддержке. Кто будет поддерживать систему в ваше отсутствие или после вас? С другой стороны, если ОС нужна только для того, чтобы в ней работали ssh и nginx и ничего более, то почему нет?

  • Gentoo стоит попробовать для общего развития, посмотреть что как бывает по-другому. Познакомиться ближе с ядром и модулями, пособирать софт из исходников, погонять бенчмарки. Just for fun!

  • Выигрыш от оптимизации под железо несущественный, не стоит надеяться на него. Лучше пересмотрите свой стэк технологий, замените приложения на более лёгкие. Поставьте SSD, добавьте памяти или полностью смените железо. Но не ставьте Gentoo с надеждой поднять производительность.

  • Установленная система Gentoo не занимает меньше места, чем эквивалентная на Arch Linux. Даже если выключить все лишние USE-флаги в пакетах и драйвера в ядре. Эти оптимизации — ничто по сравнению с весом сборочных зависимостей и деревом portage.

  • Из-за сборки пакетов из исходников вы не сможете оперативно доустановить/обновить необходимый софт.

Я ещё хотел написать про установку сторонних пакетов (layman), установку старых или нестабильных версий пакетов. Не всё там так гладко, как хотелось бы.