This commit is contained in:
Ciro Santilli
2022-03-10 22:37:51 +00:00
parent a5be602793
commit b43b3b45f3
9 changed files with 171 additions and 73 deletions

View File

@@ -459,29 +459,31 @@ pre{ white-space:pre }
<div class="sect2">
<h3 id="init-environment"><a class="anchor" href="#init-environment"></a><a class="link" href="#init-environment">7.4. Init environment</a></h3>
<div class="paragraph">
<p>Documented at <a href="https://www.kernel.org/doc/html/v4.14/admin-guide/kernel-parameters.html" class="bare">https://www.kernel.org/doc/html/v4.14/admin-guide/kernel-parameters.html</a>:</p>
<p>Documented at <a href="https://www.kernel.org/doc/html/v5.9/admin-guide/kernel-parameters.html" class="bare">https://www.kernel.org/doc/html/v5.9/admin-guide/kernel-parameters.html</a>:</p>
</div>
<div class="quoteblock">
<blockquote>
<div class="paragraph">
<p>The kernel parses parameters from the kernel command line up to "-"; if it doesn&#8217;t recognize a parameter and it doesn&#8217;t contain a '.', the parameter gets passed to init: parameters with '=' go into init&#8217;s environment, others are passed as command line arguments to init. Everything after "-" is passed as an argument to init.</p>
<p>The kernel parses parameters from the kernel command line up to "--"; if it doesn&#8217;t recognize a parameter and it doesn&#8217;t contain a '.', the parameter gets passed to init: parameters with '=' go into init&#8217;s environment, others are passed as command line arguments to init. Everything after "--" is passed as an argument to init.</p>
</div>
</blockquote>
</div>
<div class="paragraph">
<p>And you can try it out with:</p>
<p>And you can try it out with our <a href="https://github.com/cirosantilli/linux-kernel-module-cheat/blob/master/userland/linux/init_env_poweroff.c">userland/linux/init_env_poweroff.c</a> program:</p>
</div>
<div class="literalblock">
<div class="content">
<pre>./run --kernel-cli 'init=/lkmc/linux/init_env_poweroff.out' --kernel-cli-after-dash 'asdf=qwer zxcv'</pre>
<pre>./run --kernel-cli 'init=/lkmc/linux/init_env_poweroff.out loglevel=8 go_in_env=val1 with_dot.before=val2' \
--kernel-cli-after-dash 'go_in_arg=val3 with_dot.after=val4 zxcv'</pre>
</div>
</div>
<div class="paragraph">
<p>From the <a href="dry-run.html">generated QEMU command</a>, we see that the kernel CLI at LKMC 69f5745d3df11d5c741551009df86ea6c61a09cf now contains:</p>
<p>From the <a href="dry-run.html">generated QEMU command</a>, we see that the kernel CLI at LKMC 69f5745d3df11d5c741551009df86ea6c61a09cf now contains (or at least would if it weren&#8217;t for <a href="https://github.com/cirosantilli/linux-kernel-module-cheat/issues/110" class="bare">https://github.com/cirosantilli/linux-kernel-module-cheat/issues/110</a> oh God), manually indented for readability:</p>
</div>
<div class="literalblock">
<div class="content">
<pre>init=/lkmc/linux/init_env_poweroff.out console=ttyS0 - lkmc_home=/lkmc asdf=qwer zxcv</pre>
<pre>&lt;6&gt;[ 0.000000] Command line: root=/dev/vda nopat console_msg_format=syslog nokaslr norandmaps panic=-1 printk.devkmsg=on printk.time=y rw
init=/lkmc/linux/init_env_poweroff.out loglevel=8 go_in_env=val1 with_dot.before=val2 -- go_in_arg=val3 with_dot.after=val4 zxcv</pre>
</div>
</div>
<div class="paragraph">
@@ -489,38 +491,55 @@ pre{ white-space:pre }
</div>
<div class="literalblock">
<div class="content">
<pre>args:
/lkmc/linux/init_env_poweroff.out
-
zxcv
env:
HOME=/
TERM=linux
lkmc_home=/lkmc
asdf=qwer</pre>
<pre>&lt;6&gt;[ 2.728992] Run /lkmc/linux/init_env_poweroff.out as init process
&lt;7&gt;[ 2.729587] with arguments:
&lt;7&gt;[ 2.729820] /lkmc/linux/init_env_poweroff.out
&lt;7&gt;[ 2.730085] lkmc_home=/lkmc
&lt;7&gt;[ 2.730259] go_in_arg=val3
&lt;7&gt;[ 2.730432] with_dot.after=val4
&lt;7&gt;[ 2.730623] zxcv
&lt;7&gt;[ 2.730767] with environment:
&lt;7&gt;[ 2.730960] HOME=/
&lt;7&gt;[ 2.731115] TERM=linux
&lt;7&gt;[ 2.731267] go_in_env=val</pre>
</div>
</div>
<div class="paragraph">
<p>Source: <a href="https://github.com/cirosantilli/linux-kernel-module-cheat/blob/master/userland/linux/init_env_poweroff.c">userland/linux/init_env_poweroff.c</a>.</p>
</div>
<div class="paragraph">
<p>As of the Linux kernel v5.7 (possibly earlier, I&#8217;ve skipped a few releases), boot also shows the init arguments and environment very clearly, which is a great addition:</p>
<p>Tested as of the Linux kernel v5.7 and possibly earlier, boot also shows the init arguments and environment very clearly when using <a href="printk.html">printk</a> at <code>loglevel=8</code>, which is a great addition:</p>
</div>
<div class="literalblock">
<div class="content">
<pre>&lt;6&gt;[ 0.309984] Run /sbin/init as init process
&lt;7&gt;[ 0.309991] with arguments:
&lt;7&gt;[ 0.309997] /sbin/init
&lt;7&gt;[ 0.310004] nokaslr
&lt;7&gt;[ 0.310010] -
&lt;7&gt;[ 0.310016] with environment:
&lt;7&gt;[ 0.310022] HOME=/
&lt;7&gt;[ 0.310028] TERM=linux
&lt;7&gt;[ 0.310035] earlyprintk=pl011,0x1c090000
&lt;7&gt;[ 0.310041] lkmc_home=/lkmc</pre>
<pre>&lt;6&gt;[ 2.777265] Run /lkmc/linux/init_env_poweroff.out as init process
&lt;7&gt;[ 2.777729] with arguments:
&lt;7&gt;[ 2.777953] /lkmc/linux/init_env_poweroff.out
&lt;7&gt;[ 2.778212] lkmc_home=/lkmc
&lt;7&gt;[ 2.778391] go_in_arg=val2
&lt;7&gt;[ 2.778554] zxcv
&lt;7&gt;[ 2.778705] with environment:
&lt;7&gt;[ 2.778901] HOME=/
&lt;7&gt;[ 2.779065] TERM=linux
&lt;7&gt;[ 2.779223] go_in_env=val1</pre>
</div>
</div>
<div class="paragraph">
<p>As we can see, the passing of environment variables to init is a bit wonky:</p>
</div>
<div class="ulist">
<ul>
<li>
<p><code>init</code> and <code>loglevel</code> didn&#8217;t go because they were recognized</p>
</li>
<li>
<p><code>go_in_env</code> went because it wasn&#8217;t</p>
</li>
</ul>
</div>
<div class="paragraph">
<p>so things can always break in future kernel releases&#8230;&#8203; The only way to guard from this a bit is to use some unique prefix and hope the kernel never decides to use it. We of course use <code>lkmc_*</code> for our variables.</p>
</div>
<div class="paragraph">
<p>And it is also impossible to pass environment variables that contain dots in them: our <code>with_dot.before</code> is simply gone. Not a common use case, but still, quite insane.</p>
</div>
<div class="ulist">
<ul>
<li>