אנחנו לוחצים על כפתור ההפעלה, רואים לוגו, מחכים כמה שניות, והמחשב "עולה".
אבל מאחורי הפעולה הפשוטה הזאת מסתתרת שרשרת ארוכה ומדויקת של שלבים. כל שלב מכין את הקרקע לשלב הבא, ואם אחד מהם נכשל, המחשב עלול להיתקע, להציג הודעת שגיאה או לא לזהות בכלל את מערכת ההפעלה.
בפוסט הזה נבין מה קורה מהרגע שבו החשמל מגיע למחשב ועד שמופיע מסך ההתחברות.
השרשרת המלאה
ברמה גבוהה, תהליך האתחול נראה כך:
Power Button
↓
Reset Vector
↓
Firmware
↓
POST
↓
Bootloader
↓
Kernel
↓
Root filesystem
↓
PID 1
↓
System services
↓
Loginכעת נפרק כל שלב.
1. לחיצה על כפתור ההפעלה
כפתור ההפעלה אינו "מריץ את Windows" או "פותח את Linux".
הוא גורם למערכת החשמל של המחשב להתחיל לספק מתח לרכיבים: המעבד, הזיכרון, לוח האם, כרטיס המסך, התקני האחסון, בקרים והתקנים נוספים.
אחרי שהמתחים מתייצבים, המעבד משתחרר ממצב reset ומתחיל לבצע קוד.
אבל מאיפה?
2. Reset Vector
כאשר המעבד מתחיל לפעול, עדיין אין מערכת הפעלה, אין דרייברים ואין אפליקציות.
המעבד צריך כתובת התחלתית ידועה מראש שממנה יתחיל לקרוא הוראות. הכתובת הזאת נקראת `Reset Vector`.
ה-Reset Vector אינו תוכנה מלאה. הוא נקודת ההתחלה שמפנה את המעבד לקוד הראשוני של ה-Firmware.
המעבד מתחיל
↓
קורא מה-Reset Vector
↓
מגיע לקוד ה-Firmware3. Firmware: BIOS או UEFI
ה-Firmware הוא הקוד הראשוני שמאפשר למחשב להתחיל להכיר את החומרה שלו.
בעבר רוב המחשבים השתמשו ב-BIOS. כיום רובם משתמשים ב-UEFI.
ה-Firmware אחראי בין השאר על:
- אתחול ראשוני של המעבד.
- זיהוי RAM.
- אתחול בקרי אחסון.
- הפעלת כרטיס מסך בסיסי.
- זיהוי מקלדת והתקנים.
- קביעת סדר האתחול.
- בחירת ההתקן שממנו תעלה המערכת.
ה-Firmware נשמר בזיכרון flash על לוח האם, ולכן הוא קיים גם כאשר הדיסק ריק ואין מערכת הפעלה מותקנת.
4. POST
אחד השלבים שמבצע ה-Firmware הוא `POST`, ראשי תיבות של `Power-On Self-Test`.
זהו תהליך בדיקה ראשוני של רכיבי חומרה מרכזיים: האם קיים RAM, האם המעבד פועל, האם יש בעיית חומרה קריטית, האם כרטיס המסך מסוגל להציג והאם בקרי האחסון מזוהים.
אם קיימת תקלה חמורה, המחשב עשוי לצפצף, להציג קוד שגיאה, להדליק נורית תקלה או להיעצר לפני טעינת מערכת ההפעלה.
חשוב להבין:
POST מתרחש לפני ה-Bootloader ולפני ה-Kernel.5. בחירת התקן אתחול
לאחר שהחומרה הבסיסית מוכנה, ה-Firmware מחפש מאיפה להתחיל את מערכת ההפעלה.
הוא עשוי לבדוק SSD, דיסק קשיח, USB, כונן חיצוני, רשת או התקן אחר.
הסדר נקבע לפי `Boot Order`.
ב-UEFI קיימות בדרך כלל גם רשומות בשם `Boot Entries`. כל Boot Entry יכולה להצביע על קובץ EFI מסוים.
לדוגמה:
\EFI\Microsoft\Boot\bootmgfw.efi
\EFI\ubuntu\shimx64.efi6. Legacy BIOS מול UEFI
ההבדל ביניהם אינו רק ש-BIOS ישן ו-UEFI חדש.
הם מאתרים את קוד האתחול בצורה שונה.
Legacy BIOS
BIOS קלאסי קורא אזור קבוע בתחילת הדיסק: `MBR`.
ה-MBR מכיל קוד קטן מאוד שממשיך את תהליך האתחול.
BIOS
↓
קורא sector קבוע
↓
מריץ קוד מה-MBRUEFI
UEFI מסוגל לקרוא מערכת קבצים ממחיצה מיוחדת בשם `EFI System Partition`, או בקיצור `ESP`.
הוא טוען ממנה קובץ EFI רגיל.
UEFI
↓
קורא Boot Entry
↓
ניגש ל-ESP
↓
טוען קובץ EFI
↓
מריץ אותולכן UEFI גמיש יותר ומאפשר כמה Bootloaders במקביל.
7. Bootloader
ה-Bootloader הוא הגשר בין ה-Firmware לבין ה-Kernel.
דוגמאות:
- Windows Boot Manager.
- GRUB.
- systemd-boot.
- Bootloader של Android.
- Bootloader של macOS.
תפקידיו יכולים לכלול הצגת תפריט מערכות הפעלה, בחירת Kernel, טעינת ה-Kernel ל-RAM, טעינת initramfs, העברת פרמטרים ל-Kernel, מסירת מידע על הזיכרון והחומרה, ומעבר לנקודת הכניסה של ה-Kernel.
השלב האחרון שלו הוא למעשה:
טען Kernel ל-RAM
↓
הכן נתוני אתחול
↓
קפוץ ל-entry point של ה-Kernelמרגע זה השליטה עוברת ל-Kernel.
8. למה ה-Kernel נטען ל-RAM?
ה-Kernel נשמר כקובץ בדיסק, אבל המעבד צריך לבצע את הוראותיו מתוך הזיכרון.
לכן ה-Bootloader מעתיק אותו לאזור מתאים ב-RAM. לאחר מכן המעבד מתחיל להריץ את קוד ה-Kernel.
בשלב הזה אין עדיין Chrome, אין שולחן עבודה ואין מסך התחברות. יש רק Kernel שמתחיל לבנות את מערכת ההפעלה.
9. מה ה-Kernel עושה בתחילת הדרך?
ה-Kernel מאתחל תשתיות בסיסיות:
- ניהול זיכרון.
- page tables.
- interrupts.
- timers.
- scheduler.
- drivers.
- מערכות קבצים.
- processes.
- threads.
- אבטחה והרשאות.
- תקשורת עם חומרה.
הוא מקבל מה-Firmware או מה-Bootloader גם מפת זיכרון שמתארת אילו אזורים פנויים, שמורים, שייכים לחומרה, מכילים את ה-Kernel או מכילים initramfs.
בלי המפה הזאת הוא עלול לדרוס אזור זיכרון קריטי.
10. initramfs
אחד המושגים שקל להתבלבל בהם הוא `initramfs`.
ה-initramfs אינו Kernel נוסף. הוא מערכת קבצים זמנית שנמצאת ב-RAM.
ה-Kernel משתמש בה בשלב מוקדם כדי להגיע למערכת הקבצים הראשית. היא עשויה להכיל drivers של אחסון, drivers של מערכת קבצים, כלי פתיחת הצפנה, תמיכה ב-LVM, תמיכה ב-RAID, כלי זיהוי דיסקים וסקריפטים לאתחול מוקדם.
לדוגמה:
Kernel מתחיל
↓
משתמש ב-initramfs
↓
טוען driver
↓
פותח דיסק מוצפן
↓
מזהה את מחיצת ה-root
↓
מחבר את מערכת הקבצים הראשית11. Root filesystem
לאחר שה-Kernel מצליח להגיע לכונן הנכון, הוא מחבר את מערכת הקבצים הראשית.
ב-Linux היא נקראת בדרך כלל `/`.
בתוכה נמצאים קבצי מערכת, שירותים, ספריות, תוכנות, הגדרות, משתמשים וקבצי מערכת הפעלה.
אם ה-Kernel לא מצליח למצוא את ה-Root Filesystem, ייתכן שנראה שגיאות כמו:
Unable to mount root filesystemגורמים אפשריים:
- UUID שגוי.
- מחיצה שנמחקה.
- driver חסר.
- initramfs פגום.
- דיסק מוצפן שלא נפתח.
- מערכת קבצים פגומה.
- כונן שאינו מזוהה.
12. PID 1
לאחר שה-Kernel מוכן ומערכת הקבצים הראשית זמינה, הוא יוצר את התהליך הראשון ב-User Space.
התהליך הזה מקבל `PID 1`.
במערכות Linux מודרניות הוא בדרך כלל `systemd`.
PID 1 אינו חלק מה-Kernel. ה-Kernel מספק את התשתית, ואילו PID 1 מתחיל לבנות את סביבת המשתמש.
תפקידיו עשויים לכלול הפעלת שירותי מערכת, ניהול תלויות, הפעלת רשת, הפעלת שירותי אחסון, הפעלת מסדי נתונים, הפעלת מסך התחברות, טיפול בשירותים שנכשלים ואיסוף processes יתומים או zombies.
13. שירותי מערכת
שירותים אינם מופעלים סתם בסדר אקראי.
לדוגמה:
שירות אפליקציה
תלוי במסד נתונים
מסד הנתונים
תלוי במערכת הקבציםלכן הסדר יהיה:
מערכת קבצים מוכנה
↓
מסד נתונים
↓
שירות אפליקציהמערכות מודרניות מפעילות במקביל שירותים שאינם תלויים זה בזה כדי לקצר את זמן האתחול.
14. Login
לאחר שהשירותים החיוניים מוכנים, המערכת מפעילה מסך התחברות גרפי, login טקסטואלי, shell או סביבת Desktop.
לאחר שהמשתמש מזדהה:
אימות משתמש
↓
יצירת session
↓
טעינת הרשאות
↓
טעינת Desktop
↓
הפעלת תוכנות התחלהרק עכשיו אפשר לומר שהמחשב זמין באמת למשתמש.
Secure Boot
אחת הבעיות המסוכנות ביותר היא קוד זדוני שמופעל לפני מערכת ההפעלה.
לשם כך קיים `Secure Boot`.
ה-UEFI בודק חתימות דיגיטליות של רכיבי האתחול.
UEFI
↓ מאמת
Bootloader
↓ מאמת
Kernelכך נוצרת `Chain of Trust`: כל שלב מאמת את השלב הבא.
אבל חשוב לזכור: קובץ חתום אינו בהכרח נטול באגים או חולשות.
החתימה מוכיחה בעיקר מי חתם עליו, שהוא לא שונה מאז החתימה, ושהמערכת סומכת על המפתח.
Verified Boot
Verified Boot מרחיב את הרעיון ובודק גם את שלמות מחיצות וקבצי המערכת.
הוא נפוץ במיוחד במכשירים כמו Android.
באמצעות hashes אפשר לזהות אם block במחיצת המערכת השתנה.
קרא block
↓
חשב hash
↓
השווה לעץ האימות
↓
אם שונה — חסום או דווחSecure Boot מתמקד בדרך כלל ברכיבים שמריצים. Verified Boot בודק גם תוכן מערכת לאורך שרשרת האתחול ולעיתים בזמן הקריאה.
Android ו-Boot ROM
בטלפונים קיים בדרך כלל שלב מוקדם בשם `Boot ROM`.
זהו קוד קטן שצרוב בשבב ואינו ניתן לשינוי רגיל. הוא נחשב שורש האמון.
Boot ROM
↓ מאמת
Bootloader
↓ מאמת
Kernel ומחיצות מערכתפתיחת Bootloader בטלפון גורמת לעיתים למחיקת נתונים כדי למנוע מתוקף לפתוח את שרשרת האתחול ולהגיע למידע של המשתמש.
עדכוני A/B
מכשירים רבים משתמשים בשתי קבוצות מחיצות:
Slot A
Slot Bאם המכשיר עובד כרגע מ-A, העדכון נכתב ל-B.
פועל מ-A
↓
מתקין עדכון ב-B
↓
מאמת את B
↓
מאתחל מ-Bאם B נכשל, המכשיר יכול לחזור ל-A.
כך הפסקת חשמל באמצע עדכון פחות מסוכנת.
PXE: אתחול מהרשת
לא חייבים לעלות מכונן מקומי.
ב-PXE המחשב יכול לקבל את קובצי האתחול מהשרת:
Firmware
↓
כרטיס רשת
↓
DHCP
↓
פרטי שרת אתחול
↓
הורדת Bootloader
↓
הורדת Kernel או מתקיןמשתמשים בזה בארגונים לצורך התקנת מאות מחשבים, שחזור מערכות, מחשבים ללא דיסק, Thin Clients ומרכזי נתונים.
Dual Boot
ב-Dual Boot מותקנות כמה מערכות הפעלה, אך רק אחת רצה בכל רגע.
לדוגמה:
GRUB
├── Linux
└── Windows Boot Managerכאשר בוחרים Windows, GRUB יכול להפעיל את Bootloader של Windows. זה נקרא `Chain Loading`.
חשוב להבין: מחיקת Boot Entry אינה בהכרח מחיקת מערכת ההפעלה. ייתכן שהקבצים עדיין קיימים, אך ה-UEFI אינו יודע לאיזה קובץ EFI לפנות.
אתחול של מכונה וירטואלית
גם VM עוברת תהליך אתחול דומה:
Firmware וירטואלי
↓
Bootloader
↓
Kernel
↓
Guest OSאבל החומרה שהיא רואה מסופקת על ידי Hypervisor.
לדוגמה, דיסק וירטואלי יכול להיות בפועל קובץ:
machine.qcow2מבחינת מערכת ההפעלה האורחת, הוא עדיין נראה כמו התקן block עם sectors, מחיצות, ESP, Bootloader ומערכות קבצים.
Type 1 Hypervisor
Hardware
↓
Hypervisor
↓
VMs
Type 2 Hypervisor
Hardware
↓
Host OS
↓
Hypervisor
↓
VMsאיך מאבחנים תקלת אתחול?
המיקום שבו התהליך נעצר מספק רמז חזק.
אין תצוגה
חפשו ב:
- ספק כוח.
- RAM.
- לוח אם.
- CPU.
- GPU.
- POST.
No bootable device
ה-Kernel עדיין לא התחיל.
חפשו ב:
- Boot Order.
- Boot Entry.
- ESP.
- Bootloader.
- כונן שאינו מזוהה.
GRUB מופיע אבל Linux לא עולה
כבר הצליחו:
- Firmware.
- התקן האתחול.
- Bootloader.
חפשו ב:
- Kernel.
- initramfs.
- פרמטרי Kernel.
- Root Filesystem.
- drivers.
- הצפנת דיסק.
Kernel עולה אבל אין מסך התחברות
חפשו ב:
- PID 1.
- systemd.
- שירותים.
- driver גרפי.
- login manager.
- מערכת קבצים.
ומה קורה בכיבוי?
כיבוי אינו פשוט ניתוק חשמל.
מערכת ההפעלה צריכה:
להפסיק עבודות חדשות
↓
לסגור אפליקציות
↓
לעצור שירותים
↓
לסיים transactions
↓
לכתוב buffers
↓
לכתוב page cache
↓
לסגור קבצים
↓
לבצע unmount
↓
לסיים Kernel
↓
לבקש מהחומרה לכבותלחיצה ארוכה על כפתור ההפעלה עוקפת את התהליך הזה ועלולה לגרום לאובדן מידע או לשחיתות מערכת קבצים.
write, fsync ו-journaling
`write()` לא תמיד אומר שהמידע כבר הגיע פיזית לדיסק.
לעיתים הוא רק הגיע ל-page cache.
`fsync()` מבקש לדחוף את השינויים לאחסון ולהמתין לסיום.
Journaling עוזר לשמור על עקביות מערכת הקבצים לאחר קריסה. אבל הוא אינו מבטיח שכל תוכן הקובץ האחרון נשמר.
יכול להיות מצב שבו:
מבנה מערכת הקבצים תקין
אבל
השינויים האחרונים חסריםסיכום
תהליך האתחול אינו פעולה אחת, אלא שרשרת של אחריות:
המעבד מתחיל
↓
Firmware מכין חומרה
↓
POST בודק רכיבים
↓
Bootloader טוען Kernel
↓
Kernel בונה את מערכת ההפעלה
↓
initramfs עוזר להגיע ל-root
↓
PID 1 מפעיל שירותים
↓
המערכת מגיעה ל-loginההבנה של השרשרת הזאת אינה רק תאוריה. היא מאפשרת לאבחן תקלות, להבין למה מערכת לא עולה, לעבוד עם Linux, להבין VMs, להבין Secure Boot, להבין Android, להבין Dual Boot, להבין כיבוי בטוח, ולהבין מה באמת קורה לפני שהאפליקציה הראשונה בכלל נפתחת.
בפעם הבאה שתלחצו על כפתור ההפעלה ותראו לוגו, תדעו שמאחוריו כבר התרחשו מאות פעולות, עוד לפני שמערכת ההפעלה הציגה לכם דבר אחד.