KVM (Π½Π΅Π΄ΠΎ)VDI с ΠΎΠ΄Π½ΠΎΡ€Π°Π·ΠΎΠ²Ρ‹ΠΌΠΈ Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹ΠΌΠΈ машинами с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ bash

ΠšΠΎΠΌΡƒ ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½Π° данная ΡΡ‚Π°Ρ‚ΡŒΡ

Данная ΡΡ‚Π°Ρ‚ΡŒΡ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ интСрСсна систСмным администраторам, ΠΏΠ΅Ρ€Π΅Π΄ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌΠΈ вставала Π·Π°Π΄Π°Ρ‡Π° ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ сСрвис Β«ΠΎΠ΄Π½ΠΎΡ€Π°Π·ΠΎΠ²Ρ‹Ρ…Β» Ρ€Π°Π±ΠΎΡ‡ΠΈΡ… мСст.

ΠŸΡ€ΠΎΠ»ΠΎΠ³

Π’ ΠΎΡ‚Π΄Π΅Π» ИВ сопровоТдСния ΠΌΠΎΠ»ΠΎΠ΄ΠΎΠΉ Π΄ΠΈΠ½Π°ΠΌΠΈΡ‡Π½ΠΎ Ρ€Π°Π·Π²ΠΈΠ²Π°ΡŽΡ‰Π΅ΠΉΡΡ ΠΊΠΎΠΌΠΏΠ°Π½ΠΈΠΈ с нСбольшой Ρ€Π΅Π³ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΠΉ ΡΠ΅Ρ‚ΡŒΡŽ, ΠΎΠ±Ρ€Π°Ρ‚ΠΈΠ»ΠΈΡΡŒ с ΠΏΡ€ΠΎΡΡŒΠ±ΠΎΠΉ ΠΎΡ€Π³Π°Π½ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ «станции самообслуТивания» для использования ΠΈΡ… внСшними ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π°ΠΌΠΈ. Π”Π°Π½Π½Ρ‹Π΅ станции ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»Π°Π³Π°Π»ΠΎΡΡŒ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ для рСгистрации Π½Π° Π²Π½Π΅ΡˆΠ½ΠΈΡ… ΠΏΠΎΡ€Ρ‚Π°Π»Π°Ρ… ΠΊΠΎΠΌΠΏΠ°Π½ΠΈΠΈ, Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ Π΄Π°Π½Π½Ρ‹Ρ… с Π²Π½Π΅ΡˆΠ½ΠΈΡ… устройств, Ρ€Π°Π±ΠΎΡ‚Ρ‹ с государствСнными ΠΏΠΎΡ€Ρ‚Π°Π»Π°ΠΌΠΈ.

Π’Π°ΠΆΠ½Ρ‹ΠΌ аспСктом являлся Ρ‚ΠΎΡ‚ Ρ„Π°ΠΊΡ‚, Ρ‡Ρ‚ΠΎ большая Ρ‡Π°ΡΡ‚ΡŒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠ³ΠΎ обСспСчСния Β«Π·Π°Ρ‚ΠΎΡ‡Π΅Π½Π°Β» ΠΏΠΎΠ΄ MS Windows (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, «ДСкларация»), Π° нСсмотря Π½Π° Π΄Π²ΠΈΠΆΠ΅Π½ΠΈΠ΅ Π² сторону ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚Ρ‹Ρ… Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ΠΎΠ², MS Office остаСтся Π΄ΠΎΠΌΠΈΠ½ΠΈΡ€ΡƒΡŽΡ‰ΠΈΠΌ стандартом ΠΏΡ€ΠΈ ΠΎΠ±ΠΌΠ΅Π½Π΅ элСктронными Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°ΠΌΠΈ. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, ΠΎΡ‚ΠΊΠ°Π·Π°Ρ‚ΡŒΡΡ ΠΎΡ‚ MS Windows ΠΏΡ€ΠΈ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠΈ Π΄Π°Π½Π½ΠΎΠΉ Π·Π°Π΄Π°Ρ‡ΠΈ ΠΌΡ‹ Π½Π΅ ΠΌΠΎΠ³Π»ΠΈ.

Основной ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠΎΠΉ видСлось Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ накоплСния Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ… ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΡ… сСансов, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠ³Π»ΠΈ Π±Ρ‹ привСсти ΠΊ ΠΈΡ… ΡƒΡ‚Π΅Ρ‡ΠΊΠ΅ Ρ‚Ρ€Π΅Ρ‚ΡŒΠΈΠΌ Π»ΠΈΡ†Π°ΠΌ. Вакая ситуация ΡƒΠΆΠ΅ ΠΏΠΎΠ΄Π²Π΅Π»Π° МЀЦ. Но Π² ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅ ΠΎΡ‚ квазигосудаствСнного (государствСнноС Π°Π²Ρ‚ΠΎΠ½ΠΎΠΌΠ½ΠΎΠ΅ ΡƒΡ‡Ρ€Π΅ΠΆΠ΄Π΅Π½ΠΈΠ΅) МЀЦ, Π·Π° ΠΏΠΎΠ΄ΠΎΠ±Π½Ρ‹Π΅ Π½Π΅Π΄ΠΎΡ‡Π΅Ρ‚Ρ‹ Π½Π΅ государствСнныС ΠΎΡ€Π³Π°Π½ΠΈΠ·Π°Ρ†ΠΈΠΈ Π±ΡƒΠ΄ΡƒΡ‚ Π½Π°ΠΊΠ°Π·Π°Π½Ρ‹ Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ сильнСС. Π‘Π»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ ΠΏΠΎ критичности ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠΎΠΉ Π±Ρ‹Π»ΠΎ Ρ‚Ρ€Π΅Π±ΠΎΠ²Π°Π½ΠΈΠ΅ Ρ€Π°Π±ΠΎΡ‚Ρ‹ с внСшними носитСлями Π΄Π°Π½Π½Ρ‹Ρ…, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ…, ΠΎΠ΄Π½ΠΎΠ·Π½Π°Ρ‡Π½ΠΎ, Π±ΡƒΠ΄Π΅Ρ‚ ΠΊΡƒΡ‡Π° Π·Π»ΠΎΠ²Ρ€Π΅Π΄Π½Ρ‹Ρ… Π·Π»ΠΎΠ²Ρ€Π΅Π΄ΠΎΠ². Π’Π΅Ρ€ΠΎΡΡ‚Π½ΠΎΡΡ‚ΡŒ заноса Π·Π»ΠΎΠ²Ρ€Π΅Π΄ΠΎΠ² ΠΈΠ· сСти ΠΈΠ½Ρ‚Π΅Ρ€Π½Π΅Ρ‚, Ρ€Π°ΡΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°Π»Π°ΡΡŒ ΠΊΠ°ΠΊ ΠΌΠ΅Π½Π΅Π΅ возмоТная, Π² силу ограничСния Π²Ρ‹Ρ…ΠΎΠ΄Π° Π² ΠΈΠ½Ρ‚Π΅Ρ€Π½Π΅Ρ‚ ΠΏΠΎ Π±Π΅Π»ΠΎΠΌΡƒ списку адрСсов.К ΠΏΡ€ΠΎΡ€Π°Π±ΠΎΡ‚ΠΊΠ΅ Ρ‚Ρ€Π΅Π±ΠΎΠ²Π°Π½ΠΈΠΉ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡ΠΈΠ»ΠΈΡΡŒ сотрудники Π΄Ρ€ΡƒΠ³ΠΈΡ… ΠΎΡ‚Π΄Π΅Π»ΠΎΠ², внося свои трСбования ΠΈ поТСлания, ΠΈΡ‚ΠΎΠ³ΠΎΠ²Ρ‹Π΅ трСбования выглядСли ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:

ВрСбования Π˜Π‘

  • ПослС использования всС ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΠ΅ Π΄Π°Π½Π½Ρ‹Π΅ (Π²ΠΊΠ»ΡŽΡ‡Π°Ρ Π²Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ Ρ„Π°ΠΉΠ»Ρ‹ ΠΈ ΠΊΠ»ΡŽΡ‡ΠΈ рССстра) Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΡƒΠ΄Π°Π»ΡΡ‚ΡŒΡΡ.
  • ВсС процСссы, Π·Π°ΠΏΡƒΡ‰Π΅Π½Π½Ρ‹Π΅ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΌ, ΠΏΠΎ ΠΎΠΊΠΎΠ½Ρ‡Π°Π½ΠΈΡŽ Ρ€Π°Π±ΠΎΡ‚Ρ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π·Π°Π²Π΅Ρ€ΡˆΠ°Ρ‚ΡŒΡΡ.
  • Π’Ρ‹Ρ…ΠΎΠ΄ Π² ΠΈΠ½Ρ‚Π΅Ρ€Π½Π΅Ρ‚ ΠΏΠΎ Π±Π΅Π»ΠΎΠΌΡƒ списку адрСсов.
  • ΠžΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΡ Π½Π° Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ запуска стороннСго ΠΊΠΎΠ΄Π°.
  • Π’ случаС простоя сСанса Π±ΠΎΠ»Π΅Π΅ 5 ΠΌΠΈΠ½ΡƒΡ‚, сСанс Π΄ΠΎΠ»ΠΆΠ΅Π½ автоматичСски Π·Π°Π²Π΅Ρ€ΡˆΠ°Ρ‚ΡŒΡΡ, станция Π΄ΠΎΠ»ΠΆΠ½Π° произвСсти очистку.

ВрСбования Π·Π°ΠΊΠ°Π·Ρ‡ΠΈΠΊΠ°

  • ΠšΠΎΠ»ΠΈΡ‡Π΅ΡΡ‚Π²ΠΎ клиСнтских станций Π½Π° Ρ„ΠΈΠ»ΠΈΠ°Π» – Π½Π΅ Π±ΠΎΠ»Π΅Π΅ 4-Ρ….
  • МинимальноС врСмя оТидания готовности систСмы, ΠΎΡ‚ ΠΌΠΎΠΌΠ΅Π½Ρ‚Π° «сСл Π·Π° стул» Π΄ΠΎ Π½Π°Ρ‡Π°Π»Π° Ρ€Π°Π±ΠΎΡ‚Ρ‹ с клиСнтским ПО.
  • Π’ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ ΠΏΠ΅Ρ€ΠΈΡ„Π΅Ρ€ΠΈΠΉΠ½Ρ‹Ρ… устройств (сканСры, Ρ„Π»ΡΡˆΠΊΠΈ) нСпосрСдствСнно с мСста установки «станции самообслуТивания».
  • ПоТСлания Π·Π°ΠΊΠ°Π·Ρ‡ΠΈΠΊΠ°
  • ДСмонстрация Ρ€Π΅ΠΊΠ»Π°ΠΌΠ½Ρ‹Ρ… ΠΌΠ°Ρ‚Π΅Ρ€ΠΈΠ°Π»ΠΎΠ² (ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠΈ) Π² ΠΌΠΎΠΌΠ΅Π½Ρ‚ простоя комплСкса.

ΠœΡƒΠΊΠΈ творчСства

Π’Π΄ΠΎΠ²ΠΎΠ»ΡŒ Π½Π°ΠΈΠ³Ρ€Π°Π²ΡˆΠΈΡΡŒ с Π²ΠΈΠ½Π΄ΠΎΠ²Ρ‹ΠΌΠΈ livecd, ΠΌΡ‹ ΠΏΡ€ΠΈΡˆΠ»ΠΈ ΠΊ Π΅Π΄ΠΈΠ½ΠΎΠ΄ΡƒΡˆΠ½ΠΎΠΌΡƒ Π²Ρ‹Π²ΠΎΠ΄Ρƒ, Ρ‡Ρ‚ΠΎ ΠΏΠΎΠ»ΡƒΡ‡Π°ΡŽΡ‰Π΅Π΅ΡΡ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ Π½Π΅ удовлСтворяСт ΠΌΠΈΠ½ΠΈΠΌΡƒΠΌ 3 ΠΊΡ€ΠΈΡ‚ΠΈΡ‡Π½Ρ‹ΠΌ ΠΏΡƒΠ½ΠΊΡ‚Π°ΠΌ. Они Π»ΠΈΠ±ΠΎ Π΄ΠΎΠ»Π³ΠΎ грузятся, Π»ΠΈΠ±ΠΎ Π½Π΅ совсСм live, Π»ΠΈΠ±ΠΎ кастомизация ΠΈΡ… Π±Ρ‹Π»Π° сопряТСна с Π΄ΠΈΠΊΠΈΠΌΠΈ болями. Π’ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, ΠΌΡ‹ ΠΏΠ»ΠΎΡ…ΠΎ искали, ΠΈ Π²Ρ‹ смоТСтС ΠΏΠΎΡΠΎΠ²Π΅Ρ‚ΠΎΠ²Π°Ρ‚ΡŒ Π½Π°Π±ΠΎΡ€ ΠΊΠ°ΠΊΠΎΠΉ-Ρ‚ΠΎ инструмСнтов, Π±ΡƒΠ΄Ρƒ Π±Π»Π°Π³ΠΎΠ΄Π°Ρ€Π΅Π½.

Π”Π°Π»ΡŒΡˆΠ΅ ΠΌΡ‹ стали ΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Π² сторону VDI, Π½ΠΎ для этой Π·Π°Π΄Π°Ρ‡ΠΈ Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²ΠΎ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠΉ Π»ΠΈΠ±ΠΎ слишком Π΄ΠΎΡ€ΠΎΠ³ΠΈ, Π»ΠΈΠ±ΠΎ Ρ‚Ρ€Π΅Π±ΡƒΡŽΡ‚ ΠΏΡ€ΠΈΡΡ‚Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ внимания. А Ρ…ΠΎΡ‚Π΅Π»ΠΎΡΡŒ простой инструмСнт, с ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΌ количСством ΠΌΠ°Π³ΠΈΠΈ, Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²ΠΎ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ ΠΌΠΎΠΆΠ½ΠΎ Π±Ρ‹Π»ΠΎ Π±Ρ‹ Ρ€Π΅ΡˆΠΈΡ‚ΡŒ простой ΠΏΠ΅Ρ€Π΅Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΎΠΉ/пСрСзапуском сСрвиса. К ΡΡ‡Π°ΡΡ‚ΡŒΡŽ, Ρƒ нас Π±Ρ‹Π»ΠΎ сСрвСрноС ΠΎΠ±ΠΎΡ€ΡƒΠ΄ΠΎΠ²Π°Π½ΠΈΠ΅, low end класса Π² Ρ„ΠΈΠ»ΠΈΠ°Π»Π°Ρ…, ΠΎΡ‚ выводящСгося ΠΈΠ· эксплуатации сСрвиса, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ ΠΌΡ‹ ΠΌΠΎΠ³Π»ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ для тСхнологичСской Π±Π°Π·Ρ‹.

Π§Ρ‚ΠΎ Π² ΠΈΡ‚ΠΎΠ³Π΅ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ»ΠΎΡΡŒ? А Π²ΠΎΡ‚, Ρ‡Ρ‚ΠΎ Π² ΠΈΡ‚ΠΎΠ³Π΅ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ»ΠΎΡΡŒ, я Π²Π°ΠΌ Ρ€Π°ΡΡΠΊΠ°Π·Π°Ρ‚ΡŒ Π½Π΅ смогу, ΠΈΠ±ΠΎ NDA, Π½ΠΎ Π² процСссС поисков ΠΌΡ‹ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Π°Π»ΠΈ ΠΈΠ½Ρ‚Π΅Ρ€Π΅ΡΠ½ΡƒΡŽ схСму, которая Ρ…ΠΎΡ€ΠΎΡˆΠΎ сСбя ΠΏΠΎΠΊΠ°Π·Π°Π»Π° Π² Π»Π°Π±ΠΎΡ€Π°Ρ‚ΠΎΡ€Π½Ρ‹Ρ… испытаниях, Ρ…ΠΎΡ‚ΡŒ ΠΈ Π½Π΅ пошла Π² ΡΠ΅Ρ€ΠΈΡŽ.

НСмного дисклаймСров: Π°Π²Ρ‚ΠΎΡ€ Π½Π΅ ΠΏΡ€Π΅Ρ‚Π΅Π½Π΄ΡƒΠ΅Ρ‚ Π½Π° Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠ΅Π½Π½ΠΎΠ΅ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ Ρ€Π΅ΡˆΠ°Π΅Ρ‚ всС поставлСнныС Π·Π°Π΄Π°Ρ‡ΠΈ ΠΈ Π΄Π΅Π»Π°Π΅Ρ‚ это Π΄ΠΎΠ±Ρ€ΠΎΠ²ΠΎΠ»ΡŒΠ½ΠΎ ΠΈ с пСснСй. Автор Π·Π°Ρ€Π°Π½Π΅Π΅ согласСн с ΡƒΡ‚Π²Π΅Ρ€ΠΆΠ΄Π΅Π½ΠΈΠ΅ΠΌ, Ρ‡Ρ‚ΠΎ Sein Englishe sprache is zehr schlecht. Π’Π°ΠΊ ΠΊΠ°ΠΊ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ Π±ΠΎΠ»Π΅Π΅ Π½Π΅ развиваСтся, Π½Π° bug fix ΠΈΠ»ΠΈ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»Π° Ρ€Π°ΡΡΡ‡ΠΈΡ‚Ρ‹Π²Π°Ρ‚ΡŒ Π½Π΅ приходится, всё Π² Π²Π°ΡˆΠΈΡ… Ρ€ΡƒΠΊΠ°Ρ…. Автор ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»Π°Π³Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ Π²Ρ‹ Ρ…ΠΎΡ‚ΡŒ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ Π·Π½Π°ΠΊΠΎΠΌΡ‹ с KVM ΠΈ Ρ‡ΠΈΡ‚Π°Π»ΠΈ ΠΎΠ±Π·ΠΎΡ€Π½ΡƒΡŽ ΡΡ‚Π°Ρ‚ΡŒΡŽ ΠΏΠΎ Spice ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»Ρƒ Π½Ρƒ ΠΈ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ Ρ€Π°Π±ΠΎΡ‚Π°Π»ΠΈ с Centos ΠΈΠ»ΠΈ ΠΈΠ½Ρ‹ΠΌ GNU Linux дистрибутивом.

Π’ этой ΡΡ‚Π°Ρ‚ΡŒΠ΅ я Ρ…ΠΎΡ‚Π΅Π» Π±Ρ‹ Ρ€Π°Π·ΠΎΠ±Ρ€Π°Ρ‚ΡŒ костяк ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ²ΡˆΠ΅Π³ΠΎΡΡ Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ, Π° ΠΈΠΌΠ΅Π½Π½ΠΎ взаимодСйствиС ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π° ΠΈ сСрвСра ΠΈ ΡΡƒΡ‚ΡŒ процСссов ΠΏΠΎ ΠΆΠΈΠ·Π½Π΅Π½Π½ΠΎΠΌΡƒ Ρ†ΠΈΠΊΠ»Ρƒ Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹Ρ… машин Π² Ρ€Π°ΠΌΠΊΠ°Ρ… рассматриваСмого Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ. Если ΡΡ‚Π°Ρ‚ΡŒΡ окаТСтся интСрСсна ΠΏΡƒΠ±Π»ΠΈΠΊΠ΅, я ΠΎΠΏΠΈΡˆΡƒ Π΄Π΅Ρ‚Π°Π»ΠΈ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ live ΠΎΠ±Ρ€Π°Π·ΠΎΠ² для создания Ρ‚ΠΎΠ½ΠΊΠΈΡ… ΠΊΠ»ΠΈΠ΅Π½Ρ‚ΠΎΠ² Π½Π° Π±Π°Π·Π΅ Fedora ΠΈ расскаТу ΠΎ дСталях настройки Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹Ρ… машин ΠΈ KVM сСрвСра для ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ ΠΈ защищСнности.

Если Π²Π·ΡΡ‚ΡŒ Ρ†Π²Π΅Ρ‚Π½ΠΎΠΉ Π±ΡƒΠΌΠ°Π³ΠΈ,
ΠšΡ€Π°ΡΠΊΠΈ, кисточки ΠΈ ΠΊΠ»Π΅ΠΉ,
И Π΅Ρ‰Π΅ Ρ‡ΡƒΡ‚ΡŒ-Ρ‡ΡƒΡ‚ΡŒ сноровки…
МоТно ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ сто Ρ€ΡƒΠ±Π»Π΅ΠΉ!

Π‘Ρ…Π΅ΠΌΠ° ΠΈ описаниС тСстового стСнда

KVM (Π½Π΅Π΄ΠΎ)VDI с ΠΎΠ΄Π½ΠΎΡ€Π°Π·ΠΎΠ²Ρ‹ΠΌΠΈ Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹ΠΌΠΈ машинами с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ bash

ВсС ΠΎΠ±ΠΎΡ€ΡƒΠ΄ΠΎΠ²Π°Π½ΠΈΠ΅ располагаСтся Π²Π½ΡƒΡ‚Ρ€ΠΈ сСти Ρ„ΠΈΠ»ΠΈΠ°Π»Π°, Π½Π°Ρ€ΡƒΠΆΡƒ Π²Ρ‹Ρ…ΠΎΠ΄ΠΈΡ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΈΠ½Ρ‚Π΅Ρ€Π½Π΅Ρ‚ ΠΊΠ°Π½Π°Π». ΠŸΡ€ΠΎΠΊΡΠΈ сСрвСр историчСски ΡƒΠΆΠ΅ Π±Ρ‹Π», Π½ΠΈΡ‡Π΅Π³ΠΎ экстраординарного ΠΎΠ½ ΠΈΠ· сСбя Π½Π΅ прСдставляСт. Но ΠΈΠΌΠ΅Π½Π½ΠΎ Π½Π° Π½Π΅ΠΌ, Π² числС ΠΏΡ€ΠΎΡ‡Π΅Π³ΠΎ, Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ€ΠΎΠΈΡΡ…ΠΎΠ΄ΠΈΡ‚ΡŒ Ρ„ΠΈΠ»ΡŒΡ‚Ρ€Π°Ρ†ΠΈΡ Ρ‚Ρ€Π°Ρ„Ρ„ΠΈΠΊΠ° ΠΎΡ‚ Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹Ρ… машин (сокр. Π’Πœ Π΄Π°Π»Π΅Π΅ Π² тСкстС). НичСго Π½Π΅ ΠΌΠ΅ΡˆΠ°Π΅Ρ‚ Ρ€Π°Π·ΠΌΠ΅ΡΡ‚ΠΈΡ‚ΡŒ этот сСрвис Π½Π° KVM сСрвСрС, СдинствСнноС, Ρ‡Ρ‚ΠΎ Π½Π°Π΄ΠΎ ΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°ΠΊ измСнится Π½Π°Π³Ρ€ΡƒΠ·ΠΊΠ° ΠΎΡ‚ Π½Π΅Π³ΠΎ Π½Π° Π΄ΠΈΡΠΊΠΎΠ²ΡƒΡŽ подсистСму.

Client Station – собствСнно, «станции самообслуТивания», Β«Ρ„Ρ€ΠΎΠ½Ρ‚Π΅Π½Π΄Β» нашСго сСрвиса. ΠŸΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‚ ΠΈΠ· сСбя Π½Π΅Ρ‚Ρ‚ΠΎΠΏΡ‹ Lenovo IdeaCentre. Π§Π΅ΠΌ Ρ…ΠΎΡ€ΠΎΡˆ этот Π°Π³Ρ€Π΅Π³Π°Ρ‚? Π”Π° ΠΏΠΎΡ‡Ρ‚ΠΈ всСм, особСнно Ρ€Π°Π΄ΡƒΠ΅Ρ‚ большоС количСство USB Ρ€Π°Π·ΡŠΠ΅ΠΌΠΎΠ² ΠΈ ΠΊΠ°Ρ€Π΄Ρ€ΠΈΠ΄Π΅Ρ€ Π½Π° Π»ΠΈΡ†Π΅Π²ΠΎΠΉ ΠΏΠ°Π½Π΅Π»ΠΈ. Π’ нашСй схСмС Π² ΠΊΠ°Ρ€Π΄Ρ€ΠΈΠ΄Π΅Ρ€ вставлСна SD ΠΊΠ°Ρ€Ρ‚Π° с Π²ΠΊΠ»ΡŽΡ‡Π΅Π½Π½ΠΎΠΉ Π°ΠΏΠΏΠ°Ρ€Π°Ρ‚Π½ΠΎΠΉ Π·Π°Ρ‰ΠΈΡ‚ΠΎΠΉ ΠΎΡ‚ записи, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€ΠΎΡŽ записан ΠΌΠΎΠ΄ΠΈΡ„ΠΈΡ†ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ live ΠΎΠ±Ρ€Π°Π· Fedora 28. Π‘Π°ΠΌΠΎ собой, ΠΊ Π½Π΅Ρ‚Ρ‚ΠΎΠΏΡƒ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ ΠΌΠΎΠ½ΠΈΡ‚ΠΎΡ€, ΠΊΠ»Π°Π²ΠΈΠ°Ρ‚ΡƒΡ€Π° ΠΈ ΠΌΡ‹ΡˆΡŒ.

Switch – Π½ΠΈΡ‡Π΅ΠΌ Π½Π΅ ΠΏΡ€ΠΈΠΌΠ΅Ρ‡Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ Π°ΠΏΠΏΠ°Ρ€Π°Ρ‚Π½Ρ‹ΠΉ switch Π²Ρ‚ΠΎΡ€ΠΎΠ³ΠΎ уровня, стоит Π² сСрвСрной ΠΈ ΠΌΠΈΠ³Π°Π΅Ρ‚ Π»Π°ΠΌΠΏΠΎΡ‡ΠΊΠ°ΠΌΠΈ. Ни ΠΊ ΠΊΠ°ΠΊΠΈΠΌ сСтям, ΠΊΡ€ΠΎΠΌΠ΅ сСти «станций самообслуТивания» Π½Π΅ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½.

KVM_Server – ядро схСмы, Π² стСндовых испытаниях Core 2 Quad Q9650 с 8 Π“Π± ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΈΠ²Π½ΠΎΠΉ памяти ΡƒΠ²Π΅Ρ€Π΅Π½Π½ΠΎ тянул Π½Π° сСбС 3 Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹Ρ… ΠΌΠ°ΡˆΠΈΠ½Ρ‹ с Windows10. Дисковая подсистСма – adaptec 3405 2 диска Raid 1 + SSD. Π’ ΠΏΠΎΠ»Π΅Π²Ρ‹Ρ… испытаниях Xeon 1220 Π±ΠΎΠ»Π΅Π΅ ΡΠ΅Ρ€ΡŒΠ΅Π·Π½Ρ‹ΠΉ LSI 9260 + SSD Π»Π΅Π³ΠΊΠΎ тянули 5-6 Π’Πœ. Π‘Π΅Ρ€Π²Π΅Ρ€Π° Π½Π°ΠΌ Π΄ΠΎΡΡ‚Π°Π»ΠΈΡΡŒ Π±Ρ‹ ΠΎΡ‚ Π²Ρ‹Π±Ρ‹Π²ΡˆΠ΅Π³ΠΎ сСрвиса, ΠΊΠ°ΠΏΠΈΡ‚Π°Π»ΡŒΠ½Ρ‹Ρ… Π·Π°Ρ‚Ρ€Π°Ρ‚ Π±Ρ‹Π»ΠΎ Π±Ρ‹ Π½Π΅ ΠΌΠ½ΠΎΠ³ΠΎ. На этом сСрвСрС(Π°Ρ…) Ρ€Π°Π·Π²Π΅Ρ€Π½ΡƒΡ‚Π° систСма Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ KVM с ΠΏΡƒΠ»ΠΎΠΌ Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹Ρ… машин pool_Vm.

Vm β€” Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Π°Ρ машина, бэкэнд нашСго сСрвиса. Π’ Π½Π΅ΠΉ происходит Ρ€Π°Π±ΠΎΡ‚Π° ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ.

Enp5s0 – сСтСвой интСрфСйс смотрящий Π² сторону сСти «станций самообслуТивания», Π½Π° Π½Π΅ΠΌ ΠΆΠΈΠ²ΡƒΡ‚ dhcpd, ntpd, httpd, ΠΈ xinetd ΡΠ»ΡƒΡˆΠ°Π΅Ρ‚ Β«signalΒ» ΠΏΠΎΡ€Ρ‚.

Lo0 – псСвдоинтСрфСйс ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎΠΉ ΠΏΠ΅Ρ‚Π»ΠΈ. Π‘Ρ‚Π°Π½Π΄Π°Ρ€Ρ‚Π½Ρ‹ΠΉ.

Spice_console – ΠžΡ‡Π΅Π½ΡŒ интСрСсная Π²Π΅Ρ‰ΡŒ, Π΄Π΅Π»ΠΎ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Π² ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅ ΠΎΡ‚ классичСского RDP, ΠΏΡ€ΠΈ Ρ€Π°Π·Π²ΠΎΡ€ΠΎΡ‚Π΅ связки KVM+Spice protocol, появляСтся Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Π°Ρ ΡΡƒΡ‰Π½ΠΎΡΡ‚ΡŒ – ΠΏΠΎΡ€Ρ‚ консоли Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½ΠΎΠΉ ΠΌΠ°ΡˆΠΈΠ½Ρ‹. ЀактичСски, ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π°ΡΡΡŒ Π½Π° этот TCP ΠΏΠΎΡ€Ρ‚, ΠΌΡ‹ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ консоль Vm, Π±Π΅Π· нСобходимости ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π°Ρ‚ΡΡ ΠΊ Vm Ρ‡Π΅Ρ€Π΅Π· Π΅Ρ‘ сСтСвой интСрфСйс. Всё взаимодСйствиС с Vm ΠΏΠΎ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡Π΅ сигнала, сСрвСр Π±Π΅Ρ€Π΅Ρ‚ Π½Π° сСбя. Π‘Π»ΠΈΠΆΠ°ΠΉΡˆΠΈΠΉ Π°Π½Π°Π»ΠΎΠ³ ΠΏΠΎ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ – IPKVM. Π’.Π΅. Π½Π° этот ΠΏΠΎΡ€Ρ‚ пСрСдаСтся ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ ΠΌΠΎΠ½ΠΈΡ‚ΠΎΡ€Π° Π’Πœ, Π½Π° Π½Π΅Π³ΠΎ ΠΆΠ΅ ΠΏΠ΅Ρ€Π΅Π΄Π°ΡŽΡ‚ΡΡ Π΄Π°Π½Π½Ρ‹Π΅ ΠΎ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Ρ‰Π΅Π½ΠΈΠΈ ΠΌΡ‹ΡˆΠΈ, ΠΈ (Ρ‡Ρ‚ΠΎ самоС Π³Π»Π°Π²Π½ΠΎΠ΅) взаимодСйствиС Ρ‡Π΅Ρ€Π΅Π· Spice ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ» позволяСт бСсшовно ΠΏΠ΅Ρ€Π΅Π½Π°ΠΏΡ€Π°Π²Π»ΡΡ‚ΡŒ USB устройства Π² Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½ΡƒΡŽ ΠΌΠ°ΡˆΠΈΠ½Ρƒ, словно это устройство ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΎ ΠΊ самой Vm. ΠŸΡ€ΠΎΠ²Π΅Ρ€Π΅Π½ΠΎ для Ρ„Π»ΡΡˆ Π½Π°ΠΊΠΎΠΏΠΈΡ‚Π΅Π»Π΅ΠΉ, сканСров, вэб-ΠΊΠ°ΠΌΠ΅Ρ€.

Vnet0, virbr0 ΠΈ Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹Π΅ сСтСвыС ΠΊΠ°Ρ€Ρ‚Ρ‹ Vm ΠΎΠ±Ρ€Π°Π·ΡƒΡŽΡ‚ ΡΠ΅Ρ‚ΡŒ Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹Ρ… машин.

Как ЭВО Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚

Π‘ΠΎ стороны Client Station

ΠšΠ»ΠΈΠ΅Π½Ρ‚ΡΠΊΠ°Ρ станция загруТаСтся Π² графичСском Ρ€Π΅ΠΆΠΈΠΌΠ΅ с ΠΌΠΎΠ΄ΠΈΡ„ΠΈΡ†ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ live ΠΎΠ±Ρ€Π°Π·Π° Fedora 28, ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ ip адрСс ΠΏΠΎ dhcp ΠΈΠ· адрСсного пространства сСти 169.254.24.0/24. Π’ процСссС Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ ΡΠΎΠ·Π΄Π°ΡŽΡ‚ΡΡ ΠΏΡ€Π°Π²ΠΈΠ»Π° Ρ„Π°ΠΉΠ΅Ρ€Π²ΠΎΠ»Π°, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‰ΠΈΠ΅ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚ΡŒ соСдинСния ΠΊ Β«signalΒ» ΠΈ Β«spiceΒ» ΠΏΠΎΡ€Ρ‚Π°ΠΌ сСрвСра. ПослС Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ станция ΠΆΠ΄Π΅Ρ‚ Π°Π²Ρ‚ΠΎΡ€ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ Β«ClientΒ». ПослС Π°Π²Ρ‚ΠΎΡ€ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ происходит запуск ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ€Π° Ρ€Π°Π±ΠΎΡ‡ΠΈΡ… столов Β«openboxΒ» ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ скрипта автозапуска autostart ΠΎΡ‚ ΠΈΠΌΠ΅Π½ΠΈ Π°Π²Ρ‚ΠΎΡ€ΠΈΠ·ΠΎΠ²Π°Π²ΡˆΠ΅Π³ΠΎΡΡ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ. Π‘Ρ€Π΅Π΄ΠΈ ΠΏΡ€ΠΎΡ‡Π΅Π³ΠΎ, скрипт автозапуска запускаСт скрипт remote.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

ОписаниС ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… Ρ„Π°ΠΉΠ»Π° client.conf
server_ip β€” адрСс KVM_Server
vdi_signal_port β€” ΠΏΠΎΡ€Ρ‚ KVM_Server Π½Π° ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ «сидит» xinetd
vdi_spice_port β€” сСтСвой ΠΏΠΎΡ€Ρ‚ KVM_Server, с ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ€ΠΎΠΈΡΡ…ΠΎΠ΄ΠΈΡ‚ΡŒ ΠΏΠ΅Ρ€Π΅Π½Π°ΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ запроса Π½Π° соСдинСниС ΠΎΡ‚ remote-viewer ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π° ΠΊ spice ΠΏΠΎΡ€Ρ‚Ρƒ Π²Ρ‹Π΄Π΅Π»Π΅Π½Π½ΠΎΠΉ Vm (подробности Π½ΠΈΠΆΠ΅)
animation_folder β€” ΠΏΠ°ΠΏΠΊΠ°, ΠΎΡ‚ΠΊΡƒΠ΄Π° бСрутся изобраТСния для дСмонстрации bullshit animation
background_folder β€” ΠΏΠ°ΠΏΠΊΠ°, ΠΎΡ‚ΠΊΡƒΠ΄Π° бСрутся изобраТСния для дСмонстрации ΠΏΡ€Π΅Π·Π΅Π½Ρ‚Π°Ρ†ΠΈΠΉ Π² Ρ€Π΅ΠΆΠΈΠΌΠ΅ оТидания. ΠŸΠΎΠ΄Ρ€ΠΎΠ±Π½Π΅Π΅ ΠΎΠ± Π°Π½ΠΈΠΌΠ°Ρ†ΠΈΠΈ Π² ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ части ΡΡ‚Π°Ρ‚ΡŒΠΈ.

Π‘ΠΊΡ€ΠΈΠΏΡ‚ remote.sh Π±Π΅Ρ€Π΅Ρ‚ настройки ΠΈΠ· Ρ„Π°ΠΉΠ»Π° ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ /etc/client.conf ΠΈ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ nc ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ Π½Π° Β«vdi_signal_portΒ» ΠΏΠΎΡ€Ρ‚ KVM сСрвСра ΠΈ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ ΠΏΠΎΡ‚ΠΎΠΊ Π΄Π°Π½Π½Ρ‹Ρ… ΠΎΡ‚ сСрвСра, срСди ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΎΠΆΠΈΠ΄Π°Π΅Ρ‚ строки Β«RULE ADDED, CONNECT NOWΒ». ΠŸΡ€ΠΈ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠΈ искомой строки запускаСтся процСсс remote-viewer Π² Ρ€Π΅ΠΆΠΈΠΌΠ΅ киоска устанавливая соСдинСниС Π½Π° Β«vdi_spice_portΒ» ΠΏΠΎΡ€Ρ‚ сСрвСра. Π’Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ скрипта приостанавливаСтся Π΄ΠΎ ΠΌΠΎΠΌΠ΅Π½Ρ‚Π° окончания исполнСния remote-viewer-Π°.

Remote-viewer ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π°ΡΡΡŒ Π½Π° Β«vdi_spice_portΒ» ΠΏΠΎΡ€Ρ‚, Π·Π° счСт Ρ€Π΅Π΄ΠΈΡ€Π΅ΠΊΡ‚Π° Π½Π° сторонС сСрвСра, ΠΏΠΎΠΏΠ°Π΄Π°Π΅Ρ‚ Π½Π° ΠΏΠΎΡ€Ρ‚ Β«spice_consoleΒ» интСрфСйса lo0 Ρ‚.Π΅. Π½Π° консоль Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½ΠΎΠΉ ΠΌΠ°ΡˆΠΈΠ½Ρ‹ ΠΈ происходит, нСпосрСдствСнно, Ρ€Π°Π±ΠΎΡ‚Π° ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ. Π’ процСссС оТидания ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ, ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŽ дСмонстрируСтся bullshit animation, Π² Π²ΠΈΠ΄Π΅ слайд-ΡˆΠΎΡƒ ΠΈΠ· jpeg Ρ„Π°ΠΉΠ»ΠΎΠ², ΠΏΡƒΡ‚ΡŒ ΠΊ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Ρƒ с ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ°ΠΌΠΈ опрСдСляСтся Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ animation_folder ΠΈΠ· ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΎΠ½Π½ΠΎΠ³ΠΎ Ρ„Π°ΠΉΠ»Π°.

ΠŸΡ€ΠΈ ΠΏΠΎΡ‚Π΅Ρ€Π΅ соСдинСния с Β«spice_consoleΒ» ΠΏΠΎΡ€Ρ‚ΠΎΠΌ Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½ΠΎΠΉ ΠΌΠ°ΡˆΠΈΠ½Ρ‹, ΡΠΈΠ³Π½Π°Π»ΠΈΠ·ΠΈΡ€ΡƒΡŽΡ‰Π΅Π³ΠΎ ΠΎΠ± Π²Ρ‹ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΈ/ΠΏΠ΅Ρ€Π΅Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠ΅ Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½ΠΎΠΉ ΠΌΠ°ΡˆΠΈΠ½Ρ‹ (Ρ‚.Π΅. фактичСским ΠΎΠΊΠΎΠ½Ρ‡Π°Π½ΠΈΠ΅ΠΌ сСссии ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ), происходит Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ всСх процСссов, Π·Π°ΠΏΡƒΡ‰Π΅Π½Π½Ρ‹Ρ… ΠΎΡ‚ ΠΈΠΌΠ΅Π½ΠΈ Π°Π²Ρ‚ΠΎΡ€ΠΈΠ·ΠΎΠ²Π°Π²ΡˆΠ΅Π³ΠΎΡΡ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ ΠΊ пСрСзапуску lightdm ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‚Ρƒ Π½Π° экран Π°Π²Ρ‚ΠΎΡ€ΠΈΠ·Π°Ρ†ΠΈΠΈ.

Π‘ΠΎ стороны KVM Server

На Β«signalΒ» ΠΏΠΎΡ€Ρ‚Ρƒ сСтСвой ΠΊΠ°Ρ€Ρ‚Ρ‹ enp5s0 ΠΆΠ΄Π΅Ρ‚ соСдинСния xinetd. ПослС ΠΊΠΎΠ½Π½Π΅ΠΊΡ‚Π° Π½Π° Β«signalΒ» ΠΏΠΎΡ€Ρ‚ xinetd запускаСт скрипт vm_manager.sh Π±Π΅Π· ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ Π΅ΠΌΡƒ ΠΊΠ°ΠΊΠΈΡ…-Π»ΠΈΠ±ΠΎ Π²Π²ΠΎΠ΄Π½Ρ‹Ρ… ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² ΠΈ пСрСнаправляСт Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ выполнСния скрипта Π² nc сСссию Client Station.

/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
input_iface=enp5s0
vdi_spice_port=5906
count_conn_tryes=10

ОписаниС ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΎΠ½Π½ΠΎΠ³ΠΎ Ρ„Π°ΠΉΠ»Π° vm_manager.conf
srv_scripts_dir β€” ΠΏΠ°ΠΏΠΊΠ° располоТСния скриптов vm_manager.sh, vm_connect.sh, vm_delete.sh, vm_create.sh, vm_clear.sh
srv_pool_size β€” Ρ€Π°Π·ΠΌΠ΅Ρ€ ΠΏΡƒΠ»Π° Vm
srv_start_port_pool β€” Π½Π°Ρ‡Π°Π»ΡŒΠ½Ρ‹ΠΉ ΠΏΠΎΡ€Ρ‚, послС ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ начнСтся располоТСниС ΠΏΠΎΡ€Ρ‚ΠΎΠ² spice консолСй Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹Ρ… машин
srv_tmp_dir β€” ΠΏΠ°ΠΏΠΊΠ° для размСщСния Π²Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… Ρ„Π°ΠΉΠ»ΠΎΠ²
base_host β€” базовая Vm (Π·ΠΎΠ»ΠΎΡ‚ΠΎΠΉ ΠΎΠ±Ρ€Π°Π·) с ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ Π±ΡƒΠ΄ΡƒΡ‚ Π΄Π΅Π»Π°Ρ‚ΡŒΡΡ ΠΊΠ»ΠΎΠ½Ρ‹ Vm Π² ΠΏΡƒΠ»
input_iface β€” сСтСвой интСрфСйс сСрвСра, смотрящий Π² сторону Client Stations
vdi_spice_port β€” сСтСвой ΠΏΠΎΡ€Ρ‚ сСрвСра, с ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ€ΠΎΠΈΡΡ…ΠΎΠ΄ΠΈΡ‚ΡŒ ΠΏΠ΅Ρ€Π΅Π½Π°ΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ запроса Π½Π° соСдинСниС ΠΎΡ‚ remote-viewer ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π° ΠΊ spice ΠΏΠΎΡ€Ρ‚Ρƒ Π²Ρ‹Π΄Π΅Π»Π΅Π½Π½ΠΎΠΉ Vm
count_conn_tryes β€” Ρ‚Π°ΠΉΠΌΠ΅Ρ€ оТидания, ΠΏΠΎ ΠΈΡΡ‚Π΅Ρ‡Π΅Π½ΠΈΡŽ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ считаСтся, Ρ‡Ρ‚ΠΎ соСдинСния ΠΊ Vm Π½Π΅ ΠΏΡ€ΠΎΠΈΠ·ΠΎΡˆΠ»ΠΎ (подробности Ρ€Π°Π±ΠΎΡ‚Ρ‹ см. vm_connect.sh)

Π‘ΠΊΡ€ΠΈΠΏΡ‚ vm_manager.sh ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚ Ρ‡Ρ‚Π΅Π½ΠΈΠ΅ Ρ„Π°ΠΉΠ»Π° ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ ΠΈΠ· Ρ„Π°ΠΉΠ»Π° vm_manager.conf, ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚ ΠΎΡ†Π΅Π½ΠΊΡƒ состояния Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹Ρ… машин Π² ΠΏΡƒΠ»Π΅ ΠΏΠΎ нСскольким ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°ΠΌ, Π° ΠΈΠΌΠ΅Π½Π½ΠΎ: сколько VM Ρ€Π°Π·Π²Π΅Ρ€Π½ΡƒΡ‚ΠΎ, Π΅ΡΡ‚ΡŒ Π»ΠΈ свободныС чистыС VM. Для этого ΠΎΠ½ Ρ‡ΠΈΡ‚Π°Π΅Ρ‚ Ρ„Π°ΠΉΠ» clear.list Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ содСрТатся Π½ΠΎΠΌΠ΅Ρ€Π° Β«spice_consoleΒ» ΠΏΠΎΡ€Ρ‚ΠΎΠ² «свСТСсозданных» (см. Π½ΠΈΠΆΠ΅ Ρ†ΠΈΠΊΠ» создания Π’.М.) Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹Ρ… машин ΠΈ провСряСт Π½Π°Π»ΠΈΡ‡ΠΈΠ΅ установлСнного соСдинСния с Π½ΠΈΠΌΠΈ. ΠŸΡ€ΠΈ ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠ΅Π½ΠΈΠΈ ΠΏΠΎΡ€Ρ‚Π° с установлСнным сСтСвым соСдинСниСм, (Ρ‡Π΅Π³ΠΎ Π±Ρ‹Ρ‚ΡŒ катСгоричСски Π½Π΅ Π΄ΠΎΠ»ΠΆΠ½ΠΎ) выводится ΠΏΡ€Π΅Π΄ΡƒΠΏΡ€Π΅ΠΆΠ΄Π΅Π½ΠΈΠ΅ ΠΈ ΠΏΠΎΡ€Ρ‚ пСрСносится Π² waste.list ΠŸΡ€ΠΈ ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠ΅Π½ΠΈΠΈ ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ ΠΏΠΎΡ€Ρ‚Π° ΠΈΠ· Ρ„Π°ΠΉΠ»Π° clear.list с ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ Π² настоящий ΠΌΠΎΠΌΠ΅Π½Ρ‚ Π½Π΅Ρ‚ соСдинСния vm_manager.sh Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ скрипт vm_connect.sh ΠΈ ΠΏΠ΅Ρ€Π΅Π΄Π°Π΅Ρ‚ Π΅ΠΌΡƒ Π² качСствС ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° Π½ΠΎΠΌΠ΅Ρ€ этого ΠΏΠΎΡ€Ρ‚Π°.

/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

Π‘ΠΊΡ€ΠΈΠΏΡ‚ vm_connect.sh вносит ΠΏΡ€Π°Π²ΠΈΠ»Π° Ρ„Π°ΠΉΠ΅Ρ€Π²ΠΎΠ»Π»Π° ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ ΡΠΎΠ·Π΄Π°ΡŽΡ‚ Ρ€Π΅Π΄ΠΈΡ€Π΅ΠΊΡ‚ Β«vdi_spice_portΒ» ΠΏΠΎΡ€Ρ‚Π° сСрвСра интСрфСйса enp5s0 Π½Π° Β«spice console portΒ» VM, располоТСнном Π½Π° lo0 интСрфСйсС сСрвСра, ΠΏΠ΅Ρ€Π΅Π΄Π°Π½Π½Ρ‹ΠΉ Π² качСствС ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° запуска. ΠŸΠΎΡ€Ρ‚ пСрСносится Π² conn_wait.list, VM считаСтся ΠΎΠΆΠΈΠ΄Π°ΡŽΡ‰Π΅ΠΉ соСдинСния. Π’ сСссию Client Station Π½Π° Β«signalΒ» ΠΏΠΎΡ€Ρ‚Ρƒ сСрвСра пСрСдаСтся строка Β«RULE ADDED, CONNECT NOWΒ», ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ ΠΎΠΆΠΈΠ΄Π°Π΅Ρ‚ Π·Π°ΠΏΡƒΡ‰Π΅Π½Π½Ρ‹ΠΉ Π½Π° Π½Π΅ΠΉ скрипт remote.sh. НачинаСтся Ρ†ΠΈΠΊΠ» оТидания соСдинСния с количСством ΠΏΠΎΠΏΡ‹Ρ‚ΠΎΠΊ, опрСдСляСмым Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ Β«count_conn_tryesΒ» ΠΈΠ· ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΎΠ½Π½ΠΎΠ³ΠΎ Ρ„Π°ΠΉΠ»Π°. ΠšΠ°ΠΆΠ΄ΡƒΡŽ сСкунду Π² nc сСссию Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΡ‚Π΄Π°Π²Π°Ρ‚ΡŒΡΡ строка Β«RULE ADDED, CONNECT NOWΒ» ΠΈ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΡΡ‚ΡŒΡΡ Π½Π°Π»ΠΈΡ‡ΠΈΠ΅ установлСнного соСдинСния Π΄ΠΎ Β«spice_consoleΒ» ΠΏΠΎΡ€Ρ‚Π°.

Если Π·Π° установлСнноС количСство ΠΏΠΎΠΏΡ‹Ρ‚ΠΎΠΊ, соСдинСния Π½Π΅ ΠΏΡ€ΠΎΠΈΠ·ΠΎΡˆΠ»ΠΎ, Β«spice_consoleΒ» ΠΏΠΎΡ€Ρ‚ пСрСносится ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎ Π² clear.list ИсполнСниС vm_connect.sh Π·Π°Π²Π΅Ρ€ΡˆΠ°Π΅Ρ‚ΡΡ, возобновляСтся Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ vm_manager.sh, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ запускаСт Ρ†ΠΈΠΊΠ» очистки.

Если фиксируСтся ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ Client Station ΠΊ Β«spice_consoleΒ» ΠΏΠΎΡ€Ρ‚Ρƒ Π½Π° интСрфСйсС lo0, ΠΏΡ€Π°Π²ΠΈΠ»Π° Ρ„Π°ΠΉΠ΅Ρ€Π²ΠΎΠ»Π»Π° ΡΠΎΠ·Π΄Π°ΡŽΡ‰ΠΈΠ΅ Ρ€Π΅Π΄ΠΈΡ€Π΅ΠΊΡ‚ ΠΌΠ΅ΠΆΠ΄Ρƒ Β«spiceΒ» ΠΏΠΎΡ€Ρ‚ΠΎΠΌ сСрвСра ΠΈ Β«spice_consoleΒ» ΠΏΠΎΡ€Ρ‚ΠΎΠΌ ΡƒΠ΄Π°Π»ΡΡŽΡ‚ΡΡ ΠΈ дальнСйшСС ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠ°Π½ΠΈΠ΅ соСдинСния происходит Π·Π° счСт ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΠ° опрСдСлСния состояния Ρ„Π°ΠΉΠ΅Ρ€Π²ΠΎΠ»Π»Π°. Π’ случаС Ρ€Π°Π·Ρ€Ρ‹Π²Π° соСдинСния, ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎ ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ связь с Β«spice_consoleΒ» ΠΏΠΎΡ€Ρ‚ΠΎΠΌ, Π½Π΅ удастся. ΠŸΠΎΡ€Ρ‚ Β«spice_consoleΒ» пСрСносится Π² waste.list, VM считаСтся «грязной» ΠΈ Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒΡΡ Π² ΠΏΡƒΠ» «чистых» Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹Ρ… машин Π±Π΅Π· прохоТдСния очистки ΠΎΠ½Π° Π½Π΅ смоТСт. ИсполнСниС vm_connect.sh Π·Π°Π²Π΅Ρ€ΡˆΠ°Π΅Ρ‚ΡΡ, возобновляСтся Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ vm_manager.sh, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ запускаСт Ρ†ΠΈΠΊΠ» очистки.

Π¦ΠΈΠΊΠ» очистки начинаСтся с просмотра Ρ„Π°ΠΉΠ»Π° waste.list Π² ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ пСрСносятся Π½ΠΎΠΌΠ΅Ρ€Π° Β«spice_consoleΒ» ΠΏΠΎΡ€Ρ‚ΠΎΠ² Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹Ρ… машин ΠΊ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ ΡƒΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°Π»ΠΎΡΡŒ соСдинСниС. ΠžΠΏΡ€Π΅Π΄Π΅Π»ΡΠ΅Ρ‚ΡΡ Π½Π°Π»ΠΈΡ‡ΠΈΠ΅ Π°ΠΊΡ‚ΠΈΠ²Π½ΠΎΠ³ΠΎ соСдинСния Π½Π° ΠΊΠ°ΠΆΠ΄ΠΎΠΌ Β«spice_consoleΒ» ΠΏΠΎΡ€Ρ‚Ρƒ ΠΈΠ· списка. Если соСдинСниС отсутствуСт, считаСтся, Ρ‡Ρ‚ΠΎ Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Π°Ρ машина Π±ΠΎΠ»Π΅Π΅ Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ΠΈ ΠΏΠΎΡ€Ρ‚ пСрСносится Π² recycle.list ΠΈ запускаСтся процСсс удалСния Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½ΠΎΠΉ ΠΌΠ°ΡˆΠΈΠ½Ρ‹(см. Π½ΠΈΠΆΠ΅), ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ ΠΏΡ€ΠΈΠ½Π°Π΄Π»Π΅ΠΆΠ°Π» этот ΠΏΠΎΡ€Ρ‚. Если ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠ΅Π½ΠΎ Π°ΠΊΡ‚ΠΈΠ²Π½ΠΎΠ΅ сСтСвоС соСдинСниС Π½Π° ΠΏΠΎΡ€Ρ‚Ρƒ, считаСтся, Ρ‡Ρ‚ΠΎ Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Π°Ρ машина ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ, Π½ΠΈΠΊΠ°ΠΊΠΈΡ… дСйствий для Π½Π΅Π΅ Π½Π΅ прСдпринимаСтся. Если ΠΏΠΎΡ€Ρ‚ Π½Π΅ ΠΏΡ€ΠΎΡΠ»ΡƒΡˆΠΈΠ²Π°Π΅Ρ‚ΡΡ, считаСтся, Ρ‡Ρ‚ΠΎ VM Π²Ρ‹ΠΊΠ»ΡŽΡ‡Π΅Π½Π° ΠΈ Π±ΠΎΠ»Π΅Π΅ Π½Π΅ Π½ΡƒΠΆΠ½Π°. ΠŸΠΎΡ€Ρ‚ пСрСносится Π² recycle.list ΠΈ запускаСтся процСсс удалСния Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½ΠΎΠΉ ΠΌΠ°ΡˆΠΈΠ½Ρ‹. Для этого вызываСтся скрипт vm_delete.sh, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌΡƒ Π² качСствС ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° пСрСдаСтся Π½ΠΎΠΌΠ΅Ρ€ Β«spice_consoleΒ» ΠΏΠΎΡ€Ρ‚Ρƒ VM, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΡƒΠ΄Π°Π»ΠΈΡ‚ΡŒ.

/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

Π£Π΄Π°Π»Π΅Π½ΠΈΠ΅ Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½ΠΎΠΉ ΠΌΠ°ΡˆΠΈΠ½Ρ‹ – достаточно Ρ‚Ρ€ΠΈΠ²ΠΈΠ°Π»ΡŒΠ½Π°Ρ опСрация, скрипт vm_delete.sh ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ ΠΈΠΌΠ΅Π½ΠΈ Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½ΠΎΠΉ ΠΌΠ°ΡˆΠΈΠ½Ρ‹, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ ΠΏΡ€ΠΈΠ½Π°Π΄Π»Π΅ΠΆΠΈΡ‚ ΠΏΠΎΡ€Ρ‚, ΠΏΠ΅Ρ€Π΅Π΄Π°Π½Π½Ρ‹ΠΉ Π² качСствС ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° запуска. ΠŸΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚ΡΡ ΠΏΡ€ΠΈΠ½ΡƒΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ останов VM, ΡƒΠ΄Π°Π»Π΅Π½ΠΈΠ΅ VM ΠΈΠ· Π³ΠΈΠΏΠ΅Ρ€Π²ΠΈΠ·ΠΎΡ€Π°, удаляСтся Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹ΠΉ ТСсткий диск Π΄Π°Π½Π½ΠΎΠΉ VM. ΠŸΠΎΡ€Ρ‚ Β«spice_consoleΒ» удаляСтся ΠΈΠ· recycle.list. ИсполнСниС vm_delete.sh Π·Π°Π²Π΅Ρ€ΡˆΠ°Π΅Ρ‚ΡΡ, возобновляСтся исполнСниС vm_manager.sh

Π‘ΠΊΡ€ΠΈΠΏΡ‚ vm_manager.sh, ΠΏΠΎ ΠΎΠΊΠΎΠ½Ρ‡Π°Π½ΠΈΡŽ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ ΠΏΠΎ очисткС Π»ΠΈΡˆΠ½ΠΈΡ… Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹Ρ… машин ΠΈΠ· списка waste.list Π½Π°Ρ‡ΠΈΠ½Π°Π΅Ρ‚ Ρ†ΠΈΠΊΠ» создания Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹Ρ… машин Π² ΠΏΡƒΠ».

ΠŸΡ€ΠΎΡ†Π΅ΡΡ начинаСтся с Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ происходит ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ доступных для размСщСния ΠΏΠΎΡ€Ρ‚ΠΎΠ² Β«spice_consoleΒ». Для этого исходя ΠΈΠ· ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΎΠ½Π½ΠΎΠ³ΠΎ Ρ„Π°ΠΉΠ»Π° Β«srv_start_port_poolΒ» ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π·Π°Π΄Π°Π΅Ρ‚ Π½Π°Ρ‡Π°Π»ΡŒΠ½Ρ‹ΠΉ ΠΏΠΎΡ€Ρ‚ для ΠΏΡƒΠ»Π° Β«spice_consoleΒ» Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹Ρ… машин ΠΈ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° Β«srv_pool_sizeΒ», ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‰Π΅Π³ΠΎ ΠΏΡ€Π΅Π΄Π΅Π»ΡŒΠ½ΠΎΠ΅ количСство Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹Ρ… машин происходит ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ ΠΏΠ΅Ρ€Π΅Π±ΠΎΡ€ всСх Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹Ρ… Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ΠΎΠ² ΠΏΠΎΡ€Ρ‚ΠΎΠ². Для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠ³ΠΎ ΠΏΠΎΡ€Ρ‚Π° происходит поиск Π΅Π³ΠΎ Π² clear.list, waste.list, conn_wait.list, recycle.list. Если ΠΏΠΎΡ€Ρ‚ ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠ΅Π½ Π² любом ΠΈΠ· Π΄Π°Π½Π½Ρ‹Ρ… Ρ„Π°ΠΉΠ»ΠΎΠ², ΠΏΠΎΡ€Ρ‚ считаСтся занятым ΠΈ пропускаСтся. Если ΠΏΠΎΡ€Ρ‚ Π² ΡƒΠΊΠ°Π·Π°Π½Π½Ρ‹Ρ… Ρ„Π°ΠΉΠ»Π°Ρ… Π½Π΅ ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠ΅Π½, ΠΎΠ½ вносится Π² Ρ„Π°ΠΉΠ» recycle.list ΠΈ начинаСтся процСсс создания Π½ΠΎΠ²ΠΎΠΉ Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½ΠΎΠΉ ΠΌΠ°ΡˆΠΈΠ½Ρ‹. Для этого вызываСтся скрипт vm_create.sh ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌΡƒ пСрСдаСтся Π² качСствС ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° Π½ΠΎΠΌΠ΅Ρ€ Β«spice_consoleΒ» ΠΏΠΎΡ€Ρ‚Π° для ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ 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

ΠŸΡ€ΠΎΡ†Π΅ΡΡ создания Π½ΠΎΠ²ΠΎΠΉ Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½ΠΎΠΉ ΠΌΠ°ΡˆΠΈΠ½Ρ‹

Π‘ΠΊΡ€ΠΈΠΏΡ‚ vm_create.sh считываСт ΠΈΠ· ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΎΠ½Π½ΠΎΠ³ΠΎ Ρ„Π°ΠΉΠ»Π° Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ Β«base_hostΒ» ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ опрСдСляСтся ΠΎΠ±Ρ€Π°Π·Π΅Ρ† Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½ΠΎΠΉ ΠΌΠ°ΡˆΠΈΠ½Ρ‹, Π½Π° основС ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ Π±ΡƒΠ΄Π΅Ρ‚ Π΄Π΅Π»Π°Ρ‚ΡŒΡΡ ΠΊΠ»ΠΎΠ½. ΠŸΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚ Π²Ρ‹Π³Ρ€ΡƒΠ·ΠΊΡƒ xml ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ VM ΠΈΠ· Π±Π°Π·Ρ‹ Π³ΠΈΠΏΠ΅Ρ€Π²ΠΈΠ·ΠΎΡ€Π°, ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚ ряд ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΎΠΊ qcow ΠΎΠ±Ρ€Π°Π·Π° диска VM ΠΈ ΠΏΡ€ΠΈ ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎΠΌ ΠΈΡ… Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΠΈ создаСт xml ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΎΠ½Π½Ρ‹ΠΉ Ρ„Π°ΠΉΠ» для Π½ΠΎΠ²ΠΎΠΉ VM ΠΈ Β«linked cloneΒ» ΠΎΠ±Ρ€Π°Π· диска Π½ΠΎΠ²ΠΎΠΉ VM. ПослС Ρ‡Π΅Π³ΠΎ xml ΠΊΠΎΠ½Ρ„ΠΈΠ³ Π½ΠΎΠ²ΠΎΠΉ VM загруТаСтся Π² Π±Π°Π·Ρƒ Π³ΠΈΠΏΠ΅Ρ€Π²ΠΈΠ·ΠΎΡ€Π° ΠΈ VM запускаСтся. ΠŸΠΎΡ€Ρ‚ Β«spice_consoleΒ» пСрСносится ΠΈΠ· recycle.list Π² clear.list. ЗаканчиваСтся исполнСниС vm_create.sh ΠΈ Π·Π°Π²Π΅Ρ€ΡˆΠ°Π΅Ρ‚ΡΡ исполнСниС vm_manager.sh.
ΠŸΡ€ΠΈ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΈ всё начинаСтся с Π½Π°Ρ‡Π°Π»Π°.

Для Π°Π²Π°Ρ€ΠΈΠΉΠ½Ρ‹Ρ… случаСв Π² ΠΊΠΎΠΌΠΏΠ»Π΅ΠΊΡ‚Π΅ Π΅ΡΡ‚ΡŒ скрипт vm_clear.sh ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΏΡ€ΠΈΠ½ΡƒΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΠΏΡ€ΠΎΠ±Π΅Π³Π°Π΅Ρ‚ ΠΏΠΎ всСм VM ΠΈΠ· ΠΏΡƒΠ»Π° ΠΈ удаляСт ΠΈΡ… с ΠΎΠ±Π½ΡƒΠ»Π΅Π½ΠΈΠ΅ΠΌ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ list-ΠΎΠ². Π’Ρ‹Π·ΠΎΠ² Π΅Π³ΠΎ Π½Π° этапС Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ позволяСт Π½Π°Ρ‡Π°Ρ‚ΡŒ Ρ€Π°Π±ΠΎΡ‚Ρƒ (Π½Π΅Π΄ΠΎ)VDI с чистого листа.

/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="

На этом я Ρ…ΠΎΡ‚Π΅Π» Π±Ρ‹ Π·Π°ΠΊΠΎΠ½Ρ‡ΠΈΡ‚ΡŒ ΠΏΠ΅Ρ€Π²ΡƒΡŽ Ρ‡Π°ΡΡ‚ΡŒ своСго рассказа. ИзлоТСнного Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±Ρ‹Ρ‚ΡŒ достаточно для систСмных администраторов, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠΏΡ€ΠΎΠ±ΠΎΠ²Π°Ρ‚ΡŒ Π½Π΅Π΄ΠΎVDI Π² Π΄Π΅Π»Π΅. Если сообщСство Π½Π°ΠΉΠ΄Π΅Ρ‚ Π΄Π°Π½Π½ΡƒΡŽ Ρ‚Π΅ΠΌΡƒ интСрСсной, Π²ΠΎ Π²Ρ‚ΠΎΡ€ΠΎΠΉ части я расскаТу ΠΏΡ€ΠΎ ΠΌΠΎΠ΄ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΡŽ livecd Fedora ΠΈ прСвращСния Π΅Π΅ Π² киоск.

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ: habr.com