כל הזכויות שמורות לטל בן שושן – Shushan.co.il
Linux Kernel
נתחיל קצת מהיסטוריה,
הLinux Kernel נוצר על ידי לינוס טורוואלדס ב1991 והוא שלח את הקרנל ורשם בהודעה "שלו לכל המשתמשים ב Minix כתחביב הוצאתי מערכת הפעלה חדשה (זה רק תחביב ולכן לא ברמה של GNU) אך התחביב הזה הלך והתרחב והפך לאחת ממערכות ההפעלה הגדולות בעולם ונכון להיום (כל עוד מגדירים את אנדרואיד כמערכת הפעלה לינוקסאית) זו מערכת ההפעלה הגדולה בעולם, לאחר מכן הוא החליט להגדיר את רישיון התוכנה לGPL ובכך הפך אותה לחינמית וכל אחד יכול לערוך את קוד המקור שלה.
לכל מערכת הפעלה יש קרנל, לווינדוס, למקינטוש, ללינוקס המטרה של הקנל זה ל"קשר" בין החומרה לתוכנה, לנהל את כל התהליכים האלו ביעילות ולתקשר עם אפליקציות שמקושרת לקרנל באופן אפקטיבי.
הוא זה שמנהל את התהליכים כמו הזיכרון ה CPU הוא צריך להחליט איפה להניח כל תוכנה בזיכרון וכאשר תוכנה אחרת רוצה את הResources (תהליכים) שתוכנה אחרת משתמשת בה הוא צריך להחליט כמה לתת וכיצד לתת את אותם תהליכים.
על מנת שהקרנל יקושר לחומרה הוא משתמש בדריברים, חלק מהדריברים מגיעים עם הקרנל וחלק מהם צריך להתקין בנפרד ( Kernel Module) למשל כאשר אתם מעוניינים לשנות את הרזולוציה במסך, אתם בעצם משתמשים בתוכנה לשינוי הרזולוציה, התוכנה נאמר של חברת Nvidia שולחת פקודה לKernel וה Kernel משנה את הרזולוציה בהתאם
לאחר שהתקנתם את הקרנל בלבד, מערכת ההפעלה הלינוקסאית לא תעבוד באופן שבו ניתן יהיה לעבוד, על מנת לבצע זאת ולהפוך את ההפצה (מערכת ההפעלה) לניתנת לעבודה יש להוסיף אפליקציות לקרנל ובלינוקס זה קורה על ידי הוספת ה Shell או מה שאתם מכירים בתור Bash אך גם הוא צריך חבילות נוספות על מנת לתפקד כמו vi או vim וcurl או yum ו apt-get וכו'
כעת נעבור על כיצד עובד ה Linux Kernel
נקיש פקודה זו על מנת לראות איזה גירסה של קרנל עובדת כרגע (באתר הרישמי ניתן לראות אתה הגירסאות הקיימות, ההפצה הרישמית של CentOS 7 משתמש בגירסה 3 כרגע לפחות)
[root@localhost ~]# uname -r 3.10.0-514.26.2.el7.x86_64
3.10.0-514.26.2 – "גירסה 3"
3 = גרסת ה Kernel
10 = תת גרסה ראשית, של ה Kernel מה שנקרא ה Major Revision
0 = Minor Revision , תת גרסה משנית של ה Kernel
514 = עדכונים (לא תמיד מופיעה)
לפני גרסאות 2.6 – נאמר גרסה 1.7.4
1 = הגרסה הראשית
7 = הוא אי-זוגי ולכן הוא גרסת פיתוח Dev (אם היה זוגי אז היה גרסה יציבה Stable)
4 = Minor Revision
אחרי גרסת 2.6 – נאמר גרסה 2.6.7
2 = הגרסה הראשית
6 = לא משתנה כמעט רק אם קיים עדכון ממש גדול
7 = הוא Minor Revision שישתנה כל הזמן
כעת יש את גרסת 4.11.6
Longterm = הוא מתוחזק לאורך זמן
—
על מנת לראות את המודולים – הם הדריברים של הקרנל
כעת נעבור על אפשרויות שונות והסברים נוספים על הקרנל הקישו את הפקודה:
[root@localhost ~]# cd /lib/modules [root@localhost modules]# ls 3.10.0-514.26.2.el7.x86_64 3.10.0-514.el7.x86_64 [root@localhost ~]# cd 3.10.0-514.el7.x86_64 [root@localhost 3.10.0-514.el7.x86_64]# ls build modules.builtin modules.modesetting source extra modules.builtin.bin modules.networking updates kernel modules.dep modules.order vdso modules.alias modules.dep.bin modules.softdep weak-updates modules.alias.bin modules.devname modules.symbols modules.block modules.drm modules.symbols.bin
הדגשתי למעלה את Modules.dep שזה קיצור של modules.dependency הוא למעשה מכיל את כל הרשימה של המודולים (כל הדריברים של מערכת ההפעלה)
אם נקיש את הפקודה: נוכל לראות איזה מודולים מותקנים (איזה דריברים מותקנים)
[root@localhost ~]# lsmod
נאמר ואני רוצה להסיר Module מסוים, כמו הכונן פלופי:
rmmod floppy
נאמר ועכשיו אני רוצה להגדיר אותו מחדש:
insmod floppy
נאמר ואני רוצה לחפש דרייבר מסוים בקרנל, ואני מעוניין דווקא במודל soundcore.ko שהוא כרטיס הקול שלי
*אני רק אדגיש שניתן לחפש בגוגל לגבי מודול מסוים (דריבר מסוים ואז לבצע את הפעולות שאני מסביר כאן)
נחפש אותו
[root@localhost 3.10.0-514.el7.x86_64]# find . | grep soundcore.ko ./kernel/sound/soundcore.ko
נאמר ואני רוצה להסיר את המודול קול
[root@localhost ~]# modprobe -r soundcore
כעת להגדיר אותו או להכניס חזרה את המודול
[root@localhost ~]# modprobe soundcore
בדיקת מה המודול עושה ומה מקורו ושמו, נגלה תחילה מה השם המקורי של הדריבר
[root@localhost ~]# modprobe --resolve-alias soundcore
כעת נקבל את הפלט עם מקור השם, ואז נקיש
[root@localhost modules]# modinfo soundcore
התוצאה תיהיה הסבר על הדריבר
PROC
מכיל את המבנה של כל הקרנל, לכן הרבה כלים של דיווח והצגת בעיות, תקלות או מידע מביאות את אותו "מידע" מתוך /proc (נמצא בתיקייה הראשית)
למשל
/proc/31602/net/arp
מכיל בתוכו את טבלת ה ARP בדיוק כמו שאקיש את הפקודה arp -a
כל המבנה וההגדרות של הקרנל יושבות בתיקייה ורובם מוגדרות על 0 או 1 (עובד או לא עובד)
כל קובצי ה קינפוג שאחראים ישירות על עבודת הקרנל לדוגמה,
[root@localhost ~]# cd /proc/sys/kernel/
בתוך תיקייה זו שוכנים חלק מקבצי הקינפוג הבאים: בחרתי כמה על מנת להציג אותם
domainname – מגדיר את הדומיין של המחשב אם קיים
ctrl-alt-del – מגדיר אם סט המקשים האלו מבצע במיידית ריסטארט או ממתין לכך שהמערכת מוכנה לריסטרט ואז מרסט
hostname – מגדיר את שם המחשב של המחשב נאמר tal.com
modprobe – מגדיר מאיפה טיענו המודולים לקרנל
הנתיב יהיה sbin/modprobe ואם נעבור לנתיב זה נראה את כל המודולים שצריכים להיטען אל הקרנל
panic – מגדיר לאחר כמה זמן שנקבע מצב זה לבצע ריסטארט למערכת שכן המערכת "תקוע"
printk – אחראי על הדפסת הלוגים וההתראות של הקרנל
את הרשימה המלאה ניתן לקרוא כאן
על מנת לראות מה טעון עכשיו בזיכרון (אילו הגדרות של הקרנל) הקישו את הפקודה:
[root@localhost ~]# sysctl -a vm.mmap_min_addr = 4096 vm.nr_hugepages = 0 vm.nr_hugepages_mempolicy = 0 vm.nr_overcommit_hugepages = 0 vm.nr_pdflush_threads = 0 vm.numa_zonelist_order = default vm.oom_dump_tasks = 1 vm.oom_kill_allocating_task = 0 vm.overcommit_kbytes = 0 vm.overcommit_memory = 0 vm.overcommit_ratio = 50 vm.page-cluster = 3 vm.panic_on_oom = 0 vm.percpu_pagelist_fraction = 0 vm.stat_interval = 1 vm.swappiness = 30 vm.user_reserve_kbytes = 117697 vm.vfs_cache_pressure = 100 vm.zone_reclaim_mode = 0
נאמר וההגדרה היא (כמות הזיכרון של קובץ ההחלפה המקסימלי שיהיה שייך לקרנל) אם מעוניינים לשנות ערך זה ניתן לבצע כך:
[root@localhost ~]# sysctl -w vm.overcommit_memory=100
יש מודולים שחסומים ולא יטענו למערכת, הרשימה שלהם נמצאת ב:
[root@localhost ~]# cd /usr/lib/modprobe.d/ [root@localhost ~]# vi dist-blacklist.conf
Udev
הוא כלי המחליף את devfs ומטרתו היא להציג את כל החומרה המחוברת כעת למחשב והמטרה שלו היא לבצע Hot-Plug או בקיצור אם חיברתם אוזניות אז Udev יטען את המודל של האוזניות ובכך יציג לכם אותם.
יש כלים שאיתם אפשר לבדוק אילו מהחומרה מחוברת למחשב ולהציג את אותה חומרה, לדוגמה:
[root@localhost ~]# yum install usbutils
lsusb – מציג את כל חיבורי הUSB
lspci- מציג את כל חיבורי הPCI
lsdev – כל הרכיבים שמחוברים למערכת
dmesg – הודעות שאם התחבר רכיב מסוים או התנתק
udevadm monitor- מציג בזמן אמת מה מחובר ומה מתחבר
התקנת Kernel אחר
CentOS 7
כמו שהסברתי בתחילת המאמר יש הרבה גרסאות קרנל את הגרסאות ניתן להוריד מהאתר הרישמי
https://www.kernel.org/
ההפצה שיוצאת יוצאת עם גריסה מסוימת, ניתן להתקין גירסה חדשה יותר (אך זה עלול לפגוע בחלק מהמודולים והאפליקציות הקיימות בהפצה בגלל חוסר התאמה)
נראה כעת כיצד להתקין אוטומטית וכיצד להתקין ידנית
התקנה אוטומטית של הקרנל
נוסיף את מפתח הריפו של CPG
[root@localhost ~]# rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org
כעת נתקין אותו
[root@localhost ~]# rpm -Uvh http://www.elrepo.org/elrepo-release-7.0-2.el7.elrepo.noarch.rpm
נאפשר את הריפו שהוספנו
[root@localhost ~]# yum install yum-plugin-fastestmirror
כעת נתקין את הקרנל החדש
yum --enablerepo=elrepo-kernel install kernel-ml
בסיום הקרנל החדש יותקן, בצעו ריסטרט ואז בחרו באפשרות החדשה
ואם נבדוק את הגירסה נראה שהגרסה החדשה הותקנה
התקנה ידנית של הקרניל
להשיג את הקרנל הרצוי יש להיכנס לאתר
https://www.kernel.org/
נוריד את הגרסה האחרונה ונחלץ אותה בתיקייה usr/src
[root@localhost ~]# tar -Jxvf linux-4.11.6.tar.xz
נכנס לתיקייה
[root@localhost ~]# cd /usr/srv/
נבצע ls
[root@localhost src]# ls debug kernels
זו התיקייה בה נעתיק את הקרנל, אל לפני נתקין את כלי הפיתוח
כעת עלינו להתקין את כלי הפיתוח
[root@localhost ~]# yum group install "Development Tools"
תפריט טקסט שבו נוכל לקמפל את הקרנל
[root@localhost ~]# yum install ncurses-devel qt-devel
כעת על ידי winscp נעביר את קובץ ה rar של הקרנל לתיקיית ה usr/src
כעת חלצו את הקובץ על ידי הפקודה
[root@localhost ~]# tar -Jxvf linux-4.11.6.tar.xz
כעת נבצע קומילציה על ידי הפקודה
[root@localhost ~]# make help
כעת יוצג לכם מה ניתן לעשות עם make, אנחנו נבצע ניקוי לקרנל
[root@localhost ~]# clean - Remove most generated files but keep the config and enough build support to build external modules
mrproper - Remove all generated files + config + various backup files
נרשום את הפקודה
[root@localhost ~]# make mrproper
נוכל להשתמש בפקודה
[root@localhost ~]# make oldconfig
וזה יקח את הגדרות הקרנל שכרגע רצות לנו בcentos 7
[root@localhost ~]# make menuconfig
אנו נבחר בברירת מחדל, נלך ל Save ואז ok, הקובץ ישמר בשם .config
לאחר מכן נלך לexit ונצא מהאשף
לאחר שהגדרנו את הקרנל, ניצור אותו
קודם נתקין BC
[root@localhost ~]# yum install bc
לאחר מכן openssl
[root@localhost ~]# yum install openssl-devel [root@localhost ~]# make bzImage [root@localhost ~]# make modules [root@localhost ~]# make install
בסיום תותקן הגירסה החדשה של הקרנל