ফেজ ৩ — ভার্চুয়ালাইজেশন ধারণা (Virtualization Concepts)#
৭টি লেসন · আনুমানিক ৫ ঘণ্টা ৩০ মিনিট · লেভেল: শুরুর
প্রক্সমক্স ভেতরে ভেতরে আসলে কী করে — হাইপারভাইজার, KVM, QEMU, LXC — এই ফেজে সেটাই।
লেসন ১ — হাইপারভাইজার: Type 1 বনাম Type 2 (৩৫ মিনিট)#
সহজ ভাষায়#
হাইপারভাইজার হলো সেই সফটওয়্যার স্তর, যা ভার্চুয়াল মেশিন তৈরি ও চালায়। এটি হার্ডওয়্যার আর গেস্ট অপারেটিং সিস্টেমের মাঝখানে বসে CPU, RAM, ডিস্ক ও নেটওয়ার্ক ভাগ করে দেয়।
Type 1 — বেয়ার-মেটাল#
সরাসরি হার্ডওয়্যারের উপরে চলে, নিচে কোনো হোস্ট OS নেই। হাইপারভাইজার নিজেই OS।
- Proxmox VE / KVM — লিনাক্স কার্নেলই হাইপারভাইজার (ফ্রি, ওপেন সোর্স)
- VMware ESXi — এন্টারপ্রাইজ মান, প্রোপ্রাইটারি, দামি
- Microsoft Hyper-V — Windows Server-এর ভেতরে
- Xen — AWS ব্যবহার করত
ওভারহেড: ২–৫% মাত্র। আইসোলেশন শক্ত।
Type 2 — হোস্টেড#
হোস্ট OS-এর ভেতরে একটি সাধারণ অ্যাপ্লিকেশন হিসেবে চলে।
- VirtualBox, VMware Workstation/Fusion, Parallels, QEMU (user-mode)
- ওভারহেড: ১০–৩০%, কারণ দুইবার শিডিউলিং হয়
- ব্যবহার: ডেভেলপারের ল্যাপটপ, টেস্টিং
KVM কেন বিশেষ#
KVM হলো লিনাক্স কার্নেলের একটি মডিউল, যা কার্নেলকেই হাইপারভাইজার বানিয়ে ফেলে। ফলে Type 1-এর গতি আর Type 2-এর সুবিধা (apt, পূর্ণ লিনাক্স টুলস) — দুইটাই পাওয়া যায়।
| বিষয় | Type 1 | Type 2 |
|---|---|---|
| পারফরম্যান্স ওভারহেড | ২–৫% | ১০–৩০% |
| আইসোলেশন | শক্ত | দুর্বল |
| প্রোডাকশনের উপযোগী | হ্যাঁ | না |
| ইনস্টল করা সহজ | কম | বেশি |
টিপ: সার্ভারে Proxmox VE (Type 1) ব্যবহার করুন। ল্যাপটপে কনফিগ পরীক্ষা করতে VirtualBox বা VMware Workstation ব্যবহার করুন।
লেসন ২ — KVM ও QEMU: প্রতিটি VM-এর ইঞ্জিন (৪৫ মিনিট)#
সহজ ভাষায়#
KVM আর QEMU দুইজন মিলে একটি VM বানায়।
- KVM (কার্নেল মডিউল): CPU ও মেমরি ভার্চুয়ালাইজেশন করে, হার্ডওয়্যার এক্সটেনশন
(Intel VT-x / AMD-V) ব্যবহার করে।
- QEMU (userspace প্রোগ্রাম): বাকি সব — ভার্চুয়াল NIC, ডিস্ক, USB, VGA, BIOS/UEFI।
ফলাফল: এমন একটি ভার্চুয়াল কম্পিউটার, যা প্রায় আসল হার্ডওয়্যারের গতিতে চলে।
ভেতরে কী হয়#
- KVM
/dev/kvmনামে একটি ডিভাইস দেয়। QEMU সেটি খুলে VM তৈরি করে। - গেস্টের ring 0 কোড সরাসরি CPU-তে চলে — অনুবাদ লাগে না।
- গেস্ট যখন বিশেষ কিছু করতে চায় (I/O, ইন্টারাপ্ট), তখন "VM exit" হয় এবং হাইপারভাইজার সামলায়।
qmটুল কনফিগ ফাইল পড়ে QEMU-এর কমান্ড লাইন বানিয়ে দেয়।
egrep -c "(vmx|svm)" /proc/cpuinfo # ০-এর বেশি হলে হার্ডওয়্যার সাপোর্ট আছে
lsmod | grep kvm # kvm_intel বা kvm_amd লোড আছে কি
ls -la /dev/kvm
kvm-okপ্রতিটি VM একটি প্রসেস#
qm list # VMID, নাম, স্ট্যাটাস, PID
ps -p 1452 -o pid,cmd # ওই PID আসলে qemu-system-x86_64
qm config 100 # VM-এর কনফিগ ফাইলকনফিগ থাকে /etc/pve/nodes/<নোড>/qemu-server/100.conf ফাইলে।
VM চালানোর কমান্ড#
qm create 100 --name test-vm --memory 2048 --cores 2 --net0 virtio,bridge=vmbr0
qm start 100
qm status 100 # running / stopped / paused
qm shutdown 100 # ভদ্রভাবে বন্ধ (ACPI)
qm stop 100 # প্লাগ খুলে ফেলার মতো
qm reset 100 # হার্ড রিসেট
qm suspend 100 # থামিয়ে ডিস্কে রাখা
qm destroy 100 # VM ও ডিস্ক মুছে ফেলা
qm terminal 100 # সিরিয়াল কনসোলCPU টাইপ#
| টাইপ | মানে |
|---|---|
host | হোস্টের সব CPU ফিচার দেয় — দ্রুততম, কিন্তু ভিন্ন CPU-তে লাইভ মাইগ্রেশন আটকায় |
kvm64 | নিরাপদ বেসলাইন — Intel/AMD-এর মধ্যে মাইগ্রেশন চলে |
x86-64-v2/v3/v4 | ধাপে ধাপে নতুন ইনস্ট্রাকশন সেট |
সতর্কতা:
--cpu hostশুধু তখনই দিন, যখন ক্লাস্টারের সব নোডের CPU একই প্রজন্মের। ভিন্ন CPU-এর মধ্যে লাইভ মাইগ্রেশন করতে হলেkvm64বা কোনো x86-64 বেসলাইন দিন।
লেসন ৩ — LXC কন্টেইনার: হালকা লিনাক্স আইসোলেশন (৪৫ মিনিট)#
সহজ ভাষায়#
LXC আসলে ভার্চুয়ালাইজেশন নয় — এটি OS পর্যায়ের বিচ্ছিন্নকরণ। কন্টেইনার হোস্টের কার্নেলই ব্যবহার করে, কিন্তু তার নিজের ফাইল সিস্টেম, প্রসেস তালিকা, নেটওয়ার্ক ও হোস্টনেম থাকে।
পেছনের প্রযুক্তি#
| প্রযুক্তি | কাজ |
|---|---|
| Namespaces | প্রসেস, নেটওয়ার্ক, মাউন্ট, হোস্টনেম, ইউজার আলাদা করে |
| cgroups | CPU, মেমরি, I/O-এর সীমা বেঁধে দেয় |
| seccomp | কোন সিস্টেম কল করা যাবে, তা সীমিত করে |
| AppArmor/SELinux | কোন ফাইলে হাত দেওয়া যাবে, তা নিয়ন্ত্রণ করে |
VM নাকি LXC?#
| LXC | VM | |
|---|---|---|
| চালু হতে | ~১০০ মিলিসেকেন্ড | ৫০০–২০০০ মিলিসেকেন্ড |
| বাড়তি RAM | ২০–৫০ MB | ২৫৬ MB+ |
| OS | শুধু লিনাক্স | যেকোনো (Windows, BSD) |
| কার্নেল | হোস্টেরটি ভাগ করে | নিজস্ব |
| উপযুক্ত | Nginx, PostgreSQL, Redis, Node.js | Windows, অবিশ্বস্ত কোড, শক্ত আইসোলেশন |
Privileged বনাম Unprivileged — সবচেয়ে গুরুত্বপূর্ণ নিরাপত্তা বিষয়#
- Privileged: ভেতরের root = হোস্টের root। কন্টেইনার থেকে বের হতে পারলে পুরো সার্ভার শেষ।
- Unprivileged: ভেতরের root = হোস্টের UID 100000। বের হলেও সাধারণ ইউজারের ক্ষমতা।
সবসময় --unprivileged 1 ব্যবহার করুন। Docker চালাতে হলে --features nesting=1 দিন, privileged বানাবেন না।
pveam update
pveam available | grep -E "debian|ubuntu"
pveam download local debian-13-standard_13.0-1_amd64.tar.zst
pct create 200 local:vztmpl/debian-13-standard_13.0-1_amd64.tar.zst \
--hostname web01 \
--unprivileged 1 \
--features nesting=1 \
--memory 1024 --swap 1024 --cores 2 \
--rootfs local-lvm:20 \
--net0 name=eth0,bridge=vmbr0,ip=192.168.1.200/24,gw=192.168.1.1 \
--nameserver 1.1.1.1
pct start 200
pct enter 200 # ভেতরে শেল
pct exec 200 -- apt install nginx -y
pct snapshot 200 before-nginx
pct rollback 200 before-nginxটিপ: কন্টেইনারে ঢুকতে
ssh-এর বদলেpct enter <id>ব্যবহার করুন। কন্টেইনারে SSH না থাকলেও, নেটওয়ার্ক না থাকলেও এটি কাজ করে।
লেসন ৪ — স্ন্যাপশট, ক্লোন ও টেমপ্লেট (৪০ মিনিট)#
স্ন্যাপশট — অবস্থা জমিয়ে রাখা#
স্ন্যাপশট এক মুহূর্তের পুরো অবস্থা ধরে রাখে: ডিস্ক, ইচ্ছা করলে RAM, CPU অবস্থা। রোলব্যাক করলে ঠিক ওই মুহূর্তে ফিরে যায়।
| স্টোরেজ | স্ন্যাপশটের গতি |
|---|---|
| ZFS | প্রায় সঙ্গে সঙ্গে, জায়গা লাগে না |
| LVM-thin | প্রায় সঙ্গে সঙ্গে |
| QCOW2 | একটু ধীর, তবে বহনযোগ্য |
| raw | নিজে স্ন্যাপশট পারে না — নিচে ZFS/LVM লাগে |
qm snapshot 100 pre-kernel-update --description "কার্নেল আপগ্রেডের আগে" --vmstate 1
qm listsnapshot 100
qm stop 100 && qm rollback 100 pre-kernel-update
qm delsnapshot 100 pre-kernel-update
pct snapshot 200 before-nginx # কন্টেইনারেও একই নিয়মসতর্কতা: অনেকগুলো স্ন্যাপশট একটার পর একটা জমলে ডিস্ক পড়ার গতি কমে যায়। কাজ শেষে স্ন্যাপশট মুছে ফেলুন।
ক্লোন — VM নকল করা#
| ধরন | গতি | নির্ভরতা |
|---|---|---|
| Linked clone | সেকেন্ডে তৈরি, ছোট | উৎস VM মুছে ফেলা যায় না |
| Full clone | ডিস্কের আকার অনুযায়ী সময় লাগে | সম্পূর্ণ স্বাধীন |
qm clone 100 101 --name web-clone-1 --full false # linked
qm clone 100 200 --name web-prod --full true --storage local-lvm # full
pct clone 200 201 --hostname db-clone --full trueটেমপ্লেট — গোল্ডেন ইমেজ#
টেমপ্লেট হলো read-only মাস্টার VM। এটি চালু করা যায় না, শুধু ক্লোন করা যায়।
# ১. VM বানান, OS বসান, আপডেট দিন
qm create 9000 --name debian13-template --memory 1024 --cores 2 \
--net0 virtio,bridge=vmbr0 --virtio0 local-lvm:20 --ostype l26
# ২. VM-এর ভেতরে পরিষ্কার করুন
apt update && apt dist-upgrade -y
apt install qemu-guest-agent cloud-init -y
cloud-init clean --logs
truncate -s 0 /etc/machine-id
history -c && rm -f ~/.bash_history
# ৩. টেমপ্লেটে রূপান্তর (এটি ফেরানো যায় না)
qm shutdown 9000
qm template 9000
# ৪. ক্লোন করুন
qm clone 9000 100 --name web-01 --full trueসতর্কতা: টেমপ্লেট বানানোর আগে
cloud-init cleanচালান এবং/etc/machine-idখালি করুন। না করলে সব ক্লোনের machine ID এক হবে — DHCP-তে IP সংঘাত হবে।
লেসন ৫ — CPU ও মেমরি ভার্চুয়ালাইজেশন (৪৫ মিনিট)#
সহজ ভাষায়#
VM-এর পারফরম্যান্স ও হোস্টের স্থিতিশীলতা সবচেয়ে বেশি নির্ভর করে CPU ও মেমরি সেটিংয়ের উপর।
CPU#
আধুনিক CPU-তে VMX (Intel) বা SVM (AMD) মোড আছে, যেখানে গেস্টের কোড সরাসরি হার্ডওয়্যারে চলে। হাইপারভাইজার শুধু বিশেষ কাজগুলো (I/O, বিশেষ রেজিস্টার) মাঝপথে ধরে। তাই KVM প্রায় নেটিভ গতি পায়।
- EPT/NPT: গেস্টের মেমরি ঠিকানা থেকে হোস্টের মেমরি ঠিকানা — হার্ডওয়্যারই করে দেয়।
- হার্ডওয়্যার সাপোর্ট না থাকলে প্রতিটি নির্দেশ সফটওয়্যারে নকল করতে হয় — প্রায় ১০০ গুণ ধীর।
মেমরি#
VM-কে ৪ GB দিলে হোস্ট সঙ্গে সঙ্গে ৪ GB আটকে রাখে না।
| কৌশল | কী করে |
|---|---|
| Overcommit | হোস্টের চেয়ে বেশি RAM বরাদ্দ দেওয়া — সবাই একসাথে পূর্ণ ব্যবহার না করলে নিরাপদ |
| KSM | একই রকম মেমরি পেজ খুঁজে এক করে দেয় — একই ধরনের অনেক VM থাকলে বড় সাশ্রয় |
| Ballooning | গেস্টের অব্যবহৃত মেমরি হোস্ট ফেরত নিতে পারে |
| Swap | RAM শেষ হলে ডিস্কে যায় — পারফরম্যান্স মারাত্মক পড়ে, এড়িয়ে চলুন |
qm set 100 --memory 4096 --balloon 1024
# --memory: সর্বোচ্চ, --balloon: সর্বনিম্ন নিশ্চিত
cat /sys/kernel/mm/ksm/run # KSM চালু আছে?
echo 1 > /sys/kernel/mm/ksm/run
cat /sys/kernel/mm/ksm/pages_shared # কত পেজ শেয়ার হলো
free -h
cat /proc/meminfo | grep -E "MemAvailable|SwapUsed|Committed"
# ডাটাবেসের মতো লেটেন্সি-সংবেদনশীল কাজে hugepages
qm set 100 --hugepages 2048NUMA — একাধিক সকেটের সার্ভারে#
দুই সকেটের সার্ভারে RAM কোন সকেটের সাথে লাগানো, তার উপর গতি নির্ভর করে। VM যদি দুই সকেটে ছড়িয়ে যায়, গতি কমে।
numactl --hardware # কয়টি NUMA নোড, কোন CPU কোন নোডে
qm set 100 --numa 1 --numa0 cpus=0-7,hostnodes=0,memory=16384টিপ: দুই সকেটের সার্ভারে VM এমন মাপে বানান, যাতে একটি NUMA নোডের ভেতরেই থাকে।
লেসন ৬ — VirtIO: প্যারাভার্চুয়ালাইজড ডিভাইস (৪০ মিনিট)#
সহজ ভাষায়#
হার্ডওয়্যার নকল করা ধীর। VM যখন নকল করা e1000 NIC-এ লেখে, QEMU-কে আসল কার্ডের প্রতিটি রেজিস্টার ও ইন্টারাপ্ট নকল করতে হয় — প্রতি প্যাকেটে হাজার হাজার অপারেশন।
VirtIO সেই নকল বাদ দেয়। গেস্ট আর হোস্ট শেয়ার করা মেমরির রিং বাফার দিয়ে সরাসরি কথা বলে। ফলাফল: প্রায় নেটিভ গতি।
VirtIO ডিভাইস পরিবার#
| ডিভাইস | কাজ |
|---|---|
| virtio-net | ভার্চুয়াল NIC — ১০ Gbps+ সম্ভব |
| virtio-blk | একক-কিউ ব্লক ডিভাইস — এক ডিস্কের VM-এ ভালো |
| virtio-scsi | মাল্টি-কিউ SCSI — হটপ্লাগ, TRIM, অনেক ডিস্ক |
| virtio-balloon | মেমরি ফেরত দেওয়ার ড্রাইভার |
| virtio-rng | হোস্ট থেকে এলোমেলো সংখ্যা দেয় |
| virtio-serial | গেস্ট এজেন্টের যোগাযোগ চ্যানেল |
| virtio-gpu | ভালো ডিসপ্লে পারফরম্যান্স |
পার্থক্য কতটা#
| ডিভাইস | ফলাফল |
|---|---|
| e1000 (নকল) | ~৯০০ Mbps, ~১৫% CPU |
| virtio-net | ~৯৫০০ Mbps, ~৫% CPU |
| IDE (নকল) | ~৫,০০০ IOPS |
| SATA (নকল) | ~২৫,০০০ IOPS |
| virtio-blk / virtio-scsi | ~৮০,০০০ IOPS |
QEMU গেস্ট এজেন্ট#
গেস্ট এজেন্ট VM-এর ভেতরে চলে এবং virtio-serial দিয়ে হোস্টের সাথে কথা বলে।
- ফাইল সিস্টেম freeze/thaw: স্ন্যাপশট নেওয়ার আগে ডাটা লিখে থামিয়ে দেয় — ফলে
চালু ডাটাবেসেরও সঠিক স্ন্যাপশট হয়।
- IP জানানো: ওয়েব UI-তে VM-এর IP দেখা যায়।
- ভদ্র শাটডাউন, ফাইল আদান-প্রদান, OS তথ্য।
qm set 100 --agent enabled=1,fstrim_cloned_disks=1
# VM-এর ভেতরে
apt install qemu-guest-agent
systemctl enable --now qemu-guest-agent
# হোস্ট থেকে পরীক্ষা
qm agent 100 ping
qm agent 100 network-get-interfaces
qm agent 100 get-osinfoটিপ: একাধিক ডিস্কের VM-এ
virtio-blk-এর বদলেvirtio-scsiনিন। এটি এক কন্ট্রোলারে ২৫৫টি ডিস্ক, হটপ্লাগ এবং TRIM সাপোর্ট করে।
Windows-এ VirtIO#
Windows-এ VirtIO ড্রাইভার থাকে না। ড্রাইভার ছাড়া ইনস্টলের সময় Windows কোনো ডিস্ক দেখে না। তাই virtio-win.iso দ্বিতীয় CD হিসেবে যুক্ত করতে হয় এবং সেটআপে "Load driver" চাপতে হয়।
লেসন ৭ — PCIe পাসথ্রু, SR-IOV ও GPU (৫০ মিনিট)#
সহজ ভাষায়#
PCIe পাসথ্রু (VFIO) একটি ফিজিক্যাল ডিভাইস সরাসরি VM-কে দিয়ে দেয় — মাঝখানে কোনো নকল নেই। GPU তার পুরো গতিতে চলে, NVMe তার পুরো IOPS দেয়। ক্লাউড GPU ইনস্ট্যান্স এভাবেই কাজ করে।
IOMMU কেন দরকার#
PCIe ডিভাইস সরাসরি RAM-এ লিখতে পারে (DMA)। IOMMU (Intel VT-d / AMD-Vi) হার্ডওয়্যার পাহারাদার হিসেবে ঠিক করে দেয় কোন ডিভাইস RAM-এর কোন অংশে হাত দিতে পারবে। এটি BIOS এবং কার্নেল — দুই জায়গাতেই চালু করতে হয়।
ধাপে ধাপে#
# ১. BIOS-এ VT-d (Intel) বা IOMMU/AMD-Vi (AMD) চালু করুন
# ২. কার্নেলে চালু করুন — /etc/default/grub
GRUB_CMDLINE_LINUX_DEFAULT="quiet intel_iommu=on iommu=pt" # Intel
GRUB_CMDLINE_LINUX_DEFAULT="quiet amd_iommu=on iommu=pt" # AMD
update-grub && reboot
# ৩. চালু হয়েছে কি না দেখুন
dmesg | grep -e DMAR -e IOMMU
# ৪. VFIO মডিউল লোড করুন
echo "options vfio_pci ids=10de:2786" > /etc/modprobe.d/vfio.conf
echo "vfio" >> /etc/modules
echo "vfio_iommu_type1" >> /etc/modules
echo "vfio_pci" >> /etc/modules
update-initramfs -u && reboot
# ৫. ডিভাইস ও তার IOMMU গ্রুপ খুঁজুন
lspci -nn | grep -i nvidia
find /sys/kernel/iommu_groups -type l | grep "01:00"
# একই গ্রুপের সব ডিভাইস একসাথে দিতে হয় (GPU + তার অডিও)
# ৬. VM-এ যুক্ত করুন
qm set 100 --hostpci0 01:00,pcie=1,x-vga=1 --vga none
qm start 100SR-IOV — এক ডিভাইস অনেক VM-এ#
SR-IOV একটি ফিজিক্যাল কার্ড (PF) থেকে অনেকগুলো ভার্চুয়াল ফাংশন (VF) বানায়। প্রতিটি VF আলাদা VM-কে দেওয়া যায়। ফলে একটি 25GbE NIC আটটি VM-কে পূর্ণ গতিতে সেবা দিতে পারে।
cat /sys/bus/pci/devices/0000:03:00.0/sriov_totalvfs # সর্বোচ্চ কয়টি VF
echo 4 > /sys/bus/pci/devices/0000:03:00.0/sriov_numvfs
lspci | grep "Virtual Function"
qm set 101 --hostpci0 03:10.0,pcie=1
qm set 102 --hostpci0 03:10.1,pcie=1ফেজ ৩ শেষে আপনি যা পারবেন#
- হাইপারভাইজারের ধরন ও KVM-এর অবস্থান বোঝা
- CLI দিয়ে VM-এর পুরো জীবনচক্র চালানো
- LXC আর VM-এর মধ্যে সঠিকটি বেছে নেওয়া
- unprivileged কন্টেইনার বানানো
- স্ন্যাপশট, ক্লোন ও টেমপ্লেট ব্যবহার করা
- CPU টাইপ, ballooning ও NUMA ঠিক করা
- VirtIO ও গেস্ট এজেন্ট চালু করা
- GPU/NIC পাসথ্রু ও SR-IOV সেটআপ করা
পরবর্তী: ফেজ ৪ — স্টোরেজ