Error: symbol grub_file_filters not found

При очередной перезагрузке десктопа вдруг выскочила такая ошибка:

Error: symbol grub_file_filters not found

Попытка загрузиться вручную с помощью команд insmod, linux и т.д. не привела к успеху — загрузиться не получалось, ошибка оставалась. Я был уже на новом Debian Bullseye, версия grub — grub2/2.04-1. Никакие пляски с бубном не помогали, пока я не решил загрузиться с live cd образа Debian, записанного на флэшку. При загрузке выбрал не установку, а восстановление (Rescue), дошёл до шага, где можно восстановить grub и, собственно, проделал это. После этого десктоп вполне успешно загрузился. Если бы сделал это сразу, не потратил бы пару часов на попытку решить эту проблему, а давно уже работал. 😉

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

Ошибка обновления Google Chrome

Если вы пользуетесь браузером Google Chrome, то после недавних обновлений вы могли увидеть следующую ошибку при работе команды apt-get update:

root@xxx:~# apt-get update
Hit:1 http://linux.teamviewer.com/deb stable InRelease
Ign:2 http://dl.google.com/linux/chrome/deb stable InRelease
Hit:3 http://security.debian.org buster/updates InRelease
Hit:4 http://linux.teamviewer.com/deb preview InRelease
Get:5 http://dl.google.com/linux/chrome/deb stable Release [943 B]
Get:6 http://dl.google.com/linux/chrome/deb stable Release.gpg [819 B]
Hit:7 https://repo.skype.com/deb stable InRelease
Hit:8 https://download.docker.com/linux/debian stretch InRelease
Hit:9 https://download.virtualbox.org/virtualbox/debian stretch InRelease
Hit:10 http://http.us.debian.org/debian buster InRelease
Hit:11 http://http.us.debian.org/debian buster-updates InRelease
Hit:12 https://download.sublimetext.com apt/stable/ InRelease
Reading package lists... Done
E: Repository 'http://dl.google.com/linux/chrome/deb stable Release' changed its 'Origin' value from 'Google, Inc.' to 'Google LLC'
N: This must be accepted explicitly before updates for this repository can be applied. See apt-secure(8) manpage for details.

Решается данная проблема очень просто:

root@xxx:~# apt update
Ign:1 http://dl.google.com/linux/chrome/deb stable InRelease
Hit:2 http://linux.teamviewer.com/deb stable InRelease
Hit:3 http://security.debian.org buster/updates InRelease
Get:4 http://dl.google.com/linux/chrome/deb stable Release [943 B]
Hit:5 http://linux.teamviewer.com/deb preview InRelease
Hit:6 http://http.us.debian.org/debian buster InRelease
Get:7 http://dl.google.com/linux/chrome/deb stable Release.gpg [819 B]
Hit:8 https://download.docker.com/linux/debian stretch InRelease
Hit:9 https://repo.skype.com/deb stable InRelease
Hit:10 https://download.virtualbox.org/virtualbox/debian stretch InRelease
Hit:11 http://http.us.debian.org/debian buster-updates InRelease
Hit:12 https://download.sublimetext.com apt/stable/ InRelease
E: Repository 'http://dl.google.com/linux/chrome/deb stable Release' changed its 'Origin' value from 'Google, Inc.' to 'Google LLC'
N: This must be accepted explicitly before updates for this repository can be applied. See apt-secure(8) manpage for details.
Do you want to accept these changes and continue updating from this repository? [y/N] y
Get:13 http://dl.google.com/linux/chrome/deb stable/main amd64 Packages [1,131 B]
Fetched 1,950 B in 9s (221 B/s)
Reading package lists... Done
Building dependency tree
Reading state information... Done
All packages are up to date.

И обновляйтесь дальше без ошибок. 😉

Компиляция и сборка ядра linux 4.17

Теперь для автоматический сборки новых версий ядра Linux потребуются следующие установленные пакеты:

apt-get install git fakeroot build-essential ncurses-dev xz-utils libssl-dev bc flex libelf-dev bison

Скрипт автоматический сборки немного поменялся:

#!/bin/sh

# unpack and prepare
cd /usr/src

# check for new file
kernelfile=`wget -O - 2>&1 https://www.kernel.org | grep "latest_link" -A 2 | grep -o 'https://[^"]*'`
newkernel="`echo $kernelfile | grep -o 'linux-.*\.tar\.xz' | cut -b 7- - | cut -b -5 -`"
currentkernel="`cat /proc/version | grep -o 'Linux version [^ ]*' | cut -b 15- -`"

# check new kernel version
if [ "$newkernel" != "$currentkernel" ];
then
    echo "New kernel found!"
    /usr/bin/wget -c $kernelfile
    archname=`find *.xz`
    tar xxf $archname
    dirsrc=`find -P linux-* -maxdepth 0 -type d | head -n 1`
    rm linux
    ln -s $dirsrc linux

    # compile
    cd /usr/src/linux
    make clean && make mrproper
    cp /boot/config-`uname -r` ./.config
    make menuconfig
    make-kpkg clean
    startdate=`date`
    make deb-pkg
    finishdate=`date`

    rm -rf $dirsrc

    echo "Начало: $startdate"
    echo "Завершение: $finishdate"
else
    echo "No new kernel found"
fi

Блог скорее мёртв, чем жив, но автор пока живее всех живых. 🙂

Доработанный скрипт автоматизированной компиляции ядра Linux

А вот и доработанная версия скрипта автоматизированной компиляции ядра Linux. Эта версия умеет самостоятельно проверять наличие новой версии на сайте и скачивать её.

#!/bin/sh

# unpack and prepare
cd /usr/src

# check for new file
kernelfile=`wget -O - 2>&1 https://www.kernel.org | grep "latest_link" -A 2 | grep -o 'https://[^"]*'`
newkernel="`echo $kernelfile | grep -o 'linux-.*\.tar\.xz' | cut -b 7- - | cut -b -5 -`"
currentkernel="`cat /proc/version | grep -o 'Linux version [^ ]*' | cut -b 15- -`"

# check new kernel version
if [ "$newkernel" != "$currentkernel" ];
then
    echo "New kernel found!"
    /usr/bin/wget -c $kernelfile
    archname=`find *.xz`
    tar xxf $archname
    dirsrc=`find -P linux-* -maxdepth 0 -type d | head -n 1`
    rm linux
    ln -s $dirsrc linux

    # compile
    cd /usr/src/linux
    make clean && make mrproper
    cp /boot/config-`uname -r` ./.config
    make menuconfig
    make-kpkg clean
    startdate=`date`
    fakeroot make deb-pkg
    finishdate=`date`

    rm -rf $dirsrc

    echo "Начало: $startdate"
    echo "Завершение: $finishdate"
else
    echo "No new kernel found"
fi

Ротация логов процессов в supervisord

Если вы пользуетесь supervisord, то наверняка сталкивались с неудобством ротации логов в нём.

Типичная настройка в конфигурационном файле процесса в /etc/supervisor.d/ выглядит так:

stdout_logfile=/var/log/progam/process_%(process_num)02d.log
stdout_logfile_maxbytes=100MB
stdout_logfile_backups=50

Логи складываются в отдельные файлы и ротируются по достижении размера в 100 мегабайт. Данный способ не очень удобен, особенно если нужно искать логи за определённую дату.

В этом случае на помощь приходит logrotate.

В конфигурационном файле процесса меняем опции логов:

stdout_logfile_maxbytes=0
stdout_logfile_backups=0

И добавляем в /etc/logrotate.d/processname:

/var/log/program/process_*.log {
    create 0600 root root
    su root root
    daily
    copytruncate
    compress
    missingok
    notifempty
}

Теперь логи будут складываться в «суточные» файлы и автоматически сжиматься.