시작 시 Linux 커널 모듈이 로드되는 순서는 무엇입니까? 그들의 우선순위는 무엇입니까?

시작 시 Linux 커널 모듈이 로드되는 순서는 무엇입니까? 그들의 우선순위는 무엇입니까?

동적으로 컴파일된 Linux 커널 모듈이 있습니다. 시작에 어떻게 추가하나요? 그 안에는 많은 .ko파일이 있습니다 /lib/modules. 이러한 모듈을 로드하는 우선순위를 어떻게 설정할 수 있나요?

답변1

대부분은 결국 부팅 중에 로드되지만 시작 시나 다른 시점에는 자동으로 로드되지 않습니다. 이러한 일이 발생할 수 있는 세 가지 메커니즘이 있습니다.

  • 사용자 공간 요청:여기에는 init 서비스부터 udev, 명령줄까지 모든 것이 포함됩니다. 시작 시 특정 모듈을 로드하려는 경우 Init 또는 udev가 아마도 가장 간단한 방법일 것입니다.

  • 핫스왑 가능한 장치:USB나 PCI 같은 것에 연결하면 커널은 이를 감지하고 장치가 자신을 식별하는 방식에 따라 적절한 모듈을 요청합니다.

  • 필수 프로토콜 또는 기타 구현: 커널이 어떤 작업(예: 파일 시스템 읽기)을 수행해야 하고 이를 수행할 지식이 부족하다는 것을 발견하면 모듈을 요청합니다.

마지막 두 가지에 대해서는 "요청 모듈"이라는 문구를 사용했습니다. 이는 Wolfgang Mauerer에 따르면 ) 명령문을 kmod실행하는 사용자 공간 데몬을 통해 커널이 실제로 로드되기 때문입니다./sbin/modprobe리눅스 커널 아키텍처2.6 커널에는 내장 함수에 대한 호출이 약 100 request_module()개 밖에 없습니다.

modprobe설치된 MODULE_ALIAS의 데이터베이스를 사용합니다. 이는 모듈 소스 코드에 명시적으로 지정되거나 모듈에서 제공하는 OEM 장치 ID 목록인 모듈의 MODULE_DEVICE_TABLE에서 파생됩니다.

답변2

사용할 수 있도록 많은 시스템이 구축되어 있습니다.initrd 또는 initramfs. 이는 부트 로더에 의해 로드되고 루트 파티션이 마운트되기 전에 커널에서 사용할 수 있는 파일 시스템 이미지입니다. 이를 통해 루트 파티션(디스크 드라이버, 파일 시스템 드라이버, 장치 매퍼 또는 논리 볼륨 드라이버 등)을 마운트하는 데 필요한 드라이버를 모듈로 컴파일하고 initrd/initramfs에서 로드할 수 있습니다.

initrd( /linuxrc) 또는 initramfs( ) /init의 시작 스크립트는 일반적으로 일부 모듈을 로드하고 루트 파일 시스템을 찾습니다. 각 배포판에는 고유한 설정이 있습니다. 우분투는파일 시스템 초기화이는 initramfs-tools패키지의 구성 요소로 조립되며 루트 파일 시스템을 설치하는 데 필요한 드라이버를 기반으로 각 커널에 대해 다시 빌드됩니다.

/etc/modules루트 파일 시스템이 마운트된 후 (Debian, ...) 또는 (Red Hat, Arch, ...)에 나열된 모듈이 시스템 부팅 중에 로드됩니다 . /etc/modules.conf이 파일에는 일반적으로 여러 모듈(있는 경우)이 나열됩니다. 대부분의 모듈은 요청 시 로드됩니다.

커널이 일부 하드웨어에 드라이버나 다른 구성 요소(예: 네트워크 프로토콜 또는 암호화 알고리즘)가 누락되었음을 감지하면 /sbin/modprobe로드 모듈을 호출합니다. 하드웨어 드라이버의 경우 커널은 하드웨어의 PCI ID, USB ID 또는 기타 시스템 이름을 인코딩하는 이름을 전달합니다. /lib/modules/$VERSION/modules.alias이러한 시스템 이름을 모듈 이름에 매핑하는 테이블이 있습니다 . 테이블은 depmod에 의해 생성되고 읽혀집니다 modprobe.

하드웨어 장치용으로 수동으로 컴파일된 추가 커널 모듈이 있는 경우 해당 모듈을 여기에 넣고 /lib/modules/$VERSION/local( local없으면 하위 디렉터리 만들기) 실행하여 depmod -a별칭 데이터베이스를 다시 생성합니다. 모듈이 커널이 자동으로 감지할 수 없는 비정상적인 기능에 사용되는 경우 이를 에 넣고 /lib/modules/$VERSION/local실행하여 depmod -a종속성을 분석한 다음 모듈 이름을 에 추가합니다 /etc/modules.

관련 정보