답변:
커널은 새로운 장치를 감지하면 프로그램을 실행 modprobe
하고 장치를 식별하는 이름을 전달합니다. 대부분의 장치는 공급 업체 및 모델의 등록 번호 (예 : PCI 또는 USB 식별자)를 통해 식별됩니다. modprobe
프로그램은 모듈 별칭 테이블을 참조합니다 특정 장치의 드라이버를 포함하는 파일의 이름을 찾을 수 있습니다. 파일 시스템 및 암호화 알고리즘과 같은 하드웨어 장치가 아닌 드라이버에 대해서도 유사한 원칙이 적용됩니다. 자세한 내용은 재부팅 후 데비안이 직렬 PCI 카드를 감지하지 못함을 참조하십시오/lib/modules/VERSION/modules.alias
modprobe가 .ko
요청한 드라이버를 포함 하는 모듈 파일 ( ) 을 식별 하면 모듈 파일을 커널에 로드 합니다. 모듈 코드는 동적으로 커널에 로드 됩니다. 모듈이 성공적으로로드되면의 목록에 나타납니다 lsmod
.
모듈의 자동 로딩은 커널이 새로운 핫 플러그 가능 하드웨어를 감지 할 때 발생합니다 (예 : USB 주변 장치 연결). 또한 운영 체제는 부팅시 존재하는 주변 장치에 대한 드라이버를로드하기 위해 시작 중에 시스템에있는 모든 하드웨어를 열거하는 과정을 거칩니다.
modprobe
또는 insmod
명령 을 사용하여 모듈로드를 수동으로 요청할 수도 있습니다 . 대부분의 배포에는에 나열된 모듈을로드하는 시작 스크립트가 포함되어 있습니다 /etc/modules
. 모듈을로드하는 또 다른 방법은 모듈이 모듈의 종속성 인 경우입니다. 모듈 A가 모듈 B에 의존하는 경우 A를 modprobe A
로드하기 전에 B를로드합니다.
일단 모듈이로드되면 해당 드라이버를 사용하는 모든 장치의 연결이 해제 된 경우에도 명시 적으로 언로드 될 때까지로드 된 상태로 유지됩니다. 오래 전에 사용되지 않은 모듈을 자동으로 언로드하는 메커니즘이 있었지만, udev가 등장했을 때 올바르게 기억하면 제거되었습니다. 자동 모듈 언로드는 일반적으로 필요한 기능이 아니라고 생각합니다.이 시스템을 필요로하는 시스템은 대부분 메모리 크기가 많은 데스크탑 PC (드라이버 코드 규모)이기 때문입니다.
/etc/modules
경우 예, 아마도 모듈이로드 된 이유는 장치가 어느 시점에 있었기 때문일 수 있습니다.
시스템 은 initrd라고 하는 초기 RAM 디스크 를 통해 시스템이 부팅 될 때로드됩니다 . 이론적 근거는 다음과 같이 진술한다 :
많은 Linux 배포판은 단일 일반 Linux 커널 이미지를 제공합니다. 배포판 개발자는 다양한 하드웨어에서 부팅하기 위해 특별히 생성합니다. 이 일반 커널 이미지의 장치 드라이버는로드 가능한 커널 모듈로 포함됩니다. 많은 드라이버를 하나의 커널로 정적으로 컴파일하면 커널 이미지가 훨씬 커지고 메모리가 제한된 컴퓨터에서 부팅하기에는 너무 커집니다. 그러면 부팅시 루트 파일 시스템을 마운트하는 데 필요한 모듈을 감지하고로드하거나 루트 파일 시스템의 위치 또는 위치를 결정하는 문제가 발생합니다.
우분투는 다른 많은 배포판과 마찬가지로 드라이버가 필요한지 여부와 장치가 시스템에 있는지 여부에 관계없이 모든 장치 드라이버를이 initrd에로드하도록 선택합니다. Giles가 지적했듯이 모든 것이 RAM에로드 된 다음 시작시 사용 된 모듈이 감지되고 사용되지 않은 모듈은 RAM에서 제거됩니다. 이 방법을 사용하면 설정에 관계없이 Ubuntu가 항상 모든 시스템에서 시작됩니다. 우분투는 마이크로 커널 구성을 사용하여 모 놀리 식 커널을 모방하고 있습니다. 이것이 작동하는 이유를 보십시오
rt2800usb
에 모듈이 포함되어 있기 때문에 모듈 은 항상 부팅시로드 됩니다. initramfs는 initrd의 후속 버전이므로 항상로 표시됩니다 . 다음에 모듈 이름 을 사용하여 새로 컴파일 된 모듈을 커널에 삽입 할 수 있습니다 .lsmod
modprobe
테스트로 무선 어댑터를 분리 한 상태에서 시스템을 재부팅하십시오. lsmod
부팅이 완료되면 initramfs에 의해 감지 프로세스가 시작되고 초기화 시스템이 프로빙 중에 장치를 찾지 못하고 RAM에서 모듈이 제거 되었기 때문에 모듈이 모두 제대로 작동하면 s 출력 에 모듈이 나열 되지 않습니다.
rmmod
, 또는 명령과 같은 명령을 사용할 수 있습니다 modprobe -r
. 다음 부팅시 모듈이 다시로드됩니다. 위 참조. 대부분의 경우, 모듈은 동적으로 제거되지 않으므로 핫 플러깅이 비활성화됩니다. 즉, 일단 모듈을 제거한 후에는 다시 연결할 때 다시 감지 할 수 없습니다.에서 모듈을 제거 lsmod
하려면 선택한 모듈없이 커널을 다시 컴파일 한 후 이미지를 다시 빌드하여 생성 된 initramfs 이미지에서 해당 모듈을 제거 해야합니다. 이렇게하면 해당 모듈의 모든 감지가 비활성화됩니다.
/sys
하고 시스템에서 실제로 발견 된 장치의 드라이버를로드하여로드됩니다. 이것은 부팅시 장치가 있는지 또는 나중에 핫 플러그되어 있는지에 관계없이 발생합니다. udev
initramfs / initrd보다 훨씬 더 많은 관련이 있으며, 전부, 대부분 또는 일부 모듈 만 initramfs에 복사되는지 여부 (의 구성 옵션 /etc/initramfs-tools/initramfs.conf
)는 특별히 관련이 없습니다.
/etc/modules
.rt2800usb
의 출력에 있으며lsmod
, 부팅 후 장치를 컴퓨터에 연결했음을 의미합니까?