Słowem wstępu
Nie każdy chce odpalać obrazy w formacie ovm z hackmyvm na VirtualBoxie, chociaż to jest bardzo wygodne. Ale osoby, które posiadają serwer na Proxmoxie mogą również tam wrzucić wirtualki w formacie ovm. Niestety, to nie jest takie proste, jak tylko wrzucenie obrazu. Problemy są dwa: sam format, który trzeba przekonwertować na pliki, które rozpoznaje Proxmox; drugim problemem jest inna nazwy sieciówki (wiąże się to ze specyfikacją sprzętu).
1. Przesłanie obrazu
Aby to wszystko działało najpierw trzeba obraz przesłać. Można to zrobić standardowa przez scp, sftp. Jednak, żeby nie było za łatwo skorzystamy z nc (wersja OpenBSD i standalone) oraz z pv (aby oglądać na bieżąco pasek postępu)
1.1 Proxmox nasłuchuje
Wchodzimy na serwer Proxmoxa i nasłuchujemy na porcie 12345 (port można zmienić). Na tym serwerze nie instalujemy pv.
nc -vnl -p 12345 > hakujemy.ovm
1.2 Serwer wysyła plik
Na serwerze, skąd jest wysyłany obraz, odpalamy nc (najlepiej wersję OpenBSD) i wysyłamy plik. Jeżeli to nie jest wersja OpenBSD, to nie działa przełącznik -N i trzeba ręcznie zatrzymać po wysłaniu obrazu. Oczywiscie wcześniej zalecam zainstalować pakiet pv. Jeżeli nie chcesz używać pv, możesz zamienić na cat.
pv -p -t hakujemy.ovm | nc -N 10.0.0.5 12345
2. Konwersja
2.1 Rozpakowanie
Na samym początku z obrazu hakujemy.ovm należy wyciągnąć pliki. Tak naprawdę to jest plik w formacie tar.
tar xvf hakujemy.ovm
2.2 Operacje na Proxmoxie
Teraz przystępujemy do konwersji:
- tworzymy kolejny numer ID maszyny
- tworzymy wirtualkę (należy wziąć pod uwagę, że nazwa musi być zgodna z FQDM)
- importujemy dysk
- przypisujemy dysk do wirtualki
- ustawiamy w biosie startowanie z naszego dysku Poniżej są komendy, które to robią:
#Bierzemy Najwieksze ID i dodajemy kolejny numer
NEW_ID=$(qm list | awk '$1 ~ /[[:digit:]]/ {if ($1>b) (b=$1)} END{print b+1}')
#Tworzymy wirtualke
qm create $NEW_ID --name $NAME --memory 1024 --net0 virtio,bridge=vmbr0
#Importujemy dysk
qm importdisk $NEW_ID $NAME-disk001.vmdk local-lvm -format qcow2
#Przypisowujemy dysk
qm set $NEW_ID --scsi0 local-lvm:vm-$NEW_ID-disk-0
#Ustawiamy w biosie bootowanie na dysk
qm set $NEW_ID --boot c --bootdisk scsi0
3. Edycja sieciówki
Jak zmienić nazwę interfejsu?
Pozostaje nam zmienić nazwę sieciówki. Podczas startu systemu powinno się nam pokazać okno GRUBa. Jeżeli się nie pojawi, to trzymamy przycisk Shift.
Następnie klawisz e i szukamy wpis, gdzie zazwyczaj na początku jest Linux, na końcu RO, chociaż nie jest to regułą. U nas to będzie
linux /boot/vmlinuz-4.4.0-142-generic root=UUID=ed440236-4e13-4670-... ro
ro Zamieniamy na rw init=/bin/bash Wygląda to mnie więcej tak:
linux /boot/vmlinuz-4.4.0-142-generic root=UUID=ed440236-4e13-4670-80d6-7617e64... rw init=/bin/bash
klawisz F10 i po chwili ładuje się konsola do roota
Teraz w zależności od systemu należy zmienić kartę sieciową na prawidłową, nie będziemy zamieniać na eth0 jak przy XCP. Załóżmy, że jest to system Ubuntu 16.04. Więc ustawienie sieciówek jest prawdopodobnie w /etc/network/interface
cat /etc/network/interface
auto enp0s3
iface enp0s3 inet dhcp
Można sprawdzić jaką kartę sieciową wykrył system. Do tego służy komenda ip a. Najczęściej to jest ens18. Aby wszystko wstało poprawnie nazwę można zmienić poprzez sed.
sed -i 's/enp0s3/ens18/g' /etc/network/interface
4. Koniec
Restart i hakujemy. Na koniec załączam mój skrypt, który ułatwia większość operacji.
#!/bin/bash
#1. ustawienie odbierania
#2. ustawienie nadawania
#3. konwersja
KATALOG_OBRAZOW="/mnt/g/utils/obrazy systemowe/Linux/hacking/virtualki do testow/obrazy-hackmyvm/"
KATALOG_PROXMOX="/var/lib/vz/ova"
IP_PROXMOX='172.16.1.6'
PORT_PROXMOX='12345'
if [ ! $# -eq 2 ]; then
echo "Parametry to: [odbieram, wysylam, konwertuje] nazwa-obrazu"
exit
fi
if ! $( grep -q '.\.ova$' <<< $2 )
then
echo Nazwa pliku powinna się konczyć na ova
exit
fi
NAME=${2/%.ova/}
if [ $1 == 'odbieram' ]; then
cd $KATALOG_PROXMOX
nc -vnl -p $PORT_PROXMOX > $2
fi
if [ $1 == 'wysylam' ]; then
#cd $CATALOG_WSL
echo "Szukam : $2"
SZUKANY_PLIK=$(find "$KATALOG_OBRAZOW" -name $2 -print -quit)
if [ -z "$SZUKANY_PLIK" ]; then
echo "Nie mogę znaleźć : $2"
exit
else
#przełącznik -N działa tylko z wersja netcat-OpenBSD
echo "Wysyłam : $SZUKANY_PLIK"
pv -p -t "$SZUKANY_PLIK" | nc -N $IP_PROXMOX $PORT_PROXMOX
fi
fi
if [ $1 == 'konwertuje' ]; then
if [ ! -f $2 ]; then
echo "Brak pliku: $2"
exit
fi
#Sprawdzamy czy nie nie ma w nazwie obrazu znaku _
NAME_DISK=$(tar tf "$2" --wildcards '*.vmdk')
if [[ "$NAME" =~ "_" ]]; then
echo "Uwaga: w nazwie maszyny "$NAME" jest znak \"_\". Zamieniam nazwe z "$NAME" na ${NAME//_/-}"
NAME=${NAME//_/-}
fi
echo Wyodrebniam plik $NAME_DISK z "$2"
tar xf "$2" "$NAME_DISK"
#Bierzemy Najwieksze ID i dodajemy kolejny numer
NEW_ID=$(qm list | awk '$1 ~ /[[:digit:]]/ {if ($1>b) (b=$1)} END{print b+1}')
#Tworzymy wirtualke
qm create $NEW_ID --name $NAME --memory 1024 --net0 virtio,bridge=vmbr0
#Importujemy dysk
qm importdisk $NEW_ID $NAME_DISK local-lvm -format qcow2
#Przypisowujemy dysk
qm set $NEW_ID --scsi0 local-lvm:vm-$NEW_ID-disk-0
#Ustawiamy w biosie bootowanie na dysk
qm set $NEW_ID --boot c --bootdisk scsi0
echo Kasuje pl $NAME_DISK
rm $NAME_DISK
#-----Ostatni komunikat
echo
echo Edytuj karte sieciową w wirtualce:
echo
echo Debian
echo sed -i \'s/enp0s3/ens18/\' /etc/network/interface
echo
echo Ubuntu
fi
Zostaw komentarz