LXF164:Darwin:Вид происхождения
Olkol (обсуждение | вклад) (Новая страница: «Категория:Постоянные рубрики Категория: ОС '''Альтернатива Linux''' == Darwin:Вид проис…») |
Версия 05:16, 28 октября 2018
|
|
|
Альтернатива Linux
Darwin:Вид происхождения
Свободная ОС от несвободной компании? Нет, Роман Ярыженко вовсе не шутит!
Darwin – это не тот, который выдумал теорию эволюции, а тот, на котором основана проприетарная Mac OS X. Читатели, возможно, удивятся: с чего это LXF рассказывает о проприетарной ОС? Загвоздка тут в том, что Darwin как раз-таки свободная и открытая ОС – причем в полном соответствии со смыслом, вкладываемым в эти слова FSF и OSI.
Ιστορία
Полагаю, что историю Darwin надо начать с ухода Стива Джобса из Apple. Мы не можем знать точно, из-за чего он ушел, но итогом стало то, что он переманил в новую фирму некоего Ави Теваняна [Avie Tevanian], который работал над микроядром Mach и был одним из его основных разработчиков (концепция Mach разработана в Университете Карнеги-Меллона). Переманил его Джобс, конечно, не просто так, а для разработки ОС, которая в дальнейшем получит название NeXTStep.
Для разработки новой ОС было решено использовать объектно-ориентированные технологии. Неведомо почему был выбран Objective-C, а не C++. Некоторые источники показывают, что C++ к моменту начала работы над NeXTStep еще не был создан, но они вступают в противоречие с другими источниками, поэтому можно предположить, что новоявленная компания просто выбрала тот язык, который старше и больше похож на C – основной язык разработки ОС того времени. NeXT Computers лицензировала Obj-C в 1988.
Язык этот на тот момент был довольно «продвинутым» – он, например, включал ООП (причем ООП реализовано через сообщения, как в SmallTalk, несколько непохоже на то, к чему мы привыкли сейчас), динамическую типизацию, а в современной версии еще и сбор мусора.
Ядро же NeXTStep было гибридным (несмотря на то, что некоторые источники называют данную ОС микроядерной, это не так) и написанным на чистом C. Разработчики взяли лучшие черты микроядра Mach, такие как модульную архитектуру и ядра BSD (скорость и сетевой стек).
Чарльз Дарвин: вокруг света
Рассматривать установку будем на примере VMWare Server 1.0 – у автора отсутствует процессор с виртуализацией, а без нее многие современные виртуальные машины работают очень медленно. Тип виртуальной машины – FreeBSD, жесткий диск IDE; указываем ISO-образ, загружаемся с него... поехали!
� Шаг 1 Выбираем жесткий диск для установки. С этим, думается, проблем не возникнет ни у кого.
� Шаг 2 Выбор типа разметки жесткого диска. Тут мы, как это ни странно, выбираем ручную, ибо автоматическая, сколько ни пытались, не хотела работать. Нас выбросит в fdisk. Набираем auto hfs (автоматическая разметка диска с одним разделом HFS+) и... скорее всего, получаем ошибку вида “malloc:*** Deallocation of a pointer not malloced...”. Еще раз набираем auto hfs – теперь уже этого сообщения не будет. Записываем MBR командой w, затем выходим из fdisk – quit. Теперь нас попросят выбрать корневой раздел – честно говоря, непонятно, зачем надо вводить его целиком, когда можно было бы выбирать из имеющихся путем нажатия соответствующей цифры – но это уже вопрос к разработчикам программы установки. Забегая вперед, скажем, что это далеко не единственная ошибка в ней. Далее у нас попросят подтвердить: действительно ли мы хотим совершить «чистую» установку? Отвечаем – и снова вопрос: имя тома; здесь можно написать что угодно. После ответа, как водится, жмем <Enter>. Оба-на! Пишет “error: nknown filesystem type”. Уходим на перезагрузку – заново с образа. Замечаем, что на первом этапе появился пункт 3 – “Use existing partition”. Его и выбираем. Опять попросят указать корневой раздел. После этого будет вопрос: какой тип файловой системы использовать? Вопрос этот выглядит, по меньшей мере, странным – есть же таблица разделов, оттуда и берите – но теперь хотя бы понятна причина перезагрузки: установочная программа (скрипт?) попыталась подмонтировать раздел без ФС, и, естественно, вылезла вышеуказанная ошибка. С нас снова спросят подтверждение и имя тома – если нам еще не надоело, отвечаем на них, и – ура! – началось копирование файлов. Это может занять несколько мин... ой. Журнал-то про *nix, зачем здесь повторять сообщение Windows? Но, как бы то ни было, это довольно длительный процесс, и во время него можно, к примеру, съесть пирожное.
� Шаг 3 Копирование завершено. Нас спросят пароль root (дважды – в этом смысле все нормально), потом спросят имя домена, а затем выбор из 3 пунктов: создать нового пользователя, перезагрузиться и оболочка. Ну, пользователя можно создать и потом, оболочка порождается глючная, поэтому выбираем пункт 2 – Reboot. Перезагружаемся... и судорожно вспоминаем, был ли вопрос про загрузчик. Выясняется, что не было. Да-да! Его надо ставить ручками.
� Шаг 4 Снова загружаемся с образа. Только теперь необходимо работать в оболочке, поэтому набираем shell.Вошли.Набираем первую команду –
fdisk -f /usr/standalone/i386/boot0 -u -y /dev/rdisk0
Что эта команда делает? Делает она следующее: ставит первую часть загрузчика в MBR (без таблицы разделов – опция -u) без запроса подтверждения – опция -y.
� Шаг 6 После этой команды даем команду
dd if=/usr/standalone/i386/boot1h of=/dev/rdisk0s1
для установки загрузочного сектора раздела HFS+.
� Шаг 7 Монтируем раздел –
mount_hfs /dev/disk0s1 /mnt
и копируем файл –
cp /usr/standalone/i386/boot /mnt/
(собственно, сам загрузчик). Отмонтируем – umount /mnt – и перезагрузиммся – shutdown -r now. Установка завершена.
Первое знакомство
Загрузка может пойти нормально, а может и зависнуть (“Still waiting for root device”) – мы не смогли выяснить, с чем это связано. Во втором случае следует перезагрузиться – иногда несколько раз. После успешной загрузки видим приглашение входа в систему и ошибки ненастроеного mDNSResponder. Переводим строку и входим как root. Для начала хотелось бы порекомендовать скомпилировать старый добрый MC – конечно, можно обойтись и без него, но с ним удобнее.
С компиляцией придется повозиться: необходимо мало того что скачать как собственно MC, так и все необходимые зависимости, но еще и передать их на виртуальную машину. А каким образом? Сеть-то не настроена. Единственный более-менее доступный путь – использовать ISO-образ.
После того, как создадим и подмонтируем образ диска (на всякий случай – порядок действий: в каталоге /Volumes создать папку cdrom, потом смонтировать диск командой mount_cd9660 /dev/disk1s0 /Volumes/cdrom. Естественно, образ уже должен быть подготовлен для использования в виртуальной машине. Специфика Darwin...), необходимо скопировать все файлы в домашний каталог. Команда копирования стандартная; единственное, что надо отметить – Darwin странно отображает файлы на ISO9660, поэтому копировать лучше по маске, а разархивировать с использованием автодополнения по клавише <Tab>, благо оно имеется.
Да! Перед началом компиляции выполните следующие команды:
export MACOSX_DEPLOYMENT_TARGET=10.4
– устанавливает минимальную версию ОС;
export PATH=$PATH:/usr/local/bin
– понятно что;
export LIBDIR=/usr/local/lib
– тоже понятно, но для тех, кому непонятно – указывается путь, куда при компиляции будут складываться библиотеки.
Собственно компиляция зависимостей происходит долго и нудно – распаковка (tar xzvf имя_архива), переход в каталог, configure, make, make install, распаковка, переход в каталог... важно лишь, в каком порядке – а он следующий: pcre, pkg-config, gettext, slang и, наконец, glib.
Зависимости скомпилировались – переходим к собственно mc. Тут действуем почти так же – но configure необходимо выполнить с опцией --with-screen=slang. И после выполнения make install будет нам счастье – скомпилированный mc под Darwin
Но счастье редко бывает полным – по неизвестным причинам в текстовом режиме в ОС от Apple не работают функциональные клавиши. По слухам, они работают в графическом терминале – но компиляция X-сервера и какого-либо оконного менеджера выходит за рамки этой статьи. А что же делать с функциональными клавишами? Придется использовать фокус – вместо функциональных клавиш <F1> – <F10> mc позволяет использовать комбинацию <Esc> + цифра от 1 до 0. Не самый удобный способ, да, но с этим ничего не поделаешь.
Пройдемся немного по дереву каталогов – оно, дерево, сильно отличается от привычного нам. И не стоит забывать, что Darwin – «десктопная ОС без десктопа», если можно так выразиться, поэтому некоторые элементы там присутствуют лишь как заглушки. Итак, зрим в корень... и вот какие каталоги мы там видим.
» Каталог /.Trashes как раз и является заглушкой – в Mac OS X он выполняет функцию корзины для суперпользователя.
» Каталог /.vol – загадочный каталог, где находится еще один (или более) каталог с цифровым именем. Но если посмотреть вывод команды mount, становится понятным, что к оному каталогу подмонтирована псевдофайловая система volfs, назначение которой из названия, впрочем, не становится менее загадочным. Данная файловая система предназначена для доступа к файлам не по имени, а по inode. Это было необходимо для стыковки POSIX и Carbon API, который ныне (2012 год) считается уже устаревшим, но в версии Mac OS X, основанной на описываемом в данном разделе Darwin 8.0.1, был вполне себе живым.
» /AppleInternal – содержит некоторые заголовочные файлы.
» /Applications – опять же, предназначен для OS X. Туда обычно устанавливаются несистемные приложения c GUI, разработанные специально для ОС от Apple. Интересно, что в Darwin присутствует одно такое приложение, хотя GUI там и в помине нет – соответственно, даже и пытаться его запустить не стоит.
» /Developer содержит документацию, примеры исходных кодов и шаблоны проектов модулей ядра и расширений ядра – разница между ними будет пояснена чуть позже.
» /Library содержит некоторые важные конфигурационные файлы – в частности, файл /Library/Preferences/SystemConfiguration/com.apple.Boot.plist, необходимый для загрузчика, и некоторые логи.
» /Network – по всей видимости, служит для монтирования сетевых файловых систем.
» /System содержит подкаталог Library, ближайшим аналогом которого в Linux является /lib. В нем присутствуют фреймворки приложений, модули и расширения ядра, модули Perl...
» /Users содержит домашние каталоги пользователей и в этом смысле совершенно идентичен /home.
» /Volumes аналогичен /mnt и /media. Каталоги, созданные в нем пользователем, существуют до следующей перезагрузки – учтите это, когда будете в следующий раз монтировать компакт-диск.
» /bin, /dev, /sbin, /usr, /opt – объяснять не будем, и так все понятно. А вот каталоги /etc, /tmp и /var на самом деле являются символическими ссылками на соответствующие каталоги в /private.
Если уж заглянули в каталог /etc, давайте в файле profile исправим переменную PATH, добавив в число путей /usr/local/bin, и добавим переменные LIBDIR и MACOSX_DEPLOYMENT_TARGET (значения см. ранее) – на случай, если читателю захочется поупражняться в компиляции чего-либо POSIX-совместимого. В принципе, можно даже попытаться скомпилировать свежие версии ядра и базовых утилит, буде читатель окажется жестким извращенцем – автор этих строк не рискнул поставить подобный эксперимент.
Архитектурные особенности
Как и древние римляне, начнем с яйца – то есть с ядра. Ядро у ОС от Apple, как уже сказано, основано на микроядре Mach. Но «основано на микроядре» вовсе не означает, что архитектура микроядерная: архитектура гибридная, и условно состоит из трех слоев.
» В самом низу ядра лежит слой Mach, который отвечает за HAL (не стоит искать данного термина в документации, мы его используем для упрощения), управление процессорами, вытесняющую многозадачность, управление памятью, внутриядерный IPC, поддержку «мягкого» реального времени и, наконец, за отладку ядра – в качестве отладчика на отлаживающей машине используется GDB.
» Слой BSD лежит выше и включает реализацию процессов и сигналов, базовую модель безопасности, API POSIX, системные вызовы, поддержку сети и многое другое.
» Слой I/O Kit – это фреймворк, позволяющий разработчикам использовать ограниченный набор возможностей C++ для объектно-ориентированного программирования драйверов.
В принципе, эти слои не настолько четко разделены, поэтому некоторые могут еще что-то выделить, а некоторые, наоборот, предпочтут что-то убрать; но общая картина такова.
Xnu (так называется это ядро; расшифровывается же эта аббревиатура как... да-да, Xnu is not Unix – Столлмену впору обвинять Apple в плагиате) позволяет подключать к себе расширения – так называемые kernel extensions, в единственном числе kext. Расширения могут состоять из одного или более модулей ядра. Модуль ядра (Kmod) является минимальной единицей кода, которую можно загрузить в ядро.
В Darwin используется формат исполняемых файлов Mach-O и поддерживается технология, основанная на нем – мультиархитектурные исполняемые файлы. Отметим, что Apple применяла ее для переноса OS X с архитектуры PowerPC на Intel.
Теперь рассмотрим такие специфические особенности Darwin, как «пакеты [bundles]» и фреймворки (примечание: здесь и далее речь может пойти о вещах, которые не поддерживаются в версии Darwin 8.0.1 – сия версия 2005 года, а сейчас уже, почитай, 2012 заканчивается скоро). «Пакетом» в данном контексте называется набор связанных ресурсов, в число которых могут входить исполняемые файлы, изображения, аудио, заголовочные файлы и даже другие пакеты. Ясное дело, что такой «пакет» – понятие абстрактное, а посему приведем конкретный пример – фреймворк. Фреймворк – набор, состоящий из одной или более динамических библиотек с заголовочными файлами, документацией, локализацией и сопутствующими программами для облегчения работы. Давайте рассмотрим некоторые фреймворки, входящие в состав ОС от Apple.
Уже упоминавшийся ранее I/O Kit – фреймворк, состояший из двух частей: режима пользователя и режима ядра. Часть пользовательского режима отвечает за простой доступ к оборудованию из приложений, а часть режима ядра – за базовую иерархию классов и поддержку C++. Мы уже отмечали, что C++ в I/O Kit несколько ограничен. Заключается это в отсутствии таких вещей, как шаблоны, исключения, RTTI и множественнное наследование. Тем не менее, это нисколько не мешает разработчикам писать драйверы.
CoreFoundation – фреймворк, обеспечивающий базовые возможности для программ, написанных на Objective-C, такие как разбор XML-файлов, доступ к ресурсам через URL, управление списками свойств и многие другие.
Для облегчения работы с сетью предназначен фреймворк CFNetwork. Он делает удобной работу с сокетами, создание SSL/TLS-соединений, разрешение имен... Разработчик желает работать с HTTP или FTP? Никаких проблем – за это также отвечает данный фреймворк.
Нельзя не упомянуть и о файловой системе HFS+. Особенностями она по современным меркам не отличается (разве что поддержка любых символов Юникода в имени файла, за исключением символа NUL), но все же перечислим ее возможности. Это журналирование, B-деревья для эффективного поиска файлов, прозрачное сжатие...
А как обстоят дела с безопасностью? О, с безопасностью все хорошо, не сомневайтесь! Вот некоторые возможности и технологии, так или иначе относящиеся к ней:
» ASLR Технология, размещающая в ОЗУ некоторые критично важные системные данные случайным образом. Это серьезно осложняет эксплуатацию ряда атак, требующих знания их расположения.
» NX-бит Запрещает выполнение кода в стеке и в куче.
» Права доступа Стандартная модель Unix.
» ACL Расширенная система прав доступа; позволяет индивидуально для каждого пользователя назначать права доступа к файлам.
» Kauth Мандатная система контроля доступа; аналогична SELinux.
» Аудит.
» Шифрование раздела подкачки.
» IPSec Его реализацию, как, впрочем, и в Linux,стащили из FreeBSD.
» Подписывание исполняемых файлов Возможно теоретически.
Необъятное объять нельзя – nemo omnia potest scire – но автор и не ставил такой цели, он ставил цель заинтересовать читателя. Хотелось бы надеяться, что у него это получилось.
Итоги
Впечатление о данной ОС сложились неоднозначные: с одной стороны, интересно посмотреть на внутренности коммерческой ОС от Apple, а с другой... Darwin явно не является системой для настольного использования. Предпринимались попытки создать дистрибутив на основе этой ОС, но особого успеха они не получили. Может быть, выйдет у кого-нибудь из наших читателей?.. |
YaryzhenkoRoman.psd Наш эксперт
Романа Ярыженко хлебом не корми – дай попробовать какую-нибудь экзотическую (и не очень) ОС. Желательно открытую.
Что нам надо
Пакеты, необходимые для компиляции MC версии 4.6.1:
» Pkg-config 0.25
» Gettext 0.18.1.1
» Glib 2.6.4
» slang 2.1.4
» pcre 8.20
Основные вехи истории NeXTStep/Darwin
» 1989 Вышла бета-версия NeXTStep на NeXT Cube – уникальном для своего времени компьютере на основе процессора Motorola 68030. В сентябре же появилась версия 1.0. Базировалась она на Mach 2.5 и 4.3BSD. GUI же было основано на PostScript.
» 1990 Версия 2.0 включила такие новшества, как поддержку приводов CD-ROM и цветных мониторов, динамически загружаемые драйвера и многое другое.
» 1991 Вышла версия 2.1.
» 1992 Версия 3.0. В этом же году на выставке NeXTWORLD Expo была представлена версия для PC, стоимостью чуть меньше 1000 долларов.
» 1993 В мае и октябре были выпущены версии 3.1 и 3.2 соответственно.
» 1994 NeXT и Sun выпустили открытые спецификации OpenStep, включая несколько API и фреймворков. На их основе можно было написать собственную реализацию платформы, что и было сделано позднее.
» 1995 Выпущена последняя версия NeXTStep, 3.3. Далее она выходила под другим названием – OpenStep/Mach.
» 1997 Apple купила NeXT и на основе NeXTStep (точнее, OpenStep/Mach) началась разработка проекта Rhapsody.
» 2000 Создано ответвление Rhapsody – Darwin. Тот самый Darwin, о котором идет речь в нашей статье.
Историю релизов Darwin при желании несложно найти в Сети.