מדריך מלא

להפעיל את LexiVirt מאפס

הכול בעמוד אחד: מה כל רכיב, מה מתחבר למה, איך מתקינים, איך בונים מכונה וירטואלית ראשונה, מה המשמעות של כל מונח — ואיפה הגבולות של המערכת.

בעמוד הזה

  1. מה זה LexiVirt
  2. הרכיבים ואיך הם מתחברים
  3. מה צריך
  4. התקנה
  5. כניסה ראשונה ואבטחה
  6. ISO — קובצי התקנה
  7. המכונה הווירטואלית הראשונה
  8. שימוש בקונסולה של מכונה
  9. הוספת שרתי מחשוב
  10. רשת — הסבר מלא
  11. VLAN, גשרים, ומה שהמערכת לא עושה
  12. משתמשים והרשאות
  13. פורטים, חומת אש וסודות
  14. עדכונים, גיבוי ותקלות
  15. מילון מונחים
  16. הבהרה משפטית
1
מה זה LexiVirt
ומה זה לא

LexiVirt הופכת שרתי לינוקס רגילים למקום שמריץ מכונות וירטואליות. מכונה וירטואלית (VM) היא מחשב שלם — מעבד, זיכרון, דיסק ומערכת הפעלה משלו — שקיים כתוכנה על גבי מכונה פיזית. שרת פיזי אחד יכול להריץ הרבה כאלה, כשהן מבודדות זו מזו.

מקבלים דשבורד ווב שבו יוצרים מכונה, נותנים לה מעבדים, זיכרון ודיסק, מאתחלים אותה מקובץ התקנה של מערכת הפעלה, ופותחים את המסך שלה בדפדפן. אותו רעיון כמו Proxmox,‏ VMware או Nutanix — מותקן על החומרה שלך, בלי דמי רישוי ובלי שום דבר שמדווח החוצה.

מה זה לא: זה לא שירות ענן, ואין שרת LexiVirt שמחזיק את הנתונים שלך. הכול רץ על מכונות שבבעלותך. זה גם לא מוצר clustering או זמינות גבוהה: מכונות לא עוברות בין שרתים לבד, ואם שרת נופל — המכונות שעליו מושבתות עד שהוא חוזר.

חובה להפעיל וירטואליזציה ב-BIOS. חפשו Intel VT-x,‏ AMD-V או "SVM Mode". בלי זה המכונות רצות באמולציה תוכנתית ואיטיות עד כדי חוסר שימושיות. המתקין מדווח מה מצב השרת שלכם.
2
הרכיבים ואיך הם מתחברים
שלושה חלקים, שתי קפיצות רשת

יש רק שלושה חלקים נעים. ברגע שמבינים מי זה מי, כל השאר מסתדר.

YOU (browser) │ │ HTTPS, port 9443 ▼ ┌──────────────────────────────┐ │ MANAGEMENT CONSOLE │ the web dashboard │ nginx :9443 → app :9070 │ users · nodes · audit log │ runs no VMs itself │ └──────────────┬───────────────┘ │ │ HTTP, port 9071 │ header: x-agent-token = cluster secret ▼ ┌──────────────────────────────┐ │ NODE AGENT │ one per compute node │ small API on :9071 │ └──────────────┬───────────────┘ │ libvirt / QEMU / KVM ▼ ┌──────────────┐ ┌──────────────┐ │ VM │ │ VM │ │ disk.qcow2 │ │ disk.qcow2 │ └──────────────┘ └──────────────┘ Screen (VNC), through the same console: browser ──WS──▶ console ──TCP 5900+──▶ the VM's screen

קונסולת הניהול

ממשק הווב שאליו נכנסים. מחזיקה את חשבונות המשתמשים, את רשימת שרתי המחשוב ואת יומן הביקורת במסד נתונים קטן. היא לא מריצה מכונות וירטואליות — היא רק נותנת פקודות. האפליקציה עצמה מאזינה על 127.0.0.1:9070, ו-nginx מפרסם אותה לרשת על פורט 9443 ב-HTTPS.

שרת מחשוב (Compute Node)

שרת פיזי שבאמת מריץ את המכונות. על כל אחד רץ ה-agent: API קטן על פורט 9071 שהקונסולה מפעילה. ה-agent מפעיל את KVM דרך libvirt, יוצר את קובצי הדיסק, מגדיר את המכונות ומפעיל אותן.

סוד האשכול (Cluster Secret)

סוד משותף אחד בין הקונסולה לכל agent, שנוצר בעת התקנת שרת הניהול. הקונסולה שולחת אותו בכל בקשה לשרת מחשוב; agent דוחה כל דבר אחר. הוא נשמר בקובץ /etc/lexivirt/agent.secret (קריא ל-root בלבד) בכל מכונה.

התייחסו לסוד האשכול כמו לסיסמת root. מי שמחזיק אותו ויכול להגיע לפורט 9071 בשרת מחשוב, יכול ליצור, למחוק ולהשתלט על כל מכונה וירטואלית שם.
בשרת בודד כל שלושת הרכיבים יושבים על אותה מכונה. אפשרות "הכול" במתקין מגדירה בדיוק את זה, ומשאירה את מסכי המכונות על ממשק ה-loopback כך ששום דבר נוסף לא נחשף.
3
מה צריך
לפני שמתחילים
רכיבדרישה
מערכת הפעלהDebian 11+,‏ Ubuntu 20.04+,‏ RHEL / CentOS Stream / AlmaLinux / Rocky 8+
הרשאותroot, או משתמש עם sudo
מעבדx86-64 עם VT-x או AMD-V מופעל ב-BIOS (בשרתי מחשוב בלבד)
זיכרון‏2 GB לקונסולה לבדה. בשרת מחשוב: מה שהמארח צריך בעצמו, ועוד סכום הזיכרון של כל המכונות.
דיסק‏20 GB ל-LexiVirt עצמה, ועוד מקום לקובצי ISO (כ-1–6 GB) ולדיסק של כל מכונה
רשתשרתי המחשוב והקונסולה צריכים להגיע זה לזה בפורטים 9071 ו-5900–5999
כלל אצבע לתכנון. מותר לחלק יותר מעבדים וירטואליים ממה שיש פיזית (זה נקרא overcommit וזו פרקטיקה רגילה). אין לעשות overcommit לזיכרון — אם סכום הזיכרון של המכונות עולה על מה שיש למארח, הקרנל מתחיל להרוג תהליכים.
4
התקנה
פקודה אחת, עם sudo

המתקין חייב לרוץ כ-root, לכן מריצים אותו עם sudo. הוא מתקין את כל התלויות, מייצר בעצמו סיסמאות ותעודת TLS, פותח את הפורטים שהוא צריך בחומת האש, מציע להוריד קובצי התקנה של מערכות הפעלה, ובסיום מדפיס הסבר מלא איך להשתמש בתוצאה.

שרת אחד (הכי פשוט להתחיל)

# everything on this one server
curl -sSL https://lexi-cloud.com/install.sh | sudo bash -s -- all

קונסולה ושרתי מחשוב נפרדים

על המכונה שתארח את הדשבורד:

curl -sSL https://lexi-cloud.com/install.sh | sudo bash -s -- manager

בסיום היא מדפיסה את סוד האשכול ואת הכתובת שלה. אחר כך, על כל שרת שאמור להריץ מכונות:

curl -sSL https://lexi-cloud.com/install.sh | sudo bash -s -- \
     agent <cluster-secret> https://<console-ip>:9443
חומת אש הדוקה יותר בשרת מחשוב. הוסיפו לפני הפקודה LEXIVIRT_MANAGER_IP=<console-ip>, והשרת יקבל תעבורת agent רק מהכתובת הזו.

התקנה בלי שאלות

# choose the OS images up front, skip every prompt
LEXIVIRT_ISOS="debian alpine" \
  curl -sSL https://lexi-cloud.com/install.sh | sudo bash -s -- all

# other values: "none", "all", or any of: debian alpine ubuntu alma
הזרמת סקריפט מהאינטרנט ל-sudo bash משמעה אמון מלא בו. אם אתם מעדיפים לקרוא קודם: curl -sSL https://lexi-cloud.com/install.sh -o install.sh, לקרוא, ואז sudo bash install.sh all.
5
כניסה ראשונה ואבטחה
לעשות את זה לפני כל דבר אחר

פרטי הכניסה שלך

כתובתhttps://<your-server>:9443
שם משתמשadmin — תמיד זה, בכל התקנה
סיסמהנוצרת אקראית, שונה בכל התקנה. אין סיסמת ברירת מחדל קבועה, וזה במכוון. איך מוצאים את שלך — למטה.
אם אתם מחפשים את LexiVirt@2026 — היא לא קיימת יותר. גרסאות עד 1.0.28 הגיעו עם אותה סיסמה בכל התקנה וגם הדפיסו אותה בעמוד ההורדה הציבורי — כך שלכל התקנת LexiVirt באינטרנט הייתה אותה סיסמת admin ידועה. החל מ-1.1.0 כל התקנה מייצרת סיסמה משלה, ושדרוג של התקנה ישנה מחליף אוטומטית חשבון שעדיין משתמש בסיסמה הישנה. אם בדיוק שדרגתם ואתם לא מצליחים להיכנס — זו הסיבה, והסיסמה החדשה נמצאת במקרה 3 למטה.

איפה למצוא את הסיסמה

תלוי איך הותקנה הקונסולה. הריצו את שלוש הפקודות — זו שרלוונטית אצלכם תדפיס משהו:

# 1. Normal install (the installer generated it and printed it at the end)
sudo grep LEXIVIRT_ADMIN_PASSWORD /etc/systemd/system/lexivirt-console.service

# 2. Console started by hand, with no password supplied
sudo cat /root/lexivirt/data/initial_admin_password.txt

# 3. Upgraded from 1.0.x, where the old shared password was rotated away
#    Format is:  username <TAB> new-password
sudo cat /root/lexivirt/data/rotated_passwords.txt
למה /root? שירות הקונסולה רץ כ-root, ולכן תיקיית הנתונים שלו היא /root/lexivirt/data/. אם אתם מריצים את הקונסולה תחת המשתמש שלכם, חפשו ב-~/lexivirt/data/. שלושת הקבצים בהרשאות 0600 — קריאים ל-root בלבד.

פתחו https://<your-server>:9443 והיכנסו כ-admin.

הדפדפן יזהיר לגבי התעודה. זה צפוי — המתקין יצר תעודה בחתימה עצמית כי לשרת אין שם דומיין ציבורי. החיבור עדיין מוצפן; הדפדפן פשוט לא יכול לאמת מי בצד השני. לחצו Advanced ← Proceed. אם יש לכם דומיין שמצביע לשרת, החליפו את התעודה ב-/etc/lexivirt/ssl/ והריצו systemctl reload nginx.

מיד אחרי הכניסה

  1. שנו את סיסמת ה-admin — הגדרות ← שינוי סיסמה. מינימום 10 תווים.
  2. אל תחשפו את פורט 9443 לאינטרנט הפתוח. העמידו אותו מאחורי VPN, או הגבילו אותו לטווח הכתובות שלכם בחומת האש. זו לוח בקרה לכל התשתית שלכם.
  3. צרו לעצמכם חשבון נפרד תחת "משתמשים", בתפקיד operator, והשאירו את admin לניהול בלבד.
שישה ניסיונות כניסה כושלים מאותה כתובת נועלים את החשבון לחמש דקות. כל כניסה, מוצלחת או כושלת, נרשמת ביומן הביקורת.
6
ISO — קובצי התקנה
בלי זה אי אפשר לבנות מכונה

ISO הוא קובץ בודד שמכיל את תוכנת ההתקנה של מערכת הפעלה — בדיוק התוכן של דיסק התקנה. מכונה חדשה מאתחלת ממנו בפעם הראשונה, בדיוק כמו הכנסת דיסק למחשב פיזי, ואתם עוברים על אשף ההתקנה כרגיל.

המתקין מציע להוריד כמה כאלה אל /var/lib/lexivirt/isos, ומאמת כל אחד מול ה-checksum הרשמי של המפיץ. אפשר גם להעלות משלכם מהקונסולה: ISOs ← Upload. קבצים גדולים מפוצלים בדפדפן ונשלחים בחלקים, כך שגם קובצי דסקטופ של כמה ג׳יגה עוברים בלי בעיה.

העלאה מועתקת לכל שרת מחשוב מקוון, לא רק לאחד. LexiVirt בוחרת בעצמה על איזה שרת המכונה תרוץ, ולכן הקובץ חייב כבר להיות שם.

מה המתקין יכול להוריד עבורך

מפתחקובץגודלאימות
ubuntu2204Ubuntu Server 22.04 LTS‏~2.1 GBמאומת
ubuntu2404Ubuntu Server 24.04 LTS‏~3.0 GBמאומת
debian12Debian 12 netinst‏~0.7 GBמאומת
debian13Debian 13 netinst‏~0.7 GBמאומת
centos9CentOS Stream 9 boot‏~0.9 GBמאומת
alma9AlmaLinux 9 boot‏~1.1 GBמאומת
win2022Windows Server 2022 (הערכה)‏~4.7 GBאין checksum
win2025Windows Server 2025 (הערכה)‏~5.6 GBאין checksum
virtioדיסק דרייברים virtio-win‏~0.8 GBאין checksum
# pick exactly what you want
LEXIVIRT_ISOS="ubuntu2404 debian12" sudo bash install.sh all

# or a group: all (~19 GB) | linux (~8 GB) | windows | none
LEXIVIRT_ISOS=linux sudo bash install.sh all

שמות הקבצים נפתרים מרשימת הקבצים של כל מפיץ, כך שגרסת נקודה חדשה לא שוברת את ההורדה. כל קובץ לינוקס נבדק מול ה-SHA256 הרשמי ונמחק אם הוא לא תואם. המתקין מסרב להתחיל הורדה שלא תיכנס בדיסק.

אורחי Windows

קובצי Windows Server הם גרסאות הערכה ל-180 יום. הרצת Windows בייצור מחייבת רישיון שרכשת ממיקרוסופט. מיקרוסופט לא מפרסמת checksum להורדות האלה, ולכן בניגוד לכל קובץ לינוקס למעלה הם מוגנים ב-TLS בלבד.
תצטרך את דיסק הדרייברים virtio. ל-Windows אין דרייבר מובנה לדיסקים ולכרטיסי רשת מסוג virtio, ולכן אשף ההתקנה מציג רשימת דיסקים ריקה ולא ממשיך. צור את המכונה עם קובץ ה-Windows, חבר את virtio-win.iso כ-CD-ROM שני, והשתמש ב-Load driver במסך בחירת הדיסק. תכנן 40 GB דיסק ו-4 GB זיכרון כמינימום מעשי.
למערכות הפעלה יש רישיונות משלהן. האחריות לעמידה בהם עליכם — במיוחד ב-Windows ובמערכות מסחריות אחרות, שדורשות רישיון שרכשתם.
7
המכונה הווירטואלית הראשונה
חמש דקות
  1. Nodes — ודאו ששרת מחשוב אחד לפחות מופיע כ-online ועם KVM enabled. אם כתוב "No KVM", הווירטואליזציה כבויה ב-BIOS של אותו שרת או שחסרה ספריית libvirt ל-Python.
  2. ISOs — ודאו שיש קובץ התקנה ברשימה.
  3. Virtual Machines ← Create VM, ומלאו:
שדהמה למלא
שםאותיות, ספרות, נקודה, מקף וקו תחתון — למשל web-01. זה השם של המכונה בהיפרוויזור ואי אפשר לשנות אותו אחר כך.
vCPUכמה ליבות מעבד האורח יראה. התחילו מ-2.
RAMמגה-בייט של זיכרון, שנתפסים מהמארח כל עוד המכונה רצה. 2048 היא התחלה נוחה; ל-Alpine מספיק 512.
דיסקג׳יגה-בייט. הקובץ מתחיל קטן וגדל ככל שהאורח כותב, ולכן 20 GB כמעט לא עולים כלום עד שמשתמשים בהם.
ISOמערכת ההפעלה שממנה מתקינים.

LexiVirt בוחרת עבורכם שרת מחשוב מקוון שתומך ב-KVM ומפעילה את המכונה מיד. אין בורר שרתים — השיבוץ אוטומטי.

  1. לחצו על אייקון המסך כדי לפתוח את הקונסולה, ועברו על אשף ההתקנה של מערכת ההפעלה בדיוק כמו על חומרה אמיתית.
  2. בסיום ההתקנה עצרו את המכונה והפעילו שוב — היא תעלה מהדיסק שלה.
שינוי מעבדים, זיכרון או דיסק בהמשך: קודם עוצרים את המכונה, ואז Edit. דיסק יכול רק לגדול, לעולם לא להתכווץ — כיווץ דיסק מתחת למערכת קבצים הורס אותה. אחרי הגדלה ב-LexiVirt צריך עדיין להרחיב את המחיצה ואת מערכת הקבצים בתוך האורח (growpart ואז resize2fs, או המקבילה).
מחיקת מכונה מוחקת את קובץ הדיסק שלה. אין ביטול ואין סל מיחזור.
8
שימוש בקונסולה של מכונה
מסך, מקלדת ועכבר בדפדפן

אייקון המסך פותח את פלט הווידאו האמיתי של המכונה בלשונית דפדפן, עם מקלדת ועכבר מחוברים — המקבילה לעמידה מולה עם מסך מחובר. זה עובד עוד לפני שמותקנת מערכת הפעלה, וזו בדיוק הסיבה שצריך את זה בהתקנה הראשונית, וזה ממשיך לעבוד גם כשהרשת של האורח שבורה.

  • Ctrl+Alt+Del — נשלח לאורח, לא למחשב שלכם.
  • לוח (Clipboard) — הדבקת טקסט לתוך האורח (שימושי, כי אחרת מקלידים לקונסולה תו-תו).
  • מסך מלא — לאשפי התקנה גרפיים.
מתחת למכסה המנוע: המסך של כל מכונה הוא שרת VNC עם סיסמה אקראית משלו. הדפדפן שלכם לא מדבר איתו ישירות — הקונסולה מתווכת את החיבור מעל WebSocket מאומת, ומוסרת לדפדפן את הסיסמה רק אחרי אימות ההפעלה שלכם. בהתקנת שרת בודד פורטי ה-VNC מוגבלים ל-loopback ואינם נגישים מהרשת כלל.
9
הוספת שרתי מחשוב
הגדלת הבריכה

כל שרת נוסף מוסיף את הליבות, הזיכרון והדיסק שלו לבריכה המשותפת. מכונות חדשות משובצות אוטומטית בין השרתים המקוונים שתומכים ב-KVM.

  1. קחו את סוד האשכול ממכונת הקונסולה:
    sudo cat /etc/lexivirt/agent.secret
  2. על השרת החדש:
    LEXIVIRT_MANAGER_IP=<console-ip> \
    curl -sSL https://lexi-cloud.com/install.sh | sudo bash -s -- \
         agent <cluster-secret> https://<console-ip>:9443
  3. בקונסולה: Nodes ← Add Node. הזינו שם, את ה-IP של השרת החדש, פורט 9071, והשאירו את שדה הסוד ריק — סוד האשכול כבר מוגדר.

אם השרת לא עולה

מה כתובהמשמעות והפתרון
Unreachableפורט 9071 חסום בין הקונסולה לשרת, או שה-agent לא רץ. בדקו עם systemctl status lexivirt-agent בשרת, ו-nc -zv <node-ip> 9071 מהקונסולה.
Wrong agent secretהסוד בשרת לא תואם לזה של הקונסולה. השוו sudo cat /etc/lexivirt/agent.secret בשתי המכונות, או הגדירו דריסה לשרת הבודד הזה דרך Edit Node.
No KVMוירטואליזציה כבויה ב-BIOS, או שספריית libvirt ל-Python לא הותקנה. השרת עדיין יכול לאחסן קובצי ISO אבל לא להריץ מכונות.
10
רשת — הסבר מלא
מה המכונות מקבלות, ואיך מגיעים אליהן

כל מכונה מקבלת כרטיס רשת וירטואלי אחד, מחובר לרשת ה-NAT המובנית של השרת. בפועל:

the internet / your LAN ▲ │ NAT (outbound traffic uses the node's own IP) │ ┌────────┴──────────┐ │ virbr0 │ a virtual switch inside the node │ 192.168.122.1 │ with its own DHCP server └───┬───────────┬───┘ │ │ ┌───┴───┐ ┌───┴───┐ │ VM A │ │ VM B │ .122.45 .122.87 └───────┘ └───────┘ (assigned automatically)
  • המכונות מקבלות כתובת אוטומטית בטווח 192.168.122.0/24.
  • המכונות יכולות להגיע לאינטרנט ולרשת המקומית שלכם.
  • מכונות על אותו שרת יכולות להגיע זו לזו.
  • שום דבר מבחוץ לא יכול לפתוח חיבור פנימה אל מכונה. זו תכונת אבטחה אמיתית, לא מגבלה שכדאי לעקוף בקלות ראש.
  • מכונות על שרתים שונים לא מגיעות זו לזו ישירות — לכל שרת יש 192.168.122.0/24 נפרד משלו.

איך מוצאים את הכתובת של מכונה

הקונסולה מציגה אותה ברגע שהאורח ביקש כתובת. מהשרת עצמו:

sudo virsh net-dhcp-leases default

פרסום שירות שרץ בתוך מכונה

כדי לאפשר לעולם החיצון להגיע, למשל, לשרת ווב בתוך מכונה, מפנים פורט בשרת המארח:

# node's port 8080 → VM 192.168.122.42, port 80
sudo iptables -t nat -A PREROUTING -p tcp --dport 8080 \
     -j DNAT --to-destination 192.168.122.42:80
sudo iptables -A FORWARD -p tcp -d 192.168.122.42 --dport 80 -j ACCEPT

# iptables rules do not survive a reboot on their own:
sudo apt install iptables-persistent   # Debian/Ubuntu
sudo netfilter-persistent save
קבעו למכונה כתובת קבועה לפני שעושים את זה, אחרת DHCP עלול לתת לה כתובת אחרת אחרי אתחול והכלל יצביע לשום מקום. הגדירו כתובת סטטית בתוך האורח, או שריינו אחת ב-libvirt עם virsh net-edit default.
11
VLAN, גשרים, ומה שהמערכת לא עושה
תשובות ישירות למונחי הרשת

מה זה VLAN באמת

VLAN (רשת מקומית וירטואלית, תקן IEEE 802.1Q) מפצל רשת פיזית אחת לכמה רשתות לוגיות נפרדות. זה עובד על ידי הוספת תווית קטנה — מספר בין 1 ל-4094 — לכל מסגרת Ethernet. מתגים מפרידים בין התעבורה לפי התווית: שתי מכונות שמחוברות לאותו מתג אך משויכות לתוויות VLAN שונות פשוט לא רואות זו את זו, כאילו היו על כבלים שונים לגמרי.

אוצר המילים שתפגשו במתג:

  • ‏Access port — נושא VLAN אחד בלבד, ללא תווית. המכשיר שמחובר לא יודע דבר על VLAN; המתג מוסיף ומסיר את התווית. זה מה שפורט של מחשב רגיל הוא.
  • ‏Trunk port — נושא כמה VLANים בו-זמנית, עם תוויות. כך מחברים מתג למתג, או שרת שצריך להיות בכמה רשתות דרך כבל אחד.
  • ‏Native / untagged VLAN — ב-trunk, ה-VLAN היחיד שהמסגרות שלו עוברות בלי תווית.
  • ‏VLAN ID / PVID — המספר עצמו. 1 הוא בדרך כלל ברירת המחדל; 4095 שמור.

מרכזי נתונים משתמשים ב-VLANים כדי להפריד, למשל, בין תעבורת אחסון, תעבורת ניהול ותעבורת לקוחות על אותה תשתית כבלים, וכדי למנוע ממכונה שנפרצה במקטע אחד לראות מקטע אחר.

LexiVirt לא מתייגת VLANים עבורכם. אין שדה שבו מקלידים מספר VLAN ומשהו קורה — בגרסה קודמת היה בדיוק כזה, והוא לא עשה עם המספר שום דבר, ולכן הוסר. מה ש-LexiVirt כן יודעת לעשות זה לחבר אורחים לגשר שכבר הצבתם על VLAN. בנו את br-vlan100 בשרת כמוסבר למטה, צרו בקונסולה רשת מגושרת שמצביעה אליו, וכל מכונה על הרשת הזו יושבת על VLAN 100. התיוג נעשה על ידי המארח והמתג; LexiVirt מחברת את האורחים לתוצאה.

אם באמת צריך גישור או VLAN מתויג

זו משימת רשת ברמת המארח, שמוגדרת בכלים הרגילים של ההפצה שלכם. ברגע שקיים גשר במארח, libvirt יכול לחבר אליו מכונות ישירות.

גשר רגיל מציב את המכונות ישירות על הרשת הפיזית שלכם, כך שהן מקבלות כתובות משרת ה-DHCP הרגיל שלכם ונגישות כמו כל מכונה אחרת — בלי NAT ובלי הפניית פורטים:

# Debian/Ubuntu, /etc/netplan/01-bridge.yaml
network:
  version: 2
  ethernets:
    eno1: {dhcp4: no}
  bridges:
    br0:
      interfaces: [eno1]
      dhcp4: yes

גשר עם תווית VLAN מציב את המכונות על VLAN מסוים — כאן, VLAN 100:

network:
  version: 2
  ethernets:
    eno1: {dhcp4: no}
  vlans:
    eno1.100:
      id: 100
      link: eno1
  bridges:
    br-vlan100:
      interfaces: [eno1.100]
      dhcp4: no

ואז בקונסולה: Networks ← Create Network, בוחרים Bridged ונותנים br-vlan100. בוחרים את הרשת הזו ביצירת מכונה והאורח נוחת על VLAN 100. בלי עריכה ידנית של XML, ושינוי גודל לא יבטל את זה — הקונסולה משמרת את הרשת של המכונה כשהיא מגדירה אותה מחדש.

המתג חייב להסכים. הפורט שמזין את השרת חייב להיות מוגדר כ-trunk שנושא את VLAN 100, אחרת שום דבר לא יעבור. בנו את הגשר בכל שרת מחשוב: השיבוץ אקראי, והקונסולה תאפיר רשת שלא קיימת בכולם במקום לתת לכם ליצור מכונה שלא תוכל לעלות.
12
משתמשים והרשאות
מי יכול לעשות מה
תפקידמה מותר
adminהכול: ניהול משתמשים, הוספה והסרה של שרתי מחשוב, מחיקת ISO ונפחים, התקנת עדכונים.
operatorיצירה, הפעלה, עצירה, שינוי גודל ומחיקה של מכונות; העלאת ISO; פתיחת קונסולות. לא יכול לנהל משתמשים או שרתי מחשוב.
viewerצפייה בלבד. רואה מכונות, שרתים ויומנים; לא יכול לשנות דבר.
  • סיסמאות חייבות להיות באורך 10 תווים לפחות, לכל חשבון ובכל דרך שבה הן נקבעות.
  • את חשבון ה-admin המובנה אי אפשר למחוק או להוריד בדרגה, כך שלעולם לא תינעלו בחוץ.
  • השבתת חשבון מונעת ממנו להיכנס באופן מיידי.
  • כל פעולה משמעותית — כניסות, יצירה ומחיקה של מכונות, שינויי שרתים, העלאות ISO — נרשמת ביומן הביקורת עם המשתמש, הזמן וכתובת המקור.
13
פורטים, חומת אש וסודות
מה בדיוק פתוח, ולמה
פורטמכונהתפקידמי צריך להגיע
9443/tcpקונסולההדשבורד, ב-HTTPSהמנהלים שלכם בלבד — VPN או רשימת היתר
80/tcpקונסולההפניה ל-9443אותו דבר
9070/tcpקונסולההאפליקציה עצמה, על loopbackאף אחד — היא לא חשופה
9071/tcpשרת מחשוב‏API של ה-agentהקונסולה בלבד
5900–5999/tcpשרת מחשובמסכי המכונות (VNC)הקונסולה בלבד — סגור לגמרי בהתקנת שרת בודד

המתקין פותח אותם דרך ufw או firewalld, לפי מה שפעיל. אם מעבירים LEXIVIRT_MANAGER_IP בהתקנת שרת מחשוב, הכללים מוגבלים לכתובת הקונסולה הזו בלבד.

איפה יושבים הסודות

קובץמה בפנים
/etc/lexivirt/agent.secretסוד האשכול, הרשאות 0600
/etc/systemd/system/lexivirt-console.serviceסוד האשכול וסיסמת ה-admin הראשונית, הרשאות 0600
/opt/lexivirt/data/console_secret.keyהמפתח שחותם על אסימוני ההפעלה. מחיקה שלו מנתקת את כולם.
סוד האשכול לא נשלח ברשת. הבקשות לשרתי המחשוב חתומות: הקונסולה שולחת חותמת זמן ו-HMAC-SHA256 על השיטה, הנתיב והגוף — ובכך מוכיחה שהיא מכירה את הסוד בלי לשלוח אותו. חתימה תקפה לבקשה אחת בלבד: שימוש חוזר, שינוי הגוף או הפניה לנתיב אחר — כולם נדחים, וכל חתימה בת יותר מחמש דקות נדחית. לפני כן הסוד עצמו נסע בכותרת בכל בקשה, גלוי לגמרי.
התעבורה עצמה עדיין לא מוצפנת. החתימה מגנה על הסוד, לא על הסודיות: מאזין עדיין יכול לראות שמות מכונות, סטטיסטיקות ותוכן של העלאת ISO. פורט 9071 צריך להיות נגיש רק מהקונסולה — העבירו LEXIVIRT_MANAGER_IP בהתקנת שרת מחשוב, או הגבילו בחומת האש. אחרי שכל הקונסולות בגרסה 1.2.3 ומעלה, הגדירו LEXIVIRT_AGENT_REQUIRE_HMAC=1 ביחידת ה-systemd של ה-agent כדי שסכמת הטוקן הישנה תפסיק להתקבל בכלל.
החלפת סוד האשכול: צרו חדש עם openssl rand -hex 24, כתבו אותו ב-/etc/lexivirt/agent.secret ובשורת LEXIVIRT_AGENT_SECRET= ביחידת ה-systemd, בקונסולה ובכל שרת מחשוב, ואז הפעילו מחדש את lexivirt-console ואת lexivirt-agent. השרתים יציגו "Wrong agent secret" עד שכולם יתאימו שוב.
14
עדכונים, גיבוי ותקלות
לשמור על זה חי

עדכונים

הדשבורד מציג תג כשמתפרסמת גרסה חדשה. הגדרות ← Apply Update מוריד אותה מעל TLS מאומת, בודק את ה-checksum שלה לפני שמריץ משהו, מחיל אותה ומפעיל מחדש את השירות. מסד הנתונים, המכונות וקובצי ה-ISO לא נוגעים. אם ההפעלה מחדש נכשלת, נאמר לכם זאת במפורש ביחד עם הפקודה להשלים ידנית.

מה לגבות — אלה לא ניתנים לשחזור

/opt/lexivirt/data/חשבונות, שרתים, יומן ביקורת, מפתח חתימה
/etc/lexivirt/סוד האשכול ותעודת ה-TLS
/var/lib/lexivirt/vms/קובץ הדיסק של כל מכונה (בכל שרת מחשוב)
העתקת קובץ דיסק של מכונה שרצה מייצרת עותק פגום, בדיוק כמו ניתוק חשמל למחשב אמיתי. עצרו את המכונה קודם, או צרו snapshot עם virsh snapshot-create-as.

פקודות יומיומיות

# on the console machine
systemctl status lexivirt-console
journalctl -u lexivirt-console -f
systemctl restart lexivirt-console

# on a compute node
systemctl status lexivirt-agent
journalctl -u lexivirt-agent -f
virsh list --all                 # what the hypervisor itself sees
virsh net-dhcp-leases default    # which VM got which address

תקלות נפוצות

הסימפטוםהסיבה והפתרון
הדשבורד מחזיר 502‏nginx רץ אבל האפליקציה לא. journalctl -u lexivirt-console -n 50.
שרת מחשוב offlineפורט 9071 חסום, או שה-agent עצור. ראו הטבלה בסעיף 9.
חלון הקונסולה מציג "Connection lost"המכונה לא רצה, או שפורטים 5900–5999 חסומים בין הקונסולה לשרת.
מכונה לא עולהבדרך כלל אין מספיק זיכרון פנוי בשרת. הריצו שם free -h.
ה-agent מסרב לעלותהוא לא ירוץ בלי סוד אמיתי באורך 16 תווים לפחות. בדקו את /etc/lexivirt/agent.secret ואת יחידת ה-systemd.
"No KVM" בשרת מחשובוירטואליזציה כבויה ב-BIOS, או ש-/opt/lexivirt-agent/bin/python3 -c "import libvirt" נכשל.
15
מילון מונחים
כל מונח שמופיע במערכת, בשפה פשוטה
מכונה וירטואלית (VM), אורח (Guest)
מחשב שלם שקיים כתוכנה: מעבד, זיכרון, דיסק ומערכת הפעלה משלו, שרצים על גבי מכונה אמיתית. "אורח" הוא אותו דבר, מנקודת המבט של המארח.
מארח (Host), שרת מחשוב (Node)
השרת הפיזי האמיתי שעליו רצה מכונה וירטואלית. ב-LexiVirt מארח שמותקן עליו ה-agent נקרא node.
היפרוויזור (Hypervisor)
שכבת התוכנה שמאפשרת למכונה אחת להריץ כמה מכונות וירטואליות, כשהיא מחלקת לכל אחת נתח מהחומרה האמיתית. LexiVirt משתמשת ב-KVM.
KVM
וירטואליזציה מובנית בקרנל של לינוקס. דורשת תמיכה במעבד (Intel VT-x או AMD-V), ולכן חייבים להפעיל אותה ב-BIOS. איתה, קוד האורח רץ במהירות קרובה מאוד לזו של חומרה אמיתית.
QEMU
התוכנה שמדמה את כל חלקי המחשב שאינם המעבד — דיסקים, כרטיסי רשת, מסך, מקלדת. QEMU יחד עם KVM הם הצמד שבפועל מריץ כל מכונה.
libvirt
שכבת הניהול הסטנדרטית מעל QEMU/KVM. שומרת את ההגדרה של כל מכונה כמסמך XML ומספקת את הממשק להפעלה, עצירה ועריכה. הפקודה virsh היא הלקוח שלה משורת הפקודה.
Domain
המילה של libvirt למכונה וירטואלית. אם כלי מדבר על "domain", הכוונה ל-VM.
Agent
השירות הקטן של LexiVirt בכל שרת מחשוב. מקבל הוראות מהקונסולה ומבצע אותן דרך libvirt. אין לו ממשק משלו.
קונסולת ניהול
דשבורד הווב. מחזיק חשבונות, את רשימת השרתים ואת יומן הביקורת; לא מריץ מכונות בעצמו.
סוד אשכול (Cluster secret)
הסוד המשותף בין הקונסולה לכל agent. נשלח בכותרת x-agent-token בכל בקשה לשרת מחשוב; בלעדיו שרת דוחה הכול.
vCPU
ליבת מעבד וירטואלית שמוצגת לאורח. כמה vCPUים חולקים את הליבות האמיתיות של המארח; חלוקה של יותר vCPUים ממה שקיים פיזית נקראת overcommit וזו פרקטיקה רגילה.
RAM / זיכרון
זיכרון שמוקצה למכונה. בניגוד למעבד הוא באמת נתפס כל עוד המכונה רצה, ולכן סכום המכונות על מארח אסור שיעלה על מה שיש לו.
qcow2
פורמט קובצי הדיסק של QEMU. כל הדיסק של מכונה הוא קובץ .qcow2 אחד בשרת. הוא thin-provisioned: דיסק של 100 GB שמכיל 3 GB של נתונים תופס כ-3 GB. הוא גם תומך ב-snapshots.
Thin provisioning (הקצאה דקה)
הקצאת מקום על הנייר וצריכה שלו רק כשבאמת משתמשים בו. נוח, אבל מאפשר להבטיח יותר דיסק ממה שיש — עקבו אחרי המקום הפנוי בשרת.
ISO
קובץ בודד שמכיל את תוכנת ההתקנה של מערכת הפעלה, בית אחר בית כמו דיסק התקנה. מכונה חדשה מאתחלת ממנו כדי להתקין מערכת הפעלה.
Snapshot (תצלום מצב)
עותק של הדיסק ברגע נתון שאפשר לחזור אליו. שימושי לפני שינוי מסוכן. זה לא גיבוי — הוא יושב על אותו דיסק כמו המקור, ולכן מת יחד איתו.
VNC
הפרוטוקול שמעביר מסך, מקלדת ועכבר של מכונה דרך הרשת. לכל מכונה ב-LexiVirt יש שרת VNC משלה עם סיסמה אקראית; הקונסולה מתווכת אותו אל הדפדפן שלכם.
noVNC
לקוח ה-VNC ב-JavaScript שמצייר את המסך הזה בתוך לשונית דפדפן, כך שלא צריך להתקין שום דבר מקומית.
WebSocket
חיבור רשת שנשאר פתוח לשני הכיוונים בתוך הפעלת HTTPS רגילה. הוא מה שמאפשר לקונסולת המכונה ולגרפים החיים בדשבורד לזרום ברציפות דרך אותו פורט כמו שאר האתר.
NAT (תרגום כתובות רשת)
לאפשר להרבה מכונות לחלוק כתובת אחת, על ידי שכתוב התעבורה היוצאת כך שתיראה כאילו הגיעה מהמארח. ברירת המחדל לאורחים ב-LexiVirt: הם יוצאים החוצה, אף אחד לא נכנס פנימה.
גשר (Bridge — virbr0, br0)
מתג רשת וירטואלי בתוך המארח. virbr0 הוא גשר ה-NAT של libvirt; גשר שאתם יוצרים בעצמכם מעל כרטיס פיזי מציב את האורחים ישירות על הרשת האמיתית שלכם.
VLAN (802.1Q)
תווית ממוספרת 1–4094 שמתווספת למסגרות Ethernet ומפצלת רשת פיזית אחת לכמה רשתות לוגיות מבודדות. מכונות עם תוויות שונות לא רואות זו את זו גם על אותו כבל. LexiVirt לא מתייגת VLANים בעצמה, אבל היא יודעת לחבר אורחים לגשר מתויג דרך רשת מגושרת — ראו סעיף 11.
Trunk / Access port
מונחים של מתגים. פורט access נושא VLAN אחד ללא תווית; פורט trunk נושא כמה, עם תוויות, על כבל אחד.
CIDR (למשל 192.168.122.0/24)
דרך לכתוב טווח כתובות. המספר אחרי הלוכסן הוא כמה סיביות מובילות קבועות: /24 מקבע את שלושת המספרים הראשונים ומשאיר 254 כתובות שמישות.
שער (Gateway)
הכתובת שאליה נשלחת תעבורה כשהיעד שלה מחוץ לרשת המקומית. עבור אורחי LexiVirt זהו 192.168.122.1, כלומר השרת עצמו.
DHCP
השירות שנותן למכונה כתובת אוטומטית כשהיא מצטרפת לרשת. libvirt מריץ אחד עבור רשת ה-NAT, ולכן מכונות חדשות מקבלות כתובת בלי שאומרים להן.
הפניית פורט (Port forwarding / DNAT)
כלל בחומת אש ששולח תעבורה שמגיעה לפורט במארח הלאה אל מכונה מסוימת, כך שאפשר להגיע מבחוץ לשירות בתוך מכונה מוסתרת מאחורי NAT.
כתובת MAC
הכתובת החומרתית של כרטיס רשת, גם וירטואלי. libvirt מייצר אחת לכל מכונה; כך DHCP מזהה את אותה מכונה בכל פעם.
יחידת systemd / שירות
איך לינוקס מפעילה ומשגיחה על תוכניות רקע. lexivirt-console ו-lexivirt-agent הן יחידות; systemctl שולט בהן ו-journalctl מציג את היומנים שלהן.
nginx, reverse proxy
שרת הווב שיושב לפני הקונסולה. הוא מסיים את ה-HTTPS על פורט 9443 ומעביר HTTP רגיל לאפליקציה על loopback — ולכן האפליקציה עצמה אף פעם לא חשופה.
TLS / SSL, תעודה בחתימה עצמית
ההצפנה שמאחורי HTTPS. תעודה בדרך כלל מוכיחה למי אתם מתחברים; תעודה בחתימה עצמית מצפינה את התעבורה אבל אף אחד לא ערב לזהות, ולכן הדפדפן מזהיר.
אסימון הפעלה (Session token, JWT)
ההוכחה החתומה לזהות שלכם, שמונפקת בכניסה ונשמרת בעוגייה שה-JavaScript בדפדפן לא יכול לקרוא. פג תוקף אחרי 24 שעות.
יומן ביקורת (Audit log)
הרישום של מי עשה מה ומתי — כניסות, יצירה ומחיקה של מכונות, שינויי שרתים, העלאות.
Overcommit
הקצאה של יותר מהמשאב ממה שקיים פיזית. בטוח ושגרתי ב-vCPU; מסוכן בזיכרון.

מוכנים לבנות?

פקודה אחת, שרת אחד, בערך חמש דקות.

התחילו בחינם