Linux kernel е основната част на операционната система Linux, играеща ролята на мост между компютърното оборудване и софтуерните приложения. Той управлява системните ресурси и комуникацията между софтуерните и хардуерните компоненти на компютъра. Основни характеристики на Linux kernel включват:
- Мултитаскинг: Поддържа изпълнението на множество процеси едновременно.
- Поддръжка на множество потребители: Позволява на множество потребители да използват системата едновременно.
- Виртуална памет: Използва дисково пространство за разширяване на RAM, позволявайки по-ефективно управление на паметта.
- Модулна структура: Възможност за добавяне или премахване на функционалност чрез зареждане и разтоварване на модули.
- Поддръжка на различни архитектури: Съвместим с множество хардуерни платформи (например, x86, ARM).
- Сигурност и разрешения: Разширени функции за сигурност и система за разрешения, защитаващи данните и ресурсите.
Linux kernel е open-source, което означава, че неговият изходен код е свободно достъпен и може да бъде модифициран от всеки. Това допринася за неговата адаптивност и широко разпространение в различни области – от вградени системи и смартфони до суперкомпютри и сървъри.
История на Linux kernel
Историята на Linux kernel започва в началото на 90-те години на 20-ти век и е тясно свързана с фигурата на Линус Торвалдс, финландски студент по компютърни науки. Ето основните моменти в развитието на Linux kernel:
- 1991 г.: Линус Торвалдс започва работата по Linux като хоби проект. На 25 август 1991 г., той публикува известното съобщение в Usenet групата comp.os.minix, обявявайки създаването на свободна операционна система, вдъхновена от MINIX (малка Unix-подобна система, разработена от Ендрю Таненбаум).
- 1992 г.: Linux става проект с отворен код. Торвалдс решава да лицензира Linux под GNU General Public License (GPL), което позволява на други разработчици свободно да модифицират и разпространяват кода.
- 1994 г.: Издадена е версия 1.0 на Linux kernel. Тази версия включва вече поддръжка на мрежи, възможността за работа с множество процесори (SMP) и много други функции.
- 1996 г.: Въведена е маскотата на Linux – пингвинът Тъкс.
- 1999-2000 г.: Linux започва да набира популярност в бизнес сектора, със значителна подкрепа от големи IT компании като IBM, Dell и HP.
- 2000-2010 г.: Продължава активното развитие на Linux, като се появяват разнообразни дистрибуции, насочени към различни потребители – от домашни до корпоративни среди.
- 2010-2020 г.: Linux се утвърждава като доминираща сила в сферата на сървърите, вградените системи (включително Android) и облачните технологии. Развитието му е подкрепено от големи технологични компании и общността на разработчиците.
- 2021-2023 г.: Linux продължава да е важна част от IT екосистемата, като се адаптира към новите предизвикателства и технологии като Интернет на нещата (IoT), изкуствен интелект и машинно обучение.
През годините, Linux kernel претърпява множество промени и разширения, като се превръща в основа за широк спектър от операционни системи и приложения. Той се развива и поддържа от огромна международна общност от програмисти и компании, което го прави един от най-успешните проекти с отворен код в историята.
Версии на Linux kernel
Linux kernel е претърпял множество версии и актуализации от своето създаване в началото на 90-те години. Всяка нова версия на Linux kernel обикновено включва подобрения в производителността, поддръжка на нов хардуер, нови функции и корекции на бъгове. Ето кратък преглед на някои от основните версии и тяхното значение:
- Версия 1.0 (март 1994 г.): Първата официална “стабилна” версия на Linux kernel, маркираща значителен етап в развитието на проекта.
- Версия 2.0 (юни 1996 г.): Въведе поддръжка за множество процесори (SMP), което беше важно подобрение за производителността на системите.
- Версия 2.2 (януари 1999 г.): Подобрена поддръжка на сетеви протоколи, въвеждане на USB поддръжка и подобрени файлови системи.
- Версия 2.4 (януари 2001 г.): Подобрения в поддръжката на хардуер, включително по-добра поддръжка на многоядерни процесори, USB устройства и драйвери за различни видове хардуер.
- Версия 2.6 (декември 2003 г.): Значителни подобрения в скалируемостта и производителността, както и подобрения във файловата система и сигурността.
- Версия 3.0 (юли 2011 г.): Тази версия не въвежда големи технически промени, но отбелязва 20-годишнината на Linux с промяна в нумерацията.
- Версия 4.0 (април 2015 г.): Въведе функции като подобрена поддръжка на хардуер и разширения на файловите системи.
- Версия 5.0 (март 2019 г.): Също като версия 3.0, тази версия не донесе големи промени, но включваше подобрения в планировката на процесите, поддръжка на нов хардуер и други дребни подобрения.
След версия 5.0, Linux kernel продължи да се развива с редовни актуализации. Новите версии обикновено се издават на всеки няколко месеца, като всяка нова версия продължава да включва значими подобрения и нововъведения. Развитието на Linux kernel е пример за непрекъснат иновативен процес, задвижван от глобална общност от разработчици и компании.
Модули на Linux kernel
Модулите на Linux kernel са ключов компонент от архитектурата на Linux. Те представляват отделни блокове код, които могат да бъдат зареждани и разтоварвани от ядрото на Linux по време на работа, без да е необходим рестарт на системата. Това позволява гъвкавост и модуларност, като същевременно поддържа общата производителност и стабилност на системата. Основни характеристики и функции на модулите включват:
- Динамично Зареждане и Разтоварване: Модулите могат да бъдат заредени и разтоварени по всяко време, което позволява добавянето на нови функции или хардуерни драйвери без да се налага рестартиране на системата.
- Хардуерни Драйвери: Много хардуерни драйвери в Linux са реализирани като модули. Това позволява лесното добавяне на поддръжка за нов хардуер.
- Файлови Системи: Linux поддържа разнообразие от файлови системи, много от които са реализирани като модули, като например NTFS, NFS, CIFS.
- Мрежови Протоколи: Поддръжката за различни мрежови протоколи също е реализирана чрез модули.
- Сигурност: Някои функции за сигурност и контрол на достъпа също се реализират чрез модули.
- Оптимизация на Ресурсите: Модулите позволяват на системата да зарежда само необходимите функции, което намалява използването на системни ресурси.
За управление на модулите в Linux се използват командите insmod
(за зареждане на модул), rmmod
(за разтоварване на модул) и lsmod
(за изброяване на текущо заредените модули). Също така, modprobe
е мощна команда, която автоматично обработва зависимостите между модулите.
Подходът с модулите позволява на Linux да остане лек и гъвкав, като едновременно с това предлага богат набор от функционалности, които могат да бъдат добавени или премахнати според нуждите на потребителя.
Компилиране на Linux kernel
Компилирането на Linux kernel е процес, който позволява на потребителите да адаптират ядрото на Linux към своите специфични нужди. Това може да включва добавяне или премахване на функции, поддръжка на специфичен хардуер, оптимизации за производителност и т.н. Ето основните стъпки за компилиране на Linux kernel:
- Изтегляне на Изходния Код: Първата стъпка е изтеглянето на последната версия на изходния код на Linux kernel от официалния уебсайт или чрез системата за управление на версиите, като Git.
- Инсталиране на Необходимите Инструменти: За да компилирате ядрото, ще ви трябват определени инструменти и библиотеки, като GCC (GNU Compiler Collection), make, libncurses за конфигурационния интерфейс и други.
- Конфигуриране на Ядрото: Преди компилирането, трябва да конфигурирате ядрото, за да определите кои функции да бъдат включени. Това може да стане с помощта на различни инструменти като
make menuconfig
,make xconfig
илиmake oldconfig
. - Компилиране: След като конфигурацията е завършена, използвате командата
make
за стартиране на процеса на компилиране. Този процес може да отнеме известно време в зависимост от конфигурацията и мощността на вашата система. - Инсталиране на Новото Ядро: След като компилирането е завършено, новото ядро и свързаните с него модули могат да бъдат инсталирани с команди като
make modules_install
иmake install
. - Обновяване на Зареждащия Програма (Bootloader): Необходимо е да обновите конфигурацията на зареждащия програма (например GRUB), за да включите новото ядро като опция при стартиране на системата.
- Рестартиране и Тестване: След инсталирането на новото ядро, рестартирате системата и избирате новото ядро при зареждане. След това е важно да тествате системата за стабилност и съвместимост.
Компилирането на Linux kernel е процес, който изисква разбиране на системните компоненти и внимателно планиране, но предлага значителна гъвкавост и мощ за опитни потребители и разработчици.
Как да компилирам kernel в Ubuntu
Промяната на вече компилиран и инсталиран Linux kernel в Ubuntu може да бъде сложен процес и обикновено се извършва само от опитни потребители или системни администратори. Тъй като промените в ядрото могат да повлияят на стабилността и сигурността на системата, е важно да сте сигурни в това, което правите. Ето общ преглед на процеса:
Създаване на Резервно Копие: Преди да правите каквито и да е промени, е добра практика да създадете резервно копие на вашата система.
Инсталиране на Необходимите Инструменти: За да модифицирате ядрото, ще ви трябват определени инструменти за компилиране и конфигурация, като build-essential
, kernel-package
, libncurses5-dev
и libssl-dev
. Можете да ги инсталирате чрез командата:
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
За да заредите модул на Linux kernel за 10G мрежова карта, като например модула igb
за Intel Gigabit Ethernet карти, трябва да изпълните няколко стъпки в терминала. Преди да започнете, уверете се, че имате административни права (root достъп), тъй като ще се наложи да използвате sudo
за някои команди.
Проверете дали модулът е вече зареден: Използвайте командата lsmod
за да проверите дали модулът igb
вече е зареден в системата:
lsmod | grep igb
Заредете модула igb
: Ако модулът не е зареден, можете да го заредите с командата modprobe
:
sudo modprobe igb
Тази команда ще зареди модула igb
и всички негови зависимости.
Проверете дали модулът е успешно зареден: Отново използвайте lsmod
за да се уверите, че модулът е зареден:
lsmod | grep igb
Конфигуриране на мрежовия интерфейс: След като модулът е зареден, ще трябва да конфигурирате мрежовия интерфейс, използващ тази мрежова карта. Това може да стане чрез ifconfig
или ip
команди или чрез редактиране на мрежовите конфигурационни файлове в зависимост от вашата дистрибуция.
Автоматично Зареждане при Стартиране: Ако искате модулът igb
да се зарежда автоматично при стартиране на системата, добавете името му в конфигурационния файл /etc/modules
. Отворете файла с текстов редактор (например sudo nano /etc/modules
) и добавете ред с igb
в края на файла.
Забележка: Преди да извършите тези стъпки, уверете се, че вашата мрежова карта действително използва драйвера igb
. Различни модели мрежови карти могат да изискват различни драйвери.
Процеси в Linux kernel
Процесите в Linux kernel са основната единица за управление на изпълнението на програми. Всеки процес в Linux е инстанция на изпълняваща се програма и включва различни елементи като код, данни, стек и състояние на регистрите на процесора. Ето някои ключови аспекти на управлението на процесите в Linux:
- Идентификация на Процеси: Всеки процес в Linux е идентифициран с уникален идентификатор, наречен PID (Process IDentifier). Системата също така поддържа идентификатори на родителски процеси (PPID), което позволява създаването на иерархия на процесите.
- Създаване на Процеси: Процесите в Linux се създават чрез системния повик
fork()
. Този повик копира съществуващ процес (наричан родителски), създавайки нов процес (наричан детски). След това, често се използваexec()
за зареждане и изпълнение на нова програма в контекста на детския процес. - Управление на Процеси: Linux поддържа различни команди и системни повици за управление на процесите, като
kill
,nice
, иps
. Тези инструменти позволяват на потребителите и администраторите да контролират изпълнението на процесите, да ги прекратяват, да променят техния приоритет и т.н. - Мултитаскинг: Linux поддържа превключване между процесите, позволявайки мултитаскинг. Това означава, че множество процеси могат да се изпълняват “едновременно”, като ядрото превключва бързо между тях.
- Планиране на Процеси: Linux използва планировчик (scheduler) за определяне на реда, в който процесите получават време на процесора. Планировчикът в Linux поддържа справедливост и ефективност, като се стреми да максимизира отговорността на системата и да оптимизира използването на процесора.
- Междупроцесно комуникиране (IPC): Linux поддържа различни механизми за междупроцесно комуникиране, като сигнали, споделена памет, семафори и опашки от съобщения.
- Край на Процесите: Процесите приключват чрез системния повик
exit()
. Когато процес завърши, ядрото освобождава ресурсите, които е използвал, и уведомява родителския процес чрез сигнал.
Процесите са фундаментални за операционната система Linux и играят централна роля в нейната многофункционалност и ефективност. Управлението на процес
Мониторинг на процеси в Linux kernel
Мониторингът на процесите в Linux е ключова част от управлението на системата, тъй като той позволява на администраторите и потребителите да наблюдават и управляват активността на процесите. Ето някои от основните инструменти и техники за мониторинг на процесите в Linux:
- top: Това е един от най-често използваните инструменти за мониторинг на процесите. Командата
top
предоставя динамично обновяващ се преглед на активните процеси, като показва информация за използването на процесора, паметта, времето на изпълнение и други. - htop: Това е по-подробна и графично ориентирана алтернатива на
top
.htop
позволява по-лесно управление на процесите, включително прекъсване и убиване, и предоставя по-интуитивен интерфейс. - ps: Командата
ps
извежда информация за текущо работещите процеси. Можете да използвате различни опции за филтриране и форматиране на изходните данни, за да получите специфична информация. - pstree: Показва процесите в структура на дърво, което улеснява визуализацията на връзките между родителските и детските процеси.
- vmstat: Предоставя информация за виртуалната памет, процесите, използването на процесора и активността на диска.
- iostat: Полезен за мониторинг на входно/изходната активност на диск и процесора.
- netstat: Използва се за мониторинг на мрежовите връзки, таблици за маршрутизация, статистика за интерфейси и други мрежови аспекти.
- dstat: Комбиниран инструмент, който може да замести
vmstat
,iostat
,netstat
и др., като предоставя обширна информация за системни ресурси. - glances: Графично-ориентиран инструмент, който предоставя бърз преглед на най-важните статистики на системата в един екран.
- SystemTap и perf: За по-напреднали потребители, тези инструменти предлагат дълбок мониторинг и анализ на производителността, като могат да проследяват и анализират ядрото на Linux и работещите процеси.
Използването на тези инструменти зависи от конкретните нужди и предпочитания на администратора или потребителя. За базов мониторинг, инструменти като top
, htop
и ps
са често достатъчни, докато за по-сложен анализ могат да се наложат по-специализирани инструменти като SystemTap
или perf
.
Файлови системи в Linux kernel
Файловите системи са фундаментален компонент на всеки операционен системен кернел, включително и на Linux. Те определят как данните се съхраняват и организират на дисковите устройства. Linux поддържа множество файлови системи, като всяка от тях има своите характеристики и предназначение. Ето някои от най-често използваните файлови системи в Linux:
- ext2 (Second Extended Filesystem): Това е една от ранните файлови системи, използвани в Linux. Въпреки че е надеждна, тя не поддържа журналиране, което я прави по-малко предпочитана за съвременни приложения.
- ext3 (Third Extended Filesystem): Развитие на ext2, ext3 въвежда поддръжка на журналиране, което подобрява надеждността и ускорява процеса на възстановяване след срив.
- ext4 (Fourth Extended Filesystem): Най-новата версия в серията ext, ext4 предлага подобрения в производителността, поддръжка на по-големи дискове и файлове, както и други подобрения над ext3.
- XFS: XFS е високопроизводителна файлова система, известна със своите мащабируеми способности, особено за големи файлове и дискове.
- Btrfs (B-tree Filesystem): Модерна файлова система, която предлага функции като поддръжка на снимки (snapshots), динамично разширение на размера и интегрирано управление на множество томове.
- FAT (File Allocation Table) и NTFS: Linux поддържа и файлови системи, използвани в Windows, като FAT (включително FAT32) и NTFS, което позволява съвместимост и обмен на данни с Windows системи.
- NFS (Network File System): Използва се за споделяне на файлове по мрежа, NFS позволява файловите системи да бъдат достъпвани по мрежата, подобно на локални дискове.
- SquashFS: Това е силно компресирана, само за четене файлова система, често използвана за архивиране и дистрибуция на софтуер.
- tmpfs: Файлова система, която съхранява файлове в паметта или в своп пространство, предлагаща бърз достъп и се използва за временни файлови структури като
/tmp
.
Linux поддържа и множество други файлови системи, предоставяйки гъвкавост и широк избор за различни приложения и нужди. Възможността за зареждане на поддръжка на различни файлови системи като модули на ядрото позволява на потребителите да адаптират системата си според конкретните си изисквания.
Организиране на директории в Linux kernel
Организацията на директориите в Linux е стандартизирана и следва Файловата Системна Йерархия (Filesystem Hierarchy Standard, FHS). Този стандарт определя основните директории и техните съдържания в Linux система. Ето общ преглед на някои от ключовите директории и тяхното предназначение:
- / (Root): Коренът на файловата система. Всички други директории са поддиректории на корена.
- /bin: Съдържа основни изпълними бинарни файлове, които са необходими за стартиране и работа на системата, както и за основни операции от потребителите.
- /boot: Съдържа файлове, необходими за стартиране на системата, включително Linux ядрото и GRUB bootloader.
- /dev: Специални или устройствени файлове, които представляват хардуерни устройства.
- /etc: Съдържа конфигурационни файлове за системата. Тук се намират файлове, които контролират поведението на различни програми и услуги.
- /home: Съдържа личните потребителски директории. За всеки потребител, който има акаунт в системата, обикновено се създава поддиректория в /home.
- /lib (или /lib64): Съдържа библиотеки, необходими за основните бинарни файлове в /bin и /sbin.
- /media и /mnt: Тези директории са предназначени за монтиране на сменяеми носители като USB устройства (в /media) и временно монтирани файлови системи (в /mnt).
- /opt: Използва се за инсталиране на “опционални” софтуерни приложения, които обикновено се доставят във вид на пакети от трети страни.
- /proc: Виртуална файлова система, която предоставя интерфейс към вътрешните данни на ядрото и процесите. Например, информация за процесите се намира в /proc/[pid].
- /sbin: Съдържа системни административни бинарни файлове, използвани за управление на системата.
- /tmp: Предназначена за временни файлове, които се изтриват при рестарт на системата.
- /usr: Съдържа приложения и файлове, използвани от потребителите, както и библиотеките, документацията и изходния код за тях. Тя е една от най-големите директории в системата.
- /var: Съдържа променливи данни като лог файлове, спулиран пощенски кутии и временни бази данни.
Тази структура на директориите помага на потребителите и администраторите да навигират и управляват файловата система на Linux по последователен и предвидим начин.
Как зарежда Linux kernel
Зареждането на Linux kernel е процес, който започва веднага след включване на компютъра и включва няколко ключови стъпки:
- BIOS/UEFI Фаза:
- При стартиране, Базовата Входно-Изходна Система (BIOS) или по-модерният Unified Extensible Firmware Interface (UEFI) инициира процеса на зареждане. Това включва тестване на хардуера чрез POST (Power-On Self Test) и идентифициране на стартовия диск.
- BIOS/UEFI търси и зарежда зареждащия програма (bootloader) от стартовия диск.
- Зареждащ Програма (Bootloader):
- Най-често използваните зареждащи програми за Linux са GRUB (GRand Unified Bootloader) или LILO (Linux Loader).
- Bootloader показва меню за избор на операционна система, ако има инсталирани повече от една.
- След избор, bootloader зарежда ядрото на Linux в паметта, заедно с началния RAM диск (initrd или initramfs), който съдържа временна файлова система, използвана от ядрото при стартиране.
- Зареждане на Ядрото:
- Зареденото в паметта ядро се инициализира и започва да конфигурира хардуера, като идентифицира устройства, контролери и други системни ресурси.
- Ядрото извършва свои собствени тестове и инициализации, за да настрои вътрешните си структури и модули.
- Използване на Initrd или Initramfs:
- Initrd (initial ramdisk) или initramfs (initial ram filesystem) предоставят временна файлова система, която помага на ядрото да зареди необходимите драйвери за достъп до диска и файловата система.
- Това е важно, особено ако се нуждаете от модули за достъп до файловата система на кореновия раздел.
- Прехвърляне на Контрола към Init Процеса:
- След като ядрото и initrd/initramfs са успешно заредени, ядрото стартира първия процес, наречен
init
(или подобен механизъм катоsystemd
в по-новите дистрибуции). - Този процес е отговорен за стартиране на всички останали процеси и услуги, необходими за пълноценната работа на операционната система.
- След като ядрото и initrd/initramfs са успешно заредени, ядрото стартира първия процес, наречен
- Стартиране на Услугите и Потребителския Интерфейс:
init
илиsystemd
управляват стартирането на различни скриптове и услуги, които конфигурират мрежата, стартират системни демони и настройват потребителската среда.- Накрая, системата стига до стартирането на графичния интерфейс (ако такъв е инсталиран) или текстов интерфейс за вход от потребителя.
Процесът на зареждане на Linux kernel е сложен и включва множество компоненти, работещи заедно, за да осигурят гладък старт на операционната система.
Инициализиращи скриптове при зареждане на Linux kernel
Инициализиращите скриптове при зареждане на Linux kernel играят ключова роля в стартирането на системата, като настройват различни услуги и процеси, необходими за нормалната работа на системата. Тези скриптове се изпълняват след като ядрото е заредено и започва процеса на инициализация. Има два основни подхода за управление на тези скриптове в съвременните Linux дистрибуции:
- SysVinit (System V init):
- Традиционната система за инициализация в Linux, известна като SysVinit, използва скриптове, разположени в директориите
/etc/init.d
или/etc/rc.d
. - Скриптовете в тези директории се изпълняват в определен ред, който се контролира чрез символни връзки в директориите
/etc/rcX.d
, къдетоX
е номер на runlevel. - Всеки скрипт може да има команди за
start
,stop
,restart
,status
и т.н., които контролират конкретни услуги или процеси.
- Традиционната система за инициализация в Linux, известна като SysVinit, използва скриптове, разположени в директориите
- systemd:
systemd
е по-нова система за инициализация, която замества SysVinit в много дистрибуции. Тя предлага по-бърз старт и по-гъвкаво управление на зависимостите между услугите.- Вместо традиционните скриптове,
systemd
използва “unit” файлове, които се намират в/etc/systemd/system
,/run/systemd/system
, и/lib/systemd/system
. - Всеки unit файл описва услуга, монтиране на файлова система, задача или друг обект, който
systemd
трябва да управлява. systemd
управлява услугите паралелно, което значително ускорява процеса на стартиране.
За обикновените потребители и системни администратори, разбирането на тези скриптове и unit файлове е важно за персонализиране и управление на процеса на стартиране на системата. Промените в тези файлове позволяват добавяне, премахване или модифициране на услуги и процеси, които се стартират при зареждане на системата.