Начално зареждане на системата
3. GRUB2 (GRand Unified Bootloader, version 2)
Редактиране на конфигурационния файл
Ø Избор на операционна система стартирана по подразбиране
Ø Избор дали да се показва менюто
Ø Управление на времето за показване на менюто
7. Пример – при загубена root парола в Ubuntu
Рестартиране на компютъра за достъп до GRUB менюто
Началното зареждане започва с включването на компютъра и включва 2 етапа – зареждане (boot) и стартиране (startup). Етапът boot започва с включването на компютъра и завършва когато ядрото е инициализирано и systemd е стартиран. Етапът startup има задачата да доведе Linux системата в работоспособно състояние.
Етапът зареждане включва следните подетапи:
· POST;
· Boot loader (GRUB2);
· Инициализация на ядрото;
· Стартиране на systemd, родителя на всички процеси.
GRUB2 и systemd са повсеместно използвани понастоящем в съвременните Linux дистрибуции. Исторически са използвани и други софтуерни опции (като например Boot loader LILO), които могат да се срещат още в някои дистрибуции.
Първата стъпка от началното зареждане няма нищо общо с Linux. Това е хардуерната част от началното зареждане и е еднаква за всички операционни системи. При включването на компютъра се включва POST (Power On Self Test), която е част от BIOS (Basic I/O System) или от по-съвременната система UEFI (Unified Extensible Firmware Interface).
POST проверява базовата функционалност на хардуера, след което локализира boot сектора, на всички закачени устройства подредени по начин задаван от потребителя в CMOS (памет поддържана от батерия). Първият намерен валиден boot loader сектор се зарежда в паметта и му се предава управлението.
Повечето Linux дистрибуции използват три boot loader - GRUB, GRUB2, и LILO. GRUB2 е най-новият и понастоящем е използван много по-често от другите по-стари опции.
GRUB2 е програмата, която намира ядрото на операционната система и го зарежда в паметта. Той е проектиран да позволява зареждането на различни операционни системи, както на такива със свободен лиценз, така и на защитени от частни лицензи.
Той позволява зареждането на различни ядра от коя и да е зададена Linux дистрибуция, което дава възможност за зареждане на старо ядро, ако новата версия е несъвместима с някакъв хардуер. При зареждането чете настройките си от конфигурационния файл /boot/grub/grub.conf.
GRUB1 понастоящем се разглежда като остарял (legacy) и е заместен с по-съвременният GRUB2, който е пренаписан GRUB1. В изложението по надолу под GRUB ще бъде разбиран GRUB2
Изпълнението на GRUB преминава през различни етапи и завършва със зареждането на избраното ядро на операционната система.
Подробна информация за него може да бъде намерена в GRUB manual.
Всички ядра се съхраняват в само разархивиращ се компресиран формат в директория /boot заедно с хардуерна информация за компютърната система.
След като ядрото се разархивира, то зарежда systemd, който е бащиният процес на всички процеси. С този под етап завършва етапа boot – ядрото на операционната система и systemd функционират, но нищо друго още не работи
Стартирането на системата се извършва от systemd.
Той започва с закачването (mount) файловите системи, които са описани във файла /etc/fstab, включително всички swap файлове или дискови дялове. След това има той получава достъп до конфигурационните файлове в директорията /etc/systemd/system/ за да определи в какво състояние ( target) трябва да стартира компютъра.
Стартирането може да бъде извършено в различни състояния (runlevels). Най-често използваните са :
· 5 (graphical target) – използвано от работни станции с графичен потребителски интерфейс. За работа с командния интерфейс трябва да се отвори терминален прозорец, което може да се извърши по всяко време с комбинацията от клавиши CTRL+Alt+T. Затварянето на прозореца става с команда CTRL+D.
· 3 (multi-user.target) – работеща система само с команден интерфейс, използвано от сървъри
· 1 (rescue.target) – един потребител с конзола за поддръжка.
В какво състояние да се стартира компютъра може да се зададе чрез подходящо конфигуриране на GRUB.
Главният конфигурационен файл на GRUB е /boot/grub/grub.cfg, но той не се редактира директно, а се създава от скриптове разположени в директорията /etc/grub.d/, които ползват въведените настройки във файла /etc/default/grub.
Например в Ubuntu има скриптове, които конфигурират как да изглежда менюто, както и скриптове, които проверяват твърдите дискове за инсталирани други операционни системи - Windows, други Linux дистрибуции, Mac OS, … и ги добавят автоматично към менюто на GRUB2.
Файлът /boot/grub/grub.cfg се създава автоматично при изпълнение на командата:
$sudo update-grub
При изпълнение на тази команда скриптовете от директорията /etc/grub.d/ използват данните от файла /etc/default/grub за създаване на файла /boot/grub/grub.cfg, който се използва при стартирането на системата. Това налага използването на командата всеки път при въвеждането на промени в /etc/default/grub за да могат промените да бъдат отразени.
С други думи въвеждането на промени в менюто за начално зареждане се осъществява на две стъпки – редактиране на конфигурационния файл /etc/default/grub и стартиране на командата update-grub.
Конфигурационният файл се отваря с текстов редактор – например
$sudo nano /etc/default/grub
Файлът /etc/default/grub е малък и е лесен за редактиране. Като при всеки друг конфигурационен файл трябва да бъдат променени желаните опции и файлът да бъде записан. Ако някоя от описаните по-долу опции я няма – тя се добавя на нов ред. Ако съществува – редът се редактира.
Редактира се редът GRUB_DEFAULT. По подразбиране се задава GRUB_DEFAULT=0, което означава че се стартира първата операционна система намерена от скриптовете. Номерът трябва да бъде сменен на 1 за втората, на 2 за третата.
Възможно е да се специфицира не номер, а етикет на операционната система зададен от скриптовете. Например, ако в менюто има операционна система Windows 10 (loader), може да се използва GRUB_DEFAULT=”Windows 10 (loader)”.
Възможно е също така да се използва GRUB_DEFAULT=saved и GRUB автоматично ще зарежда последната избрана операционна система. За да работи трябва да бъде добавен ред GRUB_SAVEDEFAULT=true.
Когато има заредена само една операционна система по подразбиране менюто не се показва, а системата се стартира автоматично. В конфигурационния файл опцията е GRUB_HIDDEN_TIMEOUT=0 – скрито меню и операционна система стартирана след 0 секунди. В този случай менюто отново може да се види като се натисне клавиша shift по време на стартирането. За увеличаване на времето на стартирането (повече време за натискане на shift) може да се използва GRUB_HIDDEN_TIMEOUT=5. В този случай се извежда празен екран за 5 секунди, през които може да бъде натиснат shift.
За да се показва менюто редът трябва да бъде превърнат в коментар с въвеждане на # в началото — #GRUB_HIDDEN_TIMEOUT=0 и да се включи опция GRUB_TIMEOUT_STYLE=menu
Ако менюто не е скрито GRUB ще зареди автоматично подразбиращата се операционна система след определен период от време, обикновено 10 секунди. За промяна на този период трябва да се редактира редът GRUB_TIMEOUT=10 и да се въведе необходимото време в секунди.
За да бъде избегнато автоматичното зареждане (винаги да се чака избор с enter) трябва редът да бъде променен на GRUB_TIMEOUT=-1
Редът GRUB_BACKGROUND задава изображение, което се използва като фон на менюто. По подразбиране GRUB използва черно бял екран. Може да бъде добавен ред за специфициране на файл с фоново изображение например GRUB_BACKGROUND=”/home/user/Pictures/background.png”.
Има ограничения за файла. GRUB поддържа JPG/JPEG но те са ограничени до 256 цвята. Файловете PNG поддържат произволен брой цветове и винаги могат да се използват. Могат също така да бъдат използвани и TGA файлове.
Това не са всички настройки, но това са някои от най-често променяните. Някои настройки могат да бъдат променяни с редактиране на скриптовете в директорията /etc/grub.d .
Допълнителна информация може да бъде намерена в GRUB manual.
След извършената редакция трябва да се стартират скриптовете за да се създаде новият конфигурационен файл /boot/grub/grub.cfg:
$sudo update-grub
Забележка: Ако искате да забавите стартирането на Windows опцията (например за да можете спокойно да натиснете F8 за преминаване в save mode) в административен команден прозорец на Windows се задава командата
bcdedit /set {default} bootmenupolicy legacy
и се рестартира. Възстановяването се извършва отново в административен команден прозорец на Windows с командата:
bcdedit /set {default} bootmenupolicy standard
Необходим е непосредствен (а не отдалечен) достъп до компютъра, за да се има достъп до настройките на GRUB.
Отива се на реда с който се стартира UBUNTU и се натиска клавиш "e" за редакция.
Намира се редът който започва linux и се редактира за да бъде включен read-write mode rw и init=/bin/bash. Например
От:
linux /boot/vmlinuz-4-4.0-22-generic root=UUID=43ad24d3-e\
c5b-44ee-a099-a88eb9520989 ro quiet splash $vt_handoff
Да се промени на:
linux /boot/vmlinuz-4-4.0-22-generic root=UUID=43ad24d3-e\
c5b-44ee-a099-a88eb9520989 rw init=/bin/bash
След което се натиска CTRL+x
или F10
за зареждане (
boot).
След зареждането трябва да се появи командния ред на root и да има монтиран root дисков дял за четене и писане. Това може да се провери с командата:
root@(none):/# mount | grep -w /
Нова парола се задава с команда
root@(none):/# passwd
След което системата се зарежда отново
root@(none):/# exec /sbin/init