июня 23 2009 10:11 пп

Быстрая перезагрузка Linux с kexec

Tux-G2.png

Даже если Ваша работа не требует перезагрузки компьютера с Linux несколько раз в день, ожидание, пока система перезагружается может стать настоящей тягомотиной. Откройте для себя kexec. По существу, kexec — быстрый способ перезагрузки, который позволяет загрузить новое ядро, не имея дело с загрузчиком операционной системы. Быстрая перезагрузка — преимущество, даже если аптайм не является критически важным, а так же существенно экономит время для разработчиков ядра и системного ПО, которым приходится перезагружать их машины несколько раз в день. kexec в настоящий момент доступен только на x86 32-хразрядных платформах [так же и на 64-х разрядных — проверено].

Данная статья почти полностью переводная, дополненная переводчиком (т.е. мной). Если будут ошибки, пишите в коментарии.

В то время, как компьютерные системы стали быстрее и лучше, одна область, которая ещё должна подвергнуться улучшению — время системной перезагрузки. В действительности, так как системы становятся более развитыми и сложными в терминах скоростей процессора, размеров памяти и возможностей ресурсов, время перезагрузки фактически становится длинным. В то время, как время на перезагрузку может раздражать любого, его влияние критично для производительных систем, где чем дольше перезагрузка, тем меньше полезной работы. Кроме такого негативного влияния на доступность системы пользователям, долгая перезагрузка является узким местом в работе разработчиков ядра и системного ПО.

Время перезагрузок особенно долго, когда система оснащена множеством несильно распространённых шин SCSI или оперативной памятью с коррекцией ошибок (ECC). Результаты тестов показывают, что бОльшую часть времени во время процесса перезагрузки расходуется на стадию firmware (инициализацию аппаратной части, прим. пер.), когда подключенные к системе устройства распознаются и настраиваются. Естественно, большинство усилий на уменьшение перезагрузки нацелены на этот этап процесса. Одна такая попытка лежит в основе разработки kexec — особенности, доступной в ядре Linux на платформе x86. С помощью kexec, вы можете перезагрузить ядро, минуя стадию firmware и зарузчика ОС.Пропуск самой длительной части значитально уменьшает время перезагрузки.

Обзор загрузки Linux

Чтобы понять kexec, необходимо знание процесса загрузки в Linux. Он содержит две стадии: стадия загрузчика ОС и стадия ядра.

Главными компонентами загрузчика ОС являются стадия firmware, первый и второй уровень загрузчика. Процесс загрузки начинается, когда включается аппаратная часть. После некоторой инициализации, управление получает firmware, т.е. прошивка контроллеров. Она, так же называемая BIOS на некоторых архитектурах, находит различные устройства в системе, включая контроллер памяти, устройства хранения данных, мосты шины и другое оборудование. Прошивка на основании настроек передаёт управление простейшему загрузчику, известному как главная загрузочная область [MBR], которая может быть на винчестере, на сменном носителе или передаваться через сеть. Реальная работа по передаче управления операционной системе выполняется загрузчиком второго уровня (обычно называемого просто «загрузчик»). Этот загрузчик позволяет выбрать пользователю ядро, которое следует загрузить, загружает его и связанные с ним параметры в память, инициализирует его, устанавливает необходимую среду и, в конечном итоге, запускает ядро.

Следующая стадия загрузки — этап ядра, когда ядро берёт управление. Оно устанавливает необходимые структуры данных, опрашивает оборудование, загружает необходимые драйверы устройств и инициализирует эти устройства. Последняя стадия процесса загрузки включает в себя инициализацию пользовательского уровня. На этом этапе ядро проверяет целостность файловых систем, подключает их, устанавливает терминалы системы и много других вещей.

Во время перезагрузки системы стадии загрузчика предшествует остановка предыдущей запущеной системы.
Это включает в себя завершение запущенных процессов, сброс буферов на диск, отключение файловых систем и выполнение сброса аппаратной части.

Обзор kexec

Kexec — часть кода ядра, которая позволяет напрямую загрузить новое ядро из запущенного. В этом случае kexec пропускает стадию загрузчика и до него и передаёт управление ядру, которое мы хотим загрузить. Нет ни аппаратного сброса, ни операций с firmware и не вовлечён загрузчик. Слабое звено такой последовательности загрузки — это то, что firmware полностью игнорируется. Большой выигрыш от этой особенности в том, что перезагрузка системы крайне быстра. Для систем класса предприятия kexec радикально уменьшает время простоя, вызванного презагрузкой.

Использование kexec

Kexec состоит из двух частей. Первая — часть пользовательского пространства — называется kexec-tools. Вторая — описаная часть кода ядра. Две части выполняют две главные операции kexec: Загрузка нового ядра в память и перезагрузка в него. Ядро с возможностью kexec получить легко. Для этого надо активировать соответствующий пункт в конфигурации
CONFIG_KEXEC=y
Сконфигурированное с этой опцией ядро способно для загрузки нового. Как упомянуто выше, использование kexec состоит из (1) загрузки нового ядра в память и (2) действительная перезагрузка в него. Для (1) синтакс следующий:
kexec -l <kernel-image> —append=»<command-line-options>» —initrd=<initrd>
где <kernel-image> — ядро, предназначенное для перезагрузки, <command-line-options> — параметры, передаваемые этому ядру, <initrd> — диск, создаваемый загрузчиком в оперативной памяти.
Затем, для (2) следует написать:
kexec -e
Система сразу перезагрузится. В отличие от нормального процесса перезагрузки kexec не выполняет положенного процесса остановки системы перед перезагрузкой. Ответственность по остановке приложений и отключения фаловых систем переложена на плечи пользователя перед выполнением перезагрузки с помощью kexec.
Можно сделать оба действия и за один шаг, если аргументы kexec объединить.
Так же можно загрузить ядро в память для последующей перезагрузки в случае сбоя, называемого kernel panic. Делается это с помощью аргумента -p (—load-panic).
Для интеграции этой функции в систему, я нашёл в скрипте перезагрузки (/etc/rc.d/rc.6 в Slackware) команду /sbin/reboot и заменил её на:

  echo "Rebooting."
   if [ -f /kexec ]; then
     . /kexec
     if [ -z "${append}" ]; then
       KEXEC_PARAM="${KEXEC_PARAM} --reuse-cmdline"
     else
       KEXEC_PARAM="${KEXEC_PARAM} --append=\"${append}\""
     fi
     if [ -n "${initrd}" ]; then
       KEXEC_PARAM="${KEXEC_PARAM} --initrd=${initrd}"
     fi
     /sbin/kexec -l ${kernel_image} ${KEXEC_PARAM} -e
   else
     /sbin/reboot
   fi

Тепер, если мы создадим файл /kexec с содержанием:

kernel_image=/boot/vmlinuz-new
initrd=/boot/initrd-new
append="`cat /proc/cmdline`"

И выполним команду reboot или shutdown -r now, то быстро перезагрузим систему с новым ядром.

Источник статьи: http://www.permlug.org/




Комментариев нет »


Trackback URI | Comments RSS

Leave a Reply

You must be logged in to post a comment.


« | »

  • Реклама

  • Ссылки



    помощь в получение свидетельства допог
    dopog-rf.com

    Сопровождение. Бухгалтерское сопровождение
    iprofbuh.ru

  • Теги



Server load average: 0.01, 0.04, 0.00
Server uptime: 444 days, 17:53
Your IP is: 54.224.210.130.