Whatsup - לינוקס, תוכנה חופשית וקוד פתוח בעברית

שימוש מתקדם בלינוקס - שאלה: מדוע לא ניתן לעדכן קרנל ללא איתחול

Anonymous - 16/04/2015 - 20:01
נושא ההודעה: שאלה: מדוע לא ניתן לעדכן קרנל ללא איתחול
מדוע עידכון קרנל לא יכול להתבצע במהלך ריצת מערכת, כמו עדכונים אחרים? מה המכשול פה שמונע את זה?

(אני יודע שבגירסא של הקרנל הבא זה יהיה אפשרי)

תודה
Anonymous - 16/04/2015 - 20:08
נושא ההודעה: Re: שאלה: מדוע לא ניתן לעדכן קרנל ללא איתחול
אליבהאיה :
מדוע עידכון קרנל לא יכול להתבצע במהלך ריצת מערכת, כמו עדכונים אחרים? מה המכשול פה שמונע את זה?

(אני יודע שבגירסא של הקרנל הבא זה יהיה אפשרי)

תודה



כן אפשר לפי מיטב ידיעתי,
הפקודה kexec
http://en.wikipedia.org/wiki/Kexec
מאפשר לטעון את הקרנל מחדש,
במערכות רבות משתמשים בטריק הזה בשביל שדרוגים,

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

מחיפוש בגוגל מצאתי גם את:
http://en.wikipedia.org/wiki/Ksplice
אבל המנגנון אינו מוכר לי...

בגרסא הנוכחית של הקרנל הוסיפו hot patching לקרנל,
בעזרת מנגנון אחר - שוב אני לא בקיא בנושא..
Anonymous - 16/04/2015 - 22:06
נושא ההודעה: תודה על התגובה
הרי ברור שעדכונים אחרים נעשים על ידי כיבוי התהליך והתחלתו מחדש וברור שלא ניתן לעשות את זה עם התהליך של הקרנל. אבל מדוע לא ניתן לטעון קרנל חדש ואז להעביר את השליטה אליו? סתם תוהה... אבל גם אני לא מבין בזה
Anonymous - 17/04/2015 - 07:36
נושא ההודעה:
אפשר וגם עושים את זה. אינטואיטיבית זה לא נשמע פשוט וגם אני חושב שלא מחליפים את כל הקרנל אחרת זה על גבול הבלתי אפשרי. בווינדוס אתה צריך לאתחל כל פעם שאתה מוסיף דרייבר שלא לדבר על להחליף את כל מערכת ההפעלה.
http://www.omgubuntu.co.uk/2015/04/linux-kernel-4-0-new-features
Anonymous - 17/04/2015 - 09:48
נושא ההודעה:
אחת הסקירות על הנושא ב־LWN:
http://lwn.net/Articles/596854/

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

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

המועמד הוותיק יותר (ksplice) ניסה לעצור את כל המערכת, להחליף את הקוד, ולהמשיך. המועמד החדש יותר (kgraft) מנסה להחליף את חלקי הליבה הרצים אחד אחרי השני (לא בזמן שהם רצים בפועל).

מה שמוזג בינתיים זה תמיכה בסיסית בשתי הגישות:
http://lwn.net/Articles/634649/
שחר - 17/04/2015 - 22:44
נושא ההודעה:
אי אפשר להחליף קרנל. פשוט אי אפשר.

kexec נראה, מבחינת מערכת ההפעלה, כמו ריבוט. ההבדל היחידי הוא שלא צריכים לעבור דרך שלבי ה–boot של המחשב, מה שמאפשר החלפה קצרה יותר (כמו גם סוגים מסויימים של מערכות וירטואליות, כפי שאמרו פה). עדיין, מדובר בסגירת כל הליכי ה–user space הקיימים ופתיחתם מחדש. לכל צורך ועניין, מדובר באיתחול.

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

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

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

שחר
כל הזמנים הם GMT + 2 שעות