고쳐 쓰다:

고쳐 쓰다:

고쳐 쓰다:

나는 성공적으로아주 간단한 데모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. 내가 틀렸다면 정정해주세요.

내가 읽고리눅스 커널 문서이 문제에서는. 그것은 말한다:

커널은 커널 명령줄에서 인수를 구문 분석합니다 --. 인수를 인식하지 못하고 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)("초기화 프로세스에 전달"을 검색하십시오.) 그들은 다음과 같이 말합니다:

위의 setter 함수로 허용되지 않는 "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 배포판에서 일반적으로 사용되는 기본값입니다. systemd를 사용하는 경우 single커널 인수를 전달하거나 끝에 전달하여 각각 이러한 모드로 부팅할 수 있습니다.emergency

그러나 이 메커니즘을 사용하여 임의의 인수를 전달하는 것은 커널이 최소한의 구문 분석을 수행하기 때문에 약간 어렵습니다. 이는 특히 다음을 의미합니다.

  • 공백이 있는 인수는 커널이 인용된 문자열을 구문 분석하지 않기 때문에 전혀 전달할 수 없습니다(즉, 'some string'두 인수의 'some합 으로 구문 분석됩니다 string').
  • 커널은 변수 대체를 수행하지 않기 때문에 환경 변수를 전혀 참조할 수 없습니다(이 작업은 일반적으로 명령을 시작하기 전에 명령을 실행하는 셸에서 수행됩니다).
  • 일반적으로 매개변수는 POSIX C 로케일(기본적으로 US ASCII)에서 올바르게 해석될 수 있어야 하며, 이는 base64 또는 퓨니코드와 같은 것을 사용하려는 경우가 아니면 국제화를 창 밖으로 내보냅니다.
  • 커널 매개변수로 전달할 수 있는 데이터의 양에는 상한선이 있는데 그것이 무엇인지 잊어버렸습니다.

이러한 제한 사항이 결합되어 Google에서 해당 작업에 대한 정보를 찾을 수 없으며 올바른 마음을 가진 시스템 통합 엔지니어는 그렇게 할 수 없습니다. 위의 제한 사항을 해결하려면 스크립트를 작성하는 것보다 훨씬 더 많은 노력이 필요하기 때문입니다. 모든 필수 매개변수를 포함하고 호출하세요.

답변2

--커널 매개변수를 초기화 매개변수와 분리하는 데 사용됩니다 ..

커널은 커널 명령줄의 인수를 " --"로 구문 분석합니다. 인수를 인식하지 못하고 "."가 포함되어 있지 않으면 인수가 init에 전달됩니다. "="가 있는 인수는 init 환경으로 이동하고 다른 인수는 전달됩니다. init에 대한 명령줄 인수로. " " --이후의 모든 내용은 매개변수로 init에 전달됩니다.

관련 정보