From: Чекрыжев Виталий <http://linux.str.ru
Newsgroups: http://linux.str.ru
Date: Mon, 20 Oct 2004 18:21:07 +0000 (UTC)
Subject: Cooperative Linux в Windows
Когда возникает нужда запустить Linux не перегружаясь из Windows, то
мы уже научились пользоваться эмуляторами, и порядком привыкнув к ним,
прибегаем к их помощи. Самые популярные из них VmWare (http://vmware.com/),
VirtualPC (http://www.microsoft.com/windowsxp/virtualpc/),
QEmu (http://fabrice.bellard.free.fr/qemu/), Bochs ()http://bochs.sf.net/.
Причем VmWare, QEmu и Bochs кросс-платформенные эмуляторы.
VmWare прекрасно справляется со своей задачей, эмулируя все окружение
устройств виртуальной машины, позволяя запускать любую операционку
для x86. QEmu на текущий момент является еще промежуточным вариантом
до релизной версии. Однако и он неплохо справляется со своей задачей,
к тому же QEmu оптимизирован на работу с Linux (и в Linux).
Исходя из идеи эмуляторов они запускают машину в машине, а для этого
нужно полностью транслировать команды процессора программным путем.
Даже при эффективных алгоритмах на это уходит немало времени. Если
сузить задачу до возможности запуска только Linux, то картина
несколько упрощается. Поскольку чтобы запустить Linux нужно, по сути,
загрузить ядро, а это уже значит что эмулятор должен уметь
транслировать только команды ядра.
А дальше зададимся вопросом: что если и вовсе не эмулировать
процессор, в случае если host-OS и Linux-ядро работают на одном типе
процессоров, а запустить как отдельную программу?
Недавно появилась замечательная штука: coLinux, который позволяет
запустить Linux-ядро в Windows (NT/2K/XP/2K3) как отдельный процесс
через специальный драйвер в режиме нулевого кольца. Причем прослойка
получилась достаточно "тонкой", что сказывается на работе значительно
меньше, чем если бы то же самое запустить в эмуляторе.
Проект разрабатывается и распространяется под лицензией GPLv2. На
текущий момент последняя версия 0.6.2-pre1, которая работает на ядре
2.6.8.1. Уже сейчас можно скачать здесь (http://colinux.org/snapshots/).
Как же это чудо запустить? Установщик coLinux предлагает скачать с
сети образ файловой системы уже настроенной для работы. Образ своими
размерами не мал, и качать через dialup не всякий отважится, да и те,
кто имеют доступ к более скоростным соединениям не обязательно
рванутся качать эти увесистые файлы. Приложив некоторые усилия вы
можете самостоятельно создать свой образ с рабочим окружением.
Установка
Nota bene: coLinux использует особенности WinNT систем, поэтому для
установки потребуется компьютер с установленной версией Windows,
желательно не старее чем Win2K. Для работы в Win9X существует
ограниченный вариант. Все эксперименты с coLinux я проводил на WinXP.
Варианты установки:
* Установка базового набора драйверов
* Соединение Windows и coLinux через сеть
* Включение coLinux в существующую сеть (для этого дополнительно
требуется загрузить WinPCap библиотеку)
* Загрузка настроенного образа системы
Во время установки Windows ругнется на несертифицированный
Microsoft драйвер. Не обращайте внимания, подтвердите продолжение.
После установки нужно создать два больших файла: один для
установки дистрибутива, второй для swap. К сожалению, стандартными
средствами Windows выполнить это либо невозможно, либо долго...На
этом этапе мы вынуждены прибегнуть к помощи посторонних программ.
Можно скачать порт программы dd для Windows или использовать dd из
unix.
Создадим файл root_fs размером в один гигабайт и файл подкачки
размером в 64 мегабайта. Можно воспользоваться средствами
восстановления, которые как правило существуют на загрузочных
установочных дисках Linux. Загрузитесь с компакт-диска, подключите
раздел и выполните команды:
При создании образа диска размер задайте несколько больше того,
насколько рассчитываете его заполнить, так как потом он не будет
автоматически расширяться когда будет заполнено все свободное
пространство.
Вернемся обратно в Windows, и отредактируем файл настроек
default.colinux.xml. Обратите внимание - парсер конфигурации
чувствителен к dos переводам строки. В unix для перевода строки
используется только один символ (0xa), а в Windows два, поэтому
вооружитесь редактором, который может преобразовывать переводов
строк в unix стиль.
Ядро coLinux ядра общается с миром посредством блочных устройств
cobd (colinux block device). В секции block_device настраиваются
следующие опции:
* index - порядковый номер устройства
* path - путь к файлу (или устройству)
* alias - псевдоним-ссылка на другое устройство
* enabled - включено ли устройство
Параметр path может указывать не только на файл, но и на раздел. Таким
образом можно использовать данные и/или загружаться с уже
установленного Linux-дистрибутива (с некоторыми оговорками). ISO образ
компакт-диска хранится у меня на жестком диске на всякий случай и вот
случай предоставился.
Подключение разделов физических носителей производится по следующему
принципу: <block_device index="0" path="DeviceHarddiskNPartitionX"
enabled="true" />Где N=0,1,2... номер жесткого диска, а X=1,2,3,...
номер раздела.
При запущенном coLinux другие Windows программы не должны использовать
разделы подключенные таким образом!
Запуск
Теперь у нас есть подготовлена площадка для установки и запуска
coLinux. Запускается coLinux через colinux-демона, к которому
подключаются клиенты - терминалы. Демона можно запускать как обычную
NT-службу, это удобно если Linux работает как числомолотилка или
сервер и не нужно держать лишнюю открытую консоль.
Теперь можно запускать/останавливать службу coLinux через панель
управления служб, или из командной строки посредством net {start|stop}
coLinux
В набор поставки входят две терминальные программы:
colinux-console-fltk.exe (графическая) и colinux-console-nt.exe
(консоль). Первая предоставляет возможность управления сервером. Лично
для себя я выбрал вторую. Она простая и к тому же можно переключаться
в полноэкранный режим. Выход из программы осуществляется сочетанием
Win-Alt.
Чтобы coLinux работал как отдельный процесс, запускаем:
colinux-daemon.exe -c default.colinux.xml Автоматически запустится
терминал. Можно выбрать какой хотим запустить, если укажем параметр -t
{nt|fltk|...}
Установка дистрибутива Linux
Сразу оговорюсь: последующие шаги выполнены для дистрибутива
SlackWare. На то у меня есть несколько причин. Некоторые из них это
гибкость установки, а так же сказался фактор привычки - полюбившийся
дистрибутив. Для других дистрибутивов процесс инсталляции будет
отличаться, но принцип должен остаться прежним.
Разобьем весь этап установки на несколько шагов:
* Загрузка установщика
* Создание блочных устройств coLinux в /dev
* Форматирование разделов
* Подключение базового раздела
* Фактическая установка дистрибутива
* Донастройка установленной системы
Загрузка установщика
Установочный образ initrd.img я взял с первого диска SlackWare-10.0,
из каталога isolinux.
Теперь отредактируем default.colinux.xml для загрузки с этого образа.
Там укажем файл образа как initrd файл и укажем опцию root.
Запускаем colinux-daemon -c default.colinux.xml. Если все предыдущее
было выполнено успешно, то начнется процесс загрузки и откроется окно
терминала. В результате вам будет предложено войти в систему и начать
процесс инсталляции. По хитрому умыслу там задуман fake авторизации,
поэтому достаточно дважды нажать Enter.
Создание блочных устройств coLinux в /dev
Установщик запущен, теперь подготовим файлы устройств. По каким-то
причинам в документации не обозначены major-код для устройств. К
счастью, это можно подглядеть в /proc/devices. Что и делаем командой:
# grep cobd /proc/devices Хорошо, выяснили major устройства (он равен
117). Ядро поддерживает до 32-х. Создадим ноды для устройств: # for i
in 0 1 2 3 4 5 6 7 8; do mknod /dev/cobd$i b 117 $i; done
Форматирование разделов
Каждое cobd устройство в системе будет представлять собой один раздел.
Поэтому не будем создавать таблицу разделов на cobd. Форматирование
выполняется обычным образом. Систему будем устанавливать на
/dev/cobd0, swap установим на /dev/cobd1.
# mkfs.ext2 /dev/cobd0
# mkswap -v1 /dev/cobd1
Корневую файловую систему не обязательно форматировать под ext2,
можете выбрать на свой вкус. Для себя я выбрал ReiserFS (mkreiserfs).
Подключение базового раздела
# mount /dev/cobd0 /mnt
Так же подключим источник пакетов.# mount /dev/cobd2 /cdrom
Фактическая установка дистрибутива
SlackWare установщик требует чтобы в системе были определены жесткие
диски с Linux-разделами. У нас таких не водится и воспользуемся
обходным путем. В каталоге slackware есть подкаталоги с программами.
Для минимальной установки, чтобы запустить систему нам потребуются
программы из разделов a, ap, l.
Последовательно выполняем установку пакетов из подразделов:
# cd /cdrom/slackware/a
# ROOT=/mnt install-packages
# cd ../ap
# ROOT=/mnt install-packages
# cd ../l
# ROOT=/mnt install-packages
# cp /dev/cobd? /mnt/dev
Не обязательно устанавливать модули ядра - вам они все равно не
пригодятся.
Донастройка установленной системы
Cвежеустановленный Linux еще не содержит своего /etc/fstab, который
сейчас же и создадим в /mnt/etc/fstab (наша система все-таки еще не
основная).
/dev/cobd0 / ext2 noatime 2 2
/dev/cobd1 swap swap defaults 0 0
/dev/cobd2 /mnt/cdrom iso9660 noauto 0 0
proc /proc proc defaults 0 0
devpts /dev/pts devpts gid=5,mode=620 0 0
После установки выключим coLinux через halt -p или poweroff.
Секцию bootparams в default.colinux.xml меняем следующим образом:
<bootparams>root=/dev/cobd0 ro</bootparams>
Не забудьте дописать ro - без этого будет нарушен процесс проверки
целостности файловой системы при загрузке coLinux.
В новой системе теперь настроим сетевой интерфейс. В coLinux сетевой
адаптер назван как обычный ethernet-адаптер eth0, поэтому настройка
ничем не будет отличаться от настройки на физической машине со
SlackWare. Настройки сети смотрите в файле /etc/rc.d/inet1.conf.
Пример настройки адаптера inet1.conf
# Config information for eth0:
IPADDR[0]="192.168.0.1"
NETMASK[0]="255.255.255.0"
USE_DHCP[0]=""
DHCP_HOSTNAME[0]=""
В Windows на сетевом подключении я указал статический адрес. Fiat lux!
Сеть заработала :) В довесок поставил и настроил Samba для удобства
обмена файлами. Вот, вроде бы и все шаманства.
Эпилог
В статье описывается пакет тестовой версии 0.6.2. На текущий момент
последняя версия 0.6.1, в которой может не оказаться некоторых
настроек уже введенных в 0.6.2-pre1.
Напоследок несколько слов об особенностях работы coLinux. Недостатком
можно посчитать невозможность доступа до обычных блочных устройств
(CD-ROM, Floppy, HDD, ...), вместо этого coLinux общается с миром
через отдельные файлы или разделы жесткого диска. Хотя, вероятно,
можно связать cobd с именованным ресурсом типа /Device/CDROM.
Любопытно, но в Windows NT как и в классической Unix системе
реализована идея ассоциирования устройства (на самом деле не только
устройств, но и массы других объектов операционной системы) с файлом.
Разница лишь в том, что в дереве каталогов этих файлов нет. Так же
напрямую нельзя проигрывать звук. Вместо этого авторы предлагают
транслировать звук по сети на ESD сервер. С другой стороны - слушать
музыку в эмулируемой системе не совсем нормальное явление, не так ли?
8-S
Еще одной досадой является заморочки с подключением X сервера, что
тоже не так уж и обязательно. К тому же программу начали разрабатывать
относительно недавно, и возможны непредвиденные падения. В последних
релизах стабильность улучшена и разработка активно продолжается, так
что хочется верить, что вскоре мы будем пользоваться еще более
надежным и быстрым продуктом.
Данный программный продукт не очень подходит для знакомства с ОС
Linux, для этих целей лучше все же установить полноценный дистрибутив
и пользоваться полнофункционально работающими программами, либо
опробовать Linux в виде LiveCD, благо коих расплодилось практически на
все случаи жизни.