insmod 실패 - 모듈이 실행 중인 커널과 일치하지 않지만 모듈이 올바른 커널에 대해 컴파일되었습니다.

insmod 실패 - 모듈이 실행 중인 커널과 일치하지 않지만 모듈이 올바른 커널에 대해 컴파일되었습니다.

다음에서 이동됨여기이것이 StackExchange가 맞기 때문입니다.

표적

  • 변경 사항 없이 Rocky Linux 9에서 NVMe 드라이버를 다시 컴파일합니다(일부 작업을 수행하고 싶지만 지금은 작동하는 모듈만 구하고 싶습니다).

업데이트 내용은 다음과 같습니다

  1. 기호 오류의 원인이 무엇인지 알아냈습니다. 이는 nvme-common을 먼저 로드하지 않았기 때문에 발생합니다. nvme-core는 nvme-common에 의존하므로 먼저 로드해야 합니다. 이렇게 하면 오류를 극복할 수 있었습니다.
  2. 이제 나는 같은 문제가 있습니다이 문제. 모든 것은 커널 버전 간의 약간의 차이점을 가리키지만, 그 사람이 지적했듯이 내가 찾을 수 있는 모든 것은 일치합니다.

내 새로운 설정은 다음과 같습니다.

dnf install -y rpm-build rpmdevtools git python3-devel make gcc flex bison kernel-headers ncurses-devel tmux elfutils-libelf-devel openssl-devel bc kernel-devel-$(uname -r) dwarves
rpmdev-setuptree
dnf download --source kernel
rpm -ivh kernel-5.14.0-362.18.1.el9_3.src.rpm
rpmbuild -bp kernel.spec
cd /root/rpmbuild/BUILD/kernel-5.14.0-362.18.1.el9_3/linux-5.14.0-362.18.1.el9.x86_64/
cp -f /boot/config-$(uname -r) .config
cp -f /usr/src/kernels/$(uname -r)/Module.symvers .
make -j$(nproc --all) scripts prepare modules_prepare
make ARCH=x86_64 -j$(nproc --all) M=drivers/nvme
insmod drivers/nvme/common/nvme-common.ko
insmod drivers/nvme/host/nvme-core.ko

이렇게 하면 종속성이 완벽하게 일치하게 됩니다.

나는 무엇을하고 있는가

  1. 모든 항목( dnf update -y && reboot)을 업데이트하고 재부팅하여 필요한 위치에 모두 있는지 확인하세요.
  2. 헤더 설치dnf install -y kernel-headers ncurses-devel
  3. 커널 소스 코드 받기 dnf download --source kernel && rpm2cpio kernel-5.14.0-362.18.1.el9_3.src.rpm | cpio -idmv && tar -xf linux-5.14.0-362.18.1.el9_3.tar.xz(여기서 NVMe 소스 코드를 얻었습니다)
  4. Module.symvers제목에서 끌어오기cp /usr/src/kernels/5.14.0-362.18.1.el9_3.x86_64/Module.symvers .
  5. 내 특정 커널에서 구성 추출cp /boot/config-$(uname -r) .config
  6. 다음 명령을 실행하여 빌드합니다.
make clean
cp -f /boot/config-$(uname -r) .config
cp -f /usr/src/kernels/5.14.0-362.18.1.el9_3.x86_64/Module.symvers .
make -j$(nproc --all) scripts prepare modules_prepare
make ARCH=x86_64 -j$(nproc --all) M=drivers/nvme

질문

NVMe 옵션을 기본값으로 두면:

여기에 이미지 설명을 입력하세요.

그런 다음 빌드하면 다음 오류가 발생합니다.

[23890.056877] nvme_core: disagrees about version of symbol nvme_auth_gen_shared_secret
[23890.056881] nvme_core: Unknown symbol nvme_auth_gen_shared_secret (err -22)
[23890.057140] nvme_core: disagrees about version of symbol nvme_auth_gen_pubkey
[23890.057142] nvme_core: Unknown symbol nvme_auth_gen_pubkey (err -22)
[23890.057471] nvme_core: disagrees about version of symbol nvme_auth_gen_privkey
[23890.057472] nvme_core: Unknown symbol nvme_auth_gen_privkey (err -22)

관심 없는 항목을 모두 제거하도록 옵션을 업데이트하면 다른 오류가 발생합니다.

여기에 이미지 설명을 입력하세요.

module: x86/modules: Skipping invalid relocation target, existing value is nonzero for type 1, loc 0000000087bc08cc, val ffffffffc071647a

그러나 나는 완전히 압도당했습니다. 온라인의 모든 내용에서는 이 문제의 원인이 커널 버전이 다르기 때문이라고 말하지만 어디인지는 모르겠습니다. 모든 리소스는 내가 하고 있는 일을 확인 .config하고 일치시키는 것에 대해 말하는 것 같았습니다.Module.symvers

다음은 수정된/원본 두 모듈을 비교한 것입니다:

[root@nvmetest linux-5.14.0-362.18.1.el9_3]# !mod
modinfo ./drivers/nvme/host/nvme-core.ko
filename:       /root/new_driver/linux-5.14.0-362.18.1.el9_3/./drivers/nvme/host/nvme-core.ko
version:        1.0
license:        GPL
rhelversion:    9.3
srcversion:     A869617A5E58420845515F4
depends:        t10-pi
retpoline:      Y
name:           nvme_core
vermagic:       5.14.0 SMP preempt mod_unload modversions
parm:           multipath:turn on native support for multiple controllers per subsystem (bool)
parm:           iopolicy:Default multipath I/O policy; 'numa' (default) or 'round-robin'
parm:           admin_timeout:timeout in seconds for admin commands (uint)
parm:           io_timeout:timeout in seconds for I/O (uint)
parm:           shutdown_timeout:timeout in seconds for controller shutdown (byte)
parm:           max_retries:max number of retries a command may have (byte)
parm:           default_ps_max_latency_us:max power saving latency for new devices; use PM QOS to change per device (ulong)
parm:           force_apst:allow APST for newly enumerated devices even if quirked off (bool)
parm:           apst_primary_timeout_ms:primary APST timeout in ms (ulong)
parm:           apst_secondary_timeout_ms:secondary APST timeout in ms (ulong)
parm:           apst_primary_latency_tol_us:primary APST latency tolerance in us (ulong)
parm:           apst_secondary_latency_tol_us:secondary APST latency tolerance in us (ulong)
[root@nvmetest linux-5.14.0-362.18.1.el9_3]# modinfo /lib/modules/5.14.0-362.18.1.el9_3.x86_64/kernel/drivers/nvme/host/nvme-core.ko.xz
filename:       /lib/modules/5.14.0-362.18.1.el9_3.x86_64/kernel/drivers/nvme/host/nvme-core.ko.xz
version:        1.0
license:        GPL
rhelversion:    9.3
srcversion:     ADFE53FFFB5D30ECFF130B0
depends:        nvme-common,t10-pi
retpoline:      Y
intree:         Y
name:           nvme_core
vermagic:       5.14.0-362.18.1.el9_3.x86_64 SMP preempt mod_unload modversions
sig_id:         PKCS#7
signer:         Rocky kernel signing key
sig_key:        37:B0:46:2C:D4:62:CB:E7:6C:CA:AE:9F:2A:A2:BE:E1:36:3A:8A:AF
sig_hashalgo:   sha256
signature:      60:89:BA:1D:1C:71:38:82:DF:09:73:B4:23:3E:C8:FE:7B:E4:9F:0D:
                62:6E:28:D7:3E:5A:5E:11:CD:7B:D2:52:E2:C6:ED:5E:B6:A7:19:54:
                8A:FB:BB:E8:2D:A5:77:3F:A1:C1:7E:EB:45:74:30:E9:18:1C:3D:9A:
                53:4A:2B:B0:1E:F0:35:D3:D1:E5:B6:A5:D0:47:6C:2F:B7:C6:6F:00:
                30:0E:82:BA:FD:4F:9D:0E:3B:4A:17:A4:1B:E8:31:FC:FB:BC:C2:93:
                1C:6D:5E:94:FD:DE:65:3B:3E:0B:F4:B4:B0:82:67:87:8C:90:C9:74:
                44:BB:14:D9:F9:43:33:CC:CC:77:29:11:2C:3D:79:30:EA:B3:63:74:
                F3:02:F0:DA:68:40:BA:65:B0:E5:D8:90:FF:B0:CA:8D:D7:31:00:47:
                FE:9C:B9:17:8F:81:1D:7F:45:F6:98:E8:14:1F:73:99:00:51:18:48:
                1F:29:98:F4:37:FA:62:46:FF:1B:64:B5:1F:03:C3:5C:87:2E:13:9E:
                EE:8C:32:DE:D8:B6:3F:1D:C2:69:45:46:E2:8B:E4:BD:C2:7C:00:14:
                3F:7B:76:C8:43:4E:ED:24:BE:C8:9D:85:16:C6:9B:55:1F:BA:7B:39:
                07:57:A7:46:1A:E4:98:D5:29:C9:27:07:0B:3A:FE:6D:49:4B:DD:24:
                E0:4C:99:C1:C4:88:4D:E1:D9:78:EC:46:4F:D6:94:D6:93:B0:D4:24:
                23:08:40:35:F9:41:0D:1E:4A:78:3C:B2:A9:DB:51:C9:D0:96:F5:64:
                43:7E:FF:69:71:09:06:9D:79:B0:56:A0:49:71:69:64:3D:50:B6:0B:
                DE:A0:FA:36:D7:86:AD:B9:2A:8C:11:B5:73:F3:C5:2B:C5:2F:C2:A6:
                AB:7F:01:B1:E6:60:8F:6A:F0:A1:AE:A9:32:E1:30:DA:4D:7A:98:F5:
                89:F7:7B:4D:FF:23:4B:77:29:BA:62:1B:54:09:1F:33:57:8F:44:A3:
                FE:19:D6:43
parm:           multipath:turn on native support for multiple controllers per subsystem (bool)
parm:           iopolicy:Default multipath I/O policy; 'numa' (default) or 'round-robin'
parm:           admin_timeout:timeout in seconds for admin commands (uint)
parm:           io_timeout:timeout in seconds for I/O (uint)
parm:           shutdown_timeout:timeout in seconds for controller shutdown (byte)
parm:           max_retries:max number of retries a command may have (byte)
parm:           default_ps_max_latency_us:max power saving latency for new devices; use PM QOS to change per device (ulong)
parm:           force_apst:allow APST for newly enumerated devices even if quirked off (bool)
parm:           apst_primary_timeout_ms:primary APST timeout in ms (ulong)
parm:           apst_secondary_timeout_ms:secondary APST timeout in ms (ulong)
parm:           apst_primary_latency_tol_us:primary APST latency tolerance in us (ulong)
parm:           apst_secondary_latency_tol_us:secondary APST latency tolerance in us (ulong)
[root@nvmetest linux-5.14.0-362.18.1.el9_3]#

강제 버전 마법을 정확히 동일하게 사용할 수 있지만 CONFIG_LOCALVERSION생성되는 오류는 동일합니다.이 게시물또한 기본 커널 버전이 충분함을 나타냅니다.

답변1

경고에도 불구하고 depmod를 시도했을 때 커널을 핵으로 만든 후 다시 빌드했습니다. 재구축 후 다음을 수행했습니다.

사용 가능한 업데이트가 없는지 확인하십시오. 그렇다면 업데이트 후 박스를 다시 시작해주세요. 그 다음에:

dnf install -y rpm-build rpmdevtools git python3-devel make gcc flex bison kernel-headers ncurses-devel tmux elfutils-libelf-devel openssl-devel bc kernel-devel-$(uname -r) dwarves
rpmdev-setuptree
dnf download --source kernel
rpm -ivh kernel-5.14.0-362.18.1.el9_3.src.rpm
cd /root/rpmbuild/SPECS
rpmbuild -bp kernel.spec
cd /root/rpmbuild/BUILD/kernel-5.14.0-362.18.1.el9_3/linux-5.14.0-362.18.1.el9.x86_64/
cp -f /boot/config-$(uname -r) .config
cp -f /usr/src/kernels/$(uname -r)/Module.symvers .
make -j$(nproc --all) scripts prepare modules_prepare
make ARCH=x86_64 -j$(nproc --all) M=drivers/nvme
insmod drivers/nvme/common/nvme-common.ko
insmod drivers/nvme/host/nvme-core.ko

델타가 무엇인지 모르겠습니다. 내 커널 소스가 이전에 실행된 커널과 일치하는지 적어도 12가지 방법을 확인했지만 분명히 뭔가 빠졌습니다. 재구축 시 위의 내용은 첫 번째 시도에서 완벽하게 작동했습니다.

답변2

해결책

내 리뷰 위에 추가 콘텐츠를 본 후 DEPENDS찾아봤습니다.Linux 커널 드라이버 데이터베이스: CONFIG_NVME_COMMON. 이 링크에 따르면 이 옵션은 커널 버전 6부터만 사용할 수 있습니다. 이로 인해 다음 질문으로 시작하는 이 답변을 작성하게 되었습니다.저장소에 6.x 분기 커널이 없는 경우 RedHat/Fedora 기반 배포판에서 6.x 분기 커널을 어떻게 얻습니까?

우리에게는 두 가지 옵션이 있습니다:

  1. 우리는 할 수 있다우리 자신을 구축.
  2. 우리는 추가할 수 있습니다엔터프라이즈 Linux 저장소, 6.x 커널 버전을 사용할 수 있으며 OP에 필요한 NVMe 드라이버도 있을 수 있습니다.

~부터Rocky는 RedHat Enterprise Linux의 포크인 CentOS의 포크입니다., #2가 이상적인 선택인 것 같습니다. 홈페이지를 인용하려면:

ELRepo 프로젝트는 Enterprise Linux 경험을 향상시키기 위해 하드웨어 관련 소프트웨어 패키지에 중점을 둡니다. 여기에는 SCSI/SATA/PATA 드라이버, 파일 시스템 드라이버, 그래픽 드라이버, 네트워크 드라이버, 사운드 드라이버 및 비디오 드라이버가 포함됩니다.

해당 참조에서 언급되지 않은 것은 저장소에 업데이트된 커널도 포함되어 있다는 것입니다. 원래는 이 커널을 얻는 데 필요한 단계를 수동으로 코딩하려고 했지만 간결성을 위해 OP에 필요한 드라이버도 해당 저장소에 있기를 바라면서 다음 지침이 포함된 여러 링크를 찾았습니다.

보시다시피 두 링크의 단계는 동일합니다. 링크가 부패하기 시작하면 어느 시점에 추가하겠습니다. 저장소에서 커널을 업그레이드한 후 elrepo-kernel두 링크 중 하나를 따라 EL 저장소를 검색하여 OP 드라이버도 사용할 수 있는지 확인합니다. 그렇지 않은 경우 OP는 위에 제공된 옵션 1을 자유롭게 사용할 수 있으며, 여기서부터 시작할 것이라고 생각합니다.

관련 정보