czwartek, 18 listopada 2010

Wygodna integracja Windows7 z Ubuntu za pomocą VirtualBoxa

Pisałem ostatnio o konfiguracji lokalnego repozytorium pakietów na potrzeby sal dydaktycznych, którymi się opiekuję na Politechnice Krakowskiej. Na salach tych, o których mowa nie będzie zainstalowany jedynie Ubuntu, ale również Windows7. Aby ułatwić sobie dalszą pracę w zarządzaniu tym systemem, postanowiłem zainstalować go w maszynie wirtualnej stosując VirtualBoxa. Jest wiele innych narzędzi do wirtualizacji, jednakże po lekturze różnych porównań w Internecie przekonałem się właśnie do wyboru narzędzia firmowanego logo Oracle. Oczywiście poza moją wygodą w administracji obu systemami na raz, najważniejsza jest wygoda i prostota obsługi przez potencjalnych użytkowników, którymi są studenci różnych kierunków Wydziału Mechanicznego. Ilość osób, które przewija się przez te sale w 2 tygodniowym toku zajęć (tygodnie parzyste i nieparzyste) zdecydowanie przewyższa pół tysiąca osób. Fakt ten wymaga, aby na sali wszystko działało bez zarzutu.

W tym poradniku chciałem przedstawić poszczególne kroki konfiguracji wirtualnej maszyny z Windows7 na potrzeby zajęć dydaktycznych. Na ile to będzie możliwe poszczególne czynności będą wykonywane za pomocą poleceń w konsoli, a nie za pomocą narzędzi graficznych.Takie podejście pozwala na pisanie skryptów, które potrafią znacznie ułatwić pracę w przypadku kiedy te same czynności należy wykonać kilka/kilkanaście razy.

Jedną z najbardziej przydatnych, a niestety mało znanych funkcji VirtualBoxa, która zostanie omówiona jest możliwość zmiany trybu pracy dysku i przełączenie go w stan resetu danych po każdym wyłączeniu maszyny wirtualnej.

Mam nadzieje, że przedstawione porady okażą się również przydatne dla typowego użytkownika komputera, a nie tylko dla osoby przygotowującej sale na zajęcia lub szkolenia.

Czynności wstępne

Na początek gorąco polecam zapoznać się z oficjalną dokumentacją narzędzia VBoxManage, które pozwala na wykonanie tych samych (a nawet więcej) czynności co ogólnie znany interfejs graficzny VirtualBoxa (strona dokumentacji tego narzędzia). Większość kroków w tym poradniku wykonanych jest za jego pomocą. Nie piszę jednak szczegółowych opisów dla poszczególnych poleceń, dlatego właśnie odsyłam do dokumentacji.

Pierwszą czynnością administracyjną, którą polecam na początek jest przygotowanie dodatkowego użytkownika, którego możemy nazwać np. "windows". Docelowo dla tego użytkownika zostanie ustawione, aby zaraz po zalogowaniu do systemu startowała wirtualna maszyna z Windows7. Można oczywiście ten krok pominąć i skonfigurować sobie VirtualBoxa do pracy na obecnie używanym koncie użytkownika.

Dodać nowego uzytkownika w Ubuntu możemy wybierając odpowiednio w menu:  
System → Administracja → Użytkownicy i grupy → Dodaj.

Instalacja VirtualBox
Instalację VirtualBoxa najlepiej przeprowadzać zgodnie z oficjalnym opisem zamieszczonym na stronie: http://www.virtualbox.org/wiki/Linux_Downloads. W Ubuntu sprowadza się to do dodania odpowiedniego repozytorium, pobrania i dodania kluczy uwierzytelniających oraz instalacji następujących pakietów:
sudo apt-get install virtualbox-3.2 dkms

Utworzenie wzorcowej maszyny wirtualnej
Przed stworzeniem pierwszej maszyny wirtualnej, która może być wzorcem do tworzenia kolejnych maszyn trzeba zalogować się na konto "windows" i tam uruchomić VirtualBoxa. Zaraz po zaakceptowaniu licencji można wyłączyć program.

W tym momencie można jeszcze utworzyć katalog, który będzie współdzielony pomiędzy Ubuntu, a Windowsem:
mkdir /home/windows/share

Tworzenie maszyny wirtualnej można wykonać w prosty sposób w konsoli. Takie podejście zostanie tutaj omówione. Osobom, które nie chcą szczegółowo wgłębiać się w poszczególne parametry i czytać dokumentację VBoxManage, polecam jednak interfejs graficzny. Tam wygodny kreator poprowadzi nas za rękę i znaczną część pracy zrobi za nas w tle. Później dla przećwiczenia polecam przygotowanie odpowiednich poleceń konsoli, które zrobią dokładnie to samo, co wcześniej ustawiliśmy w narzędziu graficznym.

Tworzenie wirtualnej maszyny dla Windows7 może składać się z następujących kroków:
  1. Utworzenie i automatyczne zarejestrowanie wirtualnej maszyny dla 32-bitowego Windows7:
    VBoxManage createvm --name Windows7_01 --ostype Windows7 --register
  2. Szczegółowa konfiguracja parametrów wirtualnej maszyny (szczegóły można doczytać w dokumentacji polecenia modifyvm):
    VBoxManage modifyvm Windows7_01 --memory 1780 --vram 40 --accelerate3d on --accelerate2dvideo on --boot1 dvd --boot2 disk --boot3 none --cpus 2 --pae on --hwvirtex on --largepages on --ioapic on --clipboard bidirectional --usb on --usbehci on
  3. Udostępnianie lokalnego katalogu dla zwirtualizowanego systemu:
    VBoxManage sharedfolder add Windows7_01 --name "share" --hostpath "/home/windows/share"
  4. Utworzenie kontrolerów IDE i SATA dla nośników danych:
    VBoxManage storagectl Windows7_01 --name "Kontroler SATA" --add sata --hostiocache on --controller IntelAhci
    VBoxManage storagectl Windows7_01 --name "Kontroler IDE" --add ide --hostiocache on --controller PIIX4
  5. Utworzenie i podpięcie dysku twardego (dysk rozszerzalny o maksymalnym rozmiarze 60GB):
    VBoxManage createhd --filename /home/windows/.VirtualBox/HardDisks/Windows7_01.vdi --size 60000
    VBoxManage storageattach Windows7_01 --storagectl "Kontroler SATA" --port 0 --device 0 --type hdd --medium /home/windows/.VirtualBox/HardDisks/Windows7_01.vdi
  6. Podłączenie napędu CD/DVD z włączoną funkcją zapisu (oczywiście ma to sens jeśli mamy nagrywarkę):
    VBoxManage storageattach Windows7_01 --storagectl "Kontroler IDE" --port 1 --device 1 --type dvddrive --medium host:/dev/sr0 --passthrough on
Tak przygotowana maszyna powinna być już widoczna i gotowa do uruchomienia z poziomu okienkowego interfejsu VirtualBoxa.

Zarządzanie VirtuaBoxem z poziomu konsoli
Do innych czynności, które możemy wykonać w konsoli można zaliczyć:
  • Uruchamianie maszyny wirtualnej. Maszynę możemy uruchamiać na dwa sposoby:
    VBoxManage startvm Windows7_01
    VirtualBox -startvm Windows7_01
    Generalnie skutek wykonania obu poleceń będzie ten sam. Jedyną różnicą jaką ja zauważyłem jest uruchomienie zadania w tle przez pierwsze polecenie, w odróżnieniu od drugiego polecenia, gdzie wiersz polecenia oczekuje na zamkniecie programu VirtualBox. To drugie polecenie przyda się właśnie na etapie konfiguracji GDM (opis w dalszej części poradnika).
  • Rejestrowanie maszyny wirtualnej. Przydaje się szczególnie jeśli przekopiujemy maszynę na inny komputer i chcemy z niej korzystać.
    VBoxManage registervm /home/windows/.VirtualBox/Machines/Windows7_01/Windows7_01.xml
  • Wyrejestrowywanie. Jeśli maszyna nie będzie dłużej wykorzystywana na bierzącym komputerze, bo np. została przeniesiona na inny, warto ją usunąć z wewnętrznego rejestru maszyn wirtualnych VirtualBoxa.
    VBoxManage unregistervm Windows7_01
Tworzenie kopii maszyny wirtualnej
Kiedy mamy już przygotowaną wzorcową maszynę wirtualną z Windows7 i chcielibyśmy ją powielić na inne komputery, warto najpierw zmniejszyć rozmiar wirtualnego dysku. W tym celu należy wykonać dwie czynności:
  • Zerowanie pustych bloków na dysku w Windows7 (uwaga: dysk musi być w trybie normal, a nie immutable - tryby te opisane są w dalszej części poradnika). Pomocne w tej czynności będzie małe narzędzie sdelete, które można pobrać ze strony Technet Microsoft (link do narzędzia). W wierszu poleceń w systemie Windows wpisujemy:
    sdelete -c
  • Kompaktowanie dysku w VirtualBox. Stosujemy polecenie:
    VBoxManage modifyhd /home/windows/.VirtualBox/HardDisks/Windows7_01.vdi --compact
Zabiegi te w moim wypadku pozwoliły na odchudzenie dysku wirtualnego z 9.4GB na 8.3GB. Ten 1GB potrafi zrobić różnicę podczas klonowania wielu dysków wirtualnych i ich późniejszego kopiowania na inne komputery.

Kolejnym krokiem jest tzw. proces klonowania dysku. Jest to nic innego jak jego kopiowanie z nadaniem mu unikalnego identyfikatora.  
VBoxManage clonehd /home/windows/.VirtualBox/HardDisks/Windows7_01.vdi /home/windows/.VirtualBox/HardDisks/Windows7_02.vdi --format VDI

Na sam koniec, kiedy przekopiujemy katalog z ustawieniami maszyny wirtualnej oraz dysk wirtualny na inny komputer warto się upewnić, że są ustawione odpowiednie prawa dostępu dla użytkownika windows:
sudo chown windows -R /home/windows/.VirtualBox
sudo chgrp windows -R /home/windows/.VirtualBox

Blokada dysków do zapisu
Dyski w VirtualBoxie mogą pracować w różnych trybach zapisu (po szczegóły odsyłam do oficjalnej dokumentacji). Co ciekawe przełaczać się między tymi trybami można jedynie za pomocą narzędzia VBoxManage - okienkowa wersja tego nie umożliwia. Mnie osobiście poza standardowym trybem normal, zainteresował szczególnie tryb immutable, który nie zezwala na zapisywanie trwałych zmian na wirtualnym dysku. Dzięki temu po każdych zajęciach ze studentami, system Windows jest przywracany do pierwotnego, wzorcowego stanu.

Technicznie działa to w ten sposób, że wszystkie zmiany jakie wprowadzi użytkownik podczas pracy w systemie zapisywane są na tak zwanym dysku różnicowym. Stan tego dysku jest resetowany po każdym wyłączeniu maszyny. W przypadku restartu maszyny stan nie jest kasowany, co ma zabezpieczać naszą tymczasową pracę na wypadek zawieszenia się systemu goszczącego (w tym wypadku Windows7).

Do przełączania między tymi dwoma stanami najwygodniej będzie przygotować osobne skrypty:
  • Przejście z trybu normal do immutable:
    #!/bin/bash
    
    VBoxManage storageattach Windows7_01 --storagectl "Kontroler SATA" --port 0 --device 0 --type hdd --medium none
    VBoxManage modifyhd /home/windows/.VirtualBox/HardDisks/Windows7_01.vdi settype immutable
    VBoxManage storageattach Windows7_01 --storagectl "Kontroler SATA" --port 0 --device 0 --type hdd --medium /home/windows/.VirtualBox/HardDisks/Windows7_01.vdi
    
    echo `date`" : convert normal to immutable" >> vm_log.txt
  • Przejście z trybu immutable do normal:
    #!/bin/bash
    
    VBoxManage storageattach Windows7_01 --storagectl "Kontroler SATA" --port 0 --device 0 --type hdd --medium none
    VBoxManage modifyhd /home/windows/.VirtualBox/HardDisks/Windows7_01.vdi settype normal
    
    for file in `ls /home/windows/.VirtualBox/Machines/Windows7_01/Snapshots/*.vdi`
    do
      VBoxManage closemedium disk $file --delete
    done
    
    VBoxManage storageattach Windows7_01 --storagectl "Kontroler SATA" --port 0 --device 0 --type hdd --medium /home/windows/.VirtualBox/HardDisks/Windows7_01.vdi
    
    echo `date`" : convert immutable to normal" >> vm_log.txt
W obu skryptach pierwszą i ostatnia czynnością jest odpowiednio odłączenie i podłączenie dysku do wirtualnego kontrolera SATA. W drugim skrypcie mamy dodatkowo odłączenie i skasowanie dysków różnicowych. Czynność ta zapewnia poprawną pracę w trybie normal i umożliwia wprowadzania dalszych zmian na wzorcowych dyskach wirtualnych (np. doinstalowanie kolejnych programów niezbędnych do zajęć).

Konfiguracja GDM
Do tej pory opisywane kroki należały raczej do standardowych czynności administracyjnych dotyczących zarządzania wirtualna maszyną VirtualBox. Jakiejś szczególnej wygody, o której jest mowa w tytule nie widać. Trzeba się zwyczajnie zalogować do systemu, uruchomić VirtualBoxa i wystartować maszynę z Windows7. Może nie jest to jakość szczególnie skomplikowane, ale każdorazowo wymaga wykonania kilku tych samych czynności. Aby to zmienić i nieco usprawnić uruchamianie Windowsa można przygotować specjalną sesja dla menadżera logowania GDM. Dzięki temu już podczas logowania użytkownik będzie mógł wybrać sesję z VirtualBoxem i automatycznym startem maszyny wirtualnej.

Na początek tworzymy i edytujemy skrypt vm_start.bsh do uruchamiania maszyny wirtualnej:
#!/bin/bash
VirtualBox -startvm Windows7_01

Później tworzymy nowy plik z ustawieniami dla sesji GDM:
sudo touch /usr/share/xsessions/windows7.desktop
sudo nano /usr/share/xsessions/windows7.desktop
do którego wpisujemy takie ustawienia:
[Desktop Entry]
Encoding=UTF-8
Name=Windows7
Comment=Sesja skonfigurowana dla użytkownika "windows". Dla pozostałych nie działa.
Exec=/home/windows/.VirtualBox/vm_start.bsh
TryExec=/home/windows/.VirtualBox/vm_tools/vm_start.bsh
Icon=
Type=Application
Teraz wystarczy się już wylogować i zalogować ponownie wybierając z listy sesję "Windows7". Powininna wystartować sama maszyna wirtualna bez startu sesji środowiska Gnome. Po wyłączeniu Windows w maszynie wirtualnej zamknie nam się również VirtualBox i zostaniemy automatycznie wylogowani z systemu.

Logowanie bez podawania hasła
Aby jeszcze bardziej ułatwić dostęp do Windowsa można wyłączyć konieczność podawania hasła przez użytkownika "windows". W tym celu logujemy się na konto z uprawnieniami roota i zmieniamy ustawienia użytkownika "windows" ustawiając opcję "Bez pytania o hasło przy logowaniu". Dzięki temu przy kolejnym logowaniu nie będzie trzeba podawać hasła i od razu wystartuje maszyna wirtualna. Warto również zwrócić uwagę, że dla użytkownika "windows" nie będzie już możliwości zmiany sesji na inną (nie pojawi się okienko wyboru sesji, tylko użytkownik od razu zostanie zalogowany).  Jeśli zależało by nam jednak na tym, aby znowu z poziomu użytkownika "windows" dostać do Gnome, w celu zmiany jakichś ustawień, to na powrót ustawiamy konieczość podawania hasła przez tego użytkownika. Można to również zrobić z linii komend poleceniem:
  • Logowanie bez podawania hasła:
    sudo usermod -a -G nopasswdlogin windows
  • Konieczność podawania hasła:
    sudo gpasswd -d windows nopasswdlogin 

Problemy i rozwiązania
Jedynym problemem jaki do tej pory spotkałem w korzystaniu z VirtualBoxa, było okresowe blokowanie się klawiatury w maszynie goszczącej. Zauważyłem, że dzieje się to zawsze po dłuższym czasie braku aktywności na komputerze, kiedy włączy się wygaszać ekranu w Ubuntu. Rozwiązanie oczywiście jest banalne - wystarczy wyłączyć wygaszać dla użytkownika "windows". W menu otwieramy kolejno: System → Preferencje → Wygaszacz ekranu i dla pewności ustawiamy:
  • Przejęcie w stan bezczynności po: 2 godzinach
  • Uruchomienie wygaszacza ekranu gdy komputer jest w stanie bezczynności: wyłączyć
  • Blokowanie ekranu, gdy wygaszacz jest aktywny: wyłączyć


Podsumowanie
Przedstawiony poradnik oczywiście nie wyczerpuje tematu konfiguracji VirtualBoxa w Linuksie. Nie jest to prawdopodobnie również jedyne rozwiązanie postawionych problemów, a pewne rzeczy może dało by się zrobić lepiej. Co sądzicie? Czekam na komentarze i spostrzeżenia z używania tego poradnika. Tylko proszę nie pisać do mnie per Pan, bo przecież nie jesteśmy na zajęciach, tylko na blogu :)

6 komentarze:

Anonimowy pisze...

Jeszcze jedną wadą jest to, że VirtualBox nie obsługuje portów równoległych - ma wsparcie jedynie dla COM-a. A deweloperzy nie spieszą się, żeby załatać ten problem. Chociaż przyznaję, że zdecydowana większość użytkowników nawet nie zauważy tego braku.

Pozdrawiam i życzę kolejnych ciekawych wpisów!

Bartek

Rafał Petryniak pisze...

Dzięki:)

Jedynym problemem jaki do tej pory zauważyłem, to problem z obsługą USB. Jednak z tego co doczytałem w Internecie to problem ten dotyczy tylko Ubuntu i nie jest on trudny w rozwiązaniu.

Anonimowy pisze...

Fajny artykuł do tego można dołożyć coś takiego:
VBoxHeadless --startvm Windows7_01 --vnc --vncport 5900 --vncpass password
i VB chodzi zdalnie z klientem VNC np Ultra VNC.
Problemem może być jeszcze wersja systemu
64-bity lub 32-bity.

Rafał Petryniak pisze...

Sprytne :-) A czy VB chodzi wtedy w trybie widocznym, czy pracuje sobie w tle?

Anonimowy pisze...

Przydał by nam się internet:
VBoxManage modifyvm Windows7_01 --memory 1780 --vram 40 --accelerate3d on --accelerate2dvideo on --boot1 dvd --boot2 disk --boot3 none --cpus 2 --pae on --hwvirtex on --largepages on --ioapic on --clipboard bidirectional --usb on --usbehci on --nic1 bridged --bridgeadapter1 eth1
Można go odpalić w tle przy starcie systemu MATKI
i stworzyć dowolną liczbę serwerów wirtualnych do poszczególnych aplikacji oczywiście o ile zasobów nam
starczy.

Anonimowy pisze...

Po zajęciach w jednej sal stwierdziłem, że również spróbuję zastosować to rozwiązanie na nowej platformie z dyskiem ssd. Dzięki za opis. Na pewno się przyda.

Prześlij komentarz