Привет, Хабр! Меня зовут Антон, я старший менеджер региональных проектов в Selectel. В этой статье я бы хотел рассказать про Gentoo Linux: особенности установки ОС и работы с ней.

Идея материала родилась неожиданно. Мне потребовалась очередная виртуальная машина для достаточно банальной вещи — VPN в РФ. Я начал делать виртуальную машину в панели управления Selectel, и на стадии выбора ОС мне захотелось поэкспериментировать. Не использовать вполне стандартные Debian/Ubuntu, а запустить свой сервер с Gentoo Linux, который не поставить «из коробки».

Далее я решил описать свой опыт, чтобы упростить жизнь пользователям Linux и всем причастным.

Ода Gentoo Linux


Операционная система создавалась в начале 2000-х годов, когда еще не было современных мощностей и оптимизация действительно играла большую роль в быстродействии программного обеспечения. Тесты показали, что если собрать всю ОС под конкретную платформу из исходников, а не из бинарных сборок, то прирост производительности будет 10-20%. Поэтому возникла идея сделать дистрибутив, который собирается полностью из исходников. При этом сборка не превращалась бы в настоящее испытание, как в случае с Linux From Scratch. Так был придуман Gentoo Linux.

Кстати, само название дистрибутива намекает на быстродействие. Он был назван в честь самых скоростных пингвинов Pygoscelis papua, которые могут развивать скорость в воде до 36 км/ч.

Ключевые особенности Gentoo


  • Удобная система пакетов Portage, которая напоминает порты во FreeBSD.
  • Gentoo работает на практически любой архитектуре, на которой можно собрать Linux.
  • Уникальный патчсет для всего дерева Portage, включая ядро (большинство патчей на ядро — багфиксы и устранение уязвимостей).
  • Gentoo достаточно безопасная система, ничем не хуже Debian. По крайней мере, если вы используете стабильные пакеты.
  • Операционная система хорошо документирована, в интернете есть Handbook, собственная вики и множество сторонних мануалов.

К сожалению, есть один существенный минус: установка и/или обновление операционной системы — зачастую трудоемкая и нетривиальная задача, особенно если целевая ОС у вас в продакшене.

С тех пор много воды утекло, но Gentoo Linux осталась притчей во языцех у многих сисадминов. Ранее использование подобной ОС было некоторым статусом среди админов. Кто-то подшучивал и сравнивал гентушников с самураями, кто-то обзывал их «красноглазиками» за бессонные ночи. Однако некоторые компании до сих пор используют Gentoo в коммерческой эксплуатации.

Лично я познакомился с этой операционной системой в далеком 2006-м году, когда впервые устроился работать в дата-центр. В первый же рабочий день мне досталась задача установить Gentoo на клиентский выделенный сервер. Коллеги мне так и сказал: «Вот и проверим тебя». Не с первой попытки, но я справился. Операционная система мне понравилась, и с тех пор я ее использую для личных целей: на домашнем сервере в качестве роутера и NAS, на ноутбуке в dualboot и на виртуальных машинах в облаке Selectel.

Коммерческое использование


Сейчас дистрибутив больше используются в DIY-проектах, например, помните видео с мультитач-гитарой и Gentoo Linux внутри? Почувствуйте себя старыми — этому видео 13 лет. Или все эти случаи запусков DOOM на необычных устройствах? Но если посмотреть рынок труда, знание Gentoo требуют достаточно часто до сих пор.

Коммерческое использование Gentoo в каком-то смысле стало нишевой историей. С одной стороны, на ней базируется ChromeOS. Но таких проектов немного. С другой — развитие технологий почти вывело из пользования устройства с ограниченными ресурсами. Здесь можно выделить две сферы, в которых все еще сохраняется чувствительность к железу.

  • Gamedev, в особенности онлайн-игры. Здесь разработчикам часто приходится управлять большим парком серверов и периодически обновлять пакеты. Например, Gentoo используется, чтобы компилить stage4 и разливать по однотипным машинам. Так компании получают сетап свежего железа за пару минут.
  • Умные устройства, в особенности квадрокоптеры. С IoT и прочей подобной техникой, которая откликается на команды, собирает и конвертирует данные есть сложность — форм-фактор. В устройство, особенно, когда оно в воздухе, не добавить ресурсов, поэтому приходится работать с тем, что есть, и Gentoo как раз помогает учитывать разницу в температуре по больнице.

Чтобы сократить путь от желания потестить Gentoo до запуска, рассмотрим инструкцию, которая поможет вам сэкономить время и не перегореть до запуска.

Как установить Gentoo Linux на виртуальный сервер


Я попробовал составить инструкцию, с которой можно установить ОС Gentoo из stage3 путем простого copypaste практически каждой указанной в статье команды.

Подготовка


Создаем виртуальную машину произвольной конфигурации. ОС — любая, я предпочитаю Debian, поэтому в данном мануале будет несколько команд именно из Debian.


В панели управления облаком Selectel создаем новый диск размером минимум 6 ГБ и подключаем к виртуальной машине. Именно на этом диске будет корневой раздел вашей будущей Gentoo. Диск определится как /dev/sdb.

Почему именно 6 ГБ? На меньшем объеме у вас не хватит места для сборки ОС: нужно обновить portage, скомпилировать ядро и так далее. Напоминаю, что мы устанавливаем Gentoo Linux с OpenRC.


Установка операционной системы


Подготовьте Debian:

apt-get update
apt-get install xz-utils

Создайте одну primary партицию на весь /dev/sdb:

fdisk /dev/sdb

Создаем файловую систему (для примера ext4, но выбор зависит от ваших вкусов):

mkfs.ext4 /dev/sdb1
e2label /dev/sdb1 gentoo-root

Монтируем наш новый раздел:

mount /dev/sdb1 /mnt/gentoo

Скачиваем stage3:

wget http://<mirror URL>/stage3-<xxxxxx>.tar.xz

Распаковываем stage3 в наш будущей корень:

tar -xJvf stage3-<xxxxx>.tar.xz -C /mnt/gentoo

Монтируем служебные файловые системы для будущей работы в chroot:

mount -t proc /proc /mnt/gentoo/proc
mount –-rbind /sys /mnt/gentoo/sys
mount --make-rslave /mnt/gentoo/sys
mount --rbind /dev /mnt/gentoo/dev
mount --make-rslave /mnt/gentoo/dev
mount --bind /run /mnt/gentoo/run
mount --make-slave /mnt/gentoo/run

Копируем настройки DNS:

cp /etc/resolv.conf /mnt/gentoo/etc/resolv.conf

Делаем chroot в наш новый корень:

chroot /mnt/gentoo /bin/bash
source /etc/profile 

Ура, теперь можно использовать наши привычные инструменты для сборки ОС. Первым делом установите пароль root: passwd

Настраиваем rsync на использование по умолчанию адресов ipv4:

nano -w /etc/conf.d/rsyncd

RSYNC_OPTS="-4"

Обновите portage:

emerge —-sync

Установите профиль ОС (можно оставить по умолчанию):

eselect profile list
eselect profile set X

nano -w /etc/portage/make.conf

Выставляем общие флаги компилятора:

COMMON_FLAGS="-O2 -pipe -march=native -mtune=native"

Про march=native и mtune=native есть важное замечание. В облаке Selectel ваша виртуальная машина работает на определенном хосте с процессорами — например, Intel Xeon Gold 6240. Виртуальная машина покинет этот хост только в том случае, если физический сервер выйдет из строя по каким-то причинам и виртуальные машины будут размигрированы по другим хостам. В подавляющем большинстве случаев ваша машина мигрирует на аналогичный хост с такой же конфигурацией оборудования, то есть вы получите тот же Xeon Gold 6240, скорее всего, даже из той же партии.

Есть мизерный шанс, что вас размигрируют на другой процессор. Приятный бонус — миграция только на более новый и/или мощный сервер.

Миграцию с Intel Xeon Gold 6240 в E5-2670 или в AMD Epyc Selectel никогда не инициирует. Но если вы создадите образ машины и захотите запустить его в более старом пуле — вас может постигнуть фиаско.

Указываем CPU_FLAGS компилятору:

emerge -1v app-portage/cpuid2cpuflags
echo "*/* $(cpuid2cpuflags)" > /etc/portage/package.use/00cpu-flags

Именно флаги компилятору и делают всю магию с быстродействием. Установим часовой пояс:

echo "Europe/Moscow" > /etc/timezone
emerge --config sys-libs/timezone-data

Настраиваем сеть:

nano -w /etc/conf.d/net

dns_domain_lo="YOUR_DOMAIN"

config_eth0="192.168.0.2/24"
routes_eth0="default via 192.168.0.1"
dns_servers_eth0="188.93.16.19 188.93.17.19"

Обратите внимание, я использую адрес 192.168.0.2/24 для виртуальной машины. Вам нужно скопировать текущие сетевые настройки из Debian.

Включим автонастройку сети при запуске ОС:

ln -s /etc/init.d/net.lo /etc/init.d/net.eth0
rc-update add net.eth0 default

Устанавливаем ядро, загрузчик и SSH:

emerge -1v grub gentoo-sources openssh
rc-update add sshd default

Собираем ядро:

eselect kernel list
eselect kernel set 1
cd /usr/src/linux
lscpu (проверьте модель процессора)
make menuconfig

Я не буду описывать весь процесс сборки ядра, есть разные способы это сделать: можно полностью вручную, можно через genkernel, можно с initrd или без. Опишу наиболее простой вариант: монолитное ядро с минимальными требованиями для запуска.

На что следует обратить внимание


Выбор процессора

Processor type and features  --->
	Processor family  --->
(X) (Core 2/newer Xeon) для Intel
или 
(X) Opteron/Athlon64/Hammer/K8 для AMD

В ядро обязательно нужно включить драйверы VirtIO (как правило, по умолчанию включены):

Processor type and features  --->
    [*] Linux guest support --->
        [*] Enable Paravirtualization code
        [*] KVM Guest support (including kvmclock)
Device Drivers  --->
    [*] Virtio drivers  --->
        <*> PCI driver for virtio devices
    [*] Block devices  --->
        <*> Virtio block driver
    SCSI device support  --->
        [*] SCSI low-level drivers  --->
            [*] virtio-scsi support
    [*] Network device support  --->
        [*] Network core driver support
            <*> Virtio network driver
    Graphics support  --->
        <*> Virtio GPU driver /// А НАДО ЛИ????
    Character devices ---> 
       <*>   Hardware Random Number Generator Core support --->
           <*>   VirtIO Random Number Generator support

Без вышеуказанных драйверов вы просто не сможете загрузить сервер. В последних ядрах эти опции идут по умолчанию.

make -jX

Где X — количество ваших ядер.

make install && make modules_install

Устанавливаем загрузчик GRUB. Редактируем параметры загрузки:

nano -w /etc/default/grub

GRUB_CMDLINE_LINUX="net.ifnames=0"
GRUB_GFXPAYLOAD_LINUX=text

  • Первая строчка нужна, чтобы у нас были привычные наименования интерфейсов (eth0, eth1 и так далее).
  • Второй строкой мы сообщаем ядру, что в экран мы отдаем текст. Это нужно для работы консоли в панели управления Selectel.

grub-install /dev/sdb
grub-mkconfig > /boot/grub/grub.cfg

Добавляем корневой раздел в /etc/fstab:

blkid /dev/sdb1 | awk '{print $3" / ext4 noatime 0 2"}' >> /etc/fstab

Ура, мы завершили первичную сборку ОС.

Перезагрузка в новую ОС


Теперь в панели управления нужно сделать особую магию с дисками. У каждой ВМ может быть только один загрузочный диск, и это диск, который был первым подключен к ВМ. Нам нужно сделать наш новый диск с Gentoo загрузочным. Для этого выключаем ВМ и в разделе Диски отключаем все диски. Затем подключим первым диск с Gentoo, так он автоматически станет загрузочным.

Далее включаем ВМ. Если вы все сделали правильно и увидели, как ваша новая ОС загрузилась до логина, поздравляю, вы великолепны!

Затем вам за ненадобностью следует отключить и удалить ненужный вам более диск Debian и лишние ядра CPU. Далее вы знаете, что делать: подключаетесь к серверу по SSH и начинаете настоящий праздник — сборку вашего собственного мира.

emerge -v --update --deep --changed-use @world

Вместо послесловия


Никакой магии, только ловкость рук. В следующей статье мы расскажем вам, как сделать stage4 и оркестрировать Gentoo в облачной платформе Selectel.

Полезные материалы по теме


   

Комментарии (30)


  1. datacompboy
    31.08.2023 14:08
    +3

    нет, если ты знаешь Gentoo -- ты знаешь генту. Ну, может, немножко арч.

    А вот если ты знаешь LFS...


    1. kbu
      31.08.2023 14:08
      +2

      А зачем все это??? Просто чтобы убить время для тех у кого его очень много?


      1. datacompboy
        31.08.2023 14:08

        Чтобы знать как оно унутре.


        1. kbu
          31.08.2023 14:08
          +1

          О да… когда горит проект или надо запустить новый, самое то. Если ты студент и нечем заняться, не надо закрывать кредиты и кормить семью, можно и генту в облаке собрать. Но если есть инструменты, которые решают твои задачи и экономят время, то ответы очевидны. ИМХО


    1. kbu
      31.08.2023 14:08

      Рискую нарваться на нигатив, но ребята, Вам нечем заняться? Просто потому что много времени и могу? Ну ок…


  1. noize
    31.08.2023 14:08
    +1

    Вообще то изначально там речь была не про генту, а про слаку. Собрав и установив слаку ты познаешь Linux.


    1. arkultic
      31.08.2023 14:08

      Устанавливал не так давно 15 слаку, ничего сложного, похожа на фряху (псевдографика).


      1. garwall
        31.08.2023 14:08

        а в слаке нет ничего сложного. она проста как топор, и почти не использует дистрибутивно-специфичные вещи для управления и настройки. поэтому раньше полученный на оной опыт был переносим без проблем. сейчас, в системд-эру немножко все поменялось. (впрочем, пишу я это, конечно, со slackware)


  1. aegoroff
    31.08.2023 14:08
    +1

    Конечно можно стоя и в гамаке, но ... не понимаю чем тот же арч не угодил, если захотелось экспериментов - тоже конструктор, но бинарный (поэтому не надо ждать пока все соберется), отличная вики и море собранного и адаптированного софта. У коллеги даже на телефоне он стоит в качестве второй системы - все прекрасно работает.


    1. vonabarak
      31.08.2023 14:08
      +5

      В каждом треде про Генту обязательно есть хотя бы один завуалированный коммент "I use Arch, btw"


      1. aegoroff
        31.08.2023 14:08
        +2

        :) все так, правда у меня не совсем арч, а его производная - Manjaro (признаю - слаб духом пока :))


        1. TheGast
          31.08.2023 14:08
          +2

          Manjaro имба.+респект


    1. SamOwaR
      31.08.2023 14:08

      не понимаю чем тот же арч не угодил

      Например, понадобилась мне поддержка ARC в Exim, просто кровь из носу надо.
      И что, в арче с 2019 года висит открытый тикет с просьбой включить поддержку ARC.
      А в Gentoo добавил в USE, и пользуйся на здоровье, радуй жмейл сервера...


    1. 0xd34df00d
      31.08.2023 14:08

      тоже конструктор, но бинарный

      Мне не нужен bluetooth, wifi и pulseaudio, как выпилить в арче?


      А вот z3 в llvm/clang был бы полезен, тогда как в арче, судя по pkgbuild'ам, они собираются без z3. Как запилить в арче?


      (поэтому не надо ждать пока все соберется)

      На ryzen 9 7950 можно не ждать!


      1. aegoroff
        31.08.2023 14:08
        +1

        Мне не нужен bluetooth, wifi и pulseaudio, как выпилить в арче?

        а разве pacman -R pulseaudio и т.д. не работает?

        А вот z3 в llvm/clang был бы полезен, тогда как в арче, судя по pkgbuild'ам, они собираются без z3. Как запилить в арче?

        ну если очень надо можно свой pkgbuild (и соотв. сделать свой aur) запилить на основе существующего - это проще чем генту собирать

        На ryzen 9 7950 можно не ждать!

        да, но речь идет о виртуалке в облаке + не у всех такая железка есть + при выходе новых версий нужно постоянно все пересобирать - сомнительное удовольствие


        1. 0xd34df00d
          31.08.2023 14:08

          а разве pacman -R pulseaudio и т.д. не работает?

          А если у вас ваш аудиоплеер собран с выводом через пульсу, а не alsa, то что будет?


          ну если очень надо можно свой pkgbuild (и соотв. сделать свой aur) запилить на основе существующего — это проще чем генту собирать

          А чем генту собирать сложно? emerge и собрал.


          да, но речь идет о виртуалке в облаке

          А, ну это аргумент, да.


          1. aegoroff
            31.08.2023 14:08

            А если у вас ваш аудиоплеер собран с выводом через пульсу, а не alsa, то что будет?

            а вот не знаю - я такое сам не делал, только заменял пульсу на пайпвайр - вроде все работает нормально

            А чем генту собирать сложно? emerge и собрал.

            Сложно :) без специальных знаний. Это как за руль болида формулы один посадить обычного, пусть даже опытного водителя - он даже с места не сможет стронуться, не говоря уже про то, чтобы ехать.


            1. event1
              31.08.2023 14:08

              только заменял пульсу на пайпвайр

              Они совместимы по API если мне память не изменяет. А если у вас очень простая система, то аудио-сервер не нужен, можно работать поверх чистой alsa. Но если плеер собран без поддержки, то вилы.


  1. kt97679
    31.08.2023 14:08
    +1

    На всякий случай вот как я сконвертировал ubuntu в gentoo на бесплатном инстансе ораклового облака: https://habr.com/ru/articles/537452/


  1. slonopotamus
    31.08.2023 14:08

    А вот если бы вы взяли вместо селектела Linode, то там Gentoo сразу предлагают из коробки.


    1. litos
      31.08.2023 14:08

      В принципе не вижу причин селектелу не давать в облаке gentoo, разве что спрос, ведь большинство скорее всего ставит ubuntu и клоны rhel


      1. SamOwaR
        31.08.2023 14:08
        +1

        В принципе не вижу причин селектелу не давать в облаке gentoo

        Очень простая причина - это поддержка. Чем сложнее система, тем больше с ней будет проблем у пользователей, а значит больше времени (и денег) уйдёт на тех. поддержку. Убрав Gentoo из списка доступных образов, они просто повысили порог входа. У кого хватает опыта - тот и так поставит, настроит и не будет кошмарить суппорт.

        И это происходит не только в Selectel, например, Hetzner и OVH сделали точно так же.


  1. SamOwaR
    31.08.2023 14:08
    +3

    CPU_FLAGS .. Именно флаги компилятору и делают всю магию с быстродействием

    Эти флаги сделают манию только для довольно узко-специализированных вычислительных приложений. А вот если включить LTO добавив "-flto" в COMMON_FLAGS, то магия уже будет практически в каждой более-менее серьёзной программе.


    1. lorc
      31.08.2023 14:08

      Ага, главное чтобы памяти хватило :)


  1. gserge
    31.08.2023 14:08
    +1

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


  1. Aleho
    31.08.2023 14:08

    "путем простого copypaste" можно с таким же успехом устанавливать по офмануалу, подробно там все расписано и даже на русском есть.
    Как-то на самоизоляции собирал Генту на стареньком неттопе Асус, то всевозможные оптимизации особого прироста в быстродействии так и не принесли.


    1. litos
      31.08.2023 14:08

      Многое зависит от софта который там запускали. Например, стоит запустить веб-браузер и зайти на современные сайты - то увы, сразу становится грустно на старом железе


      1. Aleho
        31.08.2023 14:08

        Задумка была от обратного - подобрать максимально производительный дистрибутив и посмотреть какие задачи можно на это старое железо повесить.
        А веб-серфинг на старом железе - изначально грустная идея.


  1. Johan_Palych
    31.08.2023 14:08

    Распаковываем stage3 в наш будущей корень:
    tar -xJvf stage3-.tar.xz -C /mnt/gentoo

    Лучше быть ро́нином.
    Проверено временем и странствиями:
    tar xJpf stage3-amd64-openrc-.tar.xz --xattrs-include='.' --numeric-owner -C /mnt/gentoo

    Зачем стока буков?
    mkfs.ext4 -L gentoo-root /dev/sdb1

    apt install arch-install-scripts
    cp /etc/resolv.conf /mnt/gentoo/etc/resolv.conf
    arch-chroot /mnt/gentoo /bin/bash


  1. event1
    31.08.2023 14:08

    Тесты показали, что если собрать всю ОС под конкретную платформу из исходников, а не из бинарных сборок, то прирост производительности будет 10-20%

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