Provided by: manpages-ru-dev_4.18.1-1_all bug

ИМЯ

       kexec_load, kexec_file_load - загружает новое ядро для выполнения в будущем

LIBRARY

       Standard C library (libc, -lc)

СИНТАКСИС

       #include <linux/kexec.h>      /* определения констант KEXEC_* */
       #include <sys/syscall.h>      /* определения констант SYS_* */
       #include <unistd.h>

       long syscall(SYS_kexec_load, unsigned long entry,
                    unsigned long nr_segments, struct kexec_segment *segments,
                    unsigned long flags);
       long syscall(SYS_kexec_file_load, int kernel_fd, int initrd_fd,
                    unsigned long cmdline_len, const char *cmdline,
                    unsigned long flags);

       Note:  glibc  provides  no  wrappers  for  these  system  calls,  necessitating the use of
       syscall(2).

ОПИСАНИЕ

       Системный вызов kexec_load() загружает новое ядро, которое можно запустить позже с помощью
       reboot(2).

       Аргумент flags представляет собой битовую маску, которая управляет работой вызова. В flags
       можно указать следующие значения:

       KEXEC_ON_CRASH (начиная с Linux 2.6.13)
              Запускать новое ядро автоматически после аварии системы.  Данное  «аварийное  ядро»
              загружено  в область зарезервированной памяти, которая определена во время загрузки
              с  помощью  параметра   командной   строки   ядра   crashkernel.   Область   данной
              зарезервированной  памяти  экспортируется  в  пространство  пользователя через файл
              /proc/iomem, в элемент с  меткой  «Crash  kernel».  Приложение  в  пользовательском
              пространстве  может  проанализировать  этот  файл  и  подготовить  список сегментов
              (смотрите далее),  которые  определяют  эту  зарезервированную  память  в  качестве
              приёмника.  Если  данный  флаг  установлен,  то  ядро  проверяет входят ли сегменты
              назначения, указанные в segments, в зарезервированную область.

       KEXEC_PRESERVE_CONTEXT (начиная с Linux 2.6.27)
              Сохранять аппаратное и программное состояния перед выполнением нового  ядра.  Может
              использоваться  для  перевода  системы  в  состояние  ожидания (suspend). Этот флаг
              доступен только, если ядро было собрано с параметром CONFIG_KEXEC_JUMP, и  работает
              только, если значение nr_segments больше 0.

       В  старших  битах  (соответствуют маске 0xffff0000) flags задаётся архитектура, на которой
       будет выполняться ядро. Константой (через OR)  KEXEC_ARCH_DEFAULT  задаётся  использование
       текущей архитектуры; также есть другие константы, описывающие архитектуры: KEXEC_ARCH_386,
       KEXEC_ARCH_68K,  KEXEC_ARCH_X86_64,  KEXEC_ARCH_PPC,  KEXEC_ARCH_PPC64,  KEXEC_ARCH_IA_64,
       KEXEC_ARCH_ARM,        KEXEC_ARCH_S390,       KEXEC_ARCH_SH,       KEXEC_ARCH_MIPS       и
       KEXEC_ARCH_MIPS_LE.Архитектура должна быть работоспособна на ЦП системы.

       В аргументе entry задаётся физический  адрес  точки  входа  в  образе  ядра.  В  аргументе
       nr_segments  задаётся  количество сегментов, на которые указывает указатель segments; ядро
       введено (произвольно) ограничение в 16 сегментов. В  аргументе  segments  задаётся  массив
       структур kexec_segment, который определяет разметку ядра:

           struct kexec_segment {
               void   *buf;        /* буфер в пользовательском пространстве */
               size_t  bufsz;      /* размер буфера в пользовательском пространстве */
               void   *mem;        /* физический адрес ядра */
               size_t  memsz;      /* размер ядра */
           };

       Образ ядра, определённый segments, копируется из вызывающего процесса в обычную память или
       в  зарезервированную  память  (если  определён  KEXEC_ON_CRASH).  Сначала  ядро  выполняет
       различные проверки информации, переданной в segments. Если всё в порядке, то ядро копирует
       сегмент данных в память ядра. Каждый сегмент, указанный в segments,  копируется  следующим
       образом:

       •  Значения  buf  и  bufsz  определяют  область памяти в виртуальном адресном пространстве
          вызывающего, который является источником копирования. Значение bufsz может не превышать
          значение в поле memsz.

       •  Значения  mem  и  memsz  определяют  физическое адресное пространство — приёмник копии.
          Значения, задаваемые в обоих полях, должны быть кратны размеру системной страницы.

       •  bufsz байт копируется из буфера источника в буфер назначения ядра.  Если  bufsz  меньше
          чем memsz, то оставшиеся байты в буфере ядра заполняются нулями.

       При  обычной  работе  kexec  (т.  е.,  флаг  не  установлен KEXEC_ON_CRASH) сегмент данных
       загружен в любую доступную память и перемещение выполняется в конечное назначение во время
       перезагрузки kexec (например, при выполнении команды kexec(8) с параметром -e).

       При  панике  kexec  (т.  е.,  флаг  KEXEC_ON_CRASH  установлен)сегмент  данных  загружен в
       зарезервированную память на момент вызова, и, после падения (crash), механизм kexec просто
       передаёт управление ядру.

       Системный  вызов  kexec_load()  доступен  только,  если  ядро  было  собрано  с параметром
       CONFIG_KEXEC.

   kexec_file_load()
       The kexec_file_load()  system call is similar to kexec_load(), but it  takes  a  different
       set  of arguments.  It reads the kernel to be loaded from the file referred to by the file
       descriptor kernel_fd, and the initrd (initial RAM disk)  to be loaded from  file  referred
       to  by  the  file  descriptor  initrd_fd.   The  cmdline argument is a pointer to a buffer
       containing the command line for the new kernel.  The cmdline_len argument  specifies  size
       of the buffer.  The last byte in the buffer must be a null byte ('\0').

       Аргумент  flags  представляет  собой  битовую  маску, которая изменяет поведение вызова. В
       flags можно указать следующие значения:

       KEXEC_FILE_UNLOAD
              Выгрузить загруженное в данный момент ядро.

       KEXEC_FILE_ON_CRASH
              Загрузить новое ядро в область памяти зарезервированную под аварийное ядро (как для
              KEXEC_ON_CRASH). Ядро запускается, если отказывает работающее в данный момент ядро.

       KEXEC_FILE_NO_INITRAMFS
              Загрузка  initrd/initramfs  не  обязательна.  Установите данный флаг, если не нужно
              загружать initramfs. Если флаг установлен, то значение,  передаваемое  в  initrd_fd
              игнорируется.

       Системный  вызов kexec_file_load() был добавлен для поддержки систем, где загрузка «kexec»
       должна быть ограничена только подписанными ядрами. Данный системный вызов доступен только,
       если ядро собрано с параметром CONFIG_KEXEC_FILE.

ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ

       При успешном выполнении эти системные вызовы возвращают 0. При ошибке возвращается -1, а в
       errno содержится код ошибки.

ОШИБКИ

       EADDRNOTAVAIL
              Указаны флаги KEXEC_ON_CRASH, но область, заданная полями mem  и  memsz  одного  из
              элементов segments, находится за пределами диапазона памяти, зарезервированного для
              аварийного ядра.

       EADDRNOTAVAIL
              Значение в поле mem или memsz в одном  из  элементов  segments  не  кратно  размеру
              системной страницы.

       EBADF  Значение kernel_fd или initrd_fd не является правильным файловым дескриптором.

       EBUSY  Уже загружено другое аварийное ядро или аварийное ядро уже используется.

       EINVAL Значение flags неверно.

       EINVAL Значение   поля   bufsz   одного   из   элементов  segments  превышает  значение  в
              соответствующем поле memsz.

       EINVAL Значение nr_segments превышает KEXEC_SEGMENT_MAX (16).

       EINVAL Два или более буфера назначения ядра перекрываются.

       EINVAL The value in cmdline[cmdline_len-1] is not '\0'.

       EINVAL Файл, на который ссылается kernel_fd или initrd_fd, пуст (нулевой длины).

       ENOEXEC
              Значение kernel_fd не указывает на открытый файл, или ядро не может загрузить  этот
              файл.  В  настоящее время, файл должен быть в формате и содержать ядро x86, которое
              можно  загрузить  в  память  выше  4 ГиБ  (смотрите  файл   исходного   кода   ядра
              Documentation/x86/boot.txt).

       ENOMEM Невозможно выделить память.

       EPERM  Вызывающий не имеет мандата CAP_SYS_BOOT.

ВЕРСИИ

       Системный   вызов   kexec_load()   впервые   появился  в  Linux  2.6.13.  Системный  вызов
       kexec_file_load() впервые появился в Linux 3.17.

СТАНДАРТЫ

       Данные системные вызовы есть только в Linux.

СМ. ТАКЖЕ

       reboot(2), syscall(2), kexec(8)

       Файлы       исходного       кода        ядра        Documentation/kdump/kdump.txt        и
       Documentation/admin-guide/kernel-parameters.txt

ПЕРЕВОД

       Русский  перевод  этой  страницы  руководства  был сделан Alex Nik <rage.iz.me@gmail.com>,
       Azamat Hackimov  <azamat.hackimov@gmail.com>,  Yuri  Kozlov  <yuray@komyakino.ru>  и  Иван
       Павлов <pavia00@gmail.com>

       Этот  перевод  является  бесплатной  документацией;  прочитайте  Стандартную  общественную
       лицензию GNU версии 3 ⟨https://www.gnu.org/licenses/gpl-3.0.html⟩ или более позднюю, чтобы
       узнать об условиях авторского права. Мы не несем НИКАКОЙ ОТВЕТСТВЕННОСТИ.

       Если  вы  обнаружите  ошибки  в  переводе этой страницы руководства, пожалуйста, отправьте
       электронное письмо на ⟨man-pages-ru-talks@lists.sourceforge.net⟩.