برخی از دوستان با سیاستهای pahlevanzadeh.net از نزدیک آشنا هستند و حتی انتقادات و پیشنهاداتی هم دارند. قبلاً اشاره کرده بودم که دو سری مطالب پایه FreeBSD و امنیت به سایت اضافه خواهد شد و این امر را با انجام رساندم. اما قصد بر این است تا مطالبی بر Virtualization نیز به سایت اضافه گردد. البته در ابتدا به مباحث پایه و مفاهیم می پردازیم تا بعداً سناریوهای قوی را تشریح کنیم.
نکته: KVM یک paravirtualization میباشد.
نکته: اما در این مطلب فعلاً به داخل KVM کاری نداریم و به مفاهیم کلیتری میپردازیم.
نکته: KVM ، Xen و VMWare ESXi هر کدام جایگاه خود را دارند که بعداً مطالبی را خواهیم داشت.
۱. نصب KVM
اگر تا بحال apache را نصب کردهاید، همه چیز تمیز و سرجای خود است، و اگر اولین بار است که با KVM برخورد میکنید نصب آن برایتان سؤالاتی را ایجاد میکند:
-
به چند نرمافزار نیاز دارم؟
-
به چند interface نیاز دارم؟
-
در هر توزیع با مشکلاتی این چنینی همراه هستم؟
-
در هر سیستمعامل پشتیبانی میشوم؟
جواب سئوال شما در یک جمله خلاصه میشود: KVM آسانترین Hypervisor موجود است. (البته سمت سرور)
در خیلی از مطالب همیشه گرفتن Help را اول توضیح میدهم که ترجیح میدهم تا در مورد KVM این چنین نباشد و در آخر این موضوع مطرح شود. (رجوع شود به iproute2)
کافیست بستههای زیر را نصب نمایید که کلی dependency را نصب مینماید:
1 |
# apt-get install qemu-kvm libvirt-bin |
شاید فکر کنید همین دو بسته بالا کافی باشد(البته با خود کمی dependency دارند.)، اما برای نصب یک ISO یا یک سیستم عامل به فرمان virt-install نیاز مندیم که در بسته virtinst موجود میباشد. پس :
1 |
#apt-get install virtinst |
نکته: اگر تا بحال در یک Hypervisor سیستمعاملی را نصب و یا با آن بوت شدهاید، نیازی به توضیح مفاهیم ندارید. و ما هم اساس را بر همین گذاشتیم که شما یک sysadmin هستید.
نکته: قبل از اقدام به انجام هر کاری تفاوت libvirt و خود KVM را بهتر است توضیح دهیم. خود KVM بدنه اصلی Hypervisor را تشکیل میدهد، و libvirt یک مجموعه دستورات است که با هر Hypervisor ی کار میکند و برای سادگی کار ساخته شدهاند. این مجموعه دستورات را در یک مطلب دیگر البته نه همه آن را زیرا تقریباً یک کتاب است. بلکه دستورات واجب آن را توضیح میدهیم.
به Tshoot زیر دقت نمایید:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
# grep VIRTIO /boot/config-`uname -r` CONFIG_NET_9P_VIRTIO=m CONFIG_VIRTIO_BLK=m CONFIG_SCSI_VIRTIO=m CONFIG_VIRTIO_NET=m CONFIG_VIRTIO_CONSOLE=m CONFIG_HW_RANDOM_VIRTIO=m CONFIG_DRM_VIRTIO_GPU=m CONFIG_VIRTIO=m CONFIG_VIRTIO_PCI=m CONFIG_VIRTIO_PCI_LEGACY=y CONFIG_VIRTIO_BALLOON=m CONFIG_VIRTIO_INPUT=m # CONFIG_VIRTIO_MMIO is not set |
نکته: فایلی که در دایرکتوری /boot/ دیدید، همان proc/config.gz/ است.
1 2 3 |
# lsmod |grep -i kvm kvm_intel 163840 3 kvm 495616 1 kvm_intel |
و
1 |
# lsmod |grep -i virtio |
اگر در دومی نتیجهای نگرفتید کافیست modprope کنید:
1 2 3 |
# modprobe virtio # lsmod |grep -i virtio virtio 16384 0 |
بعد از خروجی های بالا باید یک تست دیگر نیز انجام شود:
1 2 3 4 5 6 7 8 9 |
# grep -E 'vmx|vms' /proc/cpuinfo flags : 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 vmx est tm2 ssse3 cx16 xtpr pdcm pcid sse4_1 sse4_2 x2apic popcnt tsc_deadline_timer aes xsave avx lahf_lm ida arat epb pln pts dtherm tpr_shadow vnmi flexpriority ept vpid xsaveopt flags : 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 vmx est tm2 ssse3 cx16 xtpr pdcm pcid sse4_1 sse4_2 x2apic popcnt tsc_deadline_timer aes xsave avx lahf_lm ida arat epb pln pts dtherm tpr_shadow vnmi flexpriority ept vpid xsaveopt flags : 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 vmx est tm2 ssse3 cx16 xtpr pdcm pcid sse4_1 sse4_2 x2apic popcnt tsc_deadline_timer aes xsave avx lahf_lm ida arat epb pln pts dtherm tpr_shadow vnmi flexpriority ept vpid xsaveopt flags : 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 vmx est tm2 ssse3 cx16 xtpr pdcm pcid sse4_1 sse4_2 x2apic popcnt tsc_deadline_timer aes xsave avx lahf_lm ida arat epb pln pts dtherm tpr_shadow vnmi flexpriority ept vpid xsaveopt flags : 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 vmx est tm2 ssse3 cx16 xtpr pdcm pcid sse4_1 sse4_2 x2apic popcnt tsc_deadline_timer aes xsave avx lahf_lm ida arat epb pln pts dtherm tpr_shadow vnmi flexpriority ept vpid xsaveopt flags : 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 vmx est tm2 ssse3 cx16 xtpr pdcm pcid sse4_1 sse4_2 x2apic popcnt tsc_deadline_timer aes xsave avx lahf_lm ida arat epb pln pts dtherm tpr_shadow vnmi flexpriority ept vpid xsaveopt flags : 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 vmx est tm2 ssse3 cx16 xtpr pdcm pcid sse4_1 sse4_2 x2apic popcnt tsc_deadline_timer aes xsave avx lahf_lm ida arat epb pln pts dtherm tpr_shadow vnmi flexpriority ept vpid xsaveopt flags : 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 vmx est tm2 ssse3 cx16 xtpr pdcm pcid sse4_1 sse4_2 x2apic popcnt tsc_deadline_timer aes xsave avx lahf_lm ida arat epb pln pts dtherm tpr_shadow vnmi flexpriority ept vpid xsaveopt |
پس همه چیز درست است و به مرحله بعد میرویم.
۲. نصب یک سیستمعامل
ترجیج دادم تا با کمی برخورد به ایرادات اولیه کار را پیش ببریم تا با دستورات بیشتری آشنا شویم. این چند حسن داشت:
-
درک بیشتر فرامین
-
نوع به کار گیری فرامین
-
عدم برخورد کاربر در آینده با چنین مشکلاتی
-
سرنخهایی از بعضی از مضامین مهم
به فرمان ذیل توجه فرمایید:
1 2 3 4 5 6 7 8 9 |
# virt-install --connect qemu:///system \ --description "Test of live boot" \ --ram=1024 \ --vcpus=1 \ -c /var/lib/libvirt/boot/systemrescuecd-x86-4.5.2.iso \ --vnc \ --disk path=/home/mohsen/boot.img,size=10 \ --os-type linux \ --network network:default ; |
با این فرمان به عبارت زیر برمیخوریم:
1 2 3 4 |
/usr/share/virt-manager/virtinst/osdict.py:26: PyGIWarning: Libosinfo was imported without specifying a version first. Use gi.require_version('Libosinfo', '1.0') before import to ensure that the right version gets loaded. from gi.repository import Libosinfo as libosinfo ERROR --name is required |
که باید به فرمان virt-install یک نام را که سمبل guest ما میشود اضافه نمایید:
1 2 3 4 5 6 7 8 9 10 |
# virt-install --connect qemu:///system \ ---name boot-rescue \ --description "Test of live boot" \ --ram=1024 \ --vcpus=1 \ -c /var/lib/libvirt/boot/systemrescuecd-x86-4.5.2.iso \ --vnc \ --disk path=/home/mohsen/boot.img,size=10 \ --os-type linux \ --network network:default ; |
به دلیل اینکه هیچ گونه شبکهای پیکربندی نشده است شما ایرادی میگیرید مبتنی بر اینکه network:default موجود نیست. برای رفع این مشکل میتوانید از فرمان زیر استفاده نمایید:
1 |
# virsh net-start default |
حالا اگر لیست بگیرید این شبکه به لیست شما اضافه شده است.
1 2 3 4 |
# virsh net-list Name State Autostart Persistent ---------------------------------------------------------- default active no yes |
نکته : بعداً به صورت مفصل در مورد پیکربندی یک bridge صحبت میشود.
همانطور که در تصویر هویداست، توزیع systemrescue را به صورت virtual بوت کردیم.
نکته: مثال بالا صرفاً یک مثال غیر کاربردی بود. که دز شماره بعدی به صورت کاربردی مثالی میزنیم.
نکته: در شماره بعدی به مفاهیم شبکهسازی مجازی، نصب واقعی یک سیستم عامل،مدیرت یک domain و غیره خواهیم پرداخت.