замечательный мир Linux 2.6

Казалось бы, только вчера мы запускали наши первые Linux-системы с ядром 2.4, а вот уж время пролетело, озимые заколосились и... команда разработчиков ядра приблизилась к завершению работы над новой версией ядра — 2.6. В этом документе будут описаны новые особенности ядра 2.6 (с сильным уклоном к i386-порту Linux).
/* Чтобы этот материал не занял все доступное простарнство на страницах нашего журнала, а также из соображений соответствия тематике «СР», из статьи были выкинуты разделы, касающиеся мультимедии, звука и прочих развлекательно-пользовательских штучек — прим. ред.*/
Следует иметь в виду, что некоторые из особенностей, описанные здесь, могут быть удалены или помечены как "экспериментальные" в актуальных выпусках ядра 2.6. Однако на текущий момент развитие ядра имеет статус “feature-freeze”, т.е. никакие новые возможности более не добавляются в ядро, и это радует нас, потому что харашо: финальный релиз не будет сильно отличаться от того, что описано тут. Также следует учесть, что некоторые из "новых" особенностей, обсуждаемых здесь, возможно, были портированы задним числом в Linux 2.4 после их появления в Linux 2.6, официально или дистрибутором.

расширение списка поддерживаемых архитектур

Одним из главных направлений роста Linux 2.6 была поддержка множества платформ, в частности, посредством включения многих возможностей из проекта uClinux в основное ядро. uClinux — это проект Linux для микроконтроллеров. Много лет это ответвление Linux было основой поддержки многих встраиваемых процессоров, и очень приятно получить более высокую степень интеграции в ядре основной ветки.
В отличие от обычных портов Linux, встраиваемые порты, описанные здесь, не имеют всех возможностей обычного Linux из-за аппаратных ограничений. Основное различие в том, что процессоры, под которые эти порты созданы, не поддерживают MMU (в мире Intel, MMU был представлен с i386). В то время как эти Linux системы истинно многозадачны, они не имеют защиты памяти (так что любая программа может разрушить любую другую) и некоторые системные вызовы, имеющие дело с клонированием процессов, заблокированы. Поскольку эти системы не имеют защиты памяти, они оказываются бесполезными в качестве многопользовательских систем.
Есть четыре основных линейки встраиваемых процессоров, поддерживаемых Linux 2.6. Первая — новейшая линейка встраиваемых процессоров m68k фирмы Motorola. Эти процессоры выпускаются с именами типа Dragonball и ColdFire. Большинство пользователей Linux знакомы с этими процессорами как лежащими в основе Palm Pilot-ов, начиная с первого (Palm 1000) и до Palm III. Печально, но поддержка старших m68k процессоров без MMU (типа 68000, используемый в ранних Macintosh) еще не включена в это ПО. Среди новых поддерживаемых встраиваемых платформ — серия H8/300 от Hitachi и NEC v850.
Акцентирую внимание на том, что это серьезное смещение приоритетов в сторону поддержки систем без MMU под Linux 2.6. Развивая мысль в этом направлении, будем надеяться, что поддержка и других устаревших аппаратных средств будет реализована в будущем.
Последние версии Линукса также включает поддержку процессоров Axis Communications ETRAX CRIS (в частности поддерживаются ETRAX 100LX и более новые). ETRAX CRIS — это встраиваемые процессоры, использующиеся, прежде всего, в сетевом оборудовании.

Opteron — 64 бита для потребителя

Другой процессор, поддержка которого была интегрирована при развитии ветки 2.4.x, но заслуживающая упоминания здесь — поддержка Linux’ом процессоров AMD Opteron (основанных на архитектуре AMD64.) Это новый чип обратно совместим с существующими процессорами-клонами Intel и получивший даже “обратную” поддержку от Microsoft.
В то время как более поздние редакции ядра 2.4 поддерживали этот процессор, все же были ограничения, не позволявшие широкое использование этих систем. Наиболее критичным при использовании в высокопроизводительных системах является то, что каждая задача ограничена 512 Мбайтами памяти. Кроме того была улучшена поддержка х86 (32-разрядных) программ.

поддержка “субархитектуры”

Эта версия Linux включает также новую концепцию, называемую “субархитектурой”. Раньше Linux чаще всего предполагал, что тип процессора и тип его аппаратного окружения совпадают. То есть потомки i386 процессоров используются исключительно в PC/AT-системах. В ядре 2.4. это допущение было нарушено в отношении i386, с добавлением поддержки Visual Workstation от SGI “без наследственной” платформы, работающей на чипах Intel.
В связи с этим «приходят» две новые платформы, поддерживающие i386. Первая — архитектура NCR Voyager. Это SMP система поддерживает 486-686 процессоры в конфигурации вплоть до 32-х процессоров. Количество проданных машин данной архитектуры довольно мало, и еще не все поддерживаются (наиболее старые не поддерживаются). Вторая поддерживаемая архитектура — более широко распространенная платформа PC-9800, разработанная фирмой NEC. Оригинальные РС-9800 машины строились на базе 8086 процессоров и дальнейшем их развитии, в итоге выросшем в Pentium. Выпуск этой линейки был официально прекращен производителем в пользу более “стандартных” PC-шек.
Формализация поддержки Linux’ом этих "незначительно различных" аппаратных типов позволит более легко портировать ОС на другие системы, такие, как выделенные хранилища данных и другие подобные компоненты.
Вышесказанное отличается от Linux, запущенного, например, на X-Box, потому что не драйверы или другие особенности, а нечто другое отличает эту систему от основных i386-систем. Поддержка X-Box не является субархитектурой.

масштабирование вверх — NUMA и большое железо

Новый выпуск ядра включает особенности, которые делают более приемлемым его использование на крупных серверах (некоторые работают на i386 процессорах, некоторые нет). Поскольку данная отрасль относительно в новинку для Linux, многое еще предстоит сделать (в направлении оптимизации).
Важнейшим изменением в этом отношении стала поддержка серверов с NUMA. NUMA (Non-Uniform Memory Access, неоднородный доступ к памяти) является шагом в сторону от традиционного SMP в многопроцессорном мире, и это шаг вперед к эффективности систем, имеющих много процессоров. SMP-системы были разработаны с некоторыми ограничениями, характерными для их однопроцессорных коллег. Одним из существенных ограничений при выборе такого дизайна является то, что он основан на едином пуле памяти, который разделяют между собой все процессоры системы. В многопроцессорных системах это приводит к сильной конкуренции между процессорами, работающими на одной шине памяти. NUMA-серверы обходят данную проблему, представляя следующую концепцию: отдельному процессору предоставляется часть памяти, не доступная другим процессорам . Один простой путь (технически довольно корректный) состоит в том, чтобы представить, что вы имеете систему с платами расширения, содержащими процессоры, память и, возможно, другие компоненты (ввода-вывода и др.). Некоторое количество таких плат в системе могут “свободно” общаться между собой, каждый процессор имеет свободный доступ к локальной памяти (кроме того доступ к памяти на плате процессора быстрее чем к памяти на выделенной плате). Во многом архитектура NUMA является примером очень сильно связанного кластера.
Чтобы должным образом поддерживать новые NUMA-машины, необходимо было адаптировать Linux сразу в нескольких направлениях, чтобы новая модель стала эффективной. Для начала был создан API внутренней топологии, позволяющий ядру понять, как один процессор или один пул памяти связаны с устройствами ввода-вывода и как они связаны между собой. Опираясь на эту информацию, планировщик процессов Линукса теперь может понять эти взаимосвязи и оптимизировать выполнение задач с наиболее выгодным распределением локальных ресурсов. Кроме того, многие NUMA-машины построены таким образом, что имеют “дыры” в линейном адресном пространстве между узлами. Новое ядро решает эту проблему разумным способом. Было сделано множество других внутренних изменений, которые позволят Linux работать с этими новыми хай-энд машинами. В течение следующего года мы можем ожидать новые доработки и усовершенствования поддержки этих высокопроизводительных систем.

Hyperthreading

Хотя это не новинка Linux 2.6., поддержка Hyperthreading появилась еще в ядре 2.4.17, данная возможность описывается здесь потому, что начальный релиз 2.4. не поддерживал Hyperthreading, а также потому, что с того времени сделано много серьезных изменений). Hyperthreading — это способность одного процессора маскироваться для ОС под два или больше. Естественно, процессор, претендующий быть “двумя”, все же остается одним процессором и производительность растет не сильно.

вопросы размера — усовершенствование масштабируемости

Кроме поддержки NUMA, в новом ядре реализованы и другие изменения, касающиеся серверов Intel, стоящих на верхушке “пищевой цепочки”. Первое — это полная поддержка PAE (Physical Address Extension, расширение физического адреса), которая позволяет новейшим 32-битным х86 системам адресовать до 64 Гбайт ОЗУ. Кроме того, посредством улучшенной поддержки APIC и других изменений, было существенно улучшено распределение IRQ в многопроцессорных системах.
Были расширены пределы некоторых внутренних ограничений. Так, количество уникальных пользователей и групп системы возросло с 65000 до более чем 4 миллиардов (с 16 до 32 бит). Это позволит Linux работать на больших файл-серверах и серверах аутентификации, где ранее, возможно, поджимали предыдущие ограничения. Точно так, максимальное количество PID-ов было увеличено с 32000 до 1 миллиарда. Это изменение, совместно с другими усовершенствованиями в PID-подсистеме, улучшит производительность запуска приложений на очень занятых или долго работающих системах. Хотя максимальное количество открытых файлов не было увеличено, ядро 2.6. более не требует вашего вмешательства в установление этого предела заблаговременно, а самомасштабирует это количество. И, наконец, Linux 2.6. включает улучшенную поддержку 64 бит на блочных устройствах, поддерживающих работу в данном режиме, даже на 32-битных платформах, таких, как i386. Это позволяет создавать файловые системы, размером до 2 Тбайт.

интерактивность и скорость реакции ядра

Главное внутреннее изменение, представленное в ядре 2.6. и значение которого не может быть преуменьшено, это то, что теперь само ядро является выгружаемым. В предыдущих версиях Linux, когда ОС выполняла что-либо в ядре, она не могла быть прервана (на многопроцессорных машинах это было истинно в отношении каждого процессора). Начиная с ядра 2.6., пользовательская задача может прервать работу ядра даже если оно выполняет нечто сложное (чтобы избежать вызванных этим явных коллизий, ядро имеет части, которые не могут быть прерваны в процессе выполнения). Основной выигрыш, достигнутый этими изменениями, заключается в том, что улучшается интерактивная производительность (например при работе пользователя настольной системы) и таким образом система становится более чувствительной к таким вещам, как пользовательский ввод.
Другим изменением, позволившим Linux стать более интерактивной ОС в отношении приложений, поддерживающих такую интерактивность, стала поддержка новых "futexes" (Fast User-Space Mutexes, быстрые семафоры пользовательского пространства). Futexes — это возможность, с помощью которой множественные процессы и нити могут выстраивать последовательность событий так, что они не будут наступать друг другу на пятки (состояние гонки). В отличие от традиционных операций взаимоисключения, поддерживаемых большинством библиотек распараллеливания процессов, данный способ частично базируется на поддержке ядра (но только в случае возникновения разногласий). Он также поддерживает систему приоритетов, позволяющую приложениям или нитям с более высоким приоритетом получить первоочередной доступ к запрошенным ресурсам. Программное определение приоритета задач позволило получить более интерактивную систему, что может быть очень важно в критичных ко времени приложениях.
Серьезным изменениям подверглась подсистема ввода-вывода, сделав его более чувствительным независимо от степени загрузки. Эти изменения включают полностью переписанную подсистему планирования ввода-вывода, кода ядра, определяющего какие процессы будут производить чтение с устройств и когда. Учитывая более раннюю оптимизацию, которая обеспечивала чтение в порядке, наилучшем относительно оборудования, переписанный код обеспечивает исключение долговременного простоя процессов в ожидании ввода-вывода.
И хотя разработчики приложений реального времени получают максимальный выигрыш от этих изменений, 2.6. все же не является ядром реального времени. Однако эти и другие изменения делают возможным создание основы для полностью RT-версии Linux, и уже есть сторонние патчи (пока не утвержденные и не включенные в официальный выпуск ядра), которые обеспечивают поддержку пользователей и разработчиков, нуждающихся в этом сейчас.

подсистема модулей и драйверы устройств


Первое и наиболее очевидное изменение в драйверах ядра 2.6. — это изменение расширений файлов. Вместо бывшего “.о” (стандартное расширение для объектных файлов) теперь используется расширение “.kо” (kernel object). Это лишь косметическое изменение, делающее более ясным то, что модули не являются промежуточными объектными файлами.
Абсолютно не косметическое изменение — огромная работа, проделанная для устранения состояний гонки, которые имели место в коде многих предыдущих ревизий. Загвоздка в том, что какое-либо устройство может обратиться к модулю в процессе его выгрузки, но уже после того, как модуль проверит, не используется ли он. Новый код модульной части ядра сводит такие состояния к минимуму.
Улучшенная прозрачность — еще одна возможность новой подсистемы модулей. Почти во всех предыдущих версиях Линукса модули были достаточно умными для определения устройств, поддерживающих определение ID устройства сканированием шин (таких как PCI, ISA PnP, и PC Card). В ядре 2.6. большая часть такой поддержки была стандартизована и вынесена вне ядра, что позволило внешним программам и загрузчикам модулей определять, какие устройства поддерживает конкретный модуль. Это позволит различным программам управления оборудованием (таким, как kudzu) принимать интеллектуальные решения об оборудовании, даже если они его не “знают”. И если вы уверены, вы можете заставить драйвер попытаться работать с устройством, которое он не поддерживает (посредством интерфейса новой файловой системы sys, описанной ниже).

другие усовершенствования

В дополнение ко многим изменениям, описанным выше, было сделано много других основных изменений внутри Linux, повышающих производительность во многих случаях. В них вошло много устранений Big Kernel Lock (грубые блокировки, использовавшиеся в ранних версиях системы, поддерживающих несколько процессоров), оптимизация упреждающего чтения файловой системы, отложенная запись, манипуляции с маленькими файлами и другое.
В Linux 2.6. решена одна из серьезных проблем стабильности: более невозможно выделить памяти больше, чем есть ОЗУ (плюс своп). Раньше, в некоторых случаях, Linux мог позволить успешно вызвать malloc() (выделение памяти) даже если память была исчерпана. Была пересмотрена логика выделения ресурсов и подобные случаи сделаны невозможными.
Одним из больших внутренних изменений стала полностью переписанная инфраструктура нитей, позволившая использовать поверх себя Native POSIX Thread Library (NTPL). Это дало серьезное увеличение производительности на процессорах Pentium Pro и лучше в сильно “распараллеленных” приложениях, многие крупные игроки уровня предприятия требовали этого (фактически, Red Hat портировала эту возможность в ядро 2.4., входящее в состав Red Hat Linux начиная с версии 9.0). Это изменение привнесло новые концепции в Linux, включая группы нитей, локальная память отдельных нитей, сигналы в стиле POSIX и многое другое. Одним из главных недостатков является то, что приложения (такие как Sun Java) написанные без учета данной спецификации и опирающиеся на старый Linux-isms, не будут поддерживаться. Поскольку преимущества оказываются довольно дороги (и учитывая множество крупных игроков в игре) , становится ясным, что большинство важных приложений включат поддержку изменений задолго до выхода нового ядра.
И, наконец, хотя большинство приложений не получат прямой выгоды, ядро 2.6. теперь включает возможность полностью отказаться от поддержки свопа при компиляции ядра. Это позволит Linux’у работать в немного меньшем объеме памяти, что может быть полезно во встраиваемых устройствах, где маловероятно использование свопа.

абстракция объектов ядра

Ядро новой инфраструктуры модели устройств — новый объектно-ориентированный интерфейс, который должны использовать все низкоуровневые устройства. Эта объектная структура устройств ядра (называемая “К-объект”) включает все интерфейсы, необходимые для обеспечения связей и обработки подустройств. Низкоуровневые устройства (такие, как системные шины) теперь используют эту общую прослойку для представления системы в унифицированном виде, как в ядре, так и в пользовательском пространстве.
С этой новой информацией, полностью размещенной в ядре, Linux способен лучше поддерживать системы, где требуется глубокое знание оборудования. Очевидным примером использования этой информации является управление электропитанием. В последние годы стандартом управления питанием является ACPI. В отличие от APM, системы с этим новым интерфейсом должны индивидуально сообщать всем совместимым устройствам о том, что они должны изменить свое состояние питания. Другой пример использования данной возможности — шины с “горячим” подключением. Возможность подключать устройства после загрузки системы сейчас воспринимается как должное, но до версии 2.2. включительно ядро не поддерживало “горячее” подключение. Начиная с ядра 2.4. эта возможность была отработана и включена поддержка “горячего подключения” PCI, PC Card, USB, и Firewire устройств. Новая ревизия централизованной системы устройств ядра развивает данную поддержку и практически стирает разницу между устройствами с “горячим” подключением и без оного. Когда вы загружаете компьютер, подсистема обнаружения устройств систематически “подключает” все устройства вашей системы. После того, как были созданы представления в ядре для всех объектов системы после их обнаружения, независимо от того когда это произошло — во время загрузки или позже.

системная файловая система

Возможно, наиболее очевидным изменением для пользователя в новой модели устройств является создание новой системной файловой системы (дополняющей proc для процессов, devfs для устройств и devpts для псевдотерминалов UNIX98), называемой sysfs. Эта файловая система, монтируемая в /sys, является визуальным представлением дерева устройств, каким его видит ядро. Ядро получает эту информацию непосредственно от подсистемы объектов ядра: когда создается объект ядра, также создается файл или каталог (возможен явный отказ объекта ядра от создания записи в sysfs, если в этом есть необходимость).
После того, как каждое устройство в системе (точнее, К-объект) получает уникальную структуру каталогов, следующим логическим шагом становится экспорт различных известных атрибутов устройства (имя устройства, режим питания, прерывания и подобное) в дерево таким образом, что они могли быть прочитаны и записаны администратором. Этот выгодный побочный эффект (вначале слегка запутывающий) позволяет многие аппаратно-зависимые случаи использования /proc/sys перенести в /sys уже сегодня или же в будущем.

внутренние шинные архитектуры устройств

В Linux 2.6. включено существенное обновление подсистемы ISA Plug-and-Play (PnP), делая ее практически законченной и хорошо интегрированной в остальную часть новой модели устройств. Среди новых возможностей — полная поддержка PnP BIOS, базы данных имен устройств и другие изменения, делающие поддержку более устойчивой.
Альтернативами PnP в ISA (довольно не популярными) были MCA (архитектура микро канала) и EISA (расширенная стандартная архитектура промышленного применения). Обе эти подсистемы были улучшены в процессе разработки Linux 2.6. с целью улучшения поддержки новой модели устройств. Более того, EISA была далее стандартизирована с другими подсистемами посредством включения базы данных имен устройств.
Шина PCI — наиболее распространенная и важная из всех шин — получила существенно улучшенную поддержку в процессе разработки ядра 2.6., включая усовершенствование “горячего” подключения и поддержки управления питанием.
Также новое ядро теперь поддерживает системы с несколькими AGP.
Кроме поддержки всех “физических” шинных архитектур, ядро 2.6. привнесло концепцию “функциональной” шины. Шина этого типа определена в каждой архитектуре и содержит все мыслимые и немыслимые устройства. В РС, например, она может включать набортные последовательный, параллельный и PS/2 порты — устройства, которые имеют место быть, но не привязаны к какой-либо физической шине в системе. На некоторых платформах данная функциональная поддержка может включать множество сложных вещей (таких, как запрос встроенного ПО), но чаще всего это лишь обертка, позволяющая устройству быть обработанным стандартным образом согласно новой парадигме драйвера.

шины внешних устройств

Все вышеперечисленные “старые” стандарты созревали и добавляли относительно немного новых возможностей в систему, чего нельзя сказать о USB. Универсальная последовательная шина претерпела множество изменений в течение недавнего времени. Самое заметное изменение — поддержка новым ядром устройств USB 2.0. USB2 — это новый стандарт, поддерживающий передачу данных со скоростью 480 Мбит/с (по сравнению с 12 Мбит/с у USB 1.1.). Устройства, поддерживающие этот стандарт и маркируемые как high speed USB, постепенно завоевывают рынок. Новый родственный стандарт, называемый USB On-The-Go (или USB OTG) — вариант точка-точка протокола USB, для соединения устройств напрямую друг с другом (например, для подключения цифровой камеры к принтеру без участия РС), в настоящее время не поддерживается ядром 2.6. (патчи с возможностью такой поддержки существуют, но пока не включены в официальный выпуск ядра). В дополнение к поддержке новых устройств, был пересмотрен внутренний пересчет USB-устройств таким образом, что стало возможным иметь доступ к намного большему числу однотипных устройств в Linux. В основном при этом выиграли большие принт- и файл-серверы (хотя последние, вероятно, будут использовать выделенную шину памяти).

беспроводные устройства

В области беспроводных сетей устройства можно разделить на дальнодействующие (например, устройства АХ.25 поверх любительского радио) и короткодействующие (обычно 802.11, но есть и более старые протоколы). Обе подсистемы были усовершенствованы в процессе разработки ядра 2.6. Главное изменение заключается в том, что основные компоненты “короткодействующей” подсистемы, поддерживающие различные платы и протоколы, были объединены в единую “беспроводную” подсистему и API. Такое объединение решило проблему мелких несовместимостей различных поддерживаемых устройств, и усилило подсистему поддержки Linux’ом единого набора пользовательского инструментария, позволяющего работать со всеми поддерживаемыми устройствами. В дополнение к стандартизации, Linux 2.6. предлагает множество полноценных усовершенствований, включая улучшенную способность уведомления в случае изменения состояния устройства (например, состояние перемещающихся устройств) и изменения в ТСР, позволяющие лучше обрабатывать периодические задержки, возникающие в беспроводной сети.
Значительный прогресс был достигнут в обеспечении поддержки Bluetooth-устройств. Сам протокол работает с двумя различными типами передачи данных: SCO (Synchronous Connection Oriented, синхронно-ориентированное соединение), предназначенное для аудио приложений не чувствительных к потерям при передаче; и L2CAP (Logical Link Control and Adaptation Protocol, протокол контроля логического соединения и адаптации), для более устойчивого соединения, поддерживающий повторную передачу и подобное. Кроме того протокол L2CAP поддерживает различные под-протоколы (включая RFCOMM для соединения точка-точка и BNEP для Ethernet-подобного соединения в сеть). Следует упомянуть, что поддержка Bluetooth также была интегрирована в последние выпуски ядра 2.4.

поддержка блочных устройств

Большинство основных изменений касается подсистемы IDE, которая была переписана в процессе разработки нового ядра, решив много проблем масштабирования и других ограничений. Например, приводы IDE CD-RW теперь могут писать непосредственно реальным драйвером дисков IDE, что более аккуратно чем ранее (прежде требовался специальный драйвер, эмулирующий SCSI, который был запутан и труден в понимании). Также, IDE-система теперь способна запрашивать у BIOS машины информацию о неподдерживаемом контроллере и использовать разумные значения таймингов и другие данные. В отношении SCSI было сделано множество мелких улучшений, относящихся к расширенной поддержке и масштабированию. Одним специфичным усовершенствованием стала поддержка многоканальных SCSI-2 устройств, которые имеют более чем 2 LUN на борту. Другим важным изменением стала возможность отката для проверки смены носителя, как делает Microsoft Windows, для большей совместимости с устройствами, не полностью следующим спецификации. Поскольку данные технологии со временем были стабилизированы, Linux включил их поддержку.
Также теперь Linux имеет поддержку хоть и не самой шины хранилища, но прямой доступ к EDD (Enhanced Disk Device, усовершенствованное дисковое устройство) BIOS новейших машин , что позволяет ему “смотреть” глазами самого storage-сервера на его дисковые накопители. EDD BIOS включает всю известную ему информацию о том, какие шины хранилищ есть в системе (включая IDE и SCSI). Кроме простого определения конфигурации и другой полученной информации об имеющихся накопителях, имеется ряд других преимуществ. Например, новый интерфейс позволяет системе определить, с какого именно устройства была загружена система. Например, это позволяет продвинутым программам инсталляции использовать данную информацию чтобы определить, где разместить GRUB (загрузчик Linux).

файловые системы (ФС)

Файловые системы ext2fs и ext3fs, чаще всего устанавливаемые с Linux’ом по умолчанию, были значительно улучшены в процессе разработки Linux 2.6. Основным изменением стала поддержка расширенных атрибутов, или метаданных, которые могут быть встроены в ФС для каждого файла. Некоторые из этих атрибутов используются системой и могут быть изменены только рутом. Многие другие ОС уже активно используют этот вид атрибутов. К сожалению, наследники Unix обычно не имели достаточной поддержки расширенных атрибутов, и многие пользовательские программы (такие, как tar) должны быть обновлены, прежде чем смогут сохранять и читать эти атрибуты.
Первым использованием подсистемы расширенных атрибутов являются списки контроля доступа (СКД, ACL) POSIX. Контроль доступа POSIX — это надстройка над стандартными правами доступа Unix, которая позволяет осуществлять более четкий контроль. При необходимости (например при экспорте файлов в NFS), эти ACL могут быть отображены (но с осторожностью) в стандартные права доступа пользователь/группа.
Linux также получил ряд усовершенствований на уровне ФС для повышения совместимости с другими ОС. Во-первых, ядро 2.6. поддерживает Windows Logical Disk Manager (или Dynamic Disks). Это новая схема таблицы разделов, которую WindowsXP и следующие версии приняли для упрощения создания и изменения множества разделов (конечно маловероятно, что Линукс в ближайшее время будет использовать новую схему при инсталляции). В Linux 2.6. была изменена (переписана) поддержка NTFS, которая теперь может быть смонтирована в режиме чтение/запись. Поддержка записи все еще находится в экспериментальной стадии и постепенно совершенствуется.
Были сделаны изменения и в поддержке расширенных атрибутов HPFS (используемой в OS/2 и других ОС). Атрибуты в стиле HPFS были выделены в отдельное пространство имен.
Кроме вышеописанного, было сделано множество более мелких изменений в поддержке ФС. Была переписана quota, поддерживающая теперь гораздо большее количество пользователей. Отдельные каталоги могут быть помечены как синхронные, таким образом позволяя сделать все изменения “атомными” (положил сюда, появилось там). Данная возможность наиболее востребована в почтовых системах и базах данных, основанных на каталогах, что немного облегчает восстановление после сбоя диска. В ФС ISO9660 (используемую на CD-ROM) было добавлено “прозрачное сжатие”. И последнее, исключительно для улучшения поддержки баз данных с разделяемой памятью, была создана ФС, базирующаяся на памяти (hugetlbfs).

интерфейсные устройства для пользователей

Главным внутренним изменением в Linux 2.6. стал сильно переработанный уровень интерфейса пользователя (ИП). Уровень ИП является центром в исследовании пользователем системы Линукс, в него входят видеовыход, мышь и клавиатура. В новой версии ядра этот уровень был переработан и “модулирован” (от слова “модуль”, а не “модуляция”) намного больше чем прежде. Теперь стало возможным создать “безголовую” систему Linux, исключив поддержку дисплея и всего прочего. Основное преимущество подобной модульности получают разработчики встроенных систем, создающих устройства, которые могут администрироваться посредством сети или консоли, а для конечных пользователей преимуществом стал перенос в модули предположений по умолчанию об устройствах и архитектурах. Например прежде всегда предполагалось, что если вы работаете с РС, то вам необходима поддержка стандартного контроллера клавиатуры АТ (i8042); новая версия Linux устранила это требование, и ненужный код может быть удален из системы.

cети

Передовая сетевая инфраструктура всегда была главным козырем Linux. Эта ОС, уже поддерживает большинство доминирующих в мире сетевых протоколов, включая TCP/IP (v4 и v6), AppleTalk, IPX и другие (фактически из распространенных и не поддерживаемых на ум приходит лишь старый и сильно запутанный протокол NetBIOS/NetBEUI от Майкрософта).
Как и изменения во многих других подсистемах, большинство изменений в ядре 2.6., касающихся сетевого оборудования, скрыты от глаз и не очевидны. Сюда относятся изменения, дающие возможность воспользоваться преимуществами модели устройств и изменения во многих драйверах устройств. Например, теперь Linux имеет выделенную подсистему MII (Media Independent Interface, интерфейс, не зависящий от среды передачи, он же IEEE 802.3u), которая используется драйверами некоторых устройств. Эта подсистема исключает необходимость существования множества незначительно различных инстанций MII, которые поддерживались различными драйверами и различными способами, тем самым убрав дублирование кода и ненужную работу.
Одним из главных нововведений стала поддержка протокола IPSec. IPSec, или IP Security — это пул протоколов для IPv4 и IPv6, обеспечивающих криптографическую безопасность на сетевом уровне. На сегодняшний день поддерживается шифрование в ядре, включая разнообразные реализации SHA, DES и другие.
Касательно сетевых протоколов, была улучшена поддержка работы с групповой передачей (multicast networking). В основном эта возможность используется «пейджинговыми» системами (такими как Tibco) и ПО организации аудио/видео конференций. Теперь поддержка этих возможностей обеспечивается реализациями таких протоколов как SSM (Source Specific Multicast), MLDv2 (Multicast Listener Discovery) и IGMPv3 (Internet Group Messaging Protocol).
В ядре 2.6. протокол LLC выделен в отдельный стек LLC. LLC (Logical Link Control, он же IEEE 802.2) — это низкоуровневый протокол, используемый протоколами более высокого уровня. Частью данного изменения стало то, что драйверы протоколов IPX, AppleTalk, и Token Ring были переписаны с учетом новой общей подсистемы.
Среди мелких изменений — IPv6 был подправлен и теперь способен работать в сетях Token Ring. Реализация NAT/masquerading была расширена для лучшей поддержки протоколов, требующих нескольких соединений (H.323, PPTP и прочее). Также поддержка Линуксом конфигурирования VLAN-ов теперь не является “экспериментальной”.

сетевые файловые системы.

Следствием качественной поддержки Linux’ом сетевых протоколов является такая же качественная поддержка сетевых файловых систем. Монтирование (и иногда экспорт) сетевой ФС является одной из немногих высокоуровневых операций, поддерживаемых ядром непосредственно (наиболее очевидно, что “сетевые блочные устройства” не претерпели существенных изменений в ядре 2.6. и они в основном используются в специализированных приложениях, в которых вы так или иначе работаете с ними как с подобием ФС). Все остальные сетевые операции вынесены в пользовательское пространство и не относятся к области разработчиков ядра.
В мире Linux и unix-клонов наиболее распространена сетевая ФС, метко названная Сетевая ФС (Network File System, NFS). NFS — это сложный протокол расшаривания файлов (общего использования), корни которого уходят в прошлое *nix. Основным транспортным протоколом может быть TCP и UDP, кроме этого необходимы несколько под-протоколов, каждый из которых выполняется поверх протокола RPC (Remote Procedure Call, удаленный вызов процедур).
В Linux 2.6. эта ФС получила множество изменений и дополнений. Среди них — экспериментальная поддержка нового и пока не распространенного протокола NFSv4 в реализации как клиентской, так и серверной части (предыдущие версии системы включали поддержку версий v2 и v3 этого протокола). Новая версия поддерживает более сильную и безопасную аутентификацию (с шифрованием), более интеллектуальную блокировку, псевдо-ФС и прочее. Не все возможности NFSv4 реализованы в Linux на сегодня, но имеющаяся поддержка довольно стабильна и может быть использована в коммерческих приложениях. Кроме этого реализация серверной части NFS усовершенствована в отношении масштабирования (вплоть до 64-кратного увеличения одновременно обслуживаемых пользователей и очередей запросов), завершенности (посредством поддержки обслуживания с помощью TCP, в дополнение к UDP), устойчивости (отдельные драйверы ФС могут адаптировать путь к файлу в системах, которые их экспортируют), сопровождаемости (вместо системных вызовов, управление ФС новым nfsd). Среди менее очевидных изменений — разделение lockd и nfsd, поддержка нуль-копии (zero-copy) сети на поддерживаемых интерфейсах.
Была усовершенствована поддержка томов root-ФС (для бездисковых систем).
Кроме улучшенной поддержки сетевых ФС в стиле *nix, Линукс 2.6. принес множество усовершенствований сетевых ФС Windows-стиля. В Windows серверах (также как и в OS/2 и других ОС) стандартным протоколом “расшаривания” ФС является SMB (Server Message Block), и все последние версии Linux прекрасно поддерживают клиентскую часть этого протокола. Однако Windows 2000 опирается на новую надстройку этого протокола называемую CIFS (Common Internet Filesystem) . Цель такого существенного обновления состояла в упрощении и совершенствовании некоторых аспектов протокола SMB, что привело к окончательной путанице (сам протокол не был четко определен и часто расширялся, что стало причиной несовместимости даже между его реализациями в Windows 95/98/ME и WindowsNT/2000). CIFS призван добавить поддержку Unicode, улучшенную блокировку файлов, жесткие ссылки, устранить остатки зависимостей от NetBIOS и нескольких других возможностей для пользователей Windows. Так как пользователи Linux не любят сидеть в темноте подолгу, в ядро 2.6. включена полностью переписанная поддержка монтирования ФС CIFS. Linux 2.6. также поддерживает расширение протоколов SMB и CIFS, именуемое SMB-UNIX, которое позволяет ему посредством SMB-серверов, поддерживающих эти расширения (например Samba), получать доступ к файлам не-Windows типа (такими как узлы и символические ссылки).
Разработчики ядра не забыли и о пользователях Novell NetWare. Ядро 2.6. позволяет клиентам монтировать до 256 “шар” с одного тома NetWare, используя при этом встроенный драйвер ФС NCP (NetWare Core Protocol).
Linux 2.6. включает улучшенную поддержку относительно новых доменов сетевых ФС, систем, в которых файлы хранящиеся на одном логическом томе, могут быть распределены между несколькими узлами. Кроме представленной в Linux 2.4. ФС CODA, новое ядро включило некоторую поддержку еще двух распределенных ФС: AFS и InterMezzo. Поддержка AFS (Andrew FS) в настоящее время ограничена лишь операциями чтения. Вторая ФС, InterMezzo, также поддерживается начиная с ядра 2.6., но позволяет делать больше: например, предусмотрена операция разрыва соединения (таким образом вы работаете с кэшированными файлами локально), поэтому эту ФС можно использовать в приложениях высокой доступности, когда вам необходим постоянный гарантированный доступ к хранилищу (или имитация при отключении). InterMezzo также пригодна для использования в приложениях, нуждающихся в синхронизации файлов между несколькими компьютерами, такими, как ноутбуки, наладонники и ПК. Многие проекты обеспечивают поддержку этих типов ФС, позволяя Linux развивать их и дальше.

безопасность

Наиболее существенное изменение заключается в том, что система безопасности, полностью обеспечиваемая ядром, была “модулирована” (опять же, от слова “модуль”) и стала одним из многих альтернативных модулей обеспечения безопасности (сегодня, однако, существует лишь одна модель системы защиты по умолчанию и пример, как создать собственную). Вследствие этого нововведения все части ядра были изменены, и теперь используют новую систему как базовую, в отличие от старой системы “суперпользователя”. Все Linux -системы и в дальнейшем будут иметь учетную запись суперпользователя, но при этом будет учитываться возможность ее отсутствия. Другим изменением в безопасности стало то, что исполняемые модули (например драйверы, поставляемые производителем оборудования) теперь не могут “перегружать” системные вызовы по собственному усмотрению, а также не смогут модифицировать таблицу системных вызовов. Эти меры существенно ограничивают возможности модулей с не-окрытыми исходниками в ядре и, возможно, прикрывают некоторые юридические лазейки обхода GPL. Последнее изменение, относящееся к безопасности, — теперь Linux способен работать с аппаратными генераторами случайных чисел (присутствующих в некоторых современных процессорах), лучшими, чем основанный на энтропии пул (довольно хороший по общему признанию), базирующийся на случайных аппаратных флуктуациях.

виртуализация линукс

Одно из интереснейших нововведений в Linux 2.6. — поддержка архитектуры “user mode” (непривилегированного режима). По существу это портирование Linux (как на различные аппаратные архитектуры), реализующее полностью виртуальную среду выполнения Linux-в-Linux. Новая инстанция Linux выполняется также как обычное приложение. Внутри приложения вы можете конфигурировать “псевдо” сетевые интерфейсы, ФС и другие устройства посредством специальных драйверов, которые безопасным образом связаны с головной копией Linux. Такой подход полезен как в задачах разработки (профилирование и прочее), так и для анализа системы безопасности и забавы ради. И хотя большинство пользователей не нуждаются в такой поддержке, все же это прикольная фича.

Джозеф Праневич, перевод Death_Mokar.


Сетевые решения. Статья была опубликована в номере 10 за 2003 год в рубрике software

©1999-2024 Сетевые решения