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

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

$ lscpu | grep Virtualization

Virtualization: VT-x

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

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

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

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

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

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

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

# systemctl enable libvirtd

# systemctl start libvirtd

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

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

# lsmod | grep -i kvm

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

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

# brctl show

# virsh net-list

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

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

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

# virsh net-dumpxml default

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

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

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

BRIDGE=br0

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

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

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

DEVICE="br0"

# I am getting ip from DHCP server #

BOOTPROTO="dhcp"

IPV6INIT="yes"

IPV6_AUTOCONF="yes"

ONBOOT="yes"

TYPE="Bridge"

DELAY="0"

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

# systemctl restart NetworkManager

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

# brctl show

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

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

# cd /var/lib/libvirt/boot/

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

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

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

# sha256sum -c sha256sum.txt

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

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

# 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

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

# virsh dumpxml centos7 | grep vnc

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

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

$ ssh [email protected] -L 5901:127.0.0.1:5901

وقتی تونل 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 و ۴۰ گیگابایت فضای دیسک می‌سازیم.

# 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

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

$ sudo virsh dumpxml rhel7 | grep vnc

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

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

$ ssh [email protected] -L 5904:127.0.0.1:5904

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

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

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

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

# cd /var/lib/libvirt/boot

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

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

# D=/var/lib/libvirt/images

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

# mkdir -vp $D/$VM

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

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

# cd $D/$VM

# vi meta-data

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

instance-id: centos7-vm1

local-hostname: centos7-vm1

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

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

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

فرمان ssh-keygen

فرمان ssh-keygen

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

# cd $D/$VM

# vi user-data

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

#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

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

# cd $D/$VM

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

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

# 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

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

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

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

# cd $D/$VM

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

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

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

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

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

ایجاد یک pool

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

Pool centos7-vm1 created

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

# 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

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

# cd $D/$VM

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

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

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

# virsh net-dhcp-leases default

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

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

وارد شدن به VM

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

# ssh [email protected]

نمونه اجرای VM

نمونه اجرای VM

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

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

لیست تمام VM ها

# virsh list --all

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

# virsh dominfo vmName

# virsh dominfo centos7-vm1

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

# virsh shutdown centos7-vm1

راه‌اندازی VM

# virsh start centos7-vm1

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

# virsh autostart centos7-vm1

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

# virsh reboot centos7-vm1

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

# virsh reset centos7-vm1

حذف VM

# 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

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

# virsh help | less

# virsh help | grep reboot

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

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

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

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

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

# 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

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

[   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%)

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

# 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

اجرا:

# virsh start ncbz01

ورود به VM

# virsh console ncbz01

جمع‌بندی

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