누군가 아래에서 무슨 일이 일어나고 있는지 설명해 줄 수 있습니까?
# This is a very simple, default initramfs
dir /dev 0755 0 0
nod /dev/console 0600 0 0 c 5 1
nod /dev/tty 0666 0 0 c 5 0
nod /dev/null 0600 0 0 c 1 3
nod /dev/mem 0600 0 0 c 1 1
nod /dev/kmem 0600 0 0 c 1 2
nod /dev/zero 0600 0 0 c 1 5
nod /dev/random 0600 0 0 c 1 8
nod /dev/urandom 0600 0 0 c 1 9
dir /dev/pts 0755 0 0
nod /dev/ptmx 0666 0 0 c 5 2
nod /dev/ttyS0 0666 0 0 c 4 64
nod /dev/ttyS1 0666 0 0 c 4 65
nod /dev/ttyS2 0666 0 0 c 4 66
dir /bin 755 0 0
dir /proc 755 0 0
file /bin/hello ${INSTALL_ROOT}/projects/${SAMPLE}/hello/hello 755 0 0
slink /bin/init hello 777 0 0
여기서 우리가 실제로 달성하려는 것은 무엇입니까?
이는 다음과 유사합니다.이것
일반적으로 우리는 init(코드의 마지막 줄)에서 (hello)를 실행하려고 한다는 것이 분명합니다.
답변1
이 파일은 커널 소스 트리의 gen_init_cpio 프로그램에 대한 입력 파일입니다.
다음에 적합한 cpio 아카이브를 생성합니다.파일 시스템 초기화파일/디렉토리/장치(=노드)/...입력 파일에 나열됩니다.
구문은 다음과 같습니다
file <name> <location> <mode> <uid> <gid> [<hard links>]
dir <name> <mode> <uid> <gid>\n
nod <name> <mode> <uid> <gid> <dev_type> <maj> <min>
slink <name> <target> <mode> <uid> <gid>
등.
init
시작 시 실제로 실행되는 프로그램은 initramfs의 프로그램 에 따라 다릅니다 . 이곳의 프로그램 init
은심볼릭 링크도착하다 hello
.
답변2
@jofel은 이 질문에 놀랄 만큼 정확하게 대답했습니다. 하지만 구현해야 할 것은 커널 공간에서 사용자 공간으로의 전환입니다. 커널이 로드되면 모든 시스템이 실행될 수 있는지 확인한 다음 부팅하지 init.
않으면 부팅할 시스템을 찾습니다 init
. 즉, 시스템과 상호 작용할 수 없게 됩니다.
몇 년 전, 커널 개발자는 1001 및 다양한 루트 장치 구성을 지원하는 데 지쳤다고 결정했습니다. 가능한 루트 파일 시스템과 루트 장치 유형 조합의 수가 너무 많아서 컴퓨터 부팅 처리가 너무 복잡해졌습니다. 그래서 그들은 노력을 포기했습니다.
Initramfs
2.6 이후 모든 Linux 커널에 내장되었습니다. 모든 경우에 그 시점부터 사용자 공간은 거기에서 시작됩니다. 커널은 컴퓨터 시스템의 제어권을 넘겨받은 다음 init
가만히 앉아서 불꽃놀이를 지켜보고 전체 사건을 무시합니다.
귀하의 질문에 있는 파일에 설명된 디렉터리 트리는 커널 자체의 Linux 루트 디렉터리로 컴파일됩니다. 커널이 다른 모든 것을 찾기 위해 애쓰는 유일한 루트 장치입니다.init.