누군가가 다음 단계가 올바른지 확인할 수 있다면 좋을 것입니다. 정확한 단계를 알고 싶습니다.
컴퓨터 전원을 켜십시오.
기본 I/O 시스템(BIOS/UEFI). 가장 먼저 실행되는 프로그램은 PC 마더보드의 ROM에 저장됩니다.
- 펌웨어(BIOS/UEFI): 장치 프로세서에 부팅 프로세스를 시작하는 방법을 알려주는 프로그램은 펌웨어로 간주됩니다.
- 펌웨어는 제조 과정에서 하드웨어에 직접 설치됩니다.
- 컴퓨터, 휴대폰 및 태블릿은 BIOS 및 EFI와 같은 펌웨어를 사용하여 운영 체제를 로드합니다.
POST(Power On Self Test)를 수행하여 H/W 구성 요소가 제대로 작동하는지 확인합니다.
부팅 가능한 장치를 찾으십시오. 발견된 경우 CONTROL은 장치의 첫 번째 섹터인 MBR로 넘겨집니다.
MBR(마스터 부트 레코드). 512바이트, 부팅 가능한 장치의 첫 번째 섹터에는 컴퓨터를 부팅하는 데 사용되는 기계어 코드 지침이 포함되어 있습니다. 여기에는 다음과 같은 정보가 있습니다.
- 부트로더 정보(446바이트) - 부트로더를 가리키는 작은 하위 수준 코드 [부트로더는 어디에 있습니까? ] /boot/grub2/grub.cfg
- 파티션 테이블 정보(64바이트) [파일 시스템에서 운영체제는 어디에 위치하는가? ]
- 오류 검사(2바이트)
- 부트 로더(GRUB2)를 메모리에 로드하고 제어권을 메모리에 넘깁니다.
GRUB2(GRand 통합 부트 로더)
- 운영체제를 로딩하는 프로그램입니다. 예전에는 MBR(446바이트)에 적합했지만 크기가 계속 커지면서 운영 체제도 복잡해졌습니다. 파일 시스템을 올바르게 해석할 수 있는 단일 프로그램이 아닙니다.
- 시작하는 동안 /boot/grub2/grub.cfg에서 MBR에 의해 메모리에 로드됩니다.
- 사용자는 부팅할 다른 운영 체제나 커널을 선택하라는 GUI를 볼 수 있습니다.
- 커널을 선택하면 해당 커널 실행 파일을 찾습니다.
- /boot/vmlinuz-4.18.0-408.el8.x86_64
- 주요 작업은 커널과 initramfs [initramfs-4.18.0–408.el8.x86_64.img]를 메모리에 로드하는 것입니다.
- 커널이 RAM에 로드되면 Control이 RAM에 전달됩니다.
핵심:
- Linux 커널이 시스템 제어권을 갖게 되면(부트로더에 의해 로드된 후 획득) 메모리 구조와 드라이버를 준비합니다(하드웨어 초기화). 커널이 시작 중입니다.
- 우리는 RHGB와 Quiet에 의해 억제될 수 있는 많은 메시지를 볼 수 있습니다. [메시징을 활성화하려면 /etc/default/grub에서 GRUB_CMDLINE_LINUX 매개변수를 수정한 다음 #grub2-mkconfig > /boot/grub2/grub.cfg를 실행하고 재부팅하세요.]
- 일부 Linux 기반 컴퓨터 시스템을 올바르게 부팅하려면 initramfs가 필요합니다. 존재하는 경우 커널은 initramfs에서 /init 스크립트를 실행합니다.
- 외부 드라이버나 설정 또는 암호화된 파일 시스템이 있는 시스템에는 Linux 커널이 시스템의 init 바이너리로 제어권을 전달할 수 있도록 initramfs가 필요합니다.
initramfs: ref-10
- initramfs는 tmpfs를 기반으로 한 초기 램 파일 시스템입니다. 이는 부팅 시 커널이 수행할 수 없는 작업을 수행할 수 있는 초기 사용자 공간을 제공합니다.
- 여기에는 실제 루트 파일 시스템에서 init 바이너리를 호출하기 전에 파일 시스템을 마운트하는 데 필요한 도구와 스크립트가 포함되어 있습니다.
- 이러한 도구는 암호 해독 추상화 계층(암호화된 파일 시스템용), 논리 볼륨 관리자, 소프트웨어 RAID, Bluetooth 드라이버 기반 파일 시스템 로더 등이 될 수 있습니다.
- 부팅 시 커널은 initramfs가 존재하는지 확인하거나 부트로더가 initramfs가 로드되었음을 Linux 커널에 알립니다.
- 발견되면 Linux 커널은 tmpfs 파일 시스템을 생성하고 해당 아카이브의 내용을 추출한 다음 tmpfs 파일 시스템의 루트 디렉터리에 있는 /init 스크립트를 시작합니다.
- [initramfs에는 /init.d라는 파일이 하나 이상 포함되어 있습니다. 이 파일은 커널에 의해 기본 초기화 프로세스(PID 1)로 실행됩니다. 모든 작업을 수행해야 합니다. ] 참조-7
- 그런 다음 스크립트는 /sysroot 아래에 실제 루트 파일 시스템을 마운트합니다(예: 추가 모듈 로드, 암호화 추상화 계층 준비 등을 통해 마운트할 수 있는지 확인한 후). 뿐만 아니라 /usr 및 / var와 같은 중요한 다른 파일 시스템도 마운트합니다.
- 루트 파일 시스템과 기타 중요한 파일 시스템이 마운트되면 initramfs의 init 스크립트는 루트를 실제 루트 파일 시스템으로 전환합니다(이것은 ivot_root가 아닌 switch_root 작업임을 기억하십시오).
- [switch_root 작업은 /sysroot를 실제 루트 파일 시스템으로 전환하고 거기에서 콘텐츠 실행을 시작한 다음 메모리에서 initramfs를 제거합니다. ]
- 마지막으로 시스템의 실제 루트 파일 시스템에서 /sbin/init(init -> /usr/lib/systemd/systemd) 바이너리를 기본 init 프로세스(PID 1 - initramfs /init에서 상속됨, exec 세부 정보 참조)로 호출하여 계속합니다. 부팅 프로세스.
체계:
- PID 1이 로드된 첫 번째 서비스
- /etc/fstab에서 파일 시스템을 마운트합니다.
- 필요한 모든 서비스와 프로세스를 병렬로 시작합니다.
- [/etc/systemd/system/default.target]
- 기본 대상으로 부팅하는 데 필요한 종속성이 있는 파일을 찾기 시작합니다.
- 기본 대상이 시작되고 사용자가 로그인 프롬프트를 볼 수 있으면 시스템이 성공적으로 시작되었다고 말할 수 있습니다.
인용하다:
1. https://opensource.com/article/20/5/systemd-startup 2. https://opensource.com/article/20/5/systemd-units 3. https://opensource.com/article/20/4/systemd 4. https://www.quora.com/What-is-chroot-Sysroot 5.https://blog.csdn.net/flynetcn/article/details/131828832 6. https://www.linfo.org/vmlinuz.html 7. https://wiki.gentoo.org/wiki/Custom_Initramfs 8. https://www.linuxfromscratch.org/blfs/view/svn/postlfs/initramfs.html 9. https://www.quora.com/What-exactly-is-the-initramfs-program-in-Linux-Is-it-a-script-binary-or-what 10. https://wiki.gentoo.org/wiki/Initramfs/Guide 11. https://wiki.ubuntu.com/Initramfs 12. https://www.youtube.com/watch?v=saovaEhA85g 13. https://www.youtube.com/watch?v=sOIOY6Ks0xA&t=423s 14. https://sourcemage.org/HowTo/initramfs 15. https://web.archive.org/web/20160730094856/http://wiki.sourcemage.org/HowTo(2f)Initramfs.html 16. https://tiebing.blogspot.com/2014/02/linux-switchroot-vs-pivotroot-vs-chroot.html 17. https://unix.stackexchange.com/questions/126217/when-would-you-use-pivot-root-over-switch-root 18. https://linux.die.net/man/8/pivot_root 19. https://linux.die.net/man/8/switch_root 20. https://en.wikipedia.org/wiki/Exec_(system_call) 21. https://www.baeldung.com/linux/exec-command-in-shell-script 22. https://eng.libretexts.org/Bookshelves/Computer_Science/Operating_Systems/Linux_-_The_Penguin_Marches_On_(McClanahan)/13%3A_Working_with_Bash_Scripts/3.09%3A_Positional_Parameters_exec_Command_source_Command#:~:text=%20exec%20command%2 0in%20Linux, %를 반환합니다. 20 %20%20으로 이동하여 %20 프로세스를 호출합니다. 23. https://en.wikipedia.org/wiki/Overlay_ (프로그래밍) 24. https://superuser.com/questions/782008/linux-boot-time-scrolling-messages 25. https://itnixpro.com/how-to-view-linux-boot-messages-using-dmesg-command/?utm_content=cmp-true 26. https://linux-audit.com/finding-boot-logs-in-systemd-journals/ 27. https://www.loggly.com/ultimate-guide/using-journalctl/
답변1
글쎄, 귀하의 initramfs 및 systemd 부분은 정확하지만 나머지는 반드시 그런 것은 아닙니다.
정확한 단계는 무엇입니까?
그런 문제의 문제점은 다음과 같습니다.싱글이 아님"정확히 올바른 단계" 답변 – 하나가 있습니다다양한 종류각 단계에서는 하드웨어 플랫폼, Linux 배포판 등에 따라 달라집니다.
특정 PC 플랫폼(2010년대 PC의 새로운 RHEL/Fedora?)의 일부 특정 Linux 배포판에 대한 귀하의 설명은 어느 시점에서는 정확하지만 동시에 다른 PC는 GRUB 대신 다른 부트로더 프로그램을 사용하거나 MBR 섹터 대신 완전히 다른 부트로더 – 둘 다 "올바릅니다".
—
(음, "부팅"과 "BIOS" 사이에는 "BIOS"를 실행하여 메인 CPU를 준비하기 전에 실제로 실행되는 첫 번째 독립 CPU인 Intel의 ME 또는 AMD의 PSP와 같이 부팅 시 실제로 CPU를 초기화하는 숨겨진 프로세스를 포함할 수 있습니다. 그러나 이전에는 이것이 사용자에게 완전히 보이지 않기 때문에 이를 무시하고 BIOS가 먼저인 척할 수 있습니다.
"BIOS"는 일반적인 용어일 수 있지만 실제로는 오늘날 대부분의 x86 PC에서 사용되는 IBM PC 스타일 펌웨어를 구체적으로 나타냅니다.더 이상 사용하지 않음– 거의 모두 "UEFI" 유형 펌웨어를 사용합니다. UEFI에는 일반적으로 BIOS 인터페이스용 호환성 모듈이 포함되어 있지만 점점 더 이상 그렇지 않습니다.
다른 유형의 컴퓨터에서는 정확도가 훨씬 떨어집니다. 내가 아는 한, Intel Mac에는 항상 EFI("BIOS" 없음)가 있었습니다. Apple Silicon Mac에는 완전히 맞춤화된 시스템 펌웨어가 있습니다. Chromebook은 다양한 ARM64 컴퓨터를 사용합니다.가능한UEFI가 있거나 다른 것을 사용할 수도 있습니다.
일반적으로 "시스템 펌웨어"라고 부르는 것이 더 좋습니다.
—
PC에 관한 한(현재 임베디드 장치는 무시) 이는 IBM PC BIOS 부팅 프로세스에만 적용됩니다. 예를 들어 UEFI가 있는 시스템은 부팅 코드의 첫 번째 섹터를 전혀 사용하지 않습니다. 대신 펌웨어는 파일 시스템을 이해하고 부팅 코드를 특수 파티션에 일반 파일로 저장합니다.
마찬가지로 IBM PC BIOS에서는 정확하지만 UEFI에서는 정확하지 않습니다.
섹터에는 여전히 파티션 테이블이 포함될 수 있지만(섹터 2+에서 GPT 파티션 테이블을 사용하는 것이 더 일반적이지만) UEFI사용하지 마세요부팅 코드는 여기에서 나오지만 GRUB2는 파일 시스템에서 직접 시작됩니다.
("EFI 시스템 파티션"의 ID와 파일 경로는 일반적으로 펌웨어 자체에 의해 NVRAM에 저장되며 2개 이상 있을 수 있습니다. - 펌웨어자체 부팅 메뉴가 있습니다.)
그러나 BIOS의 경우 대략 두 가지 유형의 부트 섹터가 있습니다. a) "활성" 첫 번째 섹터로 점프하는 부트 섹터분할(일명 VBR), 이는 Syslinux 및 Windows 등에서 발생합니다. b) 설치 중에 정의된 고정 섹터 위치에 있는 파일로 점프합니다. 이것이 GRUB의 MBR이 수행하는 작업입니다.
두 경우 모두 BIOS MBR의 부팅 코드가 너무 작아서 grub.cfg를 이해할 수 없습니다. 이는 다음으로 인해 발생합니다.다음MBR이 시작되는 단계입니다.
GRUB2는 일반적이지만 결코 보편적인 것은 아닙니다. (예를 들어 rEFInd 및 systemd-boot와 마찬가지로 Syslinux에서는 매우 일반적입니다. 오늘날 특히 UEFI 시스템에서는 커널 이미지(vmlinuz) 자체에 스텁 로더가 내장되어 있어 펌웨어가 이를 직접 실행할 수 있습니다.)
게다가 MBR에는 결코 적합하지 않았습니다. GRUB2나 GRUB0.x도 적합하지 않았습니다. MS-DOS에서도 MBR은 "활성" 파티션을 찾아서 해당 VBR로 점프하는 것(그런 다음 IO.SYS를 로드하고저것DOS 커널은 결국 로드됩니다. 따라서 GRUB2는 다른 부트로더에 비해 실제로 크기는 크지만 전혀 새로운 것은 아닙니다.
(결국 두 개의 grub.cfg가 관련됩니다. 작은 "부팅" grub.cfg는 grub 설치 중에 생성된 GRUB 커널 이미지에 직접 내장되고 "실제" grub.cfg의 위치를 가리킵니다. 따라서 GRUB가 "/boot/grub2/grub.cfg에서" 로드된다고 말하는 것은 정확하지 않습니다.