Cooperative Linux в Windows

Вместо введения

Когда возникает нужда запустить Linux не перегружаясь из Windows, то мы уже научились пользоваться эмуляторами, и порядком привыкнув к ним, прибегаем к их помощи. Самые популярные из них VmWare, VirtualPC, QEmu, Bochs. Причем 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. Уже сейчас можно скачать здесь.

Как же это чудо запустить? Установщик 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. Загрузитесь с компакт-диска, подключите раздел и выполните команды:

# dd if=/dev/zero of=root_fs bs=1M count=1024
# dd if=/dev/zero of=swap bs=1M count=64
При создании образа диска размер задайте несколько больше того, насколько рассчитываете его заполнить, так как потом он не будет автоматически расширяться когда будет заполнено все свободное пространство.

Вернемся обратно в Windows, и отредактируем файл настроек default.colinux.xml. Обратите внимание - парсер конфигурации чувствителен к dos переводам строки. В unix для перевода строки используется только один символ (0xa), а в Windows два, поэтому вооружитесь редактором, который может преобразовывать переводов строк в unix стиль.

<?xml version="1.0" encoding="UTF-8"?>
<colinux>

    [...]

    <block_device index="0" alias="hda" path="\DosDevices\с:\coLinux\root_fs" enabled="true" />
    <block_device index="1" path="\DosDevices\c:\coLinux\swap_device" enabled="true" />
    <block_device index="2" path="\DosDevices\d:\iso\SlackWare-10.0\cd1.iso" enabled="true" />

    <bootparams>root=/dev/cobd0 ro</bootparams>

    [...]

</colinux>

Ядро coLinux ядра общается с миром посредством блочных устройств cobd (colinux block device). В секции block_device настраиваются следующие опции:

  • index - порядковый номер устройства
  • path - путь к файлу (или устройству)
  • alias - псевдоним-ссылка на другое устройство
  • enabled - включено ли устройство

Параметр path может указывать не только на файл, но и на раздел. Таким образом можно использовать данные и/или загружаться с уже установленного Linux-дистрибутива (с некоторыми оговорками). ISO образ компакт-диска хранится у меня на жестком диске на всякий случай и вот случай предоставился.

Подключение разделов физических носителей производится по следующему принципу: <block_device index="0" path="\Device\HarddiskN\PartitionX" enabled="true" />Где N=0,1,2... номер жесткого диска, а X=1,2,3,... номер раздела.

При запущенном coLinux другие Windows программы не должны использовать разделы подключенные таким образом!

Запуск

Теперь у нас есть подготовлена площадка для установки и запуска coLinux. Запускается coLinux через colinux-демона, к которому подключаются клиенты - терминалы. Демона можно запускать как обычную NT-службу, это удобно если Linux работает как числомолотилка или сервер и не нужно держать лишнюю открытую консоль.

Для установки службы нужно запустить: colinux-daemon.exe --install-service coLinux -c default.colinux.xml

Теперь можно запускать/останавливать службу 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. На то у меня есть несколько причин. Некоторые из них это гибкость установки, а так же сказался фактор привычки - полюбившийся дистрибутив. Для других дистрибутивов процесс инсталляции будет отличаться, но принцип должен остаться прежним.

Разобьем весь этап установки на несколько шагов:

Загрузка установщика

Установочный образ initrd.img я взял с первого диска SlackWare-10.0, из каталога isolinux.

Теперь отредактируем default.colinux.xml для загрузки с этого образа. Там укажем файл образа как initrd файл и укажем опцию root.

<initrd path="c:\coLinux\initrd.img" />
<bootparams>root=/dev/ram load_ramdisk=1 prompt_ramdisk=0 ramdisk_size=10000</bootparams>

Запускаем 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, благо коих расплодилось практически на все случаи жизни.

Ссылки к статье

http://colinux.org - официальный сайт coLinux

http://colinux.org/wiki - документация coLinux

http://colinux.org/snapshots - неофициальные горячие выпуски

 

Прикрепленные файлы

программа для создания пустых больших файлов в Windows. Исходный код включен в архив
mkbigfile.zip 792
Size: 24974 bytes
SHA1: 0103cdde334c7753c411e3141dce9136743afbb1


Метки: windowsразработка

Просмотров:
Опубликовано: 03.04.2016