Содержание статьи
В «Юниксоиде» мы постоянно пишем про Linux и FreeBSD, но совсем забываем о других BSD-системах. Может показаться, будто дело в том, что эти системы морально умерли и не годятся для реального использования. Это не так, настоящая причина — низкий интерес к BSD. Мы хотим это исправить и этим циклом статей покажем, что BSD не только живы и активно развиваются, но и невероятно красивы с точки зрения архитектуры и более чем пригодны для применения.
Вместо введения
Всего у нас будет четыре статьи с общим названием «Тур по BSD». Эта статья посвящена истории возникновения BSD и ее пути от простого набора программ до полноценной операционной системы, впоследствии разделившейся на множество вариантов. Во второй части мы поговорим о NetBSD — первой из всего семейства BSD, дожившего до наших дней, и самой портируемой ОС в мире (не надо про Linux, потом все объясню). Третья часть будет посвящена OpenBSD, проекту защищенной со всех сторон операционки, который держится на плечах грубого, заносчивого, упертого, но очень талантливого программиста и руководителя. А закончим рассказом о самой молодой и неоднозначной, но очень интересной в архитектурном плане DragonFly и ее гибридном ядре и ломающей все стереотипы ФС HAMMER.
Ты можешь подумать, что посвящать отдельную статью истории BSD — это излишество и о ней можно было бы сказать кратко, но не торопись делать выводы. История BSD — не просто история студентов-ботанов из университета Беркли, которые, вместо того чтобы пить пиво и устраивать тусовки, писали код. Это история возникновения движения первых тру-хакеров, история появления идеи открытого исходного кода, история Билла Джоя, основателя легендарной компании Sun, и Эрика Шмидта, председателя совета директоров компании Alphabet Inc. (Google), история возникновения культового редактора vi, API сокетов и эталонной реализации TCP/IP-стека, история судебных тяжб и переписывания большей части кода системы просто потому, что толстосумы хотели заработать побольше денег. В конце концов, это просто теплая ламповая история, частью которой хотелось бы быть любому из нас.
Младенчество: 1BSD, 2BSD
Давным-давно, в далекой-далекой лаборатории Bell Labs выпускник Беркли Кен Томпсон и его коллега Деннис Ритчи решили создать игру Space Travel. Они получили добро от руководства, выбили на реализацию идеи старый компьютер PDP-7 и, чтобы как-то писать и запускать игру на нем, вынуждены были написать операционную систему. Впоследствии она стала известна как UNICS (только позднее CS сменилось на X) и в том или ином варианте продолжает жить до сих пор. Произошло это в 1969 году, и уже в 1971-м Bell Labs начала продавать операционку университетам и исследовательским лабораториям.
Fun fact
Первая коммерческая версия UNIX была написана на языке B, а всем известный сегодня си появился только спустя год. Много позже Страуструп сломал алфавит и назвал свой язык C++ вместо D.
Однако вовсе не принадлежность Томпсона к Беркли определила имя возникшей впоследствии BSD, а тот факт, что в 1973 году копию UNIX вместе со всеми исходными текстами (это стандартный комплект поставки) приобрел Боб Фабри для запуска на компах в кампусах того самого Беркли. Как и ожидалось, необычная и архитектурно красивая UNIX жутко понравилась студентам (среди которых был Билл Джой), и они начали ее всячески хакать и видоизменять. Шло время, модификации копились, слухи о наработках студентов из Беркли ползли, и, наконец, в 1977 году Билл Джой принимает решение выпустить первый релиз BSD.
Дальше мне следовало бы начать рассказ о том, насколько крута была 1BSD для тех времен, но я просто перечислю содержимое бобины с магнитной лентой Berkeley UNIX Software Tape: компилятор и профайлер Pascal (написанный Кеном Томпсоном во время визита в Беркли в 1975-м), редактор ex, улучшенный UNIX-шелл ashell, игра Star Trek и еще несколько инструментов. Все с исходниками, man-страницами и прекомпилированными бинарниками.
Это все, что было на ленте, и ты легко можешь в этом убедиться, так как ее содержимое до сих пор гуляет по Сети. Очевидно, что при доступности исходников UNIX изменения вносились и в нее, но то ли по причине лицензионного соглашения, то ли по какой-то другой эти изменения не вошли в «релиз».
Как бы там ни было, 30 магнитных лент 1BSD были разосланы в разные университеты, а 35 — проданы по 50 долларов за штуку (что, кстати, очень демократичная по тем временам цена). При этом Билл Джой никак не запрещал модифицировать исходные тексты включенных в 1BSD приложений и использовать их для создания собственных программных продуктов. Более того, он отслеживал изменения других людей и аккумулировал их для включения в следующие релизы BSD. Эта абсолютно новая для того времени модель разработки и распространения позднее стала известна как Open Source.
Результатом дальнейшего хакинга и разработок стала 2BSD, выпущенная в 1979-м. Как и прошлый выпуск, 2BSD не содержала самой ОС, но на этот раз включала в себя ставшие впоследствии визитной карточкой BSD-систем редактор vi с его любимой олдфагами и ненавистной новичкам двухрежимностью и шелл csh с си-подобным синтаксисом (оба — детище Билла Джоя). Также на ленту попал сетевой пакет Berknet, позволяющий обмениваться письмами, отправлять задания на печать, выполнять удаленные команды внутри сети Беркли, а также выходить в ARPANET. Его создал Эрик Шмидт, в рамках обычной дипломной работы.
Fun fact
Знаменитое клавиатурное сочетание hjkl для навигации по тексту в vi выбрано не только по причине быстрого доступа пальцами правой руки, но и просто потому, что на клавиатурах тех времен не было клавиш навигации.
Подробности о 1BSD
Весь софт на бобине занимал 1,2 Мбайт и распаковывался в 3,4 Мбайт. Каждый инструмент располагался в своем обособленном каталоге в архиве типа ar (сегодня используется для запаковки объектных файлов в статическую библиотеку, расширение .a) и снабжен описанием и инструкциями по установке, располагающимися в файле READ_ME (да, с подчеркиванием!). Главный файл README в формате troff (man-страница) пояснял, что вообще такое BSD и как это все установить. В описании есть забавные строки типа «This will require about 10 000 blocks of storage...» и .P.a.s.c.a_.l (это заголовок из файла с названием wow).
Этикетка на ленте гласила:
Berkeley UNIX Software Tape
Jan 16, 1978 TP 800BPI
To extract contents do:
tp xm ./setup; sh setup; tp xm
Вторая этикетка предупреждала, что софт распространяется только для тех, кто приобрел лицензию UNIX:
The contents of this tape are
distributed to UNIX licensees
only, subject to the software
agreement you have with Western
Electric and an agreement with
the University of California.
Xakep #205. Взлом Single Sign-On
Юность: 3BSD — 4.1BSD
В 1978 году Беркли купила компьютер VAX-11, и этот момент стал одним из важнейших событий в истории BSD и привел к ее превращению из просто Software Distribution в полноценную операционную систему. Свою роль здесь сыграли два фактора: нежелание слазить с иглы UNIX и переходить на VMS и отсутствие полноценного порта UNIX на VAX. Последний хоть и существовал, но не использовал важнейшую особенность компьютера — систему виртуальной памяти.
Исправлением этой проблемы занялись, разумеется, студенты. Результатом стала 3BSD, включающая в себя сильно модифицированное ядро UNIX, набор стандартных UNIX-утилит и, конечно же, доработанный набор утилит 2BSD. Система была выпущена в конце 1979 года, и вскоре после этого на нее обратила внимание DARPA. Да-да, военные решили профинансировать группу исследования компьютерных систем (Computer Systems Research Group — CSRG) Беркли с целью использовать ее наработки в своих проектах.
Fun fact
Ядро BSD для компьютера VAX в файловой системе находилось по адресу /vmunix, что было сокращением от Virtual Memory Unix. Если ты взглянешь на содержимое каталога /boot в любом дистрибутиве Linux, то заметишь, что традиция жива до сих пор. Правда, вместо vmlinux используется vmlinuz, где z означает zip (а точнее, gzip), то есть компрессию.
Финансирование DARPA дало свои плоды, и менее чем через полгода на свет появилась 4BSD (ноябрь 1980-го), а еще через полгода (июнь 1981-го) — 4.1BSD. Последняя вообще-то должна была стать 5BSD, но была переименована по просьбе AT&T (бывшая Bell Labs), так как покупатели могли спутать ее с UNIX System V (к тому времени UNIX и BSD уже стали синонимами, и многие организации покупали UNIX только для того, чтобы иметь право использовать BSD как систему, основанную на ее коде).
Главными новшествами 4BSD стали: предшественник sendmail под названием delivermail (забавно, что он доставлял почту путем заливки на FTP-сервер), система управления задачами в csh (те самые комбинации <Ctrl + Z> и команды fg
и jobs
) и библиотека curses для построения псевдографического интерфейса. Последняя, в ее более свежей реинкарнации ncurses (new curses), используется до сих пор такими приложениями, как top, mc, mutt, и большей частью полноэкранного интерактивного консольного софта.
К тому времени BSD уже была очень популярна среди пользователей VAX-11, и большинство организаций предпочитали ее стандартной VMS. Проблема заключалась только в чрезмерной медлительности системы, из-за чего она сильно проигрывала VMS. Билл Джой сумел за полгода оптимизировать систему так, чтобы она шла вровень с VMS. Эти наработки вошли в 4.1BSD.
Как ни странно, в то же время продолжала свое развитие 2BSD, и к релизу 2.9 она также превратилась в полноценную ОС, основанную на коде UNIX V7. Практически все изменения в ней были бэкпортами из более поздних версий BSD, а последний патч датируется аж 17 июня 2012 года (остается только подивиться, где в 2012 году его автор нашел музейный PDP-11).
Зрелость: 4.2BSD — 4.3BSD
К версии 4.2 (август 1983-го) BSD уже начала обретать черты той самой системы, какой мы ее знаем сейчас. Именно в этой версии впервые появился стек TCP/IP и API сокетов, используемый в любой современной операционной системе. Более того, написанная Биллом Джоем реализация стека TCP/IP оказалась настолько хороша, что она не только заменила собой считавшийся до этого эталонным стек от компании BBN (он развивался с середины семидесятых и появился в промежуточном релизе 4.1a), но и была практически без изменений позаимствована для других операционных систем, в том числе Windows 95. Сегодняшняя реализация TCP/IP-стека в BSD-системах (а значит, во множестве основанных на них устройств) до сих пор базируется на коде Билла Джоя.
Вторым важным новшеством 4.2BSD стала файловая система FFS (Fast File System), дожившая до наших дней под именами FFS, UFS1 и UFS2 в разных BSD-системах. В мире UNIX FFS быстро стала стандартом и была интегрирована в оригинальную версию системы от Bell Labs, откуда перекочевала в Solaris. Файловая система ext2, которая долгое время была включена как стандартная в Linux-системы и до сих пор используется как часть ext3/4, по сути, базируется на идеях UFS1. Со времен 4.4BSD файловая система практически не изменилась, но обросла некоторой дополнительной функциональностью (soft updates, например) и оптимизациями, а ее автор, Маршалл Кирк Мак-Кузик, до сих пор состоит в команде разработчиков FreeBSD.
4.2 стала первой версией BSD, выпущенной без участия Билла Джоя, к тому времени уже основавшего Sun Microsystems. Его роль взяли на себя Мак-Кузик и Майк Карелс. Тогда же появился и знаменитый маскот: улыбающийся демон в кедах с трезубцем в руках. Его нарисовал Джон Лассетер, впоследствии ставший режиссером анимационных фильмов «История игрушек», «Жизнь жуков», «Тачки» и других фильмов студии Pixar.
Спустя чуть менее чем три года состоялся релиз 4.3BSD, который, как ни странно, большей частью был работой над ошибками и оптимизацией кода, однако уже после его выпуска произошло важное событие — порт на платформу Power 6/32. Сам он оказался бессмысленным, так как платформа вскоре перестала существовать, но позволил значительно переработать кодовую базу BSD путем разделения на платформенно зависимую и независимую части. Благодаря такому разделению портировать BSD на новые архитектуры стало значительно проще.
BSD до сих пор была основана на коде UNIX, а потому использующие ее компании продолжали «платить дань» AT&T, покупая лицензию на оригинальную версию системы, даже если они вообще не распаковывали бобины с системой. Поэтому разработчики решили выпустить BSD Net/1. По сути, это были просто исходники кода сетевого стека, но зато за их использование не приходилось платить ничего и никому. Чуть позже разработчики использовали тот же подход для выпуска Net/2 — практически полноценной ОС, с переписанными с нуля участками кода AT&T. И здесь начались проблемы.
Судебные разбирательства, 4.4BSD и Linux
Переписывание исходников заняло всего восемнадцать месяцев, и релиз Net/2 увидел свет в июне 1991 года. Это уже был чистейший Open Source: никаких выплат никому и ни за что, свобода модификации исходников и распространения основанных на них продуктов и так далее (фактически лицензия BSD гласила: «Делайте с нашим кодом все, что хотите, только оставьте в исходниках упоминание его авторов»). Чуть позже на базе Net/2 Уильям Джолиц создал систему 386BSD, которая, как нетрудно догадаться, была портом на x86.
Возможно, в таком виде BSD и продолжила бы благополучно развиваться, не реши ее авторы чуть заработать и профинансировать дальнейшее развитие ОС (CSRG, поддерживаемая DARPA, закрывалась). Они основали компанию BSDi (Berkeley Software Design, Inc.) и начали продавать проприетарную версию BSD для x86 (BSD/386, в отличие от появившейся позднее 386BSD, была закрыта). Причем не просто продавать, а значительно дешевле оригинального UNIX: 995 долларов против 20 000.
И тут возникла интересная ситуация. AT&T, получавшая львиную долю прибыли «за воздух» (все, кто использовал BSD, платили AT&T), да еще и перетаскивающая ключевые технологии BSD в UNIX, возмутилась и решила задавить конкурента судебными исками. Основных претензий было две: 1) BSD продолжает базироваться на коде AT&T, 2) BSDi использует торговый знак UNIX без разрешения (а все из-за номера 1-800-ITS-UNIX, позвонив по которому можно было заказать BSD/386). В результате на несколько лет BSDi погрязла в бессмысленных судебных разбирательствах, и это не было бы столь важным, если бы все пользователи BSD Net/2 не оказались на тот же период в подвешенном состоянии: AT&T предъявляла претензии на весь код BSD, так что до вынесения судебного решения распространять его было запрещено.
Много лет спустя Линус Торвальдс признался, что, если бы код BSD не стал жертвой бюрократии, он вряд ли создал бы Linux — в нем просто не было бы необходимости. Но, как мы знаем, история повернулась иначе: конфликт более-менее разрешился только в 1993 году признанием кода BSD свободным от кода AT&T после удаления трех файлов исходников и модификации семидесяти. К тому времени кривой, сырой и не идущий ни в какое сравнение с BSD Linux уже завоевал огромную популярность, и о BSD начали забывать.
Тем не менее даже во времена судебных разборок код BSD продолжал развиваться внутри Беркли. Появился порт BSD Net/2 на x86 (тот самый 386BSD), который в 1993 году разделился на две независимые ветки: NetBSD и FreeBSD, затем от NetBSD отпочковалась OpenBSD, а FreeBSD породила DragonFly. А в 1994 году была выпущена 4.4BSD Lite, новшества которой позднее влились в NetBSD и FreeBSD.
Выводы
BSD дала миру целый ворох используемых и поныне технологий, воспитала большое количество именитых людей и косвенно способствовала появлению Linux. Но это далеко не все, в следующих статьях ты узнаешь, как BSD повлияла на Android, почему Microsoft вкладывалась в развитие OpenBSD, почему NetBSD более портабельна, чем Linux, и зачем все-таки нужна DragonFly BSD. Ну и конечно же, о том, зачем вообще все это нужно, когда есть Linux.