修正する:

修正する:

修正する:

私は正常に非常に簡単なデモinit=標準initの代わりにカスタムバイナリ(golangで作成およびコンパイル)を使用するように指定するには、bootparamを使用します。このプロジェクトのバイナリはRaspberry PiのARMプロセッサ用にコンパイルされますが、ソースコードはすべてのプラットフォーム用にコンパイルする必要があります。


元の投稿:

私は正常にinit=/bin/bash起動パラメータ起動時にルートシェルを取得します。ここで、bootparamsを使用して「最初の起動」設定スクリプトを実行したいと思います。

メモ:

私は多くの選択肢があることを知っています。必要に応じて、質問に対するコメントとしてこれを含めてください。しかし、私はそれを使用することはできません。この質問はこの質問に対する答えではありません。だから、答えで代替案を投稿しないでください.* この質問に来た人には役に立ちません。

私が試したが失敗したもの:

  • init="/bin/bash -c 'mount /dev/mmcblk0p1 /boot; date > /boot/test.txt'"
  • init='/bin/bash -c "mount /dev/mmcblk0p1 /boot; date > /boot/test.txt"'
  • init="/bin/bash"
  • init='/bin/bash'

init=したがって、パラメータを引用しても選択肢ではないと仮定します。

  1. 間違っていたら訂正してください。

私が読んでLinuxカーネルドキュメントこの問題では。それは言う:

カーネルはカーネルコマンドラインから引数を解析します--。引数が認識されず、aが含まれていない場合、.引数はinitに渡されます。引数は=initの環境に入り、他の引数はコマンドライン引数としてinitに渡されます。それ以降の内容はすべて--initにパラメータとして渡されます。

...

init=    [KNL]
         Format: <full_path>
         Run specified binary instead of /sbin/init as init
         process.

学んだ内容:

Format: <full_path>完全なコマンドを入力すると、なぜ気に入らないのかが説明されます。init=

私も読んだ起動パラメータ(7)(「初期化プロセスに渡す」を検索してください。)彼らは次のように言います:

上記のセッター関数で許可されていない「foo = bar」形式のすべての項目は、設定する環境変数として解釈されます。 (無駄ですか?)例は、「TERM = vt100」をブートパラメータとして使用することです。

カーネルによって選択されず、環境変数として解釈されない残りの引数は通常、init(1)プログラムであるPID 1に渡されます。 initプロセスに渡される最も一般的なパラメータは「single」という単語で、すべての一般的なデーモンを起動するのではなく、シングルユーザーモードでコンピュータを起動するように指示します。どのパラメータを受け入れるかについては、システムにインストールされているinit(1)バージョンのマニュアルページを確認してください。

  1. カスタム仕様に引数を渡すためにこの情報を使用する作業例はありますかinit=

ある場合は検索が難しく、この質問によりGoogleの検索結果に表示されます。そうでない場合は、コミュニティのための実際のケースを作成します。

ベストアンサー1

はい、これは通常の初期化でシステムを起動する状態を伝える伝統的な方法です。 sysv-init(またはsystemdを除いて広く使用されているほとんどすべてのinitシステム)を実行している場合、カーネル引数の末尾に1から5の数字を入力すると、対応するランレベルで起動します(1は常にシングルユーザーモードです。定義で、3 または 4 は、ほとんどの Linux ディストリビューションで一般的に使用されるデフォルト値ですsingleemergency

ただし、このメカニズムを使用して任意の引数を渡すことは、カーネルが最小限の解析を実行するため、少し難しいです。これは特に次のことを意味します。

  • 空白の引数は、カーネルが引用符付き文字列を解析しないため、まったく渡すことはできません(つまり、'some string'2つの引数の'some合計として解析されますstring')。
  • カーネルは変数置換を行わないため、環境変数をまったく参照できません(これは通常、コマンドを開始する前にコマンドを実行するシェルで実行されます)。
  • 通常、パラメータはPOSIX Cロケール(デフォルトではUS ASCII)で正しく解釈できなければなりません。これは、base64やフューニコードなどを使用したい場合を除き、国際化をウィンドウからエクスポートします。
  • カーネルパラメータとして渡すことができるデータの量には上限があり、それが何であるかを忘れていました。

これらの制限が組み合わされているため、Google はそのタスクに関する情報を見つけることができず、正しい心を持つシステム統合エンジニアはそうすることはできません。上記の制限を解決するには、スクリプトを書くよりもはるかに多くの努力が必要です。すべての必須パラメータを含めて呼び出します。

おすすめ記事