{"id":1102,"date":"2017-05-12T00:57:41","date_gmt":"2017-05-11T22:57:41","guid":{"rendered":"http:\/\/miroslaw.borodziuk.eu\/?p=1102"},"modified":"2017-07-03T21:43:16","modified_gmt":"2017-07-03T19:43:16","slug":"wirtualizacja","status":"publish","type":"post","link":"http:\/\/miro.borodziuk.eu\/index.php\/2017\/05\/12\/wirtualizacja\/","title":{"rendered":"KVM"},"content":{"rendered":"<p>Wirtualizacja to uruchamianie wielu niezale\u017cnych wirtualnych komputer\u00f3w na jednym fizycznym komputerze. W procesie wirtualizacji zasoby fizycznego komputera, jego sprz\u0119t taki jak procesory, pami\u0119\u0107, dyski, nap\u0119dy optyczne, karty sieciowe rozdzielane s\u0105 na wiele komputer\u00f3w wirtualnych. Wszystkie komputery wirtualne, ich systemy operacyjne i us\u0142ugi na nich uruchomione dzia\u0142aj\u0105 r\u00f3wnolegle w ca\u0142kowitej izolacji. <!--more-->Komputer fizyczny, kt\u00f3ry jest gospodarzem dla komputer\u00f3w wirtualnych nazywany jest <em>maszyn\u0105 gospodarza <\/em>(<em>host mashine<\/em>). Komputer wirtualny uruchomiony na maszynie hosta nazywany jest <em>wirtualn\u0105 maszyn\u0105<\/em> (<em>virtual machine<\/em>), a system operacyjny zainstalowany na maszynie wirtualnej nazywany jest<em> go\u015bciem<\/em> (<em>guest<\/em>). Oprogramowanie do wirtualizacji, zainstalowane bezpo\u015brednio na fizycznej maszynie okre\u015blane jest mianem <em>hyperwizora<\/em> (<em>hypervisor<\/em>). Przyk\u0142adem takiego hyperwizora jest <em>KVM<\/em> (<em>Kernel-based Virtual Machine<\/em>), kt\u00f3ry jest cz\u0119\u015bci\u0105 j\u0105dra Linuxa i realizuje tzw. pe\u0142n\u0105 wirtualizacj\u0119. KVM przeprowadza mapowanie pomi\u0119dzy fizycznymi procesorami maszyny gospodarza a wirtualnymi procesorami, przydzielonymi wirtualnym maszynami. Zapewnia tym samym sprz\u0119tow\u0105 akceleracj\u0119 dla maszyn wirtualnych i wzrost ich wydajno\u015bci. Infrastruktur\u0119 wirtualizacyjn\u0105 realizuje KVM, a inne oprogramowanie nazywane szybkim emulatorem (Quick Emulator &#8211; QUEMU) robi u\u017cytek z mapowania realizowanego przez KVM. QEMU przechwytuje instrukcje systemu go\u015bcia przeznaczone do wirtualnego procesora i uruchamia je na fizycznym procesorze wykorzystuj\u0105c wspomniane wcze\u015bniej mapowanie. Takie rozwi\u0105zanie powoduje, \u017ce aplikacje uruchamiane na wirtualnych maszynach maj\u0105 taki sami poziom wydajno\u015bci jak aplikacje uruchamiane normalnie na maszynach fizycznych.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\" wp-image-1107 aligncenter\" src=\"http:\/\/miroslaw.borodziuk.eu\/wp-content\/uploads\/qemu-300x163.jpg\" alt=\"\" width=\"379\" height=\"206\" srcset=\"http:\/\/miro.borodziuk.eu\/wp-content\/uploads\/qemu-300x163.jpg 300w, http:\/\/miro.borodziuk.eu\/wp-content\/uploads\/qemu.jpg 387w\" sizes=\"(max-width: 379px) 100vw, 379px\" \/><\/p>\n<p>Trzeba tutaj te\u017c wspomnie\u0107, \u017ce istnieje co\u015b takiego jak <em>parawirtualizacja<\/em>, kt\u00f3ra zapewnia wi\u0119ksz\u0105 wydajno\u015b\u0107 ni\u017c pe\u0142n\u0105 wirtualizacja. Parawirtualizacja wymaga jednak specjalnie zmodyfikowanego systemu operacyjnego go\u015bcia. Ten typ wirtualizacji realizuje XEN.<\/p>\n<p>&nbsp;<\/p>\n<p><span style=\"color: #3366ff;\">Instalacja KVM.<\/span><\/p>\n<p>Sprawdzamy czy maszyna hosta obs\u0142uguje wirtualizacj\u0119:<\/p>\n<pre class=\"\"># lscpu | grep Virtualization  Virtualization: VT-x<\/pre>\n<p>lub<\/p>\n<pre class=\"\"># grep vmx \/proc\/cpuinfo \r\nflags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx rdtscp lm constant_tsc arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc aperfmperf eagerfpu pni pclmulqdq dtes64 monitor ds_cpl<strong> vmx<\/strong> smx est tm2 ssse3 cx16 xtpr pdcm pcid sse4_1 sse4_2 x2apic popcnt tsc_deadline_timer aes xsave avx lahf_lm ida arat epb xsaveopt pln pts dtherm tpr_shadow vnmi flexpriority ept vpid<\/pre>\n<p>Powy\u017csze wyniki wskazuj\u0105, \u017ce maszyna obs\u0142uguje wirtualizacj\u0119.<\/p>\n<p>lub<\/p>\n<pre class=\"lang:sh decode:true\"># egrep -c '(vmx|svm)' \/proc\/cpuinfo 2<\/pre>\n<p>Wynik nie wynosi 0 a wi\u0119c maszyna obs\u0142uguje wirtualizacj\u0119 r\u00f3wnie\u017c wg tej komendy.<\/p>\n<p>Instalacja niezb\u0119dnego oprogramowania:<\/p>\n<pre class=\"lang:sh decode:true\"># yum install kvm libvirt libvirt-daemon-kvm virt-install qemu-kvm<\/pre>\n<p>Je\u017celi b\u0119dziemy chcieli zarz\u0105dza\u0107 wirtualkami w \u015brodowisko graficznym to instalujemy dodatkowo:<\/p>\n<pre class=\"lang:sh decode:true \"># yum install virt-manager xauth dejavu-lgc-sans-fonts<\/pre>\n<p>&nbsp;<\/p>\n<p><span style=\"color: #3366ff;\">Zako\u0144czenie i sprawdzenie instalacji.<\/span><\/p>\n<p>Po instalacji sprawdzamy czy niezb\u0119dne modu\u0142y\u00a0 kvm zosta\u0142y wczytane:<\/p>\n<pre class=\"\"># lsmod | grep kvm<\/pre>\n<p>Komenda nie zwraca \u017cadnego wyniku, modu\u0142y nie zosta\u0142y wczytane a wi\u0119c:<\/p>\n<pre class=\"\"># modprobe kvm \r\n# lsmod | grep kvm \r\nkvm\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 554609\u00a0 0 irqbypass\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 13503\u00a0 1 kvm<\/pre>\n<p>Modu\u0142y zosta\u0142y wczytane.<\/p>\n<p>Sprawdzamy czy demon <em>libvirtd<\/em> dzia\u0142a:<\/p>\n<pre class=\"\"># systemctl status -l libvirtd\r\n\u25cf libvirtd.service - Virtualization daemon\r\n\u00a0\u00a0 Loaded: loaded (\/usr\/lib\/systemd\/system\/libvirtd.service; enabled; vendor preset: enabled)\r\n\u00a0\u00a0 Active: active (running) since wto 2017-05-16 23:27:08 CEST; 17h ago\r\n\u00a0\u00a0\u00a0\u00a0 Docs: man:libvirtd(8)\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 http:\/\/libvirt.org\r\n\u00a0Main PID: 966 (libvirtd)\r\n\u00a0\u00a0 CGroup: \/system.slice\/libvirtd.service\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u251c\u2500 966 \/usr\/sbin\/libvirtd\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u251c\u25002681 \/sbin\/dnsmasq --conf-file=\/var\/lib\/libvirt\/dnsmasq\/default.conf --leasefile-ro --dhcp-script=\/usr\/libexec\/libvirt_leaseshelper\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u2514\u25002682 \/sbin\/dnsmasq --conf-file=\/var\/lib\/libvirt\/dnsmasq\/default.conf --leasefile-ro --dhcp-script=\/usr\/libexec\/libvirt_leaseshelper<\/pre>\n<p>Sprawdzamy czy mo\u017cemy pod\u0142\u0105czy\u0107 si\u0119 do KVM wydaj\u0105 prost\u0105 komend\u0119 o wy\u015bwietlenie listy system\u00f3w:<\/p>\n<pre class=\"lang:sh decode:true\"># virsh -c qemu:\/\/\/system list Identyfikator Nazwa                          \r\nStan ----------------------------------------------------<\/pre>\n<p>Wszystko w porz\u0105dku, mo\u017cemy si\u0119 pod\u0142\u0105czy\u0107.<\/p>\n<p>&nbsp;<\/p>\n<p><span style=\"color: #3366ff;\">Interfejs i switch wirtualnej sieci.<\/span><\/p>\n<p>Switch wirtualnej sieci to softwarowy switch, kt\u00f3ry umo\u017cliwia wirtualnym maszynom komunikacj\u0119 mi\u0119dzy sob\u0105 i z Internetem. Maszyna gospodarza i wirtualne maszyny po uruchomieniu demona <em>libvirtd<\/em> widz\u0105 tego switcha jako interfejs <em>virbr0<\/em>, z domy\u015blnym adresem IP: 192.168.122.1:<\/p>\n<pre class=\"\"># ip addr show virbr0 \r\n4: virbr0: &lt;NO-CARRIER,BROADCAST,MULTICAST,UP&gt; mtu 1500 qdisc noqueue state DOWN qlen 1000 \u00a0\u00a0\u00a0 \r\nlink\/ether 52:54:00:1d:e6:08 brd ff:ff:ff:ff:ff:ff \u00a0\u00a0\u00a0 \r\ninet 192.168.122.1\/24 brd 192.168.122.255 scope global virbr0 \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \r\nvalid_lft forever preferred_lft forever<\/pre>\n<p>Interfejs <em>virbr0<\/em> domy\u015blnie pracuje w trybie NAT z maskarad\u0105 IP. Mo\u017ce te\u017c pracowa\u0107 w trybie izolowanym (<em>isolated<\/em>) i routowanym (<em>routed<\/em>). W trybie izolowanym maszyny wirtualne nie mog\u0105 komunikowa\u0107 si\u0119 ze \u015bwiatem zewn\u0119trznym. W trybie routowanym maszyny komunikuj\u0105 si\u0119 z Internetem bezpo\u015brednio (bez NAT).<\/p>\n<p>&nbsp;<\/p>\n<p><span style=\"color: #3366ff;\">Storage pool.<\/span><\/p>\n<p>Storage pool to obszar na dysku u\u017cywany do dostarczania przestrzeni magazynowej maszynom wirtualnym. Tworzony i zarz\u0105dzany jest przez narz\u0119dzia <em>libvirtool<\/em> i mo\u017ce by\u0107 u\u017cywany przez wiele maszyn wirtualnych w jednym czasie. Storage pool mo\u017ce by\u0107 pojedynczym plikiem w okre\u015blonym katalogu lub mo\u017ce by\u0107 systemem plik\u00f3w na partycji, logicznym woluminie lub ca\u0142ym dysku. Mo\u017ce by\u0107 te\u017c zlokalizowany na zdalnym systemie i by\u0107 dost\u0119pny przez iSCSI lub NFS. Uruchomiony storage pool mo\u017cna podzieli\u0107 na jeden lub wi\u0119cej wolumin\u00f3w i przydzieli\u0107 konkretnym maszynom wirtualnym jako obszar pod dyski.<\/p>\n<p>Red Hat rekomenduje aby u\u017cywa\u0107 katalogu <code>\/var\/lib\/libvirt\/images<\/code> do sk\u0142adowania wirtualnych dysk\u00f3w u\u017cywanych przez wirtualne maszyny. W katalogu tym mo\u017cna r\u00f3wnie\u017c umieszcza\u0107 pliki ISO z systemami, kt\u00f3re b\u0119dziemy instalowa\u0107 na maszynach wirtualnych. Katalog ten jest prekonfigurowany do u\u017cycia z SELinux-em, inna lokalizacja b\u0119dzie wymaga\u0142a specjalnej polityki dla SELinux-a. Je\u017celi chcemy przeznaczy\u0107 pod wirtualizacj\u0119 katalog np.: <code>\/vm<\/code> to:<\/p>\n<pre class=\"lang:sh decode:true\"># semanage fcontext -a -t virt_image_t \"\/vm(\/.*)?\"\r\n# restorecon -R \/v<\/pre>\n<p>&nbsp;<\/p>\n<p><span style=\"color: #3366ff;\">Instalacja wirtualnej maszyny przy u\u017cyciu CLI.<\/span><\/p>\n<p>Do instalacji system\u00f3w na maszynach wirtualnych s\u0142u\u017cy komenda <em>virt-install<\/em>. Wspiera ona instalacje ze \u017ar\u00f3de\u0142 lokalnych i zdalnych (NFS, HTTP, FTP), a tak\u017ce nienadzorowane instalacje <em>kickstart<\/em>.<\/p>\n<p>Spos\u00f3b u\u017cycia komendy z minimalnymi opcjami:<\/p>\n<div class=\"crayon-line\">\n<pre class=\"lang:sh decode:true \"># virt-install --name=centos7 --memory=1024 --vcpus=2 \\ \r\n--disk path=\/var\/lib\/libvirt\/images\/centos.img,size=10 \\ \r\n--location=\/var\/lib\/libvirt\/images\/CentOS-7.0-1406-x86_64-Minimal.iso<\/pre>\n<\/div>\n<table style=\"width: 704px;\">\n<tbody>\n<tr>\n<td style=\"width: 239.483px;\"><span style=\"color: #808080;\"><em>Opcja<\/em><\/span><\/td>\n<td style=\"width: 448.517px;\"><span style=\"color: #808080;\"><em>Opis<\/em><\/span><\/td>\n<\/tr>\n<tr>\n<td style=\"width: 239.483px;\"><span style=\"color: #008000;\"><code>--name<\/code><\/span><\/td>\n<td style=\"width: 448.517px;\">\u00a0Nazwa wirtualnej maszyny.<\/td>\n<\/tr>\n<tr>\n<td style=\"width: 239.483px;\"><span style=\"color: #008000;\"><code>--memory<\/code><\/span><\/td>\n<td style=\"width: 448.517px;\">\u00a0Pami\u0119\u0107 w MiB dla maszyny wirtualnej.<\/td>\n<\/tr>\n<tr>\n<td style=\"width: 239.483px;\"><span style=\"color: #008000;\"><code>--vcpus<\/code><\/span><\/td>\n<td style=\"width: 448.517px;\">Ilo\u015b\u0107 wirtualnych procesor\u00f3w dla vm.<\/td>\n<\/tr>\n<tr>\n<td style=\"width: 239.483px;\"><span style=\"color: #008000;\"><code>--disk path\/name<\/code><\/span><\/td>\n<td style=\"width: 448.517px;\">\u015acie\u017cka do magazynu dla obrazu vm. Mo\u017ce by\u0107 tak\u017ce nazwa puli lub woluminu.<\/td>\n<\/tr>\n<tr>\n<td style=\"width: 239.483px;\"><span style=\"color: #008000;\"><code>--location<\/code><\/span><\/td>\n<td style=\"width: 448.517px;\">Po\u0142o\u017cenie lokalne lub zdalne obrazu\u00a0 p\u0142yty instalacyjnej z systemem.<\/td>\n<\/tr>\n<tr>\n<td style=\"width: 239.483px;\"><span style=\"color: #008000;\"><code>\u00a0-x<\/code><\/span><\/td>\n<td style=\"width: 448.517px;\">Dodatkowe argumenty do przekazania instalatorowi (Anaconda), np. aby poda\u0107 po\u0142o\u017cenie pliku konfiguracyjnego <em>kickstart<\/em> je\u017celi jest taka potrzeba.<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>Pe\u0142n\u0105 list\u0119 opcji mo\u017cna uzyska\u0107 z manuala systemowego.<\/p>\n<p>Warto skorzysta\u0107 tak\u017ce z opcji <em>&#8211;os-variant<\/em>. List\u0119 system\u00f3w operacyjnych obs\u0142ugiwanych przez <em>virt-install<\/em> mo\u017cemy zobaczy\u0107 stosuj\u0105c komend\u0119:<\/p>\n<pre># osinfo-query os<\/pre>\n<p>&nbsp;<\/p>\n<p><span style=\"color: #3366ff;\">Zarz\u0105dzanie i monitorowanie wirtualnych maszyn przez CLI.<\/span><\/p>\n<p><em>virsh<\/em> to komenda, kt\u00f3ra s\u0142u\u017cy do zarz\u0105dzania vm przez CLI<\/p>\n<pre class=\"\"># virsh\r\nWitaj w virsh, interaktywnym terminalu wirtualizacji.\r\n\r\nNale\u017cy poda\u0107:\u00a0 \"help\", aby uzyska\u0107 pomoc o poleceniach\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \"quit\", aby zako\u0144czy\u0107\r\n\r\nvirsh # list --all\r\n\u00a0Identyfikator Nazwa\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 Stan\r\n----------------------------------------------------\r\n\u00a0\u00a0\u00a0\u00a0\u00a0 centos7\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 wy\u0142\u0105czone<\/pre>\n<p>List\u0119 wszystkich opcji znajdziemy w manualu systemowym.<\/p>\n<p>Aby pod\u0142\u0105czy\u0107 si\u0119 w \u015brodowisku tekstowym do wymienionej wy\u017cej wirtualnej maszyny o nazwie <em>&#8220;centos7&#8221;<\/em> mo\u017cna skorzysta\u0107 z opcji <em>console<\/em> komendy <em>virsh<\/em>:<\/p>\n<pre class=\"\"># virsh console sander-vm1\r\nConnected to domain sander-vm1\r\nEscape character is ^]\r\n\r\nCentOS Linux 7 (Core)\r\nKernel 3.10.0-123.el7.x86_64 on an x86_64\r\n\r\nserver2 login:<\/pre>\n<p>&nbsp;<\/p>\n<p><span style=\"color: #3366ff;\">Instalacja i zarz\u0105dzanie kvm w \u015brodowisku graficznym.<\/span><\/p>\n<p>Najpro\u015bciej wirtualnymi maszynami w \u015brodowisku KVM zarz\u0105dza\u0107 korzystaj\u0105c z aplikacji <em>virt-manager.<\/em><\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\" wp-image-1165 aligncenter\" src=\"http:\/\/miroslaw.borodziuk.eu\/wp-content\/uploads\/virsh-1-265x300.jpg\" alt=\"\" width=\"496\" height=\"562\" srcset=\"http:\/\/miro.borodziuk.eu\/wp-content\/uploads\/virsh-1-265x300.jpg 265w, http:\/\/miro.borodziuk.eu\/wp-content\/uploads\/virsh-1.jpg 540w\" sizes=\"(max-width: 496px) 100vw, 496px\" \/><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Wirtualizacja to uruchamianie wielu niezale\u017cnych wirtualnych komputer\u00f3w na jednym fizycznym komputerze. W procesie wirtualizacji zasoby fizycznego komputera, jego sprz\u0119t taki jak procesory, pami\u0119\u0107, dyski, nap\u0119dy optyczne, karty sieciowe rozdzielane s\u0105 na wiele komputer\u00f3w wirtualnych. Wszystkie komputery wirtualne, ich systemy operacyjne i us\u0142ugi na nich uruchomione dzia\u0142aj\u0105 r\u00f3wnolegle w ca\u0142kowitej izolacji.<\/p>\n","protected":false},"author":1,"featured_media":1103,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[45],"tags":[],"_links":{"self":[{"href":"http:\/\/miro.borodziuk.eu\/index.php\/wp-json\/wp\/v2\/posts\/1102"}],"collection":[{"href":"http:\/\/miro.borodziuk.eu\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/miro.borodziuk.eu\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/miro.borodziuk.eu\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/miro.borodziuk.eu\/index.php\/wp-json\/wp\/v2\/comments?post=1102"}],"version-history":[{"count":44,"href":"http:\/\/miro.borodziuk.eu\/index.php\/wp-json\/wp\/v2\/posts\/1102\/revisions"}],"predecessor-version":[{"id":1477,"href":"http:\/\/miro.borodziuk.eu\/index.php\/wp-json\/wp\/v2\/posts\/1102\/revisions\/1477"}],"wp:featuredmedia":[{"embeddable":true,"href":"http:\/\/miro.borodziuk.eu\/index.php\/wp-json\/wp\/v2\/media\/1103"}],"wp:attachment":[{"href":"http:\/\/miro.borodziuk.eu\/index.php\/wp-json\/wp\/v2\/media?parent=1102"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/miro.borodziuk.eu\/index.php\/wp-json\/wp\/v2\/categories?post=1102"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/miro.borodziuk.eu\/index.php\/wp-json\/wp\/v2\/tags?post=1102"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}