- PVSM.RU - https://www.pvsm.ru -
Часто бывает так, что поставив новую стабильную систему, да ещё и отмеченную как LTS, вам всё равно хочется поставить новое ядро (в котором, например, улучшено энергосбережение и наконец-то заработает ваш новый планшет Genius).
Патчить и собирать ядро из исходников — игра, конечно, интересная, но для ленивых пользователей Ubuntu существует готовый репозиторий [1]. Одна беда — скачивать пакеты и следить за обновлениями придётся вручную.
До недавнего времени за обновлениями можно было следить, к примеру, на сайте [2] где ко всему прочему публиковались списки команд для каждой архитектуры, которые можно было просто скопировать в терминал. Но недавно появился скрипт [3] который и послужил мотивом для создания этого очерка.
Я искренне верю, что авторы скрипта задавались единственной целью — перестать публиковать надоевшие списки команд и объяснять в комментариях какая у кого архитектура, но тем не менее скупая мужская слеза покатилась по моей щеке когда я смотрел на его содержимое.
Поэтому я решил сделать паузу и вспомнить как же это делалось раньше, когда деревья были большими, а иногда даже бинарными.
Итак, мы хотим получать новейшее ядро для своей версии Ubuntu из репозитория [1] и устанавливать его в интерактивном или автоматическом (для работы с anachron) режимах.
Ядра помеченные как rc (release candidate) устанавливать не будем, так как они часто ведут себя плохо, да и репозиторий не всегда содержат их полные версии.
Кроме ядер для нашей версии Ubuntu не плохо было бы иметь возможность получать новые стабильные ядра для следующей версии (как показывает практика такие ядра часто работают хорошо и содержат полезные обновления).
Таким образом придём к синтаксису
sudo bash kernel_upd.sh [-a] [-u] [-h]
где опции означают следующее:
-a Включает автоустановку (скрипт не задаёт никаких дополнительных вопросов, что позволяет включить его как задание для anacron)
-u Позволяет устанавливать ядра для версии Ubuntu отличной от нашей
-h Короткая справка
Далее я не буду полностью разбирать скрипт, а покажу только общую стратегию и некоторые полезные приёмы bash программирования.
wget будем скачивать список доступных ядер.grep и регулярного выражения будем отфильтровывать только те ядра, которые нам нужны (не являются rc и возможно соответствуют нашей версии Ubuntu).tail.uname получим версию установленного в системе ядра.dpkg.$0
Сообщения скрипта становятся намного более информативны если они показывают из какого скрипта они пришли. Параметр $0 содержит в себе имя выполняемого скрипта. Например, просьба запустить скрипт с правами суперпользователя может выглядеть так
if [ `whoami` != 'root' ]; then
echo "Permission denied. Run $0 as the root"
exit 1;
fi
В скриптах для Ubuntu очень полезно знать какая версия этого дистрибутива у нас установлена. Команда lsb_release -c выводит у меня сообщение Codename: precise. Осталось только получить вторую колонку вывода с помощью awk
RELEASE_CDN=`lsb_release -c | awk '{print $2}'`
Если мы хотим опционально использовать команды, которые возможно установлены в системе (например, оповещать пользователя с помощью send-notify если он доступен или kdialog если нет) то можно использовать следующий пример.
Получаем пути для нужных команд с помощью which
KNOTIFY=`which kdialog`
NOTIFY=`which notify-send`
Если полученный путь не пустой — то команда доступна
if [[ -n $NOTIFY ]]; then
notify-send 'Installation finished' "Kernel $KERNEL_A was succesfuly installed
Please, reboot your computer for the changes to take effect"
elif [[ -n $KNOTIFY ]]; then
kdialog --title 'Installation finished' --passivepopup "Kernel $KERNEL_A was succesfuly installed
Please, reboot your computer for the changes to take effect"
fi
Запуская скрипт в интерактивном режиме хорошим тоном будет попросить у пользователя подтверждения выполнения каких-либо действий. Для этого существует команда read которая вместе с if или case может стать мощным инструментом для общения с пользователем. Например,
read -p 'Do you want to reboot computer now (y/n)?' REPLY
if [ $REPLY == 'y' ]; then
shutdown -r 0
fi
спросит у пользователя перезагрузить компьютер немедленно.
Команда getopts предлагает мощное средство для анализа опций скрипта в каком бы виде они не были заданы -a -u или -au. Опции без параметров задаются с помощью двоеточия перед ними ":auh", опции с параметрами — с помощью двоеточия после них.
while getopts ":auh" opt; do
case "$opt" in
"a") AUTO=1;;
"u") RELEASE='';;
"h")
echo -e $USAGE
exit 0;;
"?")
echo "Invalid option $OPTARG. Try $0 -h for help"
exit 1;;
*)
echo "Unknown error while processing options"
exit 1;;
esac
done
$?
Во время выполнения скрипта некоторые команды могут завершаться неудачно и рушить дальнейшее выполнение скрипта. Поэтому важно проверять статус выполнения таких команд. Этот статус содержится в параметре $?
dpkg -i *.deb
if [ $? -eq 0 ]; then
echo "..."
fi
|Не стоит забывать о полезной возможности перенаправить вывод одной команды на ввод другой с помощью оператора |
KERNEL_A=`wget -qO - $REP | grep -o "v[0-9].[0-9].[0-9]*-"$RELEASE"w*" | tail -n 1`
Это позволяет совмещать базовые команды в одну, которая делает как раз то, что нам нужно (Команда выше получает последнюю стабильную версию ядра из репозитория и сохраняет её в переменной KERNEL_A).
Пользовательские функции доступные в Bash позволяют значительно сократить объём кода скрипта.
function clean {
cd /
echo 'Cleaning...'
rm -rf /tmp/KERNEL_UPD
}
clean
Готовый скрипт доступен тут [4]. Изменяйте его, правьте, используйте его части для своих целей.
Что хочется сказать напоследок — конечно, Ubuntu — это Linux для людей, но это в первую очередь Linux, и приложив небольшие усилия вы получите не просто красивую оболочку для просмотра видео и сёрфинга в интернете, но и мощный конструктор, с помощью которого можно творить чудеса.
И да прибудет с вами сила!
Автор: Large
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/bash/9677
Ссылки в тексте:
[1] репозиторий: http://kernel.ubuntu.com/~kernel-ppa/mainline/
[2] сайте: http://ubuntovod.ru/
[3] скрипт: http://ubuntovod.ru/download/linux-kernel-3.4.2
[4] тут: https://code.google.com/p/ubuntu-kernel-update/downloads/detail?name=kernel_upd.sh&can=2&q=#makechanges
Нажмите здесь для печати.