Привет, Хабр! Меня зовут Антон, я старший менеджер региональных проектов в 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)
noize
31.08.2023 14:08+1Вообще то изначально там речь была не про генту, а про слаку. Собрав и установив слаку ты познаешь Linux.
arkultic
31.08.2023 14:08Устанавливал не так давно 15 слаку, ничего сложного, похожа на фряху (псевдографика).
garwall
31.08.2023 14:08а в слаке нет ничего сложного. она проста как топор, и почти не использует дистрибутивно-специфичные вещи для управления и настройки. поэтому раньше полученный на оной опыт был переносим без проблем. сейчас, в системд-эру немножко все поменялось. (впрочем, пишу я это, конечно, со slackware)
aegoroff
31.08.2023 14:08+1Конечно можно стоя и в гамаке, но ... не понимаю чем тот же арч не угодил, если захотелось экспериментов - тоже конструктор, но бинарный (поэтому не надо ждать пока все соберется), отличная вики и море собранного и адаптированного софта. У коллеги даже на телефоне он стоит в качестве второй системы - все прекрасно работает.
SamOwaR
31.08.2023 14:08не понимаю чем тот же арч не угодил
Например, понадобилась мне поддержка ARC в Exim, просто кровь из носу надо.
И что, в арче с 2019 года висит открытый тикет с просьбой включить поддержку ARC.
А в Gentoo добавил в USE, и пользуйся на здоровье, радуй жмейл сервера...
0xd34df00d
31.08.2023 14:08тоже конструктор, но бинарный
Мне не нужен bluetooth, wifi и pulseaudio, как выпилить в арче?
А вот z3 в llvm/clang был бы полезен, тогда как в арче, судя по pkgbuild'ам, они собираются без z3. Как запилить в арче?
(поэтому не надо ждать пока все соберется)
На ryzen 9 7950 можно не ждать!
aegoroff
31.08.2023 14:08+1Мне не нужен bluetooth, wifi и pulseaudio, как выпилить в арче?
а разве pacman -R pulseaudio и т.д. не работает?
А вот z3 в llvm/clang был бы полезен, тогда как в арче, судя по pkgbuild'ам, они собираются без z3. Как запилить в арче?
ну если очень надо можно свой pkgbuild (и соотв. сделать свой aur) запилить на основе существующего - это проще чем генту собирать
На ryzen 9 7950 можно не ждать!
да, но речь идет о виртуалке в облаке + не у всех такая железка есть + при выходе новых версий нужно постоянно все пересобирать - сомнительное удовольствие
0xd34df00d
31.08.2023 14:08а разве pacman -R pulseaudio и т.д. не работает?
А если у вас ваш аудиоплеер собран с выводом через пульсу, а не alsa, то что будет?
ну если очень надо можно свой pkgbuild (и соотв. сделать свой aur) запилить на основе существующего — это проще чем генту собирать
А чем генту собирать сложно? emerge и собрал.
да, но речь идет о виртуалке в облаке
А, ну это аргумент, да.
aegoroff
31.08.2023 14:08А если у вас ваш аудиоплеер собран с выводом через пульсу, а не alsa, то что будет?
а вот не знаю - я такое сам не делал, только заменял пульсу на пайпвайр - вроде все работает нормально
А чем генту собирать сложно? emerge и собрал.
Сложно :) без специальных знаний. Это как за руль болида формулы один посадить обычного, пусть даже опытного водителя - он даже с места не сможет стронуться, не говоря уже про то, чтобы ехать.
event1
31.08.2023 14:08только заменял пульсу на пайпвайр
Они совместимы по API если мне память не изменяет. А если у вас очень простая система, то аудио-сервер не нужен, можно работать поверх чистой alsa. Но если плеер собран без поддержки, то вилы.
kt97679
31.08.2023 14:08+1На всякий случай вот как я сконвертировал ubuntu в gentoo на бесплатном инстансе ораклового облака: https://habr.com/ru/articles/537452/
slonopotamus
31.08.2023 14:08А вот если бы вы взяли вместо селектела Linode, то там Gentoo сразу предлагают из коробки.
litos
31.08.2023 14:08В принципе не вижу причин селектелу не давать в облаке gentoo, разве что спрос, ведь большинство скорее всего ставит ubuntu и клоны rhel
SamOwaR
31.08.2023 14:08+1В принципе не вижу причин селектелу не давать в облаке gentoo
Очень простая причина - это поддержка. Чем сложнее система, тем больше с ней будет проблем у пользователей, а значит больше времени (и денег) уйдёт на тех. поддержку. Убрав Gentoo из списка доступных образов, они просто повысили порог входа. У кого хватает опыта - тот и так поставит, настроит и не будет кошмарить суппорт.
И это происходит не только в Selectel, например, Hetzner и OVH сделали точно так же.
SamOwaR
31.08.2023 14:08+3CPU_FLAGS .. Именно флаги компилятору и делают всю магию с быстродействием
Эти флаги сделают манию только для довольно узко-специализированных вычислительных приложений. А вот если включить LTO добавив "-flto" в COMMON_FLAGS, то магия уже будет практически в каждой более-менее серьёзной программе.
gserge
31.08.2023 14:08+1Респект за упорство, но в целом выглядит как троллейбус из буханки. Когда ехать - проще взять какую-нибудь готовую убунту или дебиан и вперёд
Aleho
31.08.2023 14:08"путем простого copypaste" можно с таким же успехом устанавливать по офмануалу, подробно там все расписано и даже на русском есть.
Как-то на самоизоляции собирал Генту на стареньком неттопе Асус, то всевозможные оптимизации особого прироста в быстродействии так и не принесли.litos
31.08.2023 14:08Многое зависит от софта который там запускали. Например, стоит запустить веб-браузер и зайти на современные сайты - то увы, сразу становится грустно на старом железе
Aleho
31.08.2023 14:08Задумка была от обратного - подобрать максимально производительный дистрибутив и посмотреть какие задачи можно на это старое железо повесить.
А веб-серфинг на старом железе - изначально грустная идея.
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/sdb1apt install arch-install-scripts
cp /etc/resolv.conf /mnt/gentoo/etc/resolv.conf
arch-chroot /mnt/gentoo /bin/bash
event1
31.08.2023 14:08Тесты показали, что если собрать всю ОС под конкретную платформу из исходников, а не из бинарных сборок, то прирост производительности будет 10-20%
Рискну предположить, что сегодня больший выигрыш будет за счёт отсутствия в системе лишнего хлама и отключенных ненужных интеграций. Сама компиляция под целевую платформу даст прибавку только в некоторых приложениях.
datacompboy
нет, если ты знаешь Gentoo -- ты знаешь генту. Ну, может, немножко арч.
А вот если ты знаешь LFS...
kbu
А зачем все это??? Просто чтобы убить время для тех у кого его очень много?
datacompboy
Чтобы знать как оно унутре.
kbu
О да… когда горит проект или надо запустить новый, самое то. Если ты студент и нечем заняться, не надо закрывать кредиты и кормить семью, можно и генту в облаке собрать. Но если есть инструменты, которые решают твои задачи и экономят время, то ответы очевидны. ИМХО
kbu
Рискую нарваться на нигатив, но ребята, Вам нечем заняться? Просто потому что много времени и могу? Ну ок…