В моей дистрибутивной сборке Linux на базе Yocto файл sysctl.conf не установлен рецептом procps.

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

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

> find / -name "sysctl.conf"

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

На моей системе сборки Yocto (я использую релиз zeus) я могу найти:

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

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

SUMMARY = "Системные и процессные утилиты мониторинга"
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"

# Upstream имеет пользовательский autogen.sh, который вызывает po/update-potfiles, так как
# они не предоставляют po/POTFILES.in (что глупо). Без этого файла gettext
# не считает po/ директорию gettext и не будет генерировать po/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 в путь /etc файловой системы образа, созданного bitbake.

Более того, вывод выполнения команды bitbake procps сохраняется в папке сборки procps и в этом выводе, файл /etc/sysctl.conf находится в обоих подкаталогах image и package.
Таким образом, кажется, что файл правильно подготовлен для развертывания в окончательный образ, но развертывание не выполнено.

На моей системе используется systemd-sysctl

По этой ссылке я нашел следующую фразу:

Эта страница руководства описывает конфигурационные файлы для procps sysctl.
Если вы используете systemd-sysctl(8), обратитесь к sysctl.d(5) и обратите внимание,
что он не будет использовать файл /etc/sysctl.conf.

Это означает, что /etc/sysctl.conf не используется на моей системе.

Ссылки по той же теме

  1. Очень полезна эта ссылка, которая говорит о том же аргументе, но в случае, когда файл sysctl.conf развертывается и, следовательно, присутствует в файловой системе Yocto.

  2. Моя точная проблема найдена в этой другой ссылке, но я попробовал следовать всем предложенным в ней рекомендациям безуспешно.

  3. Эта другая ссылка посвящена рецепту pocps_3.3.16.bb.

Вопрос

С учетом вышеописанной конфигурации, почему файл sysctl.conf не развертывается в папку /etc/ в файловой системе yocto образа?

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

В процессе работы с Yocto, специфически с рецептом procps, вы обнаружили, что файл sysctl.conf отсутствует в конечной файловой системе вашей сборки. Однако, при анализе сборки и сценария установки видно, что файл sysctl.conf должен быть развернут в директорию /etc на создаваемом образе. Давайте разберем подробнее и попытаемся выявить возможные причины этой проблемы, основываясь на предоставленной информации.

Теория (Theory)

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

  2. Система инициализации: Переход на использование systemd вместо классических систем инициализации может повлиять на логику работы с конфигурационными файлами, такими как sysctl.conf. В документации в man-страницах упоминается, что при использовании systemd-sysctl, директория /etc/sysctl.d/ используется для конфигурации вместо /etc/sysctl.conf.

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

Пример (Example)

Фактически файл sysctl.conf присутствует в рабочем директории при сборке, а также в каталоге image и package в выводе процесса сборки Bitbake. Это указывает на то, что скрипты установки отработали корректно и подготовили файл для развертывания.

Применение (Application)

Исходя из вышесказанного, вам стоит предпринять следующие действия для выявления и решения проблемы:

  1. Проверьте использование systemd:

    • Убедитесь, что в вашей системе для управления параметрами ядра используется systemd-sysctl. Если это так, убедитесь, что .conf файлы находятся в sysctl.d/ и настроены правильно.
    • В вашем рецепте уже закладывается создание символьной ссылки в sysctl.d. Перепроверьте, работает ли она должным образом и не возникает ли ошибок на этом этапе.
  2. Проверьте конфигурации сборки:

    • Иногда проблема может быть связана с вашим MANGLED_SYSCONFDIR или другими переменными окружения, которые могут мешать правильной установке файлов.
    • Убедитесь, что все пути до файлов соответствуют вашим конфигурациям в local.conf или других файлах конфигурации сборки.
  3. Проверка вывода и журналов Bitbake:

    • Проанализируйте выводы Bitbake более детально. Может быть, команды установки не выполняются корректно или игнорируются из-за каких-то условий.
  4. Изменение или уточнение конфигурации Yocto:

    • Проверьте, не перекрывает ли какая-то другая конфигурация или рецепт ваше назначение файла.
    • Возможно, стоит уточнить, не изменяют ли другие слои или конфигурации ваше поведение сборки.
  5. Тестирование развертывания вручную:

    • Попробуйте переместить sysctl.conf на целевой образ вручную и проверьте, будет ли он функционировать в ожидаемой манере. Если будет, попробуйте выяснить, что мешает автоматическому процессу.
  6. Обновления и баги:

    • Проверьте наличие известных багов или обсуждений в сообществе Yocto, которые могут касаться вашей ситуации, и убедитесь, что используемая вами версия рецепта актуальна и не содержит известных проблем.
  7. Дополнение документацией или поддержкой сообщества:

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

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

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

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