← חזרה למאגר המאמרים

Linux Internals: Bridging the Hibernation Gap on Immutable OSTree Systems

מאת: שי מרדכי | תאריך פרסום: 5 ביוני 2026 | קטגוריה: OS Architecture, Linux Internals, AI-Augmented Research
הקדמה: קוד שעובד זה לא מספיק
בדצמבר 2025, לאחר המעבר ללינוקס, התגעגעתי מאוד לפיצ'ר ה-Hibernation (מצב שינה עמוק) המוכר מ-Windows. בעזרת סוכן AI (AI Agent), הרכבתי סקריפט אוטומטי שמאפשר את הפיצ'ר הזה על Fedora Kinoite. הסקריפט עבד בצורה חלקה, אבל כחוקר אבטחה וארכיטקטורה, זה לא סיפק אותי. רציתי להבין למה הפיצ'ר הזה לא מגיע כברירת מחדל בלינוקס מודרני.

ההחלטה לפרק את הסקריפט (שנכתב בסיוע ה-AI) לגורמים, ללמוד כל שורה בו, ולחקור אילו פערי ארכיטקטורה הוא מגשר, בנתה עבורי קומה חדשה לחלוטין בהבנת ה-Linux Internals. מאמר זה אינו מתיימר להציג כתיבת קוד מאפס, אלא מציג ניתוח הנדסי של ההתנגשויות בין שכבות הליבה של מערכת ההפעלה, וכיצד הן נפתרות.

שלושת אתגרי הארכיטקטורה (The Linux Internals Triad)

כדי שמחשב יתעורר מ-Hibernation, ה-Kernel צריך לטעון את הזיכרון חזרה מהדיסק עוד לפני שמערכת הקבצים הראשית עולה. במערכת כמו Fedora Kinoite, הדבר דורש גישור בין שלוש תת-מערכות קריטיות:

  1. שכבת מערכת הקבצים (Btrfs CoW): מנגנון ה-Copy-on-Write גורם לכך שההיסט הפיזי (Physical Offset) של קבצים משתנה. הליבה דורשת מיקום סטטי וקפוא בדיסק.
  2. שכבת מערכת ההפעלה (OSTree / Immutable Root): בניגוד להפצות רגילות, לא ניתן פשוט לערוך את ה-GRUB. יש להזריק פרמטרים ולקמפל מחדש את ה-Initramfs תחת מודל אטומי.
  3. שכבת האבטחה (SELinux & Polkit): הליבה תסרב לגשת לקובץ Swap בשלב ה-Boot ללא תיוגי האבטחה וההרשאות המתאימים.

Work in Progress 🚧

הניתוח הטכני המלא ברמת ה-Kernel, הסברי ה-Offset, והסקריפט המלא יעלו בהמשך במסגרת פרסום המחקר המלא.

1. ניתוח פתרון ה-Btrfs CoW

הליבה של לינוקס אינה מבינה "קבצים" בשלבי ה-Boot המוקדמים. היא ניגשת לסקטורים פיזיים בדיסק. מנגנון ה-CoW של Btrfs שובר את ההנחה הזו. הסקריפט משתמש ב-chattr +C כדי לבטל את התכונה הזו עבור תת-הנפח (Subvolume) הייעודי, ולאחר מכן מחלץ את הכתובת הפיזית הישירה באמצעות:

OFFSET=$(btrfs inspect-internal map-swapfile -r "${SWAPFILE}")

2. ניתוח מודל ה-OSTree (למה צריך Double Reboot?)

במערכות אטומיות (Immutable), שינוי פרמטרי ה-Resume של ה-Kernel מחייב יצירת Deployment חדש באמצעות rpm-ostree kargs, ושילוב דרייבר ה-Resume לתוך ה-Initramfs המינימלי. האתחול הכפול נדרש מכיוון שהאתחול הראשון רק פורס את המערכת החדשה, והאתחול השני מבטיח שרכיבי ה-Boot המוקדמים נטענים מתוכה בצורה נקייה.

3. הזרקת חוקי SELinux

ללא הגדרת ה-Context המדויק, הגישה לקובץ תיחסם ברמת ה-LSM (Linux Security Module):

semanage fcontext -a -t swapfile_t "${SWAPFILE}"
restorecon -v "${SWAPFILE}"

הקוד המלא (The Hibernation Setup Script)

#!/usr/bin/env bash
set -euo pipefail

# === config ===
SWAP_DIR="/var/swap"
SUBVOL="${SWAP_DIR}/swapvolume"
SWAPFILE="${SUBVOL}/swapfile"
SWAP_EXTRA_BUFFER_GB=2

# Dynamic RAM Size Calculation
MEM_TOTAL_KB=$(grep MemTotal /proc/meminfo | awk '{print $2}')
SWAP_SIZE_GB=$(( (MEM_TOTAL_KB + (SWAP_EXTRA_BUFFER_GB * 1024 * 1024) + 1048575) / 1048576 ))

# [Script Content Truncated for Visual Structure in Blur...]
echo "Adding kernel args (resume & resume_offset) with rpm-ostree kargs..."
rpm-ostree kargs --append="resume=UUID=${SWAP_UUID}" --append="resume_offset=${OFFSET}"
rpm-ostree initramfs --enable --arg='--add=resume'