نحوه نصب و تنظیم KVM در سرورهای با سیستم‌عامل CentOS 7 یا RHEL چگونه است؟ چگونه می‌توان ابزار KVM را در CentOS 7 نصب و از ایمیج‌های ابری برای نصب ماشین مجازی میهمان استفاده کرد؟ اینها سؤالاتی است که در این مطلب به دنبال پاسخ آنها هستیم. با ما همراه باشید.

ماشین مجازی مبتنی بر هسته یا KVM یک نرم‌افزار شبیه‌سازی برای CentOS یا RHEL 7 است. KVM سرور شما را به یک مرکز سرپرستی تبدیل می‌کند. در این مطلب به شما نحوه نصب و مدیریت یک فضای شبیه‌سازی‌شده را با کمک ابزار KVM در لینوکس CentOS 7 یا RHEL 7 نشان می‌دهیم. همچنین روش نصب  و مدیریت ماشین‌های مجازی (VM) در یک سرور فیزیکی با استفاده از CLI توضیح داده خواهد شد. حتماً دقت کنید که تکنولوژی شبیه‌سازی یا VT در بایوس سرور شما فعال باشد. در همین حال، می‌توانید با استفاده از فرمان زیر از پشتیبانی CPU اینتل VT و شبیه‌سازی AMD-V مطمئن شوید.

[php]

$ lscpu | grep Virtualization

Virtualization: VT-x

[/php]

مراحل زیر را برای نصب ابزار KVM در سرور CentOS 7/RHEL 7 دنبال کنید.

گام ۱) نصب ابزار KVM

فرمان yum زیر را تایپ کنید.

[php]

# yum install qemu-kvm libvirt libvirt-python libguestfs-tools virt-install

[/php]

نصب ابزار KVM در سرور لینوکس CentOS 7/RHEL 7

نصب ابزار KVM در سرور لینوکس CentOS 7/RHEL 7

سرویس libvirtd را راه‌اندازی نمایید.

[php]

# systemctl enable libvirtd

# systemctl start libvirtd

[/php]

گام ۲) تأیید نصب KVM

با کمک فرمان‌های lsmod و grep از بارگذاری ماژول KVM مطمئن شوید.

[php]

# lsmod | grep -i kvm

[/php]

گام ۳) تنظیم شبکه بریج

شبکه بریج مبتنی بر dhcpd به صورت پیش‌فرض توسط libvirtd تنظیم می‌شود. این موضوع را می‌توانید با استفاده از فرمان‌های زیر بررسی کنید.

[php]

# brctl show

# virsh net-list

[/php]

شبکه پیش‌فرض KVM

شبکه پیش‌فرض KVM

تمام ماشین‌های مجازی (از نوع میهمان) تنها دسترسی شبکه به دیگر VM ها در همان سرور را دارند. در اینجا، یک شبکه خصوصی 192.168.122.0/24 برای شما ساخته می‌شود. آن را بررسی کنید.

[php]

# virsh net-dumpxml default

[/php]

اگر بخواهید که ماشین‌های مجازی شما برای دیگر سرور‌ها در شبکه LAN در دسترس باشند، باید یک شبکه بریج در سرور متصل به LAN تنظیم کنید. برای این منظور، فایل تنظیمات nic از جمله ifcfg-enp3s0 یا em1 را بروزرسانی کنید.

[php]

# vi /etc/sysconfig/network-scripts/enp3s0

[/php]

خط زیر را اضافه نمایید.

[php]

BRIDGE=br0

[/php]

فایل را در vi ذخیره کرده و ببندید. سپس فایل /etc/sysconfig/network-scripts/ifcfg-br0 را ویرایش کرده و اضافه کنید.

[php]

# vi /etc/sysconfig/network-scripts/ifcfg-br0

[/php]

خطوط زیر را اضافه کنید.

[php]

DEVICE="br0"

# I am getting ip from DHCP server #

BOOTPROTO="dhcp"

IPV6INIT="yes"

IPV6_AUTOCONF="yes"

ONBOOT="yes"

TYPE="Bridge"

DELAY="0"

[/php]

سرویس شبکه را دوباره راه‌اندازی کنید. توجه داشته باشید که فرمان ssh قطع خواهد شد و بهتر است که از نو شروع کنید.

[php]

# systemctl restart NetworkManager

[/php]

موضوع را با فرمان brctl بررسی کنید.

[php]

# brctl show

[/php]

گام ۴) اولین ماشین مجازی خود را بسازید.

در اینجا می‌خواهیم یک VM در CentOS 7.x ایجاد کنیم. ابتدا با کمک فرمان wget آخرین نسخه ایمیج CentOS 7.x را دریافت کنید.

[php]

# cd /var/lib/libvirt/boot/

# wget https://mirrors.kernel.org/centos/7.4.1708/isos/x86_64/CentOS-7-x86_64-Minimal-1708.iso

[/php]

بررسی ایمیج‌های ISO

[php]

# wget https://mirrors.kernel.org/centos/7.4.1708/isos/x86_64/sha256sum.txt

# sha256sum -c sha256sum.txt

[/php]

ایجاد ماشین مجازی CentOS 7.x

در اینجا، قصد داریم که ماشین مجازی CentOS 7.x را با ۲ گیگابایت حافظه رم، دو هسته پردازنده، یک nic و ۴۰ گیگابایت فضای دیسک ایجاد کنیم. برای این منظور داریم:

[php]

# virt-install \

–virt-type=kvm \

–name centos7 \

–ram 2048 \

–vcpus=1 \

–os-variant=centos7.0 \

–cdrom=/var/lib/libvirt/boot/CentOS-7-x86_64-Minimal-1708.iso \

–network=bridge=br0,model=virtio \

–graphics vnc \

–disk path=/var/lib/libvirt/images/centos7.qcow2,size=40,bus=virtio,format=qcow2

[/php]

برای تنظیم ورودی vnc از ترمینال دیگر از طریق ssh داریم:

[php]

# virsh dumpxml centos7 | grep vnc

<graphics type=’vnc’ port=’5901′ autoport=’yes’ listen=’127.0.0.1′>

[/php]

در اینجا باید عدد پورت یا 5901 را یادداشت کنید. برای دسترسی به سرور ریموت vnc می‌بایست از یک کلاینت SSH برای تنظیم تونل و یک کلاینت VNC استفاده کنید. از طریق کلاینت یا دسکتاپ، فرمان هدایت پورت SSH را به صورت زیر تایپ نمایید.

[php]

$ ssh vivek@server1.cyberciti.biz -L 5901:127.0.0.1:5901

[/php]

وقتی تونل ssh راه‌اندازی شد، می‌توانید کلاینت VNC خود را به لوکال‌هاست 127.0.0.1 و پورت 5901 به صورت زیر ارجاع دهید.

ارجاع کلاینت VNC

ارجاع کلاینت VNC

در این حالت می‌بایست صفحه نصب میهمان لینوکس CentOS را به صورت زیر مشاهده کنید.

صفحه خوشامدگویی نصب  لینوکس CentOS

صفحه خوشامدگویی نصب  لینوکس CentOS

حالا فقط دستورالعمل‌هایی را که در صفحه ظاهر می‌شوند، دنبال کرده و CentOS 7 را نصب کنید. وقتی نصب به پایان رسید، دکمه reboot را بزنید. سرور ریموت باعث بسته‌شدن ارتباط با کلاینت VNC شده است. می‌توانید با استفاده از ابزار KVM ارتباط دوباره برقرار کرده تا سایر قسمت های سرور از جمله سرویس SSH یا فایروال را تنظیم کنید.

نحوه ساخت ماشین مجازی RHEL 7.x

ابتدا باید فایل rhel-server-7.3-x86_64-dvd.iso را به صورت ذخیره‌شده در اختیار داشته باشید. در اینجا ماشین مجازی RHEL 7.x را با ۲ گیگابایت حافظه رم، دو هسته پردازنده، یک nic و ۴۰ گیگابایت فضای دیسک می‌سازیم.

[php]

# virt-install \

–virt-type=kvm \

–name rhel7 \

–memory=2048,maxmemory=4096 \

–vcpus=2 \

–os-variant=rhel7.3 \

–cdrom=/var/lib/libvirt/boot/rhel-server-7.3-x86_64-dvd.iso \

–network=bridge=virbr0,model=virtio \

–graphics vnc \

–disk path=/var/lib/libvirt/images/rhel7.qcow2,size=40,bus=virtio,format=qcow2

[/php]

برای تنظیم ورودی vnc از یک ترمینال دیگر از طریق ssh داریم:

[php]

$ sudo virsh dumpxml rhel7 | grep vnc

<graphics type=’vnc’ port=’5904′ autoport=’yes’ listen=’127.0.0.1′>

[/php]

در اینجا باید عدد پورت یا 5904 را یادداشت کنید. برای دسترسی به سرور ریموت vnc می‌بایست از یک کلاینت SSH برای تنظیم تونل و یک کلاینت VNC استفاده کنید. از طریق کلاینت یا دسکتاپ، فرمان هدایت پورت SSH را به صورت زیر تایپ نمایید.

[php]

$ ssh vivek@server1.cyberciti.biz -L 5904:127.0.0.1:5904

[/php]

وقتی تونل ssh راه‌اندازی شد، می توانید کلاینت VNC را به لوکال‌هاست 127.0.0.1 و پورت 5904 ارجاع دهید تا به مراحل بعدی نصب RHEL 7.x بپردازید.

گام ۵) استفاده از ایمیج‌های ابری

روش نصبی که در بالا ارائه شد، می‌تواند برای اهداف آموزشی و یا یک ماشین مجازی مناسب باشد. امّا در صورتی که می‌خواهید از تعداد بیشتری از ماشین‌های مجازی استفاده کنید، بهتر است ایمیج‌های ابری را امتحان کنید. امکان ویرایش ایمیج‌های ابری «پیش تولید» مطابق نیازهای شما وجود خواهد داشت. به عنوان مثال، می‌توانید کاربر اضافه کنید، کلیدهای ssh وارد نمایید و منطقه زمانی را تنظیم کنید. حالا ببینیم که به این روش، چگونه می‌توان یک ماشین مجازی با یک گیگابایت حافظه رم، ۲۰ گیگابایت فضای دیسک و یک vCPU در CentOS 7 ساخت.

دریافت ایمیج ابری CentOS 7

[php]

# cd /var/lib/libvirt/boot

# wget http://cloud.centos.org/centos/7/images/CentOS-7-x86_64-GenericCloud.qcow2

[/php]

تولید دایرکتوری‌های موردنیاز

[php]

# D=/var/lib/libvirt/images

# VM=centos7-vm1 ## vm name ##

# mkdir -vp $D/$VM

mkdir: created directory ‘/var/lib/libvirt/images/centos7-vm1’

[/php]

ایجاد فایل meta-data

[php]

# cd $D/$VM

# vi meta-data

[/php]

موارد زیر را در این فایل اضافه کنید.

[php]

instance-id: centos7-vm1

local-hostname: centos7-vm1

[/php]

ایجاد فایل user-data

در اینجا می‌خواهیم از طریق کلیدهای ssh به VM وارد شویم. بر این اساس، ابتدا دقت کنید که کلیدهای ssh در جایگاه خود قرار گرفته باشند.

[php]

# ssh-keygen -t ed25519 -C "VM Login ssh key"

[/php]

فرمان ssh-keygen

فرمان ssh-keygen

حالا user-data را مطابق زیر ویرایش کنید.

[php]

# cd $D/$VM

# vi user-data

[/php]

مطابق تنظیماتی که دارید، موارد زیر را اضافه کنید.

[php]

#cloud-config

# Hostname management

preserve_hostname: False

hostname: centos7-vm1

fqdn: centos7-vm1.nixcraft.com

# Users

users:

– default

– name: vivek

groups: [‘wheel’]

shell: /bin/bash

sudo: ALL=(ALL) NOPASSWD:ALL

ssh-authorized-keys:

– ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIIMP3MOF2ot8MOdNXCpHem0e2Wemg4nNmL2Tio4Ik1JY VM Login ssh key

# Configure where output will go

output:

all: ">> /var/log/cloud-init.log"

# configure interaction with ssh server

ssh_genkeytypes: [‘ed25519’, ‘rsa’]

# Install my public ssh key to the first user-defined user configured

# in cloud.cfg in the template (which is centos for CentOS cloud images)

ssh_authorized_keys:

– ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIIMP3MOF2ot8MOdNXCpHem0e2Wemg4nNmL2Tio4Ik1JY VM Login ssh key

# set timezone for VM

timezone: Asia/Kolkata

# Remove cloud-init

runcmd:

– systemctl stop network && systemctl start network

– yum -y remove cloud-init

[/php]

ایمیج ابری را کپی کنید.

[php]

# cd $D/$VM

# cp /var/lib/libvirt/boot/CentOS-7-x86_64-GenericCloud.qcow2 $VM.qcow2

[/php]

ایجاد دیسک ایمیج ۲۰ گیگابایتی

[php]

# cd $D/$VM

# export LIBGUESTFS_BACKEND=direct

# qemu-img create -f qcow2 -o preallocation=metadata $VM.new.image 20G

# virt-resize –quiet –expand /dev/sda1 $VM.qcow2 $VM.new.image

[/php]

تنظیم اندازه دیسک ایمیج VM

تنظیم اندازه دیسک ایمیج VM

ایمیجی را که اندازه‌اش تغییر کرده، بازنویسی کنید.

[php]

# cd $D/$VM

# mv $VM.new.image $VM.qcow2

[/php]

ایجاد یک فایل cloud-init ISO

[php]

# mkisofs -o $VM-cidata.iso -V cidata -J -r user-data meta-data

[/php]

ایجاد یک فایل cloud-init ISO

ایجاد یک فایل cloud-init ISO

ایجاد یک pool

[php]

# virsh pool-create-as –name $VM –type dir –target $D/$VM

Pool centos7-vm1 created

[/php]

نصب یک ماشین مجازی CentOS 7

[php]

# cd $D/$VM

# virt-install –import –name $VM \

–memory 1024 –vcpus 1 –cpu host \

–disk $VM.qcow2,format=qcow2,bus=virtio \

–disk $VM-cidata.iso,device=cdrom \

–network bridge=virbr0,model=virtio \

–os-type=linux \

–os-variant=centos7.0 \

–graphics spice \

–noautoconsole

[/php]

حذف فایل‌های غیرضروری

[php]

# cd $D/$VM

# virsh change-media $VM hda –eject –config

# rm meta-data user-data centos7-vm1-cidata.iso

[/php]

پیدا کردن آدرس IP ابزار KVM یا آدرس dhcp

[php]

# virsh net-dhcp-leases default

[/php]

ساخت ماشین مجازی CentOS7

ساخت ماشین مجازی CentOS7

وارد شدن به VM

از فرمان ssh به صورت زیر استفاده کنید.

[php]

# ssh vivek@192.168.122.85

[/php]

نمونه اجرای VM

نمونه اجرای VM

فرمان‌های مفید

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

لیست تمام VM ها

[php]

# virsh list –all

[/php]

دریافت اطلاعات VM

[php]

# virsh dominfo vmName

# virsh dominfo centos7-vm1

[/php]

توقف و خاموش کردن یک VM

[php]

# virsh shutdown centos7-vm1

[/php]

راه‌اندازی VM

[php]

# virsh start centos7-vm1

[/php]

تنظیم VM برای راه‌اندازی خودکار در شروع به کار سیستم

[php]

# virsh autostart centos7-vm1

[/php]

راه‌اندازی دوباره (ریبوت نرم و ایمن) VM

[php]

# virsh reboot centos7-vm1

[/php]

راه‌اندازی دوباره (سخت و غیر ایمن) VM

[php]

# virsh reset centos7-vm1

[/php]

حذف VM

[php]

# virsh shutdown centos7-vm1

# virsh undefine centos7-vm1

# virsh pool-destroy centos7-vm1

# D=/var/lib/libvirt/images

# VM=centos7-vm1

# rm -ri $D/$VM

[/php]

برای مشاهده لیست کلی انواع فرمان virsh داریم:

[php]

# virsh help | less

# virsh help | grep reboot

[/php]

نکاتی در رابطه با virt-builder

امکان ساخت سریع ایمیج‌های ماشین مجازی در CentOS 7 با استفاده از فرمان virt-builder وجود دارد.

لیست ایمیج‌های VM

[php]

virt-builder –list

virt-builder –list | grep -i fedora

virt-builder –list | grep -i debian

virt-builder –list | grep -i ubuntu

virt-builder –list | grep -i freebsd

[/php]

ساخت ماشین مجازی اوبونتو 16.04 LTS

[php]

# virt-builder ubuntu-16.04 \

–size=20G –format qcow2 -o /var/lib/libvirt/images/ncbz01-disk01.qcow2 \

–hostname ncbz01 –network –timezone Asia/Kolkata \

–firstboot-command "dpkg-reconfigure openssh-server" \

–edit ‘/etc/default/grub:

s/^GRUB_CMDLINE_LINUX_DEFAULT=.*/GRUB_CMDLINE_LINUX_DEFAULT="console=tty0 console=ttyS0,115200n8"/’ \

–run-command update-grub

[/php]

نمونه‌های خروجی (به خاطر داشته باشید که پسورد تصادفی روت در صفحه نمایش داده خواهد شد):

[php]

[   3.9] Downloading: http://libguestfs.org/download/builder/ubuntu-16.04.xz

######################################################################## 100.0%

[ 121.7] Planning how to build this image

[ 121.7] Uncompressing

[ 126.5] Resizing (using virt-resize) to expand the disk to 20.0G

[ 142.1] Opening the new disk

[ 143.8] Setting a random seed

[ 143.8] Setting the machine ID in /etc/machine-id

[ 143.8] Setting the hostname: ncbz01

[ 144.3] Setting the timezone: Asia/Kolkata

[ 144.3] Setting passwords

virt-builder: Setting random password of root to 1KTLsuVx14k989eq

[ 144.9] Finishing off

Output file: /var/lib/libvirt/images/ncbz01-disk01.qcow2

Output size: 20.0G

Output format: qcow2

Total usable space: 18.6G

Free space: 17.7G (94%)

[/php]

حالا که ایمیج ساخته شده، نوبت نصب VM است.

[php]

# virt-install –import –name ncbz01 \

–ram 2048 \

–vcpu 2 \

–disk path=/var/lib/libvirt/images/ncbz01-disk01.qcow2,format=qcow2 \

–os-variant ubuntu17.04 \

–network=bridge=virbr0,model=virtio \

–noautoconsole

[/php]

اجرا:

[php]

# virsh start ncbz01

[/php]

ورود به VM

[php]

# virsh console ncbz01

[/php]

جمع‌بندی

در این مطلب با نحوه نصب و راه‌اندازی ابزار KVM در سرورهای با سیستم‌عامل لینوکس CentOS 7 یا RHEL 7 آشنا شدید. امیدواریم که این مطلب نیز موردتوجه شما قرار گرفته باشد.