Алексей Кузнецов, внёсший огромный вклад в развитие ядра Linux, ответил на вопросы читателей opennet.ru.
Последние 10 лет Алексей отстранился от публичных дел, но в конце 90-х и начале 2000-х годов входил в категорию наиболее значительных разработчиков ядра Linux и занимал c 2000 по 2003 год пост мэйнтейнера сетевой подсистемы Linux. В частности, Алексей довёл до полноценного вида сетевой стек Linux, переработал его для использования на многоядерных системах, доработал поддержку IPv6 и обеспечил средства для управления трафиком. После переработки IP-стека Алексей принялся за переделку поддержки протокола TCP. Результатом стал новый TCP-стек, представленный в ядре Linux 2.2 и до сих пор используемый повсеместно. Из подготовленных Алексеем инструментов наиболее известны наборы утилит iputils (ping, tracepath, tftpd, rarpd) и утилиты управления трафиком iproute2 (ip, tc, ss). С 2003 года Алексей занимается развитием продуктов виртуализации компании Parallels.
Разработка ядра
Как вы пришли к разработке ядра. Энтузиазм, производственная необходимость или требование работодателя? Почему вы приняли участие именно в разработке Linux, а не другого ядра с открытым исходным кодом?
Чистая случайность, вызванная производственной необходимостью. Необходимо было подключить Институт Ядерных Исследований к Интернету. Надо понимать, что все мы были учеными-физиками, да еще и теоретиками, и в то время про Интернет слышали только от своих зарубежных коллег и видели, как это работает, только во время нечастых визитов в зарубежные научные центры.
Слышали слова: freebsd, netbsd. Про linux слышали только одно - это не работает. Не забывайте про историческое время - начало девяностых (молодежь про это уже ничего не знает), мы были беднее церковных крыс и благодарить судьбу можно было даже за то, что для посылки однострочного е-mail через модем - через uucp шлюз - через Курчатовский Институт не требовалось гербовой печати с подписью главного бухгалтера.
Был отправлен человек с ящиком дискет в CERN: вези все программы и OS, что найдешь, потом разберемся. Человек был физик с очень небольшим вычислительным уклоном и привез он такую гору мусора, что я в ней месяц разбирался. Так вот - исторический момент - freebsd был привезен полностью на огромном количестве дискет, но без сорсов. И не взлетел. Ну вот совсем никак. А вот linuх был всего на двух дискетах – boot & root. И почти взлетел!
Я увидел надпись Login: и даже успел сказать ему root и увидеть #. А вот дальше на все был один ответ: Segmentation Violation и что-то про uselib. Но мы не привыкли отступать. Здесь случился акт божественного провидения: undelete на одной из пустых дискет (парень почистил часть особо бесполезных дискет с тем, чтобы туда записать какие-то мануалы, но не успел) обнаружился файл "?inux.tgz".
Распаковка показала, что это похоже на сорс ядра linux. Методом пристального взгляда проблема была вычислена: boot оказался немножко новее root, и функция uselib работала не совсем так, как этого ожидал root. Далее я взял лопату и стал рыть от забора и до успеха. Помню смутно: пришлось отыскать клон gcc для msdos (DJGPP), подправить кернел и ухитриться скомпилировать его под msdos. Получить работающий linux. Но без библиотек и возможности что-либо скомпилировать кроме кернела.
Далее собственную libc в степени, достаточной для работы make, gcc, ld etc. пришлось НАПИСАТЬ самому. А все остальное: gcc, as, ld - используя DJGPP и его сорс. Нетрудно понять, что после всего этого я из физика-теоретика превратился в linux-хакера. И назад в науку дорогу уже не нашел.
Как получилось, что вы стали мэйнтейнером? Какой путь пришлось для этого пройти?
В то время я был просто очарован Интернетом: возможности протокола, открывающиеся перспективы просто сносили крышу. Будучи человеком увлекающимся, я практически забросил свою основную область деятельности (теоретическая физика) и полностью переключился на изучение того, что было к тому времени сделано и изобретено, на размышления, что и как это нужно сделать. Где-то к 1996 у меня был the grand plan. И linux дал возможность для воплощения этого плана.
Во-первых, но не это самое важное, поддержка сети в linux была практически в состоянии tabula rasa. А главное - люди, которые каким-то чудом собрались вокруг проекта. Открытые для инноваций, гибкие, талантливые - Алан Кокс, затем Педро Маркес, Дэвид Миллер. До 1996 года (Linux 2.0) я просто работал. Чинил баги, делал какие-то нужные и не очень вещи. Заработал какой-то авторитет.
Где-то к 1996 году стало ясно, что сеть находится в тупиковом состоянии. Алан Кокс, бывший в то время майнтейнером сетевой части linux, сделал гениальный ход: он устранился и дал дорогу молодым: Педро Маркесу, который сделал к тому времени начальную поддержку IPv6 и начал переписывать TCP. А я (будучи "молодым" не по возрасту, а по духу :-)) взял на себя более низкоуровневую часть. К несчастью, Педро проработал недолго - закончил университет и пропал где-то в катакомбах Cisco, но начало новой эпохи положил именно он. Вот с тех пор я и стал отвечать за всю низкоуровневую часть сетевого кода: с одной стороны границы было TCP, c другой - внутренности сетевых драйверов. До 1999 года TCP я глубоко не занимался.
Как происходило взаимодействие с другими разработчиками ядра?
Через обмен e-mail. Патч публиковался в linux-kernel (затем - netdev). Если он не вызывал возражений, maintainer его прикладывал к своему дереву, затем пересылал Торвальдсу. Если были возражения - патч переделывался. А бывало и так, что патч отвергался целиком и кто-то совершенно другой делал то же самое совершенно по-другому.
Затем Дэвид Миллер организовал CVS для сетевой части и для своего собственного проекта (ultrasparc port). После этого взаимодействие стало более цивилизованным, но суть поменялась незначительно.
Чем было вызвано решение сменить область деятельности и покинуть арену разработки ядра?
Просто устал от общения с людьми. Представьте себе, что человек, который обязан читать сотни сообщений каждый день и отвечать на десятки, стал бояться открывать свою почту по утрам. Это просто невозможно. Захотелось просто поизобретать чего-нибудь без ежедневных разговоров с другими эдисонами и, увы, петриками.
Чем вы занимаетесь сейчас?
После TCP-стека я охладел и увлекся новым проектом в недрах Parallels. Я переделывал миграцию контейнеров Parallels Virtuozzo Containers. Занимался портированием контейнеров на Itanium. Это был изначально мертвый (малый интерес рынка), но технически невероятно интересный для меня проект. Потом был перенос контейнеров в линейный формат, совместимый с виртуальными машинами Parallels Server. Это трудно описать, просто потому что замысел и состоял в том, что никакого внешнего эффекта быть не должно, только контейнеры должны работать лучше. Некоторое время даже занимался Parallels Desktop для Mac, отдыхал от Linux.
Сейчас я занимаюсь Parallels Cloud Server, если точнее, то входящим в его состав Parallels Cloud Storage. Parallels Cloud Server представляет собой гибрид платформы для виртуализации (гипервизоры + контейнеры) с распределенным облачным хранилищем (именно Storage вызывает особый интерес у рынка) . «Гибридизация» снижает время простоя из-за отказов оборудования, упрощает поддержку и администрирование серверов, а также позволяет создавать эффективные и высокодоступные виртуальные серверы с очень хорошими показателями аптайма.
Во время нахождения на посту мэйнтейнера вам явно приходилось общаться с Линусом Торвальдсом, который последнее время часто не гнушается колоритных высказываний и достаточно грубых словесных пинков в ответ на халтуру и глупость. Изменился ли его подход с тем, что было раньше. Или он и 15 лет назад позволял себе крепкое слово, на грани оскорбления? Приходилось ли встречаться с Линусом лично или общение было исключительно в списках рассылки?
Лично я с ним никогда не встречался. Более того, избегал прямого общения с ним даже по е-mail. Я всегда имел промежуточное звено: сначала Алан Кокс, затем Дэвид Миллер. Линус считал меня "arrogant" (по словарю: заносчивый, высокомерный, надменный, самонадеянный, преувеличивающий свои возможности). Возможно, он употреблял в отношении меня и более крепкие эпитеты, но те, кто мне это передавал, могли просто щадить мое самолюбие. И он был прав: я считал и считаю его самовлюбленным малообразованным пингвином. И с большой склонностью к халтурным решениям, уж извините. Посмотрите на страшные куски кода, логика которых дожила до настоящего времени (inode.c, buffer.c), уродливый неработающий scheduler, который прожил десять лет.
Но не поймите меня неправильно. Я уважаю Линуса безмерно: во-первых, это харизматичный лидер, который умеет делать невозможное - управлять толпой анархистов самого разного интеллектуального уровня, многие из которых считают его идиотом; и не превратиться при этом в африканского царька. А главное, это человек, который видит на годы вперед. И это было ясно уже к 2000му году, когда linux, несмотря на все сделанные глупости, отвратительную архитектуру и ужасное качество кода, стал уверенно обходить и freebsd, и коммерческие unixы. Поэтому я всегда внимательно его слушал, а глупости, которые он говорил, особенно внимательно. Такой вот парадокс.
Возьмите классическую управленческую проблему. Когда назрела необходимость переключиться на какую-то VCS, Линус отверг CVS по понятным причинам, а svn, mercurial etc. - под совершенно надуманными предлогами. Вместо этого был взят bitkeeper, система с уродливейшей архитектурой, да еще и закрытой. И не бесплатной! Да еще и невероятно неэффективной. Кстати, это была еще одна из причин моего ухода: на компьютерах, которые были мне доступны, один однострочный коммит занимал почти час, а многие операции были вообще невозможно выполнить за конечное время. К тому же на гигабайт памяти у меня и денег просто не было.
Глупость? Непотизм? Не знаю. Но посмотрите на конечный результат: все уже и забыли про этот злосчастный bitkeeper, а есть git, который, безусловно, является лучшей распределенной VCS всех времен и народов. Вот это и называется гениальностью. Человек увидел бриллиант в куче навоза. Навоз со временем рассосался - бриллиант остался. А я бриллианта там не видел, вот так.