Почему в моей дистрибуции на базе Linux Yocto не установлен файл sysctl.conf?

Вопрос или проблема

На моей Yocto-базированной дистрибуции Linux я не нахожу файл sysctl.conf. Доказательством этого является выполнение команды:

> find / -name "sysctl.conf"

которая имеет пустой вывод.

На моей сборочной системе Yocto я могу найти:

  1. файл sysctl.conf по пути: meta/recipes-extended/procps/procps/
  2. рецепт procps_3.3.16.bb по пути meta/recipes-extended/procps/

Содержимое рецепта procps_3.3.16.bb следующее:

SUMMARY = "System and process monitoring utilities"
DESCRIPTION = "Procps содержит набор системных утилит, которые предоставляют системную информацию о процессах, используя \
файловую систему /proc. Пакет включает программы ps, top, vmstat, w, kill и skill."
HOMEPAGE = "https://gitlab.com/procps-ng/procps"
SECTION = "base"
LICENSE = "GPLv2+ & LGPLv2+"
LIC_FILES_CHKSUM = "file://COPYING;md5=b234ee4d69f5fce4486a80fdaf4a4263 \
                    file://COPYING.LIB;md5=4cf66a4984120007c9881cc871cf49db \
                    "

DEPENDS = "ncurses"

inherit autotools gettext pkgconfig update-alternatives

SRC_URI = "git://gitlab.com/procps-ng/procps.git;protocol=https \
           file://sysctl.conf \
           "
SRCREV = "59c88e18f29000ceaf7e5f98181b07be443cf12f"

S = "${WORKDIR}/git"

# В исходной версии есть собственный autogen.sh, который вызывает po/update-potfiles, так как они
# не предоставляют по/POTFILES.in (что глупо). Без этого файла gettext
# не считает по/ папкой gettext и не создает по/Makefile.
do_configure_prepend() {
    ( cd ${S} && po/update-potfiles )
}

EXTRA_OECONF = "--enable-skill --disable-modern-top"

PACKAGECONFIG ??= "${@bb.utils.filter('DISTRO_FEATURES', 'systemd', d)}"
PACKAGECONFIG[systemd] = "--with-systemd,--without-systemd,systemd"

do_install_append () {
    install -d ${D}${base_bindir}
    [ "${bindir}" != "${base_bindir}" ] && for i in ${base_bindir_progs}; do mv ${D}${bindir}/$i ${D}${base_bindir}/$i; done
    install -d ${D}${base_sbindir}
    [ "${sbindir}" != "${base_sbindir}" ] && for i in ${base_sbindir_progs}; do mv ${D}${sbindir}/$i ${D}${base_sbindir}/$i; done
        if [ "${base_sbindir}" != "${sbindir}" ]; then
                rmdir ${D}${sbindir}
        fi

        install -d ${D}${sysconfdir}
        install -m 0644 ${WORKDIR}/sysctl.conf ${D}${sysconfdir}/sysctl.conf
        if ${@bb.utils.contains('DISTRO_FEATURES','systemd','true','false',d)}; then
                install -d ${D}${sysconfdir}/sysctl.d
                ln -sf ../sysctl.conf ${D}${sysconfdir}/sysctl.d/99-sysctl.conf
        fi
}

CONFFILES_${PN} = "${sysconfdir}/sysctl.conf"

bindir_progs = "free pkill pmap pgrep pwdx skill snice top uptime w"
base_bindir_progs += "kill pidof ps watch"
base_sbindir_progs += "sysctl"

ALTERNATIVE_PRIORITY = "200"
ALTERNATIVE_PRIORITY[pidof] = "150"

ALTERNATIVE_${PN} = "${bindir_progs} ${base_bindir_progs} ${base_sbindir_progs}"

ALTERNATIVE_${PN}-doc = "kill.1 uptime.1"
ALTERNATIVE_LINK_NAME[kill.1] = "${mandir}/man1/kill.1"
ALTERNATIVE_LINK_NAME[uptime.1] = "${mandir}/man1/uptime.1"

python __anonymous() {
    for prog in d.getVar('base_bindir_progs').split():
        d.setVarFlag('ALTERNATIVE_LINK_NAME', prog, '%s/%s' % (d.getVar('base_bindir'), prog))

    for prog in d.getVar('base_sbindir_progs').split():
        d.setVarFlag('ALTERNATIVE_LINK_NAME', prog, '%s/%s' % (d.getVar('base_sbindir'), prog))
}

# 'ps' не подходит для использования в качестве инструмента безопасности, поэтому помещаем в белый список этот CVE.
# https://bugzilla.redhat.com/show_bug.cgi?id=1575473#c3
CVE_CHECK_WHITELIST += "CVE-2018-1121"

С предыдущим рецептом procps_3.3.16.bb я думаю, что файл sysctl.conf должен быть установлен в /etc/; я думаю так, потому что в функции do_install_append(), объявленной в рецепте, присутствует команда:

install -m 0644 ${WORKDIR}/sysctl.conf ${D}${sysconfdir}/sysctl.conf

которая, кажется, устанавливает файл sysctl.conf в образе.

Кроме того, после выполнения команды bitbake procps, в папке сборки procps я могу найти файл /etc/sysctl.conf в подкаталогах image и package.

Таким образом, кажется, что файл правильно подготовлен для развертывания на конечное изображение, но развертывание не выполняется.

Вопрос

Почему файл sysctl.conf отсутствует в папке /etc/ файловой системы образа yocto?

Ответ или решение

На вашем Linux-дистрибутиве на базе Yocto отсутствует файл sysctl.conf в директории /etc/, и вы хотите понять, почему это происходит. Давайте разберем возможные причины этого явления, учитывая контекст вашего описания, и предложим решения.

Теория

Yocto – это мощная и гибкая система сборки, используемая для создания кастомизированных Linux-дистрибутивов. Одной из ее особенностей является возможность управления тем, какие файлы и пакеты включаются в финальную сборку. Это достигается с помощью рецептов, которые содержат инструкции для сборки пакетов и их конфигурации.

В вашей ситуации проблема заключается в отсутствии файла sysctl.conf в финальной сборке, хотя он должен быть установлен в /etc/, согласно рецепту procps_3.3.16.bb. Этот файл важен, так как он позволяет конфигурировать параметры ядра Linux в процессе загрузки, например, сетевые настройки или параметры безопасности.

Пример

По вашему описанию, в рецепте procps_3.3.16.bb явно указано, что файл sysctl.conf должен быть установлен в директорию ${sysconfdir}, которая обычно ссылается на /etc/.

Примеры причин, почему файл может быть не установлен, включают:

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

  2. Конфликт версий или зависимости: Возможно, есть конфликт с другой версией пакета или зависимостью, которая блокирует установку sysctl.conf.

  3. Ручное исключение: Файл может быть намеренно исключен из сборки в рамках кастомизированного процесса сборки, который запрещает установку определенных конфигурационных файлов для минимизации размера конечного образа.

Применение

Решение проблемы требует нескольких шагов:

  1. Проверка конфигурации Yocto: Убедитесь, что в конфигурациях сборки (обычно в local.conf или bblayers.conf) нет параметров, которые исключают sysctl.conf или даже весь пакет procps.

  2. Анализ логов сборки: Проверьте логи, созданные в процессе сборки (например, bitbake -e procps), чтобы найти упоминания о sysctl.conf и понять, может ли его установку блокировать другой процесс.

  3. Изучение других зависимостей: Убедитесь, что другие рецепты или пакеты не переписывают или не конфликтуют с содержимым /etc/sysctl.conf.

  4. Ручная установка: Если вышеупомянутые шаги не выявляют проблему, вы можете временно внести изменения вручную. Скопируйте файл sysctl.conf в директорию /etc/ вашей сборки и проверьте, влияет ли это на поведение вашего дистрибутива.

  5. Обновление и отладка: Если проблема продолжает существовать, обновите рецепты и/или попробуйте сбросить кэш сборки. Возможно, более новая версия пакета или рецепта разрешит конфликт.

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

Оцените материал
Добавить комментарий

Капча загружается...