Foundationপ্রথম নীতি থেকে
LEVEL 12লেসন ২/২২মাঝারি৪৫ মিনিট

Hypervisor-এর ধরন — Type-1 বনাম Type-2

Hypervisor Types: Bare-Metal vs Hosted

Hypervisor হলো তাত্ত্বিক VMM-এর বাস্তব সফটওয়্যার — Type-1 সরাসরি hardware-এর উপর privileged layer হিসেবে বসে (Xen, ESXi), Type-2 host OS-এর একটা সাধারণ application হিসেবে চলে (VirtualBox, Parallels), আর KVM-এর মতো ডিজাইন এই দুইয়ের সীমারেখাকে ইচ্ছাকৃতভাবে ঝাপসা করে দেয়।

এই লেসন শেষে আপনি পারবেন

  • Hypervisor (VMM)-কে পূর্ববর্তী লেসনের তাত্ত্বিক VMM-এর একটা concrete, বাস্তব সফটওয়্যার বাস্তবায়ন হিসেবে ব্যাখ্যা করতে পারবেন
  • Type-1 (bare-metal) আর Type-2 (hosted) hypervisor-এর architectural পার্থক্য — কে সরাসরি hardware-এর উপর privileged layer, কে host OS-এর একটা সাধারণ process — নির্ভুলভাবে বলতে পারবেন
  • KVM-এর মতো hybrid ডিজাইন কেন Type-1/Type-2 দ্বিভাজনকে ঝাপসা করে দেয় তা যুক্তিসহ ব্যাখ্যা করতে পারবেন, আর কেন performance-এর দিক থেকে এটা Type-1-এর কাছাকাছি তা প্রমাণ করতে পারবেন
  • Attack surface, performance, ease-of-use, আর deployment — এই চারটা মাত্রায় Type-1 বনাম Type-2-এর বাস্তব trade-off তুলনা করতে পারবেন
  • একটা toy scheduling-latency simulation লিখে/পড়ে 'double scheduling'-এর খরচ সংখ্যায় পরিমাপ করতে পারবেন

আগে যা বোঝা থাকা দরকার

আগে এটা বুঝি

আগের লেসনে (virtualization-theory) আমরা একটা তাত্ত্বিক বস্তু নিয়ে কাজ করেছি — VMM (Virtual Machine Monitor), Popek আর Goldberg-এর ১৯৭৪ সালের সংজ্ঞা অনুযায়ী তিনটা শর্ত পূরণ করা একটা সফটওয়্যার স্তর: equivalence (guest-এর কাছে হার্ডওয়্যারের মতোই মনে হবে), resource control (VMM সবসময় নিয়ন্ত্রণে থাকবে), আর efficiency (বেশিরভাগ instruction সরাসরি হার্ডওয়্যারে চলবে, VMM-এর মধ্য দিয়ে না)। সেই লেসন x86-এর Popek-Goldberg violationও দেখিয়েছে — কিছু sensitive instruction (যেমন POPF) trap না করেই চুপচাপ ব্যর্থ হয়, ফলে trap-and-emulate সরাসরি কাজ করে না।

কিন্তু একটা তাত্ত্বিক সংজ্ঞা দিয়ে সার্ভার চালানো যায় না। কাউকে না কাউকে সেই VMM-টা আসলে লিখতে হয়েছে — কোথাও ইনস্টল করা, কোনো না কোনো ফাইল সিস্টেমে বসে থাকা, বুট হওয়া, memory allocate করা একটা প্রকৃত প্রোগ্রাম হিসেবে। এই বাস্তব সফটওয়্যারটার নামই hypervisor। “VMM” আর “hypervisor” শব্দ দুটো প্রায় সমার্থকভাবে ব্যবহৃত হয় — VMM তাত্ত্বিক ভূমিকা বর্ণনা করে, hypervisor সেই ভূমিকা পালনকারী বাস্তব সফটওয়্যারকে বোঝায়। এই লেসনে আমরা “hypervisor”-ই বেশি ব্যবহার করব, কারণ এখন থেকে আমরা কংক্রিট, ইনস্টলযোগ্য জিনিস নিয়ে কথা বলছি।

আজকের প্রশ্নটা সহজ শোনায় কিন্তু এর উত্তরে পুরো cloud industry-র architecture লুকিয়ে আছে:

একটা hypervisor ঠিক কোথায় বসে — hardware-এর উপরে সরাসরি, নাকি আরেকটা OS-এর উপরে?

এই একটা প্রশ্নের উত্তর থেকেই জন্ম নেয় Type-1 (bare-metal) আর Type-2 (hosted) — এই দুইটা নাম, যা প্রতিটা cloud provider, প্রতিটা desktop virtualization পণ্যের ডকুমেন্টেশনে বারবার আসবে। আর লেসনের শেষে আমরা দেখব একটা তৃতীয়, অস্বস্তিকরভাবে বাস্তব কেস — KVM — যেটা এই সুন্দর দ্বিভাজনকে প্রায় ভেঙে দেয়।

মূল ধারণা

Hypervisor — তাত্ত্বিক VMM-এর বাস্তব শরীর

সংজ্ঞা দিয়ে শুরু করি। Hypervisor (বা VMM) হলো সেই সফটওয়্যার স্তর যা এক বা একাধিক guest (অতিথি অপারেটিং সিস্টেম)-কে virtualized hardware দেখায়, আর সেই guest-গুলোর মধ্যে physical hardware ভাগ করে দেয় — CPU সময়, memory, disk, নেটওয়ার্ক — নিরাপদভাবে, প্রতিটা guest-কে বিশ্বাস করিয়ে যে সে একাই পুরো মেশিনের মালিক।

Hypervisor-এর কাজ মূলত তিনটা:

  1. CPU virtualization — একটা guest vCPU-কে কখন সত্যিকারের physical CPU-তে চালানো হবে তা ঠিক করা (scheduling), আর sensitive instruction-গুলো নিরাপদে trap/emulate করা।
  2. Memory virtualization — প্রতিটা guest-কে তার নিজের, isolated physical-মনে-হওয়া address space দেওয়া (guest physical address থেকে host physical address-এ অনুবাদ — nested/second-level page table-এর মাধ্যমে, যা virtualization-theory লেসনের memory virtualization অংশের সরাসরি সম্প্রসারণ)।
  3. I/O virtualization — disk, নেটওয়ার্ক কার্ড-এর মতো device-গুলোর virtual সংস্করণ guest-কে দেখানো, আর প্রকৃত হার্ডওয়্যারে multiplex করা।

কিন্তু এই তিনটা কাজ কোথায় বসে করা হয় — এইখানেই দুইটা মৌলিকভাবে ভিন্ন architectural সিদ্ধান্ত সম্ভব।

Type-1 — Bare-Metal Hypervisor

Type-1 hypervisor সরাসরি hardware-এর উপর চলে — কোনো general-purpose host OS নেই তার নিচে। Hypervisor নিজেই সবচেয়ে privileged layer, privilege-ring লেসনের ভাষায় বললে, hypervisor নিজেই ring 0 (বা x86-এ VT-x-এর root mode)-এ বসে থাকে। Guest OS-গুলো তার উপরে, কম privilege-এ চলে।

Datacenter আর cloud provider-এরা প্রায় সবসময় Type-1 ব্যবহার করে, দুইটা কারণে — performance (guest সরাসরি hypervisor-এর কাছে, মাঝে কোনো অতিরিক্ত OS নেই) আর কম attack surface (একটা সম্পূর্ণ general-purpose OS — যার নিজস্ব হাজারো driver, service, security bug থাকতে পারে — hypervisor-এর নিচে নেই, compromise করার মতো কম জায়গা)।

Type-2 — Hosted Hypervisor

Type-2 hypervisor একটা প্রচলিত host OS-এর উপরে, একটা সাধারণ application হিসেবে চলে। Host OS (Windows, Linux, বা macOS) hypervisor প্রোগ্রামটাকে ঠিক অন্য যেকোনো প্রোগ্রামের (browser, text editor) মতোই দেখে — schedule করে, memory দেয়, file descriptor দেয়।

Desktop developer-দের কাছে Type-2 প্রিয়, কারণ ইনস্টল করা সহজ — কোনো bare-metal বুট প্রক্রিয়া নেই, আপনার আগে থেকেই ব্যবহার করা ল্যাপটপে ঠিক একটা সাধারণ software-এর মতো নামিয়ে চালানো যায়। কিন্তু এই সুবিধার একটা দাম আছে, যা পরের অংশে আমরা precisely পরিমাপ করব।

একনজরে

Type-1 (bare-metal)Type-2 (hosted)
নিচে কী আছেসরাসরি hardwareএকটা host OS
কে সবচেয়ে privilegedhypervisor নিজেইhost OS (hypervisor তার নিচে একটা process মাত্র)
উদাহরণXen, VMware ESXi, Hyper-VVirtualBox, VMware Workstation, Parallels
সাধারণ ব্যবহারDatacenter, cloud providerDeveloper laptop, desktop testing

এই টেবিলটাই এই পুরো লেসনের কঙ্কাল — বাকি অংশগুলো এই প্রতিটা সারিকে গভীরে নিয়ে যাবে, সংখ্যা আর বাস্তব উদাহরণ দিয়ে।

ভেতরে কী ঘটছে

ভেতরে কী ঘটছে — scheduling-এর একটা অতিরিক্ত hop

দুই ধরনের hypervisor-এর সবচেয়ে গুরুত্বপূর্ণ পার্থক্যটা বোঝার সবচেয়ে ভালো উপায় হলো একটা প্রশ্ন জিজ্ঞেস করা: যখন একটা guest vCPU চালানোর সময় আসে, ঠিক কে সিদ্ধান্ত নেয় “এখন” চালানো হবে?

Type-1-এ — একটা মাত্র সিদ্ধান্তকারী

Type-1 hypervisor নিজেই সেই সিদ্ধান্ত নেয়। Hypervisor-এর নিজস্ব একটা scheduler আছে (Xen-এর ক্ষেত্রে যাকে বলা হয় Credit Scheduler, বা তার উত্তরসূরি) — এই scheduler সরাসরি জানে কোন physical CPU core খালি আছে, কোন guest vCPU-র পালা, আর সরাসরি hardware-এ সেই vCPU-কে চালিয়ে দেয়। মাঝে কোনো দ্বিতীয় scheduling স্তর নেই।

Type-1-এ একটা guest vCPU চালানোর সিদ্ধান্ত — একটাই hop
  1. GUESTvCPU রান করার জন্য প্রস্তুত (runnable)
  2. HYPERVISOR SCHEDULERসরাসরি সিদ্ধান্ত: কোন physical core-এ, কখন — Xen Credit Scheduler-এর মতো
  3. HARDWAREVMRESUME/vmrun (VT-x/AMD-V) — vCPU সরাসরি চলা শুরু করে

Type-2-এ — দুইটা সিদ্ধান্তকারী, ক্রমানুসারে

Type-2 hypervisor-এ ছবিটা মৌলিকভাবে ভিন্ন। Hypervisor প্রোগ্রামটা (VirtualBox-এর VBoxHeadless, বা VMware Workstation-এর vmware-vmx) host OS-এর দৃষ্টিতে শুধুই আরেকটা process (বা thread-এর সেট)। যখন সেই hypervisor process একটা guest vCPU চালাতে চায়, তাকে প্রথমে নিজেই host OS-এর scheduler-এর কাছে পালা পেতে হয় — ঠিক আপনার ব্রাউজার বা টেক্সট এডিটরের মতো, CPU সময়ের জন্য প্রতিযোগিতা করে।

Type-2-এ একটা guest vCPU চালানোর সিদ্ধান্ত — দুইটা hop
  1. GUESTvCPU রান করার জন্য প্রস্তুত (runnable)
  2. HYPERVISOR-এর নিজস্ব schedulerhypervisor প্রোগ্রামের ভেতরে ঠিক করে কোন vCPU-র পালা
  3. HOST OS SCHEDULERকিন্তু hypervisor process নিজেই এখন host OS-এর কাছে CPU time চাইছে — অন্য সব host process-এর সাথে প্রতিযোগিতায়
  4. HARDWAREhost OS hypervisor process-কে run queue-তে বসায়, তারপর VMRESUME/vmrun চলে

লক্ষ্য করুন — Type-2-এ একই কাজের জন্য দুইটা scheduling সিদ্ধান্ত লাগে: হাইপারভাইজরের নিজস্ব guest-scheduling সিদ্ধান্ত, তারপর host OS-এর process-scheduling সিদ্ধান্ত। একে বলা হয় double scheduling। এই দ্বিতীয় hop-টাই এই লেসনের build অংশে আমরা সংখ্যায় পরিমাপ করব।

Privilege-এর দিক থেকেও পার্থক্য

privilege-ring-এর ভাষায় বললে: Type-1-এ hypervisor নিজেই সবচেয়ে privileged কোড (host root mode-এ), guest OS তার নিচে। Type-2-এ host OS সবচেয়ে privileged (kernel-এর ring 0), hypervisor প্রোগ্রামটা সাধারণ user-space প্রোগ্রামের মতোই ring 3-এ শুরু হয় — তারপর CPU-র hardware virtualization extension (VT-x/AMD-V) ব্যবহার করে সাময়িকভাবে guest mode-এ ঢোকে, কিন্তু hypervisor process নিজে host kernel-এর কাছে privilege ধার করেই এই কাজ করে, system-call-এর মতোই একটা ioctl-ভিত্তিক ইন্টারফেসের মাধ্যমে (/dev/kvm-এর মতো device node)।

KVM — যেখানে সীমারেখা ঝাপসা হয়ে যায়

এখানেই একটা সৎ, honestly-blurry কেস আসে। KVM (Kernel-based Virtual Machine) Linux kernel-এর একটা module — এটা Linux kernel নিজেকেই একটা hypervisor বানিয়ে দেয়। KVM লোড হওয়ার পর, Linux kernel নিজেই CPU-র VT-x/AMD-V hardware virtualization mode ব্যবহার করতে পারে, guest vCPU সরাসরি চালাতে পারে।

কিন্তু guest VM-গুলো বাস্তবে চলে QEMU নামের একটা userspace process হিসেবে (প্রতিটা guest vCPU একটা Linux thread) — যেটা /dev/kvm device-এর মাধ্যমে kernel-এর KVM module-কে বলে “এই vCPU-টা এখন চালাও”। তাহলে প্রশ্ন: এটা কি Type-1, নাকি Type-2?

কেন KVM-এর performance profile Type-1-এর কাছাকাছি, superficial চেহারা সত্ত্বেও: double-scheduling সমস্যাটার মূল কারণ ছিল — hypervisor-এর guest-scheduling সিদ্ধান্ত host OS scheduler-এর কাছে অদৃশ্য, তাই host OS আবার নতুন করে সিদ্ধান্ত নেয় (এবং ভুল করতে পারে — priority না জেনে)। KVM-এ এই সমস্যা নেই, কারণ KVM নিজেই Linux kernel-এর অংশ — guest vCPU thread-কে schedule করার সিদ্ধান্ত সরাসরি Linux-এর নিজস্ব process scheduler (CFS/EEVDF) নেয়, আর KVM module সেই একই kernel-এর ভেতর থেকে hardware virtualization instruction চালায়। এখানে আলাদা দুইটা scheduler নেই যারা একে অপরকে না জেনে কাজ করছে — একটাই scheduler (Linux-এর নিজের), যেটা সরাসরি hardware-accelerated ভাবে guest চালানোর ক্ষমতা রাখে। তাই architecturally, KVM “hosted” দেখতে হলেও, কর্মক্ষমতার দিক থেকে এটা Type-1-এর precision আর overhead প্রোফাইলের অনেক কাছাকাছি — এই কারণেই আজকের বেশিরভাগ বড় cloud provider (Google Compute Engine, OpenStack-ভিত্তিক প্রোডাকশন ক্লাউড) production workload-এ নির্দ্বিধায় KVM ব্যবহার করে, “hosted” নামের পুরনো দুর্বল ভাবমূর্তি সত্ত্বেও।

উদাহরণ

বাস্তব পণ্যের নাম আর সংখ্যায় trade-off

নিচের টেবিল দুইটা ধরনের hypervisor-এর মধ্যে চারটা ব্যবহারিক মাত্রায় পার্থক্য দেখায় — এগুলো কোনো নির্দিষ্ট বেঞ্চমার্ক সংখ্যা না, বরং architectural কারণ থেকে সরাসরি অনুসৃত সাধারণ, বহুল-স্বীকৃত পর্যবেক্ষণ।

মাত্রাType-1 (bare-metal)Type-2 (hosted)কারণ (আগের অংশ থেকে)
Attack surfaceছোটবড়Type-1-এ compromise করার মতো কোনো general-purpose host OS নেই; Type-2-তে পুরো host OS-ই (browser, filesystem driver, network stack-সহ) সম্ভাব্য দুর্বলতার তালিকায় যোগ হয়
Performanceভালো (কম overhead)কিছুটা কম (double scheduling-এর দাম)hood অংশের দুই-hop বনাম এক-hop scheduling পার্থক্য
Ease of use / ইনস্টলেশনকঠিন (আলাদা বুট প্রক্রিয়া, dedicated hardware)সহজ (আর দশটা app-এর মতো ইনস্টল)Type-1-কে মেশিনের একমাত্র বুট-স্তর হতে হয়; Type-2 বিদ্যমান OS-এর ছাদের নিচে বসে
সাধারণ deploymentProduction cloud/datacenter (AWS, Azure, GCP-এর নিচের স্তর)Developer laptop, desktop testing, demoব্যবহারের প্রেক্ষাপটই সিদ্ধান্ত ঠিক করে — নির্ভরযোগ্যতা/ঘনত্ব বনাম সুবিধা

Type-1 প্রকৃত উদাহরণ:

  • Xen — open-source, ২০০৩ সাল থেকে, AWS-এর প্রথম প্রজন্মের EC2 hypervisor ছিল এটাই। Domain-0 (Dom0) নামের একটা বিশেষ, privileged guest ব্যবহার করে যেটা device driver চালায়, বাকি সব guest (“DomU”) তার সমান্তরালে, কম privilege-এ চলে।
  • VMware ESXi — VMware-এর নিজস্ব, minimalist “vmkernel” — একটা সরু, virtualization-নির্দিষ্ট kernel, কোনো সাধারণ OS-এর ভারী feature সেট বহন করে না। vSphere-এর ভিত্তি।
  • Microsoft Hyper-V — Windows Server-এর সাথে built-in, কিন্তু আর্কিটেকচারালি Type-1-ই — বুট হওয়ার পর একটা পাতলা hypervisor স্তর সবার নিচে বসে, এমনকি Windows-এর নিজস্ব management OS-ও (root partition) তার উপরে, একটা বিশেষ guest হিসেবে চলে।

Type-2 প্রকৃত উদাহরণ:

  • Oracle VirtualBox — free, cross-platform, শিক্ষা ও দ্রুত পরীক্ষার জন্য সবচেয়ে জনপ্রিয় পছন্দ।
  • VMware Workstation / Fusion — Workstation (Windows/Linux), Fusion (macOS) — professional desktop virtualization।
  • Parallels Desktop — macOS-এ, বিশেষভাবে Apple Silicon (ARM64)-এ Windows-on-ARM চালানোর জন্য জনপ্রিয়।
  • পুরনো QEMU (KVM acceleration ছাড়া) — pure software emulation mode-এ QEMU একটা সাধারণ host process, কোনো hardware-accelerated privileged অংশ ছাড়াই পুরো CPU-কে software-এ instruction-by-instruction অনুকরণ করে — সবচেয়ে ধীর কিন্তু সবচেয়ে flexible (ভিন্ন ISA-ও অনুকরণ করতে পারে, যেমন x86 হোস্টে ARM guest)।

ছবিতে

ছবিতে — তিনটা স্ট্যাক পাশাপাশি

┌───────────────┬───────────────┐
│   Guest VM 1  │   Guest VM 2  │   ← OS + apps, প্রতিটা isolated
│  (OS + apps)  │  (OS + apps)  │
├───────────────┴───────────────┤
│      HYPERVISOR (Type-1)       │   ← Xen / ESXi / Hyper-V
│   (নিজেই সবচেয়ে privileged)    │      — hardware সরাসরি নিয়ন্ত্রণ করে
├────────────────────────────────┤
│            HARDWARE             │
└────────────────────────────────┘
Type-1: hypervisor নিজেই সবচেয়ে নিচের, সবচেয়ে privileged স্তর।
┌───────────────┬───────────────┐
│   Guest VM 1  │   Guest VM 2  │
│  (OS + apps)  │  (OS + apps)  │
├───────────────┴───────────────┤
│   HYPERVISOR (Type-2, একটা app)│   ← VirtualBox / Workstation / Parallels
├────────────────────────────────┤
│             HOST OS              │   ← Windows / Linux / macOS
│   (এই স্তরই সবচেয়ে privileged)   │      hypervisor-কে অন্য app-এর মতোই schedule করে
├────────────────────────────────┤
│            HARDWARE             │
└────────────────────────────────┘
Type-2: hypervisor host OS-এর নিচে, একটা সাধারণ process হিসেবে।
┌───────────────┬───────────────┐
│   Guest VM 1  │   Guest VM 2  │
├───────────────┴───────────────┤
│  qemu-kvm processes (userspace)│   ← device emulation, প্রাথমিক সেটআপ
├────────────────────────────────┤
│   LINUX KERNEL + KVM module     │   ← privileged, VMRESUME/vmrun এখানেই চলে
│   (একই স্তর — 'host OS' এবং      │      "hypervisor" স্তর আলাদা করা যায় না
│    'Type-1 hypervisor' একসাথে)  │
├────────────────────────────────┤
│            HARDWARE             │
└────────────────────────────────┘
KVM: Linux kernel নিজেই hypervisor — 'host OS' আর 'Type-1 layer' একই স্তরে মিশে গেছে।

তিনটা ছবি পাশাপাশি রাখলে blur-টা visually স্পষ্ট হয় — প্রথম দুইটাতে একটা পরিষ্কার, আলাদা “hypervisor” বাক্স আছে; তৃতীয়টায় সেই বাক্স আর “host OS” বাক্স একই জায়গায় মিশে গেছে।

নিজে চালিয়ে দেখুন

EXPERIMENT

আপনার নিজের মেশিনে hardware virtualization support যাচাই করুন

macOS (Apple Hypervisor.framework) অথবা Linux (VT-x/AMD-V + KVM)· ৫ মিনিট

macOS-এ (Apple Silicon বা Intel Mac) নিজের sysctl দিয়ে সরাসরি চেক করা যায় Apple-এর নিজস্ব Hypervisor.framework সাপোর্ট করছে কি না — এই framework-এর উপরেই macOS-এ Docker Desktop, UTM, আর কিছু Type-2 hypervisor-এর acceleration layer দাঁড়িয়ে থাকে:

sysctl kern.hv_support

এই মেশিনে সত্যিকারের রান করা আউটপুট:

kern.hv_support: 1

1 মানে হার্ডওয়্যার virtualization সাপোর্ট চালু আছে — এই মেশিনে চাইলে একটা hardware-accelerated Type-2 hypervisor (Parallels, UTM, বা Docker Desktop-এর ভেতরের লিনাক্স VM) কোনো software-emulation fallback ছাড়াই চলতে পারবে। 0 পেলে বুঝবেন হয় CPU সাপোর্ট করে না, অথবা আপনি নিজে একটা nested VM-এর ভেতরে আছেন যেখানে এই bit exposed করা হয়নি।

Linux-এ সমতুল্য চেক দুই ধাপে — প্রথমে CPU-র নিজস্ব extension flag, তারপর KVM module লোড আছে কি না:

egrep -c '(vmx|svm)' /proc/cpuinfo
lsmod | grep kvm

প্রত্যাশিত ফলাফলের ধরন (নির্দিষ্ট মেশিনভেদে বদলাবে, তাই এই সংখ্যাগুলো illustrative — এই সেশনের sandbox macOS হওয়ায় সরাসরি চালানো যায়নি):

$ egrep -c '(vmx|svm)' /proc/cpuinfo
8                          # প্রতিটা logical CPU-তে ১ করে গোনা — Intel VT-x (vmx) বা AMD-V (svm)

$ lsmod | grep kvm
kvm_intel             infoবার্তা   0
kvm                   infoবার্তা   1 kvm_intel

vmx/svm না থাকলে (সংখ্যা 0) — বা virtual machine-এর ভেতরে “nested virtualization” চালু না থাকলে — KVM module লোডই হবে না, আর কোনো hardware-accelerated hypervisor (Type-1 বা Type-2, দুটোই) সেই মেশিনে hardware-accelerated ভাবে চলতে পারবে না, শুধু ধীর, pure-software emulation (পুরনো QEMU-mode) সম্ভব থাকবে — এটাই এই লেসনের “hardware extension সব hypervisor-এর সাধারণ ভিত্তি” দাবিটার সরাসরি প্রমাণ।

এটা কী প্রমাণ করে

যেকোনো hypervisor — Type-1 বা Type-2, নিচে যাই থাকুক — শেষ পর্যন্ত CPU-র hardware virtualization extension-এর উপর নির্ভর করে; এই extension না থাকলে বা বন্ধ থাকলে কোনো hypervisor-ই hardware-accelerated ভাবে চলতে পারবে না।

নিজে বানান

BUILD IT

Double-Scheduling Overhead — একটা toy latency simulation

Python · ●●○○○
  1. Type-1 মডেল করুন — প্রতিটা guest scheduling event-এ একটাই সিদ্ধান্তকারী hop: hypervisor-এর নিজস্ব scheduler
  2. Type-2 মডেল করুন — একই hypervisor-decision hop, প্লাস একটা বাড়তি host-OS-scheduler hop; এলোমেলোভাবে (probability দিয়ে) মডেল করুন host OS মাঝেমধ্যে ব্যস্ত থাকায় hypervisor process-কে অতিরিক্ত অপেক্ষা করতে হয়
  3. হাজার হাজার scheduling switch simulate করে দুই মডেলের মোট সময় (wall time) তুলনা করুন
  4. শতাংশে অতিরিক্ত overhead হিসাব করুন — এটাই "hosted মডেলের দাম" সংখ্যায়

এই simulation-টা toy — বাস্তব hypervisor-এর scheduler-এর জটিলতা (priority, fairness, NUMA affinity) এখানে নেই। উদ্দেশ্য শুধু একটা জিনিস দেখানো: একটা বাড়তি scheduling hop, যতই দ্রুত হোক না কেন, শূন্য না — আর সেই hop যখন লক্ষ লক্ষ বার ঘটে (প্রতিটা context switch-এ), সেই ছোট দাম যোগ হয়ে একটা measurable শতাংশে পরিণত হয়।

import random


def simulate_type1(num_vms, switches_per_vm,
                    hv_decision_us=2.0, vm_entry_exit_us=3.0):
    """Type-1: hypervisor scheduler সরাসরি hardware-কে বলে।
    একটাই সিদ্ধান্তকারী hop প্রতি switch-এ।"""
    total_switches = num_vms * switches_per_vm
    total_time_us = total_switches * (hv_decision_us + vm_entry_exit_us)
    return total_time_us, total_switches


def simulate_type2(num_vms, switches_per_vm,
                    hv_decision_us=2.0, vm_entry_exit_us=3.0,
                    host_os_decision_us=2.5, host_contention_prob=0.15,
                    host_contention_penalty_us=9.0, seed=42):
    """Type-2: একই hypervisor-level সিদ্ধান্ত, প্লাস প্রতিটা guest
    scheduling request-কে host OS-এর নিজস্ব process scheduler-ও পার
    হতে হয় (hypervisor process, host kernel-এর চোখে, ঠিক আর দশটা
    process-এর মতোই)। কিছু শতাংশ সময় host OS-এর run queue অন্য
    host-level কাজে ব্যস্ত থাকে, তখন hypervisor process-কে অতিরিক্ত
    অপেক্ষা করতে হয়।"""
    random.seed(seed)
    total_switches = num_vms * switches_per_vm
    total_time_us = 0.0
    contended = 0
    for _ in range(total_switches):
        t = hv_decision_us + vm_entry_exit_us + host_os_decision_us
        if random.random() < host_contention_prob:
            t += host_contention_penalty_us
            contended += 1
        total_time_us += t
    return total_time_us, total_switches, contended


NUM_VMS = 8
SWITCHES_PER_VM = 10_000

t1_time_us, t1_switches = simulate_type1(NUM_VMS, SWITCHES_PER_VM)
t2_time_us, t2_switches, t2_contended = simulate_type2(NUM_VMS, SWITCHES_PER_VM)

overhead_pct = (t2_time_us - t1_time_us) / t1_time_us * 100

print(f"guest VMs                    : {NUM_VMS}")
print(f"scheduling switches per VM    : {SWITCHES_PER_VM}")
print(f"total scheduling switches     : {t1_switches}")
print()
print(f"Type 1 (bare-metal) total time : {t1_time_us / 1000:.2f} ms")
print(f"Type 1 avg latency / switch     : {t1_time_us / t1_switches:.3f} us")
print()
print(f"Type 2 (hosted) total time      : {t2_time_us / 1000:.2f} ms")
print(f"Type 2 avg latency / switch      : {t2_time_us / t2_switches:.3f} us")
print(f"Type 2 switches hitting host contention : "
      f"{t2_contended} ({t2_contended / t2_switches * 100:.1f}%)")
print()
print(f"Extra wall-clock overhead from the second scheduling hop: "
      f"{overhead_pct:.1f}%")

সত্যিকারের রান করা আউটপুট (এই কোডটাই অবিকল, python3 দিয়ে চালানো):

guest VMs                    : 8
scheduling switches per VM    : 10000
total scheduling switches     : 80000

Type 1 (bare-metal) total time : 400.00 ms
Type 1 avg latency / switch     : 5.000 us

Type 2 (hosted) total time      : 709.89 ms
Type 2 avg latency / switch      : 8.874 us
Type 2 switches hitting host contention : 12210 (15.3%)

Extra wall-clock overhead from the second scheduling hop: 77.5%

সংখ্যাগুলো কী বলছে: এই toy মডেলে প্রতি switch-এ mandatory বাড়তি hop (host_os_decision_us = 2.5) একাই প্রায় ৫০% overhead যোগ করত (৫.০ থেকে ৭.৫ us); বাকি অতিরিক্ত ২৭.৫ শতাংশ পয়েন্ট আসছে contention থেকে — যখন host OS-এর run queue অন্য কাজে ব্যস্ত থাকে (এখানে ১৫% সম্ভাবনায় মডেল করা), hypervisor process বাড়তি অপেক্ষায় পড়ে। এই দ্বিতীয় উৎসটাই সবচেয়ে গুরুত্বপূর্ণ শিক্ষা — Type-2-এর দাম শুধু “একটা নির্দিষ্ট বাড়তি constant” না, এটা host-এর অন্য workload-এর উপর নির্ভরশীল, অনিয়মিত একটা দাম। একটা idle ল্যাপটপে Type-2 overhead কম মনে হতে পারে, কিন্তু একই ল্যাপটপে ভারী host workload চললে সেই overhead অপ্রত্যাশিতভাবে বেড়ে যায় — production datacenter যেখানে predictable, consistent latency জরুরি, সেখানে এটাই Type-1 পছন্দ করার একটা মূল, পরিমাপযোগ্য কারণ।

নিজে চেষ্টা করুন: host_contention_prob বাড়িয়ে (যেমন 0.4, একটা ব্যস্ত host সিমুলেট করতে) আবার চালান — overhead শতাংশ কীভাবে বদলায় দেখুন। তারপর host_contention_prob = 0.0 করে দেখুন — তখনও একটা positive overhead থেকে যাবে কেন, সেটা ব্যাখ্যা করতে পারবেন কি (ইঙ্গিত: host_os_decision_us টার্মটা তখনও আছে)।

বাস্তব সিস্টেমে

বাস্তব সিস্টেমে — কে কোথায় কী ব্যবহার করে

  • Amazon EC2 — প্রথম প্রজন্মে (২০০৬ থেকে) সরাসরি Xen (Type-1) ব্যবহার করত। ২০১৭-এর পর থেকে AWS নিজস্ব Nitro System-এ সরে গেছে — সেখানে হাইপারভাইজর স্তরটা অনেকটাই বিশেষায়িত হার্ডওয়্যার (Nitro card)-এ সরিয়ে দেওয়া হয়েছে, যা এই Type-1/Type-2 আলোচনার আরেক ধাপ এগিয়ে (hypervisor আর hardware-এর সীমারেখাও ঝাপসা করে) — কিন্তু মূল নীতি একই: guest-এর যতটা সম্ভব কম, সরাসরি সিদ্ধান্তকারী স্তরের মধ্য দিয়ে যাওয়া।

  • Google Compute Engine — KVM-ভিত্তিক, একটা কাস্টমাইজড, hardened Linux/KVM স্ট্যাক প্রোডাকশনে চালায় — এই লেসনের “KVM ঝাপসা কিন্তু performance-এ Type-1-এর কাছাকাছি” দাবির একটা বড়, বাস্তব প্রমাণ।

  • Microsoft Azure — Hyper-V-ভিত্তিক (Type-1), Windows Server ecosystem-এর সাথে গভীরভাবে সংযুক্ত।

  • OpenStack (open-source cloud প্ল্যাটফর্ম) — ডিফল্টভাবে KVM ব্যবহার করে, হাজার হাজার প্রাইভেট ও পাবলিক ক্লাউড ডিপ্লয়মেন্টে।

  • VMware vSphere/ESXi — এন্টারপ্রাইজ প্রাইভেট ডেটাসেন্টারের ঐতিহাসিক ও এখনো ব্যাপক পছন্দ, বিশেষত যেখানে VMware-এর management tooling (vCenter, vMotion) গুরুত্বপূর্ণ।

  • Docker Desktop (macOS/Windows) — ভেতরে আসলে একটা লুকানো Linux VM চালায় (কারণ Docker native-ভাবে Linux kernel namespace/cgroup-এর উপর নির্ভর করে, যা macOS/Windows-এ নেই) — এই VM-টা macOS-এ Apple-এর Hypervisor.framework (Type-2-ধাঁচের, host OS-নির্ভর) ব্যবহার করে চলে, ঠিক এই লেসনের experiment অংশে যাচাই করা kern.hv_support-এর উপর দাঁড়িয়ে।

  • Apple Silicon-এ Parallels/UTM — ARM64 hardware virtualization extension ব্যবহার করে Windows-on-ARM বা Linux guest চালায় — Type-2-এর “developer সুবিধা” দর্শনের আধুনিক, ARM-যুগের ধারাবাহিকতা।

  • ঐতিহাসিক প্রেক্ষাপট — ১৯৭০-এর দশকে IBM-এর VM/370 ছিল প্রথম বাণিজ্যিক Type-1 hypervisor-এর অন্যতম — mainframe hardware-এর উপর সরাসরি বসে একাধিক OS instance চালাত, আজকের datacenter virtualization-এর ধারণাগত পূর্বপুরুষ। VirtualBox-এর মতো Type-2 প্রোডাক্ট ২০০০-এর দশকে জনপ্রিয় হয় x86 desktop hardware-এ virtualization extension আসার পর।

যে ভুলগুলো সবাই করে

“Type-1 hypervisor মানেই দ্রুত, Type-2 মানেই ধীর — তাই datacenter সবসময় Type-1, ব্যক্তিগত ব্যবহার সবসময় Type-2।”

সাধারণ প্রবণতা সত্যি, কিন্তু “সবসময়” শব্দটা ভুল — KVM-ই এর সবচেয়ে বড় ব্যতিক্রম। KVM superficially Type-2-এর মতো দেখতে (guest একটা userspace process, “host OS” আছে), কিন্তু hood অংশে দেখানো হয়েছে কেন এর performance profile Type-1-এর কাছাকাছি — কারণ hypervisor-এর privileged অংশটা host kernel-এরই অংশ, আলাদা দুইটা not-aware-of-each-other scheduler নেই। তাই Google Compute Engine-এর মতো বড় production cloud নির্দ্বিধায় KVM (গঠনে Type-2-ধাঁচের) ব্যবহার করে। সিদ্ধান্তটা লেবেলের (Type-1/Type-2) উপর না, বাস্তব architecture-এর (double scheduling আছে কি না) উপর নির্ভর করা উচিত।

“Type-1 hypervisor একটা সম্পূর্ণ, স্বাধীন অপারেটিং সিস্টেম যেটা নিজে থেকে বুট হয় — একটা সাধারণ OS-এর সবকিছুই তার আছে, শুধু hypervisor feature যোগ করা।”

উল্টো — Type-1 hypervisor ইচ্ছাকৃতভাবে সরু (minimal)। VMware ESXi-এর “vmkernel” একটা সাধারণ, general-purpose OS-এর মতো না — এতে ব্যবহারকারীর জন্য shell, browser, বা হাজারো driver নেই; শুধু virtualization-এর জন্য যা দরকার (CPU/memory/IO multiplexing, scheduler) তাই আছে। এই সরুত্বই attack surface কমানোর মূল কৌশল — যত কম কোড privileged স্তরে চলে, তত কম জায়গা compromise করার। Xen-এও মূল hypervisor অংশ (xen.gz) নিজে অত্যন্ত ছোট; বেশিরভাগ device driver আসলে Dom0 নামের একটা বিশেষ, সাধারণ Linux-ভিত্তিক guest-এ থাকে, hypervisor-এর ভেতরে না — hypervisor নিজেকে যতটা সম্ভব ছোট রাখার আরেকটা প্রকৌশলগত সিদ্ধান্ত।

“যেহেতু Type-2 hypervisor host OS-এর 'ভেতরে' চলে, guest VM host OS-এর filesystem, process list ইত্যাদি সরাসরি দেখতে পারে — isolation দুর্বল।”

এটা double scheduling-এর সাথে isolation-কে গুলিয়ে ফেলছে — দুইটা সম্পূর্ণ আলাদা বিষয়। Double scheduling performance-এর প্রশ্ন (হার্ডওয়্যার সিদ্ধান্তের জন্য কতটা hop লাগে), কিন্তু isolation (guest host-এর ফাইল/প্রসেস দেখতে পারবে কি না) নির্ভর করে hardware virtualization extension আর hypervisor-এর memory/CPU virtualization বাস্তবায়নের উপর — যা Type-1 আর Type-2 দুটোতেই সমানভাবে কঠোর হতে পারে। একটা ভালোভাবে বাস্তবায়িত Type-2 hypervisor (VirtualBox, VMware Workstation)-ও guest-কে host-এর ফাইল সিস্টেম বা প্রসেস দেখতে দেয় না — isolation guarantee টা VMM-এর equivalence/resource-control সংজ্ঞা (আগের লেসন) থেকেই আসে, Type-1/Type-2 বিভাজন থেকে না। (Shared folder-এর মতো ফিচার থাকতে পারে, কিন্তু সেটা ইচ্ছাকৃত, explicit configuration — accidental leak না।)

বুঝেছেন কি না দেখুন

1

Type-1 আর Type-2 hypervisor-এর মধ্যে সবচেয়ে মৌলিক architectural পার্থক্যটা এক বাক্যে বলুন।

স্মরণ

Type-1 সরাসরি hardware-এর উপর, নিজেই সবচেয়ে privileged স্তর হিসেবে চলে (কোনো host OS নেই তার নিচে); Type-2 একটা প্রচলিত host OS-এর উপরে, host OS-এর দৃষ্টিতে একটা সাধারণ application/process হিসেবে চলে।

2

“Double scheduling” ঠিক কী, আর এটা কেন শুধু Type-2-তেই ঘটে, Type-1-এ না?

যুক্তি

Double scheduling মানে একটা guest vCPU চালানোর জন্য দুইটা আলাদা, ক্রমিক scheduling সিদ্ধান্ত লাগা — প্রথমে hypervisor নিজের ভেতরে ঠিক করে কোন vCPU-র পালা, তারপর hypervisor প্রোগ্রামটাকে (একটা host process হিসেবে) host OS-এর নিজস্ব scheduler-এর কাছে আবার CPU সময়ের জন্য পালা পেতে হয়। Type-1-এ এই দ্বিতীয় স্তরটাই নেই — hypervisor নিজেই সবচেয়ে privileged, hardware-এর সবচেয়ে কাছের স্তর, তাই তার সিদ্ধান্ত নেওয়ার পর কাউকে আর অনুমতি চাইতে হয় না।

3

একজন সহকর্মী দাবি করছেন, “KVM স্পষ্টভাবে Type-2, কারণ guest VM একটা সাধারণ Linux process (QEMU) হিসেবে চলে।” এই যুক্তির দুর্বলতা কোথায়?

যুক্তি

যুক্তিটা শুধু userspace-এর অংশটুকু (QEMU process) দেখছে, কিন্তু আসল privileged, hardware-accelerated virtualization কাজ (VMRESUME/vmrun চালানো, nested page table হ্যান্ডল করা) হয় KVM module-এর মধ্যে, যা Linux kernel-এরই অংশ, ring 0-এ। এখানে “guest-scheduling সিদ্ধান্ত” আর “host-scheduling সিদ্ধান্ত” আলাদা দুইটা not-aware-of-each-other স্তর না — Linux-এর নিজস্ব process scheduler-ই সরাসরি guest vCPU thread schedule করে, আর একই kernel-এর মধ্যে hardware-accelerated ভাবে সেই vCPU চালায়। তাই architecture-এ hosted-এর মতো দেখতে হলেও, double-scheduling-এর প্রকৃত সমস্যা (দুইটা আলাদা, একে অপরকে না-জানা scheduler) এখানে নেই — এই কারণেই এটা একটা honestly-ঝাপসা কেস, “স্পষ্টভাবে Type-2” বলাটা অতিসরলীকরণ।

4

Build অংশের simulation-এ host_contention_prob কে 0.0-তে সেট করলেও Type-2-এর সময় Type-1-এর চেয়ে বেশিই থাকবে। কেন — কোন টার্মটা তখনও পার্থক্য তৈরি করছে?

প্রয়োগ

host_os_decision_us (host OS scheduler-এর নিজস্ব, fixed সিদ্ধান্ত-খরচ) — এই টার্মটা host_contention_prob-এর থেকে সম্পূর্ণ স্বাধীন, প্রতিটা switch-এই যোগ হয়, host ব্যস্ত থাকুক বা না থাকুক। এটাই double scheduling-এর “mandatory, অপরিহার্য” অংশ — শুধু host busy থাকলে বাড়তি penalty (host_contention_penalty_us) আসে, কিন্তু বাড়তি hop-এর নিজস্ব fixed খরচ কখনোই শূন্য হয় না, কারণ host OS scheduler-কে অন্তত একটা সিদ্ধান্ত (even if instant “yes, run now”) তো নিতেই হয়।

5

একটা financial trading firm-এর latency-sensitive সার্ভার workload-এর জন্য hypervisor বাছতে হবে, যেখানে microsecond-স্তরের predictable latency জরুরি। Type-1 আর Type-2-এর মধ্যে কোনটা, আর কেন — শুধু “Type-1 দ্রুত” না বলে, এই লেসনের নির্দিষ্ট কারণ ব্যবহার করে ব্যাখ্যা করুন।

প্রয়োগ

Type-1 (বা KVM-এর মতো Type-1-প্রোফাইলের hybrid)। কারণ শুধু “গড়ে দ্রুত” না — build অংশের simulation দেখিয়েছে Type-2-এর overhead-এর একটা বড় অংশ contention-নির্ভর, অনিয়মিত (host busy থাকলে বাড়ে)। Financial trading-এর মতো workload-এ যেখানে predictability (consistent, low-variance latency) accuracy-র চেয়েও গুরুত্বপূর্ণ, একটা অনিয়মিত, host-এর অন্য কাজের উপর নির্ভরশীল দ্বিতীয় scheduling hop একদম অগ্রহণযোগ্য — একটা random আরেকটা host process hypervisor-কে সাময়িকভাবে run queue-তে আটকে দিতে পারে, যা tail-latency spike তৈরি করবে। Type-1-এ hypervisor নিজেই সবচেয়ে privileged, predictable single-hop সিদ্ধান্তকারী, তাই এই ধরনের workload-এর জন্য architecturally উপযুক্ত পছন্দ।

6

আপনাকে একটা নতুন cloud provider-এর জন্য hypervisor স্তর ডিজাইন করতে বলা হয়েছে, যেখানে লক্ষ্য: (ক) হাজার হাজার customer VM ঘন সন্নিবিষ্টভাবে (dense) চালানো, (খ) attack surface যতটা সম্ভব ছোট রাখা, (গ) কিন্তু development/debugging টিমের জন্য দ্রুত local iteration-ও দরকার। কীভাবে এই তিনটা লক্ষ্য মেটাতে Type-1/Type-2-এর ধারণা ব্যবহার করবেন?

ডিজাইন

Production fleet-এর জন্য একটা Type-1 বা KVM-ধাঁচের hardened, minimal hypervisor স্তর দরকার — দুইটাই (ক) ঘনত্ব (কম overhead মানে একই hardware-এ বেশি VM) আর (খ) ছোট attack surface (Xen/ESXi-এর মতো সরু hypervisor, বা hardened, stripped-down Linux+KVM) দুটোই দেয়, misconception অংশে দেখানো “সরুত্ব” নীতি অনুসরণ করে — যত কম কোড privileged স্তরে, তত কম compromise-এর জায়গা। কিন্তু development টিমের জন্য পুরো production-গ্রেড stack local ল্যাপটপে বসানো অপ্রয়োজনীয়ভাবে জটিল ও ধীর iteration দেবে — তাদের জন্য একই hypervisor engine-এর (যেমন KVM, যা Linux dev-মেশিনেও পাওয়া যায়) একটা Type-2-ধাঁচের স্থানীয় ব্যবহার (libvirt+QEMU/KVM লোকাল, বা VirtualBox ছোট test-এর জন্য) যথেষ্ট — কারণ ডেভেলপমেন্টে predictable production-grade latency-র চেয়ে দ্রুত setup/teardown বেশি গুরুত্বপূর্ণ। মূল ডিজাইন-নীতি: একই engine (KVM)-কে production-এ Type-1-প্রোফাইলে হার্ডেন করে, dev-এ Type-2-প্রোফাইলে সহজলভ্য রেখে ব্যবহার করা — দুই জগতের সেরাটা, একই underlying প্রযুক্তি দিয়ে।

এরপর কী

এই লেসনে আমরা দেখেছি Xen-এর মতো software hypervisor, বা তাত্ত্বিক trap-and-emulate মডেল, x86-এর Popek-Goldberg violation-এর সাথে সফটওয়্যার কৌশল দিয়ে লড়াই করেছে — Dom0-এর মাধ্যমে device emulation, careful instruction rewriting, বা QEMU-এর pure software instruction emulation। কিন্তু এখনও একটা প্রশ্ন এড়িয়ে গেছি: CPU ভেন্ডর নিজেরাই যখন বুঝলেন virtualization ভবিষ্যতের একটা কেন্দ্রীয় workload, তারা x86-কে কীভাবে নিজে থেকেই virtualization-friendly বানালেন?

পরের লেসনে (hardware-virtualization) আমরা দেখব Intel-এর VT-x আর AMD-এর AMD-V — নতুন CPU instruction আর একটা সম্পূর্ণ নতুন “root/non-root mode” যা ঠিক Popek-Goldberg-এর সেই ভাঙা sensitive-but-not-privileged instruction সমস্যাটা hardware স্তরেই সমাধান করে দেয়, সফটওয়্যার কৌশল ছাড়াই — trap-and-emulate-কে আবার সত্যিকারের সরল, দ্রুত করে তোলে।

আরও পড়ুন

  • Xen Project Software Overview — Xen Project (The Linux Foundation) · Type-1 architecture-এর প্রামাণ্য বর্ণনা — Domain-0, hypervisor layer, guest domain সম্পর্ক
  • Understanding Full Virtualization, Paravirtualization, and Hardware Assist — VMware, Inc. · ESXi-ধাঁচের bare-metal hypervisor আর hardware-assisted virtualization-এর industry-standard পরিচিতি
  • Formal Requirements for Virtualizable Third Generation Architectures — Gerald J. Popek, Robert P. Goldberg — Communications of the ACM 17(7), 1974 · তাত্ত্বিক VMM-এর মূল সংজ্ঞা — এই লেসনের Type-1/Type-2 দুটোই এই সংজ্ঞার বাস্তবায়ন
  • Kernel Virtual Machine (KVM) — Linux KVM Project · KVM-এর 'kernel নিজেই hypervisor' মডেল — hood অংশের blur আলোচনার ভিত্তি