Linux 기본 연구 노트-부팅 프로세스, 모듈 관리 및 로더

부팅 프로세스, 모듈 관리 및 로더

1. Linux 부팅 프로세스 분석

1.1 부팅 프로세스 개요

시스템 부팅 프로세스는 다음과 같이 요약 할 수 있습니다.

  1. BIOS의 하드웨어 정보를로드하고 자체 테스트를 수행하고 설정에 따라 첫 번째 부팅 장치를 얻습니다.
  2. 첫 번째 부팅 장치 (즉, grub2, spfdisk와 같은 프로그램)에서 MBR의 부트 로더를 읽고 실행합니다.
  3. 부트 로더 설정에 따라 커널을로드하면 커널이 하드웨어를 감지하고 드라이버를로드하기 시작합니다.
  4. 하드웨어 드라이브가 성공하면 Kernel은 적극적으로 systemd 프로그램을 호출하고 default.target 프로세스로 시작합니다.
    • systemd는 sysinit.target을 실행하여 시스템을 초기화하고 basic.target을 실행하여 운영 체제를 준비합니다.
    • systemd는 multi-user.target에서 로컬 및 서버 서비스를 실행합니다.
    • systemd는 multi-user.target에서 /etc/rc.d/rc.loacl 파일을 실행합니다.
    • systemd는 multi-user.target에서 getty.target 및 로그인 서비스를 실행합니다.
    • systemd는 그래픽에 필요한 서비스를 수행합니다.

1.2. BIOS, 부트 로더 및 커널 로딩

먼저 고유 명사를 설명해 봅시다.

  • BIOS : 기존 BIOS와 UEFI BIOS를 모두 줄여서 BIOS라고합니다.
  • MBR : 파티션 테이블은 기존 MBR과 새로운 GPT로 구성되어 있지만 GPT도 일부 MBR 호환 블록을 예약하므로 부트 로더 설치를 위해 아래 지침을 MBR이라고합니다. 간단히 말해 MBR은 부트 로더를 설치할 수있는 디스크의 첫 번째 블록을 나타냅니다 .

1.2.1, BIOS, 부팅 자체 테스트 및 MBR / GPT

개인용 컴퓨터 아키텍처 에서 전체 시스템을 시작하려면 먼저 시스템이 BIOS를로드하고 BIOS를 통해 CMOS 정보를로드 한 다음 CPU와 같은 CMOS의 설정에서 호스트의 하드웨어 구성을 가져와야합니다. 인터페이스 장치와의 통신 빈도, 부팅 장치의 검색 순서, 하드 디스크 크기 및 유형, 시스템 시간 등

이 정보를 얻은 후 BIOS는 POST (Power-On Self-Test)도 수행합니다 . 그런 다음 하드웨어 감지 초기화를 시작하고 PnP 장치를 설정 한 다음 부팅 가능한 장치 시퀀스를 정의한 다음 부팅 장치의 데이터 읽기를 시작합니다 .

우리의 시스템 소프트웨어는 대부분 하드 디스크에 있기 때문입니다! 따라서 BIOS는 디스크에서 운영 체제 커널을 읽을 수 있도록 부팅 장치를 지정합니다. 그러나 운영 체제마다 파일 시스템 형식이 다르기 때문에 커널 파일로드 문제를 처리하기 위해 부팅 관리 프로그램을 사용해야하므로이 부팅 관리 프로그램을 Boot Loader라고 합니다. 부트 로더 는 어디에 설치되어 있습니까? 그것은 우리가 항상 MBR (Master Boot Partition) 이라고 말했던 부팅 장치의 첫 번째 섹터에 있습니다.

커널 파일을 읽기 위해서는 Loader가 필요하기 때문에 각 운영 체제의 Loader가 다른데이 경우 BIOS는 MBR에서 Loader를 어떻게 읽습니까? 실제로 BIOS는 하드웨어 INT 13 인터럽트 기능을 통해 MBR을 읽습니다 . 즉, BIOS가 디스크 (디스크가 SATA 또는 SAS 인터페이스인지 여부)를 감지 할 수있는 한 INT 13 채널을 전달할 수있는 방법이 있습니다. 디스크의 첫 번째 섹터에서 MBR 소프트웨어를 읽으려면.

1.2.2, 부트 로더 기능

I 방금 언급 로더의 주요 기능은 오퍼레이팅 시스템의 파일 형식을 인식하고 그에 따라 실행을 위해 메모리에로드한다 . 다른 운영 체제의 파일 형식이 일치하지 않기 때문에 각 운영 체제에는 자체 부트 로더가 있으며 자체 부트 로더를 통해서만 자체 커널 파일을로드 할 수 있습니다 ! 그래서 질문은, 당신은 여러 시스템에 대해 들어 보았어야 했죠? 즉, 여러 다른 운영 시스템은 호스트에 설치되어있다. 이후 ( 1) 자신의 운영 체제 커널을로드하기 위해 자신의 로더를 사용한다 (2) 단일 호스트를 할 수있는 방법 다음, 하나의 MBR이? 동시에 여러 시스템을 설치하는 것은 어떻습니까?

파일 시스템의 기능을 재 호출 할 필요가 있습니다. 사실, 모든 파일 시스템은 부트 로더를 설치 운영 시스템을 제공하는 부트 섹터를 예약한다 , 보통 운영 시스템은 루트 디렉토리가 기본적으로있는 파일 시스템의 부트 로더에 로더의 사본을 설치합니다 . 호스트 중 하나에 Windows와 Linux를 설치하는 경우 부트 섹터, 부트 로더 및 MBR 간의 상관 관계는 다음과 같습니다.

여기에 사진 설명 삽입

위의 그림에서 볼 수 있듯이 각 운영 체제는 기본적으로 자체 파일 시스템 (즉, 각 파일 시스템의 왼쪽 하단에있는 상자)에 부트 로더 세트를 설치하며 Linux 시스템을 설치할 때 부트 로더를 설치하도록 선택할 수 있습니다. MBR로 이동하여를 설치하지 않도록 선택할 수도 있습니다 . MBR에 설치하도록 선택하면 이론적으로 MBR과 부트 섹터 모두에 부트 로더 프로그램의 사본을 보관하게됩니다. Windows 설치의 경우 기본적으로 MBR과 부트 섹터 모두에 부트 로더를 자동으로 설치합니다 ! 따라서 여러 운영 체제를 설치할 때 MBR이 다른 운영 체제의 부트 로더에 의해 덮어 쓰기되는 경우가 많습니다 .

방금 언급 한 문제는 아직 해결되지 않았습니다! 각 운영 체제는 부트 로더를 부트 섹터에 설치할 수 있지만 운영 체제는 자체 부트 로더를 통해 커널을로드 할 수 있습니다 . 문제는 시스템에 MBR이 하나뿐이라는 것인데 부트 로더에서 로더를 어떻게 실행 합니까? 이를 위해서는 Boot Loader의 주요 기능을 이해해야 합니다 .

  • 메뉴 제공 : 사용자는 다양한 부팅 항목을 선택할 수 있으며, 이는 멀티 부팅의 중요한 기능이기도합니다!
  • 커널 파일로드 : 부팅 가능한 프로그램 섹션을 직접 가리켜 운영 체제를 시작합니다.
  • 다른 로더 로 전송 : 관리를 위해 부팅 관리 기능을 다른 로더로 전송합니다.

메뉴 기능으로 인해 부팅 할 다른 커널을 선택할 수 있습니다. 그리고 제어 전달 기능으로 인해 다른 부트 섹터에 로더를로드 할 수 있습니다 ! 그러나 Windows 로더에는 기본적으로 제어 전송 기능이 없으므로 Windows 로더를 사용하여 Linux 로더를로드 할 수 없습니다 .

여기에 사진 설명 삽입

위의 그림에서 볼 수 있듯이 MBR은 Linux의 grub2 부팅 관리 프로그램을 사용하며 이미 세 개의 메뉴가 있다고 가정합니다. 첫 번째 메뉴는 Linux 커널 파일을 직접 가리키고 커널을 직접로드하여 부팅 할 수 있습니다. 두 번째 메뉴는 Windows에 부팅 관리 제어 권한을 부여합니다. 이때 Windows Loader가 부팅 프로세스를 인수합니다. 이때 Windows를 시작할 수 있습니다. 세 번째 메뉴는 Boot Loader에서 Linux의 부팅 관리 프로그램을 사용하는 것입니다. 이때 또 다른 grub2 메뉴가 나타납니다.

  • 단일 선택 : MBR (grub2) → 커널 파일 → 부팅
  • 메뉴 2 : MBR (grub2) → 부트 섹터 (Windows 로더) → Windows 커널 → 부팅
  • 메뉴 3 : MBR (grub2) → 부트 섹터 (grub2) → 부팅

1.2.3, 커널을로드하여 하드웨어 및 initramfs 기능 감지

Boot Loader의 관리하에 커널 파일을 읽기 시작하면 Linux는 커널 파일을 메모리로 압축하고 커널의 기능을 사용 하여 저장 장치, CPU, 네트워크 카드, 사운드 카드 등 이때 Linux 커널은 자체 기능으로 하드웨어를 다시 감지하며 BIOS에서 감지 한 하드웨어 정보를 반드시 사용하지는 않습니다. 즉, 커널이 공식적으로 BIOS 작업을 인수했습니다. 그렇다면 코어 파일은 일반적으로 어디에 저장됩니까? 일반적으로 말해서, / boot에 위치하고 이름은 / boot / vmlinuz 입니다.

[root@li ~]# ls  --format=single-column -F /boot
config-3.10.0-1127.el7.x86_64		#此版本内核被编译时选择的功能与模块配置文件
efi/		
grub/		#旧版的
grub2/		#就是开机管理程序 grub2 相关数据目录
initramfs-0-rescue-1b1f29b2be3d4dafbdcac2da7f5a3c15.img		#底下是虚拟文件系统文件!
initramfs-3.10.0-1127.el7.x86_64.img
symvers-3.10.0-1127.el7.x86_64.gz
System.map-3.10.0-1127.el7.x86_64
vmlinuz-0-rescue-1b1f29b2be3d4dafbdcac2da7f5a3c15*
vmlinuz-3.10.0-1127.el7.x86_64*		#内核文件。最重要的文件!

하드웨어 개발자와 다른 커널 함수 개발자의 편의를 위해, 리눅스 커널은 동적으로 커널 모듈을로드 할 수 있습니다 , 일반적으로 / lib / modules 디렉토리에 배치됩니다 . 모듈은 디스크의 루트 디렉토리에 위치하므로 ( / lib는 / ! 와 별도의 파티션에 배치 할 수 없음을 기억하십시오 ), 부트 ​​프로세스 중에 루트 디렉토리에 중단되어야 커널 모듈이 드라이버 기능을 제공합니다. . 그리고 디스크의 파일 시스템에 영향을 미치는 것에 대해 걱정하기 위해 루트 디렉토리는 부팅 프로세스 동안 읽기 전용으로 마운트됩니다 .

가상 파일 시스템은 일반적으로 파일 이름 / boot / initrd 또는 / boot / initramfs를 사용합니다. 이 파일의 특징은 부트 로더를 통해 메모리로로드 할 수 있으며, 그런 다음 파일이 압축되고 메모리의 루트 디렉토리로 시뮬레이션된다는 것입니다. 그리고 메모리에있는이 시뮬레이션 된 파일 시스템은 부팅 프로세스 중에 가장 필요한 커널 모듈을로드하는 실행 프로그램을 제공 할 수 있습니다. 일반적으로 이러한 모듈은 USB, RAID, LVM, SCSI 및 기타 파일 시스템과 디스크 인터페이스입니다. 드라이버 . 도움말 커널이 systemd를 다시 호출하여 후속 일반 부팅 프로세스를 시작하기를 기다립니다.

여기에 사진 설명 삽입

위 그림과 같이 부트 로더는 커널과 initramfs를로드 한 다음 루트 디렉토리라는 메모리에서 initramfs의 압축을 풀 수 있으며 커널은 여기에서 적절한 드라이버를로드하고 마지막으로 가상 파일 시스템을 해제하고 실제 루트 디렉토리를 마운트 할 수 있습니다. 파일 시스템은 후속 일반 부팅 프로세스를 시작할 수 있습니다.

커널이 완전히로드되면 호스트가 올바르게 작동하기 시작하고 시스템의 첫 번째 프로그램 인 systemd 실행을 시작해야합니다 .

1.3, 첫 번째 프로그램 systemd 및 default.target을 사용하여 부팅 프로그램 분석 시작

커널이로드 된 후 하드웨어 감지 및 드라이버로드가 완료되면 호스트 하드웨어가 준비되어 있어야합니다. 이때 커널은 systemd 인 첫 번째 프로그램을 적극적으로 호출합니다. 이것이 pstree -p 명령을 사용할 때 systemd의 PID 번호가 1임을 알게되는 이유 입니다. systemd의 주요 기능은 시스템의 호스트 이름, 네트워크 설정, 언어 처리, 파일 시스템 형식 및 기타 서비스의 시작을 포함하여 소프트웨어 실행을위한 환경을 준비하는 것입니다 . 모든 작업은 systemd의 기본 시작 서비스 세트, 즉 /etc/systemd/system/default.target을 통해 계획됩니다 . 또한 systemd는 수년 동안 사용 된 런레벨을 포기했습니다.

1.3.1, 공통 운영 환경 대상 및 호환성 및 실행 수준

사전 설정된 운영 환경으로 사용할 수있는 주요 항목은 multi-user.target 및 graphics.target입니다. 물론, rescue.target, shutdown.target, emergency.target 등, initrd.target을 포함한 더 특별한 운영 환경이 있습니다.

그러나 과거에 systemV는 시스템을 시작하기 위해 runlevel이라는 개념을 사용했으며, 이전 방식의 systemV 작동 동작과 호환되도록 systemd는 runlevel과 운영 환경을 결합했습니다.

SystemV 체계
초기화 0 systemctl 전원 끄기
초기화 1 systemctl 구조
초기화 [234] systemctl은 다중 사용자를 격리합니다.
초기화 5 systemctl은 graphics.target을 분리합니다.
초기화 6 systemctl 재부팅

1.3.2, 시스템 처리 흐름

/etc/systemd/system/default.target의 기본 작동 인터페이스를 얻은 후 시스템은 다음으로 무엇을할까요? 먼저 / usr / lib / systemd / system / 디렉토리에 링크하여 multi-user.target 또는 graphics.target 중 하나를 얻습니다. graphic.target을 사용한다고 가정하면 systemd는 다음 디렉토리 인 두 위치에서 설정을 찾습니다.

  • /etc/systemd/system/graphic.target.wants/: 사용자가로드 된 단위 설정
  • /usr/lib/systemd/system/graphical.target.wants/ : 기본적으로로드되는 단위

그런 다음 구성 파일 /usr/lib/systemd/system/graphical.target에서 다음 내용을 찾을 수 있습니다.

[root@li ~]# cat /usr/lib/systemd/system/graphical.target
[Unit]
Description=Graphical Interface
Documentation=man:systemd.special(7)
Requires=multi-user.target		#必须先加载 multi-user.target 
Wants=display-manager.service	#启动完 graphical.target 之后,还必须启动 display-manager.service
Conflicts=rescue.service rescue.target
After=multi-user.target rescue.service rescue.target display-manager.service
AllowIsolate=yes
[root@li ~]# cat /usr/lib/systemd/system/multi-user.target
[Unit]
Description=Multi-User System
Documentation=man:systemd.special(7)
Requires=basic.target		#必须先加载 basic.target
Conflicts=rescue.service rescue.target
After=basic.target rescue.service rescue.target
AllowIsolate=yes

시스템은 기본적으로 어떤 장치를로드합니까?

[root@li ~]# ls /usr/lib/systemd/system/multi-user.target.wants/
dbus.service           plymouth-quit-wait.service      systemd-update-utmp-runlevel.service
getty.target           systemd-ask-password-wall.path  systemd-user-sessions.service
plymouth-quit.service  systemd-logind.service

사용자 정의 단위는 무엇입니까?

[root@li ~]# ls /etc/systemd/system/multi-user.target.wants/
auditd.service      kdump.service           rhel-configure.service  vmtoolsd.service
crond.service       NetworkManager.service  rsyslog.service
firewalld.service   postfix.service         sshd.service
irqbalance.service  remote-fs.target        tuned.service

실제로 시스템의 서비스 시작 프로세스를 알 수있는 가장 쉬운 방법은 systemctl list-dependencies graphics.target 명령 입니다. 그러나 그 뒤에있는 구성 파일의 의미를 알고 싶다면, 각각 / etc 및 / usr / lib 아래에있는 graphics.target.wants / 디렉토리에서 데이터를 찾아야합니다! 물론 구성 파일에서 요구 사항 값으로 표시되는 서비스도 먼저로드해야합니다.

1.3.3, systemd는 multi-user.target에서 서비스를 시작합니다.

커널 드라이버 하드웨어가로드 된 후 sysinit.target의 초기화 과정을 통해 시스템에 액세스 할 수 있으며, 시스템을 운영 체제의 기반으로 만들기 위해 basic.target을 추가 한 다음 서버가 원활하게 실행되는 데 필요한 다양한 호스트 서비스를 제공합니다. 그리고 서버 기능을 제공하는 네트워크 서비스의 시작입니다. 이러한 서비스의 시작은 대부분 multi-user.target 운영 환경에 연결되어 있습니다. /etc/systemd/system/multi-user.target.wants/로 이동하여 기본 시작 서비스를 볼 수 있습니다. 즉, 일반적으로 서비스 시작 스크립트 설정은 다음 디렉터리에 있습니다 .

  • / usr / lib / systemd / system : 시스템 기본 서비스 시작 스크립트 설정
  • / etc / systemd / syetem : 관리자가 개발하고 설정 한 시작 스크립트

사용자가 호스트의 로컬 서비스와 서버 네트워크 서비스의 다양한 단위를 enbale하려면 /etc/systemd/system/multi-user.target.wants/ 디렉토리에 넣고 링크를 만드십시오. 부팅시 자동으로 시작할 수 있습니다 .

[root@li lib]# systemctl enable vsftpd.service
Created symlink from /etc/systemd/system/multi-user.target.wants/vsftpd.service to /usr/lib/systemd/system/vsftpd.service.
[root@li lib]# systemctl disable vsftpd.service
Removed symlink /etc/systemd/system/multi-user.target.wants/vsftpd.service.

1.3.4, 호환되는 systemV rc-local.service

과거에 Linux를 사용한 적이있는 사용자는 시스템이 부팅 된 후 시스템이 추가 프로그램을 실행하도록 하려면 프로그램 명령 또는 스크립트의 절대 경로 이름을 /etc/rc.s/rc에 쓸 수 있음을 알고있을 것입니다. .local을이 파일에 추가합니다. 새로운 systemd 메커니즘에서는 systemd 시작 스크립트 구성 파일을 / etc / systemd / system에 직접 작성한 다음 rc.local 파일을 직접 사용하는 대신 systemctl enable 메서드를 사용하여 설정하고 시작하는 것이 좋습니다!

새 버전의 systemd와 호환되는 방법이 있습니까? 물론 이것이 rc-local.service 서비스의 기능입니다. 이 서비스는 시작할 필요가 없으며 /etc/rc.d/rc.local에이 서비스를 시작할지 여부를 결정하는 실행 권한이 있는지 여부를 결정합니다.

#1、先看一下 /etc/rc.d/rc.local 的权限,然后检查一下 multi-user.target 有没有这个服务
[root@li lib]# ll /etc/rc.d/rc.local
-rw-r--r--. 1 root root 473 8月   7 01:30 /etc/rc.d/rc.local

[root@li lib]# systemctl status rc-local.service
● rc-local.service - /etc/rc.d/rc.local Compatibility
   Loaded: loaded (/usr/lib/systemd/system/rc-local.service; static; vendor preset: disabled)
   Active: inactive (dead)
[root@li lib]# systemctl list-dependencies multi-user.target | grep rc-local
#明明就有这个服务,但是 rc.local 不具有执行的权限,因此这个服务不会被执行

#2、加入 x 权限后,再看一下 rc-local 是否可被执行
[root@li lib]# chmod a+x /etc/rc.d/rc.local; ll /etc/rc.d/rc.local
-rwxr-xr-x. 1 root root 473 8月   7 01:30 /etc/rc.d/rc.local
[root@li lib]# systemctl daemon-reload
[root@li lib]# systemctl list-dependencies multi-user.target | grep rc-local
● ├─rc-local.service		#这个服务确实被记录到启动的环境下了

chmod a + x /etc/rc.d/rc.local을 사용하면 많은 스크립트를 /etc/rc.d/rc.local 파일에 배치 할 수 있으며 시스템은 시스템이 부팅 될 때마다이 파일의 파일을 실행합니다. 교수.

1.3.5 부팅 프로세스에 사용되는 주요 구성 파일

기본적으로 systemd에는 자체 구성 파일 처리 방법이 있지만 systemV와 호환되기 위해 많은 스크립트 설정은 여전히 ​​/ etc / sysconfig /에있는 환경 구성 파일을 읽습니다. 공통 구성 파일 :

  • 모듈 정보 : /etc/modprode.d/ .conf 및 /etc/modules-load.d/ .conf

    사실, 모듈 로딩 문제를 다룰 두 곳이 있습니다 :

    • /etc/modprode.d/*.conf : 단순히 모듈을로드 할 커널의 위치를 ​​원합니다.
    • /etc/modules-load.d/*.conf : 모듈 매개 변수의 위치를 ​​추가 할 수 있습니다.
  • / etc / sysconfig / *

    • authconfig

      이 파일은 주로 로컬 / etc / passwd, / etc / shadow 등을 사용할지 여부와 / etc / shadow 암호 레코드에 사용되는 알고리즘 암호화를 포함하여 사용자의 신원 인증 메커니즘을 규제하는 데 사용됩니다.

    • cpupower

      이 파일은 cpupower.service 서비스가 시작될 때 읽 힙니다.

    • firewalld , iptables-config , etables-config

      방화벽 관련 매개 변수

    • 네트워크 스크립트 /

이 파일은 주로 로컬 / etc / passwd, / etc / shadow 등을 사용할지 여부와 / etc / shadow 비밀번호 레코드를 암호화하는 알고리즘을 포함하여 사용자의 신원 인증 메커니즘을 규제합니다.

  • cpupower

    이 파일은 cpupower.service 서비스가 시작될 때 읽 힙니다.

  • firewalld , iptables-config , etables-config

    방화벽 관련 매개 변수

  • 네트워크 스크립트 /

    네트워크 카드 설정 매개 변수

추천

출처blog.csdn.net/qq_36879493/article/details/108183869