데비안에서 리눅스 커널을 컴파일한 후에, 발생하는 여러 가지 문제들과 그 해결책을 기록해 둡니다. 보통, 가상 기계과 GPU 드라이버는 커널에 종속되므로, 새로운 커널 출시 후에는, VMware, VirtualBox, NVIDIA, 등의 드라이버 소프트웨어의 패치가 대체로 필요합니다. 각 드라이버의 패치 정보는 각각의 기사에서 찾을 수 있으며, 정보를 찾는 경로는 아래의 내용들을 확인하십시오.
gcc-10.2.1
데비안에서 제공하는 gcc-10.2.1에서 커널 6.1.2가 컴파일이 되지 않는 문제가 발생했습니다. 오류 덤프가 너무 길게 나타나서 어떤 부분이 문제가 있는 건지 확인할 수 없어서, binutils, gcc-10, amdgcn-tools를 시드 버전으로 업데이트했고, 커널 컴파일이 완료되었습니다.
브라우저 오류
브라우저 사용 중에 시스템이 멈추고 다음 메시지가 발생합니다:
- [drm:amdgpu_job_timedout [amdgpu]] *ERROR* ring gfx_0.0.0 timeout, but soft recovered
부팅 중에 다음을 설정해서 시도해 볼 수 있습니다:
- echo high > /sys/class/drm/card0/device/power_dpm_force_performance_level
이 설정을 강제하면, 제로 팬 기능이 동작하지 않습니다.
missing i386-cpuinfo.h
커널 6.0을 gcc-10으로 컴파일할 때, 발생할 수 있으며, 여기서 첨부된 패치를 사용해 보십시오.
revert patch
5.19.8에서 hdmi 사운드가 동작하지 않음으로써, 패치 파일을 확인할 필요가 있었습니다. 커널 git에서 refs 태그에 커널 버전을 볼 수 있습니다. 원하는 버전으로 들어가면, 이루어진 패치 목록을 시간 순으로 볼 수 있습니다. 해당 패치를 누른 후에, commit 끝에 patch를 누르면, 해당 패치의 파일을 볼 수 있습니다. 브라우저에서 해당 파일을 저장할 수 있습니다.
ITE IT8688E (3)
이상하게도 데비안에서 아래의 모듈이 로딩이 되지 않습니다. 다음 소스를 사용해 보십시오:
binary subprocess 3
아래 두 과정을 거쳤음에도 불구하고 같은 오류가 발생하면, 아래와 같이 설정해 보십시오.
#
# Certificates for signature checking
#
CONFIG_MODULE_SIG_KEY="certs/signing_key.pem"
CONFIG_SYSTEM_TRUSTED_KEYRING=y
CONFIG_SYSTEM_TRUSTED_KEYS=""
CONFIG_SYSTEM_EXTRA_CERTIFICATE=y
CONFIG_SYSTEM_EXTRA_CERTIFICATE_SIZE=4096
CONFIG_SECONDARY_TRUSTED_KEYRING=y
CONFIG_SYSTEM_BLACKLIST_KEYRING=y
CONFIG_SYSTEM_BLACKLIST_HASH_LIST=""
CONFIG_SYSTEM_REVOCATION_LIST=y
CONFIG_SYSTEM_REVOCATION_KEYS=""
# end of Certificates for signature checking
binary subprocess 2
아래의 오류는 커널 옵션을 없애고 해결될 수 있습니다:
- scripts/config --set-str SYSTEM_TRUSTED_KEYS ""
binary subprocess
컴파일이 다 된 후에 바이너리를 처리하는 과정에서 다음 오류가 생깁니다:
dpkg-buildpackage: error: debian/rules binary subprocess returned exit status 2
이 오류는 다음 커널 옵션에 해당하는 실제 압축 프로그램이 시스템에 설치되지 않았기 때문에 발생합니다:
General setup->Kernel compression mode
따라서, 해당 프로그램을 설치하시면 오류가 발생하지 않습니다.
linux-5.11
VirtualBox는 커널 모듈이 컴파일되지 않습니다. 여기의 정보에 따라 패치를 하십시오.
- sudo gvim /usr/share/virtualbox/src/vboxhost/vboxnetflt/linux/VBoxNetFlt-linux.c
40번째 줄 아래에 다음을 추가하십시오: #include <linux/ethtool.h>
새롭게 커널 모듈을 컴파일합니다:
- sudo /sbin/vboxconfig
역시, binutils-2.36 이상에서 모듈이 컴파일되지 않을 때, 여기의 정보에 따라 패치를 진행하시기 바랍니다.
VMware에서 libssl.so.1.0.2와 libcrypto.so.1.0.2이 없다는 메시지가 나오면, 아래와 같이 심볼릭 링크로 해결할 수 있습니다 (안 해도 동작은 합니다).
- cd /usr/lib/x86_64-linux-gnu
- sudo ln -sf libssl.so.1.0.0 libssl.so.1.0.2
- sudo ln -sf libcrypto.so.1.0.0 libcrypto.so.1.0.2
다른 문제는 그놈 스크린 세이버가 동작 후에, 화면이 올라오면서 프리징이 되는 경우가 생깁니다. 이것은 5.11.1에서도 생기는 문제이며, 5.11.3에서 해결된 것으로 보이며, 사운드 관련 오류는 5.11.4에서 해결되었습니다.
linux-5.10
CPU Vcore display
lm-sensors에서 cpu vcore에 대한 값이 1.55V로 잡힙니다. 이것은 linux-5.10-rc1에서부터 계속 존재합니다. linux-5.10.2에서도 해결이 되지 않아서, linux-5.9.16/drivers/hwmon/k10temp.c를 복사해서 컴파일할 수 있습니다. linux-5.11에서부터 AMD Zen 전압/전류의 정보는 사라질 예정이라고 합니다. 여기를 참조하십시오. 어쨌든, 라이젠 3000 씨리즈는 이 방법으로 전압/전류 정보를 알 수 있습니다.
특정 모듈 컴파일
linux-5.10.4에서부터 k10temp에서 Vcore를 제거해서 변하는 양을 볼 수가 없습니다. 이전 k10temp.c를 가져와서 커널 전체를 다시 컴파일할 필요 없이 아래와 같이 처리해 줄 수 있습니다.
- make scripts prepare modules_prepare
- make -C . M=drivers/hwmon
- sudo cp drivers/hwmon/k10temp.ko /lib/modules/5.10.4/kernel/drivers/hwmon/k10temp.ko
ITE IT8688E (2)
새롭게 패치된 버전이 존재합니다.
- 여기서 소스 코드를 가져옵니다.
- make
- sudo make install (커널 모듈이 설치됩니다)
- sudo make dkms
- sudo modprobe it87 ignore_resource_conflict=1
커널 모듈을 자동으로 로딩하지 않기 때문에, Init#How_to_Enable_.2Fetc.2Frc.local_with_Systemd에서 모듈을 올리는 과정이 필요합니다.
이 내용을 참조하여 출력되는 메시지를 다르게 표현할 필요가 있습니다. Dkms가 설치되면, 위의 rc.local을 이용할 필요 없이 아래와 같이 적용할 수 있습니다:
- /etc/sensors.d/gigabyte-x570.conf
chip "it8688-*"
label fan1 "CPU_FAN"
label fan2 "SYS_FAN1"
label fan3 "SYS_FAN2"
label fan4 "Chipset fan"
label fan5 "CPU_OPT"
label temp1 "SYS1 (rear)"
label temp2 "SYS2 (front)"
label temp3 "CPU"
label temp4 "PCIe"
label temp5 "VRM"
label temp6 "Chipset"
- /etc/modprobe.d/it87.conf
options it87 ignore_resource_conflict=1
- /etc/modules-load.d/it87.conf
it87
kernel-5.8
VirtualBox 모듈이 정상적으로 컴파일되기 위해서는, 먼저 자체의 패치가 필요하고, 그럼-다음 커널의 패치가 필요합니다.
여기서 중간에 있는 3개의 파일은 Virtualbox에서 패치를 해야 합니다.
- fixes_for_mm_struct.patch
- fixes_for_changes_in_cpu_tlbstate.patch
- fixes_for_module_memory.patch
그 아래에 있는 local_patches는 5.8 커널에서 패치를 해야 합니다.
한편, VMWare는 아무런 메시지 출력 없이 조용히 실행 중지되며, 아직 패치는 존재하지 않습니다.
do_IRQ
커널 로그에 다음이 10개 생깁니다.
- do_IRQ: 10.55 No irq handler for vector
없던 로그가 커널이 올라가면서 갑자기 생겨서 어디가 문제인지 확인할 수 없고, 이 정보에 따라 다음과 같이 처리해 줄 수 있습니다.
- sudo vi /etc/default/grub
GRUB_CMDLINE_LINUX_DEFAULT="acpi=noirq"
- sudo update-grub
위의 커널 파라미터를 추가했습니다.
위와 같이 처리하면, 다른 오류가 발생할 수 있기 때문에, 이 패치를 이용해 보십시오. 이것도 오류가 없어지지 않습니다.
바이오스 업데이트되고 난 후에, 이 문제는 사라졌습니다.
linux-5.8-rc1
이상하게도 그놈이 시작하기 전에 시스템이 몇 초 동작하지 않는 것처럼 멈추어 있습니다 (마우스가 움직이지 않고, 키보드 입력도 받아들이지 않습니다). 결과적으로, 이 현상이 있고 나면, SSD의 오류 카운트가 올라가는 것으로 보아, SSD와 문제가 있는 것으로 추정되므로, 당분간 사용하지 않는 것이 좋겠습니다.
linux-5.7-rc1
Nvidia 440.82는 linux-5.6에서 잘 작동하지만, 5.7에서 컴파일이 되지 않습니다. 여기서 정보를 얻고, 여기서 패치를 받아서 드라이버를 설치할 수 있습니다. VMware, VirtualBox는 이전 패치된 버전으로 잘 작동합니다.
사운드 디바이스 사라짐 현상은 이 커널에서 없어진 것으로 추정됩니다.
linux-5.6
갑자기 DP에 연결된 사운드 디바이스를 잃어버립니다. #linux-5.5의 방법으로, speaker-test를 수행하면, 그놈 소리 디바이스에 해당 디바이스가 목록화됩니다. 이 문제는 5.6.2에서도 여전히 존재합니다.
ITE IT8688E
마더보드의 칩셋 중에 아직 코드가 없는 것들이 있습니다. 이 칩셋도 아직 자신의 코드는 없지만, 이전 코드로부터 정보를 얻을 수 있습니다. 여기서 정보를 얻으십시오. 이 칩셋으로부터 CPU 및 섀시 등의 팬 정보를 얻을 수 있습니다.
- /etc/default/grub에서 GRUB_CMDLINE_LINUX_DEFAULT 줄에 acpi_enforce_resources=lax를 추가하십시오.
- sudo update-grub
- reboot
- sudo modprobe it87 force_id=0x8628
- sensors
커널을 새롭게 컴파일한 후에는 modprobe 명령 후에, 재-로그인해야 그놈에서 정보를 얻어옵니다.
부팅 후에 이 작업은 귀찮기 때문에, Init#How_to_Enable_/etc/rc.local_with_Systemd로 가셔서 설정을 변경하십시오.
linux-5.5
이 문제는 5.5.3에서 해결이 되었습니다. 어쨌든, 소리 관련된 프로그램에서 일시-중지 후의 약간의 지연 현상과 함께 시작하는 듯한 문제, 게다가, 디렉토리 안의 파일을 찾는 시간이 더 늘어난 점 등의 문제가 발견되고 있습니다. 앞에서 언급된 문제는 5.5.4에서 해결이 되었습니다. 커널 5.5.6에서 사운드 디바이스가 사리지는 문제가 생겼고, 디렉토리 안의 파일을 찾는 시간이 더 걸리는 문제도 여전히 있는 것으로 보입니다.
커널 5.5-rc1부터 HDMI(또는 DP)의 사운드가 동작하지 않는 것처럼 보입니다.
그놈에서 HDMI에 연결된 오디오 디바이스를 불러오지 못하기 때문에, 오직 마드보드에 내장된 오디오 디바이스를 불러옵니다. 이러다 보니, 내장된 디바이스로 오디오 출력이 나가면서, 스피커가 연결되어 있지 않으니, 당연히 소리가 나지 않습니다.
사실, 리스트에만 보이지 않지, 실제로는 HDMI 오디오 디바이스가 동작중에 있습니다.
따라서, 리스트가 보이는 커널에서 HDMI로 선택한 후에, CMOS에서 내장된 오디오 디바이스를 죽입니다.
커널 5.5로 부팅하면, 비록 리스트에 보이지 않을지라도, HDMI 오디오 디바이스로 소리 출력이 됩니다.
이 문제는 오래전부터 유사한 형태로 발생이 되었던 것으로 보이는데, 여기에서 확인할 수 있습니다.
다음과 같이 목록을 얻어냅니다.
- aplay -l
여러 개의 장치들이 발견될 것입니다.
**** List of PLAYBACK Hardware Devices ****
card 0: NVidia [HDA NVidia], device 3: HDMI 0 [HDMI 0]
Subdevices: 1/1
Subdevice #0: subdevice #0
card 0: NVidia [HDA NVidia], device 7: HDMI 1 [HDMI 1]
Subdevices: 1/1
Subdevice #0: subdevice #0
아래와 같이 테스트를 할 수 있습니다.
- speaker-test -c 2 -r 48000 -D hw:[card_number],[device_number]
위의 경우라면,
- speaker-test -c 2 -r 48000 -D hw:0,3
위에서 찾은 디바이스 중에서 소리가 발생하는 것을 찾습니다.
그런 다음 강제로 목록을 추가합니다:
- pacmd load-module module-alsa-sink device=hw:[card_number],[device_number]
- pacmd set-default-sink alsa_output.hw_[card_number]_[device_number]
예를 들어, 위의 경우라면,
- pacmd load-module module-alsa-sink device=hw:0,3
- pacmd set-default-sink alsa_output.hw_0_3
그놈 사운드 설정에서 목록을 보실 수 있습니다.
linux-5.4.3
Nvidia 카드의 사운드에 문제가 생겼습니다. 패치를 적용해야 합니다. 이 패치는 5.4.6에 적용되었습니다.
linux-5.5-rc1
Nvidia 커널 모듈이 컴파일되지 않는데, drmP.h 파일이 커널 5.5부터 제거되었기 때문입니다.
어쨌든, 패치에 대한 정보는 여기서 볼 수 있으며, 패치는 여기서 받을 수 있습니다.
VMware는 여기서 패치된 버전을 받을 수 있습니다.
VirtualBox는 이전에 패치된 것으로부터 이상 없이 동작합니다.
linux-5.4
아래의 정보로부터 Nvidia의 패치가 이루어져야 하며, VMware 또한 15.5.1 버전의 모듈을 수동으로 설치해야 합니다. 게다가 VirtualBox는 여기의 정보에 따라 패치 후에 정상적으로 기동이 가능합니다.
lz4c
Vmware, VirtualBox에서 bridged network가 작동하지 않습니다. 그래서, 우분투의 설정을 가져와서 새롭게 컴파일을 하는데,
lz4c: not found
와 같은 메시지가 출력되고 컴파일이 되지 않습니다.
sudo apt install liblz4-tool
linux-5.4-rc3 이후
커널 5.4-rc부터 nvidia-435.21이 컴파일이 되기 위해서, 패치를 해야 합니다.
- cd /usr/src/nivid-435.21
이 디렉토리에서 패치를 먼저 하시고, 컴파일된 커널을 설치하시면, Nvidia 모듈이 컴파일이 되고, 재부팅 후에 정상적으로 동작을 합니다.
반면에, vmware는 아래에서 모듈이 제공됩니다.
게다가, virtualbox는 정보를 찾기가 힘들고, 패치는 아직 없는 것으로 추정됩니다.
linux-5.3-rc1 이후
VMware 모듈은 새로운 커널에 맞게 출시와 동시에 패치가 이루어지고 있습니다. 반면에 VirtualBox는 조금 늦긴 하지만 커뮤니티에서 패치가 이루어지고 있습니다. 해당 패치는 아래의 스레드에서 볼 수 있습니다.
파일의 위치가 다르기 때문에 해당 파일을 다음과 같이 찾을 수 있습니다.
- dpkg -L virtualbox-6.0 | grep VBoxNetFlt-linux.c
vdagent
부팅 중에 응용프로그램 관련 2개의 오류 로그가 생깁니다.
[pulseaudio] bluez5-util.c: GetManagedObjects() failed: org.freedesktop.DBus... Cannot access vdagent virtio channel /dev/virtio-ports/com.redhat.spice.0
다음 패키지를 삭제해 봅니다.
- sudo apt purge spice-vdagent
linux-5.1-rc1 이후
VMware 모듈은 다음과 같이 소스를 받으세요. 나머지는 아래의 5.0-rc1에서 정보를 찾으십시오.
- git clone -b workstation-15.0.3-test https://github.com/mkubecek/vmware-host-modules.git
Nvidia-418.43은 여기서 정보를 얻을 수 있습니다.
Nvidia-418.56에서는 아래에 표기된 것은 제외해야 합니다. |
- cd /usr/src/nvidia-418.43
- sudo nano nvidia-drm/nvidia-drm-connector.c:23 삽입
#include <linux/version.h> 마찬가지로 같은 디렉토리에 있는 nvidia-drm-drv.c:23 nvidia-drm-encoder.c:23 nvidia-drm-gem-nvkms-memory.c:23
- sudo nano common/inc/nv-list-helpers.h:94 변경 Nvidia-418.56 제외
static inline int nv_list_is_first(const struct list_head *list,
- sudo nano nvidia-drm/nvidia-drm-connector.c:205-210 (static struct drm_connector_funcs nv_connector_funcs - { 전에 삽입)
#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 1, 0)
/* Add header constants missing after 5.1-rc1 */
int drm_helper_probe_single_connector_modes(struct drm_connector
*connector, uint32_t maxX,
uint32_t maxY);
#endif
- sudo nano nvidia-drm/nvidia-drm-drv.c:38-44 (#include "nvidia-drm-gem-user-memory.h" 다음에 삽입)
#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 1, 0)
/* Add header constants missing after 5.1-rc1 */
void drm_kms_helper_poll_init(struct drm_device *dev);
void drm_kms_helper_poll_fini(struct drm_device *dev);
bool drm_helper_hpd_irq_event(struct drm_device *dev);
void drm_kms_helper_poll_disable(struct drm_device *dev);
#endif
- sudo nano nvidia-drm/nvidia-drm-encoder.c:34-37(#include "nvidia-drm-helper.h" 뒤에 삽입)
#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 1, 0)
/* Add header constants missing after 5.1-rc1 */
void drm_kms_helper_hotplug_event(struct drm_device *dev);
#endif
- sudo nano nvidia-drm/nvidia-drm-encoder.c:160-165(Add encoder for given NvKmsKapiDisplay 블록 전에 삽입)
#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 1, 0)
/* Add header constants missing after 5.1-rc1 */
int drm_helper_probe_single_connector_modes(struct drm_connector
*connector, uint32_t maxX,
uint32_t maxY);
#endif
- sudo nano nvidia-drm/nvidia-drm-gem-nvkms-memory.c:380-385 (1줄을 2경우로 분리)
#if defined(NV_VM_OPS_FAULT_REMOVED_VMA_ARG)
#if LINUX_VERSION_CODE < KERNEL_VERSION(5, 1, 0)
static int nv_drm_vma_fault(struct vm_fault *vmf)
#else
static vm_fault_t nv_drm_vma_fault(struct vm_fault *vmf)
#endif
- sudo nano nvidia-uvm/uvm8.c:175-179 (1줄을 2경우로 분리)
#if LINUX_VERSION_CODE < KERNEL_VERSION(5, 1, 0)
static int uvm_vm_fault_sigbus_wrapper(struct vm_fault *vmf)
#else
static vm_fault_t uvm_vm_fault_sigbus_wrapper(struct vm_fault *vmf)
#endif
- sudo nano nvidia-uvm/uvm8.c:514-518 (1줄을 2경우로 분리)
#if LINUX_VERSION_CODE < KERNEL_VERSION(5, 1, 0)
static int uvm_vm_fault_wrapper(struct vm_fault *vmf)
#else
static vm_fault_t uvm_vm_fault_wrapper(struct vm_fault *vmf)
#endif
- sudo nano nvidia-uvm/uvm8_range_tree.c:34 변경 Nvidia-418.56 제외
if (nv_list_is_first(&node->list, &tree->head))
linux-5.0-rc1 이후
리눅스 커널이 5.0으로 향하기 위한 첫 번째 발걸음이 시작되었습니다. 5.0-rc1에 대한 VMware 모듈 패치는 이미 제공이 되고 있으며, 반면에 NVIDIA 모듈은 4.20에 맞게 바꾼 지 며칠 되지 않아서 그런지 아직 소식이 없습니다.
먼저 nvidia 모듈은 이곳의 정보에 따라 다음과 같이 설치할 수 있습니다.
- cd /usr/src/
- sudo cp -a nvidia-415.27 nvidia-415.27.org
- cd linux-headers-5.0.0-050000rc2-ryzen
- sudo cp ../linux-headers-4.20.1-042001-ryzen/include/linux/timekeeper_internal.h include/linux
- sudo cp ../linux-headers-4.20.1-042001-ryzen/include/linux/timekeeping32.h include/linux
- sudo dpkg -i linux-image-5.0.0-050000rc2-ryzen_5.0.0-050000rc2-ryzen-1_amd64.deb
이 과정은 정상적으로 nvidia 모듈이 컴파일될 때까지 반복합니다. 오류 메시지 수정하고 다시 명령을 내려야 합니다.
- 오류가 발생하면, 다음과 같이 수정합니다.
- nvidia-drm/nvidia-drm-helper.h:42
drm_dev_free -> nv_drm_dev_free
- nvidia-drm/nvidia-drm-gem.h:all
drm_gem_object_unreference_unlocked -> drm_gem_object_put_unlocked drm_gem_object_unreference -> drm_gem_object_put
- nvidia-drm/nvidia-drm-gem-nvkms-memory.h:74
nv_drm_gem_object_unreference_unlocked -> nv_drm_gem_object_put_unlocked
- nvidia-drm/nvidia-drm-fb.c:43:112:195
nv_drm_gem_object_unreference_unlocked -> nv_drm_gem_object_put_unlocked
- nvidia-drm/nvidia-drm-helper.c:152:157
drm_framebuffer_reference -> drm_framebuffer_remove
- nvidia-drm/nvidia-drm-prime-fence.c:432:526:529
nv_drm_gem_object_unreference_unlocked -> nv_drm_gem_object_put_unlocked
- nvidia-drm/nvidia-drm-gem-nvkms-memory.c:244:325
nv_drm_gem_object_unreference_unlocked -> nv_drm_gem_object_put_unlocked
VMware 모듈은 다음과 같이 설치해 줍니다. 이 부분은 5.0-rc1와 같은 커널로 부팅한 후에 진행해야 합니다.
- cd ~
- git clone -b workstation-15.0.2 https://github.com/mkubecek/vmware-host-modules.git
- 위에서 헤더 파일을 덮어썼기 때문에, linux-headers-5.0.0 패키지를 다시 설치해야 합니다.
- cd vmware-host-modules
- make
- sudo mkdir /lib/modules/`uname -r`/misc
- sudo cp vmmon.o /lib/modules/`uname -r`/misc/vmmon.ko
- sudo cp vmnet.o /lib/modules/`uname -r`/misc/vmnet.ko
- sudo depmod -a
- sudo systemctl start vmware
Virtualbox-6.0.2는 다음과 같이 패치해야 합니다.
- cd /usr/share/virtualbox
- sudo gvim src/vboxhost/vboxdrv/r0drv/linux/memuserkernel-r0drv-linux.c
RTR0DECL(bool) RTR0MemUserIsValidAddr(RTR3PTR R3Ptr) /* 66번째 줄 */
{
IPRT_LINUX_SAVE_EFL_AC();
#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 0, 0)
bool fRc = access_ok((void *)R3Ptr, 1);
#else
bool fRc = access_ok(VERIFY_READ, (void *)R3Ptr, 1);
#endif /* 73번째 줄까지 */
# error "PORT ME" /* 88번째 줄 */
#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 0, 0)
return !access_ok(pv, 1);
#else
return !access_ok(VERIFY_READ, pv, 1);
#endif /* LINUX_VERSION_CODE */ /* 93번째 줄까지 */
linux-4.20-rc1
linux-4.19.1, linux-4.20-rc1 이후의 우분투 메인라인의 git 서버 소스가 이상한지 커널 컴파일 후에 nvidia 모듈 컴파일 시에 다음과 같은
error: unknown type name ‘ipmi_user_t’; did you mean ‘pci_power_t’?
오류가 생기면서 nvidia 모듈을 컴파일하지 못합니다. 리눅스 커널 서버에서 가져온 소스 파일로 컴파일하니 정상적으로 컴파일이 됩니다. 가능하면, 리눅스 커널 서버의 소스 코드를 이용하시기 바랍니다.
Nvidia-415.23에서 해결이 되었습니다.
linux-4.19.1
kernel-4.19.1 이후로 나타나는 오류입니다.
Assembler messages: Error: can't open arch/x86/kernel/macros.s for reading: No such file or directory
위의 오류는 빌드한 커널 디렉토리에 있는 파일을 복사해 주면 해결이 됩니다.
- sudo cp arch/x86/kernel/macros.* /usr/src/linux-headers-4.19.2-ryzen/arch/x86/kernel/
linux-4.15.1
커널 4.15.1, 4.14.17을 컴파일하면, nvidia 그래픽 카드가 오류가 생깁니다. 이전에 패치가 적용이 되면서 모듈 로딩이 되지 않습니다. 다음 패치를 적용해서 컴파일해야 합니다. File:Swiotlb.c.export.patch
linux-4.17.1
커널 4.16.15와 4.17.1부터 다음 오류가 생기면서 모듈을 생성하지 못합니다.
ERROR (dkms apport): kernel package linux-headers-4.17.1-041701-ryzen is not supported Error! Bad return status for module build on kernel: 4.17.1-041701-ryzen (x86_64)
빌드 로그를 확인해서 다음 패치를 적용합니다. 이것은 nvidia-390.67, 396.24까지만 적용해야 하며, 390.77부터는 패치가 필요하지 않습니다. 이 문서의 패치를 nvidia 소스에 적용하지 않고, 커널을 설치해야 합니다.
- sudo cp nvidia-390.67-drm_control_allow.patch /usr/src
- cd /usr/src/nvidia-390.48
- sudo patch -p2 < ../nvidia-390.67-drm_control_allow.patch
그래도 컴파일이 되지 않아서, 빌드 로그를 찾아보니 다음 오류가 생깁니다.
FATAL: modpost: GPL-incompatible module nvidia.ko uses GPL-only symbol '__put_devmap_managed_page'
커널 소스에서 다음 파일을 수정하고, 커널을 컴파일해야 합니다.
kernel/memremap.c
위의 파일에서 __put_devmap_managed_page, devmap_managed_key를 EXPORT_SYMBOL_GPL에서 EXPORT_SYMBOL로 바꾸어서 컴파일해야 합니다.
linux-4.18.3
커널 4.17.16과 4.18.2 이후로 /usr/src/nvidia-390.xx/nvidia-drm/아래의 nvidia-drm-encoder.c와 nvidia-drm-connector.c에서 함수의 선언이 맞지 않아서 모듈 컴파일 시에 오류가 생깁니다. 커널 버전마다 맞지 않는 함수의 이름이 다를 수 있습니다. 그때마다 오류 로그를 확인해서 해당 함수 이름을 맞게 수정하시기 바랍니다.
샤오미 무선 마우스 문제
이 문제는 우분투 18.10에서 해결이 되었습니다. 별도로 파일을 만들지 않아도 됩니다. 그러나 여전히 부팅중에 샤오미 마우스로 인해서 부팅이 지연되는 현상이 있습니다. 이 때에는 잠시 usb 리시버를 제거했다가 다시 꽂으면 커널이 정상적으로 올라옵니다. 그렇기 때문에 그럽 옵션에서 quiet splash를 제거하는 것이 좋습니다. |
마우스가 움직이지 않습니다. 이 문제는 샤오미 무선 마우스에만 발생하고, LG 마우스에서는 제대로 동작을 합니다. 샤오미 무선 마우스도 커널 메시지는 정상적으로 올라오지만, 그 이후에 동작을 하지 않습니다.
스크롤, 좌우 버튼은 동작을 하지만, 포인터 위치만 움직이지 않습니다.
이 문제는 아치 리눅스에서 논의가 되었으며, 리눅스-4.18.6 이후에 적용이 가능한 패치가 아치 리눅스에 적용이 되었으며, linux-4.18.7에 이미 적용이 되었습니다. 여기에 사용되는 rules 파일은 우분투에는 없기 때문에, 젠투의 70-mouse.rules 파일을 가져와서 /etc/udev/rules.d 아래에 넣습니다.
# do not edit this file, it will be overwritten on update
ACTION=="remove", GOTO="mouse_end"
KERNEL!="event*", GOTO="mouse_end"
ATTRS{name}=="MiMouse Mouse", ENV{ID_INPUT_MOUSE}="1"
ATTRS{name}=="MI Dongle MI Wireless Mouse Mouse", ENV{ID_INPUT_MOUSE}="1"
ENV{ID_INPUT_MOUSE}=="", GOTO="mouse_end"
# mouse:<subsystem>:v<vid>p<pid>:name:<name>:*
KERNELS=="input*", ENV{ID_BUS}=="usb", \
IMPORT{builtin}="hwdb 'mouse:$env{ID_BUS}:v$attr{id/vendor}p$attr{id/product}:name:$attr{name}:'", \
GOTO="mouse_end"
KERNELS=="input*", ENV{ID_BUS}=="bluetooth", \
IMPORT{builtin}="hwdb 'mouse:$env{ID_BUS}:v$attr{id/vendor}p$attr{id/product}:name:$attr{name}:'", \
GOTO="mouse_end"
DRIVERS=="psmouse", SUBSYSTEMS=="serio", \
IMPORT{builtin}="hwdb 'mouse:ps2::name:$attr{device/name}:'", \
GOTO="mouse_end"
LABEL="mouse_end"
재부팅 없이 위의 내용을 적용하기 위해서는 위의 내용을 /etc/udev/rules.d 폴더에 파일을 만들어서 기록합니다. 그리고 다음과 같이 처리해 줍니다. 이 방법은 테스트되지 않았습니다.
- sudo systemctl stop udevd.service
- sudo udevadm control --reload-rules
- sudo systemctl start udevd.service