Это о моем успешном опыте в переводе в рабочее состояние Ubuntu 17.10 x86_64
на созданном из лязга Linux 4.15.7 kernel
(последняя конюшня на данный момент) и собственный Nvidia 390.25
(последний на данный момент) драйвер для моей видеокарты Nvidia GTX GeForce 860M.
Ядро Linux 4.15.7 было создано с помощью clang
как хост и целевой компилятор и установленный наряду с модулями на основе конфигурации ядра по умолчанию. Я должен был отключить exofs
модуль, поскольку это имело нестандартный "VLAs, встроенный в структурах" это clang
не поддерживает. Затем я также скомпилировал Nvidia 390.25
источник драйвера после извлечения его из его примирительного установщика - я должен был проигнорировать несоответствие версии компилятора, psuedo-предупреждающее, поскольку заголовки ядрa включали модель потока и также информацию о платформе, в то время как проверка сценария драйвера Nvidia привела только к версии.
После установки таким образом созданных модулей драйвера Nvidia, я перезагрузил свою систему, начальная загрузка Ubuntu 17.10 не завершалась - она застряла в Loading ... 4.15.7
.
Далее изолировать проблемы совместимости (если таковые имеются) ядра с gcc/clang по сравнению с драйвером Nvidia с gcc/clang, Скомпилированное ядро Linux 4.15.7 с gcc
и драйвер Nvidia 390.25 с clang
, и наоборот. Для первого, процесс начальной загрузки, переданный Loading ... 4.15.7
фаза и перешедший на некоторых systemd
сервис, но застрял там. Для второго, снова, это застряло в Loading ... 4.15.7
поэтапно осуществите снова. Система journalctl
/ журналы не помог многому.
Этап 1: работая с Qemu/Kvm ранее, я хотел овладеть фактической провальной точкой в переводе в рабочее состояние созданного из лязга ядра. Так, я пытался поднять созданное из лязга ядро Linux 4.15.7 изображений с помощью x86_64 конфигурации по умолчанию для начала и также созданный из лязга busybox
x86_64 для корневой файловой системы (initrd), на Qemu/kvm x86_64. Это работало. Я получил оболочку и busybox
утилиты работали и так далее.
На хосте Ubuntu 17.10 x86_64:
$ strings -a defconfig-linux-4.15.7/linux-4.15.7/vmlinux | grep "clang version" | head -1
Linux version 4.15.7 (exp@exp) (clang version 5.0.0-3 (tags/RELEASE_500/final)) #1 SMP Fri Mar 2 21:15:24 PST 2018
$ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description: Ubuntu 17.10
Release: 17.10
Codename: artful
$ clang -v
clang version 5.0.0-3 (tags/RELEASE_500/final)
Target: x86_64-pc-linux-gnu
Thread model: posix
InstalledDir: /usr/bin
В госте Qemu/kvm, ядро Linux 4.15.7 (x86_64 defconfig)/Busybox 64-разрядный:
/ # cat /proc/version
Linux version 4.15.7 (exp@exp) (clang version 5.0.0-3 (tags/RELEASE_500/final)) #1 SMP Fri Mar 2 21:15:24 PST 2018
/ #
/ # uname -arv
Linux (none) 4.15.7 #1 SMP Fri Mar 2 21:15:24 PST 2018 x86_64 GNU/Linux
/ #
/ #
/ # strings -a bin/busybox | grep "clang version"
clang version 5.0.0-3 (tags/RELEASE_500/final)
/ #
/ #
/ # dmesg | grep QEMU
[ 0.000000] DMI: QEMU Standard PC (i440FX + PIIX, 1996), BIOS rel-1.9.3-0-ge2fc41e-prebuilt.qemu-project.org 04/01/2014
[ 0.024000] smpboot: CPU0: Intel QEMU Virtual CPU version 2.5+ (family: 0x6, model: 0x6, stepping: 0x3)
[ 0.337415] ata2.00: ATAPI: QEMU DVD-ROM, 2.5+, max UDMA/100
[ 0.339072] scsi 1:0:0:0: CD-ROM QEMU QEMU DVD-ROM 2.5+ PQ: 0 ANSI: 5
/ #
/ #
Этап 2: С вышеупомянутым начальным успехом с defconfig ядром я взял хост конфигурация ядра Ubuntu 17.10 и восстановил ядро Linux 4.15.7 изображений. С этим я сохранил отдых busybox тем же и попытался поднять их на Qemu/kvm как ранее - это не работало. Приведший к general protection faults
и kernel oops
- kernel panic
. Я изучил дамп стопки ядра.
Я заметил, что первый выпуск был в kernel irq work tick
логика. Затем следующий выпуск был с kernel live instruction update
логика. Я работал над ними обоими. Восстановленный ядро. Попробованный еще раз с Qemu/kvm - получил оболочку, никакая паника на этот раз. Следующий шаг должен был установить модули ядра и модули драйвера Nvidia также. Я сделал это, но на этот раз, со всеми модулями ядра Ubuntu и модулем драйвера Nvidia, Qemu/kvm показал некоторые цветные пиксели и застрял - главным образом должный различие между аппаратными средствами хоста и виртуализированными аппаратными средствами гостя. Так, я хотел попробовать только драйвером Nvidia, поскольку он вызвал главное беспокойство, поскольку это - то, которое я использую на своем хосте к графике. Так, я включал (не устанавливал), модули драйвера Nvidia в busybox rootfs и попробованный для перевода в рабочее состояние Qemu/kvm, как обычно - на этот раз, была некоторая паника ядра из-за rootfs-not-found, хотя был rootfs.
Так, я пытался сжать все модули драйвера Nvidia на zip и включать ее в rootfs. Но, когда я пытался извлечь zip с гостем Qemu/kvm, было no space left on device
. Так, я пытался создать 10G виртуальный qemu диск и установить rootfs в том диске для обращения к беспокойству пространства - но, через некоторое время я отозвал это, когда я больше интересовался получением созданного из лязга драйвера Nvidia на реальном оборудовании системы, чем на эмулированной среде Qemu/kvm (я знаю, что это не имеет реальную видеокарту Nvidia в наличии через передачу GPU так, чтобы это могло протестировать созданный из лязга драйвер Nvidia 390.25 на нем, прежде чем я мог попробовать это на реальном оборудовании системы хоста / видеокарта, но дал ему выстрел так или иначе только, чтобы видеть, показывает ли созданный из лязга драйвер Nvidia какие-либо проблемы в Qemu/kvm при загрузке).
В госте Qemu/kvm, ядро Linux 4.15.7 (размещают конфигурацию Ubuntu 17.10 x86_64),/Busybox64-bit:
/ # cat /proc/version
Linux version 4.15.7 (exp@exp) (clang version 5.0.0-3 (tags/RELEASE_500/final)) #20 SMP Sat Mar 3 20:46:15 PST 2018
/ #
/ #
/ # uname -arv
Linux (none) 4.15.7 #20 SMP Sat Mar 3 20:46:15 PST 2018 x86_64 GNU/Linux
/ #
/ #
/ #
/ # dmesg | grep QEMU
[ 0.000000] DMI: QEMU Standard PC (i440FX + PIIX, 1996), BIOS rel-1.9.3-0-ge2fc41e-prebuilt.qemu-project.org 04/01/2014
[ 0.024000] smpboot: CPU0: Intel QEMU Virtual CPU version 2.5+ (family: 0x6, model: 0x6, stepping: 0x3)
[ 0.340776] ata2.00: ATAPI: QEMU DVD-ROM, 2.5+, max UDMA/100
[ 0.343135] scsi 1:0:0:0: CD-ROM QEMU QEMU DVD-ROM 2.5+ PQ: 0 ANSI: 5
/ #
/ # strings -a bin/busybox | grep "clang version"
clang version 5.0.0-3 (tags/RELEASE_500/final)
/ #
Этап 3 и Успех: Поскольку моя основная и фактическая цель была моим хостом (Ubuntu 17.10), я установил это созданное из лязга ядро (с вышеупомянутыми проблемами, работавшими на) и драйверы Nvidia 390.25 в моей хост-системе непосредственно. Перезагруженный моя система. Обман! Я разбудил свою Ubuntu 17.10 x86_64 и работающий с созданным из лязга 4.15.7 ядер и созданный из лязга драйвер Nvidia 390.25 без любых проблем.
На хосте Ubuntu 17.10 x86_64 с созданным из лязга ядром Linux 4.15.7 и созданным из лязга Nvidia 390.25 GeForce GTX 860M собственный драйвер - мое успешное исследование и опыт:
$ dmesg | grep clang
[ 0.000000] Linux version 4.15.7 (exp@exp) (clang version 5.0.0-3 (tags/RELEASE_500/final)) #20 SMP Sat Mar 3 20:46:15 PST 2018
$ cat /proc/version
Linux version 4.15.7 (exp@exp) (clang version 5.0.0-3 (tags/RELEASE_500/final)) #20 SMP Sat Mar 3 20:46:15 PST 2018
$ uname -arv
Linux exp 4.15.7 #20 SMP Sat Mar 3 20:46:15 PST 2018 x86_64 x86_64 x86_64 GNU/Linux
$ nvidia-smi
Sun Mar 4 18:15:39 2018
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 390.25 Driver Version: 390.25 |
|-------------------------------+----------------------+----------------------+
| GPU Name Persistence-M| Bus-Id Disp.A | Volatile Uncorr. ECC |
| Fan Temp Perf Pwr:Usage/Cap| Memory-Usage | GPU-Util Compute M. |
|===============================+======================+======================|
| 0 GeForce GTX 860M Off | 00000000:01:00.0 Off | N/A |
| N/A 54C P0 N/A / N/A | 370MiB / 4046MiB | 0% Default |
+-------------------------------+----------------------+----------------------+
exp@exp:~$ dmesg | grep NVIDIA | grep 390.25
[ 17.643496] NVRM: loading NVIDIA UNIX x86_64 Kernel Module 390.25 Wed Jan 24 20:02:43 PST 2018 (using threaded interrupts)
[ 17.689835] nvidia-modeset: Loading NVIDIA Kernel Mode Setting Driver for UNIX platforms 390.25 Wed Jan 24 19:29:37 PST 2018
$ lsmod | grep nvidia
nvidia_uvm 815104 0
nvidia_drm 24576 2
nvidia_modeset 1097728 5 nvidia_drm
nvidia 14352384 334 nvidia_uvm,nvidia_modeset
ipmi_msghandler 61440 2 nvidia,ipmi_devintf
drm 454656 6 nvidia_drm,i915,drm_kms_helper
# clang-built Linux kernel 4.15.7 image and Nvidia 390.25 driver modules having clang compiler specific
# metadata within them.
#
$ eclang /lib/modules/4.15.7/build/vmlinux | grep "Linux"
++ strings -a /lib/modules/4.15.7/build/vmlinux
++ grep clang
Linux version 4.15.7 (exp@exp) (clang version 5.0.0-3 (tags/RELEASE_500/final)) #20 SMP Sat Mar 3 20:46:15 PST 2018
exp@exp:~$ eclang /lib/modules/4.15.7/kernel/drivers/video/nvidia.ko | head -1
++ strings -a /lib/modules/4.15.7/kernel/drivers/video/nvidia.ko
++ grep clang
clang version 5.0.0-3 (tags/RELEASE_500/final)
$ eclang /lib/modules/4.15.7/kernel/drivers/video/nvidia-drm.ko | head -1
++ strings -a /lib/modules/4.15.7/kernel/drivers/video/nvidia-drm.ko
++ grep clang
clang version 5.0.0-3 (tags/RELEASE_500/final)
$ eclang /lib/modules/4.15.7/kernel/drivers/video/nvidia-uvm.ko | head -1
++ strings -a /lib/modules/4.15.7/kernel/drivers/video/nvidia-uvm.ko
++ grep clang
clang version 5.0.0-3 (tags/RELEASE_500/final)
$ eclang /lib/modules/4.15.7/kernel/drivers/video/nvidia-modeset.ko | head -1
++ strings -a /lib/modules/4.15.7/kernel/drivers/video/nvidia-modeset.ko
++ grep clang
clang version 5.0.0-3 (tags/RELEASE_500/final)
# DMI specific hardware information - verifies and confirms the physical hardware used
# instead of QEMU or any other virtual platform for running clang-built kernel and
# Nvidia 390.25 driver.
#
$ sudo dmidecode -t bios | grep Vendor
Vendor: LENOVO
$ sudo dmidecode -t system | grep "Manufacturer:\|Version"
Manufacturer: LENOVO
Version: Lenovo Y50-70 Touch
$ sudo dmidecode -t processor | grep Version
Version: Intel(R) Core(TM) i7-4710HQ CPU @ 2.50GHz
ПРИМЕЧАНИЕ 1: Для всех подробных журналов (от каждого этапа), можно прочитать мой ответ для вопроса о ядре LLVM-Clang/Linux здесь: Создание ядра Linux с LLVM/clang.
ПРИМЕЧАНИЕ 2: предупреждение лязга более педантично, чем gcc, как я видел. Но, в настоящее время, для подъема драйвера ядра/Nvidia и выполнения я проигнорировал их, чтобы видеть, не ли они серьезны (до сих пор, они не).
ОБНОВЛЕНИЕ 1: Ради универсальности я повторил вышеупомянутое с последующими версиями ядра (4.15.10
и 4.15.11
который является последним по состоянию на середину марта 2018), и последний драйвер v390.42 GTX GeForce графики Nvidia, который является последним по состоянию на середину марта 2018 - они оба создали использование clang
как ранее после обновления ядра 4.15.11 кодов в работе IRQ отмечают логику, и живая инструкция обновляют логику, как я сделал выше для 4.15.7 и наконец установил их обоих на своем оборудовании системы непосредственно (никакие эксперименты Qemu/kvm на этот раз, когда более ранние 4.15.7 ядер подошли успешно после работы на логику галочки работы IRQ, и живая инструкция обновляют логику). С этим, снова, Ubuntu 17.10 x86_64 успешно подошла на моем оборудовании системы на созданном из лязга ядре 4.15.11 и созданном из лязга последнем драйвере v390.42 Nvidia, как это сделало в более раннем случае ядра 4.15.7 и драйвера v390.25 Nvidia.
Ниже детали для Ubuntu 17.10 x86_64, работающей на созданном из лязга последнем v4.15.11 ядре и созданном из лязга последнем сценарии драйвера v390.42 Nvidia:
$ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description: Ubuntu 17.10
Release: 17.10
Codename: artful
$ cat /proc/version
Linux version 4.15.11 (exp@exp) (clang version 5.0.0-3 (tags/RELEASE_500/final)) #2 SMP Tue Mar 20 05:37:06 PDT 2018
$ eclang /lib/modules/4.15.11/build/vmlinux | grep Linux
++ strings -a /lib/modules/4.15.11/build/vmlinux
++ grep clang
Linux version 4.15.11 (exp@exp) (clang version 5.0.0-3 (tags/RELEASE_500/final)) #2 SMP Tue Mar 20 05:37:06 PDT 2018
$ sudo dmidecode -t system | grep "Manufacturer:\|Version"
Manufacturer: LENOVO
Version: Lenovo Y50-70 Touch
$ dmesg | grep NVIDIA
[ 19.491452] nvidia: module license 'NVIDIA' taints kernel.
[ 19.499360] NVRM: loading NVIDIA UNIX x86_64 Kernel Module 390.42 Sat Mar 3 04:10:22 PST 2018 (using threaded interrupts)
[ 19.542830] nvidia-modeset: Loading NVIDIA Kernel Mode Setting Driver for UNIX platforms 390.42 Sat Mar 3 03:30:48 PST 2018
$ nvidia-smi
Tue Mar 20 22:15:00 2018
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 390.42 Driver Version: 390.42 |
|-------------------------------+----------------------+----------------------+
| GPU Name Persistence-M| Bus-Id Disp.A | Volatile Uncorr. ECC |
| Fan Temp Perf Pwr:Usage/Cap| Memory-Usage | GPU-Util Compute M. |
|===============================+======================+======================|
| 0 GeForce GTX 860M Off | 00000000:01:00.0 Off | N/A |
| N/A 52C P8 N/A / N/A | 451MiB / 4046MiB | 0% Default |
+-------------------------------+----------------------+----------------------+
$ glxinfo | grep NVIDIA
server glx vendor string: NVIDIA Corporation
client glx vendor string: NVIDIA Corporation
OpenGL vendor string: NVIDIA Corporation
OpenGL core profile version string: 4.5.0 NVIDIA 390.42
OpenGL core profile shading language version string: 4.50 NVIDIA
OpenGL version string: 4.6.0 NVIDIA 390.42
OpenGL shading language version string: 4.60 NVIDIA
OpenGL ES profile version string: OpenGL ES 3.2 NVIDIA 390.42
$ lsmod | grep nv
nvidia_uvm 815104 0
nvidia_drm 24576 2
nvidia_modeset 1105920 5 nvidia_drm
nvidia 14368768 334 nvidia_uvm,nvidia_modeset
ipmi_msghandler 61440 2 nvidia,ipmi_devintf
drm 454656 6 nvidia_drm,i915,drm_kms_helper
$ ~/nvidia-driver-compiler.sh
++ head -1
+++ uname -r
++ eclang /lib/modules/4.15.11/kernel/drivers/video/nvidia.ko
+++ strings -a /lib/modules/4.15.11/kernel/drivers/video/nvidia.ko
+++ grep clang
clang version 5.0.0-3 (tags/RELEASE_500/final)
++ head -1
+++ uname -r
++ eclang /lib/modules/4.15.11/kernel/drivers/video/nvidia-drm.ko
+++ strings -a /lib/modules/4.15.11/kernel/drivers/video/nvidia-drm.ko
+++ grep clang
clang version 5.0.0-3 (tags/RELEASE_500/final)
+++ uname -r
++ head -1
++ eclang /lib/modules/4.15.11/kernel/drivers/video/nvidia-modeset.ko
+++ strings -a /lib/modules/4.15.11/kernel/drivers/video/nvidia-modeset.ko
+++ grep clang
clang version 5.0.0-3 (tags/RELEASE_500/final)
+++ uname -r
++ head -1
++ eclang /lib/modules/4.15.11/kernel/drivers/video/nvidia-uvm.ko
+++ strings -a /lib/modules/4.15.11/kernel/drivers/video/nvidia-uvm.ko
+++ grep clang
clang version 5.0.0-3 (tags/RELEASE_500/final)
$ ~/nvidia_driver_modules_version.sh
++ grep '^version='
+++ uname -r
++ strings -a /lib/modules/4.15.11/kernel/drivers/video/nvidia.ko
version=390.42
++ grep '^version='
+++ uname -r
++ strings -a /lib/modules/4.15.11/kernel/drivers/video/nvidia-drm.ko
version=390.42
++ grep '^version='
+++ uname -r
++ strings -a /lib/modules/4.15.11/kernel/drivers/video/nvidia-uvm.ko
+++ uname -r
++ grep '^version='
++ strings -a /lib/modules/4.15.11/kernel/drivers/video/nvidia-modeset.ko
version=390.42