forked from mizabrik/acos-notes
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathboot.tex
More file actions
114 lines (101 loc) · 10.4 KB
/
boot.tex
File metadata and controls
114 lines (101 loc) · 10.4 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
\documentclass[main]{subfiles}
\begin{document}
\chapter{Процесс загрузки}
\section{"<Создание планеты">}
Пользователь нажимает кнопку включения, и после этого запускается
firmware компьютера. Зачастую, проходит POST --- стадия, на которой
проверяются и иницализируются устройства.
Есть интерфейс IPMI.
Может быть так, что для запуска железа выделено отдельное устройство.
Например, к сетевому интерфейсу подключено устройство, которое также
подключено к блоку питания. Оно же может получить информацию от всех
устройств, запрещать их запуск и т. д. По командам из сети, это устройство
может включать и выключать компьютер и т. д. В целях безопасности, оно должно
быть подключено к специальной сети, изолированной от любых других воздействий.
Зачастую используюется на серверах.
На персональных компьютерах именно она проводит POST. Заводится таблица
подключённых устройств. На ПК с определённой флэш-памяти копируется код в
память и управление передаётся ему. Зачастую, информцаия об обнаруженных
устройствах и тестах выводится на экран.
\section{"<Создание животного мира">}
Все процессоры поддерживают некоторое семейство, поэтому если вы используете
какой-нибудь Intel Core i7, он всё равно должен загрузить DOS, который работает
в шестнадцатиричном режиме, поэтому он будет работать в этом режиме для совместимости.
Из этого вытекало, что некоторые старые загрузчики не могли загружать ОС,
которые находились в той части диска, которую нельзя было адресовать в
шестандцатибитном режиме.
Загрузчик второй стадии уже гораздо сложнее, и обычно работает уже в более
современных режимах. Он уже что-то понимает о ФС, в которой живёт операционная
система. Для Linux существует довольно много загрузчиков: yeboot (PowerPC),
slilo (Sun) и lilo, syslinux, grub2 (x86 и amd64).
GRUB2, например, может загрузить загрузчик второй стадии другой ОС, что
позволяет, например, загрузить Windows.
Загрузчики второй стадии также могут понимать что-то в способе передачи параметров
ядру и в модулях ядра. Например, загрузчик FreeBSD загружает весь список необходимых
модулей в память, снимая эту задачу с ядра. В мире Linux этот подход не используется,
в момент загрузки в память помещается initramfs, которая является корнем до некоторого
момента в загрузке, после чего память освобождается. Туда попадают модули,
которые нужны для работы машины.
\section{"<Создание человека"> --- ОС}
\begin{enumerate}
\item Иницализация железа: обновления различных таблиц,
например --- таблицы прерываний, настройка виртуальной памяти
\item Монтирование initrd
\item Иницализцаия драйверов
\item Организация буферов ввода-вывода: обычно драйверы используют
буферы, чтобы отложить дорогостоящие операции, например ---
запись на диск. Сначала операции помещаются в отдельный буфер, когда
подходит их очередь, драйвер исполняет команду, работая с буфером,
а когда-то потом происходит работа с самим устройством.
\item Развёртывание инфраструктуры для запуска процессов: для работы
с процессами нужна таблица процессов, и самому ядру тоже нужен отдельный
процесс (под номером 0). Существует даже вызов kexec, который позволяет
заменить образ ядра без перезагрузки.
\item Запуск окружения: этим уже занимается программа под названием init,
которая запускается после иницализации под номером 1, и работает
до выключения. Он же занимается корректным завершением работы.
\end{enumerate}
\section{"<Создание общества">, "<Грехопадение"> --- запуск пользовательского окружения}
Уже лет 40 использовалась SysV-Init, но в последнее время большая часть
большая часть дистрибутивов (кроме Gentoo и Slackware) использует systemd.
Можно сделать chroot и exec init, и тогда уже вы будете использовать реальный init.
В случае с SysV Init происходит следующее:
Файл /etc/inittab содержит информацию о настройке терминалов и runlevel'ов.
Обычно, runlevel 0 --- выключение, 1 --- однопользовательский режим (для восстановления),
2-3 --- обычно, многопользовательский режим без графической оболочки,
4-5 --- графический режим, 6 --- перезагрузка.
В катаолгах /etc/rc.d/ или /etc/init.d и т. п. лежат скрипты, которые, собственнуо
управляют запуском и остановкой конкретных программ, настройкой и т. д.
Например, можно остановить SSH с помощью /etc/init.d/ssh stop.
\subsection{Systemd}
Systemd сильно опирается на DBUS, udev и cgroups (последнее позволяет запускать
его только на Linux). udev позволяет иницализировать и настраивать устройства,
в том числе --- подключённые "на горячюю", во время работы ОС.
cgroups позволяет задавать ограничения процессам, что может повысить безопасность.
systemd может сделать произвольное приложение демоном. Ранее считалось, что стать
демоном --- задача самого приложения. Это включает следующее:
\begin{itemize}
\item Файл журнала (обычно лежат в /var/log) --- собственный либо использующий
syslog (позволяет, например, отправлять логи на удалённый компьтер)
\item pid-файл (обычно в /var/run) --- pid запущенного демона
(защита от повторного запуска). Обыкновенно он заблокирован (с помощью fcntl).
\item Конфигурационные файлы (каталог /etc)
\item Пользователь и группа, возможно --- альтернативный корень / chroot
(изолирование в целях безопасности).
\end{itemize}
Как становится демоном?
Во-первых, нужно считать конфиги. Далее нужно открыть на запись pid-файл
и заблокировать его, открыть на запись файл журналов и сменить его владельца.
Далее нужно закрыть дескрипторы стандартного ввода, вывода и потока ошибок.
Выполняется форк, отец завершается, а сын --- меняет pgrp и sessid,
меняет egid и euid на соответствующие пользователю демона.
Также рекомендуется совершить второй форк (с завершением отца)
для полной изоляции.
Systemd же выполняет все эти действия самостоятельно, и повторное выполнение
этих действий может привести к ошибкам, поэтому systemd-style демоны должны
запускаться как обычная программа.
Раннее в файле /etc/inettab хранился список программ, которые нужно было "демонизировать".
См. также inetd, xinetd. Там хранился список программ, необходимых только по некоторым
особым случаям. Раньше туда можно было вписать imapd, потоки ввода-вывода ему обеспечивал
xinetd, он же запускал и выключал его. Теперь эту функциональность берёт на себя systemd.
\end{document}