KVM (i raro i)VDI me nga miihini mariko tuku ma te whakamahi i te bash

Ko wai tenei tuhinga e whai ana?

Ko tenei tuhinga ka pai ki nga kaiwhakahaere punaha e pa ana ki te mahi ki te hanga i tetahi ratonga o nga waahi mahi "kotahi wa".

Prologue

I tonohia te tari tautoko IT o tetahi kamupene rangatahi e whanake haere ana me te whatunga rohe iti ki te whakarite "teihana mahi-whaiaro" hei whakamahi ma o raatau kaihoko o waho. Ko te tikanga ka whakamahia enei teihana mo te rehitatanga i runga i nga tomokanga o waho o nga kamupene, te tango raraunga mai i nga taputapu o waho, me te mahi tahi me nga tomokanga o te kawanatanga.

Ko tetahi waahanga nui ko te meka ko te nuinga o nga raupaparorohiko he "whakaritea" mo MS Windows (hei tauira, "Whakapuakitanga"), ahakoa te neke ki nga whakatakotoranga tuwhera, kei te noho tonu a MS Office te paerewa matua mo te whakawhiti tuhinga hiko. No reira, kaore i taea e matou te whakakore i a MS Windows i te wa e whakaoti ana i tenei raru.

Ko te raru nui ko te kohi raraunga rereke mai i nga huihuinga kaiwhakamahi, tera pea ka rere ke atu ki nga roopu tuatoru. Ko tenei ahuatanga kua rahua te MFC. Engari kaore i rite ki te quasi-state (te mana motuhake o te kawanatanga) MFC, ka nui atu te whiunga o nga whakahaere ehara i te kawanatanga mo enei ngoikoretanga. Ko te raruraru tino nui e whai ake nei ko te hiahia ki te mahi me nga purongo rokiroki o waho, ka mau tonu he paihere kino kino. Ko te tupono o te kawemai mai i te kino mai i te Ipurangi i kiia he iti ake na te aukati i te uru ki te Ipurangi ma te whakamahi i te rarangi ma o nga wahitau i uru mai nga kaimahi mai i etahi atu tari ki te whakawhanaketanga o nga whakaritenga, te whakauru i o raatau hiahia me o raatau hiahia, ko nga whakaritenga whakamutunga ka titiro. penei:

Nga whakaritenga haumarutanga korero

  • I muri i te whakamahinga, me whakakore nga raraunga kaiwhakamahi katoa (tae atu ki nga konae rangitahi me nga taviri rehita).
  • Ko nga tukanga katoa i whakarewahia e te kaiwhakamahi me whakamutu i te otinga o te mahi.
  • Te uru ipurangi ma te whakamahi i te rarangi ma o nga wahitau.
  • Nga here mo te kaha ki te whakahaere i te waehere tuatoru.
  • Mena kei te noho mangere te waahi mo te neke atu i te 5 meneti, me mutu aunoa te waahi ka horoi te teihana i a ia ano.

Nga whakaritenga a nga kaihoko

  • Ko te maha o nga teihana kiritaki mo ia peka kaua e neke ake i te 4.
  • Te wa tatari iti mo te punaha kia reri, mai i te wa i "noho" koe ki te timatanga o te mahi me te rorohiko a te kiritaki.
  • Ka taea te hono atu i nga taputapu peripheral (nga karapa, nga puku kohiko) mai i te waahi whakaurunga o te "teihana mahi-whaiaro".
  • Nga hiahia o te kaihoko
  • Te whakaatu i nga rauemi panui (whakaahua) i te wa e mangere ana te matatini.

Nga mamae o te mahi auaha

I te maha o nga takaro me nga livecds Windows, ka whakatauhia e matou ko te otinga kaore e pai ki te 3 nga tohu whakahirahira. He roa te waa ki te utaina, kaore ranei i te tino ora, ko o raatau whakaritenga i pa ki nga mamae mohoao. Kaore pea matou i rapu pai, ka taea e koe te taunaki i tetahi huinga taputapu, ka mihi ahau.

Na ka anga matou ki te titiro ki te VDI, engari mo tenei mahi ko te nuinga o nga otinga he nui rawa te utu, me aro nui ranei. Engari i hiahia ahau ki tetahi taputapu ngawari, me te iti o te makutu, ko te nuinga o nga raru ka taea te whakatau ma te whakaara ano / whakaara ano i te ratonga. Waimarie, i a matou he taputapu tūmau, he karaehe iti-mutunga i roto i nga manga, mai i te ratonga kua whakakorehia, ka taea e matou te whakamahi mo te turanga hangarau.

He aha te mea i tupu i te mutunga? Engari kaore e taea e au te korero ki a koe he aha te mea i puta i te mutunga, na te mea ko te NDA, engari i roto i te mahi rapu i whakawhanakehia e matou he kaupapa whakamere i whakaatu pai i roto i nga whakamatautau taiwhanga, ahakoa kaore i uru ki te mahi.

He torutoru nga whakahē: kaore te kaituhi e kii ana ko te otinga e whakaarohia ana ka whakaoti katoa i nga raruraru kua tohua, ka mahi i runga i te hiahia me te waiata. E whakaae ana te kaituhi i mua ki te korero ko Sein Englishe sprache he zehr schlecht. I te mea kaore i te whakawhanakehia te otinga, kaore e taea e koe te tatau i runga i te whakatika pepeha, i te whakarereketanga ranei o te mahi, kei o ringaringa nga mea katoa. Kei te whakaaro te kaituhi kei te mohio koe ki te KVM me te panui i tetahi tuhinga arotake mo te kawa Spice me te mahi iti me Centos tetahi atu tohatoha GNU Linux ranei.

I roto i tēnei tuhinga, e hiahia ana ahau ki te tūhura i te kaupapa matua o te otinga ka puta, inā koa te taunekeneke kiritaki-tūmau me te mauri o ngā tukanga huringa ora o te mīhini mariko i roto i te otinga. Mena he mea nui te tuhinga ki te marea, ka whakaahuahia e au ngā taipitopito whakatinanatanga o ngā whakaahua ora mō te hanga kiritaki angiangi e hangai ana ki Fedora, ā, ka matapakihia ngā taipitopito o te whirihora i ngā mīhini mariko me Ngā tūmau KVM hei whakapai ake i te mahi me te haumarutanga.

Mena ka tango koe i te pepa tae,
Te peita, te paraihe me te kāpia,
A he iti ake nga pukenga ...
Ka taea e koe te hanga i te rau rubles!

Te hoahoa me te whakaahuatanga o te pae whakamatautau

KVM (i raro i)VDI me nga miihini mariko tuku ma te whakamahi i te bash

Ko nga taputapu katoa kei roto i te whatunga peka, ko te hongere Ipurangi anake ka puta ki waho. I mua kua noho he tūmau takawaenga; Engari kei runga, i roto i era atu mea, ko te tātari o nga waka mai i nga miihini mariko (abbr. VM i raro i te tuhinga) ka puta. Kaore he mea hei aukati i a koe ki te tuku i tenei ratonga ki runga i te tūmau KVM ko te mea anake e hiahia ana koe ki te mataki ko te pehea te whakarereketanga o te uta o te punaha iti.

Ko te Teihana Kiritaki he "teihana mahi-whaiaro", te "mutunga o mua" o ta maatau ratonga. Ko Lenovo IdeaCentre nettops. He aha te pai o tenei waahanga? Ae, tata ki te katoa, tino koa ki te maha o nga hononga USB me te kaipanui kaari kei te papa o mua. I roto i ta maatau kaupapa, ka whakauruhia he kaari SD me te whakamarumaru tuhi taputapu kua whakauruhia ki roto i te kaari kaata, ka tuhia he ahua ora o Fedora 28 Ae ra, ka honoa he kaitirotiro, papapātuhi me te kiore ki te kupenga.

Ko te Whakawhiti he whakakā taputapu taumata tuarua, e tu ana i roto i te rūma tūmau me nga rama kimo. Kaore e hono ana ki etahi atu whatunga atu i te kupenga o "teihana mahi-whaiaro".

Ko KVM_Server te matua o te kaupapa; i roto i nga whakamatautau pae, ko te Core 2 Quad Q9650 me te 8 GB o te RAM i tautoko maia i nga miihini mariko e 3 me Windows 10. Punaharoto kōpae – adaptec 3405 2 kōpae Raid 1 + SSD. I roto i nga whakamatautau mara o te Xeon 1220, ko te LSI 9260 + SSD tino kaha ake te tautoko i te 5-6 VM. Ka whiwhi matou i nga kaitoro mai i te ratonga kua reti; Ko tenei (ng) tūmau he punaha mariko KVM kua tukuna me te puna wai miihini mariko_Vm.

He miihini mariko a Vm, te tuara o ta maatau ratonga. Kei reira nga mahi a te kaiwhakamahi.

Ko te Enp5s0 he atanga whatunga e anga atu ana ki te whatunga o "teihana mahi-whaiaro", dhcpd, ntpd, httpd e noho ana ki runga, ka whakarongo a xinetd ki te tauranga "tohu".

Ko Lo0 he atanga pseudo loopback. Paerewa.

Spice_console – He mea tino whakamere, ko te mea, kaore i rite ki te RDP matarohia, ka whakawhanuihia e koe te paihere kawa KVM+Spice, ka puta mai he hinonga taapiri - te tauranga papatohu o te miihini mariko. Ko te tikanga, ma te hono atu ki tenei tauranga TCP, ka whiwhi tatou i te papatohu Vm, me te kore e hono atu ki a Vm ma tana atanga whatunga. Ka whakahaeretia e te tūmau nga taunekeneke katoa me Vm mo te tuku tohu. Ko te taurite tata ki te mahi ko IPKVM. Ko era. Ko te ahua o te kaitirotiro VM ka tukuna ki tenei tauranga, ka tukuna ano nga korero mo te nekehanga kiore ki a ia, a (ko te mea tino nui) ko te taunekeneke ma te kawa Spice ka taea e koe te huri i nga taputapu USB ki te miihini mariko, me te mea kei te hono tenei taputapu. ki te Vm ano. I whakamatauria mo nga puku kohiko, nga matawai, nga kamera tukutuku.

Ko nga kaari whatunga mariko Vnet0, virbr0 me Vm he whatunga miihini mariko.

Pehea te mahi

Mai i te Teihana Kiritaki

Ko nga huu teihana kiritaki i roto i te aratau kauwhata mai i te ahua ora o Fedora 28, ka whiwhi i tetahi wahitau IP ma te dhcp mai i te mokowā wāhitau whatunga 169.254.24.0/24. I te wa o te tangohanga, ka hangaia nga ture paahi ahi e tuku ana i nga hononga ki nga tauranga "tohu" me te "karakia" o te tūmau. Ka oti te tango, ka tatari te teihana mo te kaiwhakamahi "Kaihoko" ki te whakamana. Whai muri i te whakamanatanga a te kaiwhakamahi, ka whakarewahia te kaiwhakahaere papamahi "pouaka tuwhera" ka mahia te tuhinga autostart mo te kaiwhakamahi whai mana. I roto i etahi atu mea, ka whakahaerehia e te tuhinga autorun te tuhinga mamao.sh.

$HOME/.config/openbox/scripts/remote.sh

#!/bin/sh

server_ip=$(/usr/bin/cat /etc/client.conf |/usr/bin/grep "server_ip" 
|/usr/bin/cut -d "=" -f2)
vdi_signal_port=$(/usr/bin/cat /etc/client.conf |/usr/bin/grep "vdi_signal_port" 
 |/usr/bin/cut -d "=" -f2)
vdi_spice_port=$(/usr/bin/cat /etc/client.conf |/usr/bin/grep "vdi_spice_port" 
|/usr/bin/cut -d "=" -f2)
animation_folder=$(/usr/bin/cat /etc/client.conf |/usr/bin/grep "animation_folder" 
|/usr/bin/cut -d "=" -f2)

process=/usr/bin/remote-viewer

while true
do
 if [ -z `/usr/bin/pidof feh` ]
 then
 /usr/bin/echo $animation_folder
 /usr/bin/feh -N -x -D1 $animation_folder &
 else
 /usr/bin/echo
 fi
/usr/bin/nc -i 1 $server_ip $vdi_signal_port |while read line
 do
  if /usr/bin/echo "$line" |/usr/bin/grep "RULE ADDED, CONNECT NOW!"
  then
   /usr/bin/killall feh
   pid_process=$($process "spice://$server_ip:$vdi_spice_port"  
   "--spice-disable-audio" "--spice-disable-effects=animation"  
   "--spice-preferred-compression=auto-glz" "-k" 
   "--kiosk-quit=on-disconnect" | /bin/echo $!)
   /usr/bin/wait $pid_process
   /usr/bin/killall -u $USER
   exit
  else
   /usr/bin/echo $line >> /var/log/remote.log
  fi
 done
done

/etc/client.conf

server_ip=169.254.24.1
vdi_signal_port=5905
vdi_spice_port=5906
animation_folder=/usr/share/backgrounds/animation
background_folder=/usr/share/backgrounds2/fedora-workstation

Whakaahuatanga o nga taurangi kōnae client.conf
server_ip — KVM_Server wāhitau
vdi_signal_port - KVM_Server tauranga kei reira te xinetd "noho"
vdi_spice_port — Tauranga whatunga KVM_Server ka tukuna te tono hononga mai i te kiritaki kaitirotiro mamao ki te tauranga kakara o te Vm whakatapua (nga korero kei raro nei)
animation_folder - te kōpaki i tangohia mai ai nga whakaahua mo te whakaaturanga pakiwaituhi
background_folder - te kōpaki i tangohia ai nga whakaahua mo te whakaatu whakaaturanga i te aratau tatari. Ko etahi atu korero mo te hākoritanga kei te waahanga o muri o te tuhinga.

Ko te tuhinga mamao.sh ka tango i nga tautuhinga mai i te konae whirihoranga /etc/client.conf me te whakamahi i te nc ki te hono atu ki te tauranga "vdi_signal_port" o te tūmau KVM ka whiwhi i te awa raraunga mai i te tūmau, kei roto i a ia e tatari ana ki nga rarangi "RULE ADDED , Hono atu inaianei”. Ina tae mai te aho e hiahiatia ana, ka whakarewahia te mahinga kaitirotiro-mamao ki te aratau kiosk, ka whakatuu hononga ki te tauranga tūmau "vdi_spice_port". Ka whakatārewahia te mahi hōtuhi kia mutu ra ano te mahi a te kaitirotiro-mamao.

Ko te kaitirotiro-mamao e hono ana ki te tauranga "vdi_spice_port", na te hurihanga i te taha tūmau, ka tae ki te tauranga "spice_console" o te atanga lo0, i.e. ki te papatohu miihini mariko ka puta tika te mahi a te kaiwhakamahi. I te wa e tatari ana mo te hononga, ka whakaatuhia te kaiwhakamahi ki te pakiwaituhi bullshit, i te ahua o te whakaaturanga kiriata o nga konae jpeg, ko te huarahi ki te raarangi me nga pikitia ka whakatauhia e te uara o te huringa animation_folder mai i te konae whirihoranga.

Mena kua ngaro te hononga ki te tauranga "spice_console" o te miihini mariko, e tohu ana i te katinga/whakahoutanga o te miihini mariko (arā, ko te mutunga tonu o te waahi kaiwhakamahi), ka mutu nga tukanga katoa e whakahaere ana mo te kaiwhakamahi whai mana, e arahi ana. ki te whakaara ano i te lightdm me te hoki ki te mata whakamana.

Mai i te taha KVM Server

I runga i te tauranga "tohu" o te kaari whatunga, kei te tatari a enp5s0 kia hono atu a xinetd. Whai muri i te hono ki te tauranga "tohu", ka whakarewahia e xinetd te tuhinga vm_manager.sh me te kore e tuku i nga tawhā whakauru me te tuku ano i te hua o te tuhinga ki te waahi Kiritaki nc.

/etc/xinetd.d/test-server

service vdi_signal

{
port	=	5905
socket_type	=	stream
protocol	=	tcp
wait	=	no
user	=	root
server	=	/home/admin/scripts_vdi_new/vm_manager.sh
}

/home/admin/scripts_vdi_new/vm_manager.sh


#!/usr/bin/sh

#<SET LOCAL VARIABLES FOR SCRIPT>#
SRV_SCRIPTS_DIR=$(/usr/bin/cat /etc/vm_manager.conf  
|/usr/bin/grep "srv_scripts_dir" |/usr/bin/cut -d "=" -f2)
/usr/bin/echo "SRV_SCRIPTS_DIR=$SRV_SCRIPTS_DIR"
export SRV_SCRIPTS_DIR=$SRV_SCRIPTS_DIR
SRV_POOL_SIZE=$(/usr/bin/cat /etc/vm_manager.conf 
|/usr/bin/grep "srv_pool_size" |/usr/bin/cut -d "=" -f2)
/usr/bin/echo "SRV_POOL_SIZE=$SRV_POOL_SIZE"
export "SRV_POOL_SIZE=$SRV_POOL_SIZE"
SRV_START_PORT_POOL=$(/usr/bin/cat /etc/vm_manager.conf  
|/usr/bin/grep "srv_start_port_pool" |/usr/bin/cut -d "=" -f2)
/usr/bin/echo SRV_START_PORT_POOL=$SRV_START_PORT_POOL
export SRV_START_PORT_POOL=$SRV_START_PORT_POOL
SRV_TMP_DIR=$(/usr/bin/cat /etc/vm_manager.conf 
|/usr/bin/grep "srv_tmp_dir" |/usr/bin/cut -d "=" -f2)
/usr/bin/echo "SRV_TMP_DIR=$SRV_TMP_DIR"
export SRV_TMP_DIR=$SRV_TMP_DIR
date=$(/usr/bin/date)
#</SET LOCAL VARIABLES FOR SCRIPT>#

/usr/bin/echo "# $date START EXECUTE VM_MANAGER.SH #"

make_connect_to_vm() {

#<READING CLEAR.LIST AND CHECK PORT FOR NETWORK STATE>#
/usr/bin/echo "READING CLEAN.LIST AND CHECK PORT STATE"
#<CHECK FOR NO ONE PORT IN CLEAR.LIST>#

if [ -z `/usr/bin/cat $SRV_TMP_DIR/clear.list` ]
then
 /usr/bin/echo "NO AVALIBLE PORTS IN CLEAN.LIST FOUND"
 /usr/bin/echo "Will try to make housekeeper, and create new vm"
 make_housekeeper
else
 #<MINIMUN ONE PORT IN CLEAR.LIST FOUND>#
  /usr/bin/cat $SRV_TMP_DIR/clear.list |while read line
   do
    clear_vm_port=$(($line))
    /bin/echo "FOUND PORT $clear_vm_port IN CLEAN.LIST. TRY NETSTAT"  
    "CHECK FOR PORT=$clear_vm_port"

    #<NETSTAT LISTEN CHECK FOR PORT FROM CLEAN.LIST>#
    if /usr/bin/netstat -lnt |/usr/bin/grep ":$clear_vm_port" > /dev/null
     then
     /bin/echo "$clear_vm_port IS LISTEN"
     #<PORT IS LISTEN. CHECK FOR IS CONNECTED NOW>#
     if /usr/bin/netstat -nt |/usr/bin/grep ":$clear_vm_port"  
     |/usr/bin/grep "ESTABLISHED" > /dev/null
       then
#<PORT LISTEN AND ALREADY CONNECTED! MOVE PORT FROM CLEAR.LIST 
# TO WASTE.LIST>#
       /bin/echo "$clear_vm_port IS ALREADY CONNECTED, MOVE PORT TO WASTE.LIST"
       /usr/bin/sed -i "/$clear_vm_port/d" $SRV_TMP_DIR/clear.list
       /usr/bin/echo $clear_vm_port >> $SRV_TMP_DIR/waste.list
       else
#<PORT LISTEN AND NO ONE CONNECT NOW. MOVE PORT FROM CLEAR.LIST TO 
# CONN_WAIT.LIST AND CREATE IPTABLES RULES>##
       /usr/bin/echo "OK, $clear_vm_port IS NOT ALREADY CONNECTED"
       /usr/bin/sed -i "/$clear_vm_port/d" $SRV_TMP_DIR/clear.list
       /usr/bin/echo $clear_vm_port >> $SRV_TMP_DIR/conn_wait.list
       $SRV_SCRIPTS_DIR/vm_connect.sh $clear_vm_port
#<TRY TO CLEAN VM IN WASTE.LIST AND CREATE NEW WM>#
       /bin/echo "TRY TO CLEAN VM IN WASTE.LIST AND CREATE NEW VM"
       make_housekeeper
       /usr/bin/echo "# $date STOP EXECUTE VM_MANAGER.SH#"
       exit
       fi
     else
     #<PORT IS NOT A LISTEN. MOVE PORT FROM CLEAR.LIST TO WASTE.LIST>#
     /bin/echo " "$clear_vm_port" is NOT LISTEN. REMOVE PORT FROM CLEAR.LIST"
     /usr/bin/sed -i "/$clear_vm_port/d" $SRV_TMP_DIR/clear.list
     /usr/bin/echo $clear_vm_port >> $SRV_TMP_DIR/waste.list
    make_housekeeper
     fi
   done
fi
}

make_housekeeper() {
/usr/bin/echo "=Execute housekeeper="
/usr/bin/cat $SRV_TMP_DIR/waste.list |while read line
 do
 /usr/bin/echo "$line"
 if /usr/bin/netstat -lnt |/usr/bin/grep ":$line" > /dev/null
  then
  /bin/echo "port_alive, vm is running"
  if /usr/bin/netstat -nt |/usr/bin/grep ":$line"  
   |/usr/bin/grep "ESTABLISHED" > /dev/null
    then
    /bin/echo "port_in_use can't delete vm!!!"
    else
    /bin/echo "port_not in use. Deleting vm"
    /usr/bin/sed -i "/$line/d" $SRV_TMP_DIR/waste.list
    /usr/bin/echo $line >> $SRV_TMP_DIR/recycle.list
    $SRV_SCRIPTS_DIR/vm_delete.sh $line
    fi
  else
  /usr/bin/echo "posible vm is already off. Deleting vm"
  /usr/bin/echo "MOVE VM IN OFF STATE $line FROM WASTE.LIST TO"  
  "RECYCLE.LIST AND DELETE VM"
  /usr/bin/sed -i "/$line/d" $SRV_TMP_DIR/waste.list
  /usr/bin/echo $line >> $SRV_TMP_DIR/recycle.list
  $SRV_SCRIPTS_DIR/vm_delete.sh "$line"
 fi
done
create_clear_vm
}

create_clear_vm() {
/usr/bin/echo "=Create new VM="
while [ $SRV_POOL_SIZE -gt 0 ]
do
 new_vm_port=$(($SRV_START_PORT_POOL+$SRV_POOL_SIZE))
 /usr/bin/echo "new_vm_port=$new_vm_port"
 if /usr/bin/grep "$new_vm_port" $SRV_TMP_DIR/clear.list > /dev/null
  then
  /usr/bin/echo "$new_vm_port port is already defined in clear.list"
  else
  if /usr/bin/grep "$new_vm_port" $SRV_TMP_DIR/waste.list > /dev/null
   then
   /usr/bin/echo "$new_vm_port port is already defined in waste.list"
   else
    if /usr/bin/grep "$new_vm_port" $SRV_TMP_DIR/recycle.list > /dev/null
    then
    /usr/bin/echo "$new_vm_port PORT IS ALREADY DEFINED IN RECYCLE LIST"
    else
    if  /usr/bin/grep "$new_vm_port" $SRV_TMP_DIR/conn_wait.list > /dev/null
     then
     /usr/bin/echo "$new_vm_port PORT IS ALREADY DEFINED IN CONN_WAIT LIST"
     else
     /usr/bin/echo "PORT IN NOT DEFINED IN NO ONE LIST WILL CREATE" 
     "VM ON PORT $new_vm_port"
     /usr/bin/echo $new_vm_port >> $SRV_TMP_DIR/recycle.list
     $SRV_SCRIPTS_DIR/vm_create.sh $new_vm_port
     fi
    fi
   fi
 fi
 SRV_POOL_SIZE=$(($SRV_POOL_SIZE-1))
done
/usr/bin/echo "# $date STOP EXECUTE VM_MANAGER.SH #"
}
make_connect_to_vm |/usr/bin/tee -a /var/log/vm_manager.log

/etc/vm_manager.confsrv_scripts_dir=/home/admin/scripts_vdi_new
srv_pool_size=4
srv_start_port_pool=5920
srv_tmp_dir=/tmp/vm_state
base_host=win10_2
tāuru_iface=enp5s0
vdi_spice_port=5906
count_conn_tryes=10

Whakaahuatanga o nga taurangi kei roto i te konae whirihoranga vm_manager.conf
srv_scripts_dir — kōpaki kei reira ngā hōtuhi vm_manager.sh, vm_connect.sh, vm_delete.sh, vm_create.sh, vm_clear.sh
srv_pool_size — Rahi puna kaukau Vm
srv_start_port_pool — te tauranga tiimata, ka mutu ka tiimata te waahi o nga tauranga kakara mo nga miihini miihini mariko.
srv_tmp_dir - kōpaki mo te penapena i nga konae rangitahi
base_host — turanga Vm (ahua koura) mai i a Vm iramate ka mahia ki roto i te puna
input_iface — atanga whatunga tūmau, e anga ana ki nga Teihana Kiritaki
vdi_spice_port — tauranga whatunga tūmau ka tukuna atu te tono hononga mai i te kiritaki kaitirotiro mamao ki te tauranga kakara o te Vm whakatapua
count_conn_tryes — tatari taima, muri iho ka kiia kaore he hononga ki te Vm (mo nga taipitopito, tirohia vm_connect.sh)

Ko te tuhinga vm_manager.sh te panui i te konae whirihoranga mai i te konae vm_manager.conf me te aromatawai i te ahua o nga miihini mariko i roto i te poka wai i runga i te maha o nga tawhā, ara: e hia nga VM ka tukuna, ahakoa he VM ma kore utu. Ki te mahi i tenei, ka panuihia te konae clear.list, kei roto nga nama tauranga "spice_console" o "hou i hanga" (tirohia i raro i te huringa hangahanga VM) nga miihini mariko me te tirotiro mo te hononga hono ki a raatau. Ina kitea he tauranga me te hononga whatunga kua pumau (kaore e tika), ka whakaatuhia he whakatupato ka whakawhitia te tauranga ki te waste.list Ina kitea te tauranga tuatahi mai i te konae clear.list kaore he hononga i tenei wa. , ka karanga a vm_manager.sh i te vm_connect.sh hōtuhi me te tuku hoatu te tau o tenei tauranga hei tawhā.

/home/admin/scripts_vdi_new/vm_connect.sh

#!/bin/sh

date=$(/usr/bin/date)

/usr/bin/echo "#" "$date" "START EXECUTE VM_CONNECT.SH#"

#<SET LOCAL VARIABLES FOR SCRIPT>#
free_port="$1"

input_iface=$(/usr/bin/cat /etc/vm_manager.conf |/usr/bin/grep "input_iface" 
|/usr/bin/cut -d "=" -f2)
/usr/bin/echo "input_iface=$input_iface"

vdi_spice_port=$(/usr/bin/cat /etc/vm_manager.conf   
|/usr/bin/grep "vdi_spice_port" |/usr/bin/cut -d "=" -f2)
/usr/bin/echo "vdi_spice_port=$vdi_spice_port"

count_conn_tryes=$(/usr/bin/cat /etc/vm_manager.conf  
|/usr/bin/grep "count_conn_tryes" |/usr/bin/cut -d "=" -f2)
/usr/bin/echo "count_conn_tryes=$count_conn_tryes"
#</SET LOCAL VARIABLES FOR SCRIPT>#

#<CREATE IPTABLES RULES AND SEND SIGNAL TO CONNECT>#
/usr/bin/echo "create rule for port" $free_port
/usr/sbin/iptables -I INPUT -i $input_iface -p tcp -m tcp --dport  
$free_port  -j ACCEPT
/usr/sbin/iptables -I OUTPUT -o $input_iface -p tcp -m tcp --sport 
$free_port -j ACCEPT
/usr/sbin/iptables -t nat -I PREROUTING -p tcp -i $input_iface --dport  
$vdi_spice_port -j DNAT --to-destination 127.0.0.1:$free_port
/usr/bin/echo "RULE ADDED, CONNECT NOW!"
#</CREATE IPTABLES RULES AND SEND SIGNAL TO CONNECT>#

#<WAIT CONNECT ESTABLISHED AND ACTIVATE CONNECT TIMER>#
while [ $count_conn_tryes -gt 0 ]
do
if /usr/bin/netstat -nt |/usr/bin/grep ":$free_port"  
|/usr/bin/grep "ESTABLISHED" > /dev/null
 then
  /bin/echo "$free_port NOW in use!!!"
  /usr/bin/sleep 1s
  /usr/sbin/iptables -t nat -D PREROUTING -p tcp -i $input_iface --dport  
  $vdi_spice_port -j DNAT --to-destination 127.0.0.1:$free_port
  /usr/sbin/iptables -D INPUT -i $input_iface -p tcp -m tcp --dport  
  $free_port  -j ACCEPT
  /usr/sbin/iptables -D OUTPUT -o $input_iface -p tcp -m tcp --sport  
  $free_port -j ACCEPT
  /usr/bin/sed -i "/$free_port/d" $SRV_TMP_DIR/conn_wait.list
  /usr/bin/echo $free_port >> $SRV_TMP_DIR/waste.list
  return
 else
   /usr/bin/echo "$free_port NOT IN USE"
   /usr/bin/echo "RULE ADDED, CONNECT NOW!"
   /usr/bin/sleep 1s
 fi
count_conn_tryes=$((count_conn_tryes-1))
done
#</WAIT CONNECT ESTABLISED AND ACTIVATE CONNECT TIMER>#

#<IF COUNT HAS EXPIRED. REMOVE IPTABLES RULE AND REVERT 
# VM TO CLEAR.LIST>#
/usr/bin/echo "REVERT IPTABLES RULE AND REVERT VM TO CLEAN 
LIST $free_port"
/usr/sbin/iptables -t nat -D PREROUTING -p tcp -i $input_iface --dport 
$vdi_spice_port -j DNAT --to-destination 127.0.0.1:$free_port
/usr/sbin/iptables -D INPUT -i $input_iface -p tcp -m tcp --dport $free_port 
-j ACCEPT
/usr/sbin/iptables -D OUTPUT -o $input_iface -p tcp -m tcp --sport  
$free_port -j ACCEPT
/usr/bin/sed -i "/$free_port/d" $SRV_TMP_DIR/conn_wait.list
/usr/bin/echo $free_port >> $SRV_TMP_DIR/clear.list
#</COUNT HAS EXPIRED. REMOVE IPTABLES RULE AND REVERT VM 
#TO CLEAR.LIST>#
/usr/bin/echo "#" "$date" "END EXECUTE VM_CONNECT.SH#"

# Attention! Must Be!  sysctl net.ipv4.conf.all.route_localnet=1

Ko te tuhinga vm_connect.sh e whakaatu ana i nga ture papaahi e hanga ana i te tukunga o te tauranga tūmau "vdi_spice_port" o te atanga enp5s0 ki te "tauranga papatohu kakara" o te VM kei runga i te atanga tūmau lo0, i tukuna hei tawhā whakaoho. Ka whakawhitihia te tauranga ki conn_wait.list, ka whakaarohia te VM ki te tatari mo te hononga. Ko te aho "RULE ADDED, CONNECT NOW" ka tukuna ki te waahi Kiritaki Teihana i runga i te tauranga "tohu" o te tūmau, e tumanakohia ana e te tuhinga mamao.sh e rere ana i runga. Ka timata te huringa tatari hononga ki te maha o nga nganatanga ka whakatauhia e te uara o te taurangi "count_conn_tryes" mai i te konae whirihoranga. Ia hēkona ka tukuna te aho "RULE ADDED, CONNECT NOW" ki te wahanga nc ka tirohia te noho o te hononga hono ki te tauranga "spice_console".

Mena mo te maha o nga nganatanga, kaore he hononga i puta, ka whakahokia te tauranga "spice_console" ki te clear.list kua oti te mahi o te vm_connect.sh, ka timata ano te mahi o te vm_manager.sh, ka timata i te huringa whakakore.

Mena ka kitea he hononga Teihana Kiritaki ki te tauranga "spice_console" i runga i te atanga lo0, ka mukua nga ture pakitara e hanga anga ana i waenga i te tauranga "spice" o te tūmau me te tauranga "spice_console" ka mau tonu te hononga ma te whakamahi i te ahua o te papangaahi. tikanga kimi. Mena kua pakaru te hononga, kaore e taea te hono ano ki te tauranga "spice_console". Ko te tauranga "spice_console" ka nekehia ki te waste.list, ka kiia te VM he "paru" kaore e taea te hoki ki te puna o nga miihini mariko "ma" me te kore e horoi. Ka mutu te mahi a vm_connect.sh ka timata ano te mahi a vm_manager.sh, ka timata te huringa horoi.

Ka timata te huringa horoi ma te maataki i te konae waste.list, ka whakawhitia nga nama tauranga "spice_console" o nga miihini mariko i hono ai te hononga. Ko te waahi o te hononga kaha ki ia tauranga "spice_console" mai i te rarangi ka whakatauhia. Mena karekau he hononga, ka whakaarohia kua kore te miihini mariko e whakamahia ana, ka nekehia te tauranga ki recycle.list ka timata te tukanga o te whakakore i te miihini mariko (tirohia ki raro) no reira tenei tauranga. Mena ka kitea he hononga whatunga kaha i runga i te tauranga, ka kiia te miihini mariko kei te whakamahia, kaore he mahi e mahia ana. Mena kaore te tauranga e whakarongo ana, ka kiia te VM kua tutakina me te kore e hiahiatia. Ka whakawhitihia te tauranga ki recycle.list ka timata te tukanga o te whakakore i te miihini mariko. Ki te mahi i tenei, ka karangahia te tuhinga vm_delete.sh, ka tukuna te nama "spice_console" hei tawhā ki te tauranga o te VM e tika ana kia mukua.

/home/admin/scripts_vdi_new/vm_delete.sh


#!/bin/sh

#<Set local VARIABLES>#
port_to_delete="$1"
date=$(/usr/bin/date)
#</Set local VARIABLES>#

/usr/bin/echo "# $date START EXECUTE VM_DELETE.SH#"
/usr/bin/echo "TRY DELETE VM ON PORT: $vm_port"

#<VM NAME SETUP>#
vm_name_part1=$(/usr/bin/cat /etc/vm_manager.conf |/usr/bin/grep 'base_host' 
|/usr/bin/cut -d'=' -f2)
vm_name=$(/usr/bin/echo "$vm_name_part1""-""$port_to_delete")
#</VM NAME SETUP>#

#<SHUTDOWN AND DELETE VM>#
/usr/bin/virsh destroy $vm_name
/usr/bin/virsh undefine $vm_name
/usr/bin/rm -f /var/lib/libvirt/images_write/$vm_name.qcow2
/usr/bin/sed -i "/$port_to_delete/d" $SRV_TMP_DIR/recycle.list
#</SHUTDOWN AND DELETE VM>#

/usr/bin/echo "VM ON PORT $vm_port HAS BEEN DELETE AND REMOVE" 
 "FROM RECYCLE.LIST. EXIT FROM VM_DELETE.SH"
/usr/bin/echo "# $date STOP EXECUTE VM_DELETE.SH#"
exit

Ko te whakakore i te miihini mariko he mahi iti noa iho; Ka pehia te VM ki te whakamutu, ka tangohia te VM mai i te hypervisor, ka mukua te kōpae mariko o tenei VM. Ka tangohia te tauranga "spice_console" mai i recycle.list. Ka mutu te mahi a vm_delete.sh, ka timata ano te mahi a vm_manager.sh

Ko te tuhinga vm_manager.sh, i te otinga o nga mahi ki te horoi i nga miihini mariko koretake mai i te raarangi waste.list, ka tiimata te huringa o te hanga miihini mariko i roto i te puna.

Ka timata te mahi ma te tautuhi i nga tauranga "spice_console" e waatea ana mo te tuunga. Ki te mahi i tenei, i runga i te tawhā konae whirihoranga "srv_start_port_pool", e whakatakoto ana i te tauranga tiimata mo te puna "spice_console" o nga miihini mariko, me te tawhā "srv_pool_size", e whakatau ana i te maha o nga miihini mariko, ko nga whiringa tauranga katoa ka taea. rapua raupapa. Mo ia tauranga motuhake, ka rapua i roto i te clear.list, waste.list, conn_wait.list, recycle.list. Mena ka kitea he tauranga ki tetahi o enei konae, ka kiia te tauranga he pukumahi ka pekehia. Mena kaore i kitea te tauranga i roto i nga konae kua tohua, ka taapirihia ki te konae recycle.list ka timata te mahi hanga miihini mariko hou. Ki te mahi i tenei, ka karangahia te tuhinga vm_create.sh, ka tukuna hei tawhā ko te tau tauranga "spice_console" e tika ana kia hangaia te VM.

/home/admin/scripts_vdi_new/vm_create.sh


#!/bin/sh
/usr/bin/echo "#" "$date" "START RUNNING VM_CREATE.SH#"

new_vm_port=$1
date=$(/usr/bin/date)
a=0
/usr/bin/echo SRV_TMP_DIR=$SRV_TMP_DIR

#<SET LOCAL VARIABLES FOR SCRIPT>#
base_host=$(/usr/bin/cat /etc/vm_manager.conf |/usr/bin/grep "base_host" 
|/usr/bin/cut -d "=" -f2)
/usr/bin/echo "base_host=$base_host"
#</SET LOCAL VARIABLES FOR SCRIPT>#

hdd_image_locate() {

/bin/echo "Run STEP 1 - hdd_image_locate"

hdd_base_image=$(/usr/bin/virsh dumpxml $base_host  
|/usr/bin/grep "source file" |/usr/bin/grep "qcow2" |/usr/bin/head -n 1 
|/usr/bin/cut -d "'" -f2)
if [ -z "$hdd_base_image" ]
then
 /bin/echo "base hdd image not found!"
else
 /usr/bin/echo "hdd_base_image found is a $hdd_base_image. Run next step 2"

#< CHECK FOR SNAPSHOT ON BASE HDD >#

  if [ 0 -eq `/usr/bin/qemu-img info "$hdd_base_image" | /usr/bin/grep -c "Snapshot"` ]
  then
  /usr/bin/echo "base image haven't snapshot, run NEXT STEP 3"
  else
  /usr/bin/echo "base hdd image have a snapshot, can't use this image"
  exit
  fi
#</ CHECK FOR SNAPSHOT ON BASE HDD >#

#< CHECK FOR HDD IMAGE IS LINK CLONE >#
  if [ 0 -eq `/usr/bin/qemu-img info "$hdd_base_image" |/usr/bin/grep -c "backing file"
  then
  /usr/bin/echo "base image is not a linked clone, NEXT STEP 4"
  /usr/bin/echo "Base image check complete!"
  else
  /usr/bin/echo "base hdd image is a linked clone, can't use this image"
  exit
  fi
fi
#</ CHECK FOR HDD IMAGE IS LINK CLONE >#
cloning
    }

cloning() {
# <Step_1 turn the base VM off >#
 /usr/bin/virsh shutdown $base_host > /dev/null 2>&1
 # </Step_1 turn the base VM off >#

#<Create_vm_config>#

/usr/bin/echo "Free port for Spice VM is $new_vm_port"

 #<Setup_name_for_new_VM>#
new_vm_name=$(/bin/echo $base_host"-"$new_vm_port)
#</Setup_name_for_new_VM>#

#<Make_base_config_as_clone_base_VM>#
/usr/bin/virsh dumpxml $base_host > $SRV_TMP_DIR/$new_vm_name.xml
#<Make_base_config_as_clone_base_VM>#

##<Setup_New_VM_Name_in_config>##
/usr/bin/sed -i "s%<name>$base_host</name>%<name>$new_vm_name</name>%g" $SRV_TMP_DIR/$new_vm_name.xml
#</Setup_New_VM_Name_in_config>#

#<UUID Changing>#
old_uuid=$(/usr/bin/cat $SRV_TMP_DIR/$new_vm_name.xml |/usr/bin/grep "<uuid>")
/usr/bin/echo old UUID $old_uuid
new_uuid_part1=$(/usr/bin/echo "$old_uuid" |/usr/bin/cut -d "-" -f 1,2)
new_uuid_part2=$(/usr/bin/echo "$old_uuid" |/usr/bin/cut -d "-" -f 4,5)
new_uuid=$(/bin/echo $new_uuid_part1"-"$new_vm_port"-"$new_uuid_part2)
/usr/bin/echo $new_uuid
/usr/bin/sed -i "s%$old_uuid%$new_uuid%g" $SRV_TMP_DIR/$new_vm_name.xml
#</UUID Changing>#


#<Spice port replace>#
old_spice_port=$(/usr/bin/cat  $SRV_TMP_DIR/$new_vm_name.xml  
|/usr/bin/grep "graphics type='spice' port=")
/bin/echo old spice port $old_spice_port
new_spice_port=$(/usr/bin/echo "<graphics type='spice' port='$new_vm_port' autoport='no' listen='127.0.0.1'>")
/bin/echo $new_spice_port
/usr/bin/sed -i "s%$old_spice_port%$new_spice_port%g" $SRV_TMP_DIR/$new_vm_name.xml
#</Spice port replace>#

#<MAC_ADDR_GENERATE>#
mac_new=$(/usr/bin/hexdump -n6 -e '/1 ":%02X"' /dev/random|/usr/bin/sed s/^://g)
/usr/bin/echo New Mac is $mac_new
#</MAC_ADDR_GENERATE>#

#<GET OLD MAC AND REPLACE>#
mac_old=$(/usr/bin/cat $SRV_TMP_DIR/$new_vm_name.xml |/usr/bin/grep "mac address=")
/usr/bin/echo old mac is $mac_old
/usr/bin/sed -i "s%$mac_old%$mac_new%g" $SRV_TMP_DIR/$new_vm_name.xml
#<GET OLD MAC AND REPLACE>#

#<new_disk_create>#
/usr/bin/qemu-img create -f qcow2 -b $hdd_base_image /var/lib/libvirt/images_write/$new_vm_name.qcow2
#</new_disk_create>#

#<attach_new_disk_in_confiig>#
/usr/bin/echo hdd base image is $hdd_base_image
/usr/bin/sed -i "s%<source file='$hdd_base_image'/>%<source file='/var/lib/libvirt/images_write/$new_vm_name.qcow2'/>%g" $SRV_TMP_DIR/$new_vm_name.xml
#</attach_new_disk_in_confiig>#

starting_vm
    #</Create_vm config>#
}

starting_vm() {

/usr/bin/virsh define $SRV_TMP_DIR/$new_vm_name.xml
/usr/bin/virsh start $new_vm_name
while [ $a -ne 1 ]
do
if /usr/bin/virsh list --all |/usr/bin/grep "$new_vm_name" |/usr/bin/grep "running" > /dev/null 2>&1
then
a=1
/usr/bin/sed -i "/$new_vm_port/d" $SRV_TMP_DIR/recycle.list
/usr/bin/echo $new_vm_port >> $SRV_TMP_DIR/clear.list
/usr/bin/echo "#" "$date" "VM $new_vm_name IS STARTED #"
else
 /usr/bin/echo "#VM $new_vm_name is not ready#"
a=0
/usr/bin/sleep 2s
fi
done
/usr/bin/echo "#$date  EXIT FROM VM_CREATE.SH#"
exit
}

hdd_image_locate

Ko te tukanga o te hanga i tetahi miihini mariko hou

Ko te tuhinga vm_create.sh e panui ana i te uara o te taurangi "base_host" mai i te konae whirihoranga, e whakatau ana i te tauira miihini mariko i runga i te kaupapa ka mahia te kiore. Ka tangohia e ia te whirihoranga xml o te VM mai i te paataka raraunga hypervisor, ka mahia he raupapa arowhai qcow ki te ahua kōpae VM, a, i te otinga angitu, ka hanga he konae whirihoranga xml mo te VM hou me te ahua kōpae "honohono clone" o te hou. VM. Muri iho ka utaina te whirihora xml o te VM hou ki roto i te paataka korero hypervisor ka whakarewahia te VM. Ka nukuhia te tauranga "spice_console" mai i recycle.list ki clear.list. Ka mutu te mahi a vm_create.sh ka mutu te mahi a vm_manager.sh.
Ka hono atu koe, ka timata nga mea katoa mai i te timatanga.

Mo nga ohorere, kei roto i te kete te vm_clear.sh hōtuhi, e rere kaha ana i roto i nga VM katoa mai i te poka wai ka mukua, ka tautuhi i nga uara rarangi ki te kore. Ma te karanga i te wa o te wa o te whawhai ka taea e koe te tiimata (i raro i) VDI me te papa ma.

/home/admin/scripts_vdi_new/vm_clear.sh

#!/usr/bin/sh

#set VARIABLES#
SRV_SCRIPTS_DIR=$(/usr/bin/cat /etc/vm_manager.conf  
|/usr/bin/grep "srv_scripts_dir" |/usr/bin/cut -d "=" -f2)
/usr/bin/echo "SRV_SCRIPTS_DIR=$SRV_SCRIPTS_DIR"
export SRV_SCRIPTS_DIR=$SRV_SCRIPTS_DIR

SRV_TMP_DIR=$(/usr/bin/cat /etc/vm_manager.conf  
|/usr/bin/grep "srv_tmp_dir" |/usr/bin/cut -d "=" -f2)
/usr/bin/echo "SRV_TMP_DIR=$SRV_TMP_DIR"
export SRV_TMP_DIR=$SRV_TMP_DIR

SRV_POOL_SIZE=$(/usr/bin/cat /etc/vm_manager.conf  
|/usr/bin/grep "srv_pool_size" |/usr/bin/cut -d "=" -f2)
/usr/bin/echo "SRV_POOL_SIZE=$SRV_POOL_SIZE"

SRV_START_PORT_POOL=$(/usr/bin/cat /etc/vm_manager.conf  
|/usr/bin/grep "srv_start_port_pool" |/usr/bin/cut -d "=" -f2)
/usr/bin/echo SRV_START_PORT_POOL=$SRV_START_PORT_POOL
#Set VARIABLES#


/usr/bin/echo "= Cleanup ALL VM="

/usr/bin/mkdir $SRV_TMP_DIR

/usr/sbin/service iptables restart
/usr/bin/cat /dev/null > $SRV_TMP_DIR/clear.list
/usr/bin/cat /dev/null > $SRV_TMP_DIR/waste.list
/usr/bin/cat /dev/null > $SRV_TMP_DIR/recycle.list
/usr/bin/cat /dev/null > $SRV_TMP_DIR/conn_wait.list

port_to_delete=$(($SRV_START_PORT_POOL+$SRV_POOL_SIZE))

        while [ "$port_to_delete" -gt "$SRV_START_PORT_POOL" ]
          do
		$SRV_SCRIPTS_DIR/vm_delete.sh $port_to_delete
		port_to_delete=$(($port_to_delete-1))
        done

/usr/bin/echo "= EXIT FROM VM_CLEAR.SH="

Na tenei e hiahia ana ahau ki te whakaoti i te wahanga tuatahi o taku korero. Ko nga mea i runga ake nei me nui mo nga kaiwhakahaere punaha ki te whakamatau i raro i te VDI i te mahi. Mena ka kitea e te hapori he kaupapa pai tenei, i te waahanga tuarua ka korero ahau mo te whakarereke i te Fedora livecd me te huri hei kiosk.

Source: will.com

Tāpiri i te kōrero