כמה מילים על הדרייבר של nVidia ועל מסכים בעייתיים

Nvidia-logoישנו דרייבר אחד בלינוקס שיש לו היסטוריה ארוכה של בעיות "פוליטיות" והגדרות טכניות – זהו הדרייברים של כרטיסי המסך של nVidia. רבות כבר נכתב על הדרייברים של nVidia, כמה הם סגורים, מורכבים, לא תואמים תמיד, ו"עקשנים" בסירובם לרוץ בסביבות מסויימות.

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

בלינוקס ישנם 2 סוגים של דרייברים לכרטיסים הגרפיים של nVidia ל-PC (ל-ARM זה סיפור אחר לגמרי). ישנו הדרייבר הפתוח בשם Nouveua. זהו דרייבר שנעשה ע"י "הנדסה לאחור" (Reverse Engineering) והוא בקוד פתוח. הדרייבר הזה נותן תמיכה טובה בגרפיקה דו/תלת מימד, וידאו, Boot גרפי ועוד. החל מפברואר חברת nVidia החלה גם לתרום קוד לדרייבר הזה (ולפני כן היא בשקט תרמה כרטיסים חדשים לפני יציאה רשמית כך שכרטיסים חדשים נתמכו ע"י הדרייבר ביום הראשון שהם יצאו לשוק). הדרייבר הזה יכול לשמש משתמשי לינוקס עם 1-2 מסכים בצורה די טובה אבל הוא חלש בביצועים בכל הקשור למשחקים, עריכת וידאו, תוכנות תלת מימד וכו'.

מהצד השני ישנו דרייבר בינארי רשמי של nVidia. הדרייבר הזה תומך בכל תכונה שיש לכרטיסי המסך מבוססי nVidia כולל תמיכה בדברים חדשים כמו Display Port, Thunderbolt (ללא "הכנסה חמה"), כרטיסים מרובים במחשב אחד, SLI, גרפיקה ווידאו מהיר (אותה מהירות כמו Windows). הדרייבר עצמו הוא סגור (הסיבות שהן סגור: הדרייברים של לינוקס, מק ו-Windows משתמשים באותו קוד בסיס ועקב שילוב של קוד מגורמים שונים מחוץ ל-nVidia – אין אפשרות לשחרר אותו), מה שגורם לו להיות בעייתי בעולם הלינוקס, עולם שבו גירסת הליבה משתנה תדיר והמשתמש גם יכול לשנות את הגירסה, ומכיוון שרוב הדרייבר הוא מודול ליבה (מפלצתי – 11.3 מגהבייט. שזה פי כמה וכמה יותר מכל מודול בליבה), יש צורך בקימפול מחדש בכל פעם שמשנים קרנל (ב-fedora יש את dkms ו-akmod שמטפלים בכך אוטומטית בעת הפעלת הלינוקס) – כך שמבחינת ביצועים הדרייבר יתן לך תוצאות טובות, אולם הדרך להגיע לשם היא לא תמיד קלה.

אחת הבעיות הגדולות עם הדרייבים הרשמיים של nVidia היא להסתדר עם ציוד בעייתי, וכשאני מדבר על ציוד בעייתי, אני מדבר על ציודים עלומי שם שלא ממש מחזירים מידע שהדרייבר מצפה לקבל. כך לדוגמא, הח"מ משתמש במסך IPS עם רזולוציית 2560X1440 מייצור קוריאני ללא שם (על המסך כתוב CrossOver אולם כשמנסים לקרוא דרך לינוקס וכרטיס המסך את הפרטים של הכרטיס, מקבלים תשובה של QHD270QHD270QHD270 וג'יבריש בכל הקשור לרזולוציות שהמסך תומך). כשהחלק הגרפי (Xorg) בלינוקס עולה, הדרייבר מיד נופל בטענה שהוא לא מכיר את המסך הזה. לעומתו הדרייבר החופשי Nouveau מבין שזהו עוד מסך עלום שם עם רזולוצייה של 2560X1440 והוא פשוט מתעלם ממה שהמסך אומר ומפעיל עליו את הרזולוציה הנ"ל – וזה עובד מצוין, רק שביצועי תלת מימד/משחקים וכו' לא תקבל.

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

בעקרון יש מספר סוגי חיבורים שהדרייבר מתייחס אליהם. אני אתעלם כרגע מחיבורים פנימיים (LVDS – זה מתאים למערכות משובצות ומערכות אחרות שאינן חלק מהפוסט הזה) ונתייחס לחיבורים חיצוניים:

  • חיבור VGA נחשב עבור הכרטיס הגרפי כחיבור למסך CRT ישן (כן, מסכי LCD עם חיבור VGA משתמשים במעגלים פנימיים להדמיית מסך אנלוגי) ולפיכך אם תחבר מסך ב-VGA, הדרייבר יציין לעצמו שיש CRT
  • חיבורים כמו DVI, DVI-DL, Thunderbold, DisplayPort, HDMI הם חיבורים דיגיטליים ולפיכך הדרייבר ממפה אותם כחיבורי DFP (ר"ת Digital Flat Panel) ונותן להם מספרים, כך שאם יש לך מסך עם אחד מהחיבורים שציינתי לעיל, הוא ימפה אותם לפי סדר מספרי DFP-0, DFP-1 וכו'. קישוריות כזו כוללת תקשורת דו כיוונית מלאה והמסך נותן הרבה יותר מידע על עצמו לכרטיס המסך. הוא נותן לכרטיס הגרפי פרטים כמו גודל פיזי של הפאנל, כל האזולוציות שהוא תומך בהן, קצבי רענון מסך שהוא תומך בהם, נקודות לאינצ' (ככל שיש יותר נקודות – האותיות יהיו יותר קטנות ולכן אם אתה רואה את הטקסט באותיות מאוד קטנות – כדאי שתעלה את ה-DPI ל-128 לדוגמא במקום 96 שהוא ברירת המחדל), והאם המסך תומך בכיבוי, צריכת חשמל נמוכה ועוד.

לפיכך, אם המסך הבעייתי הוא בחיבור DFP-1 לדוגמא (כמו במקרה שלי), נצטרך להזין לו שורת ModeLine שתגדיר לו את הרזולוציה והרענון בצורה ידנית (כלומר ספציפית) או שנשתמש בקובץ בינארי פשוט ונבקש מהדרייבר שיתייחס לקובץ הבינארי במקום לנסות לקרוא את פרטי המסך. במידה ויש לך מספר מסכים בעייתיים, תוכל להשתמש בקבצים בינאריים שונים שנמצאים באינטרנט או שפשוט תוכל להזין את ה-ModeLine בתוך קובץ etc/xorg.cong/ כפי שזה מופיע ההרחבה בפוסט הזה.

חשוב לזכור: מכיוון שרוב הפצות הלינוקס מפעילות את עצמן במצב גרפי, אם התקנת את הדרייבר הבינארי, סביר להניח שתקבל סמן מהבהב ותו לא. לחץ על מקשים ALT F2 והתחבר כ-root ולאחר מכן הפעל פקודת: telinit 3 כדי שהלינוקס יעבור למצב טקסטואלי. לאחר שהגדרת את השינויים, תוכל לנסות אותם ע"י הפעלת פקודת startx (כדאי למחוק את קבצי var/log/Xorg*log/ לפני כן כדי שאם תהיה תקלה – תוכל לראות בקובץ החדש שנוצר היכן התקלה, סביר להניח שתראה זאת בסוף הקובץ ה-log). לאחר שתצליח להיכנס למצב גרפי, צא ממנו ע"י בחירה ב-logout או בחירת reboot.

עוד עניין חשוב: מחשבים ניידים רבים כיום נמכרים עם 2 מעבדים גרפיים: האחד הוא מה שמגיע במעבד (של אינטל) והשני הוא של nVidia. המעבדים של nVidia במחשבים ניידים כמובן שאינן כמו המעבדים בכרטיסים יעודיים, אבל הם יכולים להאיץ דברים מסויימים שצריך, דברים שהמעבד הגרפי של אינטל אין לו שום סיכוי להאיץ בצורה רצינית. השיטה שהמעבד של nVidia עובד במחשבים ניידים כאלו, הואיל ואין יציאת מסך נפרדת, היא להפנות את פלט הצ'יפ הגרפי – לתוך אזור זכרון שהמעבד הגרפי האינטלי נותן לו. תחשבו על זה כמו מסך ירוק או כחול בסרטים: מצלמים את הסרט עם מסך ירוק או כחול ברקע ולאחר מכן מחליפים את המסך הירוק או הכחול בגרפיקה ממוחשבת.

בלינוקס, בשביל להשתמש בכל הטרראם הזה, יש צורך בדרייבר משולב שנקרא BumbleBee (כן, כמו ההוא מ-Transformers). הדרייבר (הוא לא בדיוק דרייבר, זה יותר ערכת סקריפטים וספריות) לאחר ההתקנה אינו מספיק, ויש לבצע alias או לכתוב 2 שורות סקריפט ב-Bash כדי לגרום לאפליקציות להכיר בצ'יפ של nVidia ולרוץ על אותו צ'יפ גרפי. עוד פרטים בדף הבית של BumbleBee.

אם רוצים ביצועים יותר גבוהים מאותם מחשבים ניידיים ועם הצ'יפ של nVidia, אז תכירו את פרויקט Primus והחבילה primus נמצאת בכל גירסת לינוקס נפוצה. ב-Fedora אפשר להתקין בפשטות עם yum install primus

הרצת אפליקציה עם primus: כל מה שצריך זה לאמר למערכת להשתמש במנוע primus הוא להוסיף את הפרמטרים b primus- כלומר אם אני רוצה להריץ glxgears לדוגמא, אז הפקודה תהיה:

optirun -b primus glxgears

בהצלחה

כמה מילים על הגדרת מסכים בלינוקס, פדורה 18, וכאב ראש גדול

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

וכמו תמיד, שאתה אומר משפט כזה, מרפי מגיע לביקור. הורדתי את ה-ISO, שמתי על כרטיס SD ו… טראח, ההתקנה לא עובדת, הוא לא מצליח להפעיל שרות Plymoth והוא לא מוצא dev/root/ – באמת… תקלות שטותיות, רק לחפש את חבילת האקמול הקרובה אליך…

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

מאז שלינוקס נוצר כהפצה (בערך ב-93-94) ועד בערך התחלת שנות ה-2000 (בסביבות 2004-2006), לינוקס היה דבר לא קל להתקנה. רוצה להתקין כרטיס קול? חפש מה ה-DMA וה-IRQ ותוודא שאין לך התנגשות. רוצה להגדיר גרפיקה? תצטרך להכיר את הקובץ המקולל x11.conf, לוודא שיש דרייבר לכרטיס מסך שלך, לוודא שהדרייבר בכלל תומך בכרטיס מסך שלך וזו רק ההתחלה. אתה רוצה גם שהמסך שלך יציג את התמונה ב-Refresh Rate גבוה? חבוב, תתחיל להכיר את השורה המקוללת שמתחילה ב-Mode Line. קח, תתחיל לקרוא.

עם הזמן, הפצות הלינוקס השונות החלו להקל את החיים של המשתמשים בכל הקשור להתקנת לינוקס על המחשב. עדיין היית צריך לדאוג לדיסק קשיח נוסף או להשתמש בתוכנות צד ג' כדי לפנות לך מקום בדיסק, ליצור Partitions וכו', אבל החיים היו קצת יותר קלים. הפצת הלינוקס הראשונה שהציעה התקנה גרפית היתה של חברת Caldera ז"ל (מי זוכר אותם?) והיא עשתה כמעט הכל. שאלה אותך על כמה הגדרות וזהו… 20 דקות של התקנה שאתה לא עושה כלום, אז ההתקנה נותנת לך .. לשחק טטריס! אני רציני!

נחזור ל-2013. כיום, התקנות לינוקס כמו של פדורה, אובונטו או SuSE היא משחק ילדים וברוב המקרים היא יותר קלה מהתקנה של Windows. תאמר לתוכנה מה הסיסמא שאתה רוצה לקבוע כ-root, תבחר דיסק שאליו ההפצה תותקן, בחר תאריך וזמן ויאללה, התוכנה כבר מתקינה את עצמה. (הפעם אין טטריס. חבל). אחרי שהיא מסיימת אתה מפעיל את המחשב מחדש ו.. אם לא נוצר הפאק של אובונטו עם GRUB, אתה אמור לקבל מסך בחירה בין לינוקס ל-Windows, בחר לינוקס, ואחרי מספר רגעים תכניס שם משתמש וסיסמא – ואתה בתוך סביבה גרפית. תתחיל לעבוד.

מבחינת תמיכה בציוד, גם פה לינוקס עושה את החיים יותר קלים מ-Windows. אין שום CD להכניס כדי להתקין דרייברים, אין לך שרות כמו Windows Update שמחליט להתקין לך איזה דרייבר סופר-בסיסי וחפש אחר כך את הדרייבר המלא לבד (אהלן nVidia!), ובאופן עקרוני אם תחבר סורק, מצלמה, מדפסת, מיקרופון, אוזניות וכו' – אם גירסת הלינוקס שלך מעודכנת, הוא יכיר אותם ישר ויגדיר אוטומטית את המערכת. כל מה שנשאר לך לעשות זה להתקין את אחת מהתוכנות שתרצה כדי להשתמש בציוד. כנ"ל לגבי מסכים – פשוט תחבר, המערכת כבר תכיר לבד ותגדיר את עצמה, לך ישאר להגדיר אם המסך הנוסף הוא מימין, משמאל, מלמעלה או מלמטה וגם לזה יש ממשק גרפי פשוט.

נחזור עכשיו אליי. לי יש על השולחן 2 מסכים. מסך 24 אינטש של סמסונג ומסך 27 אינטש IPS שנקנה דרך EBAY במחיר של 330 דולר. איך הלינוקס מכיר את המסכים? דרך טכנולוגיה שנקראת EDID או Extended Display Identification Data. מה שהטכנולוגיה הזו עושה די פשוט: היא פונה למסך ומבקשת ממנו שיתן פרטים על עצמו: שם יצרן, דגם, מהם הרזולוציות שהוא תומך בהם ואלו מהירויות רענון מסך הוא מציג, כמו כן מהו החיבור שדרכו הוא מחובר למחשב. המערכת אוספת את הנתונים ועל פיהם היא מציגה אוטומטית את התמונה הטובה ביותר שהמסך יכול לתת וכל זאת בלי להגדיר שום דבר. 

ב-Windows ו-MAC הטריק הזה עובד מעולה. בלינוקס לעומת זאת, המערכת יותר ביקורטית. היא לא מסתפקת בנתונים האלו ומבקשת מהמסך גם Checksum של כל הנתונים, היא מחשבת בעצמה גם Checksum ומשווה. יש השוואה? מעולה, ממשיכים. אין השוואה? שהמשתמש ישבור את הראש…

שזה בדיוק מה שקרה אצלי. ה-Checksum לא נכון, כל עניין הגרפיקה נפל. 

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

מה עושים? לאחר 4 שעות של חיפושים והצלחות חלקיות, מצאתי פתרון: לוקחים מה שהמסך מוציא, יוצרים Checksum חדש, משחילים אותו דרך Hex Editor ואז מגדירים בקובץ xorg.conf שמסך ספציפי מסוים יהיה בעל קובץ EDID עצמאי, נוותר על שרותי הקריאה של הסרבר הגרפי (X). לקח לי עוד חצי שעה להבין את הקטע של הספציפי אחרי שראיתי שמסך הסמסונג מציג גרפיקה עם המון רעשים — אבל בסוף נפל האסימון וכרגע אני כותב את הפוסט מתוך הפדורה 18.

ואם כבר הזכרנו את פדורה 18.. יש לי מספר הערות הקשורות לתצוגת ההתקנה. מי לכל הרוחות בנה את התצוגה הזו? במקום לתת תצוגה שהיא בעצם "סריאלית" (כלומר צעד מוביל לצעד), המערכת נותנת לך מסך ו.. תתחיל לבחור מה לעשות, ויש פה ושם אייקונים שמראים לך איפה טעית. את הממשק לסידור הדיסק מבחינת התקנה שינו לחלוטין והוא נראה מבלבל מאוד, וההתקנה נראית כאילו חזרנו לימי המסכים שחור לבן. גם הכפתורים פוזרו במקומות שונים. אם היית רגיל לאשר פעולה בלחיצה על כפתור מצד ימין למטה, עכשיו חלק מהפעולות הכפתור שלהן נמצא … למעלה משמאל. למה? ככה.

אחרי הטראומה של ממשק ההתקנה ולאחר שהתקנתי את המערכת, שרפתי כמה שעות על הגדרת המסכים, הוספת פונטים, ועוד 1001 Repositories למיניהם, המצב נראה נהדר (פרסומת עצמית בלי בושה: רואים מה זה פרילאנסר סיסטם לינוקס שלא מתייאש? 🙂 ). כמובן שזו פדורה, ומה שעכשיו נמצא בפדורה יופיע בגירסה הבאה של RHEL/CENTOS/SL או אחריה, וגם הפעם ישנם המון שינויים מהותיים, כמו חומת האש, ועוד דברים נוספים שהתווספו ושונו. הרשימה כאן. אגב, אנשי הסיסטם מביניכם שמנהלים מערכות מיקרוסופט – פדורה היא ההפצה הראשונה שנותנת לכם להקים AD ולנהל אותו/להשתתף בו בקלות מרשימה ללא צורך בספריות צד שלישי.

לסיכום: הייתי שמח אם ממשק ה-Installer היה משתנה (מדוע עדיין לא הופכים אותו לסביבה וובית?), אך גם ללא זאת פדורה עדיין מציעה סביבות נוחות (KDE, GNOME וכו') עם קהילה גדולה ואת חזית הטכנולוגיה והמילה האחרונה בסביבה ידידותית. שאפו לפדורה.