드라이버 모듈이 자동으로로드 및 언로드됩니까?


15

Ubuntu 14.04에서 외부 무선 어댑터를 연결하지 않은 경우 해당 모듈 rt2800usb이 여전히에 표시됩니다 lsmod.

  1. 드라이버 모듈 자동로드는 언제 발생합니까? 장치가 컴퓨터에 연결되어 있거나 OS가 부팅 될 때입니까?

  2. 드라이버 모듈 자동 언로드는 언제 발생합니까? 장치와 컴퓨터의 연결이 끊어 졌거나 OS가 종료되었을 때입니까?

답변:


13

커널은 새로운 장치를 감지하면 프로그램을 실행 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. rt2800usb의 출력에 있으며 lsmod, 부팅 후 장치를 컴퓨터에 연결했음을 의미합니까?
Tim

1
@Tim 모듈이로드되어 있고 명시 적으로로드하지 않았고에 나열되지 않은 /etc/modules경우 예, 아마도 모듈이로드 된 이유는 장치가 어느 시점에 있었기 때문일 수 있습니다.
Gilles 'SO- 악마 그만해'

5

시스템 은 initrd라고 하는 초기 RAM 디스크 를 통해 시스템이 부팅 될 때로드됩니다 . 이론적 근거는 다음과 같이 진술한다 :

많은 Linux 배포판은 단일 일반 Linux 커널 이미지를 제공합니다. 배포판 개발자는 다양한 하드웨어에서 부팅하기 위해 특별히 생성합니다. 이 일반 커널 이미지의 장치 드라이버는로드 가능한 커널 모듈로 포함됩니다. 많은 드라이버를 하나의 커널로 정적으로 컴파일하면 커널 이미지가 훨씬 커지고 메모리가 제한된 컴퓨터에서 부팅하기에는 너무 커집니다. 그러면 부팅시 루트 파일 시스템을 마운트하는 데 필요한 모듈을 감지하고로드하거나 루트 파일 시스템의 위치 또는 위치를 결정하는 문제가 발생합니다.

우분투는 다른 많은 배포판과 마찬가지로 드라이버가 필요한지 여부와 장치가 시스템에 있는지 여부에 관계없이 모든 장치 드라이버를이 initrd에로드하도록 선택합니다. Giles가 지적했듯이 모든 것이 RAM에로드 된 다음 시작시 사용 된 모듈이 감지되고 사용되지 않은 모듈은 RAM에서 제거됩니다. 이 방법을 사용하면 설정에 관계없이 Ubuntu가 항상 모든 시스템에서 시작됩니다. 우분투는 마이크로 커널 구성을 사용하여 모 놀리 식 커널을 모방하고 있습니다. 이것이 작동하는 이유를 보십시오


  1. Gilles가 참조한 initramfsrt2800usb 에 모듈이 포함되어 있기 때문에 모듈 은 항상 부팅시로드 됩니다. initramfs는 initrd의 후속 버전이므로 항상로 표시됩니다 . 다음에 모듈 이름 을 사용하여 새로 컴파일 된 모듈을 커널에 삽입 할 수 있습니다 .lsmodmodprobe

테스트로 무선 어댑터를 분리 한 상태에서 시스템을 재부팅하십시오. lsmod부팅이 완료되면 initramfs에 의해 감지 프로세스가 시작되고 초기화 시스템이 프로빙 중에 장치를 찾지 못하고 RAM에서 모듈이 제거 되었기 때문에 모듈이 모두 제대로 작동하면 s 출력 에 모듈이 나열 되지 않습니다.

  1. 시스템이 실행되는 동안 모듈을 제거하려면 rmmod, 또는 명령과 같은 명령을 사용할 수 있습니다 modprobe -r. 다음 부팅시 모듈이 다시로드됩니다. 위 참조. 대부분의 경우, 모듈은 동적으로 제거되지 않으므로 핫 플러깅이 비활성화됩니다. 즉, 일단 모듈을 제거한 후에는 다시 연결할 때 다시 감지 할 수 없습니다.

에서 모듈을 제거 lsmod하려면 선택한 모듈없이 커널을 다시 컴파일 한 후 이미지를 다시 빌드하여 생성 된 initramfs 이미지에서 해당 모듈을 제거 해야합니다. 이렇게하면 해당 모듈의 모든 감지가 비활성화됩니다.


3
RAM 디스크의 일부로 파일을 RAM에로드하고 모듈을 실행중인 커널에로드 (동적으로 링크)하는 것을 혼동하고 있습니다. 모듈은 initrd (현재는 initramfs)에서 커널이 아닌 메모리에 임시로로드되지만 실제 루트가 마운트 된 후 메모리에서 제거됩니다. 모듈은 모듈을 사용하는 장치가 감지 될 때만 커널에로드됩니다 (몇 가지 예외가 있음).
Gilles 'SO- 악마 그만'

여기에 동의하지만, 그는 Ubuntu RAM 디스크를 재구성하도록 선택하지 않으면 수행 할 수없는 하나의 모듈 언로드 및로드에 대해 이야기하고있었습니다. Ubuntu는 커널 업데이트마다 RAM에 모든 모듈을로드하도록 선택하기 때문에 권장되지 않습니다. 모든 모듈은 매번로드되며 모두 사용되지는 않습니다.
eyoung100

2
아니오, 문제는 모듈을 커널에로드 및 언로드하는 것입니다. 원래 답변이나 수정 된 답변 모두 해결되지 않습니다. initramfs는이 질문과 관련이 없거나 (또는 ​​대부분 주변 적으로 관련이 있습니다)
Gilles 'SO- 악의를 멈춰라'

@Gilles이게 더 낫습니까 ??
eyoung100

1
@ eyoung100, 나는 Gilles에 동의합니다. initramfs에 대한 토론은 질문과 관련이 없습니다. 모듈은 일반적으로 장치를 열거 /sys하고 시스템에서 실제로 발견 된 장치의 드라이버를로드하여로드됩니다. 이것은 부팅시 장치가 있는지 또는 나중에 핫 플러그되어 있는지에 관계없이 발생합니다. udevinitramfs / initrd보다 훨씬 더 많은 관련이 있으며, 전부, 대부분 또는 일부 모듈 만 initramfs에 복사되는지 여부 (의 구성 옵션 /etc/initramfs-tools/initramfs.conf)는 특별히 관련이 없습니다.
Celada
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.