Поэкспериментировал с VirtualBox и убедился еще раз, что разумной производительности от виртуалки можно добиться только используя как диск виртуальной системы раздел живого винчестера, а не файл в ФС хост системы. А так как экспериментируя я открыл много нового для себя, то решил поделится своими наработками.
Некоторые рассуждения на тему raw дисков:
Собственно к выходу о том что виртуалка быстрее работает на raw диске я приходил и с VMWare под виндой, однако там были другого плана сложности - утилиты для того, что бы подвинуть/раздвинуть/уменьшить разделы на диске были не всегда доступны бесплатно без взлома... отсюда и доверие к этим утилитам не было высоким, а ведь доверять им приходится свои данные...
На Ubuntu - GParted из коропки работает как часы и с выделением места под новый раздел - нет никаких сложностей... они возникают позже...
Так вот, в GUI VirtualBox нет инструмента для создания диска виртуальной машины на разделе живого HDD, что некоторых приводит к мысли, что сделать этого вовсе нельзя. Но это - не так.
Заглянув в Help мы увидим, что в командной строке создать raw disk можно. И там расписаны несколько вариантов - весь диск, отдельные разделы на диске. И даже упоминается некоторая опция касающаяся доступа к диску... А вот тут нас поджидает еще одна сложность.
Вы же правильный линуксоид и работаете не под рутом, а кроме как у рута права на доступ к дисковым девайсам есть у группы disk. Но опасность в том, что что этой группе доступно слишком уж много:
stc@stc-work:~$ sudo find /dev/ -group disk
[sudo] password for stc:
/dev/sda7
/dev/sda6
/dev/sda5
/dev/sda2
/dev/sda1
/dev/ramzswap0
/dev/sda4
/dev/sda3
/dev/sda
/dev/sg1
/dev/loop7
/dev/loop6
/dev/loop5
/dev/loop4
/dev/loop3
/dev/loop2
/dev/loop1
/dev/loop0
/dev/ram15
/dev/ram14
/dev/ram13
/dev/ram12
/dev/ram11
/dev/ram10
/dev/ram9
/dev/ram8
/dev/ram7
/dev/ram6
/dev/ram5
/dev/ram4
/dev/ram3
/dev/ram2
/dev/ram1
/dev/ram0
И присвоив себе группу disk можно совершенно просто случайно форматнуть из под виртуалки любой раздел на вашем винчестере, напрмер.
И помогает этому тот метод, что первым описан в Help - создание виртуального диска дающего доступ к диску целиком:
$ VBoxManage internalcommands createrawvmdk -filename /path/to/file.vmdk -rawdisk /dev/sda
Но попробовав выполнить эту команду из под обычного пользователя вы быстро убедитесь, что вам не хватает прав. А выполнив успешно эту команду под sudo вы не сможете открыть этот диск в VirtualBox. Причем, если вы сможете открыть файлы описания устройства, поменяв на них права (ведь создавались то они под рутом) то вы все равно не сможете открыть устройство, на которое ссылается этот файл.
Тут слабые духом сдаются и запускают VirtualBox под root или дают себе группу disk. Чем открывают гостевой системе доступ к всему диску хостовой системы.
Решение (на мой взгляд - самое верное) лежит не на поверхности и мне стоило некоторого времени в интернете для того что бы найти его. Нужно всего лишь прописать правила для udev, которые на отдельные разделы дадут права доступа конкретному пользователю (или как вариант группе vboxusers).
Как это делается:
Создаем файлик /lib/udev/rules.d/99-vbox-disk-rights.rules
пишем в него что то типа:
KERNEL=="sda6", OWNER="stc"
или
KERNEL=="sda6", GROUP="vboxusers"
и так для всех разделов вашего винчестера которые вы хотите отдать в VirtualBox.
перегружаемся и видим примерно такую картику:
stc@stc-work:~$ ls -al /dev/sd*
brw-rw---- 1 root disk 8, 0 2010-10-01 15:13 /dev/sda
brw-rw---- 1 root disk 8, 1 2010-10-01 15:13 /dev/sda1
brw-rw---- 1 root disk 8, 2 2010-10-01 15:13 /dev/sda2
brw-rw---- 1 root disk 8, 3 2010-10-01 15:13 /dev/sda3
brw-rw---- 1 root disk 8, 4 2010-10-01 15:13 /dev/sda4
brw-rw---- 1 root disk 8, 5 2010-10-01 15:13 /dev/sda5
brw-rw---- 1 stc disk 8, 6 2010-10-01 15:13 /dev/sda6
При этом я советую менять либо владельца, либо группу, но не то и другое одновременно.
После этих манипуляций вы легко создадите....
а-н нет - пока у вас нет прав на весь диск - создать raw disk указанной выше командой без sudo вам не удастся. Для таких случаев help VBox советует пользоватся командой:
VBoxManage internalcommands createrawvmdk -filename /path/to/file.vmdk -rawdisk /dev/sda -partitions 1,5 -relative
И вроде победа близка, но в виртуалке вы опять видите весь диск хоста, за той лишь разницей, что прописать в раделы, отличные от указанных в команде, вы ничего не сможете.
Но, а куда же прописаться MBR-у гостевой системы? А для этого VirtualBox help советует ручками прописать MBR командой:
$ VBoxManage internalcommands createrawvmdk -filename /path/to/file.vmdk -rawdisk /dev/sda -partitions 1,5 -mbr winxp.mbr
При этом MBR пропишется не на диск а в файл образа, который ссылается на диск (на самом деле в соседний с ним файл). Ну и как с этим всем разбираться? Где взять правильный MBR если мы еще не поставили гостевую систему? Оказывается MBR прописывать самому вовсе не обязательно VBox отлавливает запись в область MBR и направляет ее в файлик, который лежит рядом с файлом описания raw диска.
Однако есть способ получше ИМХО: Если ссылаясь на /dev/sda можно создать образ диска с доступом ко всему диску, то почему не сделать диск из раздела?
Допустим я хочу восполдьзоваться 6-м и 7-м разделами с первого диска (на хост-машине я создаю эти разделы, но оставляю их неформатированными). Тогда я создаю два образа дисков VBox:
VBoxManage internalcommands createrawvmdk -filename /home/stc/.VirtualBox/HardDisks/sda.vmdk -rawdisk /dev/sda6
VBoxManage internalcommands createrawvmdk -filename /home/stc/.VirtualBox/HardDisks/sdb.vmdk -rawdisk /dev/sda7
Внутри виртуалки образы этих двух
разделов будут видны как два индивидуальных
диска. И инсталлируя ОС в виртуалке вы сможете разбить эти диски как вам захочется - ведь инсталлятор не найдет на них MBR и создаст свои, а в них вы уже пропишете такие и столько разделов, сколько вам нужно в виртуалке. Т.е. внутри каждого из разделов переданных виртуалке, будет создана разметка соответствующая целому диску. Ну а раз на диске есть место под MBR, то не будет никаких манипуляций VirtualBox с MBR.
Еще один бенефит от такого решения заключается в том, что переносить raw диски созданные по технологии предложенной в help затруднительно - ведь на другой машине вы вряд-ли сможете создать точно такую же конфигурацию разделов на диске. А вот диск созданный в разделе - переносится легко - ведь он создан как как целый диск и ему все равно - на каком по счету разделе или дорожке он будет на новой машине.
Важно, что на хост-машине - разделы, с которыми работает VBox будут неопознаными и с хост-машины их лучше никак не трогать.
Пользователь решил продолжить мысль [time]Mon Oct 4 21:33:29 2010[/time]:
Кстати, если кому интересен перенос raw девайсов:
Переносить раздел диска не пакуя - очень тяжелая операций, поэтому стоит диск ужать, и лучше это делать на лету. Чем?
tar не умеет работать с потоком (по крайней мере в ubuntu я этого от него добиться не смог) поэтому стоит воспользоватся такой командой
dd if=/dev/sdXY | bzip2 -9 > img-file.bz2
распаковка так :
bzcat img-file.bz2 > /dev/sdXY
Полезный совет - перед тем как переносить диск - почистите его от ненужной информации(кеши apt, ненужные логи и т.п.), а затем сделайте его еще чище - запишите на него файл с нулями размером со все свободное место. После таких операций диски пакуются очень хорошо.