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 < ~/files_missing2.txt

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

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

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

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

Просмотр файла 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 < ~/reinstall3.txt

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

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

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

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

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_name - имя пакета.

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

sudo snap refresh --ignore-running

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

flatpak repair

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

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

Если в пункте №1 инструкции был отредактирован файл /etc/netwиork/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
Дата последнего редактирования: 02.09.2024 - добавлен раздел №10 про snap и flatpak.



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