Решил я обновить ядро Linux 3.1 из состава openSUSE 12.1 до последнего (сейчас это 3.4-rc6), чтобы потестировать открытый видеодрайвер ATi. Решил сделать RPM из openSUSE Kernel GIT, чтобы:
- Не приходилось прописывать новое ядро вручную в список загрузки
- Чтобы многочисленные патчи от разработчиков openSUSE применились, начиная от картинки при загрузке и заканчивая AppArmor
- Чтобы не создавать вручную файл ".config" с помощью команды make oldconfig, а просто сделать несколько команд - установить пакет RPM с новым ядром Linux!
Оказалось, что легче было сделать всё вручную, так как при создании RPM столкнулся с проблемами. В связи с этим прошу прочитать мои действия и исправить ошибки, и ещё посоветовать мне готовое руководство по обновлению ядра Linux в дистрибутиве openSUSE, если оно есть.
Первое действие в статье Wiki об openSUSE Kernel GIT было такое:
git clone git://gitorious.org/opensuse/kernel-source.git
Я очень удивился тому, что загружалось 850 Мб. И всё это время думал: что же там может быть? Полное ядро в архиве TAR без сжатия? Оказалось, что файлов там всего лишь на 15 Мб, а архивы с патчами занимают 5 Мб (из них 3 - патчи для виртуализации Xen). 850 Мб - это полная история коммитов! Мне уже подсказали в другой теме другую команду для загрузки последнего репозитория GIT:
git clone --depth 1 git://gitorious.org/opensuse/kernel-source.git
Одна из следующих команд:
scripts/sequence-patch.sh --quilt
выдала ошибку «не найдены исходные коды ядра» и предложила мне загрузить их с сайта kernel.org и положить в каталог tmp/linux-3.4-rc6.orig. При этом непонятно: распаковать их туда, или просто положить. Сначала просто положил файл архива - не получилось, распаковал - получилось.
Теперь - команда для создания RPM:
scripts/tar-up.sh
Тоже сначала не заработала, и ей нужно было подсунуть уже архив с исходными кодами ядра. Подсунул. Получил каталог kernel-sources, и удалил все остальные, потому что они больше не нужны. Какие пакеты можно создать:
zenitur@linux-athlon64:/4/zenitur/kernel-source/kernel-source> ls *spec*
kernel-binary.spec.in kernel-omap2plus.spec kernel-syms.spec.in
kernel-debug.spec kernel-pae.spec kernel-tegra.spec
kernel-default.spec kernel-ppc64.spec kernel-trace.spec
kernel-desktop.spec kernel-s390.spec kernel-u8500.spec
kernel-docs.spec kernel-source.spec kernel-vanilla.spec
kernel-docs.spec.in kernel-source.spec.in kernel-xen.spec
kernel-ec2.spec kernel-spec-macros mkspec
kernel-imx51.spec kernel-syms.spec
zenitur@linux-athlon64:/4/zenitur/kernel-source/kernel-source>
Я сначала просто создал пакет kernel-source, подумав, что там же уже есть патчи внутри, и следовательно можно создать RPM! Получился файл kernel-source-3.4.rc6-0.src.rpm, но внутри только они spec-файл, для kernel-source. Для kernel-desktop и kernel-default там ничего нет... А как сделать - не знаю (оказалось - запустить файл mkspec), загрузил репозиторий GIT заново.
Запустил rpmbuild -ba kernel-desktop.spec - сразу получил ошибку «не найден файл kernel-module-subpackage в каталоге /home/zenitur/rpmbuild/SOURCES». Сделал символьную ссылку /home/zenitur/rpmbuild/SOURCES на /4/zenitur/kernel-source/kernel-source - и компиляция пошла.
Когда всё скомпилировалось, я получил файлы RPM kernel-desktop-3.4.rc6-0.x86_64.rpm, kernel-desktop-base-3.4.rc6-0.x86_64.rpm, kernel-desktop-devel-3.4.rc6-0.x86_64.rpm. Первый и второй конфликтовали, и я установил только первый - зачем нужен второй? Затем оказалось, что пакет kernel-desktop конфликтует с пакетом xen-kmp-desktop, который должен иметь ту же версию, что и номер ядра. Спрашивается - а его где взять? Пока что удалил. Всё установилось, кроме kernel-desktop-devel-3.4.rc6-0.x86_64.rpm:
# rpm -ivh kernel-desktop-devel-3.4.rc6-0.x86_64.rpm
ошибка: Неудовлетворенные зависимости:
kernel-devel = 3.4.rc6-0 нужен для kernel-desktop-devel-3.4.rc6-0.x86_64
#
Ну и где взять пакет kernel-devel? Оказалось что в noarch: kernel-devel-3.4.rc6-0.noarch.rpm.
# rpm -Uvh kernel-desktop-devel-3.4.rc6-0.x86_64.rpm ../noarch/kernel-devel-3.4.rc6-0.noarch.rpm
ошибка: Неудовлетворенные зависимости:
kernel-desktop-devel = 3.1.0-1.2 нужен для (установлен)kernel-syms-3.1.0-1.2.1.x86_64
kernel-devel = 3.1.0-1.2 нужен для (установлен)kernel-xen-devel-3.1.0-1.2.1.x86_64
kernel-devel = 3.1.0-1.2 нужен для (установлен)kernel-default-devel-3.1.0-1.2.1.x86_64
kernel-devel = 3.1.0-1.2.1 нужен для (установлен)kernel-source-3.1.0-1.2.1.noarch
kernel-devel = 3.1.0-1.2 нужен для (установлен)kernel-syms-3.1.0-1.2.1.x86_64
#
Наверное, kernel-devel - это мета-пакет для всех возможных kernel-xxx-devel. Пробую удалить kernel-devel, чтобы установить kernel-desktop-devel, и вижу это: скриншот. Да и список файлов там большой - а значит это не метапакет.
Как правильно обновлять ядро Linux в дистрибутиве openSUSE?
P.S. Где в openSUSE в YaST кнопка «Просмотр системных журналов» (View System Log)? Не могу найти ни в YaST, ни в списке пакетов для yast2. Дело в том, что новое ядро не работает идеально: при загрузке вываливает предупреждения. Например AppArmor: хоть и успешно загружается (с ванильным ядром - нет), но пишет раз 20 ошибку про какие-то патчи AppArmor 2.4, и в /var/log/messages стали постоянно появляться такие сообщения:
May 13 15:26:00 linux-athlon64 su: pam_apparmor(su:session): Unknown error occurred changing to root hat: Operation not permitted
Я не знаю, в каком файле находился лог загрузки, поэтому спрашиваю, куда пропала утилита просмотра системных журналов.
P.P.S. Обновил всё до конца:
# rpm -Uvh kernel-desktop-devel-3.4.rc6-0.x86_64.rpm ../noarch/kernel-devel-3.4.rc6-0.noarch.rpm kernel-syms-3.4.rc6-0.x86_64.rpm kernel-xen-3.4.rc6-0.x86_64.rpm kernel-xen-devel-3.4.rc6-0.x86_64.rpm kernel-default-3.4.rc6-0.x86_64.rpm kernel-default-devel-3.4.rc6-0.x86_64.rpm ../noarch/kernel-source-3.4.rc6-0.noarch.rpm
Подготовка... ########################################### [100%]
1:kernel-devel ########################################### [ 13%]
Changing symlink /usr/src/linux from linux-3.1.0-1.2 to linux-3.4.0-rc6-0
2:kernel-desktop-devel ########################################### [ 25%]
Changing symlink /usr/src/linux-obj/x86_64/desktop from ../../linux-3.1.0-1.2-obj/x86_64/desktop to ../../linux-3.4.0-rc6-0-obj/x86_64/desktop
3:kernel-xen-devel ########################################### [ 38%]
Changing symlink /usr/src/linux-obj/x86_64/xen from ../../linux-3.1.0-1.2-obj/x86_64/xen to ../../linux-3.4.0-rc6-0-obj/x86_64/xen
4:kernel-default-devel ########################################### [ 50%]
Changing symlink /usr/src/linux-obj/x86_64/default from ../../linux-3.1.0-1.2-obj/x86_64/default to ../../linux-3.4.0-rc6-0-obj/x86_64/default
5:kernel-syms ########################################### [ 63%]
6:kernel-source ########################################### [ 75%]
7:kernel-default ########################################### [ 88%]
Kernel image: /boot/vmlinuz-3.4.0-rc6-0-default
Initrd image: /boot/initrd-3.4.0-rc6-0-default
Root device: /dev/disk/by-id/usb-Kingston_DataTraveler_160_001CC07CEBE1BB81F16D0029-0:0-part1 (/dev/sdb1) (mounted on / as ext2)
Kernel Modules: thermal_sys thermal processor fan pata_atiixp ata_generic usb-common usbcore usb-storage pcmcia_core pcmcia mmc_core ssb ohci-hcd uhci-hcd ehci-hcd usbhid
Features: acpi block usb resume.userspace resume.kernel
Bootsplash: openSUSE (1280x1024)
8:kernel-xen ########################################### [100%]
Kernel image: /boot/vmlinuz-3.4.0-rc6-0-xen
Initrd image: /boot/initrd-3.4.0-rc6-0-xen
Root device: /dev/disk/by-id/usb-Kingston_DataTraveler_160_001CC07CEBE1BB81F16D0029-0:0-part1 (/dev/sdb1) (mounted on / as ext2)
Kernel Modules: hwmon thermal_sys thermal processor fan pata_atiixp ata_generic xennet cdrom xenblk usb-common usbcore usb-storage pcmcia_core pcmcia mmc_core ssb ohci-hcd uhci-hcd ehci-hcd hid usbhid
Features: acpi block usb resume.userspace resume.kernel
Bootsplash: openSUSE (1280x1024)
#
Однако если эти ошибки при загрузке не пропадут, придётся возвращать старое ядро.