Огляд високого рівня
Цілі Systemd
Однокористувацький режим
Відновлення пароля root
Перегляд журналів попередніх завантажень
Виправлення помилок диска та файлової системи
Проблеми із завантажувачем Grub 2
Усунення несправностей grub
Виправлення зламаної установки grub
У цій статті описується процес завантаження систем CentOS/RHEL 7.x. Хоча він може залишатися схожим на попередні випуски, з RHEL 7 впроваджується systemd. На додаток до процесу завантаження, я надам поради та підказки щодо усунення несправностей.
Вам потрібно зрозуміти процес завантаження, перш ніж ви зможете активно вирішувати проблему під час завантаження. Перегляньте наведені нижче кроки, поки не ознайомитеся з процесом.
Огляд високого рівня
- Потужність + пост.
- Пошук прошивки пристрою.
- Прошивка читає завантажувач.
- Завантажувач завантажує конфігурацію (grub2).
- Завантажувач завантажує ядро та initramfs.
- Завантажувач передає управління ядру.
- Ядро ініціалізує обладнання + виконується
/sbin/init
як pid 1.
- Systemd виконує всі цілі initrd (монтує файлову систему на
/sysroot
).
- Кореневий FS ядра перейшов з initramfs root (
/sysroot
) на rootfs ( /
), а systemd повторно виконується як версія системи.
- Systemd шукає ціль за замовчуванням і запускає/зупиняє одиниці, як налаштовано, при автоматичному вирішенні залежностей і з'являється сторінка входу.
Для отримання додаткової інформації про процес завантаження зверніться до офіційної документації ОС для вашої системи.
Цілі Systemd
Цілі - це в основному перевірки залежностей. Вони мають конфігурацію «до» і «після», які саме послуги потрібні для досягнення цієї мети. Наприклад: arp.ethernet.service
, firewalld.service
, і так далі потрібно запустити і працювати, перш ніж network.target
можна буде досягти. Якщо він не досягнутий, такі служби, як httpd
, nfs
, і ldap
не можуть бути запущені. У RHEL/CentOS 7 можна встановити 4 цілі.
- graphical.target (інтерфейс графічного інтерфейсу)
- multi-user.target (багатокористувацький режим, текстовий вхід)
- rescue.target (підказка sulogin, базова ініціалізація системи)
- emergency.target (підказка sulogin, опорна точка initramfs завершена і кореневий корень системи змонтовано на / як тільки для читання)
Щоб переглянути поточну ціль завантаження за замовчуванням, скористайтеся наступним:
systemctl get-default
Майте на увазі, що ви можете змінити це під час виконання, ізолюючи ціль. Це запустить/зупинить усі служби, пов’язані з новою метою, тому будьте обережні (див. systemctl isolate new.target
).
Однокористувацький режим
Бувають випадки, коли вам потрібно буде завантажитися в режимі одного користувача, щоб вирішити проблему з операційною системою. Для цього прикладу я покажу вам, як використовувати rescue.target
«однокористувацький режим» на RHEL/CentOS 7.
- Перервіть меню grub2, натиснувши «e», щоб відредагувати, коли з’явиться запит меню grub.
- Знайдіть рядок, який визначає версію ядра ( vmlinuz ) і додайте до нього наступне:
systemd.unit=rescue.target
- Натисніть «Ctrl+x», щоб почати.
- Після цього вам буде запропоновано ввести пароль root для продовження. Після виходу з командної оболонки процес завантаження продовжить завантажувати вашу цільову сторінку за замовчуванням.
Відновлення пароля root
Цей процес трохи відрізняється від того, що ми використовували в попередніх випусках, але це просте завдання і вимагає дуже кількох кроків для цього. Якщо вам потрібно відновити будь-які облікові дані, ви можете використовувати цей метод для отримання доступу до віртуальної машини. Ви все ще можете завантажуватися з живого компакт-диска, монтувати кореневу файлову систему та редагувати пароль, але цей метод застарілий і вимагає більше зусиль.
- Перезавантажте систему.
- Перервіть меню grub2, натиснувши «e», щоб відредагувати, коли з’явиться запит меню grub.
- Перемістіть курсор в кінець рядка, який визначає ядро ( vmlinuz ). Ви можете видалити всі інші консолі, крім TTY0, однак цей крок може не знадобитися у вашому середовищі.
- Додайте
rd.break
( без лапок ), який порушить процес завантаження безпосередньо перед тим, як елемент керування буде передано з initramfs до фактичної системи.
- Ctrl+x для завантаження.
На цьому етапі представлена коренева оболонка з кореневою файловою системою, змонтованою в режимі лише для читання на /sysroot
. Нам потрібно буде перемонтувати його з привілеями на запис.
Перемонтуйте /sysroot
.
# mount -oremount,rw /sysroot
Перейти до в'язниці chroot.
# chroot /sysroot
Змініть пароль для користувача, у якого є застарілі облікові дані.
# passwd <username>
Якщо ви використовуєте SElinux, вам слід розглянути можливість перемаркування всіх файлів перед продовженням процесу завантаження. Цю частину можна пропустити, якщо ви не використовуєте SElinux.
# touch /.autorelabel
Двічі вийдіть, і система завантажиться з точки, коли ми її перервали.
Перегляд журналів попередніх завантажень
Може бути корисним переглядати журнали попередніх невдалих спроб завантаження. Якщо журнали були зроблені постійними (як правило, зберігаються в пам’яті та вивільняються під час завантаження), це можна зробити за допомогою journalctl
інструмента. Виконайте ці дії, якщо вам потрібно налаштувати постійний журнал завантаження.
Як root створіть файл журналу для збереження цієї інформації.
# mkdir -p 2775 /var/log/journal && chown :systemd-journal /var/log/journal
# systemctl restart systemd-journald
Щоб перевірити журнали попереднього завантаження, використовуйте -b
параметр з journalctl
. Без будь-яких аргументів -b
фільтруватиме вихід лише до повідомлень, що стосуються останнього завантаження. Від’ємне число для цього аргументу буде відфільтровано під час попередніх завантажень. Наприклад:
# journalctl -b-1 -p err
Це покаже вам журнали помилок під час завантаження, які виникли до останнього. Вам слід змінити числове значення, щоб відображати завантаження, яке потрібно переглянути.
Виправлення помилок диска та файлової системи
Однією з найпоширеніших помилок під час завантаження є неправильно налаштований /etc/fstab
файл. Ви НЕ МОЖЕТЕ використовувати rescue.target
для виправлення /etc/fstab
помилки. Більшість із цих проблем вимагатиме від нас використання, emergency.target
оскільки «порятунок» вимагає більш функціональної системи.
Нижче наведено приклади проблем, які вимагають emergency.target
:
- Пошкоджена файлова система.
- Неіснуючий UUID у
/etc/fstab
.
- Неіснуюча точка монтування в
/etc/fstab
.
- Неправильний варіант монтування в
/etc/fstab
.
Важливо : Після редагування /etc/fstab
файлу в екстреному режимі ви повинні виконати наступне для заходів безпеки:
# systemctl daemon-reload
Ось покроковий приклад. Ми збираємося завантажитися в аварійний режим, щоб видалити помилковий запис у /etc/fstab
.
- Перервіть меню grub2, натиснувши «e», щоб відредагувати, коли з’явиться запит меню grub.
- Знайдіть рядок, який визначає версію ядра ( vmlinuz ) і додайте до нього наступне:
systemd.unit=emergency.target
- Натисніть «Ctrl+x», щоб завантажитися.
- Вам буде запропоновано ввести пароль root для продовження.
- Перемонтуйте,
/
щоб ми могли внести зміни до fstab
файлу:# mount -oremount,rw /
- Ми можемо використовувати
mount
команду, щоб побачити, який запис викликає помилку:# mount -a
- Видаліть з
fstab
файлу порушний запис .
- Скористайтеся
mount -a
ще раз, щоб переконатися, що помилку вирішено.
- Використовуйте,
systemctl daemon-reload
як я згадував раніше, для перезавантаження всіх файлів модулів і відтворення всього дерева залежностей.
Після того, як ви вийдете з аварійної оболонки, система завершить завантаження з аварійної цілі, після чого ви зможете продовжити як зазвичай з цього моменту. Цей приклад був просто використаний, щоб показати вам процес використання аварійної цілі для внесення постійних змін до файлів у системі.
Проблеми із завантажувачем Grub 2
Цей /boot/grub2/grub.cfg
файл є основним файлом конфігурації. НЕ редагуйте цей файл вручну. Замість цього використовуйте grub2-mkconfig
для створення нової конфігурації grub2, використовуючи набір різних файлів конфігурації та список встановлених ядер. grub2-mkconfig
Команда буде дивитися на /etc/default/grub
варіанти , такі як тайм - аут меню по замовчуванням і ядра командного рядка для використання, а потім використовувати набір скриптів в /etc/grub.d/
для створення результуючого файлу конфігурації.
Ось текстова діаграма цього зв’язку.
/boot/grub2/grub.cfg
|
|__________________
| |
/etc/default/grub /etc/grub.d/*
Важливо: щоб відредагувати основний файл grub.cfg, вам потрібно буде внести потрібні зміни /etc/default/grub
у файли та у файли, /etc/grub.d/
а потім створити новий, grub.cfg
виконавши:
# grub2-mkconfig > /boot/grub2/grub.cfg
Усунення несправностей grub
Важливо зрозуміти синтаксис /boot/grub2/grub.cfg
файлу перед усуненням несправностей.
- По-перше, записи для завантаження кодуються всередині блоків «menuentry». У цих блоках
linux16
і initrd16
рядки вказують на ядро, яке потрібно завантажити з диска (разом з командним рядком ядра), і initramfs, які потрібно завантажити. Під час інтерактивного редагування під час завантаження для пошуку цих рядків використовується вкладка.
- Рядки «set root» всередині цих блоків не вказують на кореневу файлову систему для системи RHEL/CentOS 7, а натомість вказують на файлову систему, з якої grub2 має завантажувати файли ядра та initramfs. Синтаксис ,
harddrive.partition
де hd0
перший жорсткий диск в системі і hd1
є другим. Розділи вказуються як msdos1
для першого розділу MBR або gpt1
для першого розділу GPT.
Приклад з /boot/grub2/grub.cfg
:
### BEGIN /etc/grub.d/10_linux ###
menuentry 'CentOS Linux (3.10.0-514.26.2.el7.x86_64) 7 (Core)' --class centos --class gnu-linux --class gnu --class os --unrestricted $menuentry_id_option 'gnulinux-3.10.0-514.el7.x86_64-advanced-a2531d12-46f8-4a0f-8a5c-b48d6ef71275' {
load_video
set gfxpayload=keep
insmod gzio
insmod part_msdos
insmod ext2
set root='hd0,msdos1'
if [ x$feature_platform_search_hint = xy ]; then
search --no-floppy --fs-uuid --set=root --hint='hd0,msdos1' 123455ae-46f8-4a0f-8a5c-b48d6ef71275
else
search --no-floppy --fs-uuid --set=root 123455ae-46f8-4a0f-8a5c-b48d6ef71275
fi
Якщо вам потрібно повторно встановити завантажувач на пристрої, скористайтеся такою командою.
# grub2-install <device>
Виправлення зламаної установки grub
Для випадків, коли система не завантажиться після переходу до меню grub2.
- Ви повинні почати з редагування меню grub і пошуку синтаксичних помилок. Якщо ви знайдете його, виправте його та запустіть систему, щоб постійно вносити зміни, щоб усунути проблему.
- Якщо ви не можете знайти жодних помилок, зверніться до розділу вище, де ми завантажуємо аварійну ціль. Вам потрібно буде знову перемонтувати root (
/
).
- Перегляньте поточну конфігурацію grub2 за допомогою такої команди:
# grub2-mkconfig
- Якщо ви не бачите жодних помилок, ймовірно, хтось редагував
/boot/grub2/grub.cfg
файл. Не змінюйте цей файл. Перебудуйте конфігурацію за допомогою такої команди:# grub2-mkconfig > /boot/grub2/grub.cfg
Після того, як ви перебудували конфігурацію grub, ви зможете перезавантажитися без будь-яких проблем.