Обзор Gentoo Linux

Gentoo-Logo
Я долго не писал, потому-что тема, о которой пойдет речь в этой статье требует много времени. Gentoo довольно известный дистрибутив среди красноглазых пользователей. Почему? Пользуясь Gentoo, вы становитесь повелителем системы, которая как влажная глина готова принять любую форму, которую вы хотите, с любым функционалом, который вам нужен. Нужно только разбираться в ней. Вы собираете из исходников нужный вам софт включая или отключая зависимости от других пакетов с помощью USE флагов и тратите много времени на компиляцию программ. Поэтому gentoo-шники знают, что такое время. Во время обзора мы пропустим описание процедуры установки. Во-первых она много раз описана, а обзор такие системы получают не очень часто, во вторых — это тянет на текст размером на эту статью, в третьих ввиду отсутствия установщика, опыт и порядок установки у каждого может быть свой.

Portage

В первую очередь Gentoo известен тем, что это дистрибутив из исходников. Это даёт некоторые преимущества: вы можете изменять функционал пакета, избегать лишних зависимостей, оптимизировать компилируемый код, при этом жертвуете временем на установку ПО. Работает это так: читаются файлы из директории /etc/portagemake.conf и package.(use/license/accept_keyword), затем portage обращается в директорию /usr/portage, где присутствуют инструкции установки ПО.

/usr/portage — это дерево портежей, там находятся ebuild файлы, где находятся описание пакета и инструкции его сборки.
make.conf содержит настройки для сборки пакетов, например:
CFLAGS — флаги компилятора C
MAKEOPTS — флаги утилиты make
CXXFLAGS — флаги компилятора C++
USE — флаги, изменяющие параметры сборки и зависимости пакетов. В моём случае эта переменная выглядит так:
USE="bindist mmx sse sse2 qt4 qt3support opengl kde dbus policykit networkmanager"
PORTDIR — путь к дереву портажей.
DISTDIR — путь к папке, куда скачиваются исходники.
PKGDIR — путь к папке, куда скачиваются бинарные файлы.
LINGUAS — флаги, указывающие, какие языки должны поддерживаться скомпилированным ПО.
GENTOO_MIRRORS — зеркала.
SYNC — зеркала для синхронизации.

В make.conf могут быть флаги, предназначенные для конкретных пакетов, например:
INPUT_DEVICES — для указания устанавливаемых драйверов устройств ввода.
VIDEO_CARDS — для указания устанавливаемых драйверов видеокарт.

Синтаксис флагов, влияющих на конфигурацию сборки таков: через пробел перечисляются флаги. Если перед именем флага стоит минус, то его следует отключить, если нет, то его следует включить.

А что делать, если нужно поменять USE флаги у конкретного пакета? Для этого есть файл package.use, в котором, в каждой строчке указывается, как должны изменяться USE флаги у конкретного пакета. Выглядит строка так:
app-foo/bar flag1 flag2 -flag3
На этом примере мы у пакета app-foo/bar включили флаги flag1, flag2 и отключили flag3.
Аналогично устроены файлы package.license и package.accept_keyword.

Сколько времени займет установка Gentoo?

Вы потратите на это около суток. Если у вас компьютер гораздо мощнее моего, то полсуток. Опустим то время, которое вы потратите на то, чтобы разобраться с системой и настроить все подряд. В случае с Gentoo тут уместна шутка: «В linux вы можете настроить абсолютно все, и вы будете настраивать абсолютно все». В качестве приблизительного времени затраченного на установку системы можно взять время на пересборку мира и по оптимистическим прикидкам добавить два часа. А сколько времени займёт пересборка мира? На моей машине с Intel Celeron T3000 с двумя ядрами на частоте 1.8 GHz я с помощью утилиты time измерил время двух пересборок времени. Во время пересборки я не пользовался компьютером и завершил работу X-сервера и дисплейного менеджера, чтобы на время сборки не влияли процессы из окружающей среды. Пересборка мира происходила в чистой консоли.
Система пересобиралась с миром в таком составе(без зависимостей):
app-admin/sudo
app-benchmarks/sysbench
kde-base/kde-l10n
kde-base/kdebase-meta
kde-base/kdegraphics-meta
kde-base/kdemultimedia-meta
kde-misc/plasma-nm
net-misc/dhcpcd
net-misc/networkmanager
sys-boot/grub
sys-fs/ntfs3g
sys-kernel/genkernel
sys-kernel/gentoo-sources
www-client/firefox
www-plugins/adobe-flash
x11-base/xorg-drivers
x11-base/xorg-server

Время пересборки мира с флагом -O2: 16 часов 54 минуты 30 секунд.
Время пересборки мира с флагом -O2: 17 часов 36 минут 47.7 секунд.
Итого, по самым оптимистическим прогнозам на моей машине у вас на это уйдет около 19 часов.

Сравнительные тесты производительности

Возможно, вы хотите поставить Gentoo ради увеличения производительности. В этом случае не стоит ждать чуда, Gentoo следует ставить для того, чтобы в нем поиграться, а не ради объективного прироста скорости. Для того, чтобы оценить производительность Gentoo, я воспользовался синтетическим тестом sysbench, доступным, как в Gentoo, так и в Archlinux. В тестировании участвуют Archlinux и Gentoo в двух эпостасиях, один собран с флагом -O2, другой с флагом -O3. Оба собраны под мою архитектуру процессора. В Archlinux, по умолчанию, пакеты собраны с флагом оптимизации -O2. Надо сказать, что -O3 нигде не используют, потому что это дает нестабильный код и в системе могут возникать из-за этого косяки.
Обе системы тестировались по одинаковому сценарию:
sysbench --num-threads=3 --test=cpu --max-requests=100000 run
sysbench --num-threads=3 --test=memory run
sysbench --num-threads=3 --test=threads --max-requests=1000000 run
sysbench --num-threads=3 --test=mutex run

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

Archlinux
sysbench 0.4.12: multi-threaded system evaluation benchmark

Running the test with following options:
Number of threads: 3

Doing CPU performance benchmark

Threads started!
Done.

Maximum prime number checked in CPU test: 10000

Test execution summary:
total time: 70.6054s
total number of events: 100000
total time taken by event execution: 211.6264
per-request statistics:
min: 1.40ms
avg: 2.12ms
max: 18.09ms
approx. 95 percentile: 8.08ms

Threads fairness:
events (avg/stddev): 33333.3333/199.64
execution time (avg/stddev): 70.5421/0.01

sysbench 0.4.12: multi-threaded system evaluation benchmark

Running the test with following options:
Number of threads: 3

Doing memory operations speed test
Memory block size: 1K

Memory transfer size: 102400M

Memory operations type: write
Memory scope type: global
Threads started!
Done.

Operations performed: 104857600 (320179.60 ops/sec)

102400.00 MB transferred (312.68 MB/sec)

Test execution summary:
total time: 327.4962s
total number of events: 104857600
total time taken by event execution: 736.6757
per-request statistics:
min: 0.00ms
avg: 0.01ms
max: 20.04ms
approx. 95 percentile: 0.00ms

Threads fairness:
events (avg/stddev): 34952533.3333/392593.85
execution time (avg/stddev): 245.5586/0.10

sysbench 0.4.12: multi-threaded system evaluation benchmark

Running the test with following options:
Number of threads: 3

Doing thread subsystem performance test
Thread yields per test: 1000 Locks used: 8
Threads started!
Done.

Test execution summary:
total time: 309.9045s
total number of events: 1000000
total time taken by event execution: 928.5172
per-request statistics:
min: 0.49ms
avg: 0.93ms
max: 7.81ms
approx. 95 percentile: 1.62ms

Threads fairness:
events (avg/stddev): 333333.3333/8782.25
execution time (avg/stddev): 309.5057/0.01

sysbench 0.4.12: multi-threaded system evaluation benchmark

Running the test with following options:
Number of threads: 3

Doing mutex performance test
Threads started!
Done.

Test execution summary:
total time: 0.0328s
total number of events: 3
total time taken by event execution: 0.0843
per-request statistics:
min: 25.38ms
avg: 28.11ms
max: 30.21ms
approx. 95 percentile: 10000000.00ms

Threads fairness:
events (avg/stddev): 1.0000/0.00
execution time (avg/stddev): 0.0281/0.00

Gentoo -O2
sysbench 0.4.12: multi-threaded system evaluation benchmark

Running the test with following options:
Number of threads: 3

Doing CPU performance benchmark

Threads started!
Done.

Maximum prime number checked in CPU test: 10000

Test execution summary:
total time: 71.6212s
total number of events: 100000
total time taken by event execution: 214.7179
per-request statistics:
min: 1.43ms
avg: 2.15ms
max: 31.44ms
approx. 95 percentile: 11.43ms

Threads fairness:
events (avg/stddev): 33333.3333/305.08
execution time (avg/stddev): 71.5726/0.01

sysbench 0.4.12: multi-threaded system evaluation benchmark

Running the test with following options:
Number of threads: 3

Doing memory operations speed test
Memory block size: 1K

Memory transfer size: 102400M

Memory operations type: write
Memory scope type: global
Threads started!
Done.

Operations performed: 104857600 (319716.03 ops/sec)

102400.00 MB transferred (312.22 MB/sec)

Test execution summary:
total time: 327.9710s
total number of events: 104857600
total time taken by event execution: 738.3507
per-request statistics:
min: 0.00ms
avg: 0.01ms
max: 30.02ms
approx. 95 percentile: 0.00ms

Threads fairness:
events (avg/stddev): 34952533.3333/51842.16
execution time (avg/stddev): 246.1169/0.26

sysbench 0.4.12: multi-threaded system evaluation benchmark

Running the test with following options:
Number of threads: 3

Doing thread subsystem performance test
Thread yields per test: 1000 Locks used: 8
Threads started!
Done.

Test execution summary:
total time: 245.3740s
total number of events: 1000000
total time taken by event execution: 734.9378
per-request statistics:
min: 0.41ms
avg: 0.73ms
max: 20.89ms
approx. 95 percentile: 1.20ms

Threads fairness:
events (avg/stddev): 333333.3333/3919.56
execution time (avg/stddev): 244.9793/0.00

sysbench 0.4.12: multi-threaded system evaluation benchmark

Running the test with following options:
Number of threads: 3

Doing mutex performance test
Threads started!
Done.

Test execution summary:
total time: 0.0349s
total number of events: 3
total time taken by event execution: 0.0931
per-request statistics:
min: 27.87ms
avg: 31.05ms
max: 34.65ms
approx. 95 percentile: 10000000.00ms

Threads fairness:
events (avg/stddev): 1.0000/0.00
execution time (avg/stddev): 0.0310/0.00

Gentoo -O3
sysbench 0.4.12: multi-threaded system evaluation benchmark

Running the test with following options:
Number of threads: 3

Doing CPU performance benchmark

Threads started!
Done.

Maximum prime number checked in CPU test: 10000

Test execution summary:
total time: 70.9476s
total number of events: 100000
total time taken by event execution: 212.6414
per-request statistics:
min: 1.42ms
avg: 2.13ms
max: 31.43ms
approx. 95 percentile: 11.42ms

Threads fairness:
events (avg/stddev): 33333.3333/357.73
execution time (avg/stddev): 70.8805/0.01

sysbench 0.4.12: multi-threaded system evaluation benchmark

Running the test with following options:
Number of threads: 3

Doing memory operations speed test
Memory block size: 1K

Memory transfer size: 102400M

Memory operations type: write
Memory scope type: global
Threads started!
Done.

Operations performed: 104857600 (320861.15 ops/sec)

102400.00 MB transferred (313.34 MB/sec)

Test execution summary:
total time: 326.8005s
total number of events: 104857600
total time taken by event execution: 733.6188
per-request statistics:
min: 0.00ms
avg: 0.01ms
max: 30.02ms
approx. 95 percentile: 0.00ms

Threads fairness:
events (avg/stddev): 34952533.3333/159953.84
execution time (avg/stddev): 244.5396/0.32

sysbench 0.4.12: multi-threaded system evaluation benchmark

Running the test with following options:
Number of threads: 3

Doing thread subsystem performance test
Thread yields per test: 1000 Locks used: 8
Threads started!
Done.

Test execution summary:
total time: 248.2071s
total number of events: 1000000
total time taken by event execution: 743.4171
per-request statistics:
min: 0.41ms
avg: 0.74ms
max: 18.89ms
approx. 95 percentile: 1.24ms

Threads fairness:
events (avg/stddev): 333333.3333/31662.96
execution time (avg/stddev): 247.8057/0.03

sysbench 0.4.12: multi-threaded system evaluation benchmark

Running the test with following options:
Number of threads: 3

Doing mutex performance test
Threads started!
Done.

Test execution summary:
total time: 0.0295s
total number of events: 3
total time taken by event execution: 0.0690
per-request statistics:
min: 21.19ms
avg: 23.01ms
max: 25.39ms
approx. 95 percentile: 10000000.00ms

Threads fairness:
events (avg/stddev): 1.0000/0.00
execution time (avg/stddev): 0.0230/0.00

Для репрезентативности приведём сравнительные тесты в таблице:

Системы Archlinux Gentoo -O2 Gentoo -O3
Время на CPU тесте 70.6054s 71.6212s 70.9476s
Время на тесте памяти 327.4962s 327.9710s 326.8005s
Время на тесте многопоточности 309.9045s 245.3740s 248.2071s
Среднее время запроса на mutex тесте 28.11ms 31.05ms 23.01ms
Время, затраченное на пересборку мира _ 1014m30.079s 1056m47.770s

Во первых, обратим внимание, что на тестах процессора и памяти, код, оптимизированный для этого процессора не дал значительных успехов. Во вторых, очень заметно преимущество Gentoo перед Arch в тесте многопоточности. Этот синтетический тест показывает прирост производительности в 26%, это означает, что в реальных многопоточных приложениях вы можете получить не более четверти производительности. В четвертых, вам нужно потратить всего 17 часов, на то чтобы скомпилировать систему с такой производительностью. Что больше вы потратите своего и машинного времени на пересборки мира, или сэкономите машинное время на решение задачи после сборки системы — решайте сами.

Особенности Gentoo

Если вы решили поставить эту систему на свой компьютер, привыкайте к некоторым особенностям системы. Вам следует ждать, что:

  • GRUB2 по умолчанию не умеет грузиться откуда-либо, кроме ext2 разделов и не поддерживает графический режим в меню.
  • Собранное по умолчанию ядро имеет очень урезанную конфигурацию и может кое-что не иметь, но достаточно, чтобы загрузиться на большинстве компьютеров, поэтому вам придется баловаться с перекомпиляцией ядра. В моем случае, из коробки не работают два сетевых адаптера и framebuffer.
  • genkernel сам не перенесет конфигурацию, при переходе на более новую версию ядра.
  • Собранный по умолчанию RAM диск загрузит все подряд драйвера жестких дисков, что увеличит время загрузки, размер потребляемой ОЗУ и размер самого RAM диска.
  • Стабильная версия Firefox по умолчанию имеет логотип Aurora, в связи с тем, что логотип Firefox имеет правообладателей.
  • Установите USE флаг natspec для пакета unzip, если не хотите проблем с кодировками в zip архивах.
  • Вам придется потратить много времени на установку и обновление пакетов и системы.
  • Широкие возможности настройки USE флагов и accept_keywords дают широкие возможности, для того, чтобы устраивать коллизии зависимостей. Помимо этого вам нужно подтверждать лицензии, отличные от свободных. Ввиду этого будьте готовы доказывать portage, что вам нужно установить пакет. Обычно это можно решить командами "emerge --autounmask-write foo;etc-update". А лучше, вам следует самим залезть в конфиги portage.
  • Система очень не автоматизированна. Если вам нужно что-то автоматизировать, сделайте это сами.

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

  • Из коробки настроена цветная консоль.
  • Есть официальная утилита, для того, чтобы играться с перекомпиляцией ведра.
  • Техническая минималистичность и настраиваемость системы.
  • Возможность оптимизировать машинный код для программ с открытым исходным кодом.
  • Официально доступны два демона инициализации: OpenRC и systemd. Из коробки стоит OpenRC.
  • Выбор профилей позволяет выбрать примерную конфигурацию системы, коих может быть много, избавляя от необходимости самому выставлять кучу USE флагов.
  • В системе присутствует только то, что нужно вам.

Итоги

Итак. Поставив Gentoo вы получаете систему, которая несоизмеримо долго компилируется, её сложно поддерживать и легко случайно сломать, систему, благодаря которой вы узнаете что такое время и набьете себе шишек на лбу об подводные грабли. В замен вы получаете возможность отключать не нужные зависимости и небольшой прирост в скорости. Вопрос: нужна вам такая система? Да, нужна. Это замечательный полигон, для тренировки ваших способностей работы с linux системой. Это хороший опыт поломок и ремонтов ОС и незаменимый инструмент для выпрямления рук. Но и наконец, потому что Gentoo — это круто.

1 комментарий к “Обзор Gentoo Linux

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

*