شاید برایتان این سؤال پیش آمده باشد که چرا در شماره قبل اینقدر سریع از آنچه گفتم گذشتم و خیلی از مسایل گفته نشد. KVM به عنوان یکی از اساسیترین Hypervisor های زیر بار و مخصوصاً اینکه OpenStack در حال استفاده از آن میباشد، نیاز است بهتر از این گفته شود. هر چند شاید نتوانم آنقدر که نیاز خوانندگان سایتم است را برآورده کنم، اما سرنخی خوبی به آنها بدهم.
یکی از مهمترین و اساسیترین قسمت هر Hypervisor که بنا به نوع Hypervisor پیکربندی میشود قسمت Virtual Networking میباشد. پیکربندی آن برایم مهم نبود. اینکه خوانندگانم دید مناسبی روی آن پیدا کنند، بیشتر مد نظرم بود. هر چند به پیکربندی آن نیز کمی پرداختهام.
نکته: اگر بر روی سیستم خود virt-manager را دارید درجا به دلایل زیر پاک کنید:
- این یک سیستم GUI است و در سرور GUI معنی ندارد.
- شاید بگویید برای آموزش خوب باشد، ولی این شما را از یادگیری پارامترهای virsh و سایر دستورات منحرف میکند.
نکته: برای بهتر یادگیری، bash_complete دستور virsh را دانلود کنید و از آن استفاده نمایید.(در صفحه اول گوگل پیدا میشود.) مطمئناً باید برای شلهای دیگر نیز موجود باشد. به طوری که :
1 2 3 |
# virsh net- net-autostart net-define net-dhcp-leases net-edit net-info net-name net-undefine net-uuid net-create net-destroy net-dumpxml net-event net-list net-start net-update |
شروع کار با KVM (قسمت اول)
۱. پایههای Virtual Networking در KVM
اصولاً در چنین فضایی از یک Virtual Network Switch استفاده میشود. به شکل زیر توجه کنید:
نکته: با فرمان زیر میتوان هر چه interface از نوع bridge موجود است را دید، (البته باید شبکه شما start خورده باشد):
1 2 3 |
# ip l show type bridge 26: ivbr0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP mode DEFAULT group default link/ether 18:03:73:60:b4:4e brd ff:ff:ff:ff:ff:ff |
KVM برای مجازیسازی شبکه، از سه سناریوی زیر استفاده میکند:
- routed
- isolated
- nat
نکته: این ۳ سناریو در حالت عادی خام هستند و شما باید برای بهینه کردن آنها توپولوژی خود را سوار بر این ۳ حالت کنید ولی در نهایت یکی از این ۳ حالت خواهد شد.
Isolated ترافیک ندارد و برای اهداف امنیتی طراحی گردیده است. اما چه nat ویا routed هر دو میتوانند ترافیک به اشتراک بگذارند. این به نوع توپولوژی شما بستگی دارد.
نکته: از این به بعد، از کلمه Host که استفاده میشود برای کامپیوتری استفاده میشود که Hypervisor بر روی آن نصب است.
۱.۱ دستورات *-virsh net
قبل از انجام هر کاری باید یک شبکه را ایجاد نماییم. برای اینکار دو فرمان net-define و net-create وجود دارند.
نکته: net-create تازمانی از شبکه شما حمایت میکند که Daemon شما restart نشود. اما در عوض net-define به صورت Permanent یک شبکه ایجاد میکند.
فرمان net-list شبکههای شما را لیست میکند. به فرمان زیر دقت نمایید:
1 2 3 4 |
# virsh net-list --all Name State Autostart Persistent ---------------------------------------------------------- default active no yes |
لیست کل شبکهها اعم از فعال و غیر فعال را لیست میکند.
نکته: همه فایلهای پیکربندی در KVM بر اساس XML میباشد.
قبل از هر کاری شما باید XML فایل برای شبکه خود در آدرس /etc/libvirt/qemu/networks/ ایجاد نمایید. بدین منظور میتوانید از شبکه default استفاده نمایید:
1 |
# virsh net-dumpxml default > /etc/libvirt/qemu/networks/myintranet.xml |
حالا باید آن را بر مبنای شبکه خود ویرایش نماید. به متغیرهای زیر در XML فایل خود توجه کنید:
- تگ UUID
- صفت mode در تگ forward
- صفت name در تگbridge
- تگ mac
- تگ name
نکته: به هیچ عنوان فایلی را دستی تغییر ندهید. بلکه باید با انواع edit که virsh برایتان فراهم دیده کار کنید.
به عنوان مثال :
1 |
virsh net-edit YOUR_NETWORK_NAME |
حتماً متغیرهای بالا را قبل از start سفارشی کنید.
نکته: برای ایجاد یک UUID میتوانید از دستور uuidgen استفاده نمایید.
نکته: تگ uuid ، تگ name ، تگ mac و صفت name در تگbridge باید یکتا باشند.
حال شبکه را تعریف مینماییم:
1 2 |
# virsh net-define /etc/libvirt/qemu/networks/myintranet.xml Network myintranet defined from /etc/libvirt/qemu/networks/myintranet.xml |
حال با فرمان virsh net-list –all میتوان اسامی شبکه مورد نظر را دید.
1 2 3 4 5 |
# virsh net-list --all Name State Autostart Persistent ---------------------------------------------------------- default active no yes myintranet active yes yes |
قبل از تعریف شبکه با بکار بردن فرمان زیر چنین error ی دیده میشد:
1 2 3 |
# virsh net-info myinteranet error: failed to get network 'myinteranet' error: Network not found: no network with matching name 'myinteranet' |
اما حالا چنین دیده میشود:
1 2 3 4 5 6 7 |
# virsh net-info myintranet Name: myintranet UUID: 465ce6cb-0a69-4f89-92ba-629349741e73 Active: no Persistent: yes Autostart: no Bridge: ivbr0 |
با فرمان زیر میتوان یک شبکه را auto-start کرد:
1 2 |
# virsh net-autostart myintranet Network myintranet marked as autostarted |
و حالا خروجی فرمان net-info تغییر میکند:
1 2 3 4 5 6 7 |
# virsh net-info myintranet Name: myintranet UUID: 465ce6cb-0a69-4f89-92ba-629349741e73 Active: no Persistent: yes Autostart: yes Bridge: ivbr0 |
برای stop کردن یک شبکه از فرمان زیر استفاده میکنیم:
1 2 |
# virsh net-destroy myintranet Network myintranet destroyed |
باید مراحلی را با دقت پشت سر گذارید، بدین منظور با چند دستور باید آشنا گردید.
1 2 3 4 5 6 |
# ip link set dev DEVIF down # ip link set dev DEVIF up # brctl show # brctl delbr DEVIF # ip l # ip a |
کمی توضیح در مورد فرمانهای بالا :
دو خط اول یک interface شبکه را به صورت state down یا state up در میآورد. خط بعد فرمانی است که با Bridge ها کار میکند و پارامتر show کل bridge ها و مشخصات آنها را نمایش میدهد. کاربرد خط بعد که در آن یک bridge را delete میکنید، یک پیشزمینه دارد، آنهم اینکه در ابتدا باید آن را با خطوط بالا down نمایید تا بتوانید آن را پاک کنید. ip l و ip a که در شماره های پیشین برایشان مقاله نوشتهام.(رجوع شود به مقالات iproute2)
نکته: فرمان brctl در بسته bridge-utils قرار دارد.
باید خطوطی را در etc/network/interfaces/ اضافه نمایید که شامل مشخصاتIP address ها و bridge میباشد.
نکته: حتماً باید interface شما در این فایل با فایل داخل /etc/libvirt/qemu/networks/ مطابقت داشته باشد.
۲. شروع به کار
در ابتدا :
1 2 3 |
# systemctl stop network-manager.service # systemctl disable network-manager.service # ifdown eth0 |
و مشخصات زیر را در etc/network/interfaces/ قرار میدهیم:
1 2 3 4 5 6 7 8 9 10 11 |
auto ivbr0 iface ivbr0 inet static address 192.168.1.4 netmask 255.255.255.0 network 192.168.1.0 broadcast 192.168.1.255 gateway 192.168.1.1 bridge_ports eth0 bridge_stp on bridge_maxwait 0 bridge_fd 0 |
و سپس :
با virsh net-edit باید فایل xml شبکه خود را بدین صورت دربیاورید:
1 2 3 4 5 6 |
<network> <name>myintranet</name> <uuid>465ce6cb-0a69-4f89-92ba-629349741e73</uuid> <forward mode='bridge'/> <bridge name='ivbr1'/> </network> |
و سپس:
1 2 |
# systemctl restart networking.service #virsh net-start myintranet |
ممکن است با ایراد برخورد کنید ولی با ping امتحان کنید به جای تأسف بر ایرادات!
حال اگر با ip link ببینید اینترفیس bridge شما up شده است.
نکته: اگر اقدام به پیادهسازی هر سنازیویی مثل nat ، isolated و یا غیره کردید ، باید دو کار اساسی را انجام دهید:
- virsh net-edit شبکه خود بر اساس سناریو
- ویرایشetc/network/interfaces/ خود بر اساس سناریو
این سناریو است که همه چی را تعیین میکند.
نکته: هنوز یک مثال واقعی برای setup یک VM نزدهایم.