Автор Тема: Скрипт обновления ядра  (Прочитано 1912 раз)

Оффлайн Koi

  • alt linux team
  • ***
  • Сообщений: 1 893
  • валар дохаэрис
    • Канал на youtube
Скрипт обновления ядра
« : 12.10.2015 16:56:08 »
Подскажите как можно сравнить версии ядер sh скриптом. Нужно текущее ядро сравнивать с новым из репозитория.

Сейчас делаю такие каракули:
Оставляю только цифры
uname -r | cut -f1 -d - | sed 's/[^0-9]//g'
Затем
apt-cache show kernel-headers-std-def | grep 'Version: ' | cut -f3 -d : | cut -f1 -d - | sed 's/[^0-9]//g'Тоже только цифры, в теории они должны изменятся только в плюс.

Ну и дальше сравниваю
if (( "$новое" > "$текущее" ));
Сравнение работает, проверял на разных ядрах включая 4, но выглядит это топорно... как можно сравнить более культурно?

Вся задумка такая.

test-archives(){
                DU=$(du -ms /var/cache/apt/archives | cut -f1)
                if (( "$DU" >= 3500 ));
                  then
                      echo "Объем archives превысил 3500 мегабайт"
                      echo "Произвожу очистку"
                          apt-get autoclean
                  else
                      echo "Очистка archives не требуется"
                fi


up-kernel(){
            echo "Обновление ядра"
            update-kernel -f
            echo "Перезагрузка произойдет через 15 секунд"
            sleep 15
            reboot
}

kern-update(){
             aptKERN=$(apt-cache show kernel-headers-std-def | grep -i 'Version: ' | cut -f3 -d : | cut -f1 -d - | sed 's/[^0-9]//g')
             kVERS=$(uname -r | cut -f1 -d - | sed 's/[^0-9]//g')
             echo "Обновление списка пакетов apt-get update"
             apt-get update
             if (( "$aptKERN" > "$kVERS" ));
               then
                   test-archives
                   echo "Удаление старого ядра"
                   sh /opt/au-kernel/remove-kernel
                   echo "Обновление пакетов дистрибутива"
                   apt-get dist-upgrade -y
                   up-kernel
               else
                   echo "Обновление ядра не требуется"
                   echo "Выход из программы через 5с"
                   sleep 5   
             fi       
}
kern-update
Скрипт пускаю от рут.
« Последнее редактирование: 08.11.2015 21:33:14 от Koi »

Оффлайн ASte

  • Мастер
  • ***
  • Сообщений: 1 566
Re: Сравнение версий ядер.
« Ответ #1 : 12.10.2015 17:12:49 »
Посмотрите внутри /usr/sbin/update-kernel в сизифе
(на p7 ЕМНИП такой проверки нет, он тупо предлагает при запуске обновить ядро, а в сизифе уже работает интеллектуально)

###################################################################
# update kernel and modules

# get running kernel version
current_kernel_package=$(rpmquery -qf /lib/modules/$(uname -r)/kernel 2>/dev/null)
if [ -n "$current_kernel_package" ] ; then
    current_kernel_pkgname=$(rpmquery --queryformat "%{NAME}-%{SERIAL}:%{VERSION}-%{RELEASE}\n" -q $current_kernel_package)
    echo $current_kernel_pkgname | grep -q "(none)" && current_kernel_pkgname=$(rpmquery --queryformat "%{NAME}-%{VERSION}-%{RELEASE}\n" -q $current_kernel_package)
else
    current_kernel_pkgname="UNKNOWN"
fi
echo "Running kernel version: $current_kernel_pkgname"


echo "Checking for available kernel packages..."
# get list of all available kernel packages
KERNEL_PKGS="$(apt-cache pkgnames kernel-image)"

# set kernel flavour. if not defined with -t option, use current
current_kernel_flavour="$(uname -r | cut -d "-" -f2,3)"
kernel_flavour="${kernel_flavour:-$current_kernel_flavour}"

# check that we have at least one kernel with defined kernel_flavour
num_available_kernels="$(echo "$KERNEL_PKGS" | grep -c "$kernel_flavour")"
[ "$num_available_kernels" != 0 ] || fatal "There are no available kernels with kernel flavour $kernel_flavour"

# check that we have at least one kernel with defined kernel package release
[ -z "$release" ] || {
num_available_kernels="$(echo "$KERNEL_PKGS" | grep -c "$release")"
[ "$num_available_kernels" != 0 ] || fatal "There are no available kernels with package release $release"
}

# define how we must select available packages with needed flavour/release
[ -z "$release" ] && pgkgrep="kernel-image-$kernel_flavour#" || pgkgrep="kernel-image-$kernel_flavour#.*$release$"

# get the maximum available kernel package version
kmaxver=
while read version
do
comparever="$(rpmevrcmp "$kmaxver" "$version")"
[ "$comparever" -lt 0 ] && kmaxver="$version" ||:
done < <(echo "$KERNEL_PKGS" | grep "$pgkgrep" | sed -e "s,^kernel-image-$kernel_flavour#,,g")

# check if the current kernel is up-to-date
if [ -z "$force" ] && [ "$current_kernel_pkgname" = "kernel-image-$kernel_flavour-$kmaxver" ] ; then
echo "Latest kernel $kernel_flavour-$kmaxver is already running on your system."
echo "No upgrade is needed. Use -f for force."
exit 0
fi

# check if selected kernel is already installed
if [ -z "$force" ] && rpm -q "kernel-image-$kernel_flavour-${kmaxver/*:/}" >/dev/null ; then
echo "Latest kernel $kernel_flavour-$kmaxver is already installed on your system."
echo "No upgrade is needed. Use -f for force."
exit 0
fi

# ask user
echo -n "Try to install new kernel kernel-image-$kernel_flavour-$kmaxver and update its modules [y]/n? "
[ "$force" = 1 ] && echo "yes" || {
read
case "$REPLY" in
n|no|N|No|NO|0) exit 0
;;
*)
;;
esac
}


Это фрагмент кода взятый оттуда.
« Последнее редактирование: 12.10.2015 17:14:28 от ASte »

Оффлайн Koi

  • alt linux team
  • ***
  • Сообщений: 1 893
  • валар дохаэрис
    • Канал на youtube
Re: Сравнение версий ядер.
« Ответ #2 : 12.10.2015 18:42:38 »
Спасибо, посмотрю как можно улучшить.







Оффлайн Koi

  • alt linux team
  • ***
  • Сообщений: 1 893
  • валар дохаэрис
    • Канал на youtube
Re: Сравнение версий ядер.
« Ответ #3 : 14.10.2015 15:18:03 »
Скрип готов к тестированию, кто хочет может скачать, он упакован в архив там папка для картинок, логов , чтоб было удобно пользоваться, в архиве небольшая инструкция.
https://yadi.sk/d/zffFtRhhjjDUd

Оффлайн Koi

  • alt linux team
  • ***
  • Сообщений: 1 893
  • валар дохаэрис
    • Канал на youtube
Re: Сравнение версий ядер.
« Ответ #4 : 08.11.2015 21:31:44 »
Новый вариант скрипта с графическими окошечками zenity и rpm запаковал для удобства установки.

Для тестов:
https://yadi.sk/d/zffFtRhhjjDUd

Сам пользуюсь, очень удобно я ленивый жуть, а тут этнер нажал и все само делается.

Оффлайн ruslandh

  • Поспешай не торопясь !
  • Модератор глобальный
  • *****
  • Сообщений: 32 361
  • Учиться .... Телепатами не рождаются, ими ....
Re: Скрипт обновления ядра
« Ответ #5 : 08.11.2015 21:46:36 »
Ты-бы хоть в багзилу оформлял, в качестве предложений - может кто-нибудь твои полезные штучки стал-бы собирать, а то в глуби форума всё и останется.

Оффлайн Koi

  • alt linux team
  • ***
  • Сообщений: 1 893
  • валар дохаэрис
    • Канал на youtube
Re: Скрипт обновления ядра
« Ответ #6 : 08.11.2015 22:11:15 »
Ты-бы хоть в багзилу оформлял, в качестве предложений
Там микро писулька, думаю если б разработчики сочли это необходимым уже давно сделали. Да и я совсем новичок в этом. 8-|
Делаю для себя, но вдруг кому тоже пригодится.
« Последнее редактирование: 08.11.2015 22:44:37 от Koi »

Оффлайн ruslandh

  • Поспешай не торопясь !
  • Модератор глобальный
  • *****
  • Сообщений: 32 361
  • Учиться .... Телепатами не рождаются, ими ....
Re: Скрипт обновления ядра
« Ответ #7 : 08.11.2015 22:23:12 »
Там микро писульк
Тем более - о каких разработчиках ты говоришь? Им просто не до этого, а от готового патча, или удобной утилитки, никто не откажется.

Петрович

  • Гость
Re: Скрипт обновления ядра
« Ответ #8 : 08.11.2015 23:30:41 »
Удобно.
Но конец поразил (не спросясь , ушел в  перезагрузку)

Оффлайн Koi

  • alt linux team
  • ***
  • Сообщений: 1 893
  • валар дохаэрис
    • Канал на youtube
Re: Скрипт обновления ядра
« Ответ #9 : 09.11.2015 00:01:43 »
Там предупреждение что через 15 сек перезагрузка. Наверно да все же стоит спрашивать, переделаю окошко.

Петрович

  • Гость
Re: Скрипт обновления ядра
« Ответ #10 : 09.11.2015 11:00:50 »
Отвлекся (не заметил)

Оффлайн ksa

  • Модератор глобальный
  • *****
  • Сообщений: 9 049
Re: Скрипт обновления ядра
« Ответ #11 : 09.11.2015 11:47:00 »
Ты-бы хоть в багзилу оформлял, в качестве предложений - может кто-нибудь твои полезные штучки стал-бы собирать, а то в глуби форума всё и останется.
Новый вариант скрипта с графическими окошечками zenity и rpm запаковал для удобства установки.

Для тестов:
https://yadi.sk/d/zffFtRhhjjDUd

Сам пользуюсь, очень удобно я ленивый жуть, а тут этнер нажал и все само делается.
У меня ядро un-def версии 4.1.6, в репозитории лежит тоже самое (на сегодняшний момент). Скрипт выдает, что ядро устарело (где-то сравнение не срабатывает ?) и чего-то пытается делать несколько минут (судя по активности сетевой, лезет в сеть), хотя по всей логике надо было выдать сообщение, что ваше ядро не нуждается в обновлениях и завершить приложение.

Оффлайн Koi

  • alt linux team
  • ***
  • Сообщений: 1 893
  • валар дохаэрис
    • Канал на youtube
Re: Скрипт обновления ядра
« Ответ #12 : 09.11.2015 17:44:55 »
У меня ядро un-def версии 4.1.6, в репозитории лежит тоже самое (на сегодняшний момент).
С 4м ядром не тестил, посмотрю. Ему должно быть  все равно какие сравнивать если только в 4 названия пакетов не изменены.
не спросясь , ушел
Убрал таймер вообще, сделал простую кнопку перезагрузки.
« Последнее редактирование: 09.11.2015 18:01:16 от Koi »

Оффлайн Koi

  • alt linux team
  • ***
  • Сообщений: 1 893
  • валар дохаэрис
    • Канал на youtube
Re: Скрипт обновления ядра
« Ответ #13 : 09.11.2015 19:37:03 »
(где-то сравнение не срабатывает ?)
Скрипт ищет заголовки kernel-headers-std-def, а у 4 ядра kernel-headers-un-def

Как временная мера для ядра 4* замените в 43 строке (файла au-kernel.sh), kernel-headers-std-def на kernel-headers-un-def

Или выполнить команду
sed -i 's/kernel-headers-std-def/kernel-headers-un-def/' /opt/au-kernel/au-kernel.sh
« Последнее редактирование: 09.11.2015 20:07:56 от Koi »

Оффлайн asy

  • alt linux team
  • ***
  • Сообщений: 8 368
Re: Скрипт обновления ядра
« Ответ #14 : 09.11.2015 21:15:00 »
Скрипт ищет заголовки kernel-headers-std-def, а у 4 ядра kernel-headers-un-def
Нет, тут надо по принципу update-kernel делать, либо текущий флавор, либо задавать через ключ. Завязываться на std-def не хорошо. Скрипт не смотрел пока.