Вопрос или проблема
На моей Linux-распределении на основе Yocto я не нахожу файл sysctl.conf
. Доказательство этого — выполнение команды:
> find / -name "sysctl.conf"
которая дает пустой вывод.
На моей системе сборки Yocto (я использую релиз zeus
) я могу найти:
- файл
sysctl.conf
по пути:meta/recipes-extended/procps/procps/
- рецепт
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
не используется на моей системе.
Ссылки по той же теме
-
Очень полезна эта ссылка, которая говорит о том же аргументе, но в случае, когда файл
sysctl.conf
развертывается и, следовательно, присутствует в файловой системе Yocto. -
Моя точная проблема найдена в этой другой ссылке, но я попробовал следовать всем предложенным в ней рекомендациям безуспешно.
-
Эта другая ссылка посвящена рецепту
pocps_3.3.16.bb
.
Вопрос
С учетом вышеописанной конфигурации, почему файл sysctl.conf
не развертывается в папку /etc/
в файловой системе yocto образа?
Ответ или решение
В процессе работы с Yocto, специфически с рецептом procps
, вы обнаружили, что файл sysctl.conf
отсутствует в конечной файловой системе вашей сборки. Однако, при анализе сборки и сценария установки видно, что файл sysctl.conf
должен быть развернут в директорию /etc
на создаваемом образе. Давайте разберем подробнее и попытаемся выявить возможные причины этой проблемы, основываясь на предоставленной информации.
Теория (Theory)
-
Сценарий установки: В предоставленном рецепте
procps_3.3.16.bb
ясно указано, чтоsysctl.conf
должен устанавливаться в${sysconfdir}/sysctl.conf
, что обычно соответствует/etc/sysctl.conf
. Строка в задачеdo_install_append()
подразумевает копирование файлаsysctl.conf
из рабочей директории сборки в целевую директорию на образе. -
Система инициализации: Переход на использование
systemd
вместо классических систем инициализации может повлиять на логику работы с конфигурационными файлами, такими какsysctl.conf
. В документации в man-страницах упоминается, что при использованииsystemd-sysctl
, директория/etc/sysctl.d/
используется для конфигурации вместо/etc/sysctl.conf
. -
Зависимость окружения сборки: Хотя ваш файл должен размещаться в образе, разные настройки и факторы, такие как ошибки конфигурации или специфичные в настройках дистрибутивов Yocto, могут повлиять на это.
Пример (Example)
Фактически файл sysctl.conf
присутствует в рабочем директории при сборке, а также в каталоге image
и package
в выводе процесса сборки Bitbake. Это указывает на то, что скрипты установки отработали корректно и подготовили файл для развертывания.
Применение (Application)
Исходя из вышесказанного, вам стоит предпринять следующие действия для выявления и решения проблемы:
-
Проверьте использование
systemd
:- Убедитесь, что в вашей системе для управления параметрами ядра используется
systemd-sysctl
. Если это так, убедитесь, что.conf
файлы находятся вsysctl.d/
и настроены правильно. - В вашем рецепте уже закладывается создание символьной ссылки в
sysctl.d
. Перепроверьте, работает ли она должным образом и не возникает ли ошибок на этом этапе.
- Убедитесь, что в вашей системе для управления параметрами ядра используется
-
Проверьте конфигурации сборки:
- Иногда проблема может быть связана с вашим MANGLED_SYSCONFDIR или другими переменными окружения, которые могут мешать правильной установке файлов.
- Убедитесь, что все пути до файлов соответствуют вашим конфигурациям в
local.conf
или других файлах конфигурации сборки.
-
Проверка вывода и журналов Bitbake:
- Проанализируйте выводы Bitbake более детально. Может быть, команды установки не выполняются корректно или игнорируются из-за каких-то условий.
-
Изменение или уточнение конфигурации Yocto:
- Проверьте, не перекрывает ли какая-то другая конфигурация или рецепт ваше назначение файла.
- Возможно, стоит уточнить, не изменяют ли другие слои или конфигурации ваше поведение сборки.
-
Тестирование развертывания вручную:
- Попробуйте переместить
sysctl.conf
на целевой образ вручную и проверьте, будет ли он функционировать в ожидаемой манере. Если будет, попробуйте выяснить, что мешает автоматическому процессу.
- Попробуйте переместить
-
Обновления и баги:
- Проверьте наличие известных багов или обсуждений в сообществе Yocto, которые могут касаться вашей ситуации, и убедитесь, что используемая вами версия рецепта актуальна и не содержит известных проблем.
-
Дополнение документацией или поддержкой сообщества:
- Если решения не достигаются, попробуйте обратиться за помощью в комьюнити или на форуме Yocto, предоставляя всю собранную вами информацию и производя детальное описание вашей проблемы.
В результате детального анализа и внедрения предложенных шагов у вас появится больше понимания о том, почему sysctl.conf
не попадает в целевой образ, что поможет в дальнейшем корректировать и управлять процессом сборки Yocto под ваши нужды.