LINUX.ORG.RU
ФорумTalks

И еще немного костылей - скрипт для сборки ядра и обновления модулей.

 ,


2

2

Вкратце: чтобы не делать каждый раз, когда прилетает новое ведро кучу команд типа:

make bzImage modules modules_install install
eselect kernel set <#>
emerge -v @module-rebuild
grub-mkconfig -o /boot/grub/grub.cfg

вот такой простенький скриптик

#!/bin/bash

if [ "$(whoami)" != 'root' ];
then
echo "You don\`t have root access"
elif [ "$(pwd | grep '/usr/src/linux-')" = '' ];
then
echo "You don\`t in kernel sources directory, needed /usr/src/linux-<kernel_version>"
else
KERNEL_VERSION="$(pwd | sed "s/^\/usr\/src\///g")"
ESELECT_KERNEL_VERSION="$(eselect kernel list | grep $KERNEL_VERSION | awk '{print $1}' | sed "s/^\[//g" | sed "s/\]$//g")"
make bzImage modules modules_install install
eselect kernel set $ESELECT_KERNEL_VERSION
emerge -v @module-rebuild
grub-mkconfig -o /boot/grub/grub.cfg
fi

Юзайте на здоровье.

★★★★★

Последнее исправление: leg0las (всего исправлений: 2)

Я любить языка русский.

takino ★★★★★
()

У меня другой скрипт, совсем простенький:

#!/usr/bin/env bash

kernel_list=$(eselect --brief kernel list)
new_kernel=${kernel_list##*$'\n'}

# Cd into the working directory
cd /usr/src/${new_kernel}

# Make .config of new kernel and store its backup.
# Note that link '/usr/src/linux' points to the current kernel
cp /usr/src/linux/.config .
make oldconfig
mkdir /backup/${new_kernel}
cp .config /backup/${new_kernel}

# Make a kernel image and update GRUB2 menu
make && make modules_install
cp arch/x86/boot/bzImage /boot/kernel${new_kernel#linux}
grub2-mkconfig -o /boot/grub/grub.cfg

# Update the kernel link upto new kernel
eselect kernel set $(wc -l <<< "$kernel_list")

iVS ★★★★★
()
Ответ на: комментарий от leg0las

судо — зло. а рута парсить через уид куда более правильно, нежели через хуэмай.

если уж пишешь костыли, то пиши их нормально. вот я нормально не осилил, так не отсвечиваю. :3

funeralismatic ★★★
()
Ответ на: комментарий от iVS

У тебя просто бэкапится текущий конфиг + обновление граба, у меня еще и пересборка модулей. Сделал так, потому что в том же дебиане (хоть он и бинарный) при установке новой версии ядра пересобираются модули и обновляется граб.

leg0las ★★★★★
() автор топика
Ответ на: комментарий от iVS

Не одну, вообще-то тебе нужно eselect kernel set <#> сделать, прежде чем собирать модули под новое ведро, собственно скрипт и парсит версию ядра и подставляет нужное значение в eselect kernel set (пардон за тавтологию).

leg0las ★★★★★
() автор топика
Последнее исправление: leg0las (всего исправлений: 1)
Ответ на: комментарий от leg0las

Ты развел какой-то детский сад.

тебе нужно eselect kernel set <#> сделать, прежде чем собирать модули под новое ведро

ну и поставь куда нужно:

# Update the kernel link upto new kernel
eselect kernel set $(wc -l <<< "$kernel_list")
Я тоже могу начать критиковать, что ты должен скрипт вызывать именно из директории сорцов. И я не пложу кучу кода вида
KERNEL_VERSION="$(pwd | sed "s/^\/usr\/src\///g")"
ESELECT_KERNEL_VERSION="$(eselect kernel list | grep $KERNEL_VERSION | awk '{print $1}' | sed "s/^\[//g" | sed "s/\]$//g")"
а обхожусь одной-двумя простыми командами.

iVS ★★★★★
()
Ответ на: комментарий от funeralismatic

в смысле? или нужно заменить на конструкцию типа

id | awk '{print $1}' | grep "=0"
?

leg0las ★★★★★
() автор топика
Ответ на: комментарий от iVS

Пардон, туплю.

Проверил - твой скрипт ставит в eselect последнее ядро. Не всегда пользователи, да и я сам юзаю распоследнее, даже если поставлено.

leg0las ★★★★★
() автор топика
Последнее исправление: leg0las (всего исправлений: 4)
Ответ на: комментарий от leg0las

Проверил - твой скрипт ставит в eselect последнее ядро. Не всегда пользователи, да и я сам юзаю распоследнее, даже если поставлено.

Задача тогда еще проще: смотри eselect kernel list (это проще, чем переходить в нужную директорию) и передавай номер ядра как параметр. Тогда заменяешь строки в скрипте

kernel_list=$(eselect --brief kernel list)
new_kernel=${kernel_list##*$'\n'}
на
kernel_list=$(eselect --brief kernel list)
new_kernel=$(sed -n "${1}p" <<< "$kernel_list")

iVS ★★★★★
()
Последнее исправление: iVS (всего исправлений: 1)
Ответ на: комментарий от iVS

Ну и можно сделать условие - без параметра ставим последнюю версию ядра, а с параметром - соответствующий номер ядра.

iVS ★★★★★
()
Ответ на: комментарий от Pavval

Ты про дебиан? На серверах стоит))

leg0las ★★★★★
() автор топика
Ответ на: комментарий от leg0las

Все-таки причина в чем?

В том, что, если у меня будет пользователь dyadya_vasya с uid=0, то это и будет суперпользователь, несмотря на то, что `whoami` другой. Переводя в практическую плоскость скажу, что когда-то мастерил honeypot в котором root был совсем не root, точнее uid у него был не 0. Ситуация редкая, да, поэтому как правило и объясняют просто «более правильно». Это все равно что спрашивать почему программы в /usr/ а не в program files ;)

Kroz ★★★★★
()
Ответ на: комментарий от iVS

У меня такой скрипт получается, правда, не запускал

#!/usr/bin/env bash

kernel_list="$(eselect --brief kernel list)"
case $# in
    0)
        kernel_name=${kernel_list##*$'\n'}
        kernel_number=$(wc -l <<< "$kernel_list")
        ;;
    1)
        kernel_name=$(sed -n "${1}p" <<< "$kernel_list")
        if [[ -z $kernel_name ]]; then
            echo "The kernel is not found."
            exit 1
        fi
        kernel_number=$1
        ;;
    *)
        echo "Multiple parameters are not allowed."
        exit 1
        ;;
esac

cd /usr/src/${kernel_name}
[[ ! -f .config ]] && zcat /proc/config.gz > .config

# Update .config of new kernel and store its backup
make oldconfig
[[ ! -d /backup/${kernel_name} ]] && mkdir /backup/${kernel_name}
cp .config /backup/${kernel_name}

# Make a kernel image, modules, and update GRUB2 menu
make dep bzImage modules modules_install
cp arch/x86/boot/bzImage /boot/kernel${kernel_name#linux}
eselect kernel set ${kernel_number}
emerge -v @module-rebuild
grub2-mkconfig -o /boot/grub/grub.cfg

exit 0

iVS ★★★★★
()
Последнее исправление: iVS (всего исправлений: 3)
Ответ на: комментарий от iVS

Меня интересует строка

[[ ! -f .config ]] && zcat /proc/config.gz > .config
Ведь, если .config идет вместе с сорцами, то проверку нужно убирать. Не помню этого момента.

iVS ★★★★★
()

Странно, всегда вместо make делал make -j4, так же быстрее собирает.

haku ★★★★★
()

Чем этот скрипт лучше genkernel?

genkernel со своим конфигом конечно. я пару лет назад нашел вот такой мануал и можно сказать до сих пор им пользуюсь:

# Устанавливаем исходники
emerge -v gentoo-sources
# Выбираем нужное ядро
eselect kernel list
eselect kernel set 2
# Переносим старый конфиг (из текущего запущенного ядра, если в нём
# включены CONFIG_IKCONFIG и CONFIG_IKCONFIG_PROC, иначе копированием)
zcat /proc/config.gz > /usr/src/linux/.config
# Изменяем при необходимости опции, да и без этого полезно запустить (ну.. или oldconfig)
make menuconfig
# Собираем новое ядро (splash - при желании):
genkernel --no-clean --loglevel=3 --disklabel --bootloader=grub --splash=natural_gentoo --splash-res=1600x900 all
# Можно перезагружаться.
Loki13 ★★★★★
()
Последнее исправление: Loki13 (всего исправлений: 1)

У меня нет скрипта для обновления, но есть скрипт пересборки выбранного ядра

KLINK=$(readlink /usr/src/linux)
cd /usr/src/linux
make oldconfig
make -j5 menuconfig
make -j5 && make INSTALL_MOD_STRIP=1 -j5 modules_install
mount /boot
cp -v /usr/src/linux/arch/x86_64/boot/bzImage /boot/kernel-shiawase-${KLINK#*-}
grub2-mkconfig -o /boot/grub2/grub.cfg
#umask 077…
find /lib/modules/ -type f -exec chmod -R 644 {} \;
find /lib/modules/ -type d -exec chmod -R 755 {} \;
find /usr/src/linux/ -type d -exec chmod -R 755 {} \;
emerge @module-rebuild
+ там ещё копирование текущего конфига где-то

wakuwaku ★★★★
()
Ответ на: комментарий от leg0las

Сделал так, потому что в том же дебиане (хоть он и бинарный) при установке новой версии ядра пересобираются модули и обновляется граб.

Пересобирается же только всякая фигня с dkms. У меня такой, например, где-то совсем нет, где-то только невидия.

redgremlin ★★★★★
()
Ответ на: комментарий от leg0las

Все-таки причина в чем?

У меня, например, рута нет на машине. Нет, серьезно:

^_^@phantom ~ # id
uid=0(neko) gid=0(loli) группы=0(loli)

Парсинг по id сработает. По имени - нет. И это - абсолютно валидная конфигурация.

Pinkbyte ★★★★★
()

Подкину `eselect --brief kernel show`, выводит путь к сорцам текущего ядра.

ksa242
()
cd ~/git/linux
git pull
make oldconfig
make nconfig
make -j5
make modules_install
cp arch/x86/boot/bzImage /boot/efi/bzImage.efi
Adjkru ★★★★★
()
Ответ на: комментарий от leg0las
└─> equery u sys-kernel/vanilla-sources
[ Legend : U - final flag setting for installation]
[        : I - package is installed with flag     ]
[ Colors : set, unset                             ]
 * Found these USE flags for sys-kernel/vanilla-sources-3.13.9:
 U I
 - - build   : !!internal use only!! DO NOT SET THIS FLAG YOURSELF!, used for creating build images and the first half of bootstrapping [make stage1]
 - - deblob  : Remove binary blobs from kernel sources to provide libre license compliance.
 + + symlink : Force kernel ebuilds to automatically update the /usr/src/linux symlink
shell-script ★★★★★
()
Последнее исправление: shell-script (всего исправлений: 1)
Ответ на: комментарий от shell-script

+ + symlink : Force kernel ebuilds to automatically update the /usr/src/linux symlink

Ты путаешь такие вещи как изменение ссылки, когда прилетело новое ядро, и, когда оно было скомпилировано. Не говоря уже о том, что не всегда нужно собрать именно последнее ядро и перевести ссылку на него.

iVS ★★★★★
()
Ответ на: комментарий от shell-script

Даладна. Возьми и выполни на старых исходниках скрипт - симлинк и модули будут собраны «как надо».

leg0las ★★★★★
() автор топика
Ответ на: комментарий от leg0las

Да в том-то и штука, что у меня всё это делается одним алиасом. :)

shell-script ★★★★★
()
Ответ на: комментарий от shell-script

В вышестоящих скриптах не было ничего о сохранении старых ядер.

ааа, точно. emerge -c оставляет последнее, а при установке старого ты автоматом меняешь симлинк. спасибо, разобрался

iVS ★★★★★
()
Ответ на: комментарий от wakuwaku

Теперь так, интересно, будет работать?

KLINK=$(readlink /usr/src/linux)
#.+[0-9]{,3}\.[0-9]{,3}\.[0-9]{,3}\(
LKERN=$(eix -c gentoo-sources | sed -r 's/.+\(([0-9]{,3}\.[0-9]{,3}\.[0-9]{,3})\)\@[0-9]{2}\/[0-9]{2}\/[0-9]{4}\).+/\1/')
[[ $(echo ${LKERN} | wc -c) -le 11 ]] || exit
CKERN=$(uname -r)
LKERN+=-${CKERN##*-}
[[ $KLINK = linux-$LKERN ]] || ln -sT /usr/src/linux-${LKERN} /usr/src/linux && echo '\nSymlink was updated\n\n' || echo '\nFailed to change symlink\n\n' && exit
[[ linux-$CKERN = $KLINK ]] || cp -l "/usr/src/linux-${CKERN}/.config" "/usr/src/linux-${LKERN}/.config" && echo '\nCurrently loaded kernel differs from selected, hard link config file\n\n'
cd /usr/src/linux
make oldconfig
make -j5 menuconfig
make -j5 && make INSTALL_MOD_STRIP=1 -j5 modules_install
mount /boot
cp -v /usr/src/linux/arch/x86_64/boot/bzImage /boot/kernel-shiawase-${KLINK#*-}
grub2-mkconfig -o /boot/grub2/grub.cfg
find /lib/modules/ -type f -exec chmod -R 644 {} \;
find /lib/modules/ -type d -exec chmod -R 755 {} \;
find /usr/src/linux/ -type d -exec chmod -R 755 {} \;
sed 's/^CONFIG_R8169/\#CONFIG_R8169/' -i /usr/src/linux/.config
emerge @module-rebuild
sed 's/^\#CONFIG_R8169/CONFIG_R8169/' -i /usr/src/linux/.config
Только вот как более старые ядра отнесутся к конфигу от более нового.

wakuwaku ★★★★
()
Последнее исправление: wakuwaku (всего исправлений: 1)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.