درباره bhyve

bhyve یک hypervisor مجانی برای FreeBSD و مشتقات آن نظیر PC-BSD و nanoBSD است

bhyve چیست؟

bhyve یا BSD Hypervisor یک hypervisor (مدیر ماشین‌های مجازی) رایگان است که به صورت فعال برای سیستم عامل FreeBSD و استفاده از ویژگی‌های cpu های امروزی نظیر ‎EPT (Extended Page Table)‎ توسعه می یابد.

bhyve روی چه سخت افزاری اجرا می‌شود؟

bhyve در حال حاضر از پردازنده های Intel همراه با EPT پشتیبانی می کند و پشتیبانی از پردازنده های AMD نیز در حال گذراندن مراحل تست است.

نکته:
شما می توانید پردازنده هایی که با EPT سازگاری دارند را از ark.intel.com پیدا کنید. اما اکثر پردازنده های core i3 i5 i7 و پردازنده های سری Xeon از این ویژگی پشتیبانی می کنند.
نکته:
اگر در خروجی دستور dmesg در ویژگی‌های پردازنده شما عبارت (POPCNT ( POP Count  بود پردازنده شما ویژگی EPT را دارد

bhyve چگونه کار می کند؟

در اینجا با یک تصویر مروری بر چگونگی کارکرد bhyve می کنیم:

Bhyve-diagram.jpg

چه نسخه هایی از FreeBSD از bhyve پشتیبانی می کنند؟

bhyve می تواند بر روی FreeBSD9.0 ساخته و اجرا شود اما محل توسعه فعال آن ۱۰-CURRENT می باشد.البته در نظر داشته باشید که اجرای اساسی‌اش بروی سری ۹ و ۸ سیستم عامل FreeBSD امکان‌پذیر است.

bhyve از چه سییستم عامل هایی به عنوان guest پشتیبانی میکند؟

به عنوان یک hypervisor رایگان bhyve در حال حاضر می تواند سیستم عامل FreeBSD به عنوان guest روی host خود boot کند.

نکته:
طیف کم سیستم عامل های قابل پشتیبانی به عنوان guest بخاطر عدم وجود راه انداز های سخت افزاری در حال حاضر می باشد.

bhyve از چه نرم‌افزار هایی تشکیل شده است؟

bhyve از یک ماژول قابل بارگذاری در کرنل با نام vmm.ko و کتابخانه‌های libvmmapi و ابزارهای کنترلی bhyveload و bhyvectl که حجم آن‌ها در حدود ۲۵۰K است تشکیل شده است.

نصب bhyve

نکته:
از آنجایی که bhyve هم اکنون در حالت توسعه می باشد و نسخه پایدار ندارد ممکن است ویژگی های بسیاری در آینده به آن اضافه شود این آموزش در آینده دست خوش تغییراتی خواهد بود.

برای اینکه bhyve را در سیسیتم های قدیمی نصب کنید باید کرنل را مجدد کامپایل کنید. اما در اکثر سیستم‌های امروزی ماژول های مربوطه به صورت پیش فرض وجود دارند اما بارگذاری نشده‌اند. برای این کار شما ابتدا فایل /boot/loader.conf را ویرایش کرده و خطوط زیر را به آن اضافه می کنیم

vmm_load="YES"
if_tap_load="YES"
bridgestp_load="YES"
if_bridge_load="YES"
bridgestp_load="YES"

آماده سازی هارد دیسک مجازی

بعد از این کار باید یک فایل برای استفاده به عنوان hard disk در ماشین مجازی بسازیم . برای این منظور دستور زیر را اجرا می کنیم

truncate -s 80G disk.img
نکته:
شما می توانید بر حسب نیازتان سایز فایل را تغییر دهید.

بعد از ساخته شدن فایل باید آن را به عنوان یک md disk در بیاوریم

mdconfig disk.img

و بعد باید آن را آماده کنیم تا بتوانیم آن را در slice ها به کار ببریم

fdisk -BI md0
نکته:
احتمالاً شما با یک اخطار در حین اجرای دستور بالا مانند زیر مواجه می شوید که می توانید از آن بگذرید
******* Working on device /dev/md0 *******
fdisk: invalid fdisk partition table found

بعد از اتمام این مرحله md disk را باید به عنوان یک استاندارد لیبل و بوت کد در slice1 سیستم بنویسیم.

bsdlabel -wB /dev/md0s1

و بعد باید یک فایل سیستم در slice 1a بسازیم

newfs -U /dev/md0s1a

بعد از ساختن فایل سیستم آن را در مسیر /mnt مانت می کنیم

mount /dev/md0s1a /mnt

مرحله ساختن هارد دیسک مجازی و ساخت سیستم فایل در اینجا به پایان می رسد و باید سیستم عامل جدیدمان را بر روی فایل سیستم بسازیم و نصب کنیم.

نکته:
از آنجایی که bhyve در حال حاضر فقط از FreeBSD به عنوان guest پشتیبانی می کنید ما یک FreeBSD در فایل سیستمی که ساختیم نصب می کنیم.

کامپایل و نصب سیستم عامل مجازی

برای این کار به مسیر /usr/src می‌رویم و دستورات زیر را اجرا می کنیم

make installworld DESTDIR=/mnt
make installkernel DESTDIR=/mnt
make distribution DESTDIR=/mnt

بعد از اتمام کار کامپایل و نصب سیستم عامل مجازی ما باید fstab ماشین خود را با استفاده از /dev/vtbd0s1a ویرایش کنیم.

نکته:
/dev/vtbd0s1a همان slice است که سیستم عامل مجازی در آن نصب است
echo "/dev/vtbd0s1a / ufs rw 1 1" > /mnt/etc/fstab

سپس باید کنسول سیستم عامل مجازی خود را تنظیم کنیم

echo 'console "/usr/libexec/getty std.9600" vt100 on secure' > /mnt/etc/ttys
echo 'console="userboot"' > /mnt/boot/loader.conf

در آخرین قسمت این مرحله باید به کرنل ماشین مجازیمان کمک کنیم تا متوجه شود بر روی ماشین مجازی در حال اجراست. برای این منظور فایل /mnt/etc/sysctl.conf را ویرایش می کنیم و مقادیر زیر را به آن اضافه می کنیم

smbios.bios.vendor="Bochs"
Avoid clock drift
kern.timecounter.hardware="TSC"
kern.timecounter.invariant_tsc="1"
PCI pass-through support as it caused hangs
hw.pci.enable_msix="0"
hw.pci.honor_msi_blacklist="0"

خوب مرحله نصب سیستم عامل هم به پایان رسید .

ابتدا فایل سیستم‌هایی که mount کرده بودیم را unmount می کنیم

umount /mnt

و بعد md disk را به اصطلاحی detach می کنیم

mdconfig -d -u 0
نکته:
برای اطمینان از اینکه به درستی عمل کرده‌اید یا نه از دستور زیر استفاده کنید تا md disk ها را لیست کنید.
mdconfig -l

تنظیمات کارت شبکه برای استفاده ماشین مجازی

ابتدا ماژول هایی که در ابتدا معرفی کردیم را بارگذاری می کنیم

kldload vmm
kldload if_tap
kldload bridgestp
kldload if_bridge
نکته:
شما همچنین می توانید سیستم را reboot کنید. ماژول ها به صورت خودکار بارگذاری می شوند.

برای اینکه شبکه ماشین‌های مجازیمان بدون مشکل کار کند باید یک اینترفیس tap و bridge برای ارتباط با اینترفیس ماشین مجازیمان بسازیم.برای این منظور دستورات زیر را اجرا می کنیم

ifconfig tap0 create up
ifconfig bridge0 create up
ifconfig bridge0 addm tap0 addm re0 up
نکته:
بعد از هربار restart کردن ماشین مجازی امکان دارد مشکلاتی در شبکه ماشین مجازی به وجود آید که با اجرای دستورات زیر برطرف می‌شود
ifconfig tap0 destroy
ifconfig bridge0

مرحله آماده سازی شبکه ماشین مجازی نیز به پایان رسید. حال باید ماشین را start کنیم.

Start کردن ماشین مجازی

برای شروع به کار کردن ماشین مجازی از دستور زیر استفاده می کنیم

sudo bhyveload -d /path/to/disk.img -m 256 vmname && sudo bhyve -c 1 -a -A -m 256 -I -H -g 0 -s 0:0,hostbridge -s 2:0,virtio-blk,/path/to/disk.img -s 1:0,virtio-net,tap0 -S 31,uart,stdio vmname
نکته:
ممکن است بسته به تنظیماتی که شما انجام داده‌اید جزییات دستور متفاوت باشد. اما قالب کلی همان است.

برای خاموش کردن ماشین مجازی از دستور زیر استفاده می کنیم

bhyvectl --vm=vmname –destroy