czwartek, 18 listopada 2010

Wygodna integracja Windows7 z Ubuntu za pomocą VirtualBoxa

6 komentarze
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 :)

piątek, 12 listopada 2010

Konfiguracja lokalnego serwera pakietów Apt-Cacher NG

1 komentarze
W ostatnim czasie stanąłem naprzeciwko wyzwania szybkiej wymiany komputerów i oprogramowania na salach dydaktycznych, którymi się opiekuję na Politechnice Krakowskiej. Całościowy poradnik z przebiegu tej pracy przygotuję niebawem, jednakże już dzisiaj chciałem się podzielić doświadczeniami z konfiguracji lokalnego serwera pakietów Apt-Cacher NG.

Jednym z systemów, który miał zostać zainstalowany na każdym z 20 nowych komputerów miał być Ubuntu 10.04.1 LTS w wersji 64 bitowej. Najpierw postanowiłem przeprowadzić próbną instalację na jednej z maszyn, a dopiero później na pozostałych. Nie wiem z jakich powodów, ale po instalacji systemu, instalacja dodatkowych pakietów, a raczej ich pobieranie z Internetu trwało ok. 3 godziny! Na to nie mogłem sobie pozwolić podczas właściwej instalacji, ponieważ na montaż sprzętu i instalację systemu przed pierwszymi zajęciami miałem niewiele więcej czasu. Dodam jeszcze, że instalator zakomunikował mi pobranie z Internetu ok. 350MB danych do aktualizacji.

Sytuację udało się opanować dzięki skonfigurowaniu jednego komputera jako lokalnego systemu pakietów. Jego rolą miało być buforowanie (w slangu polsko-angielskim można by powiedzieć keszowanie ;-) ) pakietów pobranych z Internetu i udostępnienie ich innym maszynom w sieci lokalnej. W tym momencie w Ubuntu najłatwiej to osiągnąć stosując narzędzie Apt-Cacher NG (strona projektu). Poniższy poradnik udało mi się przygotować na podstawie kilku materiałów z Internetu, do których odsyłam w razie problemów:

Konfiguracja lokalnego serwera pakietów

Uaktualniamy lokalną bazę repozytoriów i pobieramy najnowsze aktualizacje:

sudo apt-get update
sudo apt-get upgrade

Instalacja narzędzia apt-cacher-ng z repozytorium:

sudo apt-get install apt-cacher-ng

Konfiguracja serwera i klientów

Uwaga: Należy pamiętać o właściwym ustawieniu adresu IP lokalnego serwera pakietów. Ja używam IP: 192.168.120.102. Należy go oczywiście zmienić na własny.
  • Konfigurujemy system pakietów apt (aplikacje apt-get, aptitude i inne), aby używał apt-cacher-ng:

    sudo echo 'Acquire::http { Proxy "http://192.168.120.102:3142"; };' | sudo tee /etc/apt/apt.conf.d/01apt-cacher-ng-proxy

    Możemy to oczywiście wyłączyć poleceniem:

    sudo rm /etc/apt/apt.conf.d/01apt-cacher-ng-proxy

  • Konfiguracja Synaptic z konsoli:

    Uwaga: Jeśli pracujemy na nowym komputerze zaraz po instalacji, należy najpierw uruchomić na nim Synaptica i odświeżyć listę pakietów. Można to zrobic również przez ssh łącząc się z opcją -X.

    sudo grep --color -i 'proxy' /root/.synaptic/synaptic.conf || sudo nano /root/.synaptic/synaptic.conf

    zamieniamy ostatnią linijkę, czyli znaki: ”};” na:

    useProxy "1";
      httpProxy "192.168.120.102";
      httpProxyPort "3142";
      ftpProxy "192.168.120.102";
      ftpProxyPort "3142";
      noProxy "";
    };

    Sprawdzamy jeszcze raz, czy wprowadzone zmiany znajdują się w pliku:

    sudo grep --color -i 'proxy' /root/.synaptic/synaptic.conf

  • Wczytujemy ponownie listę pakietów:

    sudo apt-get update

Import lokalnych plików instalacyjnych

Uwaga: Poniższe czynności wykonujemy tylko na serwerze!

W tym kroku zostaną zaimportowane lokalne pliki *.deb do repozytorium apt-cacher-ng. Dzięki temu narzędzie apt-cacher-ng nie będzie pobierać ponownie już raz pobranych plików.

test -x /var/cache/apt-cacher-ng/_import || sudo mkdir -p -m 2755 /var/cache/apt-cacher-ng/_import
sudo mv -uf /var/cache/apt/archives/*.deb /var/cache/apt-cacher-ng/_import/

Rozpoczynamy importowanie uruchamiając skrypt znajdujący się w dostarczonym panelu kontrolnym: http://localhost:3142/acng-report.html?doImport=Start+Import#bottom

Panel kontrolny i dostęp do dokumentacji

Twórcy narzędzia Apt-Cacher NG przygotowali bardzo prosty panel kontrolny (Dashboard), w którym użytkownik może zobaczyć statystyki z jego działania. Jest on dostępny pod adresem: http://localhost:3142/acng-report.html.

Warto również zajrzeć do oficjalnej dokumentacji, która po instalacji pakietu będzie znajdować się w poniższej lokalizacji (można kliknąć link i otworzyć w przeglądarce): file:///usr/share/doc/apt-cacher-ng/html/index.html.

Własne spostrzeżenia

Już teraz, po pierwszych próbach muszę przyznać, że narzędzie to oszczędziło mi sporo czasu i oczywiście sporo nerwów (oczekiwanie na zakończenie aktualizacji, lub też na instalację dodatkowych programów niezbędnych do zajęć, potrafi być stresujące, jeśli te zajęcia rozpoczynają się za kilka minut). Dla przykładu pobranie aktualizacji na 20 maszynach z Ubuntu, nie trwało tak jak wcześniej wspominałem 3 godziny, a zaledwie 2 minuty. Taką różnicę naprawdę się czuje :-)

Poza aktualizacjami zainstalowałem też kilkanaście dodatkowych pakietów. Nie wiem ile to było MB dla jednego komputera, ale wiem ile to było w sumie dla wszystkich. Poniżej załączam zrzut ekranu z Panelu kontrolnego, prezentujące statystyki pobrań pakietów z lokalnego serwera pakietów:



Jak widać ok. 16 GB! danych zostało pobranych z lokalnego serwera pakietów. Jestem przekonany, że fakt ten tak samo cieszy (a może bardziej) administratorów naszej uczelnianej sieci i oczywiście administratorów głównych serwerów pakietów dla Ubuntu.

Pozostałe uwagi i spostrzeżenia przedstawiam już w skróconej formie:
  • Idea działania Apt-Cacher NG jest taka, że po instalacji danego pakietu z dowolnego komputera w sieci lokalnej, pakiet ten powinien być już dostępny dla innych maszyn na serwerze. Ja jednak dla pewności przyjąłem taką strategię, że dany pakiet najpierw instaluje na serwerze, a później na wszystkich klientach na raz.
  • Wydawać by się mogło, że importowanie pakietów trzeba wykonać tylko raz. Jednak zdarzyło mi się już kilka razy, że niektóre pakiety pomimo pierwszej instalacji z głównego serwera, znowu były z niego pobierane jeśli instalowałem go ponownie na innej maszynie. Po zauważeniu takiego faktu, warto ponownie zaimportować pakiety.
  • Wyliczanie statystyk transferu przez panel kontrolny potrafi zawiesić Apt-Cacher NG. Ostatnio 2-krotnie po uruchomieniu ich zliczania Apt-Cacher NG przestawał odpowiadać na zapytania maszyn klienckich. Możliwe, że po prostu nie radził sobie z analizą logów i gdzieś się zawieszał. 
Moim zdaniem Apt-Cacher NG jest narzędziem jak najbardziej godnym polecenia.