С развитием технологий визуализации предприятия консолидируют физические серверы в виртуальную среду, тем самым повышая качество управления ресурсами при одновременном снижении энергопотребления и сокращении занимаемого физического пространства. В некоторых случаях проекты по консолидации предусматривают переход со старой операционной системы на новую, способную упростить обслуживание систем или дать другие преимущества для совокупной стоимости владения.
При планировании перехода с Solaris на Linux из-за различий в этих платформах почти весь специализированный код (в том числе код C, сценарии оболочки, Perl и т.д.) придется как-то исправить – "перестроить" отображения атрибутов.
Более того, как и в случае других языков, со сценариями Perl могут возникать проблемы, требующие исправления – хотя сама программа перемещаема между платформами, и нужно просто установить интерпретатор для выполнения кода на целевой системе. В коде часто используются специфические для Solaris ресурсы, в первую очередь пути операционной системы, системные команды и модули Perl. Поэтому для того чтобы сценарии Perl работали после миграции, потребуется некоторое изменение кода.
Но на какие синтаксические конструкции и операторы Perl следует обращать наибольшее внимание? В этой статье мы рассматриваем самые распространенные проблемы переносимости и предлагаем план переноса сценариев Perl с Solaris на Linux. Этот план можно использовать для миграции на Linux с большинства операционных систем UNIX (включая AIX, HP/UX и т.д.), однако все примеры, образцы кода и справки приведены для миграции Solaris-Linux.
Необходимо проверить все ресурсы, указанные в сценарии Perl, чтобы убедиться, что не возникнет никаких проблем из-за специфического для Solaris кода при его запуске на Linux-системе. Например, сценарий может извлекать информацию из файла, который присутствует только на Solaris, или системная команда может использовать флаг, которого нет в Linux.
Большинство проблем переносимости можно разделить на пять классов в зависимости от системных ресурсов, к которым они обращаются или на которые ссылаются, как указано в таблице 1.
Таблица 1. Классы проблем переносимости сценариев Perl
| Класс | Проблема переносимости |
|---|---|
| 01 | Зависимость от специфических для платформы модулей Perl |
| 02 | Команды операционной системы и IPC |
| 03 | Используемые пути операционной системы |
| 04 | Специальные переменные, содержащие специфическую для платформы информацию |
| 05 | Функции, которые реализуются по-разному или не реализуются на разных платформах |
Классы, перечисленные в таблице 1, ― список не всех проблем переносимости, а лишь наиболее распространенных из них. За более подробной информацией о проблемах переносимости обращайтесь к документации по программированию на Perl (см. раздел Ресурсы).
Пять шагов к идеальному переносу Perl
Рассмотрим план переноса сценариев Perl с Solaris на Linux. Этот план основан на классах проблем переносимости из таблицы 1. План включает в себя пять этапов, каждый из которых сфокусирован на одном из классов из таблицы 1. Каждый шаг указывает на проблемы синтаксических конструкций или операторов Perl, для решения которых может потребоваться внесение некоторых исправлений.
Шаг 1. Проверка зависимости от специфических для Solaris модулей
Этот первый шаг относится к проверке импортированных модулей Perl. Некоторые из них специально созданы для Solaris и "привязывают" сценарий к платформе Solaris. Нужно уметь выявить эти модули по коду сценария, выяснить, какие функции и переменные они используют, и внести соответствующие изменения.
Полный список специфических для Solaris модулей можно найти в хранилище CPAN ― их имена обычно начинаются с Solaris:: или Sun::Solaris::.
Для выявления файлов сценариев Perl с импортированными операторами, которые начинаются с Solaris или Sun, можно использовать сценарий оболочки, приведенный в листинге 1.
Листинг 1. Поиск импортированных модулей Solaris
#!/bin/bash
find . -name "*.pl" -exec grep -ilP "^\s*use (Solaris|Sun)" {} \;
|
Код из листинга 1 можно изменить так, чтобы этот сценарий точнее определял специфические для Solaris модули сценариев Perl. Например, можно преобразовать сценарий оболочки из листинга 1 в сценарий Perl и использовать для синтаксического разбора модуль PPI. Использование этого модуля выходит за рамки данной статьи, но мы рекомендуем его для повышения точности при анализе кодов Perl.
Выявив сценарии со специфическим для Solaris кодом, нужно найти эквивалентные модули, которые работают на Linux. Такие модули не всегда легко определить с точки зрения функциональности, так как оригинальные модули могли иметь дело с технологиями, работающими исключительно на платформе Solaris. В таких случаях придется выполнить более глубокий анализ.
Для использования эквивалентных Linux-модулей необходимо заменить все операторы импорта, а также любые вызываемые функции и переменные их эквивалентами для нового модуля.
Шаг 2. Проверка на вызовы системных команд Solaris
Вызов команд операционной системы из сценария Perl ― наиболее распространенная проблема при миграции с Solaris на Linux по нескольким причинам:
- отсутствие команды на целевой системе;
- команды с другими наборами флагов;
- команды, которые по-разному ведут себя на каждой из платформ.
Таким образом, при рассмотрении данного вопроса необходимо уделить особое внимание классу переносимости 02: системным вызовам.
Цель здесь заключается в том, чтобы любая системная команда, вызываемая сценарием, синтаксически и семантически правильно работала на Linux. Короче говоря, нужно выявить основные функции и операторы Perl, используемые в сценарии, которые выполняют специфические для Solaris системные команды.
Приведем пример. В листинге 2 показан простой сценарий Perl, используемый для отображения объема памяти системы Solaris.
Листинг 2. Сценарий Perl для отображения размера системной памяти
#!/usr/bin/perl
my $mem_info = `prtconf | grep Memory`;
my (undef, $mem_size) = split(':', $mem_info);
($mem_size, undef) = split(' ', $mem_size);
print "Memory size is: ".$mem_size."\n";
|
Теперь предположим, что мы хотим запустить тот же сценарий на Linux.
Мы знаем, что он вызывает конвейерную системную команду (prtconf | grep Memory) посредством оператора backtick, и что команда prtconf ― специфическая для Solaris.
Первый шаг состоит в поиске замены.
Можно использовать команду cat /proc/meminfo | grep MemTotal, но ее выход форматируется иначе, так как /proc/meminfo выдает информацию о размере в килобайтах, а prtconf ― в мегабайтах.
Для исправления этого сценария можно заменить ptrconf на cat /proc/meminfo, но сохранить выходную информацию в мегабайтах (выходная информация этого сценария может использоваться в качестве входных данных другими сценариями, поэтому очень важно, чтобы это не изменилось).
В листинге 3 приведен пример измененного сценария.
Листинг 3. Исправленный сценарий из листинга 2
#!/usr/bin/perl
my $mem_info = `cat /proc/meminfo | grep MemTotal`;
my (undef, $mem_size) = split(':', $mem_info);
($mem_size, undef) = split(' ', $mem_size);
$mem_size = int($mem_size / 1000);
print "Memory size is: ".$mem_size."\n";
|
Perl достаточно гибок, чтобы учитывать различные способы выполнения команд операционной системы, и существует множество функций и операторов, которые можно использовать для этой цели. В таблице 2 приведены основные функции и операторы Perl для вызова системных команд из сценария Perl.
Таблица 2. Основные функции и операторы, используемые для вызова системных команд
| Функция/оператор | Пример в Solaris | Пример в Linux |
|---|---|---|
backtick (``) | `prstat` | `ps -e` |
| system | system("psrinfo") | system("cat","/proc/cpuinfo") |
| exec | exec("/usr/sbin/df -kZ") | exec("/bin/df -kZ") |
| qx | qx/"metastat"/ | qx/"lvdisplay"/ |
| open | open DATA, "cat /var/cron/log |" | Open DATA, "cat /var/log/cron" |
| readpipe | readpipe( "cat /etc/default/login " ) | Readpipe( "cat /etc/default/login" ) |
За дополнительной информации об этих, а также любых других функциях и операторах, которые не являются частью основного языка Perl, обращайтесь к документации по Perl. Подробные сведения о различиях в командах системного администрирования содержатся в документе IBM Redbook Solaris to Linux Migration: A guide for system administrators [Миграция с Solaris на Linux: руководство для системных администраторов].
Шаг 3. Проверка используемых путей ОС
Теперь поговорим о переносе путей, используемых сценарием Perl; этот шаг аналогичен шагу 2. Здесь нужно обратить внимание на синтаксические элементы и операторы, которые используются для открытия файлов или манипулирования ими. Хотя для этого существуют специальные операторы, могут возникнуть некоторые проблемы с указанием пути. (За этим можно проследить и на шаге 2 при анализе вызываемых системных команд.)
В листинге 4 показан небольшой сценарий, который считывает файл config сервера NFS в Solaris и выводит его на стандартное устройство вывода.
Листинг 4. Сценарий Perl, который распечатывает содержимое системного файла на стандартном устройстве вывода
#!/usr/bin/perl open(NFSCONF, '/etc/default/nfs'); print <NFSCONF>; close(NFSCONF); |
При переходе с Solaris на Linux необходимо обратить внимание на системные пути, которые часто не совпадают.
В данном примере файл /etc/default/nfs, указанный в этом сценарии для Solaris, в дистрибутиве Linux/Red Hat отсутствует, но его можно заменить на /etc/sysconfig/nfs.
В листинге 5 показан исправленный сценарий.
Листинг 5. Исправленный сценарий из листинга 4
#!/usr/bin/perl open(NFSCONF, '/etc/sysconfig/nfs'); print <NFSCONF>; close(NFSCONF); |
Нужно знать все команды Perl для управления файлами. В таблице 3 приведены некоторые наиболее часто встречающиеся команды Perl, манипулирующие путями; если любая из них используются в сценарии, при миграции эти пути придется изменить.
Таблица 3. Общеупотребительные команды Perl, использующие путь
| Команда | Описание |
|---|---|
chdir | Изменяет рабочий каталог. |
chmod | Изменяет разрешение для списка файлов. |
glob | Возвращает список расширений имен файлов (возможно, пустой). |
link | Создает новое имя файла, связанное со старым. |
mkdir | Создает новый каталог. |
open | Открывает файл. |
opendir | Открывает каталог. |
rename | Изменяет имя файла. |
rmdir | Удаляет указанный каталог. |
sysopen | Открывает указанный файл и связывает его с указанным дескриптором файла. |
Некоторые специальные переменные содержат информацию об окружении, которая может быть специфической для Solaris; необходимо определить эти переменные и выполнить правильный перевод. В таблице 4 приведены несколько основных переменных, которые могут содержать специфическую для Solaris информацию или ссылки.
Таблица 4. Некоторые основные переменные Perl; список всех переменных см. в документации по программированию на Perl
| Переменная | Описание |
|---|---|
| ENV | Содержит текущие переменные окружения. Некоторые из этих переменных не обеспечивают прямого соответствия между Solaris и Linux. Примером могут служить переменные NETPATH, MSGVERB и SEV_LEVEL. |
| SIG | Содержит обработчики сигналов. См. раздел Ресурсы, где указана дополнительная информация о различиях в сигнализации на обеих платформах. |
Шаг 5. Функции, которые реализуются по-разному или не реализуются на разных платформах.
Некоторые основные функции Perl либо не реализованы на других платформах, либо реализованы по-разному; на Solaris эти функции будут вести и себя иначе, чем на Linux. Их нужно изменить их или найти дополняющую версию для платформы Linux и приспособить ее; опять же, обращайтесь к документации по программированию на Perl (см. ссылки в разделе Ресурсы).
Определить пять групп наиболее распространенных компонентов сценариев Perl, которые могут вызвать проблемы при переходе с Solaris на Linux (или с HP/UX и AIX на Linux), не так уж трудно. Но на внесение необходимых изменений в код, которые позволят успешно перенести сценарии на Linux, может уйти много времени, особенно при большом количестве таких сценариев. Советы и примеры по исправлению кода, приведенные в этой статье, помогут взяться за эту работу. Удачи!
Научиться
- Оригинал статьи (EN).
- За более подробными сведениями о Perl обращайтесь к документации по программированию на Perl :
- особенности Perl на разных платформах (EN);
- реализация основных функций (EN);
- предопределенные переменные (EN);
- переносимый Perl (EN).
- Собрание модулей Perl: CPAN.
- Книга IBM Redbook Миграция с Solaris на Linux: руководство для системных администраторов: прекрасное руководство для понимания различий в командах системного администрирования при переносе сценариев с Solaris на Linux (EN).
- Статья Руководство по портированию программ с Solaris на Linux на платформе x86 (developerWorks, апрель 2005 г.) поможет добавить существенные детали к вашему плану перехода (EN).
- Публикация Red Hat Переход с Solaris на Red Hat Linux Enterprise также может помочь в переходе с Solaris на Red Hat.
-
Будьте в курсе технических мероприятий и Web-трансляций developerWorks, посвященных самым разнообразным продуктам IBM и вопросам ИТ-отрасли.
- Примите участие в бесплатном семинаре developerWorks Live!, чтобы быстро освоить продукты и инструменты IBM и узнать о тенденциях ИТ-индустрии.
- Смотрите демонстрации developerWorks по требованию ― от иллюстрации процесса установки и настройки продуктов для начинающих до утонченной функциональности для опытных разработчиков.
- Следите за developerWorks по Twitter или подпишитесь на канал твитов по Linux на developerWorks.
Получить продукты и технологии
-
Оцените продукты IBM самым подходящим для себя способом: загрузите ознакомительную версию, попробуйте поработать в онлайне, используйте продукт в облачной среде или проведите несколько часов в песочнице SOA, чтобы научиться эффективно воплощать сервис-ориентированную архитектуру.
Обсудить
- Примите участие в жизни сообщества My developerWorks.
Поддерживайте связь с другими пользователями DeveloperWorks, читая блоги, форумы, группы и вики, которые ведут разработчики.
Вайнер Мошета (Wainer Moschetta) работает инженером-программистом в Бразильском центре Linux-технологий IBM, где руководит проектом по созданию инструментов для исправления кода при его переносе из операционных систем UNIX на Linux. Его послужной список включает тестирование драйверов устройств на платформе IBM System X, а также разработку и тестирование J2EE-приложений.
Даниэль Барбоза (Daniel Barboza) работает инженером-программистом в Бразилиьском центре Linux-технологий IBM, где работает над созданием инструментов миграции, включая средства автоматизации и правила перехода с операционных систем UNIX на Linux. Также занимался программированием на Eclipse, программированием для мобильных устройств на платформе System X и имеет степень магистра технологии мобильных сетей.