운영체제 기본/Linux/x86-64/BIOS 부팅/루트 파일시스템과 init 선택: 두 판 사이의 차이
문장형 절 제목을 직관적인 명사형으로 통일하고 기존 절 링크 보존 |
변경된 절 제목으로 내부 역링크 갱신 |
||
| 6번째 줄: | 6번째 줄: | ||
<span id="init을_실행하려면_먼저_그_파일이_있어야_한다"></span> | <span id="init을_실행하려면_먼저_그_파일이_있어야_한다"></span> | ||
== init 실행을 위한 루트 파일시스템 준비 == | == init 실행을 위한 루트 파일시스템 준비 == | ||
실행 파일을 열려면 경로 탐색을 시작할 루트 파일시스템이 필요하다. VFS는 루트에서 각 디렉터리 이름을 해석해 inode를 찾고 파일 연산에 연결한다. 경로와 마운트, 열린 파일 객체의 관계는 [[운영체제 기본/Linux의 파일시스템/VFS와 파일 객체# | 실행 파일을 열려면 경로 탐색을 시작할 루트 파일시스템이 필요하다. VFS는 루트에서 각 디렉터리 이름을 해석해 inode를 찾고 파일 연산에 연결한다. 경로와 마운트, 열린 파일 객체의 관계는 [[운영체제 기본/Linux의 파일시스템/VFS와 파일 객체#경로 탐색과 파일 객체|VFS와 파일 객체]]를 참고한다. 초기에는 rootfs가 있고, initramfs 아카이브의 파일들이 여기에 풀린다. <code>init/initramfs.c</code>의 <code>populate_rootfs()</code>는 비동기 작업을 등록하며, 그 작업이 내장 아카이브와 조건에 따라 외부 이미지를 푼다. <code>wait_for_initramfs()</code>는 이 작업이 끝나기 전에 init 파일에 접근하는 일을 막는다.<ref name="ramfs">[https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/init/initramfs.c?h=v6.12 v6.12 init/initramfs.c], populate_rootfs, do_populate_rootfs, wait_for_initramfs.</ref> | ||
초기 rootfs의 실행 후보(기본 <code>/init</code>)가 실행 접근 사전 검사를 통과하면 루트 장치를 찾고 마운트하는 처리를 초기 사용자 공간에 맡기는 경로로 간다. 이 검사에 실패하면 커널의 <code>prepare_namespace()</code> 경로가 장치 탐색을 기다리고 루트 장치를 해석해 마운트한다. 어느 경로를 택했는지에 따라 이후 실행 파일을 찾는 루트도 달라진다.<ref name="main">[https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/init/main.c?h=v6.12 v6.12 init/main.c], kernel_init_freeable, kernel_init.</ref><ref>[https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/init/do_mounts.c?h=v6.12 v6.12 init/do_mounts.c], prepare_namespace.</ref> | 초기 rootfs의 실행 후보(기본 <code>/init</code>)가 실행 접근 사전 검사를 통과하면 루트 장치를 찾고 마운트하는 처리를 초기 사용자 공간에 맡기는 경로로 간다. 이 검사에 실패하면 커널의 <code>prepare_namespace()</code> 경로가 장치 탐색을 기다리고 루트 장치를 해석해 마운트한다. 어느 경로를 택했는지에 따라 이후 실행 파일을 찾는 루트도 달라진다.<ref name="main">[https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/init/main.c?h=v6.12 v6.12 init/main.c], kernel_init_freeable, kernel_init.</ref><ref>[https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/init/do_mounts.c?h=v6.12 v6.12 init/do_mounts.c], prepare_namespace.</ref> | ||