Вопрос или проблема
На моей Yocto-базированной дистрибуции Linux я не нахожу файл sysctl.conf
. Доказательством этого является выполнение команды:
> find / -name "sysctl.conf"
которая имеет пустой вывод.
На моей сборочной системе Yocto я могу найти:
- файл
sysctl.conf
по пути:meta/recipes-extended/procps/procps/
- рецепт
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/
.
Примеры причин, почему файл может быть не установлен, включают:
-
Условности сборочной конфигурации: Ваша сборочная конфигурация может исключать установку определенных файлов или пакетов по умолчанию. Это может быть связано с
DISTRO_FEATURES
или другими переменными конфигурации, которые оказывают влияние на то, какие компоненты включаются в сборку. -
Конфликт версий или зависимости: Возможно, есть конфликт с другой версией пакета или зависимостью, которая блокирует установку
sysctl.conf
. -
Ручное исключение: Файл может быть намеренно исключен из сборки в рамках кастомизированного процесса сборки, который запрещает установку определенных конфигурационных файлов для минимизации размера конечного образа.
Применение
Решение проблемы требует нескольких шагов:
-
Проверка конфигурации Yocto: Убедитесь, что в конфигурациях сборки (обычно в
local.conf
илиbblayers.conf
) нет параметров, которые исключаютsysctl.conf
или даже весь пакетprocps
. -
Анализ логов сборки: Проверьте логи, созданные в процессе сборки (например,
bitbake -e procps
), чтобы найти упоминания оsysctl.conf
и понять, может ли его установку блокировать другой процесс. -
Изучение других зависимостей: Убедитесь, что другие рецепты или пакеты не переписывают или не конфликтуют с содержимым
/etc/sysctl.conf
. -
Ручная установка: Если вышеупомянутые шаги не выявляют проблему, вы можете временно внести изменения вручную. Скопируйте файл
sysctl.conf
в директорию/etc/
вашей сборки и проверьте, влияет ли это на поведение вашего дистрибутива. -
Обновление и отладка: Если проблема продолжает существовать, обновите рецепты и/или попробуйте сбросить кэш сборки. Возможно, более новая версия пакета или рецепта разрешит конфликт.
В заключение, решение вашей проблемы с файлом sysctl.conf
связано с тщательным анализом конфигурации сборки Yocto и пониманием, как зависящие пакеты и параметры системы могут влиять на процесс установки. Это типичный пример того, как кастомизация и гибкость системы Yocto могут вносить сложности, но также дают широкие возможности для адаптации системы под конкретные требования.