איך לקמפל קרנל (Linux)

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

אז למה לקמפל?

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

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

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

מתחילים

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

$ uname -a
Linux 4.12.12-1 #1 SMP PREEMPT Sun Sep 10 09:41:14 CEST 2017 x86_64 GNU/Linux

אני אבחר בגרסה: 4.11.1 - בשבילי היא יציבה מספיק. לאחר ההורדה צרו תיקייה בשם linux וחלצו לתוכה את קוד המקור של הקרנל.

$ mkdir linux
$ mv downloads/linux-4.11.1.tar.xz linux/
$ cd linux && tar xvf  linux-4.11.1.tar.xz 

לאחר שחילצנו את הקרנל, נעבור לחלק היותר מעניין: החלת - patches. למי שלא יודע פאטץ’ (patch) - הוא טלאי לקוד מסוים, בשימוש בטלאי ניתן להוסיף או להסיר קטעי קוד. הרבה kernel hackers כתבו patches שנועדו לשפר את ביצועי הקרנל, אך אינם חלק מה - mainline ולכן נצטרך להוריד אותם בנפרד.

patches

ה - patch הראשון שבו נשתמש הוא של Con Kolivas - בחור אוסטרלי מוכר מאוד בסצנה שבין היתר כתב את LRZIP. בשנת 2009 Kolivas כתב את - Brain Fuck Scheduler. ה - Process scheduler כחלופה ל - CFS - אני לא ארחיב על Scheduling בפוסט זה. בשורה התחתונה BFS - ישפר את ביצועי המערכת שלכם באופן משמעותי אם את משתמשים ב - Desktop. החל מלינוקס 4.8 - BFS כבר לא בפיתוח ונכתב מחדש כ - MUQss.

ניתן להוריד את ה - patch מכאן לפי גרסת הקרנל שאנחנו מקמפלים, במקרה שלי זה - 4.11.1. לאחר ההורדה מקמו את ה - patch בתיקיית השורש של הקרנל שלכם:

$ pwd
~/linux
$ mv 4.11-sched-MuQSS_156.patch linux-4.11.1/
$ ls linux-4.11.1/
4.11-sched-MuQSS_156.patch  crypto         init     MAINTAINERS  scripts
arch                        Documentation  ipc      Makefile     security
block                       drivers        Kbuild   mm           sound
certs                       firmware       Kconfig  net          tools
COPYING                     fs             kernel   README       usr
CREDITS                     include        lib      samples      virt

הפאטץ’ הבא שבו נשתמש הוא - Budget Fair Queueing ה - I/O scheduler. ניתן להוריד אותו מכאן. במידה ואתם משתמשים בקרנל 4.12.0 ומעלה, אין צורך להוריד את BFQ לינוקס כבר מכיל אותו.
לאחר שהורדתם את ה - patches נחיל אותם על קוד המקור של הקרנל. לפי הסדר:

$ patch -p1 < 0001-block-cgroups-kconfig-build-bits-for-BFQ-v7r11-4.11..patches
$ patch -p1 < 0002-block-introduce-the-BFQ-v7r11-I-O-sched-for-4.11.0.patch 
$ patch -p1 < 0003-block-bfq-add-Early-Queue-Merge-EQM-to-BFQ-v7r11-for.patch
$ patch -p1 < 0004-blk-bfq-turn-BFQ-v7r11-for-4.11.0-into-BFQ-v8r11-for.patch 
$ patch -p1 < 4.11-sched-MuQSS_156.patch

לאחר ההחלה נעבור לחלק “הטריקי” - הגדרת הקרנל. לפני שתמשיכו וודאו שהחבילה bc מותקנת בהפצה שלכם. הקרנל שרץ לכם כרגע במערכת מוגדר באמצעות קובץ config שנמצא במיקום /proc/config.gz, נשתמש בקובץ זה על מנת לשמור הגדרות קיימות בקרנל. הכנת הקרנל:

$ make mrproper
$ zcat /proc/config.gz > .config
$ make menuconfig

לאחר הרצת הפקודות תקבלו תפריט שנראה כך:

linux_compile_menu


האפשרות הראשונה “General setup” מיועדת להגדרות כלליות כמו בחירת CPU Scheduler וכדומה:

linux_muqss

במידה ואתם רוצים לקבל מידע על אפשרות, תקישו - h:

linux_muqss

תעברו על האפשרויות השונות ותגדירו. אל תשנו הגדרות שאתם לא מכירים.
לאחר ה - “General setup” נעבור להגדרת ה - IO Scheduler.
עברו למיקום: Enable the block layer -> IO Schedulers

תאפשרו את ה - BFQ Scheduler באמצעות מקש ה - “space”:

linux_bfq_menu

לאחר מכן עברו לאפשרות Default IO Scheduler - ושנו ל - BFQ:

linux_bfq_menu

פה זה לא נגמר כמובן. תבדקו כל אפשרות שלא נראת לכם.
תחפשו הגדרות מומלצות לחומרה שלכם. את הקרנל הנוכחי אני מקמפל ללפטופ HP עם מעבד של intel, לכן מודולים שמיועדים ל - Dell/IBM/AMD - לא רלוונטים עבורי.

linux_dell_option

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

קימפול

הגיע הזמן. אחרי שבחשנו ותיבלנו את הקרנל הגיע הזמן להכניס אותו לתנור.
תריצו:

$ make -j4

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

כשהקרנל יהיה מוכן, תקבלו את ההודעה:

Kernel: arch/x86/boot/bzImage is ready  (#1)

לאחר הקימפול נתקין את המודולים החדשים:

$ sudo make modules_install

במידה ואתם מפתחים מודולים לקרנל אתם תצטרכו את ה - headers. תתקינו אותם עם הפקודה:

$ sudo make headers_install

נעתיק את הקרנל החדש לתקיית ה - /boot

64-bit:

cp -v arch/x86_64/boot/bzImage /boot/vmlinuz-linux-bh

32-bit:

cp -v arch/x86/boot/bzImage /boot/vmlinuz-linux-bh

ניצור initial RAM disk:

$ sudo mkinitcpio -k 4.11.1-bh -g /boot/initramfs-linux-bh

ולסיום נוסיף את הקרנל החדש לתפריט של - grub:

$ sudo grub-mkconfig -o /boot/grub/grub.cfg

זהו! כל מה שנשאר הוא לבצע reboot ולהנות מהקרנל החדש.

סיכום

יש יתרונות וחסרונות בקימפול הקרנל שלכם, מבחינתי היתרונות עולות על החסרונות. במידה ואתם משתמשים ב - Archlinux תוכלו לקצר את כל התהליך הידני ולהשתמש ב - PKGBUILD. לדוגמא: linux-ck.

– bindh3x

Email Facebook Google LinkedIn Print Twitter
)