커널모듈(kernel module) 통합관리를 위한 modprobe 활용하기
작성자 정보
- 관리자 작성
- 작성일
컨텐츠 정보
- 2,781 조회
- 0 추천
- 목록
본문
커널모듈(kernel module) 통합관리를 위한 modprobe 활용하기
이번에는 리눅스 커널모듈들을 관리할 수 있는 modprobe에 대해서 배워보도록 할 것이다.
한마디로 modprobe명령어는 커널모듈을 관리하기 위한 명령어이다.
쉽게 표현해서 모듈의존성을 참조하여 모듈을 제거하거나 로드 할 수 있으며 모듈리스트를 확인할 수도있고, 모듈설정파일을 확인할 수도 있다.
지금까지는 커널모듈에 관한 작업들을 용도에 따라서 커널모듈 로드작업은 insmod, 커널모듈 제거작업은rmmod, 그리고 로드되어있는 커널모듈 확인작업은 lsmod로 각각 나누어서 사용하였다.
이번에 우리가 배우게 될 modprobe명령어는 지금까지 개별적으로 각각의 용도에 따라서 사용했던 모듈제거, 모듈설치, 모듈리스트 확인, autoclean태그설정등과 같은 커널모듈관련작업들을 모두 modprobe명령어 하나로 하게 된다.
이것이 이번에 우리가 배워야 할 내용이기도 한다.
명심해야 할 것은 modprobe명령어의 가장 궁극적인 용도는 커널과 의존관계에 있는 각 커널모듈들을 modules.dep파일을 참조하여 메모리로 로드(load)하거나 내리(unload)는 역할을 하는 것이다.
그렇다면 이번 장을 공부하기에 앞서 커널모듈(Kernel Module)의 개념에 대해서 잠깐 정리하도록하겠다.
이것이 커널모듈관련 작업을 하려는데 커널모듈이 무엇인지는 알아야 하기 때문이다.
즉 커널모듈이란 필요에 의해서 kernel이 load하여 사용할 수도 있고 불필요해졌을 때에 unload할 수도 있는 한마디로 “기능형 착탈식 프로그램”(필자가 애써 만든 용어이다.
정식이름이 아님)이라고 할 수 있다.
이런 커널모듈은 수없이 많다.
하지만 많이 사용되고 꼭 필요한 기능들은 이미 kernel내에 내장(built-in)되어 있다.
그리고 커널컴파일을 하면 내장되어있지 않은 커널모듈들도 kernel에 내장해서 사용할 수 있다.
kernel에 내장하고 하지 않고는 전적으로 시스템관리자의 선택과 역량에 달려있다고 할 수 있다.
다음은 커널모듈의 작업에 관한 내용을 간략히 정리한 것이다.
① 부팅 중 자동으로 모듈을 메모리로 로딩하려면 /etc/rc.d/rc.local파일이나 또는 /etc/modules.conf파일에 설정한다.
② 커널모듈파일들의 저장위치는 /lib/modules/<커널버전>/이다.
예를들어 현재 필자의 시스템의 커널모듈파일위치는 “/lib/modules/2.6.27.5-117.fc10.i686”이다.
이 디렉토리내에는 용도에 맞는 각각의 커널모듈들이 별도로 저장되어있다.
예를들어 네트워크 커널모듈들에 관한 저장위치는 /lib/modules/<커널모듈>/net/이다.
③ 현재 로드되어있는(즉 현재 메모리에 로드되어있는) 커널모듈들을 확인하는 방법은 lsmod를 실행한다.
④ 현재 로드되어있는 커널모듈을 제거(커널모듈 내리기)하려면 “rmmod <모듈명>”과 같이 실행한다.
⑤ 현재 로드되어있지 않은 커널모듈을 로드하려면(메모리에 모듈을 올리려면) “modprobe <모듈명>”과 같이 실행하면 된다.
특정커널모듈 로드하기(modprobe)
커널모듈을 로드한다는 의미는 커널모듈파일을 활성화한다는 의미이며 커널이 사용할 수 있도록 메모리로 올린다는 의미가 된다.
즉 현재 로드되어있지 않은 커널모듈들을 활성화하는 즉 커널모듈을 로드하는 예를 보겠다.
먼저, bridge라는 모듈이 로드되어있는가를 확인하기 위하여 다음과 같이 lsmod를 실행해 보았다.
보는바와 같이 bridge라는 모듈은 현재 로드되어 있지 않다.
[root@RockyLinux ~]# lsmod | grep bridge bridge 315392 1 br_netfilter stp 16384 1 bridge llc 16384 2 bridge,stp [root@RockyLinux ~]# |
다음은 bridge라는 모듈을 커널이 사용할 수 있도록 modprobe명령어를 이용하여 로드하였다.
특정커널모듈을 로드 할 때에는 modprobe명령어에 -a라는 옵션을 사용한다.
이렇게 로드 한 다음 lsmod를 사용하여 로드되었는가를 확인하였다.
[root@RockyLinux ~]# modprobe -a bridge [root@RockyLinux ~]# [root@RockyLinux ~]# lsmod | grep bridge bridge 315392 1 br_netfilter stp 16384 1 bridge llc 16384 2 bridge,stp [root@RockyLinux ~]# |
그 결과 bridge라는 모듈의 로드된 내용이 출력되었다.
이제 커널은 bridge라는 모듈관련 작업요청을 받게되면 이 모듈을 사용할 수 있게 된 것이다.
앞의 예에서는 특정모듈 하나만을 로드 한 예를 보았다.
이번에는 여러개의 모듈을 동시에 로드하는 예를 보겠다.
즉 modprobe를 이용하면 특정커널모듈 하나만을 로드할 수도 있고, 여러개의 커널모듈을 동시에 로드 할 수도 있다.
이번 예를 위하여 먼저 lsmod를 이용하여 snd_pcm_oss모듈과 floppy라는 모듈이 로드되었는가를 확인하였다.
그 결과 로드되어 있지 않다는 것을 알 수 있다.
[root@sulinux ~]# lsmod | grep snd_pcm_oss [root@sulinux ~]# [root@sulinux ~]# lsmod | grep floppy [root@sulinux ~]# |
그래서 이번에는 modprobe를 이용하여 snd_pcm_oss모듈과 floppy모듈을 로드하였다.
그런 다음 lsmod를 이용하여 로드 되었는가를 확인하였다.
[root@sulinux ~]# modprobe -a snd_pcm_oss floppy [root@sulinux ~]# [root@sulinux ~]# lsmod | grep floppy floppy 51988 0 [root@sulinux ~]# lsmod | grep snd_pcm_oss
snd_pcm_oss 42496 0 snd_mixer_oss 16896 1 snd_pcm_oss snd_pcm 65924 3 snd_pcm_oss,snd_ens1371,snd_ac97_codec snd 50616 11 snd_pcm_oss,snd_mixer_oss,snd_ens1371,snd_rawmidi,snd_seq_device,snd_pcm,snd_timer [root@sulinux ~]# |
그 결과 위 2개의 모듈은 로드되었으며 이 모듈이 갖고있는 기능이 요구되었을 경우에 모듈은 이모듈을 직접 사용하게 된다.
이와 같이 특정커널모듈을 로드 할 수 있다는 것을 배웠다.
이어서 이렇게 로드 한 커널모듈을 제거하는 방법에 대해서 알아보겠다.
현재 로드되어있는 모듈 제거하기(modprobe)
modprobe명령어로 현재 로드되어있는 특정커널모듈을 제거할 수 있다.
즉 modprobe명령어에 -r옵션을 사용하면 지정한 모듈을 제거할 수 있다.
특정 모듈을 제거할 때에는 “modprobe -r 모듈명”과 같은 형식으로 사용한다.
다음의 예는 현재 필자가 사용하고있는 리눅스 시스템에 로드되어있는 모듈들 중 특정 모듈을 제거하는 예이다.
먼저 lsmod로 현재 로드되어있는 모듈들을 아래와 같이 확인하였다.
[root@sulinux ~]# lsmod
Module Size Used by sco 12932 2 bridge 43668 0
stp 6148 1 bridge bnep 14848 2 l2cap 21504 3 bnep bluetooth 48608 5 sco,bnep,l2cap sunrpc 155924 3 ip6t_REJECT 7296 2 nf_conntrack_ipv6 15864 2 ip6table_filter 6400 1 ip6_tables 14736 1 ip6table_filter ipv6 230132 20 ip6t_REJECT,nf_conntrack_ipv6 dm_multipath 17164 0 uinput 10624 0 snd_ens1371 24196 0 gameport 13452 1 snd_ens1371 snd_rawmidi 22528 1 snd_ens1371 snd_ac97_codec 95264 1 snd_ens1371 ac97_bus 5504 1 snd_ac97_codec snd_seq_dummy 6660 0 snd_seq_oss 30364 0 snd_seq_midi_event 9600 1 snd_seq_oss snd_seq 48576 5 snd_seq_dummy,snd_seq_oss,snd_seq_midi_event snd_seq_device 10124 4 snd_rawmidi,snd_seq_dummy,snd_seq_oss,snd_seq snd_pcm_oss 42496 0
snd_mixer_oss 16896 1 snd_pcm_oss snd_pcm 65924 3 snd_ens1371,snd_ac97_codec,snd_pcm_oss snd_timer 22024 2 snd_seq,snd_pcm snd 50616 11 snd_ens1371,snd_rawmidi,snd_ac97_codec,snd_pcm_oss,snd_mixer_oss,snd_pcm,snd_timer i2c_piix4 12688 0 soundcore 9416 1 snd snd_page_alloc 11016 1 snd_pcm ppdev 10372 0 pcnet32 31476 0 i2c_core 21396 1 i2c_piix4 mii 8192 1 pcnet32 parport_pc 25620 0 pcspkr 6272 0 floppy 51988 0
parport 31956 2 ppdev,parport_pc mptspi 18824 4 mptscsih 30848 1 mptspi mptbase 68052 2 mptspi,mptscsih scsi_transport_spi 21760 1 mptspi [root@sulinux ~]# |
위의 lsmod의 실행결과 Used항목의 값이 0 커널모듈은 현재 로드되어있으나 사용되지 않고 있다는 것을 의미하는 것이다.
따라서 Used항목의 값이 0인 커널모듈들 가운데 bridge모듈과 snd_pcm_oss모듈, 그리고 floppy모듈들을 제거해보겠다.
[root@sulinux ~]# modprobe -r bridge [root@sulinux ~]# [root@sulinux ~]# modprobe -r snd_pcm_oss [root@sulinux ~]# [root@sulinux ~]# modprobe -r floppy [root@sulinux ~]# |
위와 같이 modprobe를 이용하여 현재 사용되지 않고있는 커널모듈 3개를 unload(제거)하였다.
그런 다음 다시 lsmod를 실행하여 확인한 결과 아래와 같이 이미 제거된 3개의 모듈들은 보이지 않는다.
[root@sulinux ~]# lsmod Module Size Used by sco 12932 2 bnep 14848 2 l2cap 21504 3 bnep bluetooth 48608 5 sco,bnep,l2cap sunrpc 155924 3 ip6t_REJECT 7296 2 nf_conntrack_ipv6 15864 2 ip6table_filter 6400 1 ip6_tables 14736 1 ip6table_filter ipv6 230132 20 ip6t_REJECT,nf_conntrack_ipv6 dm_multipath 17164 0 uinput 10624 0 snd_ens1371 24196 0 gameport 13452 1 snd_ens1371 snd_rawmidi 22528 1 snd_ens1371 snd_ac97_codec 95264 1 snd_ens1371 ac97_bus 5504 1 snd_ac97_codec snd_seq_dummy 6660 0 snd_seq_oss 30364 0 snd_seq_midi_event 9600 1 snd_seq_oss snd_seq 48576 5 snd_seq_dummy,snd_seq_oss,snd_seq_midi_event snd_seq_device 10124 4 snd_rawmidi,snd_seq_dummy,snd_seq_oss,snd_seq snd_pcm 65924 2 snd_ens1371,snd_ac97_codec snd_timer 22024 2 snd_seq,snd_pcm snd 50616 9 snd_ens1371,snd_ac97_codec, snd_pcm,snd_timer i2c_piix4 12688 0 soundcore 9416 1 snd snd_page_alloc 11016 1 snd_pcm ppdev 10372 0 pcnet32 31476 0 i2c_core 21396 1 i2c_piix4 mii 8192 1 pcnet32 parport_pc 25620 0 pcspkr 6272 0 parport 31956 2 ppdev,parport_pc mptspi 18824 4 mptscsih 30848 1 mptspi mptbase 68052 2 mptspi,mptscsih scsi_transport_spi 21760 1 mptspi [root@sulinux ~]# |
현재 사용되고 있는 커널모듈 설정 확인하기(modprobe)
다음은 modprobe명령어로 현재 모듈설정파일로 사용하고있는 설정내용을 확인하는 예이다.
즉 modprobe명령어에 -c옵션을 사용하면 현재 모듈 설정내용을 모두 출력해 준다.
아래의 예는 현재 필자가 사용하고있는 리눅스 시스템의 모듈 설정파일을 확인한 결과이다.
이 결과가 굉장히 길어서 앞부분만 나타낸 것이다.
[root@RockyLinux ~]# modprobe -c blacklist i8xx_tco blacklist aty128fb blacklist atyfb blacklist radeonfb blacklist i810fb blacklist cirrusfb blacklist intelfb blacklist kyrofb blacklist i2c_matroxfb blacklist hgafb blacklist nvidiafb blacklist rivafb blacklist savagefb blacklist sstfb blacklist neofb blacklist tridentfb blacklist tdfxfb blacklist virgefb blacklist vga16fb blacklist viafb blacklist hisax blacklist hisax_fcpcipnp blacklist snd_pcsp blacklist chsc_sch install snd_pcm /sbin/modprobe --ignore-install snd-pcm && /sbin/modprobe snd-seq install nf_conntrack /sbin/modprobe --ignore-install nf_conntrack $CMDLINE_OPTS && /sbin/sysctl --quiet --pattern 'net[. ]netfilter[.]nf_conntrack.*' --system install libnvdimm /usr/bin/ndctl load-keys ; /sbin/modprobe --ignore-install libnvdimm $CMDLINE_OPTS options bonding max_bonds=0 options dummy numdummies=0 options vhost max_mem_regions=509 options rd lvm.lv=rl/root options rd lvm.lv=rl/swap softdep ext4 pre: crc32c softdep cifs softdep cifs softdep cifs … 이하생략 |
위의 “modprobe -c”의 출력결과가 너무 많기 때문에 특정 모듈이름에 해당하는 모듈파일정보를 확인하기가 어렵다.
만약 특정모듈에 대한 정보만을 확인하고자 한다면 다음과 같이 grep명령어를 함께 사용하기 바란다.
아래의 예는 “modprobe -c”의 결과 중에서 atp870u라는 모듈명에 해당하는 설정정보를 확인하는 예이다.
[root@sulinux ]# modprobe -c | grep atp870u alias pci:v00001191d00008002sv*sd*bc*sc*i* atp870u alias pci:v00001191d00008010sv*sd*bc*sc*i* atp870u alias pci:v00001191d00008020sv*sd*bc*sc*i* atp870u alias pci:v00001191d00008030sv*sd*bc*sc*i* atp870u alias pci:v00001191d00008040sv*sd*bc*sc*i* atp870u alias pci:v00001191d00008050sv*sd*bc*sc*i* atp870u alias pci:v00001191d00008060sv*sd*bc*sc*i* atp870u alias pci:v00001191d00008080sv*sd*bc*sc*i* atp870u alias pci:v00001191d00008081sv*sd*bc*sc*i* atp870u alias pci:v00001191d0000808Asv*sd*bc*sc*i* atp870u [root@sulinux ]# |
로드된 커널모듈 확인하는 lsmod 활용법
lsmod는 현재 시스템 메모리에 로드(load)되어있는 커널모듈들의 리스트를 출력하는 모듈관련 명령어이다.
출력되는 결과에서 현재 로드(load)되어있는 커널모듈들에 대하여 모듈명, 모듈사이즈, 사용된 횟수, 참조모듈등의 정보를 볼 수 있다.
참고로 리눅스에서 커널모듈정보를 실시간으로 저장하고 있는 파일은 /proc/modules파일이다.
이 파일을 cat명령어로 확인해 보면 현재 커널이 사용할 수 있도록 로드되어있는 커널모듈들에 대한 실시간 정보를 확인할 수 있다.
즉 이번 장에서 설명하고 있는 lsmod명령어는 프락파일시스템(/PROC)의 /proc/modules파일의 내용을 가공하여 보기 좋게 보여주는 명령어이다.
즉 /proc/modules파일에는 현재 메모리에 로드(load)되어있는 모듈들의 정보를 보관하고있는 파일이다.
결론적으로 lsmod를 실행하면 /proc/modules에 저장되어있는 내용을 그대로 보여준다.
아래의 예에서는 “lsmod”와 “cat /proc/modules”의 결과를 모두 볼 수 있다.
다음은 현재 필자가 사용하고있는 리눅스시스템의 커널모듈정보를 확인하기 위하여 “lsmod”를 실행한 예이다.
[root@sulinux ~]# lsmod Module Size Used by ssb 36228 0 autofs 15488 0 sco 12932 2 bridge 43668 0 stp 6148 1 bridge bnep 14848 2 l2cap 21504 3 bnep bluetooth 48608 5 sco,bnep,l2cap sunrpc 155924 3 ip6t_REJECT 7296 2 nf_conntrack_ipv6 15864 2 ip6table_filter 6400 1 ip6_tables 14736 1 ip6table_filter ipv6 230132 20 ip6t_REJECT,nf_conntrack_ipv6 dm_multipath 17164 0 uinput 10624 0 ppdev 10372 0 floppy 51988 0 snd_ens1371 24196 0 pcspkr 6272 0 gameport 13452 1 snd_ens1371 snd_rawmidi 22528 1 snd_ens1371 snd_ac97_codec 95264 1 snd_ens1371 ac97_bus 5504 1 snd_ac97_codec snd_seq_dummy 6660 0 snd_seq_midi_event 9600 0 snd_seq 48576 2 snd_seq_dummy,snd_seq_midi_event snd_seq_device 10124 3 snd_rawmidi,snd_seq_dummy,snd_seq snd_pcm_oss 42496 0 snd_mixer_oss 16896 1 snd_pcm_oss snd_pcm 65924 3 snd_ens1371,snd_ac97_codec,snd_pcm_oss snd_timer 22024 2 snd_seq,snd_pcm snd 50616 10 snd_ens1371,snd_rawmidi,snd_ac97_codec,snd_seq_dummy,snd_seq,snd_mixer_oss,snd_pcm,snd_timer soundcore 9416 1 snd snd_page_alloc 11016 1 snd_pcm pcnet32 31476 0 parport_pc 25620 0 mii 8192 1 pcnet32 parport 31956 2 ppdev,parport_pc i2c_piix4 12688 0 i2c_core 21396 1 i2c_piix4 mptspi 18824 4 mptscsih 30848 1 mptspi mptbase 68052 2 mptspi,mptscsih scsi_transport_spi 21760 1 mptspi [root@sulinux ~]# |
위의 결과를 보면 현재 시스템의 메모리에 로드(load)되어있는 커널모듈들의 여러가지 정보들을 확인할 수 있다.
그리고 다음은 /proc/modules의 내용을 출력한 것이다.
확인해보면 알겠지만 둘의 출력포맷은 좀 다르지만 그 내용은 같다는 것을 알 수 있다.
[root@sulinux ~]# cat /proc/modules ssb 36228 0 - Live 0xf8a70000 autofs 15488 0 - Live 0xf8a6b000 sco 12932 2 - Live 0xf893a000 bridge 43668 0 - Live 0xf8a7a000 stp 6148 1 bridge, Live 0xf8937000 bnep 14848 2 - Live 0xf8a55000 l2cap 21504 3 bnep, Live 0xf8a4e000 bluetooth 48608 5 sco,bnep,l2cap, Live 0xf8a5e000 sunrpc 155924 3 - Live 0xf8ace000 ip6t_REJECT 7296 2 - Live 0xf8910000 nf_conntrack_ipv6 15864 2 - Live 0xf8932000 ip6table_filter 6400 1 - Live 0xf8860000 ip6_tables 14736 1 ip6table_filter, Live 0xf892d000 ipv6 230132 20 ip6t_REJECT,nf_conntrack_ipv6, Live 0xf8a94000 dm_multipath 17164 0 - Live 0xf88e1000 uinput 10624 0 - Live 0xf8900000 ppdev 10372 0 - Live 0xf88fc000 floppy 51988 0 - Live 0xf893f000 snd_ens1371 24196 0 - Live 0xf8905000 pcspkr 6272 0 - Live 0xf888f000 gameport 13452 1 snd_ens1371, Live 0xf88e7000 snd_rawmidi 22528 1 snd_ens1371, Live 0xf88f5000 snd_ac97_codec 95264 1 snd_ens1371, Live 0xf8914000 ac97_bus 5504 1 snd_ac97_codec, Live 0xf8872000 snd_seq_dummy 6660 0 - Live 0xf8846000 snd_seq_midi_event 9600 0 - Live 0xf8893000 snd_seq 48576 2 snd_seq_dummy,snd_seq_midi_event, Live 0xf88b4000 snd_seq_device 10124 3 snd_rawmidi,snd_seq_dummy,snd_seq, Live 0xf886a000 snd_pcm_oss 42496 0 - Live 0xf88d5000 snd_mixer_oss 16896 1 snd_pcm_oss, Live 0xf88ae000 snd_pcm 65924 3 snd_ens1371,snd_ac97_codec,snd_pcm_oss, Live 0xf88c3000 snd_timer 22024 2 snd_seq,snd_pcm, Live 0xf8898000 snd 50616 10 snd_ens1371,snd_rawmidi,snd_ac97_codec,snd_seq_dummy,snd_seq,snd_pcm,snd_timer, Live 0xf88a0000 soundcore 9416 1 snd, Live 0xf886e000 snd_page_alloc 11016 1 snd_pcm, Live 0xf8828000 pcnet32 31476 0 - Live 0xf8886000 parport_pc 25620 0 - Live 0xf887e000 mii 8192 1 pcnet32, Live 0xf8839000 parport 31956 2 ppdev,parport_pc, Live 0xf8875000 i2c_piix4 12688 0 - Live 0xf885b000 i2c_core 21396 1 i2c_piix4, Live 0xf8863000 mptspi 18824 4 - Live 0xf8833000 mptscsih 30848 1 mptspi, Live 0xf883d000 mptbase 68052 2 mptspi,mptscsih, Live 0xf8849000 scsi_transport_spi 21760 1 mptspi, Live 0xf882c000 [root@sulinux ~]# |
커널모듈들은 필요에 의해 메모리에 로드(load)된 후에 사용되었다가 메모리에서 제거될 수도 있다.
따라서 위의 결과는 동일한 시스템에서도 실행시점에 따라서 차이가 있을 수 있다.
참고로 커널모듈을 메모리로 로드하는 명령어는 insmod이며 메모리에서 제거하는 명령어는 rmmod이다.
로드된 커널모듈들을 메모리에서 제거하기(rmmod)
현재 메모리에 로드(load)되어있는 커널모듈들중에 불필요한 모듈들을 메모리에서 제거하기 위해서는 rmmod를 이용한다.
즉 lsmod명령어로 현재 메모리에 로드되어있는 커널모듈들을 확인한 후에 불필요한 모듈을 제거하기 위해서 rmmod명령어를 사용한다.
한가지 반드시 알아둬야 할 것은 대부분의 시스템관리자들이 rmmod명령어 대신에 “modprobe -r”을 사용한다는 점이다.
하지만 rmmod명령어가 먼저 개발되어 사용되었으므로 반드시 알아둬야 할 명령어이다.
불필요한 커널모듈을 제거하기 위해서 먼저 현재 로드되어있는 커널모듈들이 어떤 것들이 있는가를 확인해봐야 한다.
현재 로드되어있는 커널모듈들을 확인하는 명령어는 lsmod이다.
다음 예를 보자.
[root@sulinux ~]# lsmod Module Size Used by ssb 36228 0 autofs 15488 0 sco 12932 2 bridge 43668 0 stp 6148 1 bridge bnep 14848 2 l2cap 21504 3 bnep bluetooth 48608 5 sco,bnep,l2cap sunrpc 155924 3 ip6t_REJECT 7296 2 nf_conntrack_ipv6 15864 2 ip6table_filter 6400 1 ip6_tables 14736 1 ip6table_filter ipv6 230132 20 ip6t_REJECT,nf_conntrack_ipv6 dm_multipath 17164 0 uinput 10624 0 ppdev 10372 0 floppy 51988 0 snd_ens1371 24196 0 pcspkr 6272 0 gameport 13452 1 snd_ens1371 snd_rawmidi 22528 1 snd_ens1371 snd_ac97_codec 95264 1 snd_ens1371 ac97_bus 5504 1 snd_ac97_codec snd_seq_dummy 6660 0 snd_seq_midi_event 9600 0 snd_seq 48576 2 snd_seq_dummy,snd_seq_midi_event snd_seq_device 10124 3 snd_rawmidi,snd_seq_dummy,snd_seq snd_pcm_oss 42496 0 snd_mixer_oss 16896 1 snd_pcm_oss snd_pcm 65924 3 snd_ens1371,snd_ac97_codec,snd_pcm_oss snd_timer 22024 2 snd_seq,snd_pcm snd 50616 10 snd_ens1371,snd_rawmidi,snd_ac97_codec,d_pcm_oss,snd_mixer_oss,snd_pcm,snd_timer soundcore 9416 1 snd snd_page_alloc 11016 1 snd_pcm pcnet32 31476 0 parport_pc 25620 0 mii 8192 1 pcnet32 parport 31956 2 ppdev,parport_pc i2c_piix4 12688 0 i2c_core 21396 1 i2c_piix4 mptspi 18824 4 mptscsih 30848 1 mptspi mptbase 68052 2 mptspi,mptscsih scsi_transport_spi 21760 1 mptspi [root@sulinux ~]# |
위의 리스트들은 현재 로드되어있는 커널모듈 리스트이며 위의 각 모듈들의 정보 값들 중에 Used항목의 값이 0인 것은 현재 커널이 사용하지 않고 있다는 것을 나타낸다.
그렇다면 현재 사용하고있지 않은 커널모듈들 가운데 하나를 제거해보도록 하겠다.
위의 커널모듈들 가운데 ssb모듈과 autofs모듈 두개를 제거해 보겠다.
[root@sulinux ~]# rmmod ssb [root@sulinux ~]# [root@sulinux ~]# rmmod autofs [root@sulinux ~]# [root@sulinux ~]# lsmod Module Size Used by sco 12932 2 bridge 43668 0 stp 6148 1 bridge bnep 14848 2 l2cap 21504 3 bnep bluetooth 48608 5 sco,bnep,l2cap sunrpc 155924 3 ip6t_REJECT 7296 2 nf_conntrack_ipv6 15864 2 ip6table_filter 6400 1 ip6_tables 14736 1 ip6table_filter ipv6 230132 20 ip6t_REJECT,nf_conntrack_ipv6 dm_multipath 17164 0 uinput 10624 0 ppdev 10372 0 floppy 51988 0 snd_ens1371 24196 0 pcspkr 6272 0 gameport 13452 1 snd_ens1371 snd_rawmidi 22528 1 snd_ens1371 snd_ac97_codec 95264 1 snd_ens1371 ac97_bus 5504 1 snd_ac97_codec snd_seq_dummy 6660 0 snd_seq_midi_event 9600 0 snd_seq 48576 2 snd_seq_dummy,snd_seq_midi_event snd_seq_device 10124 3 snd_rawmidi,snd_seq_dummy,snd_seq snd_pcm_oss 42496 0 snd_mixer_oss 16896 1 snd_pcm_oss snd_pcm 65924 3 snd_ens1371,snd_ac97_codec,snd_pcm_oss snd_timer 22024 2 snd_seq,snd_pcm snd 50616 10 snd_ens1371,snd_rawmidi,snd_ac97_codec,snd_mixer_oss,snd_pcm,snd_timer soundcore 9416 1 snd snd_page_alloc 11016 1 snd_pcm pcnet32 31476 0 parport_pc 25620 0 mii 8192 1 pcnet32 parport 31956 2 ppdev,parport_pc i2c_piix4 12688 0 i2c_core 21396 1 i2c_piix4 mptspi 18824 4 mptscsih 30848 1 mptspi mptbase 68052 2 mptspi,mptscsih scsi_transport_spi 21760 1 mptspi [root@sulinux ~]# |
즉 위의 예와 같이 현재 사용하지 않는 커널모듈을 제거하기 위해서는 “rmmod 모듈명”으로 실행하면 된다.
위의 예에서는 ssb라는 모듈과 autofs라는 모듈 2개를 제거한 후에 lsmod로 확인한 결과 제거되고 없다는 것을 알 수 있다.
리눅스 커널모듈의 의존성관계 재설정하기(depmod)
“depmod”명령어는 “modules.dep”파일과 맵파일들을 생성하는 명령어이며, “modprobe”명령어와 함께 리눅스 커널모듈을 모든 사용자들(정확하게는 메모리에 존재하는 커널)이 사용할 수 있도록 하기위한 명령어이다.
depmod는 커널과 모듈간의 의존성 데이터베이스파일(modules.dep)을 생성하는 모듈관련 명령어이다.
즉 커널과 커널모듈사이의 의존성 관계를 유지하기 위하여 “/lib/modules/커널버전/”디렉토리내에 modules.dep라는 파일을 생성하게 된다.
즉 이 명령어는 커널컴파일의 과정에서 커널이미지 생성과 커널 모듈파일을 생성한 후에 이 둘(커널과 커널모듈)의 의존성관계를 저장하고 있는 modules.dep라는 파일을 생성한다.
“/lib/modules/커널버전/”디렉토리에 보면 modules.dep라는 파일이 존재하고있다.
직접 확인해보면 알겠지만 이 파일은 해당 버전의 커널과 그 커널의 모듈간의 의존성정보를 저장하고있는 텍스트형태의 데이터베이스 파일이다.
다음의 “depmod -a”라는 명령어로 modules.dep파일을 새로 생성해 준 것이다.
[root@RockyLinux ~]# cd /lib/modules/5.14.0-162.23.1.el9_1.x86_64/ [root@RockyLinux 5.14.0-162.23.1.el9_1.x86_64]# [root@RockyLinux 5.14.0-162.23.1.el9_1.x86_64]# [root@RockyLinux 5.14.0-162.23.1.el9_1.x86_64]# depmod -a [root@RockyLinux 5.14.0-162.23.1.el9_1.x86_64]# [root@RockyLinux 5.14.0-162.23.1.el9_1.x86_64]# [root@RockyLinux 5.14.0-162.23.1.el9_1.x86_64]# ls -l 합계 20576 -rw------- 1 root root 5315047 4월 12 04:22 System.map lrwxrwxrwx 1 root root 45 4월 12 04:22 build -> /usr/src/kernels/5.14.0-162.23.1.el9_1.x86_64 -rw-r--r-- 1 root root 212805 4월 12 04:22 config drwxr-xr-x 14 root root 156 4월 28 15:52 kernel -rw-r--r-- 1 root root 846707 7월 17 11:02 modules.alias -rw-r--r-- 1 root root 807009 7월 17 11:02 modules.alias.bin -rw-r--r-- 1 root root 461 4월 12 04:22 modules.block -rw-r--r-- 1 root root 9350 4월 12 04:22 modules.builtin -rw-r--r-- 1 root root 0 7월 17 11:02 modules.builtin.alias.bin -rw-r--r-- 1 root root 11759 7월 17 11:02 modules.builtin.bin -rw-r--r-- 1 root root 72692 4월 12 04:22 modules.builtin.modinfo -rw-r--r-- 1 root root 281653 7월 17 11:02 modules.dep -rw-r--r-- 1 root root 370210 7월 17 11:02 modules.dep.bin -rw-r--r-- 1 root root 387 7월 17 11:02 modules.devname -rw-r--r-- 1 root root 155 4월 12 04:22 modules.drm -rw-r--r-- 1 root root 20 4월 12 04:22 modules.modesetting -rw-r--r-- 1 root root 1586 4월 12 04:22 modules.networking -rw-r--r-- 1 root root 86458 4월 12 04:22 modules.order -rw-r--r-- 1 root root 792 7월 17 11:02 modules.softdep -rw-r--r-- 1 root root 454335 7월 17 11:02 modules.symbols -rw-r--r-- 1 root root 540029 7월 17 11:02 modules.symbols.bin lrwxrwxrwx 1 root root 5 4월 12 04:22 source -> build -rw-r--r-- 1 root root 368817 4월 12 04:22 symvers.gz drwxr-xr-x 2 root root 6 4월 12 04:21 systemtap drwxr-xr-x 2 root root 6 4월 12 04:21 updates drwxr-xr-x 2 root root 40 4월 28 15:52 vdso -rwxr-xr-x 1 root root 11644768 4월 12 04:22 vmlinuz drwxr-xr-x 2 root root 6 4월 28 15:53 weak-updates [root@RockyLinux 5.14.0-162.23.1.el9_1.x86_64]# |
커널 컴파일과정에서 “depmod -a”를 실행해주어야 하는 이유는 다음과 같다.
리눅스 커널에는 하나 이상의 커널모듈이 존재한다.
(물론 모듈없이 모두 커널이미지에 넣을 수는 있지만 커널이미지가 너무 커지기 때문에 모듈파일을 사용하지 않을 수 없다.) 즉 커널과 커널에서 사용할 커널모듈사이에는 의존성정보를 갖고있는 정보파일이 필요하다.
그래야만 커널이 필요한 모듈을 정확하게 찾아서 메모리로 로드(load)하여 사용할 수 있기 때문이다.
또한 리눅스가 부팅하는 과정에서 커널과 모듈간의 의존성정보가 정확하지않다면 부팅시의 “Finding modules dependance...”단계에서 에러가 발생할 수 있다.
즉 모듈 의존성정보를 찾는 과정에서 발생하는 부팅에러가 발생할 수 있다는 것이다.
즉 리눅스 부팅과정에서 “Finding modules dependance...”에러가 발생한다면 싱글모드(linux single, 실행레벨1)로 들어가서 “depmod -a”를 실행한 후에 정상 부팅하면 된다.
따라서 커널컴파일의 거의 마지막 단계에서 필수적으로 “depmod -a”를 실행하여 커널과 커널모듈사이의 의존성관계를 형성할 수 있도록해주어야 한다.
참고로 -n옵션을 사용하여 “depmod -n”을 실행하면 의존성파일의 내용을 직접 확인할 수 있다.
관련자료
-
이전
-
다음