- יניב אור
SysV init
עודכן ב: 7 יול 2019
מערכת ותיקה מאוד לניהול פרוססים ולאתחול מערכות דמויות יוניקס. בימינו, רוב ההפצות מגיעות עם מערכות חדשות יותר, כמו systemd למשל.
בחרתי להשתמש במערכת הזאת מכמה סיבות:
המטרה היא ללמוד כמה שיותר על המערכת וניהול ידני/חצי-אוטומטי משיג את המטרה הזאת
אנחנו הולכים להתעסק עם קינפוגים וסקריפטים - לצורך העניין רשתות - בצורה ניסויית ועם מערכות כמו systemd יש סיכוי גבוה יותר לקונפליקטים.
סביבת מעבדה, כמה שיותר שליטה, פחות הפרעות.
בכל רגע נתון, System V, נמצא באחד מכמה מצבים מוגדרים. הם נקראים runlevels.
מעבר משלב-ריצה אחד לאחר גורם להרצה של סקריפטים ששייכים לשלב החדש.
מדובר על סקריפטים להרצת או עצירת daemons, סקריפטים שקשורים לניהול רשתות וכן הלאה.
בעיקרון, ישנם 7 שלבי-ריצה, 3 מהם נחשבים סטנדרט והם חיוניים לפעולה התקינה של המערכת.
0 עצירה - Halt
1 מוד משתמש יחיד - Single-user mode - (נקרא גם S או s)
6 אתחול - Reboot
השלבים הנוספים הם: 2-5 מוד ריבוי משתמשים (Multi-user mode)
יש אפשרות להשתמש גם ב-7 עד 9 אבל זה לא נהוג.
ב-Debian Strecth, שלבי הריצה הבאים מוגדרים:
N System bootup (NONE).
S Single user mode (not to be switched to directly)
0 halt
1 single user mode
2 .. 5 multi user mode
6 reboot
ב-/etc/inittab מוגדרים שלבי-הריצה השונים.
runlevel or who -r - to see current run-level
ה-process הראשון שרץ ע"י ה-kernel זה init - ה-pid שלו 1.
אחד החסרונות ב-init שהוא מריץ את המשימות שלו בצורה טורית מה שמאט את מהירות אתחול המערכת ובעיות נוספות.
ב-/etc/init.d/ נמצאים הסקריפטים עצמם וב-/etc/rc* נמצאים לינקים לקבצים ב-init.d והם קובעים את ה-priority והסדר בזמן ריצת ה-init.
התוכנה service שמנהלת את הסרביסים במערכת - מריצה ומנהלת את הסקריפטים האלה.
היא לא קשור ספציפית ל-init.d והיא מערכת ניהול service-ים עצמאית (היא עובדת גם מול systemd, למשל ואחרים).
service SCRIPT COMMAND [OPTIONS]
הסקריפטים ש-service מריץ חייבים להכיל לפחות את הפקודות: start ו-stop
סקריפטים של init לפי תקן LSB חייבים לעמוד בדרישות הבאות:
לממש את: start, stop, restart, force-reload, status
להחזיר exit code תקין
service SCRIPT --full-restart
יריץ את SCRIPT פעמיים, פעם ראשונה במצב stop ובפעם השנייה במצב start.
service --status-all
מריץ את כל הסקריפטים לפי סדר האלף-בית, עם COMMAND = status
אלו הם משתני המערכת שמועברים לסקריפטים ב-init.d:
LANG, LANGUAGE, LC_CTYPE, LC_NUMERIC, LC_TIME, LC_COLLATE, LC_MONETARY, LC_MESSAGES, LC_PAPER, LC_NAME, LC_ADDRESS, LC_TELEPHONE, LC_MEASUREMENT, LC_IDENTIFICATION, LC_ALL, TERM,
PATH
example: echo $LANG
cat /etc/init.d/skeleton
שלד לקובץ מסוג init.d
less /etc/init.d/README
קרא הסבר מפורט ובנוסף man insserv
update-rc.d
מנהל את הלינקים ב-/etc/rcrunlevel.d/NNname ובעצם מאפשר/לא מאפשר לסקריפטים לרוץ ב-init
אם רוצים למנוע מסקריפט להיטען ב-init מחליפים את הלינק מ-S ל-K
יש אפשרות לערוך את הסקריפטים עצמם ואת הלינקים - בצורה ידנית.
החבילה sysv-rc-conf מכילה כלים לניהול, בצורה נוחה יותר.
/lib/lsb/init-functions
יש בקובץ הזה פונקציות שימושיות, אפשר להכליל אותו בסקריפט בצורה:
. /lib/lsb/init-functions
/lib/init/vars.sh
מכין את המשתנים של rcS
/var/run/utmp and /var/log/wtmp
שים לב לקבצים הבאים
בהתקנות של Debian, בברירת מחדל, אין הבחנה בין שלבי-ריצה 2 עד 5 מה שנותן לנו חופש פעולה וקינפוג.
השימוש בשלבי-הריצה S ו-1 הוא לצורך תחזוקה.הם מתחילים service-ים בצורה מינימלית כדי למנוע בעיות אפשריות.
לשים לב, אתחול המערכת ב-Debian, בברירת המחדל נעשה בשלב-ריצה 2. כפי שמוגדר ב-/etc/inittab
ניתן לדרוס את ההגדרה הזאת בזמן ה-boot בעזרת פרמטר kernel.
יש גם אפשרות לשנות שלב-ריצה בזמן ריצה. שנה רק 1 עד 5.
init [runlevel]
or
telinit [runlevel] - רצוי להשתמש בזה
ניסיתי לארגן לקבוצות את הקבצים, סקריפטים וכו' שקשורים לנושא (אין סיבה לכך שה-validate LSB מודגש, אני אעדכן את השרטוט בהמשך).

וזה הביא לי רעיון לפתח איזושהי מערכת לינוקס לימודית שחלק מהממשק נראה בערך ככה, ארחיב בהמשך:

עוד שירטוטים שהכנתי. הסברים ומאמרים, בהמשך...


