لینوکس ۳۰۵ در ۶۰ شب؛ مجازیسازی و کانتینر با آزمایش و بازیابی
فرض کن باید محیط یک سرویس کوچک را بسازی: بعضی برنامهها kernel مستقل میخواهند، بعضی در کانتینر کافیاند و داده باید بعد از حذف یا خرابی نمونه هم قابل بازیابی باشد. در این مسیر، از انتخاب مدل مجازیسازی به ساخت و ادارهٔ VM و کانتینر میرسیم؛ سپس ساخت image، تنظیم اولین بوت و آزمایشگاه تکرارپذیر را به هم وصل میکنیم.
مبنای تطبیق، اهداف رسمی LPIC-3 Virtualization and Containerization
نسخهٔ 3.0 با کد آزمون 305-300 است؛ این نسخه در ۱۷ مهر ۱۴۰۵ بررسی شد.
این دوره تألیفی و مستقل است و دورهٔ رسمی LPI یا بانک سؤال آزمون نیست.
پیش از برنامهریزی آزمون، نسخهٔ اهداف را دوباره از منبع رسمی بررسی کن.
پیشنیاز و روش مطالعه#
کار با shell، مجوزها، بستهها، systemd، SSH، IP، route و DNS را در حد LPIC-2 بشناس. برای policy دسترسی و TLS، دورهٔ امنیت LPIC-303 مکمل مناسب است. موضوعهای HA و cluster storage این دوره را به مسیر LPIC-306 تبدیل نمیکنند؛ تمرکز روی چرخهٔ یک محیط آزمایشگاهی و تشخیص محدودیتهاست.
برای هر درس حدود ۶۰ تا ۹۰ دقیقه در نظر بگیر؛ نصب hypervisor، دریافت image و بازیابی میتوانند بیشتر طول بکشند. «شب» ترتیب مطالعه است و الزام تقویمی ندارد. هر شصت درس با یک تاریخ انتشار در دسترساند. در دفترچه، وضعیت مطالعه، اجرای تمرین و تأیید نتیجه را جدا ثبت کن؛ خروجی مورد انتظار متن، ادعای اجرای همهٔ آزمایشها نیست.
واژههای مشترک دوره#
Host میزبان و guest مهمان است؛ VM ماشین مجازی دارای kernel مستقل است. Image تصویر ذخیرهشدهٔ دیسک یا محیط برنامه، و instance نمونهٔ ساختهشده از آن است. Kernel هستهٔ سیستمعامل و userspace برنامهها و کتابخانههای بیرون آن است. CPU پردازنده، RAM حافظهٔ اصلی و NIC کارت شبکه است؛ vCPU و NIC مجازی منبع مهماناند.
| واژه | معنی در تمرینها |
|---|---|
| hypervisor | لایهٔ اجرای ماشینهای مجازی و ادارهٔ منابع آنها |
| daemon | فرایند سرویس پسزمینه؛ CLI رابط خط فرمان آن است |
| domain | شیء ماشین مجازی در libvirt یا Xen، نه نام دامنهٔ DNS |
| storage pool / volume | مجموعهٔ ذخیرهسازی و واحد دادهٔ داخل آن |
| bridge / NAT | اتصال لایهٔ دوم و ترجمهٔ آدرس شبکه؛ دو سازوکار جدا |
| DHCP / DNS | تخصیص تنظیم شبکه و تبدیل نام به آدرس |
| snapshot / clone | نقطهٔ بازگشت وضعیت و کپی دارای هویت مستقل |
| overlay / backing image | لایهٔ تغییرات و تصویر پایهٔ وابستهٔ آن |
| namespace / cgroup | جداسازی دید فرایند و کنترل مصرف منابع |
| capability / syscall | واحد اختیار لینوکس و فراخوانی سرویس kernel |
| rootless | اجرای runtime بدون daemon دارای root میزبان |
| digest / tag | شناسهٔ محتوایی artifact و نام قابلتغییر آن |
| URI / API | شناسهٔ اتصال و رابط برنامهنویسی مدیریت |
اصطلاح تخصصی هر بخش در همان جلسه توضیح داده میشود؛ هنگام خواندن فرمان، نام فایل، گزینه و شناسهٔ محصول را با املای اصلی نگه دار.
قرارداد آزمایشگاه#
مبنای شاخهٔ QEMU/libvirt، Ubuntu Server 24.04 LTS روی x86_64 است. Xen روی Debian 13
در ماشین مستقل بوت میشود. برای تمرین کامل به قابلیت مجازیسازی سختافزاری و دسترسی
/dev/kvm نیاز داری؛ در host مجازی، nested virtualization باید در لایهٔ بیرونی هم
فعال و واقعاً قابل استفاده باشد. اجرای TCG کندتر است و نتیجهٔ KVM محسوب نمیشود.
| نقش | محیط و آدرس مدیریت Host-only | کاربرد |
|---|---|---|
hv-a | Ubuntu 24.04، 192.168.58.10/24 | QEMU و libvirt اصلی |
hv-b | Ubuntu 24.04، 192.168.58.20/24 | انتقال و آزمون مقصد |
xen-a | Debian 13، 192.168.58.30/24 | بوت Xen و Dom0 |
containers | Ubuntu 24.04، 192.168.58.40/24 | مبانی kernel کانتینر |
lxd-a | Clone مستقل، 192.168.58.50/24 | LXD با channel 5.21/stable |
docker-a | Clone مستقل، 192.168.58.60/24 | Docker از بستهٔ Ubuntu |
Cloneهای مختلف با IP یکسان همزمان روشن نمیشوند. برای Xen migration، xen-b
همنسخه و با آدرس مدیریت آزاد لازم است. همهٔ ماشینها لازم نیست همزمان فعال باشند؛
منابع را قبل روشن کردن هر مجموعه بودجهبندی کن. برای دو guest دوگیگابایتی، یک host
چهارگیگابایتی بدون حاشیهٔ RAM برای خودش مناسب نیست. فضای کافی برای base، copy و
backup جدا رزرو کن؛ اندازهٔ virtual disk برابر مصرف واقعی storage نیست.
شبکهٔ Host-only از LAN خانه یا کار جداست؛ کارت NAT جدا فقط مسیر دریافت بسته و image را میدهد. console مستقل و Snapshot قبل هر ماژول داشته باش. تغییر boot یا bridge را روی میزبان کاری اجرا نکن. برای Vagrant، VirtualBox سازگار روی host جدا یا پنجرهٔ مستقل استفاده میشود؛ اجرای همزمان backendهای سختافزاری ناسازگار فرض نشده است.
| شبکهٔ داخلی | قرارداد |
|---|---|
| libvirt NAT | 192.168.60.0/24؛ host .1، lab01 برابر .11، lab02 برابر .12 |
| libvirt isolated | 192.168.61.0/24 و fd30:305:61::/64 |
| Xen bridge | 192.168.63.0/24؛ Dom0 .1 و DomU .11 |
| QEMU TAP | 192.168.64.0/24؛ host .1 و guest .11 |
| LXD NAT / isolated | 10.5.30.0/24 و 10.5.31.0/24 |
| veth مستقل | 172.30.5.0/24؛ فقط دو namespace |
| Docker bridge | 172.28.5.0/24 |
| Vagrant pair | 192.168.59.0/24؛ server .10 و client .20 |
این subnetها باید با route و VPN محیط تو تداخل نداشته باشند. نام interface را با
ip -br address پیدا کن. DHCP و اعلان IPv6 آزمایشگاهی به LAN وصل نمیشوند؛ شبکهٔ
isolated هم endpoint میزبان دارد و بهتنهایی سیاست امنیتی کامل نیست.
فایلها، کلید و قواعد اجرا#
در Ubuntu مبنا، ابزارهای مشاهده و ورود را پیش از شبهای اول آماده کن؛ این کار هنوز hypervisor نصب نمیکند:
sudo apt update
sudo apt install openssh-client ripgrep numactl curl gnupg ca-certificates iproute2 tcpdump
روی host مربوط، با حساب عادی پوشههای خصوصی بساز. کلید زیر مخصوص دوره است و فایل موجود را overwrite نکن:
umask 077
mkdir -p ~/lpic305/{base,direct,images,keys,evidence,backups}
ssh-keygen -t ed25519 -f ~/lpic305/keys/id_ed25519 -C lpic305-lab
برای کار تعاملی passphrase مناسب انتخاب کن. Packer به دسترسی غیرتعاملی کلید نیاز
دارد؛ از روش agent پشتیبانیشدهٔ communicator یا کلید مجزای موقت در VM خصوصی ساخت
استفاده کن و بعد از ساخت دسترسی آن را لغو کن. کلید خصوصی وارد seed، Git یا image
عمومی نمیشود. student در مهمان حساب تمرین است؛ حساب host با نام virtadmin در
نمونهٔ migration باید واقعاً ساخته شده و دسترسی مدیریتی libvirt داشته باشد.
دو متغیر در جلسات image استفاده میشوند؛ اولی بعد از تأیید اصالت شب ۱۱ و دومی فقط بعد از backup سرد شب ۲۲ معتبر است. در هر shell جدید دوباره تنظیم کن:
export BASE_IMAGE="$HOME/lpic305/base/noble.qcow2"
export COLD_IMAGE="$HOME/lpic305/images/lab01-cold.qcow2"
فایل پایه readonly در نظر گرفته میشود؛ مهمانها از overlay یا copy مستقل استفاده
میکنند. مسیر COLD_IMAGE باید کپی خصوصی، آفلاین و بدون backing dependency گمشده
باشد. در libvirt سیستم، disk زیر /var/lib/libvirt/images/ با owner و policy بستهٔ
Ubuntu قرار میگیرد؛ مسیر home را با world-readable کردن به آن تحمیل نکن.
هر فرمان برای وضعیت آغاز همان جلسه است؛ همهٔ بلوکها را به یک script بزرگ تبدیل نکن. نام object باید آزاد باشد. shutdown غیرهمزمان است: خاموشی کامل را قبل copy، resize یا تغییر disk تأیید کن. قطع اجباری guest مثل قطع برق است. snapshot روی همان storage، backup مستقل نیست و backup بدون آزمون restore هنوز تأییدشده نیست.
برای CLIهای مدیریتی URI/context را ثبت کن. در libvirt همیشه qemu:///system مبناست؛
برای نمونههای کوتاه بدون -c میتوان در shell همان بخش تنظیم کرد:
export LIBVIRT_DEFAULT_URI=qemu:///system
Package، plugin و image را از ناشر معتبر دریافت و نسخهٔ واقعی را ثبت کن. Tag و alias
متحرکاند؛ checksum و fingerprint واقعی برای بازتولید لازماند. شاخهٔ Docker بستهٔ
docker.io و Compose v2 از Ubuntu است؛ آن را با نصب Docker CE مخلوط نکن. اختیار
socket Docker و گروههای libvirt/lxd مدیریتی است. خاموش کردن MAC، chmod 777 و گزینهٔ
privileged راه عمومی رفع خطا نیستند.
تطبیق با اهداف رسمی#
وزن اهمیت نسبی در آزمون است؛ تعداد شبها عین وزن نیست. محدودهٔ زیر خلاصهٔ راهنمای پیدا کردن درس است و متن کامل هدفها در صفحهٔ LPI مرجع میماند.
| هدف | وزن | شبها و مهارت اصلی |
|---|---|---|
351.1 | ۶ | ۱ تا ۶، ۲۰ و ۲۹؛ مفهوم، شبکه و چرخهٔ VM |
351.2 | ۳ | ۷ تا ۱۰؛ Xen 4.x، Dom0/DomU و xl |
351.3 | ۴ | ۳ و ۱۱ تا ۱۵؛ QEMU/KVM، monitor، VirtIO و Agent |
351.4 | ۹ | ۴ و ۱۶ تا ۲۵؛ libvirt، XML، منابع، شبکه، storage و انتقال |
351.5 | ۳ | ۲۶ تا ۲۹؛ فرمت و ابزارهای image |
352.1 | ۷ | ۳۰ تا ۳۵ و ۴۶؛ namespace، cgroup، اختیار و runtime |
352.2 | ۶ | ۳۶ تا ۴۰؛ LXC/LXD، image، profile، شبکه و storage |
352.3 | ۹ | ۴۱ تا ۴۹؛ Docker، image، شبکه، volume، log و registry |
352.4 | ۳ | ۴۹ تا ۵۱؛ Compose، Swarm، Kubernetes و Helm |
353.1 | ۲ | ۵۲ و ۵۳؛ cloud، OpenStack و Terraform |
353.2 | ۲ | ۵۶ و ۵۷؛ Packer و ساخت image |
353.3 | ۳ | ۱۲، ۱۷، ۵۴، ۵۵ و ۵۷؛ cloud-init و آمادهسازی نمونه |
353.4 | ۳ | ۵۸ و ۵۹؛ Vagrant، box، شبکه و provisioning |
شب ۶۰ مرور همهٔ هدفها و تحویل نهایی است. فرمانهای تاریخی مثل xm، brctl و
tunctl و نامهای قدیمی محصول از مطالعه حذف نمیشوند؛ برای اجرای جدید، ابزار و
release پشتیبانیشده استفاده میشود. سطح هدف orchestration شناخت مفاهیم است؛ این
سه شب جای دورهٔ کامل ادارهٔ Kubernetes نیستند. Terraform محلی نیز تمرین چرخهٔ state
است و استقرار واقعی cloud را ادعا نمیکند.
فهرست مطالعه#
مبانی و Xen#
- شب ۱: آزمایشگاه و نقشهٔ آزمون
- شب ۲: Hypervisor، HVM، PV و emulation
- شب ۳: CPU flags و مجازیسازی تودرتو
- شب ۴: حافظه، NUMA و overcommit
- شب ۵: شبکهٔ NAT، bridge، isolated و Open vSwitch
- شب ۶: چرخهٔ VM، P2V/V2V و ابزارهای مدیریتی
- شب ۷: Xen و بوت Dom0
- شب ۸: ساخت DomU و فایل xl.cfg
- شب ۹: شبکه و storage دامنهٔ Xen
- شب ۱۰: اداره، عیبیابی و migration در Xen
QEMU/KVM و libvirt#
- شب ۱۱: نصب QEMU/KVM و آمادهسازی image معتبر
- شب ۱۲: اجرای QEMU از خط فرمان و ورود امن به guest
- شب ۱۳: VirtIO، firmware و QEMU Guest Agent
- شب ۱۴: monitor، QMP و snapshot داخلی QEMU
- شب ۱۵: TAP و عیبیابی اجرای مستقیم QEMU
- شب ۱۶: libvirt، اتصال system/session و daemonها
- شب ۱۷: شبکهٔ پایه و اولین VM در libvirt
- شب ۱۸: XML و چرخهٔ persistent/transient domain
- شب ۱۹: شبکهٔ libvirt، DHCP/DNS و isolated IPv6
- شب ۲۰: اتصال libvirt به bridge و Open vSwitch
ذخیرهسازی، منابع و image#
- شب ۲۱: storage pool و volume در libvirt
- شب ۲۲: snapshot و backup قابل بازیابی VM
- شب ۲۳: vCPU، حافظه و مشاهدهٔ منابع domain
- شب ۲۴: انتقال سرد و شرایط migration زنده
- شب ۲۵: permission، MAC، virtlogd و قفل storage
- شب ۲۶: raw، qcow2، VMDK و qemu-img
- شب ۲۷: خواندن image با guestfish و guestmount
- شب ۲۸: resize و sparsify تصویر آفلاین
- شب ۲۹: هویت Clone، virt-sysprep و P2V/V2V
مبانی کانتینر#
- شب ۳۰: system container، application container و OCI
- شب ۳۱: namespaceها، unshare و nsenter
- شب ۳۲: network namespace و veth دوطرفه
- شب ۳۳: cgroup v2 و محدودیت حافظه/CPU
- شب ۳۴: capability، seccomp و MAC در کانتینر
- شب ۳۵: runc، containerd، CRI-O و ابزارهای rootless
LXC/LXD#
- شب ۳۶: نصب LXD و تفاوت آن با ابزارهای LXC
- شب ۳۷: image و چرخهٔ زندگی کانتینر LXD
- شب ۳۸: profile، storage و محدودیت منابع در LXD
- شب ۳۹: شبکهٔ مدیریتشده، IP ثابت و جداسازی در LXD
- شب ۴۰: snapshot، publish و بازیابی LXD
Docker#
- شب ۴۱: Docker Engine، daemon و اختیار socket
- شب ۴۲: image، digest و چرخهٔ زندگی Docker
- شب ۴۳: ساخت image با Dockerfile و کاربر غیرroot
- شب ۴۴: شبکهٔ Docker، DNS و publish پورت
- شب ۴۵: volume، bind mount و دادهٔ پایدار Docker
- شب ۴۶: سقف منابع، capability و مسیر rootless در Docker
- شب ۴۷: daemon.json، چرخش log و healthcheck
- شب ۴۸: registry خصوصی با TLS و احراز هویت
ارکستراسیون و cloud#
- شب ۴۹: Compose؛ سرویسها، readiness و secret فایل
- شب ۵۰: Swarm؛ service، replica و routing mesh
- شب ۵۱: Kubernetes و Helm؛ خواندن استقرار و رفع خرابی
- شب ۵۲: مدلهای cloud و معماری OpenStack
- شب ۵۳: Terraform؛ plan، state و provider
cloud-init، Packer، Vagrant و پروژهٔ نهایی#
- شب ۵۴: cloud-init؛ هویت و تنظیم اولین بوت
- شب ۵۵: cloud-init؛ رشد دیسک، خطا و آمادهسازی template
- شب ۵۶: Packer؛ template و ساخت image کانتینر LXD
- شب ۵۷: Packer و QEMU؛ از cloud image تا artifact آزمودنی
- شب ۵۸: Vagrant؛ box، provider و چرخهٔ آزمایشگاه
- شب ۵۹: Vagrant؛ دو ماشین، provisioner و پوشهٔ مشترک
- شب ۶۰: پروژهٔ نهایی؛ ساخت، شکست و بازیابی با شواهد
معیار پایان دوره#
وقتی بتوانی محیط تازه را از تعریف و artifact معتبر بسازی، هویت و مسیر داده را توضیح بدهی، failure محدود را از روی evidence پیدا کنی و backup را روی نمونهٔ جدید بازیابی کنی، پروژه آمادهٔ تحویل است. نسخه و محدودیت را ثبت کن؛ مهاجرت طراحیشده یا manifest فقط اعتبارسنجیشده را بهجای اجرای واقعی گزارش نکن. برای ادامه، دفترچهٔ شکافها و مسیرهای یادگیری را کنار نتیجهٔ پروژه نگه دار.