Linux 부팅 프로세스
Linux startup process![]() |
Linux 시작 프로세스는 Linux 설치 부팅 중에 수행되는 다단계 초기화 프로세스입니다.BSD 및 그 외의 Unix 스타일의 부트 프로세스와 많은 점에서 유사합니다.
Linux 설치 부팅에는 펌웨어 초기화, 부트 로더 실행, Linux 커널 이미지 로드 및 시작, 다양한 시작 스크립트 및 데몬 실행 등 여러 단계와 소프트웨어 컴포넌트가 포함됩니다.이러한 스테이지와 컴포넌트에는 각각 다른 종류와 접근법이 있습니다.예를 들어 GRUB, coreboot 또는 Das U-Boot은 부트 로더(이력 예로는 LILOU, SYSLINUX 또는 Loadlin)로 사용할 수 있습니다.기동 스크립트는 기존의 init 스타일 또는 최신 대체 방법으로 실행할 수 있습니다.uch as systemd 또는 Upstart.
개요
Linux 시작 프로세스의 초기 단계는 컴퓨터 아키텍처에 따라 크게 달라집니다.IBM PC 호환 하드웨어는 Linux가 일반적으로 사용되는 아키텍처 중 하나입니다. 이러한 시스템에서 BIOS는 중요한 역할을 수행하며, 다른 시스템에서는 정확한 아날로그가 없을 수 있습니다.다음 예제에서는 IBM PC 호환 하드웨어를 가정합니다.
- BIOS는 실제 하드웨어 플랫폼 고유의 전원 투입 시 자가 테스트와 같은 시작 태스크를 수행합니다.하드웨어가 열거되고 부팅에 필요한 하드웨어가 올바르게 초기화되면 BIOS는 구성된 부팅 디바이스에서 부팅 코드를 로드하고 실행합니다.
- 부트 로더는 종종 사용자에게 사용 가능한 부트 옵션 메뉴를 제공하며 시간이 지나면 기본 옵션이 선택됩니다.선택이 완료되면 부트 로더는 커널을 메모리에 로드하고 몇 가지 파라미터를 제공하여 제어를 부여합니다.
- 커널은 압축되어 있으면 자동으로 압축 해제됩니다.그런 다음 필수 하드웨어 및 메모리 페이징, 콜 등의 시스템 기능을 셋업합니다.
start_kernel()
대부분의 시스템 셋업(인터럽트, 나머지 메모리 관리, 디바이스 및 드라이버 초기화 등)을 수행합니다.다음으로 아이돌프로세스, 스케줄러 및 init프로세스를 개별적으로 기동합니다.이 프로세스는 사용자 공간에서 실행됩니다. - init은 셸(sysv, bsd, runit)에 의해 실행되는 스크립트 또는 바이너리컴포넌트(systemd, upstart)에 의해 실행되는 컨피규레이션파일로 구성됩니다.Init에는 특정 레벨(sysv, bsd) 또는 타겟(systemd)이 있으며 각각 특정 서비스 세트(데몬)로 구성됩니다.이들은 운영체제 이외의 다양한 서비스와 구조를 제공하며 사용자 환경을 형성합니다.일반적인 서버 환경에서는 웹 서버, 데이터베이스 서비스 및 네트워킹이 시작됩니다.
- 일반적인 데스크톱 환경은 기본 그래픽 스택을 제공하는 그래픽 서버와 자격 정보를 입력하고 세션을 선택하는 기능을 제공하는 로그인 매니저로 구성된 그래픽 환경을 시작하는 디스플레이 매니저라고 불리는 데몬에서 시작됩니다.사용자가 올바른 credential을 입력하면 세션 매니저가 세션을 시작합니다.세션은 UI 요소(패널, 데스크톱, 애플릿 등)와 같은 프로그램의 집합으로, 함께 완전한 데스크톱 환경을 구성할 수 있습니다.
셧다운 시 init을 호출하여 제어된 방법으로 모든 사용자 공간 기능을 셧다운합니다.다른 모든 프로세스가 종료되면 init은 커널에 시스템콜을 발신하여 시스템을 셧다운하도록 지시합니다.
부트 로더 단계
부트로더 단계는 컴퓨터 아키텍처에 따라 달라집니다.이전 단계는 운영 체제에 고유하지 않기 때문에 x86 및 x86-64 아키텍처의 BIOS 기반 부트 프로세스는 마스터 부트 레코드(MBR) 코드가 실제 모드로 실행되고 1단계 부트 로더가 로드될 때 시작하는 것으로 간주됩니다.UEFI 시스템에서 Linux 커널은 EFISTUB를 [1]통해 UEFI 펌웨어에 의해 직접 실행될 수 있지만 일반적으로 GRUB 2 또는 systemd-boot을 부트 로더로 사용합니다.다음으로 일반적인 부트 로더의 개요를 나타냅니다.
- GRUB 2는 GRUB 1과 달리 다양한 운영체제 자동검출 및 자동설정이 가능합니다.Stage1은 BIOS에 의해 마스터 부트 레코드(MBR)에서 로드되어 실행됩니다.중간 스테이지 로더(1.5 스테이지, 보통 core.img)는 스테이지 1 로더에 의해 로드되고 실행됩니다.2단계 로더(2단계, /boot/grub/files)는 1.5단계에 의해 로드되며 사용자가 운영 체제를 선택하거나 시작 파라미터를 검사 및 편집할 수 있는 GRUB 시작 메뉴를 표시합니다.메뉴 엔트리가 선택되고 옵션 파라미터가 지정되면 GRUB는 Linux 커널을 메모리에 로드하여 제어를 전달합니다.GRUB 2는 다른 부트로더의 체인 로딩도 가능합니다.UEFI 시스템에서 stage1과 stage1.5는 보통 동일한 UEFI 응용 프로그램 파일입니다(x64 UEFI 시스템의 grubx64.efi 등).
- systemd-boot(이전의 Gummiboot)는 최소한의 구성이 필요한 systemd에 포함된 부트 로더입니다(UEFI 시스템에 한함).
- SYSLINUX/ISOLINUX는 FAT 파일 시스템에서 Linux 전체 설치를 부팅하는 데 특화된 부트 로더입니다.부팅 또는 복구 플로피 디스크, 라이브 USB 및 기타 경량 부팅 시스템에 자주 사용됩니다.ISSOLINUX는 일반적으로 Linux 라이브 CD 및 부터블 설치 CD에서 사용됩니다.
- UEFI 시스템용 부트 매니저인rEFInd.
- coreboot은 UEFI 또는 BIOS를 무료로 구현하여 보통 메인보드와 함께 도입하고 필요에 따라 벤더가 제공하는 현장 업그레이드입니다.코어 부트의 일부는 시스템 BIOS가 되어, 기동 후에도 메모리에 보존됩니다.
- Das U-Boot는 임베디드 시스템용 부트 로더입니다.이것은 BIOS/UEFI가 없는 시스템에서 사용되며, 오히려 부트 로더를 메모리로 읽어내어 실행하는 커스텀 방식을 채택하고 있습니다.
더 이상 일반적으로 사용되지 않는 과거의 부트 로더는 다음과 같습니다.
- LILO는 파일 시스템 레이아웃을 이해하거나 해석하지 않습니다.대신 컨피규레이션파일(
/etc/lilo.conf
)는 커널 및 RAM 디스크(initrd 또는 initramfs)의 위치에 대한 원시 오프셋 정보(매퍼 도구)를 매핑하는 라이브 시스템에서 생성됩니다.각 부트 파티션 및 커널 경로 이름 등의 데이터와 필요에 따라 커스터마이즈된 옵션이 포함된 컨피규레이션파일은 부트 로더 코드와 함께 MBR 부트 섹터에 기록됩니다.이 부트 섹터를 읽고 BIOS에서 제어하면 LILO는 메뉴 코드를 로드하고 저장된 값을 사용자 입력과 함께 사용하여 Linux 커널을 계산 및 로드하거나 다른 부트 로더를 체인 로드합니다. - GRUB 1에는 컨피규레이션파일에 [2]액세스 하기 위해서 런타임에 공통의 파일 시스템을 읽어내는 논리가 포함되어 있습니다.이를 통해 GRUB 1은 MBR에 내장되지 않고 파일 시스템에서 구성 파일을 읽을 수 있습니다.이를 통해 실행 시 구성을 변경하고 오프셋에 의존하지 않고 디스크와 파티션을 사람이 읽을 수 있는 형식으로 지정할 수 있습니다.또, 커맨드 라인 인터페이스도 포함되어 있기 때문에, GRUB 의 설정이 잘못되어 있거나 [3]파손되어 있는 경우, 수정이나 변경이 용이하게 됩니다.
- Loadlin은 실행 중인 DOS 또는 Windows 9x 커널을 런타임에 Linux 커널로 대체할 수 있는 부트 로더입니다.이 기능은 소프트웨어를 통해 전원을 켜야 하는 하드웨어의 경우, 그리고 이러한 구성 프로그램이 고유하고 DOS에서만 사용할 수 있는 경우에 유용합니다.Linux 에는 다수의 하드웨어 디바이스용 드라이버가 있지만 모바일 디바이스에서는 어느 정도 사용되고 있기 때문에 이 부팅 방법은 오늘날에는 그다지 필요하지 않습니다.또 다른 사용 예는 Linux가 BIOS 부팅에 사용할 수 없는 스토리지 디바이스에 있는 경우입니다.DOS 또는 Windows는 BIOS 제한을 보완하기 위해 적절한 드라이버를 로드하여 거기에서 Linux를 부팅할 수 있습니다.
커널 단계
Linux 커널은 메모리 관리, 작업 스케줄링, I/O, 프로세스 간 통신 및 전체 시스템 제어와 같은 모든 운영 체제 프로세스를 처리합니다.이것은 2단계로 로드됩니다.첫 번째 단계에서는 커널(압축 이미지 파일)을 메모리에 로드하여 압축을 해제하고 기본 메모리 관리 등의 몇 가지 기본 기능을 설정합니다.제어는 마지막으로 메인 커널 시작 프로세스로 전환됩니다.커널이 완전히 동작하게 되면 (부팅과 실행의 일부로서) 커널은 실행할 초기 프로세스를 찾습니다.이 프로세스는 (별도로) 사용자 공간과 사용자 환경 및 최종 로그인에 필요한 프로세스를 셋업합니다.그 후 커널 자체는 다른 프로세스로부터의 호출에 따라 아이돌 상태가 됩니다.
일부 플랫폼(ARM 64비트 등)에서는 커널 압축 해제를 부트 로더에서 대신 수행해야 합니다.
커널은 일반적으로 zlib를 사용하여 zImage 또는 bzImage 형식으로 압축된 이미지 파일로 로드됩니다.선두에 있는 루틴은 최소한의 하드웨어 셋업을 수행하고 이미지를 대용량 메모리로 압축 해제하고 구성된 [4]경우 RAM 디스크를 기록합니다.그런 다음 커널 부팅을 실행합니다../arch/i386/boot/head
및 그startup_32 ()
(x86 기반 프로세서의 경우) 프로세스.
커널의 기동 함수(스왑퍼 또는 프로세스0이라고도 함)는 메모리 관리(페이징 테이블 및 메모리 페이징)를 확립하고 CPU 유형 및 부동소수점 기능 등의 추가 기능을 검출하여 아키텍처 고유의 Linux 커널 기능 이외의 기능으로 전환합니다.start_kernel()
를 클릭합니다.[5]
start_module은 광범위한 초기화 기능을 수행합니다.Interrupt Handling(IRQ; 인터럽트 핸들링)을 설정하고 메모리를 추가 설정하며 Init 프로세스(최초의 사용자 공간 프로세스)를 시작하고 다음으로 를 통해 아이돌태스크를 시작합니다.cpu_idle()
특히 커널 부팅 프로세스에서는 부팅 단계에서 임시 루트 파일 시스템으로 로드된 초기 RAM 디스크("initrd")도 마운트됩니다.initrd를 사용하면 다른 디바이스(하드디스크 등)와 그 액세스에 필요한 드라이버(SATA 드라이버 등)에 의존하지 않고 드라이버 모듈을 메모리에서 직접 로드할 수 있습니다.이 스태틱하게 컴파일된 드라이버와 initrd에서 로드된 다른 드라이버를 분할하면 더 작은 커널을 사용할 수 있습니다.루트 파일시스템은 나중에 콜을 통해 전환됩니다.pivot_root()
그러면 임시 루트 파일 시스템이 마운트 해제되고 실제 루트 파일 시스템에 액세스할 수 있게 되면 실제 루트 파일 시스템을 사용하여 대체됩니다.임시 루트 파일 시스템에서 사용된 메모리가 회수됩니다.
따라서 커널은 디바이스를 초기화하고 부트 로더에 의해 읽기 전용으로 지정된 루트 파일 시스템을 마운트하여 Init ()를 실행합니다./sbin/init
)는 시스템에 의해 실행되는 첫 번째 프로세스로 지정됩니다(PID = 1).[6]메시지는 파일 시스템을 마운트할 때 커널에 의해 인쇄되고 Init 프로세스를 시작할 때 Init에 의해 인쇄됩니다.또한 옵션으로 Initrd를 실행하여[clarification needed] 루트 파일 시스템을 마운트하기 전에 셋업 및 디바이스 관련 사항([6]RAM 디스크 등)을 처리할 수도 있습니다.
Red Hat에 따르면 이 단계의 자세한 커널 프로세스는 다음과 [2]같이 요약됩니다.
- 「커널이 로드되면, 컴퓨터의 메모리가 곧바로 초기화 및 설정되어 모든 프로세서, I/O 서브시스템, 스토리지 디바이스 등, 시스템에 접속되어 있는 다양한 하드웨어가 설정됩니다.그런 다음 메모리 내의 미리 정해진 위치에서 압축된 initrd 이미지를 검색하여 압축을 풀고 마운트하여 필요한 모든 드라이버를 로드합니다.그런 다음 initrd 디스크 이미지를 마운트 해제하고 디스크 이미지가 사용한 모든 메모리를 해방하기 전에 LVM이나 소프트웨어 RAID 등의 파일 시스템과 관련된 가상 디바이스를 초기화합니다.그런 다음 커널은 루트 [clarification needed]디바이스를 생성하고 루트 파티션을 읽기 전용으로 마운트하고 사용되지 않는 메모리를 모두 비웁니다.이 시점에서 커널은 메모리에 로드되어 동작합니다.다만, 시스템에 의미 있는 입력을 가능하게 하는 유저 애플리케이션이 없기 때문에, 이 애플리케이션으로 할 수 있는 일은 많지 않습니다.」initramfs 스타일의 부트는 비슷하지만 앞서 설명한 initrd 부트와 동일하지는 않습니다.
이 시점에서 인터럽트가 유효하게 되면 스케줄러는 시스템 전체의 관리를 제어하여 프리엠프티브 멀티태스킹을 제공할 수 있으며 초기 프로세스는 사용자 공간에서 사용자 환경을 계속 부팅하도록 남겨집니다.
초기 사용자 공간
초기 사용자 공간으로도 알려진 initramfs는 Linux [7]커널 버전 2.5.46부터 사용 가능했습니다.이는 이전에 커널이 시작 프로세스 중에 수행되었을 많은 기능을 가능한 한 대체하기 위한 것입니다.초기 사용자 공간의 일반적인 용도는 메인 사용자 공간 파일 시스템을 로드하고 임시 파일 시스템에서 로드하는 데 필요한 장치 드라이버를 감지하는 것입니다.많은 배포에서 dracut을 사용하여 initramfs 이미지를 생성하고 유지합니다.
프로세스 초기화
커널이 시작되면 init 프로세스가 시작됩니다.역사적으로 이것은 "SysV init"로, 그냥 "init"로 불렸습니다.최근의 Linux 디스트리뷰션에서는 systemd와 같은 최신 대체품을 사용할 가능성이 있습니다.
기본적으로 이들은 운영 체제 서비스 관리로 분류됩니다.
「 」를 참조해 주세요.
레퍼런스
- ^ "EFI stub kernel - Gentoo Wiki". wiki.gentoo.org. Retrieved 2020-11-02.
- ^ a b "Product Documentation". Redhat.com. 2013-09-30. Retrieved 2014-01-22.
- ^ "Product Documentation". Redhat.com. 2013-09-30. Retrieved 2014-01-22.
- ^ "IBM description of Linux boot process". Archived from the original on May 31, 2008. Retrieved 2007-04-03.
- ^ "Inside the Linux boot process". www.ibm.com. 31 May 2006.
- ^ a b http://oldfield.wattle.id.au/luv/boot.html Linux 부팅 프로세스 - Kim Oldfield (2001)
- ^ "Initramfs arrives". Retrieved 14 November 2011.
외부 링크
- Greg Okeefe - Wayback Machine 전원에서 Bash 프롬프트 (2009년 10월 23일 아카이브 완료)
- M의 developerWorks 기사에서 Wayback Machine(2008년 5월 31일 보관)의 Linux 부팅 프로세스에 대한 IBM 설명.팀 존스
- 부트 차트: 부트 프로세스의 퍼포먼스 시각화
- EFI 시스템의 부트스트랩 프로세스(LWN.net, 2015년 2월 11일, Matt Fleming)