что делает "make oldconfig" именно в make-файле ядра linux?

<p>кто-нибудь может объяснить, что делает цель "oldconfig" именно в make-файле ядра linux? я вижу, что это упоминается в какой-то сборочной документации, но никогда не объяснял, что именно он делает.</p>

<p>он читает существующий файл <code>.config</code> и запрашивает у пользователя параметры в текущем исходном коде ядра, которые не найдены в файле. это полезно, когда вы берете существующую конфигурацию и переносите ее в новое ядро.</p>

<p>перед запуском 'make oldconfig' вам необходимо скопировать файл конфигурации ядра из старого ядра в корневой каталог нового ядра.</p><p>вы можете найти копию старого файла конфигурации ядра в работающей системе по адресу <code>/boot/config-3.11.0</code>. кроме того, исходный код ядра имеет конфиги в <code>linux-3.11.0/arch/x86/configs/{i386\_defconfig / x86\_64\_defconfig}</code></p><p>если исходный код вашего ядра находится в/usr/src/linux</p><pre><code>cd /usr/src/linux cp /boot/config-3.9.6-gentoo .config make oldconfig </code></pre>

<p><strong>резюме</strong></p><p>как уже упоминалось <a href="https://stackoverflow.com/a/4178568/895245">ignacio</a> , он обновляет ваш <code>.config</code> для вас после обновления исходного кода ядра, например, с <code>git pull</code>.</p><p>он пытается сохранить ваши существующие параметры.</p><p>наличие сценария для этого полезно, потому что:</p><ul> <li><p>возможно, были добавлены новые опции или удалены старые</p></li> <li><p>формат конфигурации ядра kconfig имеет следующие параметры:</p> <ul> <li>подразумевать друг друга через <code>select</code></li> <li>зависеть от другого через <code>depends</code></li> </ul> <p>эти отношения параметров делают разрешение конфигурации вручную еще сложнее. </p></li> </ul><p><strong>давайте изменим .config вручную, чтобы понять, как он разрешает конфигурации</strong></p><p>сначала создайте конфигурацию по умолчанию с помощью:</p><pre><code>make defconfig </code></pre><p>теперь отредактируйте сгенерированный файл <code>.config</code> вручную, чтобы эмулировать обновление ядра, и запустите:</p><pre><code>make oldconfig </code></pre><p>чтобы увидеть, что происходит. некоторые выводы:</p><ol> <li><p>линии типа:</p> <pre><code># config\_xxx is not set </code></pre> <p>не просто комментарии, но фактически указывают, что параметр не установлен.</p> <p>например, если мы удалим строку:</p> <pre><code># config\_debug\_info is not set </code></pre> <p>и запустите <code>make oldconfig</code>, он спросит нас:</p> <pre><code>compile the kernel with debug info (debug\_info) [n/y/?] (new) </code></pre> <p>когда он закончится, файл <code>.config</code> будет обновлен.</p> <p>если вы измените любой символ строки, например, в <code># config\_debug\_info</code>, это не считается.</p></li> <li><p>линии типа:</p> <pre><code># config\_xxx is not set </code></pre> <p>всегда используются для отрицания свойства, хотя:</p> <pre><code>config\_xxx=n </code></pre> <p>также понимается как отрицание.</p> <p>например, если вы удалите <code># config\_debug\_info is not set</code> и ответите:</p> <pre><code>compile the kernel with debug info (debug\_info) [n/y/?] (new) </code></pre> <p>с <code>n</code>, то выходной файл содержит:</p> <pre><code># config\_debug\_info is not set </code></pre> <p>и не:</p> <pre><code>config\_debug\_info=n </code></pre> <p>также, если мы вручную изменим строку на:</p> <pre><code>config\_debug\_info=n </code></pre> <p>и запустите <code>make oldconfig</code>, тогда строка будет изменена на:</p> <pre><code># config\_debug\_info is not set </code></pre> <p>без <code>oldconfig</code> не спрашивая нас.</p></li> <li><p>конфиги, чьи зависимости не встречаются, не отображаются в <code>.config</code>. все остальные делают.</p> <p>например, установите:</p> <pre><code>config\_debug\_info=y </code></pre> <p>и запустите <code>make oldconfig</code>. теперь он запросит у нас: <code>debug\_info\_reduced</code>, <code>debug\_info\_split</code> и т.д. config.</p> <p>эти свойства не отображались в <code>defconfig</code> ранее.</p> <p>если мы посмотрим под <code>lib/kconfig.debug</code>, где они определены, мы увидим, что они зависят от <code>debug\_info</code>:</p> <pre><code>config debug\_info\_reduced bool "reduce debugging information" depends on debug\_info </code></pre> <p>поэтому, когда <code>debug\_info</code> был выключен, они вообще не появлялись.</p></li> <li><p>конфигурации, которые являются <code>selected</code> включенными конфигами, автоматически устанавливаются без запроса пользователя.</p> <p>например, если <code>config\_x86=y</code> и мы удалим строку:</p> <pre><code>config\_arch\_might\_have\_pc\_parport=y </code></pre> <p>и запустите <code>make oldconfig</code>, строка будет воссоздана без запроса, в отличие от <code>debug\_info</code>.</p> <p>это происходит потому, что <code>arch/x86/kconfig</code> содержит:</p> <pre><code>config x86 def\_bool y [...] select arch\_might\_have\_pc\_parport </code></pre> <p>и выберите силы, чтобы эта опция была истинной. смотрите также: <a href="https://unix.stackexchange.com/questions/117521/select-vs-depends-in-kernel-kconfig">https://unix.stackexchange.com/questions/117521/select-vs-depends-in-kernel-kconfig</a> </p></li> <li><p>запрашиваются конфиги, ограничения которых не соблюдаются.</p> <p>например, <code>defconfig</code> установил:</p> <pre><code>config\_64bit=y config\_rcu\_fanout=64 </code></pre> <p>если мы редактируем:</p> <pre><code>config\_64bit=n </code></pre> <p>и запустите <code>make oldconfig</code>, он спросит нас:</p> <pre><code>tree-based hierarchical rcu fanout value (rcu\_fanout) [32] (new) </code></pre> <p>это потому, что <code>rcu\_fanout</code> определяется в <code>init/kconfig</code> как:</p> <pre><code>config rcu\_fanout int "tree-based hierarchical rcu fanout value" range 2 64 if 64bit range 2 32 if !64bit </code></pre> <p>следовательно, без <code>64bit</code> максимальное значение <code>32</code>, но у нас было установлено <code>64</code> для <code>.config</code>, что делало его несовместимым.</p></li> </ol><p><strong>бонусы</strong></p><p><code>make olddefconfig</code> устанавливает для каждой опции значение по умолчанию без интерактивного запроса. он запускается автоматически на <code>make</code>, чтобы гарантировать, что <code>.config</code> согласован, если вы изменили его вручную, как мы. смотрите также: <a href="https://serverfault.com/questions/116299/automatically-answer-defaults-when-doing-make-oldconfig-on-a-kernel-tree">https://serverfault.com/questions/116299/automatics-answer-defaults-when-doing-make-oldconfig-on-a-kernel-tree</a> </p><p><code>make alldefconfig</code> похож на <code>make olddefconfig</code>, но он также принимает фрагмент конфигурации для слияния. эта цель используется сценарием <code>merge\_config.sh</code>: <a href="https://stackoverflow.com/a/39440863/895245">https://stackoverflow.com/a/39440863/895245</a> </p><p>и если вы хотите автоматизировать модификацию <code>.config</code>, это не так просто: <a href="https://stackoverflow.com/questions/7505164/how-do-you-non-interactively-turn-on-features-in-a-linux-kernel-config-file">как неинтерактивно включить функции в файле .config ядра linux?</a> </p>

<p>обновляет старую конфигурацию с новыми/измененными/удаленными параметрами.</p>

<p>с этой <a href="http://lists.kernelnewbies.org/pipermail/kernelnewbies/2011-august/003089.html">страницы</a> : </p><blockquote> <p>make oldconfig берет .config и запускает его по правилам kconfig файлы и создает .config, который соответствует kconfig правила. если есть значения config, которые отсутствуют, make oldconfig попросит их. </p> <p>если .config уже соответствует правилам, найденным в kconfig, тогда make oldconfig по сути не работает.</p> <p>если вам нужно запустить make oldconfig, а затем запустить make oldconfig второй раз, второй раз не приведет к дополнительным изменениям сделал.</p> </blockquote>

<p>это пытка вместо того, чтобы включать общий файл conf, они заставляют вас нажимать return 9000 раз, чтобы сгенерировать один.</p>