Много отдавна се каня да започна тази тема. Едно от важните неща в усвояването на Linux. Не защото е сложно, а всеки пренебрегва стъпките през които се минава за да можете да си вкарате името и паролата за да работите. Последно видях при не голяма грешка, която може да се поправи, как преинсталираха ОС. Днес смятам с подробности да обясня с не сложен език, за да може обикновения потребител също да се възползва от статията. Ще започна принципно, как зарежда ОС с Linux, а после ще поговорим за разликите.
- Първите четири вертикални квадратчета отговарят за стартирането на компютъра след включване Включваме компютъра >> Зарежда се BIOS или UEFI от NVRAM-a >> Проверява хардуера (клавиатура, памет, PCI и т.н) >> Ако хардуера е здрав, проверява от кой диск да зареди ОС (Примерно сме казали SATA 0). - Вторите четири вертикални квадратчета отговарят за първоначалното зареждане на ОС. След като компютъра определи от къде да зареди, проверява началото на диска където е записана служебна информация определяща поведението на диска. В зависимост от формата дали е MSDOS или GPT, GRUB създава конфигурационен файл указващ какво да се зареди >> следва зареждане на ядрото. - Последните четири квадратчета вече зареждат самата ОС в зависимост от дистрибуцията си. ядрото е заредено >> ядрото стартира init (systemd) >> /etc/inittab >> зареждат се различни служби (сървиси) >> влизате с име и парола в Linux >> зарежда се shell >> зареждат се скриптове с персонални настройки >> системата е готова за работа. На пръв поглед елементарно, ако нямаше едно НО. Компютъра може да ползва BIOS или UEFI, дисковете могат да са във формат MSDOS или GPT, може да се зарежда чрез GRUB но има и други като LILO примерно. Вариантите са много и смятам да покажа най-ползваните, иначе статията ще стане ужасно дълга.
Това е стария начин на работа на компютърните системи. Тъй като е стар то и има няколко ограничения. Приемаме, че компютъра е здрав, проверил е всичко и е определил към кой твърд диск да се насочи. Тук произлиза първата вариация. Дали диска е с формат MSDOS или е с GPT (дискове по-големи от 2.2ТВ).
Най-лесния начин за разбиране, но и с най-много ограничения. След като BIOS-a е избрал примерно да работи със SATA-0, то се обръща към първите му сектори. В първите 512 байта е записана структурата на диска и от там компютъра разбира как да работи с указания диск. Сега ще покажа една снимка и ще разберете.
Поглеждайки нагоре се вижда, че MBR записан в първите 512 байта на диска. Но той не е монолитен в прекия смисъл на думата. BIOS-а се обръща към първите 446 байта, където е казано, че компютъра трябва да зареди от този диск и до тук. Остават от MBR 66 байта. В тези байтове се описват на колко части е разделен диска. И се появява първото ограничение. Всеки дял е описан в 16 байта (розовите квадратчета). Това значи 66 делено на 16, могат да се запишат само 4 физически дяла на диска. И затова ако се сещате правим или 4 първични дяла или 3 първични дяла и един дял оставяме за създаване на логически. Последните 2 байта също се ползват но това за сега не ни вълнува. До тук бяха важни първите 446 байта и следващите 64. Обърнете внимание на физическите дялове какво се дефинира (флаг за зареждане, начало/край, тип на дяла, големина на сектора). Ограниченията ги разбрахме, но независимо от това има едно голямо предимство. Може в един дял да се сложи всичко (цялата ОС, всички папки с дървовидната си структура), като не е необходимо да се отделя MBR в отделян дял. Сега ще се постарая да покажа как протича зареждането на Linux при BIOS и MSDOS. - Инсталацията се прави на един дял --------------------------------------------- | [MBR] / [{PBR} Дял1] | --------------------------------------------- MBR (Main Boot Recort) - главен сектор за зареждане PBR (Partition Boot Record) - сектор за зареждане на дял 1. Дял1 - място за данни Процеса протича по следния начин: BIOS >> MBR >> PBR >> /boot/grub/grub.cfg >> ядро (/boot/vmlinux-x.y.z-a) >> процес init (SystemV) >> /etc/inittab >> зареждане на различни служби >> процес getty >> login >> shell >> стартови файлове (~/.profile, ~/.bashrc) BIOS указва кой диск да зареди, като намира на същия първите сектори където е MBR. MBR търси първия дял указан за /boot. Първия дял обаче в началото си има PBR с дефиниции на дяла. Тези дефиниции указват как да се държи дяла (колко е голям, от къде започва, къде свършва и от този род). PBR казва къде се намира /boot дяла където GRUB е записал конфигурацията на системата (/boot/grub/grub.cfg). Конфигурационния файл на GRUB кое ядро да се зареди и кой INITRD. След като се зареди ядрото автоматично се зареждат много модули указани чрез ядрото. Допълнителни модули зарежда и INITRD, всичко това стартира процеса INIT (SystemV). Това е главния процес който пък зарежда допълнителни процеси inittab (мисля че бяха на 6 нива). Зареждат се допълнителни служби докато накрая се зареди и shell (терминала) чрез който можете да влезете в системата с име и парола. Избрали име и парола системата зарежда конфигурационни файлове за профила на указания потребител. И така вече можете да работите с ОС. - Инсталацията се прави на няколко дяла ----------------------------------------------------------------------------------------------------- | [MBR] ||| [{PBR} Дял1] | [{PBR} Дял2] | [{PBR} Дял3] | [{PBR} Дял4] | ----------------------------------------------------------------------------------------------------- MBR (Main Boot Recort) - главен сектор за зареждане PBR (Partition Boot Record) - сектор за зареждане на съответните дялове. BIOS >> MBR >>/boot/grub/grub.cfg >> ядро (/boot/vmlinux-x.y.z-a) >> процес init (SystemV) >> /etc/inittab >> зареждане на различни служби >> процес getty >> login >> shell >> стартови файлове (~/.profile, ~/.bashrc)
Тук работата протича, все едно сме инсталирали ОС на няколко дяла, като първия дял се оставя за bios_grub. Това се прави така защото диска в във формат GPT. Няма да показвам как точно работи, защото в следващата статия точно ще видите приложението му и ще разберете защо е така.
Това е нов модерен начин на работа на дънната платка. Тук варианти много нямате. Диска задължително трябва да е във формат GPT и начина на зареждане е много по гъвкав. За информация ще покажа в долната снимка разликата между BIOS и UEFI.
Първото голямо предимство при UEFI е, че можете да правите на практика неограничено количество физически дялове. Защитата на файловата таблица е много по-голяма и още предимства да не ги изброявам. Работи се по следния начин: ----------------------------------------------------------------------------- | [PMBR] | OTP | TP | [{PBR} Дял1] | [{PBR} Дял2] | TP | OTP | ----------------------------------------------------------------------------- PMBR (Protective MBR) - защитен MBR OTP - заглавие на таблицата на дяловете TP - таблица на дяловете UEFI >> GRUB2 >> /boot/grub/grub.cfg >> ядро (/boot/vmlinuz-x.y.z-a) >> процес init (SystemV) >> /etc/inittab >> зареждане на различни служби >> процес getty >> login >> shell >> стартови файлове (~/.profile, ~/.bashrc) Всичко на пръв поглед прекрасно но в следващите статии ще разберете, че така се работи много по-мъчно и ако нямате опит предлагам да си работите или с BIOS или ако дъното е с UEFI да сте в режим Legaci.
Мисля, че много в сгъстен вид предадох най-важното и сега ще покажа може би най-срещаните грешки при зареждане на ОС.
Тук проблема е много разтегнат, защото част от GRUB има в MBR , част в /boot а съвсем различен е при UEFI. Приемаме, че не сте създали MBR. На практика системата ще зависне много ранен етап и нищо не можете да правите докато не го инсталирате. За целта се използва примерно следната команда:
grub-install /dev/sda
Не е задължително да се инсталира на /dev/sda, ако зареждате от втория диск ще ползвате /dev/sdb или /dev/disk/by-id/.........
Тук е много важен момент, като примерно едно 70-80% от грешките се получават именно тук. В другата си част GRUB дефинира от къде и как да зареди ядрото на операционната система. В началото като ми кажеха ядро си мислех, че е нещо едно такова голямо и цяло. На практика не е така. GRUB зарежда два файла vmlinuz-x.y.z-aa-generic и initd.img-x.y.z-aa-generic. За да е по-ясно, ядрото представлява диск в оперативната памет. Съдържа в себе си vmlinuz (масовите модули на ядрото *.ko) и initrd (RAM disk с точно определени модули) vmlinuz може да зарежда хиляди модули, както идват по подразбиране. Всичко що е масово използвано го зарежда, така че да може да се слага на почти всички конфигурации компютри. Вече на практика никой не компилира ядро за оптимизация. Компютрите станаха достатъчно силни. initrd (INIT RAM DISK) или initramfs (INIT RAM FailSystem), което е едно и също, зарежда точно определени модули които дефинират точно вашия компютър. Примерно ползвате не всички дискове, а само SATA, примерно ползвате RAID или странна някаква файлова система. Точно за това е initrd да определи точно вашата конфигурация, а не обща. Няколко примера какво зарежда: - FS драйвери (драйвер на файловите системи която използвате при инсталация), - Disk драйвер (драйвер на вида диск който ползвате), - Драйвер на контролера на дисковете, - Драйвер на шината на която работят дисковете. Ядрото се намира в /boot/ (vmlinuz-x.y.z-aa-generic и initd.img-x.y.z-aa-generic). В тези два файла са компресирани всички необходими модули за първоначално зареждане. Част от тези модули са и драйвери разбира се. Примерно в initd.img-x.y.z-aa-generic има драйвери от /drv, библиотеки от /lib и т.н. Да се върнем обаче на GRUB. Има един файл в /boot/grub който се нарича grub.cfg. В CentOS файла се казва menu.lst, който е линк към grub.cfg. Независимо как се казва тук е указано кое и как да се зарежда: Примерно set root='hd0,gpt2', linux /boot/vmlinuz-5.10.0-20-amd64 root=UUID=e773c59a-de21-4adb-b8c0 и initrd /boot/initrd.img-5.10.0-20-amd64. Така примерно се описва кое и от къде да зареди ядрото (кой диск, с кое UUID, кои файлове и т.н.). Не е лошо обстойно да огледате файла. В статията за ZFS усилено се използва този файл, особено ако /boot се намира в zpool. И не само за това, можете да регулирате времето на зареждане примерно, цветовата гама на зареждане и още какво ли не. Другото хубаво нещо на тази част на GRUB е, че позволява вече работа в конзола, докато преди не можеше. Сега ще имитираме че GRUB е счупен.
Натискаме c за да прекъснем зареждането на GRUB от меню
Появява се горния екран с grub>:. Отново искам да уточня. В случая системата си работи, ние просто казахме, че ще заредим GRUB ръчно. Ако неправилно сте конфигурирали GRUB то може да се появят следните грешки: grub rescue>: - Тази грешка се появява при условие, че GRUB не може да намери папката /boot/grub или съдържанието в тази папка. grub>: - Тук GRUB намира всичко, без grub.conf. GRUB: - GRUB не успял да намери дори най-основната информация. Това е лошо, ще трябва да се заредите от LiveCD. Да поработим само с grub>:.
Показва наличните дискове и дялове (диск hd0 с дялове gpt1, gpt2, gpt3 и gpt4). По принцип знам как съм инсталирал Linux-a (gpt1 - bios_grub, gpt2 - boot, gpt3 - boot и gpt4 - swap). Ако обаче не знаех чрез ls (диск,съответния дял) проверяваме как са създадени. - Първия дял е 1МВ нормално е да е bios_grub. - Втория дял е 2GB със ext4 файлова система. Логично да е boot. - Трети дял е заел много място, нормално тук да е разположен корена на системата /. - Четвъртия дял би трябвало да е swap Да проверим дали логиката ни е вярна:
Нарочно показах първите два дяла. На пръв поглед еднакви по съдържание. Обаче на първия не се разбира каква е файловата система на дяла, докато на втория е ext* модификация. Тка, че втория дял наистина е boot, докато първия не. На практика при gpt и BIOS винаги в първия дял се записва MBR в 512В и от там може да сме сигурни, че това е bios_grub. Да проверим и другите два дяла:
Отново горния проблем. И пак логически трябва да се мисли. Третия дял съдържа корена на операционната система. Файловата система е ext*, най-вероятно ext4. Размера е голям на дяла, нормално е да е ROOT дяла. За следващия обаче независимо, че показва корена на файловата система имаме непознат дял. Това трябва да ни казва, че показанията за корена на файловата система просто се копират от горния, не физически а просто показва кеша. Веднага демонстрираме:
Забележете разликата! При избора на четвъртия дял и след това при проба да видим какво има вътре, отговора е, че е непозната файловата система. При същите действия върху третия дял имаме корена на файловата система. Това означава, че третия дял е корена на файловата система, а не четвъртия дял. До тук имаме определени втори дял за boot и трети дял за корен на файловата система. На практика може да настроим GRUB да зареди правилно от къде да вземе ядрото, къде е корена и накрая правилно да зареди ОС. Да пробваме:
По горната снимка се вижда, че първо избрахме да работим с втория дял на диска. От там ще заредим ядрото (vmlinuz-5.10.0-21-amd64 и initrd.img-5.10.0-21-amd64). Обаче забележете, че за корен на директорията избрахме root=/dev/sda3, там където е разположен истинския корен. За initrd не е необходимо да се указва корена на ОС. След като сме заредили всичко необходимо което трябва да знае GRUB изпълняваме boot. Системата се зарежда успешно. След като се зареди системата:
grub-install /dev/sdb update-grub
Първо инсталираме GRUB в MBR след това обновяваме самия груб с пътищата които указахме по-горе. root=(hd0,2) >> това е: /boot root=/dev/sda3 >> това е: / - корена на каталога Всичко изглежда много лесно, но това е рядък случай. Просто беше една демонстрация как работи GRUB. Има случаи когато не можете така лесно да влезете в дяловете на ROOT. Примерно е в LVM или ZFS, тогава задължително ще е необходимо да се заредите от LiveCD поддържащо тази файлова система. Пак за пример: ако ROOT се намира в ZFS то ще е необходимо съответното LiveCD да поддържа ZFS версия не по-ниска от тази която ще ремонтирате. Подробно съм обяснил стъпките в: Инсталиране на Debian 11 на BIOS и ZFS-1. Търсете частта "Правилен ремонт на GRUB". С това приключвам. Следващата тема ще е "Разпределение на диска при BIOS и UEFI". Много интересна тема. Ще разберете как да си разделите диска в зависимост от типа дънна платка и размер на дисковете.