강좌
클라우드/리눅스에 관한 강좌입니다.
리눅스 분류

커널모듈(kernel module) 통합관리를 위한 modprobe 활용하기

작성자 정보

  • 관리자 작성
  • 작성일

컨텐츠 정보

본문

커널모듈(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”을 실행하면 의존성파일의 내용을 직접 확인할 수 있다.

 

 

 

관련자료

댓글 0
등록된 댓글이 없습니다.

공지사항


뉴스광장


  • 현재 회원수 :  60,035 명
  • 현재 강좌수 :  35,798 개
  • 현재 접속자 :  164 명