You are currently viewing Linux kernel

Linux kernel

  1. Мултитаскинг: Поддържа изпълнението на множество процеси едновременно.
  2. Поддръжка на множество потребители: Позволява на множество потребители да използват системата едновременно.
  3. Виртуална памет: Използва дисково пространство за разширяване на RAM, позволявайки по-ефективно управление на паметта.
  4. Модулна структура: Възможност за добавяне или премахване на функционалност чрез зареждане и разтоварване на модули.
  5. Поддръжка на различни архитектури: Съвместим с множество хардуерни платформи (например, x86, ARM).
  6. Сигурност и разрешения: Разширени функции за сигурност и система за разрешения, защитаващи данните и ресурсите.

Linux kernel е open-source, което означава, че неговият изходен код е свободно достъпен и може да бъде модифициран от всеки. Това допринася за неговата адаптивност и широко разпространение в различни области – от вградени системи и смартфони до суперкомпютри и сървъри.

История на Linux kernel

  1. 1991 г.: Линус Торвалдс започва работата по Linux като хоби проект. На 25 август 1991 г., той публикува известното съобщение в Usenet групата comp.os.minix, обявявайки създаването на свободна операционна система, вдъхновена от MINIX (малка Unix-подобна система, разработена от Ендрю Таненбаум).
  2. 1992 г.: Linux става проект с отворен код. Торвалдс решава да лицензира Linux под GNU General Public License (GPL), което позволява на други разработчици свободно да модифицират и разпространяват кода.
  3. 1994 г.: Издадена е версия 1.0 на Linux kernel. Тази версия включва вече поддръжка на мрежи, възможността за работа с множество процесори (SMP) и много други функции.
  4. 1996 г.: Въведена е маскотата на Linux – пингвинът Тъкс.
  5. 1999-2000 г.: Linux започва да набира популярност в бизнес сектора, със значителна подкрепа от големи IT компании като IBM, Dell и HP.
  6. 2000-2010 г.: Продължава активното развитие на Linux, като се появяват разнообразни дистрибуции, насочени към различни потребители – от домашни до корпоративни среди.
  7. 2010-2020 г.: Linux се утвърждава като доминираща сила в сферата на сървърите, вградените системи (включително Android) и облачните технологии. Развитието му е подкрепено от големи технологични компании и общността на разработчиците.
  8. 2021-2023 г.: Linux продължава да е важна част от IT екосистемата, като се адаптира към новите предизвикателства и технологии като Интернет на нещата (IoT), изкуствен интелект и машинно обучение.

През годините, Linux kernel претърпява множество промени и разширения, като се превръща в основа за широк спектър от операционни системи и приложения. Той се развива и поддържа от огромна международна общност от програмисти и компании, което го прави един от най-успешните проекти с отворен код в историята.

Версии на Linux kernel

  1. Версия 1.0 (март 1994 г.): Първата официална “стабилна” версия на Linux kernel, маркираща значителен етап в развитието на проекта.
  2. Версия 2.0 (юни 1996 г.): Въведе поддръжка за множество процесори (SMP), което беше важно подобрение за производителността на системите.
  3. Версия 2.2 (януари 1999 г.): Подобрена поддръжка на сетеви протоколи, въвеждане на USB поддръжка и подобрени файлови системи.
  4. Версия 2.4 (януари 2001 г.): Подобрения в поддръжката на хардуер, включително по-добра поддръжка на многоядерни процесори, USB устройства и драйвери за различни видове хардуер.
  5. Версия 2.6 (декември 2003 г.): Значителни подобрения в скалируемостта и производителността, както и подобрения във файловата система и сигурността.
  6. Версия 3.0 (юли 2011 г.): Тази версия не въвежда големи технически промени, но отбелязва 20-годишнината на Linux с промяна в нумерацията.
  7. Версия 4.0 (април 2015 г.): Въведе функции като подобрена поддръжка на хардуер и разширения на файловите системи.
  8. Версия 5.0 (март 2019 г.): Също като версия 3.0, тази версия не донесе големи промени, но включваше подобрения в планировката на процесите, поддръжка на нов хардуер и други дребни подобрения.

След версия 5.0, Linux kernel продължи да се развива с редовни актуализации. Новите версии обикновено се издават на всеки няколко месеца, като всяка нова версия продължава да включва значими подобрения и нововъведения. Развитието на Linux kernel е пример за непрекъснат иновативен процес, задвижван от глобална общност от разработчици и компании.

Модули на Linux kernel

  1. Динамично Зареждане и Разтоварване: Модулите могат да бъдат заредени и разтоварени по всяко време, което позволява добавянето на нови функции или хардуерни драйвери без да се налага рестартиране на системата.
  2. Хардуерни Драйвери: Много хардуерни драйвери в Linux са реализирани като модули. Това позволява лесното добавяне на поддръжка за нов хардуер.
  3. Файлови Системи: Linux поддържа разнообразие от файлови системи, много от които са реализирани като модули, като например NTFS, NFS, CIFS.
  4. Мрежови Протоколи: Поддръжката за различни мрежови протоколи също е реализирана чрез модули.
  5. Сигурност: Някои функции за сигурност и контрол на достъпа също се реализират чрез модули.
  6. Оптимизация на Ресурсите: Модулите позволяват на системата да зарежда само необходимите функции, което намалява използването на системни ресурси.

За управление на модулите в Linux се използват командите insmod (за зареждане на модул), rmmod (за разтоварване на модул) и lsmod (за изброяване на текущо заредените модули). Също така, modprobe е мощна команда, която автоматично обработва зависимостите между модулите.

Подходът с модулите позволява на Linux да остане лек и гъвкав, като едновременно с това предлага богат набор от функционалности, които могат да бъдат добавени или премахнати според нуждите на потребителя.

Компилиране на Linux kernel

  1. Изтегляне на Изходния Код: Първата стъпка е изтеглянето на последната версия на изходния код на Linux kernel от официалния уебсайт или чрез системата за управление на версиите, като Git.
  2. Инсталиране на Необходимите Инструменти: За да компилирате ядрото, ще ви трябват определени инструменти и библиотеки, като GCC (GNU Compiler Collection), make, libncurses за конфигурационния интерфейс и други.
  3. Конфигуриране на Ядрото: Преди компилирането, трябва да конфигурирате ядрото, за да определите кои функции да бъдат включени. Това може да стане с помощта на различни инструменти като make menuconfig, make xconfig или make oldconfig.
  4. Компилиране: След като конфигурацията е завършена, използвате командата make за стартиране на процеса на компилиране. Този процес може да отнеме известно време в зависимост от конфигурацията и мощността на вашата система.
  5. Инсталиране на Новото Ядро: След като компилирането е завършено, новото ядро и свързаните с него модули могат да бъдат инсталирани с команди като make modules_install и make install.
  6. Обновяване на Зареждащия Програма (Bootloader): Необходимо е да обновите конфигурацията на зареждащия програма (например GRUB), за да включите новото ядро като опция при стартиране на системата.
  7. Рестартиране и Тестване: След инсталирането на новото ядро, рестартирате системата и избирате новото ядро при зареждане. След това е важно да тествате системата за стабилност и съвместимост.

Компилирането на Linux kernel е процес, който изисква разбиране на системните компоненти и внимателно планиране, но предлага значителна гъвкавост и мощ за опитни потребители и разработчици.

Как да компилирам kernel в Ubuntu

Създаване на Резервно Копие: Преди да правите каквито и да е промени, е добра практика да създадете резервно копие на вашата система.

Инсталиране на Необходимите Инструменти: За да модифицирате ядрото, ще ви трябват определени инструменти за компилиране и конфигурация, като build-essential, kernel-package, libncurses5-dev и libssl-dev. Можете да ги инсталирате чрез командата:

Bash
sudo apt-get install build-essential kernel-package libncurses5-dev libssl-dev

Изтегляне и Разархивиране на Изходния Код на Ядрото: Изтеглете изходния код на текущо използваната версия на ядрото от официалния сайт на Ubuntu или чрез Git и го разархивирайте.

Конфигуриране на Ядрото: Използвайте make menuconfig (или друг подходящ инструмент) в директорията с изходния код, за да направите необходимите промени в конфигурацията. Можете също да копирате съществуващ файл за конфигурация от /boot/config-$(uname -r) към директорията с изходния код и да го модифицирате.

Компилиране на Промененото Ядро: След като направите желаните промени, компилирайте ядрото с make и make modules_install.

Инсталиране на Промененото Ядро: Инсталирайте новото ядро в системата с make install. Това ще добави новото ядро към зареждащия програма (bootloader), като GRUB.

Обновяване на GRUB и Рестартиране: Актуализирайте GRUB с sudo update-grub и рестартирайте системата, за да заредите с новото ядро.

Тестване: След рестартиране, уверете се, че системата стартира с новото ядро и че всички необходими функции работят както трябва.

Обърнете внимание, че промяната на ядрото може да доведе до несъвместимости с някои драйвери или софтуерни приложения. Уверете се, че сте запознати с процеса и разбирате рисковете преди да започнете.

Как да заредя модул igb на 10G мрежова карта Intel

Проверете дали модулът е вече зареден: Използвайте командата lsmod за да проверите дали модулът igb вече е зареден в системата:

Bash
lsmod | grep igb

Заредете модула igb: Ако модулът не е зареден, можете да го заредите с командата modprobe:

Bash
sudo modprobe igb

Тази команда ще зареди модула igb и всички негови зависимости.

Проверете дали модулът е успешно зареден: Отново използвайте lsmod за да се уверите, че модулът е зареден:

Bash
lsmod | grep igb

Конфигуриране на мрежовия интерфейс: След като модулът е зареден, ще трябва да конфигурирате мрежовия интерфейс, използващ тази мрежова карта. Това може да стане чрез ifconfig или ip команди или чрез редактиране на мрежовите конфигурационни файлове в зависимост от вашата дистрибуция.

Автоматично Зареждане при Стартиране: Ако искате модулът igb да се зарежда автоматично при стартиране на системата, добавете името му в конфигурационния файл /etc/modules. Отворете файла с текстов редактор (например sudo nano /etc/modules) и добавете ред с igb в края на файла.

Забележка: Преди да извършите тези стъпки, уверете се, че вашата мрежова карта действително използва драйвера igb. Различни модели мрежови карти могат да изискват различни драйвери.

Процеси в Linux kernel

  1. Идентификация на Процеси: Всеки процес в Linux е идентифициран с уникален идентификатор, наречен PID (Process IDentifier). Системата също така поддържа идентификатори на родителски процеси (PPID), което позволява създаването на иерархия на процесите.
  2. Създаване на Процеси: Процесите в Linux се създават чрез системния повик fork(). Този повик копира съществуващ процес (наричан родителски), създавайки нов процес (наричан детски). След това, често се използва exec() за зареждане и изпълнение на нова програма в контекста на детския процес.
  3. Управление на Процеси: Linux поддържа различни команди и системни повици за управление на процесите, като kill, nice, и ps. Тези инструменти позволяват на потребителите и администраторите да контролират изпълнението на процесите, да ги прекратяват, да променят техния приоритет и т.н.
  4. Мултитаскинг: Linux поддържа превключване между процесите, позволявайки мултитаскинг. Това означава, че множество процеси могат да се изпълняват “едновременно”, като ядрото превключва бързо между тях.
  5. Планиране на Процеси: Linux използва планировчик (scheduler) за определяне на реда, в който процесите получават време на процесора. Планировчикът в Linux поддържа справедливост и ефективност, като се стреми да максимизира отговорността на системата и да оптимизира използването на процесора.
  6. Междупроцесно комуникиране (IPC): Linux поддържа различни механизми за междупроцесно комуникиране, като сигнали, споделена памет, семафори и опашки от съобщения.
  7. Край на Процесите: Процесите приключват чрез системния повик exit(). Когато процес завърши, ядрото освобождава ресурсите, които е използвал, и уведомява родителския процес чрез сигнал.

Процесите са фундаментални за операционната система Linux и играят централна роля в нейната многофункционалност и ефективност. Управлението на процес

Мониторинг на процеси в Linux kernel

  1. top: Това е един от най-често използваните инструменти за мониторинг на процесите. Командата top предоставя динамично обновяващ се преглед на активните процеси, като показва информация за използването на процесора, паметта, времето на изпълнение и други.
  2. htop: Това е по-подробна и графично ориентирана алтернатива на top. htop позволява по-лесно управление на процесите, включително прекъсване и убиване, и предоставя по-интуитивен интерфейс.
  3. ps: Командата ps извежда информация за текущо работещите процеси. Можете да използвате различни опции за филтриране и форматиране на изходните данни, за да получите специфична информация.
  4. pstree: Показва процесите в структура на дърво, което улеснява визуализацията на връзките между родителските и детските процеси.
  5. vmstat: Предоставя информация за виртуалната памет, процесите, използването на процесора и активността на диска.
  6. iostat: Полезен за мониторинг на входно/изходната активност на диск и процесора.
  7. netstat: Използва се за мониторинг на мрежовите връзки, таблици за маршрутизация, статистика за интерфейси и други мрежови аспекти.
  8. dstat: Комбиниран инструмент, който може да замести vmstat, iostat, netstat и др., като предоставя обширна информация за системни ресурси.
  9. glances: Графично-ориентиран инструмент, който предоставя бърз преглед на най-важните статистики на системата в един екран.
  10. SystemTap и perf: За по-напреднали потребители, тези инструменти предлагат дълбок мониторинг и анализ на производителността, като могат да проследяват и анализират ядрото на Linux и работещите процеси.

Използването на тези инструменти зависи от конкретните нужди и предпочитания на администратора или потребителя. За базов мониторинг, инструменти като top, htop и ps са често достатъчни, докато за по-сложен анализ могат да се наложат по-специализирани инструменти като SystemTap или perf.

Файлови системи в Linux kernel

  1. ext2 (Second Extended Filesystem): Това е една от ранните файлови системи, използвани в Linux. Въпреки че е надеждна, тя не поддържа журналиране, което я прави по-малко предпочитана за съвременни приложения.
  2. ext3 (Third Extended Filesystem): Развитие на ext2, ext3 въвежда поддръжка на журналиране, което подобрява надеждността и ускорява процеса на възстановяване след срив.
  3. ext4 (Fourth Extended Filesystem): Най-новата версия в серията ext, ext4 предлага подобрения в производителността, поддръжка на по-големи дискове и файлове, както и други подобрения над ext3.
  4. XFS: XFS е високопроизводителна файлова система, известна със своите мащабируеми способности, особено за големи файлове и дискове.
  5. Btrfs (B-tree Filesystem): Модерна файлова система, която предлага функции като поддръжка на снимки (snapshots), динамично разширение на размера и интегрирано управление на множество томове.
  6. FAT (File Allocation Table) и NTFS: Linux поддържа и файлови системи, използвани в Windows, като FAT (включително FAT32) и NTFS, което позволява съвместимост и обмен на данни с Windows системи.
  7. NFS (Network File System): Използва се за споделяне на файлове по мрежа, NFS позволява файловите системи да бъдат достъпвани по мрежата, подобно на локални дискове.
  8. SquashFS: Това е силно компресирана, само за четене файлова система, често използвана за архивиране и дистрибуция на софтуер.
  9. tmpfs: Файлова система, която съхранява файлове в паметта или в своп пространство, предлагаща бърз достъп и се използва за временни файлови структури като /tmp.

Linux поддържа и множество други файлови системи, предоставяйки гъвкавост и широк избор за различни приложения и нужди. Възможността за зареждане на поддръжка на различни файлови системи като модули на ядрото позволява на потребителите да адаптират системата си според конкретните си изисквания.

Организиране на директории в Linux kernel

  1. / (Root): Коренът на файловата система. Всички други директории са поддиректории на корена.
  2. /bin: Съдържа основни изпълними бинарни файлове, които са необходими за стартиране и работа на системата, както и за основни операции от потребителите.
  3. /boot: Съдържа файлове, необходими за стартиране на системата, включително Linux ядрото и GRUB bootloader.
  4. /dev: Специални или устройствени файлове, които представляват хардуерни устройства.
  5. /etc: Съдържа конфигурационни файлове за системата. Тук се намират файлове, които контролират поведението на различни програми и услуги.
  6. /home: Съдържа личните потребителски директории. За всеки потребител, който има акаунт в системата, обикновено се създава поддиректория в /home.
  7. /lib (или /lib64): Съдържа библиотеки, необходими за основните бинарни файлове в /bin и /sbin.
  8. /media и /mnt: Тези директории са предназначени за монтиране на сменяеми носители като USB устройства (в /media) и временно монтирани файлови системи (в /mnt).
  9. /opt: Използва се за инсталиране на “опционални” софтуерни приложения, които обикновено се доставят във вид на пакети от трети страни.
  10. /proc: Виртуална файлова система, която предоставя интерфейс към вътрешните данни на ядрото и процесите. Например, информация за процесите се намира в /proc/[pid].
  11. /sbin: Съдържа системни административни бинарни файлове, използвани за управление на системата.
  12. /tmp: Предназначена за временни файлове, които се изтриват при рестарт на системата.
  13. /usr: Съдържа приложения и файлове, използвани от потребителите, както и библиотеките, документацията и изходния код за тях. Тя е една от най-големите директории в системата.
  14. /var: Съдържа променливи данни като лог файлове, спулиран пощенски кутии и временни бази данни.

Тази структура на директориите помага на потребителите и администраторите да навигират и управляват файловата система на Linux по последователен и предвидим начин.

Как зарежда Linux kernel

  1. BIOS/UEFI Фаза:
    • При стартиране, Базовата Входно-Изходна Система (BIOS) или по-модерният Unified Extensible Firmware Interface (UEFI) инициира процеса на зареждане. Това включва тестване на хардуера чрез POST (Power-On Self Test) и идентифициране на стартовия диск.
    • BIOS/UEFI търси и зарежда зареждащия програма (bootloader) от стартовия диск.
  2. Зареждащ Програма (Bootloader):
    • Най-често използваните зареждащи програми за Linux са GRUB (GRand Unified Bootloader) или LILO (Linux Loader).
    • Bootloader показва меню за избор на операционна система, ако има инсталирани повече от една.
    • След избор, bootloader зарежда ядрото на Linux в паметта, заедно с началния RAM диск (initrd или initramfs), който съдържа временна файлова система, използвана от ядрото при стартиране.
  3. Зареждане на Ядрото:
    • Зареденото в паметта ядро се инициализира и започва да конфигурира хардуера, като идентифицира устройства, контролери и други системни ресурси.
    • Ядрото извършва свои собствени тестове и инициализации, за да настрои вътрешните си структури и модули.
  4. Използване на Initrd или Initramfs:
    • Initrd (initial ramdisk) или initramfs (initial ram filesystem) предоставят временна файлова система, която помага на ядрото да зареди необходимите драйвери за достъп до диска и файловата система.
    • Това е важно, особено ако се нуждаете от модули за достъп до файловата система на кореновия раздел.
  5. Прехвърляне на Контрола към Init Процеса:
    • След като ядрото и initrd/initramfs са успешно заредени, ядрото стартира първия процес, наречен init (или подобен механизъм като systemd в по-новите дистрибуции).
    • Този процес е отговорен за стартиране на всички останали процеси и услуги, необходими за пълноценната работа на операционната система.
  6. Стартиране на Услугите и Потребителския Интерфейс:
    • init или systemd управляват стартирането на различни скриптове и услуги, които конфигурират мрежата, стартират системни демони и настройват потребителската среда.
    • Накрая, системата стига до стартирането на графичния интерфейс (ако такъв е инсталиран) или текстов интерфейс за вход от потребителя.

Процесът на зареждане на Linux kernel е сложен и включва множество компоненти, работещи заедно, за да осигурят гладък старт на операционната система.

Инициализиращи скриптове при зареждане на Linux kernel

  1. SysVinit (System V init):
    • Традиционната система за инициализация в Linux, известна като SysVinit, използва скриптове, разположени в директориите /etc/init.d или /etc/rc.d.
    • Скриптовете в тези директории се изпълняват в определен ред, който се контролира чрез символни връзки в директориите /etc/rcX.d, където X е номер на runlevel.
    • Всеки скрипт може да има команди за start, stop, restart, status и т.н., които контролират конкретни услуги или процеси.
  2. systemd:
    • systemd е по-нова система за инициализация, която замества SysVinit в много дистрибуции. Тя предлага по-бърз старт и по-гъвкаво управление на зависимостите между услугите.
    • Вместо традиционните скриптове, systemd използва “unit” файлове, които се намират в /etc/systemd/system, /run/systemd/system, и /lib/systemd/system.
    • Всеки unit файл описва услуга, монтиране на файлова система, задача или друг обект, който systemd трябва да управлява.
    • systemd управлява услугите паралелно, което значително ускорява процеса на стартиране.

За обикновените потребители и системни администратори, разбирането на тези скриптове и unit файлове е важно за персонализиране и управление на процеса на стартиране на системата. Промените в тези файлове позволяват добавяне, премахване или модифициране на услуги и процеси, които се стартират при зареждане на системата.

Leave a Reply

This site uses Akismet to reduce spam. Learn how your comment data is processed.