리눅스 부팅 프로세스

Booting process of Linux

리눅스다단계 부팅 프로세스는 BSD 및 기타 유닉스 스타일 부팅 프로세스와 여러 면에서 유사합니다.

Linux 설치 부팅에는 펌웨어 초기화, 부트 로더 실행, Linux 커널 이미지 로드 및 시작, 다양한 시작 스크립트 및 데몬 실행 등 여러 단계와 소프트웨어 구성 요소가 포함됩니다.이러한 각 단계와 구성 요소에는 다양한 변형과 접근 방식이 있습니다. 예를 들어 GRUB, coreboot 또는 DasU-Boot를 부트 로더로 사용할 수 있으며(과거 예로는 LILO, SYSLINUX 또는 Loadlin), 스타트업 스크립트는 전통적인 init 스타일일 수 있습니다.또는 systemd 또는 Upstart와 같은 최신 대안을 통해 시스템 구성을 수행할 수 있습니다.

개요

리눅스 시작 프로세스의 초기 단계는 컴퓨터 아키텍처에 크게 의존합니다.IBM PC 호환 하드웨어는 Linux가 일반적으로 사용되는 아키텍처 중 하나입니다. 이러한 시스템에서는 BIOS가 중요한 역할을 하므로 다른 시스템에서는 정확한 아날로그가 없을 수 있습니다.다음 예제에서는 IBM PC 호환 하드웨어를 가정합니다.

  1. BIOS는 실제 하드웨어 플랫폼과 관련된 전원 켜기 자가 테스트와 같은 시작 태스크를 수행합니다.하드웨어가 열거되고 부팅에 필요한 하드웨어가 올바르게 초기화되면 BIOS는 구성된 부팅 디바이스에서 부팅 코드를 로드하고 실행합니다.
  2. 부트 로더는 종종 사용자에게 가능한 부트 옵션 메뉴를 제공하고 시간이 지나면 선택되는 기본 옵션을 제공합니다.선택이 완료되면 부트 로더는 커널을 메모리에 로드하고 일부 매개 변수를 제공하며 제어 권한을 부여합니다.
  3. 커널이 압축되면 자체 압축이 해제됩니다.그런 다음 필수 하드웨어 및 메모리 페이징, 호출 등의 시스템 기능을 설정합니다.start_kernel()대부분의 시스템 설정(메모리, 나머지 메모리 관리, 장치 및 드라이버 초기화 등)을 수행합니다.그런 다음 유휴 프로세스, 스케줄러 및 사용자 공간에서 실행되는 init 프로세스를 별도로 시작합니다.
  4. init는 셸에 의해 실행되는 스크립트(sysv, bsd, runit) 또는 이진 구성 요소에 의해 실행되는 구성 파일(systemd, upstart)로 구성됩니다.Init에는 특정 수준(sysv, bsd) 또는 대상(systemd)이 있으며, 각 대상은 특정 서비스 집합(데몬)으로 구성됩니다.이들은 다양한 비운영 체제 서비스 및 구조를 제공하고 사용자 환경을 형성합니다.일반적인 서버 환경은 웹 서버, 데이터베이스 서비스 및 네트워킹을 시작합니다.
  5. 일반적인 데스크톱 환경은 기본 기본 그래픽 스택을 제공하는 그래픽 서버와 자격 증명을 입력하고 세션을 선택하는 기능을 제공하는 로그인 관리자로 구성된 그래픽 환경을 시작하는 데몬에서 시작됩니다.사용자가 올바른 자격 증명을 입력하면 세션 관리자가 세션을 시작합니다.세션은 UI 요소(패널, 데스크톱, 애플릿 등)와 같은 프로그램 집합으로, 함께 완전한 데스크톱 환경을 형성할 수 있습니다.

종료 시 제어된 방식으로 모든 사용자 공간 기능을 종료하기 위해 init가 호출됩니다.다른 모든 프로세스가 종료되면 init는 커널에 시스템을 종료하도록 지시하는 시스템 호출을 수행합니다.

단계

부트 로더

부트 로더 단계는 컴퓨터 아키텍처에 따라 다릅니다.초기 단계는 운영 체제에 국한되지 않으므로 x86x86-64 아키텍처에 대한 BIOS 기반 부팅 프로세스는 MBR(마스터 부트 레코드) 코드가 실제 모드에서 실행되고 1단계 부트 로더가 로드될 때 시작되는 것으로 간주됩니다.UEFI 시스템에서 리눅스 커널은 EFISTUB를 통해 UEFI 펌웨어에 의해 직접 실행될 수 있지만 일반적으로 GRUB [1]2 또는 systemd-boot를 부트 로더로 사용합니다.다음은 몇 가지 일반적인 부트 로더를 요약한 것입니다.

  • GRUB 2는 GRUB 1과 달리 다양한 운영 체제 및 자동 구성을 자동으로 감지할 수 있습니다.1단계는 마스터 부트 레코드(MBR)에서 BIOS에 의해 로드되고 실행됩니다.중간 단계 로더(1.5단계, 일반적으로 core.img)는 1단계 로더에 의해 로드되고 실행됩니다.2단계 로더(2단계, /boot/grub/files)는 1.5단계에서 로드되며 사용자가 운영 체제를 선택하거나 시작 매개 변수를 검사 및 편집할 수 있는 GRUB 시작 메뉴를 표시합니다.메뉴 항목이 선택되고 선택적 매개 변수가 지정되면 GRUB는 Linux 커널을 메모리에 로드하고 제어 권한을 메모리에 전달합니다.GRUB 2는 다른 부트 로더의 체인 로드도 가능합니다.UEFI 시스템에서 1단계와 1.5단계는 일반적으로 동일한 UEFI 응용 프로그램 파일입니다(: x64 UEFI 시스템의 경우 grubx64.efi).
  • systemd에 포함된 부트로더인 systemd-boot(이전의 Gummiboot)는 최소한의 구성이 필요합니다(UEFI 시스템 전용).
  • SYSLINUX/ISOLINUX는 FAT 파일 시스템에서 전체 Linux 설치를 부팅하는 데 특화된 부트 로더입니다.부팅 또는 복구 플로피 디스크, 라이브 USB 및 기타 경량 부팅 시스템에 자주 사용됩니다.ISOLINUX는 일반적으로 Linux 라이브 CD 및 부트 설치 CD에서 사용됩니다.
  • UEFI 시스템용 부팅 관리자인 reEFind.
  • corebootUEFI 또는 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]손상된 경우 GRUB를 쉽게 수정하거나 수정할 수 있습니다.
  • Loadlin은 실행 인 DOS 또는 Windows 9x 커널을 런타임에 Linux 커널로 대체할 수 있는 부트 로더입니다.이 기능은 소프트웨어를 통해 전원을 켜야 하고 이러한 구성 프로그램이 독점적이며 DOS에서만 사용할 수 있는 하드웨어의 경우에 유용합니다.Linux에는 여러 하드웨어 장치용 드라이버가 있지만 모바일 장치에서 일부 사용되고 있기 때문에 이 부팅 방법은 오늘날 덜 필요합니다.또 다른 사용 사례는 Linux가 BIOS에서 부팅할 수 없는 저장 장치에 있는 경우입니다. DOS 또는 Windows는 BIOS 제한을 보완하기 위해 적절한 드라이버를 로드하고 거기서 Linux를 부팅할 수 있습니다.

커널

Linux 커널은 메모리 관리, 작업 스케줄링, I/O, 프로세스 간 통신 및 전체 시스템 제어와 같은 모든 운영 체제 프로세스를 처리합니다.이는 두 단계로 로드됩니다. 첫 번째 단계에서는 커널(압축된 이미지 파일)이 메모리에 로드 및 압축 해제되고 기본 메모리 관리와 같은 몇 가지 기본 기능이 설정됩니다.그런 다음 제어는 마지막으로 주 커널 시작 프로세스로 전환됩니다.커널이 완전히 작동하고 시작의 일부로 로드 및 실행되면 커널은 실행할 init 프로세스를 찾습니다. 이 프로세스는 사용자 공간과 사용자 환경 및 최종 로그인에 필요한 프로세스를 별도로 설정합니다.그러면 커널 자체가 다른 프로세스의 호출에 따라 유휴 상태가 될 수 있습니다.

ARM 64비트와 같은 일부 플랫폼의 경우 커널 압축 해제는 부트 로더에 의해 대신 수행되어야 합니다.

커널은 일반적으로 zlibzImage 또는 bzImage 형식으로 압축된 이미지 파일로 로드됩니다.헤드에 있는 루틴은 최소한의 하드웨어 설정을 수행하고 이미지를 대용량 메모리로 완전히 압축 해제하며 [4]구성된 경우 RAM 디스크를 기록합니다.그런 다음 커널 시작을 실행합니다../arch/i386/boot/head그리고startup_32 ()(x86 기반 프로세서의 경우) 프로세스입니다.

커널에 대한 시작 함수(스왑퍼 또는 프로세스 0이라고도 함)는 메모리 관리(페이징 테이블 및 메모리 페이징)를 설정하고 CPU 유형과 부동소수점 기능과 같은 추가 기능을 감지한 다음 다음 다음 호출을 통해 비아키텍처 특정 리눅스 커널 기능으로 전환합니다.start_kernel().[5]

start_message는 광범위한 초기화 함수를 실행합니다.인터럽트 처리(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 이미지를 메모리의 미리 지정된 위치에서 찾아 압축을 풀고 마운트한 다음 필요한 모든 드라이버를 로드합니다.그런 다음 LVM 또는 소프트웨어 RAID와 같은 파일 시스템과 관련된 가상 디바이스를 초기화한 후 initrd 디스크 이미지를 마운트 해제하고 디스크 이미지가 차지한 모든 메모리를 확보합니다.그런 다음 커널은 루트 [clarification needed]장치를 생성하고 루트 파티션을 읽기 전용으로 마운트하며 사용되지 않는 메모리를 모두 해제합니다.이 시점에서 커널은 메모리에 로드되어 작동합니다.그러나 시스템에 의미 있는 입력을 허용하는 사용자 애플리케이션이 없기 때문에 시스템으로 할 수 있는 작업은 많지 않습니다."initramfs-style 부트는 설명된 initrd 부트와 유사하지만 동일하지는 않습니다.

이 시점에서 인터럽트가 활성화된 상태에서 스케줄러는 시스템의 전체 관리를 제어하여 선제적인 멀티태스킹을 제공할 수 있으며 init 프로세스는 사용자 공간에서 사용자 환경을 계속 부팅하는 데 남아 있습니다.

초기 사용자 공간

초기 사용자 공간으로도 알려진 initramfs는 리눅스 [7]커널 버전 2.5.46부터 사용할 수 있으며, 이전에 커널이 시작 프로세스 동안 수행했을 수 있는 가능한 많은 기능을 대체하기 위한 목적으로 사용되었습니다.초기 사용자 공간의 일반적인 용도는 기본 사용자 공간 파일 시스템을 로드하고 임시 파일 시스템에서 로드하는 데 필요한 장치 드라이버를 감지하는 것입니다.대부분의 배포에서는 드라컷을 사용하여 initramfs 이미지를 생성하고 유지 관리합니다.

Init 프로세스

커널이 시작되면 init 프로세스를 시작합니다. 데몬은 파일 시스템을 확인하고 마운트하고 다른 프로세스를 시작하여 사용자 공간을 부트스트랩합니다.init 시스템은 부팅 중에 시작하는 첫 번째 데몬이고 종료하는 마지막 데몬입니다.

역사적으로 이것은 "SysV init"이었고, 단지 "init"라고 불렸습니다.더 최근의 리눅스 배포판은 systemd와 같은 더 현대적인 대안 중 하나를 사용할 가능성이 높습니다.다음은 주요 초기화 프로세스를 요약한 것입니다.

  • SysV a.k.a.init(단순히 "init")는 유닉스BSD init 프로세스와 유사하며, 여기서 파생되었습니다.표준 Linux 시스템에서 init는 레벨로 알려진 매개 변수를 사용하여 실행됩니다. 이 매개 변수는 0에서 6 사이의 값을 취하며 작동 가능한 하위 시스템을 결정합니다.각 실행 수준에는 지정된 실행 수준을 설정하거나 종료하는 데 관련된 다양한 프로세스를 코드화하는 고유한 스크립트가 있으며, 이러한 스크립트는 부팅 프로세스에서 필요에 따라 참조됩니다.Init 스크립트는 일반적으로 다음과 같은 이름을 가진 디렉토리에 보관됩니다."/etc/rc..."init에 대한 최상위 구성 파일은 다음과 같습니다./etc/inittab시스템[8] 부팅 중에 /etc/inittab에 기본 실행 수준이 지정되어 있는지 확인하고, 지정되어 있지 않은 경우 시스템 콘솔을 통해 실행 수준을 입력하도록 요청합니다.그런 다음 모듈 로드, 루트 파일 시스템(읽기 전용으로 마운트됨)의 무결성을 확인한 다음 전체 읽기-쓰기 액세스를 위해 다시 마운트하고 네트워크[6]설정합니다.지정된 모든 프로세스를 생성한 후, init는 휴면 상태가 되고 종료 또는 종료되기 시작한 프로세스, 전원 [clarification needed]장애 신호 또는 다음을 통해 요청 중 하나가 발생할 때까지 기다립니다./sbin/telinit[9]레벨을 추가로 변경합니다.
  • systemd는 SysV init의 현대적인 대안입니다.init와 마찬가지로 systemd는 다른 데몬을 관리하는 데몬입니다.systemd를 포함한 모든 데몬은 백그라운드 프로세스입니다.systemd를 [10]처음 개발한 소프트웨어 엔지니어인 Lennart Poettering과 Kay Sievers는 여러 면에서 init 데몬의 효율성을 능가하려고 했습니다.그들은 의존성을 표현하기 위한 소프트웨어 프레임워크를 개선하고, 시스템 부팅 중에 더 많은 처리를 병렬로 수행할 수 있도록 하며, 계산 오버헤드를 줄이기를 원했습니다.각 데몬에 대한 Systemd의 초기화 명령은 셸 스크립트가 아닌 선언적 구성 파일에 기록됩니다.프로세스 간 통신을 위해 systemd는 실행 중인 데몬에서 유닉스 도메인 소켓과 D-Bus를 사용할 수 있도록 합니다.Systemd는 공격적인 병렬화도 가능합니다.

참고 항목

레퍼런스

  1. ^ "EFI stub kernel - Gentoo Wiki". wiki.gentoo.org. Retrieved 2020-11-02.
  2. ^ a b "Product Documentation". Redhat.com. 2013-09-30. Retrieved 2014-01-22.
  3. ^ "Product Documentation". Redhat.com. 2013-09-30. Retrieved 2014-01-22.
  4. ^ "IBM description of Linux boot process". Archived from the original on May 31, 2008. Retrieved 2007-04-03.
  5. ^ "Inside the Linux boot process". www.ibm.com. 31 May 2006.
  6. ^ a b c http://oldfield.wattle.id.au/luv/boot.html 리눅스 부팅 프로세스 - by Kim Oldfield (2001)
  7. ^ "Initramfs arrives". Retrieved 14 November 2011.
  8. ^ "From Power Up To Bash Prompt: Init". users.cecs.anu.edu.au.
  9. ^ "init". man.he.net.
  10. ^ "systemd README". freedesktop.org. Retrieved 2012-09-09.

외부 링크