Хакер - Выход есть всегда. Решаем проблемы, возникающие при работе в Linux
nopaywall
Содержание статьи
Linux не запускается
Таков один из самых популярных призывов о помощи в среде новичков. На самом деле за этой лаконичной формулировкой проблемы может стоять целый ворох не связанных друг с другом причин поломки.
Пропал Grub
Очень часто с подобной проблемой сталкиваются пользователи Windows, установившие Linux параллельной системой. Все работает прекрасно, пока, в очередной раз переустановив Windows, новичок не затирает загрузчик Linux (Grub) загрузчиком Windows, который даже и не думает позволить пользователю выбрать что-то другое, кроме винды.
Впрочем, сценариев «потерять» Grub множество, равно как и способов его восстановить. Самый логичный — вновь загрузиться с флешки, с которой до этого был установлен Linux, и, открыв терминал, ввести
$ sudo fdisk -l
Среди множества записей о подключенных дисках следует найти группу разделов Linux, выбрать корневой раздел (здесь и далее sda1) и смонтировать его:
$ sudo mount /dev/sda1 /mnt
Затем восстановить Grub на диске:
$ sudo grub-install --root-directory=/mnt /dev/sdа
В довершение можно обновить меню Grub:
$ sudo update-grub --output=/mnt/boot/grub/grub.cfg
Ошибки загрузки ядра
Ядро Linux — один из самых стремительно развивающихся компонентов системы. Однако не всегда обновление ядра идет на пользу системе. Для кого-то неприемлемо удаление драйвера hd для жестких дисков с интерфейсом MFM/RLL, а кому-то досталось криво собранное ядро от поставщика дистрибутива. Нередко причиной поломки становится и сам пользователь, небрежно скомпилировавший собственное ядро.
В конечном итоге, если результатом обновления ядра стал отказ системы на этапе загрузки и выбрать альтернативное ядро через Grub не получится, потому что его нет, остается вернуть предыдущий рабочий вариант ядра на место через терминал.
Лучший способ это сделать — загрузиться со все того же Live CD и использовать старый добрый chroot. Последний, если говорить сильно упрощенно, позволяет «войти» в свой дистрибутив из Live CD и выполнить все необходимые для восстановления команды.
Для начала потребуется подключить корневой раздел (для примера пусть это будет опять же sda1):
# mount /dev/sda1 /mnt
Затем подключить к нему все нужные псевдоФС:
# cd /mnt # mount -t proc proc proc/ # mount -t sysfs sys sys/ # mount -o bind /dev dev/
И наконец, войти в chroot и настроить сеть:
# chroot . /bin/bash # echo nameserver 8.8.8.8 > /etc/resolv.conf
Теперь с помощью пакетного менеджера можно установить нужную версию ядра.
Проблемы с видео
Иногда система загружается, но из-за ошибок в видеодрайвере или из-за несовместимости его версии (нередко проприетарной) и версии ядра запустить графическую подсистему оказывается невозможно. Решение напрашивается само собой: либо откатить версию драйвера, либо сменить его на свободный, если такой существует.
В этом случае не нужны ни Live CD, ни chroot. Достаточно залогиниться в режиме командной строки, которая, как правило, доступна в этом случае по умолчанию, и сменить драйвер.
Однако порою противоречия драйвера и ядра достигают такой степени, что загрузка системы завершается ошибкой без возможности что-либо исправить по ходу запуска. В таком случае можно воспользоваться набором инструментов самого Grub и загрузить систему в консольном режиме.
Чтобы это сделать, нужно:
- выбрать в меню Grub стандартный пункт загрузки;
- нажать
e
для входа в редактор сценария загрузки выбранной записи; - найти в этом сценарии строку с аргументами запуска ядра, начинающуюся с linux или kernel;
- добавить в конце этой строки 3, тем самым указав системе на необходимость загрузки в многопользовательском режиме с поддержкой сети и без графического окружения;
- нажать сочетание Ctrl + X, чтобы начать загрузку с измененными настройками;
- с помощью пакетного менеджера заменить проблемный видеодрайвер на исправный и перезагрузить систему.
Изменения, вносимые в сценарий загрузки описанным образом, будут действовать до момента выключения компьютера. Следующая загрузка будет проходить в штатном режиме с графическим окружением.
Проблемы с установкой и запуском приложений
Хотя в репозиториях современных дистрибутивов есть огромное количество готовых бинарных пакетов приложений на любой вкус, обязательно найдется такое, установить которое в систему иначе как собрав из исходников не удастся.
Нередко запуск таких приложений заканчивается крахом и сопровождается сообщениями об отсутствии некоторых библиотек, хотя на самом деле такие библиотеки есть в системе. Обычно причина этому — несовпадение версии библиотеки.
Несовпадение версии библиотеки
Любимый многими проигрыватель Bomi, чья разработка в последнее время несколько забуксовала и не поспевает за обновлениями используемых библиотек, после установки из исходников может ругаться на отсутствие библиотеки libass.so.5:
bomi: error while loading shared libraries: libass.so.5: cannot open shared object file: No such file or directory
Первая мысль: установить эту библиотеку. Устанавливаем и получаем то же сообщение, потому что версии библиотек не совпадают: у нас 9.0.1, а нужна 5.
В этом случае можно попытаться обмануть Bomi, подсунув ему нашу версию библиотеки под видом нужной ему. Сделать это можно с помощью символической ссылки:
$ cd /usr/lib $ sudo ln -s libass.so.9.0.1 libass.so.5

Потерей библиотек грешат даже приложения, находящиеся в официальных репозиториях. Так что знать, как это исправить, не помешает и законопослушным пользователям.
Конфликты библиотек
Противоположная ситуация складывается, когда пакетный менеджер ругается не на отсутствие, а на присутствие в системе той же библиотеки, что поставляется с устанавливаемым пакетом.
Причиной может быть другое установленное приложение, уже предоставившее данную библиотеку. Так часто случается, когда пакет установлен с помощью инструмента, отличного от штатного пакетного менеджера, например питоновского pip.
Проблемы могут быть и между пакетами, установленными из стандартного менеджера пакетов. Например, установка nvidia-340xx-utils
в Manjaro Linux до внесения разработчиками исправлений могла завершиться целой чередой сообщений о наличии содержащихся в нем библиотек в системе, по недоразумению установленных в систему пакетом libglvnd:
nvidia-340xx-utils: '/usr/lib/nvidia/libEGL.so' существует в файловой системе nvidia-340xx-utils: '/usr/lib/nvidia/libEGL.so.1' существует в файловой системе nvidia-340xx-utils: '/usr/lib/nvidia/libGL.so' существует в файловой системе nvidia-340xx-utils: '/usr/lib/nvidia/libGL.so.1' существует в файловой системе nvidia-340xx-utils: '/usr/lib/nvidia/libGLESv1_CM.so' существует в файловой системе nvidia-340xx-utils: '/usr/lib/nvidia/libGLESv1_CM.so.1' существует в файловой системе nvidia-340xx-utils: '/usr/lib/nvidia/libGLESv2.so' существует в файловой системе nvidia-340xx-utils: '/usr/lib/nvidia/libGLESv2.so.2' существует в файловой системе
В подобных случаях сначала придется деинсталлировать пакет, вызвавший ошибку, а затем установить требуемый.
Иногда, например все для того же pip или если приложение вообще было установлено способом configure && make && make install, потребуется вручную удалять библиотеки, вызвавшие конфликт, не деинсталлируя само приложение, их породившее.
Проблемы доступа к устройствам
Досадно обнаружить, как установленное тобой приложение, работающее с периферийными устройствами, вдруг «радует» сообщением, что нет прав на доступ к этим устройствам, и успешно запускается только с правами суперпользователя. Например, если бы подобное произошло с tvtime в отношении видеокарты, пользователь столкнулся бы с таким сообщением в консоли:
videoinput: Cannot open capture device /dev/video0: Permission denied
Первым делом следует проверить группы доступа к устройству:
$ ls -l /dev/video0
Ожидаемо ты обнаруживаешь среди них root и video, но не обнаруживаешь в последней себя (user), выполнив проверку командой
$ groups
Естественное решение — добавить пользователя (user) в группу (video) любой из доступных команд:
$ sudo usermod -a -G video user $ sudo useradd -a -G video user $ sudo gpasswd -a user video
По завершении команды нужно перезайти в систему.
Ошибки размонтирования
Каждый знает, что прежде, чем вынуть флешку из USB-разъема, нужно выполнить команду (или нажать значок) размонтирования. Не всегда эта команда завершается успешно, и в ответ ты можешь получить сообщение наподобие:
Error unmounting block device 8:17: GDBus.Error:org.freedesktop.UDisks2.Error.DeviceBusy: Error unmounting /dev/sdb1: target is busy
Оно говорит о том, что некое приложение все еще использует носитель /dev/sdb1
. Чтобы определить это приложение, нужно найти, куда смонтирован /dev/sdb1
:
$ mount | grep /dev/sdb1
А затем выполнить такую команду:
$ lsof +D /путь_к_точке_монтирования
Или такую:
$ fuser -m /путь_к_точке_монтирования
Останется только закрыть приложение, в крайнем случае убить процесс и спокойно размонтировать носитель. С помощью fuser это можно сделать, что называется, на месте:
$ fuser -k -m /путь_к_точке_монтирования
В самом крайнем случае можно не убивать приложение, а размонтировать ФС принудительно:
$ sudo umount -f -l /путь_к_точке_монтирования

Фризы системы
Ничто не способно так вывести из себя, как ситуация, когда ни одно твое нажатие на мышь или клавиатуру не отзывается ожидаемой реакцией системы. Первой мыслью в этом случае будет перезагрузить систему хард ресетом. Но лучше пойти другим путем и найти виновника, переключившись в терминал.
Нажимаем Ctrl + Alt + F2, вводим логин и пароль и запускаем top:
$ top
Он покажет процессы (приложения), которые больше других кушают CPU. Те, что находятся на первых местах и в колонках CPU и TIME которых существенно большие цифры, чем у других, и есть корень зла.
Остается только их прибить (1110 здесь и далее — это PID процесса, который top показывает в одноименной колонке):
$ kill 1110
и забыть о проблеме. Хотя нет. На всякий пожарный нужно вновь запустить top и, если процесс все еще на месте, прикончить его с помощью безапелляционного
$ kill -9 1110
Процессы, запущенные от рута, требуют запуска kill через sudo, но в этом случае надо быть предельно внимательным и понимать, что делаешь, чтобы не угробить систему.
Вернуться назад в графический режим можно с помощью сочетания Ctrl + Alt + F7. В некоторых дистрибутивах может помочь Ctrl + Alt + F3 или F4. В общем, следует попробовать все функциональные клавиши.
Настройка беспроводной сети вручную
Во время спасательно-восстановительных операций тебе часто придется работать из голой консоли, в которой не будет апплета NetworkManager. Иногда сеть нужно будет настраивать вручную, и если в случае проводной сети это не проблема (обычно достаточно просто воткнуть кабель), то с беспроводной возникнут сложности.
Чтобы настроить беспроводную сеть, первым делом нужно узнать логическое имя своей беспроводной карточки:
$ iw dev
и проверить, не заблокирован ли интерфейс:
$ sudo rfkill list wlan
Если заблокирован, выполнить
$ sudo rfkill unblock wlan
Затем найти точку доступа (здесь и дальше wlan0 — имя карточки):
$ iwlist wlan0 scan | grep SSID
и подставить вместе с паролем WPA/WPA2 в команду
$ sudo wpa_passphrase ИМЯ_ТОЧКИ ПАРОЛЬ
Полученный ответ следует поместить в файл /etc/wpa_supplicant/wpa_supplicant.conf
.
Подключиться к сети можно будет с помощью двух команд:
$ sudo wpa_supplicant -В -i wlan0 -c /etc/wpa_supplicant/wpa_supplicant.conf $ sudo dhclient -i wlan0

Выводы
За время, прошедшее с момента появления ядра Linux, различия между дистрибутивами, основанными на нем, достигли того уровня, когда переход с одного из них на другой становится достаточно затруднительным без дополнительного изучения их специфики.
Тем не менее общая основа означает и возможность возникновения общих проблем при работе этих операционных систем, что вместе с тем позволяет применять в любой из них представленные выше рецепты, пусть даже с некоторыми косметическими отличиями.
Читайте ещё больше платных статей бесплатно: https://t.me/nopaywall