27
август
2024
17:23

Как проверить целостность операционной системы Linux

27 август 2024 17:23

Если во время обновления операционной системы отключилось питание - после загрузки в режиме восстановления необходимо проверить целостность ОС.

План по восстановлению целостности ОС

  1. Восстановление работы сети
  2. Очистка локального репозитория пакетов
  3. Генерация контрольных сумм пакетов
  4. Проверка контрольных сумм пакетов и файлов конфигурации
  5. Устранение проблем с пакетами
    5.1 Завершение конфигурирования пакетов, которые установлены, но не настроены
    5.2 Переустановка пакетов, у которых произошли изменения контрольных сумм
    5.3 Исправление "битых" пакетов
  6. Отключение посторонних модулей ядра
  7. Окончательная проверка целостности ОС при помощи dpkg -V
  8. Составление списка и просмотр измененных файлов конфигурации
  9. Обновление версий пакетов
  10. Восстановление Snap и Flatpak
  11. Перезагрузка

 

1. Восстановление работы сети

Если сеть работает, пункт пропускаем.

Нужно подключить кабель Ethernet и выполнить запуск сетевой карты

ifconfig -a | less
sudo nano /etc/network/interfaces

auto ensp2s0
iface enp2s0 inet dhcp
nameservers 8.8.8.8

sudo dhclient enp2s0
sudo resolvconf -u
sudo service networking restart
ping ya.ru

2. Очистка кеша пакетов

sudo apt-get clean

Данная команда очищает локальный репозиторий от полученных файлов пакетов. Очистка необходима для генерации контрольных сумм по пакетам не из локального кеша пакетов, где они могли быть подменены.

3. Генерация контрольных сумм пакетов

Установка утилиты debsums

sudo apt install debsums

Инициализация debsums (только в Ubunti Linux).

sudo debsums_init 

4. Проверка контрольных сумм пакетов и файлов конфигурации

Для проверки всех файлов, включая файлы конфигурации:

sudo debsums --all --changed --silent

или сокращенно

sudo debsums -acs

Для проверки только бинарных файлов, исключая файлы конфигурации:

sudo debsums --changed --silent

или сокращенно

sudo debsums -cs

Ключ -a (или--all) для проверки каждого файла, включая файл конфигурации.
Ключ -c выводит только измененные пакеты (то же, что --changed),
Ключ -s (то же что "--silent") подавлять вывод строк, где изменений нет.

Чтобы не выводились измененные .png и .svg, можно использовать следующий улучшенный вариант команды:

sudo debsums --all --changed --silent | grep -v '.png*\|.svg*'

Более предпочтителен второй вариант, без проверки файлов конфигурации, с исключением из вывода изменений файлов ресурсов png и svg:

sudo debsums -cs | grep -v '.png*\|.svg'

где ключ -v означает инвертировать выбор - т.е. отбирать "всё кроме".

Объяснение: с помощью grep при выводе команды исключил упоминания картинок png. и svg.
Картинки относятся к тема оформления, например, в моём случае, к пакету adwaita-icon-theme-full (как узнать имя пакета по имени файла рассказано в пункте 5.2).

Если утилита debsums обнаружила проблемы с пакетами, процесс можно прервать комбинацией клавиш Ctrl+C и перейти к следующему пункту инструкции, так как debsums лишь показывает наличие проблем, но не исправляет их.

5. Устранение проблем с пакетами

5.1 Завершение конфигурирования пакетов

Данная команда запускает принудительную конфигурацию пакетов, которые были распакованы, но не настроены. Ключ -a указывает системе обработать все распакованные, но не сконфигурированные пакеты.

sudo dpkg --configure -a

5.2 Переустановка пакетов, у которых произошли изменения контрольных сумм

Восстановление пакетов производится поштучно командой sudo apt --reinstall install имя пакета. Вначале нужно найти имя пакета.

Обычно имя пакета указано в выводе команды debsums в правой части в скобках (например, текст "from amdgpu-install package"), что означает в переводе "из пакета amdgpu-install".

У файлов, у которых имя пакета не указано, его можно определить название пакета по имени файла, у которого была изменена контрольная сумма.

Например, если вывод missing file /etc/dhcp/dhclient.conf можно определить, к какому пакету относится данный файл:

dpkg --search fqdn

где fqdn - полный путь к изменённому файлу, например, /etc/dhcp/dhclient.conf

В данном примере, ответ:
isc-dhcp-client

Переустановить отдельный пакет:

sudo apt --reinstall install package_name

или

sudo apt-get --reinstall install package_name

где: package_name - имя пакета.

Например:

sudo apt --reinstall install isc-dhcp-client

Если пакет больше не требуется ("хвост" от предыдущей конфигурации), можно выполнить его деинсталляцию. В моём случае видеокарта AMD не используется и я выполнил команду для удаления пакета с именем "amdgpu-install":

sudo apt remove -y amdgpu-install

Пункт 5.2 повторяем, пока вывод команды sudo debsums -cs не станет пустым.

Автоматизация процесса исправления системы

Можно переустановить все пакеты одной командой:

sudo apt-get install -y --reinstall $(dpkg -S $(sudo debsums -cs) | cut -d : -f 1 | sort -u)

Без картинок:

sudo apt-get install -y --reinstall $(dpkg -S $(sudo debsums -cs) |  grep -v '.png*\|.svg' | cut -d : -f 1 | sort -u)

Где ключ sort -u исключает дубли названий пакетов.

(Источник - askubuntu.com)

Замечание: отсутствующие файлы ("missing file") придется установить вручную из пакетов. Например, в моем случае по результатам выполнения sudo debsums -cs мне пришлось переустановить пакеты youtube-dl python3-pkg-resources python3-protobuf и др., вручную.

sudo debsums -cs | grep -v '.png*\|.svg' | sort -u
sudo apt-get install -y --reinstall youtube-dl python3-pip python3-debian python3-pkg-resources python3-protobuf python3-levenshtein sound-theme-freedesktop

5.3 Исправление "битых" пакетов

sudo apt install -f

где -f то же, что --fix-broken

sudo apt install --fix-broken

Описание; данная команда попытается исправить систему с поврежденными зависимостями.

Если последняя команда выдаст сообщение "post-installation script subprocess returned error" abort. " - нужно из вывода команды apt install -f определить имя пакета package_name и затем выполнить:

sudo rm /var/lib/dpkg/info/package_name
sudo dpkg --configure -D 777 package_name
sudo apt-get --reinstall install package_name

6. Отключение посторонних модулей ядра и удаление необязательных компонентов

При выполнении команды debsums -cs обнаружил файл lsb-cprocsp-rdr-64 и ini-файл /etc/opt/cprocsp/config64.ini, которые не относятся к операционной системе Linux. Данные файлы из внешнего компонента CryptoPRO CSP, который я давно удалил, но они присутствуют в системе.

Вывод списка модулей ядра, которые загружаются при запуске ОС:

lsmod 

Показать только первый столбец:

lsmod | cut -d " " -f 1 | sort | less

Проверка следов модуля cprocsp (КриптоПро) в папке '/etc/modprobe.d/'

grep -Rnw '/etc/modprobe.d/' -e cprocsp 

Образец cprocsp среди модулей ядра не был найден.

Необязательных компоненты устанавливаются в папку /opt, содержимое которой нужно контролировать.

Удалил папку "/opt/cprocsp" как ненужную.

sudo rm -rf /opt/cprocsp

Удаление файла конфигурации

sudo rm -rf /etc/opt/cprocsp

7. Окончательная проверка целостности ОС с помощью dpkg -V

sudo dpkg -V

где -V — ключ для проверки всех пакетов в системе. Команда проверяет целостность, сравнивая информацию из файлов установленных пакетов и метаданные, хранящиеся в базе данных dpkg.

Как и прежде, я нахожу имена пакетов для переустановки, но в одной команде «список аргументов слишком длинный», поэтому я разделил ее на несколько шагов.

Шаг 1. Поиск ошибок с помощью dpkg -V

sudo dpkg -V > ~/files_missing.txt

Время выполнения этой команды составляет от 10 минут до часа.

Просмотреть результат работы:

cat ~/files_missing.txt

Этап 2. Поиск соответствующих файлов пакетов:

cat ~/files_missing.txt | grep -v '\?\?\?' | sed "s/missing//" > ~/files_missing2.txt
cat ~/files_missing.txt | grep '\?\?\?' | sed "s/??5??????//" > ~/files_changed.txt

Здесь:

  • в первом файле files_missing2.txt файлы без маски исключаются ??5??????, то есть только отсутствующие файлы.
  • во втором списке files_changed.txt файлы с маской включаются ??5??????, то есть измененные файлы.

Часть 1. Определение имен пакетов отсутствующих файлов для переустановки:

    while read p; do
        echo "$p" 
        dpkg -S "$p" >> ~/reinstall.txt
    done 

Часть 2. Определение имен пакетов измененных файлов для переустановки:

    while read p; do
        echo "$p" 
        dpkg -S "$p" >> ~/reinstall.txt
    done 

Копирование имен пакетов в ~/reinstall2.txt

    while read p; do
        echo "$p" 
        echo "$p" | cut -d ":" -f 1 >> ~/reinstall2.txt
    done 

Просмотр файла reinstall2.txt со списком пакетов для переустановки:

cat ~/reinstall2.txt

Сортировка (уникальность) и удаление запятых в файле reinstall3.txt:

sort -u reinstall2.txt | sed 's/,//g' | sed 's/ /\n/g' | sort -u > reinstall3.txt

Переустановка пакетов в соответствии со списком из файла:

    while read p; do
        echo "$p" 
        sudo apt-get install -y --reinstall "$p" 
    done 

8. Составление списка измененных конфигурационных файлов

Составление списка измененных конфигурационных файлов:
Отбрасываем "отсутствующие" строки.

sudo dpkg -V | grep -v 'missing' > ~/files_changed.txt

Следует изучить список файлов files_changed.txt. Дополнительно можно выбрать только строки со столбцом "c" (измененные)

cat ~/files_changed.txt | grep " c " | cut -d " " -f 3

Изучаем список и проверяем каждый файл *.conf из списка. Если вам просто нужно переустановить пакет, проще всего найти подходящий пакет и переустановить его.

Например:

dpkg --search /etc/ld.so.conf

libc-bin: /etc/ld.so.conf

sudo apt-get install -y --reinstall libc-bin

dpkg --search /etc/sysctl.conf

procps: /etc/sysctl.conf

sudo apt-get install -y --reinstall procps

И т. д.

9. Обновление версий пакетов

Решение проблем с пакетами, которые не были установлены полностью.

sudo dpkg --configure -a

Я обновил версии как обычно:

sudo apt update

sudo apt upgrade -y

Устранение неполадок с неудовлетворенными зависимостями:

sudo apt --fix-broken install

sudo apt dist-upgrade

10. Восстановление Snap и Flatpak

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

snap list

sudo snap remove package_name

sudo snap install package_name

Удаление нескольких пакетов:

    for package_name in package_name1, package_name2, package_name3
    do
        sudo snap remove $package_name
    done

Установка нескольких пакетов:

    for package_name in package_name1, package_name2, package_name3
    do
        sudo snap install $package_name
    done

Где package_name1, package_name2, package_name3 — имена пакетов для установки.

Для обновления версий пакетов в хранилище snap необходимо выполнить команду:

sudo snap refresh --ignore-running

Проверка пакетов приложений, установленных из хранилища flatpak:

flatpak repair

Восстановление flatpak — не быстрая операция, она занимает около десяти минут.

11. Перезагрузка

Если файл был отредактирован на шаге № 1 инструкции /etc/network/interfaces, необходимо отменить изменения: либо удалить строки для запуска сетевой карты (auto enp2s0, ...) и DNS-сервера (dns-nameserver ...), либо закомментировать их:

sudo nano /etc/network/interfaces

auto enp2s0

iface enp2s0 inet dhcp

nameserver 8.8.8.8

Сохраните изменения и выйдите: Ctrl+O, Ctrl+X.

Перезагрузите операционную систему:

sudo shutdown -r now


Источник информации: askubuntu.com.

Последнее изменение: 09.02.2024 – Добавлен раздел № 10 о Snap и Flatpak.



Похожие публикации