среда, 22 сентября 2010 г.

Запускаем и выключаем Linux: Часть 1

Это вопрос довольно таки важный для любой операционной системы. Мы рассмотрим его в двух статьях, где поговорим о следующих вопросах:
  • Этапы запуска системы 
  • Что такое MBR 
  • Что такое загрузчики, какие они бывают и что позволяют делать 
  • rc сценарии загрузки
  • начальное монтирование файловых систем при загрузке системы
  • Проблемы загрузки
  • Этапы выключения системы 
  • Два способа выключения  системы. 
В первой статье мы рассмотрим вопросы общетеоретического характера(кратко), и это нужно для того, чтобы читатель знал как загружается система более детально, нежели "я нажал на кнопку и жду появления окошка ввода пароля GNOME/ KDE/XFCE etc" а так же научимся выключать компьютер и поймем как это происходит.


1. Запускаем Linux:  этапы большого пути)
Ясно что первый этап он очень сложен нажать на кнопочку power у блока машины:). После этого начинает выполняться BIOS(Basic Input Output System  ) это как бы встроенная ОС компьютера, которая должна его подготовить к работе с настоящей ОС. BIOS производит проверку оборудования (т.н. POST ),активирует жесткий диск, распознает другое базовое   как результат вы слышите различные звуки из спикера. Если все пройдет успешно, то BIOS насчет считывать первые 512 байт с жесткого диска, т.н. MBR(Main Boot Record Главную Загрузочную Запись ). Она должна иметь особую структуру и передать управление загрузчику. Для Linux это либо LILO либо GRUB. Они позволяют  выбрать необходимую операционную систему и ядро Linux для загрузки. Рассматривать в 1 части будем GRUB как наиболее распространенный из загрузчиков, итак что же он позволяет?

  • Выбирать какую операционную систему из установленных загрузить, выбирать необходимую версию ядра 
  • Передавать параметры ядру перед его загрузкой
  • Производить операции по просмотру дисковых разделов и т.д. из командной строки 
Я думаю что с первым пунктом все ясно, а вот со вторым разберемся.

1.1 Загрузка ядра и параметры загрузки 
загрузчик и ядро Linux выполняет много дел. Что ж кратко пробежимся по параметрам строки:
Возьмем для примера эту:
root (hd0,0)
kernel /boot/vmlinuz-2.6.26-2-686
root =/dev/sda1 ro qeit
initrd  /boot/initrd.img 2.6.26-2-386
Первая строчка говорит загрузчику на каком устройстве размещено устройство
Вторая, где ядро
Третья куда монтировать.  параметр qeit задает ожидание
Четвертая показывает, где находится сценарий загрузки.  
Что ж с этим я думаю понятно
1.2 От скрипта Init до DE(Desktop Envirement )

  Если загрузка ядра корректна, то ядро начнет инициализацию своих подсистем  и поиск оборудования. Каждое действие ядра сопровождается выводом сообщений и они сохраняются в лог. Если поиск оборудования прошел успешно, то следующий этап это:
а) Старт оболочки командной строки (обычно bash). Правда это не первый процесс запускаемой системой, родителем всех процессов в системе является скрипт init. Если все пройдет успешно, то вы увидите запрос на авторизацию в системе
б) Если в системе предустановлена графическая оболочка, то после активации всех систем ядра произойдет запуск X-server это базовая графическая система в *Nix системах 
И уже, исходя из файлов конфигурации X будет запущена та или иная графическая среда рабочего стола.
Вот после этого можно считать что загрузка завершена. Итак если обобщить:

  1. Запуск BIOS и самотестирование оборудования
  2. Поиск  MBR и передача управления программе, записанной в MBR
  3. Запуск загрузчика, выбор ядра при необходимости корректировка параметров загрузки 
  4.  Определение оборудования, загрузка необходимых модулей(выгрузка если в течении 10 сек не использованы), запуск сценариев инициализации системы
  5.  Запрос авторизации и после успеха штатный режим работы. 

2. Выключаем Linux
Когда система выключается перед ней возникает несколько задач:


  •  Остановка всех процессов,выполняющихся в системе
  • Сброс на диск данных из буферов ввода/вывода
  • Закрытие всех объектов ядра и освобождение памяти
  • Останов аппаратуры 
  • Отключение электропитания через ACPI 
 Важно что при выключении системы будет послан сигнал всем процессам на их выключение. При несохранении данных до выключения они могут быть утеряны. Кроме всего прочего Linux и другие Nix системы применяют отложенную запись на диск, т.е. ядро не сразу сбрасывает данные на диск, а спустя некоторое время. Вот это время они находятся в буферах ввода/вывода. И если система в этот момент внезапно отключится, например вы нажмете на кнопку отключения питания, или отключится электричество, то все данные находящиеся в ОЗУ, в том числе буферы ввода/вывода просто исчезнут и данные будут утрачены.
Отсюда два вывода:
1. Всегда выключайте компьютер через средства операционной системы 
2. Обзаводитесь такими приборами как ИБП (источники бесперебойного питания) они дадут вам время для сохранения данных и корректного завершения работы      
При некорректном завершении операций ввода/вывода может сложится ситуация полного разрушения файловой системы и это не вина Linux такая ситуация характерна для любой операционной системы. К слову, журналируемые файловые системы типа Ext4/3, Raiser и другие предоставляют инструменты для максимального снижения развития ситуации по описанному сценарию. В штатном режиме работы операционная система в обязательном порядке гарантирует сброс данных диск из буферов(либо при полном их заполнении, либо при выключении).На самом деле то, что применяется такая политика записи данных имеет свои преимущества,  а именно: уменьшение обращений к жесткому диску что повышает скорость работы системы. При выключении системы ядро закрывает открытые файлы, завершает все процессы, потоки, закрывает все сетевые соединения. После этого ядро останавливает различные подсистемы управления оборудованием. Ну и в конце концов ядро на современных машинах может управлять электропитанием и следовательно может программно выключить машину.     
Как мы можем выключить машину?
1 способ через графический интерфейс и здесь никаких комментариев не требуется.
2 способ  через командную строку, так как выключение компьютера это процесс глобальный, то вам потребуются права суперпользователя(root) значит вам придется запустить команду  выключения из под sudo, а сама команда выключения это shutdown. Для этой команды существуют различные ключи и параметры, нас же интересует следующие: -h это указание к останову системы, указать время мы можем либо словесно(например чтобы немедленно выключить машину: sudo shutdown -h now) или в форме указания времени до выключения (sudo shutdown -h +30 это приведет к выключению системы через 30 мин ) или указав точное время, например(shutdown -h 18:30).
На этом завершим краткое введение в тему старта/останова Linux, а во второй части изучим все эти процессы детальней.