최소한으로바쁜 상자init
Linux 시스템을 기반으로 현재 하드웨어의 모든 커널 모듈이 로드되도록 하려면 스크립트에서 어떤 명령을 호출해야 합니까 ?
답변1
하드웨어에 따라 일부 통화가 있을 수 있습니다.버스모듈을 로드합니다. 이 중 대부분은 이미 자동화되어 있습니다. 나는 그것을 통해 가정하고있다 파일 시스템 초기화,udev/mdev,할더,시스템 초기화, 등...
모듈을 수동으로 로드하는 한 가지 방법은 modprobe
모든 종속성을 처리하는 모듈을 호출하는 것입니다.
예를 들어:
# modprobe snd_pcm
내 경우에는 사운드를 생성하는 데 필요한 모든 모듈을 로드합니다.
모든 종속성이 먼저 modprobe
로드됩니다 snd_hda_core
. 이것이 이유 snd_hda_core
의 일부 입니다 snd_pcm
.
$ lsmod | grep ^snd_hda_core
snd_hda_core 110592 5 snd_hda_codec_generic,snd_hda_codec_hdmi,snd_hda_intel,snd_hda_codec,snd_hda_codec_realtek
그 후 모든 snd_pcm
종속성은 modprobe
.
$ lsmod | grep ^snd_pcm
snd_pcm 135168 10 snd_hda_codec_hdmi,snd_hda_intel,snd_usb_audio,snd_hda_codec,soundwire_intel,snd_compress,snd_soc_core,snd_hda_core,snd_pcm_dmaengine
기본적으로 일부 모듈을 로드하는 파일이 /etc/modules-load.d/
포함 된 폴더가 있습니다 . *.conf
이것은 필요한 모든 작업을 수행하므로 초기화 스크립트를 작성할 필요가 없습니다...
$ cat /etc/modules-load.d/local.conf
vfio_pci
asus-wmi-sensors
tun
즉, 모든 모듈을 로드하려면 한 번의 호출이나 하나의 파일만 필요합니다.
modprobe 맨페이지...
modprobe에는 modprobe와 함께 제공되는 해당 depmod 유틸리티에서 생성된 최신 module.dep.bin 파일이 필요합니다(depmod(8) 참조). 이 파일은 각 모듈에 필요한 다른 모듈(있는 경우)을 나열하고 modprobe에서 이러한 종속성을 자동으로 추가하거나 제거하는 데 사용됩니다.
depmod 맨페이지...
Linux 커널 모듈은 다른 모듈에서 사용할 수 있는 서비스("기호"라고 함)를 제공할 수 있습니다(코드의 EXPORT_SYMBOL 변형 중 하나 사용). 두 번째 모듈이 이 기호를 사용하는 경우 해당 두 번째 모듈은 분명히 첫 번째 모듈에 종속됩니다. 이러한 종속성은 상당히 복잡해질 수 있습니다.
depmod는 /lib/modules/version 아래의 각 모듈을 읽고 내보낼 기호와 필요한 기호를 결정하여 모듈 종속성 목록을 만듭니다. 기본적으로 이 목록은 동일한 디렉터리에 있는 module.dep 및 module.dep.bin이라는 이진 해시 버전에 기록됩니다.
###################
다음에 추가
그것을 지적한 후에는 그 뒤에 숨겨진 마법을 설명해야 합니다. 노력해야 하는데 좀 애매하네요.
내 GPU 중 하나를 살펴보겠습니다.
다음 예는 다음과 같습니다.모델리아내 GPU와별명모듈 정의가 겹칩니다.
$ lspci
...
0b:00.0 VGA compatible controller: NVIDIA Corporation GP102 [GeForce GTX 1080 Ti] (rev a1)
...
$ cat /sys/bus/pci/devices/0000:0b:00.0/modalias
pci:v000010DEd00001B06sv00001462sd00003607bc03sc00i00
$ modinfo nvidia
...
alias: pci:v000010DEd*sv*sd*bc03sc02i00*
alias: pci:v000010DEd*sv*sd*bc03sc00i00*
depends: i2c-core,drm
...
lspci 맨페이지...
커널 모듈이 장치를 처리할 수 있다고 보고합니다.
이 부분은 나에게 조금 낯설고 추측할 수밖에 없었다.
어쨌든 지금까지 모은 정보를 바탕으로 이 정보를 바탕으로 모듈을 구성하는 방법은 두 가지로 알고 있습니다.
첫 번째 방법(시작 시)...
echo "alias $(cat /sys/bus/pci/devices/0000:0b:00.0/modalias) nvidia" >> /etc/modprobe.d/default.conf
두 번째 방법(런타임)...
echo "0000:0b:00.0" > /sys/bus/pci/drivers/nvidia/bind
이것엔비디아폴더는 임의의 모듈 이름 중 하나일 수 있습니다. 예를 들어 내가 지정할 수 있습니다.vfio-pci대신 폴더.
echo "0000:0b:00.0" > /sys/bus/pci/drivers/nvidia/unbind
echo "0000:0b:00.0" > /sys/bus/pci/drivers/vfio-pci/bind
이는 단지 예시일 뿐이며 GPU 모듈은 시작 시에만 로드될 수 있으므로 실제 환경에서는 작동하지 않습니다.
답변2
일부 드라이버가 커널에 내장되어 있고 다른 드라이버가 depmod
생성된 모든 관련 메타데이터와 함께 커널 모듈로 나타나는 최소한의 initramfs를 가정하고 조금 더 깊이 파고든 결과는 다음과 같습니다.
커널에 내장된 드라이버는 /init
호출하기 전에 로드됩니다.
/init
모듈로 구축된 드라이버는 다음과 같이 로드해야 합니다.
- 먼저 설치해야 합니다
/sys
./proc
- 그런 다음 기존 하드웨어를 검색하고 관련 커널 모듈을 로드해야 합니다.
하드웨어 스캐닝과 모듈 로딩은 일반적으로 간단한 프로그램을 통해 수행되어야 합니다.mdev -s
옮기다.
안타깝게도마땅한 역할을 하지 않았다. 따라서 이 프로세스가 강제로 발생하도록 호출해야 합니다 find /sys/ -name modalias | xargs sort -u | xargs -n 1 modprobe
.
그런 다음 현재 하드웨어(및 해당 종속성)에 대한 모든 드라이버가 로드되고 초기화됩니다.