Ubuntu FAQ Печать
Добавил(а) microsin   

Ответы на часто задаваемые вопросы, которые приходится решать новичкам при работе с операционной системой Ubuntu. Почти все написанное здесь подойдет и к Debian. Непонятные термины и сокращения см. в разделе "Словарик", в конце статьи.

Потому что grub или система пытается выводить текстовые сообщения загрузки в графическом режиме на неправильно сконфигурированном видеодрайвере. Нужно сконфигурировать grub, и нужно правильно выбрать видеодрайвер на экране загрузки (нужны права администратора).

GRUB. В конфигурационном файле /etc/default/grub раскомментируйте строку GRUB_TERNINAL=console, сохраните файл, затем выполните команду update-grub. Также может понадобиться изменить опцию загрузки Linux "splash quiet" на "nomodeset".

Подробно решение проблемы описано в статье [1].

sudo service lightdm stop

who

Команды who -u и who -a печатают номер процесса в последнем столбце, что позволяет прибить нужную сессию командой kill:

sudo kill -9 номер_сессии

Посмотреть открытые порты могут утилиты netstat, lsof и nmap. Первые две команды показывают порты на локальной машине, а nmap позволяет просканировать сеть по определенному IP или диапазону адресов IP.

Пример запуска netstat:

sudo netstat -ntulp

Опции netstat:

Опция Функция
-l (--listening) Посмотреть только прослушиваемые порты.
-p (--program) Показать имя программы и ее PID.
-t (--tcp) Показать tcp порты.
-u (--udp) Показать udp порты.
-n (--numeric) Показывать ip адреса в числовом виде.

Команда lsof также показывает открытые порты:

sudo lsof -i

~$ lspci | grep VGA
01:00.0 VGA compatible controller: NVIDIA Corporation NV11 [GeForce2 MX/MX 400] (rev b2)

Аналогичный способ:

~$ lspci -nn |egrep "VGA|Display"
01:00.0 VGA compatible controller [0300]: NVIDIA Corporation NV11 [GeForce2 MX/MX 400] 
[10de:0110] (rev b2)

Способ с более подробным выводом (аналогичный вывод дает команда sudo lshw -C display):

:~$ sudo lshw -C video
  *-display UNCLAIMED
       описание: VGA compatible controller
       продукт: NV11 [GeForce2 MX/MX 400]
       производитель: NVIDIA Corporation
       физический ID: 0
       сведения о шине: pci@0000:01:00.0
       версия: b2
       разрядность: 32 bits
       частота: 66MHz
       возможности: pm agp agp-2.0 vga_controller bus_master cap_list
       конфигурация: latency=32 maxlatency=1 mingnt=5
       ресурсы: память:e0000000-e0ffffff память:d8000000-dfffffff память:c0000-dffff

Информацию об этом можно узнать из лога X-сервера:

~$ grep -i chipset /var/log/Xorg.0.log
[   970.068] (II) NOUVEAU driver for NVIDIA chipset families :
[   970.075] (II) VESA: driver for VESA chipsets: vesa

Процесс по шагам:

1. Запустите команду lsblk, чтобы посмотреть состояние дисков:

~$ lsblk
NAME   MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
fd0      2:0    1    4K  0 disk
sda      8:0    0 37,3G  0 disk
L-sda1   8:1    0 37,3G  0 part /
sdb      8:16   1  7,2G  0 disk
L-sdb1   8:17   1  7,2G  0 part
sr0     11:0    1 1024M  0 rom

По результату этой команды можно узнать, что есть устройство sda1 размером 37.3 гигабайта, смонтированное в корневой каталог /, очевидно что это жесткий диск. Также есть устройство sdb1 размером 7.2 гигабайт, но оно не смонтировано, и к нему не привязан ни один файл. Это наша флешка.

2. Нужно узнать, какой путь в системе до этой флешки, и как она отформатирована. Это можно сделать с помощью команды sudo lshw. Ниже показана часть вывода sudo lshw, относящийся только к флешке:

~$ sudo lshw
..
   *-medium
        физический ID: 0
        логическое имя: /dev/sdb
        размер: 7400MiB (7759MB)
        возможности: partitioned partitioned:dos
        конфигурация: signature=213bbe6c
      *-volume
           описание: Windows FAT volume
           производитель: SYSLINUX
           физический ID: 1
           логическое имя: /dev/sdb1
           версия: FAT32
           серийный №: 947a-7235
           размер: 7396MiB
           capacity: 7399MiB
           возможности: primary bootable fat initialized
           конфигурация: FATs=2 filesystem=fat label=UBUNTU 18_0
..

Из этого вывода видно, что точка монтирования (логическое имя) /dev/sdb1, а файловая система FAT32.

3. Теперь нужно смонтировать содержимое USB-флешки в какой-нибудь каталог. Мы смонтируем /dev/sdb1 на каталог /media/usbstick.

~$ sudo mkdir /media/usbstick
~$ sudo mount -t vfat /dev/sdb1 /media/usbstick

Чтобы смонтировать флешку, отформатированную в формате NTFS:

~$ sudo mount -t ntfs-3g /dev/sdb1 /media/usbstick

4. Чтобы размонтировать флешку, выполните команду:

~$ sudo umount /media/usbstick

Список команд, которые могут помочь в работе в дисками и флешками:

Команда Назначение
dmesg Показывает сообщения загрузки, а также текущие события в логе.
fdisk Управление разделами диска.
sudo blkid Получение идентификационной информации о дисках.
lsblk Получение общей информации о дисковых устройствах.
mount Монтирование дисков.
lsusb Получение информации об устройствах USB.
usb-devices Получение подробной информации об устройствах USB.
df -h Получение информации об используемом и свободном месте на дисках.

[Способ 1: команда lshw]

$ sudo lshw

Или вариант с возможностью прокрутки (выход из режима просмотра клавишей Q):

$ sudo lshw | less

[Способ 2: команда lsb_release]

$ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description:    Ubuntu 22.04.3 LTS
Release:        22.04
Codename:       jammy

[Способ 3: с помощью графического интерфейса]

В Ubuntu откройте окно Настройки -> О системе:

Settings System

[Способ 4: /etc/lsb-release или /etc/os-release]

Файл /etc/lsb-release покажет версию Ubuntu в отдельных строках в виде номера релиза и его описания. Это разработано для старых систем, так что можете использовать это для Ubuntu устаревшей версии.

Также вы можете получить ту же самую информацию, просмотрев файл /etc/os-release. Это совместимо с Ubuntu 16.04 и более свежей версии.

Пример:

$ cat /etc/os-release
NAME="Ubuntu"
VERSION="18.04.6 LTS (Bionic Beaver)"
ID=ubuntu
ID_LIKE=debian
PRETTY_NAME="Ubuntu 18.04.6 LTS"
VERSION_ID="18.04"
HOME_URL="https://www.ubuntu.com/"
SUPPORT_URL="https://help.ubuntu.com/"
BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"
PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"
VERSION_CODENAME=bionic
UBUNTU_CODENAME=bionic

Процесс по шагам:

1. Остановите X-сервер:

~$ sudo /etc/init.d/lightdm stop

2. Удалите старый драйвер:

~$ sudo apt-get purge nvidia-*

3. Перезапустите компьютер:

~$ sudo reboot

4. На сайте nvidia.ru зайдите в раздел "Загрузка драйверов NVIDIA" (https://www.nvidia.ru/Download/index.aspx?lang=ru). 

Выберите "Тип продукта: Legacy"
Выберите "Серия продуктов: GeForce 2 MX Series"
Выберите "Семейство продуктов: GeForce2 MX/MX 400"
Выберите "Операционная система: Показать все операционные системы -> Linux 32-bit"
Выберите "Язык: Русский"

Нажмите кнопку "Поиск", появится страничка с кнопкой "Загрузить сейчас". Загрузится файл NVIDIA-Linux-x86-100.14.11-pkg1.run.

5. Запустите инсталлятор:

~$ sudo ./NVIDIA-Linux-x86-100.14.11-pkg1.run

При логине в окне консоли система предупреждает о наличии обновлений:

10 updates can be installed immediately.
10 of these updates are security updates.

Как их установить? Процесс по шагам:

1. Запуск apt update подготовит обновления для установки.

~$ sudo apt update
Сущ:1 http://ru.archive.ubuntu.com/ubuntu disco InRelease
Сущ:2 http://ru.archive.ubuntu.com/ubuntu disco-updates InRelease
Сущ:3 http://ru.archive.ubuntu.com/ubuntu disco-backports InRelease
Сущ:4 http://ppa.launchpad.net/graphics-drivers/ppa/ubuntu disco InRelease
Пол:5 http://security.ubuntu.com/ubuntu disco-security InRelease [97,5 kB]
Получено 97,5 kB за 5с (18,8 kB/s)
Чтение списков пакетов… Готово
Построение дерева зависимостей
Чтение информации о состоянии… Готово
Может быть обновлено 5 пакетов. Запустите «apt list --upgradable» для их показа.

2. Запуск apt list --upgradable покажет информацию об обновлениях.

~$ apt list --upgradable
Вывод списка… Готово
libmysofa0/disco-updates,disco-security 0.6~dfsg0-2ubuntu0.19.04.1 i386 [может быть обновлён с: 0.6~dfsg0-2]
linux-generic/disco-updates,disco-security 5.0.0.19.20 i386 [может быть обновлён с: 5.0.0.17.18]
linux-headers-generic/disco-updates,disco-security 5.0.0.19.20 i386 [может быть обновлён с: 5.0.0.17.18]
linux-image-generic/disco-updates,disco-security 5.0.0.19.20 i386 [может быть обновлён с: 5.0.0.17.18]
linux-libc-dev/disco-updates,disco-security 5.0.0-19.20 i386 [может быть обновлён с: 5.0.0-17.18]

3. Теперь можно обновить систему запуском для apt одной из команд: upgrade или full-upgrade (раньше вместо full-upgrade была аналогичная команда dist-upgrade).

upgrade. Эта команда загрузит пакеты и выполнит их необходимо обновление. Команда устанавливает самые новые версии всех пакетов доступные в репозиториях. Использует все репозитории из /etc/apt/souces.list и /etc/apt/souces.list.d/*. То есть обновляются пакеты не только из официальных репозиториев, но и из PPA. Обновляются только установленные пакеты, если же для обновления пакета необходимо установить или удалить другой пакет, такие пакеты обновлены не будут.

full-upgrade. Эта команда аналогична upgrade, просто она задает меньше вопросов и более интеллектуально подходит к процессу установки. Здесь поддерживается умное разрешение зависимостей для новых версий пакетов. Конфликтующие пакеты могут быть удалены, а новые, дополнительные - установлены.

Для ubuntu рекомендуется именно команда обновления full-upgrade, поскольку она более продумана и обновляет больше пакетов.

~$ sudo apt full-upgrade
Чтение списков пакетов… Готово
Построение дерева зависимостей
Чтение информации о состоянии… Готово
Расчёт обновлений… Готово
Следующие пакеты устанавливались автоматически и больше не требуются:
  dkms libcuda1-340 libxnvctrl0 pkg-config screen-resolution-extra
Для их удаления используйте «sudo apt autoremove».
Следующие НОВЫЕ пакеты будут установлены:
  linux-headers-5.0.0-19 linux-headers-5.0.0-19-generic
  linux-image-5.0.0-19-generic linux-modules-5.0.0-19-generic
  linux-modules-extra-5.0.0-19-generic
Следующие пакеты будут обновлены:
  libmysofa0 linux-generic linux-headers-generic linux-image-generic
  linux-libc-dev
Обновлено 5 пакетов, установлено 5 новых пакетов, для удаления отмечено 0 пакетов, и 0 пакетов не обновлено.
Необходимо скачать 64,0 MB архивов.
После данной операции объём занятого дискового пространства возрастёт на 250 MB.
Хотите продолжить? [Д/н]

Можно обновить все пакеты (если ответить на вопрос утвердительно, нажав клавишу Y и Enter), а можно выборочно (нажав N и Enter). При выборочной установке для команды apt full-update (заметьте, это уже уже другая команда, не full-upgrade) указывается имя пакета, например:

~$ sudo apt full-update linux-libc-dev

Другие способы обновлений хорошо описаны в статье [3].

PPA упрощает установку программ в Ubuntu, которых нет в Software Center. Когда Вы начали использовать Ubuntu и его производные дистрибутивы, включая elementary OS, Linux Mint, и т. д., то наверняка встречались с аббревиатурой "PPA". Она используется в контексте добавления и удаления приложений (перевод статьи: What is PPA in Ubuntu, and how to Add/Remove it site:fosslinux.com).

PPA это сокращение от "Personal Page Archive". Представляет из себя веб-страницу, где содержится набор инструкций для установки приложения, которое обычно в не включено в Ubuntu Software Center. PPA может быть сделано кем угодно. Приложение, сохраненное в хранилище PPA, называется "репозиторием" (repository, или кратко repo). Когда Вы добавляете репозиторий PPA на свой компьютер, то это значит, что добавляется ссылка на сервер загрузки, с которого Ваш компьютер получит приложение и в будущем будет получать его обновления.

Таким образом, PPA обслуживается определенными разработчиками (или некоторой организацией). Это вносит некий риск в для Вашей системы, потому что не все PPA хорошо защищены. Точно так же, как не все программы Microsoft Windows "чистые", существует вероятность, что некоторые PPA могу повредить операционной системе или данные на компьютере. К счастью, причина часто не в том, что на компьютер может попасть вредоносное ПО, просто программы иногда бывают устаревшие или некачественно написаны.

Лучший способ избежать риска - отказаться от установки. Перед добавлением PPA уделите немного времени чтению содержимого страницы PPA, и проверьте, когда она последний раз обновлялась, и поддерживается ли какая-то активность этого проекта. Если проект приложения поддерживается, то разработчики будут периодически обновлять его в целях безопасности и устранения багов. Также проверьте, работает ли пакет PPA на Вашей версии Ubuntu. Для этого раскройте информационный раздел "Technical details about this PPA", и в выпадающем списке проверьте наличие нужной версии Ubuntu.

Добавление PPA. Чтобы добавить PPA, запустите терминал и используйте следующие команды.

sudo add-apt-repository [источник]

Здесь "источник" это то, что перечислено на страничке PPA. Как только repo добавлен на Ваш компьютер, нужно обновить список repo:

sudo apt update

И наконец, нужно установить пакет:

sudo apt install [имя пакета]

Удаление PPA. Для удаления PPA используйте команду remove:

sudo apt-add-repository --remove [место нахождения пакета]

Если Вы предпочитаете интерфейс GUI, то в нем можно выполнить аналогичные действия. Запустите утилиту "Software & Updates" (Программы и обновления) и перейдите на закладку "Other Software" (стороннее ПО).

Software and Updates Remove PPA

Вы увидите в списке все PPA, которые установлены на Вашем компьютере. Просто выберите источник PPA и кликните на кнопке "Remove".

Показанные ниже команды относятся к менеджеру пакетов apt, и их необходимо выполнять под учетной записью администратора, либо через повышение привилегий sudo. Иногда вместо apt нужно использовать apt-get.

Итак, чтобы установить GCC, выполните следующий список команд.

apt update
apt install gcc

После этого gcc будет запускаться. Следующая команда установит дополнительный пакет утилит и библиотек:

apt install build-essential

Копирование и вставка текста в Linux (консоль LXTerminal, браузер и другие программы) работает непривычно для тех, кто пользовался putty на Windows. В буфер обмена копия (Copy) производится автоматически, когда пользователь выбрал текст левой кнопкой мыши, а вставка (Paste) производится средней кнопкой [5].

В некоторых программах для копирования/вставки может работать контекстное меню по правой кнопке мыши, а также горячие клавиши Ctrl+Insert or Ctrl+Shift+C (для Copy) и Shift+Insert or Ctrl+Shift+V (для Paste).

Интерпретатор shell выдавал ошибку "unexpected operator":

$ ./b.sh clean
./b.sh: 5: [: clean: unexpected operator

Ошибка была в 5 строчке следующего скрипта:

#!/bin/sh
 
if [ -z $1 ]; then
   ./build_app.sh apps/OpenBK7231N_App OpenBK7231N_App 1.0.0
elif [ "$1" == "clean" ]; then
   ./build_app.sh apps/OpenBK7231N_App OpenBK7231N_App 1.0.0 $1
fi

Проблема оказалась в том, что этот синтаксис == не работал для шелла sh, шелл надо поменять на bash, тогда команда сработает нормально:

#!/bin/bash
 
if [ -z $1 ]; then
   ./build_app.sh apps/OpenBK7231N_App OpenBK7231N_App 1.0.0
elif [ "$1" == "clean" ]; then
   ./build_app.sh apps/OpenBK7231N_App OpenBK7231N_App 1.0.0 $1
fi

PuTTY сразу закрывает окно при попытке подключиться к настроенной сессии. При запуске из командной строки выводится сообщение:

PuTTY: unable to load font "server:fixed"

Если запустить через sudo, то такой проблемы нет.

Как исправить:

1. Запустите putty. В окне настройки сессии выберите нужную сессию, нажмите Load. Перейдите в раздел Window -> Fonts. В поле ввода "Font used for ordinary text" стоит шрифт, который putty для обычного пользователя по какой-то причине использовать не может (server:fixed).

putty fix font01

2. Справа от поля ввода  нажмите на кнопку Change..., выберите другой моноширинный шрифт.

putty fix font02

3. Сохраните изменения (Session -> кнопка Save). После этого проблема будет устранена.

Чтобы для создаваемых сессий автоматически выбирался другой шрифт, необходимо сделать следующее:

1. В текстовом редакторе откройте файл настроек по умолчанию для putty:

$ gedit ~/.putty/sessions/Default%20Settings

2. Поменяйте в этой файле опцию FontName на другой моноширинный шрифт. В этом примере устанавливается шрифт client:Monospace размером 10.

FontName=client:Monospace 10

3. Сохраните файл.

Теперь все создаваемые новые сессии будут по умолчанию устанавливать шрифт client:Monospace 10.

Команда для запуска системного монитора gnome-system-monitor. Для удобства можно настроить запуск системного монитор теми же клавишами, как это делалось в Windows.

gnome system monitor

Как это сделать, процесс по шагам:

1. Зайдите в Параметры -> Клавиатура -> кнопка "Просмотр и изменение комбинаций клавиш".

2. Кликните на плашку в конце списка "Дополнительные комбинации клавиш" -> +. В поле "Имя" введите любое значение например "Системный монитор", в поле "Команда" введите gnome-system-monitor.

3. Кликните на кнопку "Установить комбинацию клавиш...". Нажмите клавишу Ctrl, удерживая её нажмите и удерживайте Shift, и нажмите Esc. Кликните на кнопку "Установить". Получится комбинация клавиш Ctrl+Shift+Esc, такая же как была для вызова taskmngr в Windows.

gnome system monitor set hotkeys

Причем в других программах (например gedit) эта стандартная комбинация клавиш сохранения файла работает нормально. Поведение довольно странное, явный глюк, потому что горячая клавиша для меню "Настройки" по умолчанию не задана, и вообще комбинация клавиш Ctrl+S нигде в хоткеях системы не используется, кроме как для поиска по настройкам.

Settings Search

Очевидно, что это просто ошибка конфигурации Ubuntu 22.04.3 LTS и/или VSCode. Исправляется следующим костылем:

1. Зайдите в меню Настройки -> Просмотр и изменение комбинаций клавиш, в строке поиска введите Настройки (или перейдите в раздел Ярлыки -> Настройки).

2. Откроется настройка комбинации клавиши для этого окна в состоянии "Не определено".

3. Задайте здесь произвольную комбинацию клавиш, например Ctrl+N:

Settings hotkey

4. Выйдите из настроек и перезапустите систему.

После этого меню настроек будет открываться горячей клавишей Ctrl+N, и комбинация клавиши Ctrl+S будет нормально сохранять файл в Visual Studio Code.

Откройте в текстовом редакторе файл ~/.bashrc и добавьте в него строку:

alias make="make -j"

Сохраните файл и закройте текстовый редактор. Изменения вступят в силу после перезапуска терминала - вместо команды make в командную строку будет подставляться make -j, что включает многопоточную работу утилиты make. Это значительно ускоряет компиляцию сложных проектов.

Пример создания файла test.bin в текущем каталоге, размером 18250 байт, заполненного байтами 0xFF (восьмеричное значение \377).

< /dev/zero tr '\000' '\377' | head -c 18520 > test.bin

Надо добавить в конце команды символ &, например:

$ putty &

В папке /usr/share/applications/, это файлы с суффиксом desktop. Например "ярлык" для putty находится в файле /usr/share/applications/putty.desktop.

"Проводник", показывающий папки и файлы в GUI-интерфейсе, это программа nautilis. Вот так, к примеру, можно открыть папку с ярлыками:

$ nautilus /usr/share/applications/

В статье [6] описаны 3 способа, но мне нравится из них самый простой. Например, чтобы удалить все объектные файлы в каталоге проекта (текущий каталог .), можно использовать команду:

$ find . -name "*.o" -type f -delete

Команда find ~ -name имяфайла чувствительна к регистру искомого имени файла, а команда find ~ -iname имяфайла не чувствительна к регистру имени файла (iname от слова insensitive).

Необходимо установить библиотеку FUSE:

$ sudo apt install libfuse2

Обычно в случае каких-либо проблем с запуском программа выдает в консоли причину ошибки. Но иногда этого по какой-то причине не происходит, программа завершается без каких-либо сообщений. В этом случае может помочь утилита strace.

$ ./Xplorer-7.0.8-linux-installer.bin

Никакого вывода не последовало, программа просто завершилась. Запуск через strace:

$ strace ./Xplorer-7.0.8-linux-installer.bin 
execve("./Xplorer-7.0.8-linux-installer.bin", ["./Xplorer-7.0.8-linux-installer."...], 0x7fffffffded0 /* 53 vars */) = 0
[ Process PID=37012 runs in 32 bit mode. ]
mmap(0xc6d000, 4096, PROT_READ|PROT_WRITE|PROT_EXEC, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0xc6d000) = 0xc6d000
readlink("/proc/self/exe", "$HOME/xtensa/Xp"..., 4096) = 63
mmap(0x8048000, 1108297, PROT_READ|PROT_WRITE|PROT_EXEC, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x8048000
mprotect(0x8048000, 1108294, PROT_READ|PROT_EXEC) = 0
mmap(0x8157000, 42979, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0x10f000) = 0x8157000
mprotect(0x8157000, 42976, PROT_READ|PROT_WRITE) = 0
mmap(0x8162000, 15736, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x8162000
brk(0x8166000)                          = 0x8166000
open("/lib/ld-linux.so.2", O_RDONLY)    = -1 ENOENT (Нет такого файла или каталога)
exit(127)                               = ?
+++ exited with 127 +++

В этом выводе видно, что проблема в не найденной библиотеке ld-linux.so.2. Она должна находиться в пакете libc6:i386, и решить проблему можно командой sudo apt-get install libc6:i386.

Иногда при установке библиотеки появляется ошибка "dpkg was interrupted, you must manually run 'sudo dpkg --configure -a' to correct the problem."

Пример подобного рода ошибки:

$ sudo apt-get install libc6:i386
E: Работа dpkg была прервана, вы должны вручную запустить «sudo dpkg --configure -a»
 для устранения проблемы.

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

Все, что за этой строчкой, не будет выполняться:

if false; then

См. также [7].

Traceback (most recent call last):
  File "~/openwrt/build_dir/target-arm_cortex-a7+neon_glibc-2.22_eabi/ca-certificates-20211016/
        work/mozilla/certdata2pem.py", line 125, in < module>
    cert = x509.load_der_x509_certificate(obj['CKA_VALUE'])
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "~/.pyenv/versions/3.12.0rc2/lib/python3.12/site-packages/cryptography/x509/base.py",
        line 594, in load_der_x509_certificate
    return rust_x509.load_der_x509_certificate(data)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
TypeError: argument 'data': 'bytearray' object cannot be converted to 'PyBytes' make[5]: *** [Makefile:6: all] Error 1

Проблема решается подбором версии Python-библиотеки cryptography:

$ pip show cryptography               # покажет версию библиотеки cryptography
$ pip install cryptography==3.4.8     # установит библиотеку cryptography версии 3.4.8

Из подсказки команды pip install -h:

-U, --upgrade Обновить все пакеты до самой новой доступной версии.

Если указать имяпакета=версия без -U, то будет установлен пакет указанной версии, например:

$ pip install cryptography==3.4.8     # установит библиотеку cryptography версии 3.4.8

С этой проблемой столкнулся, когда нужно было передать логи компиляции китайцам. Многие сообщения об ошибках в логах были на русском языке, что конечно было неприемлемо. Решить проблему позволила следующая команда:

$ export LANG=en_US.UTF-8

С этой ошибкой я столкнулся, когда пытался запустить клиент WeChat (https://github.com/geeeeeeeeek/electronic-wechat/releases/download/V2.0/linux-x64.tar.gz).

Установить библиотеку libgconf-2.so.4 можно командой:

$ sudo apt-get install libgconf-2-4

При попытке подключить устройство USB-UART коннектора на чипе CH341 не появлялось устройство /dev/ttyUSB0. Вместо этого в /var/log/kern.log выводилось сообщение:

usb 3-4: new full-speed USB device number 55 using xhci_hcd
usb 3-4: New USB device found, idVendor=1a86, idProduct=7523, bcdDevice=80.33
usb 3-4: New USB device strings: Mfr=0, Product=2, SerialNumber=0
usb 3-4: Product: USB Serial
ch341 3-4:1.0: ch341-uart converter detected
usb 3-4: ch341-uart converter now attached to ttyUSB0
input: BRLTTY 6.4 Linux Screen Driver Keyboard as /devices/virtual/input/input51
usb 3-4: usbfs: interface 0 claimed by ch341 while 'brltty' sets config #1
ch341-uart ttyUSB0: ch341-uart converter now disconnected from ttyUSB0
ch341 3-4:1.0: device disconnected

И после этого последовательное устройство /dev/ttyUSB0 становилось недоступным. Очевидно, что проблема возникает из-за сервиса BRLTTY (демон консольного ввода для незрячих [7]), который запускает клавиатурный интерфейс.

Чтобы вернуть ttyUSB0, нужно запретить этот сервис командами:

systemctl stop brltty-udev.service
sudo systemctl mask brltty-udev.service
systemctl stop brltty.service
systemctl disable brltty.service

После этого переподключите USB-UART в порт USB, и устройство /dev/ttyUSB0 нормально обнаружится:

usb 3-4: new full-speed USB device number 57 using xhci_hcd
usb 3-4: New USB device found, idVendor=1a86, idProduct=7523, bcdDevice=80.33
usb 3-4: New USB device strings: Mfr=0, Product=2, SerialNumber=0
usb 3-4: Product: USB Serial
ch341 3-4:1.0: ch341-uart converter detected
usb 3-4: ch341-uart converter now attached to ttyUSB0

Эта проблема у меня возникла при попытке воспользоваться утилитой bootx для прошивки через USB чипа GX8008C:

$ bootx-master/bootx -m leo_mini -t u -c "download 0 output/vsp.bin;reboot"
Version : v1.5.3 (20191009)
NationalChip GX8010 Download Tools
Copyright (C) 2001-2019 NationalChip Co., Ltd
ALL RIGHTS RESERVED!
 
Please press BOOT button and power on or restart the board...
Error opening libusb: LIBUSB_ERROR_ACCESS

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

Как это сделать, процесс по шагам:

1. Узнайте сначала VID и PID подключаемого устройства, чтобы для него можно было настроить правила доступа. Для этого можно просмотреть конец содержимого файла /var/log/kern.log после подключения устройства GX8008C следующей командой:

$ sudo tail -f /var/log/kern.log
...
usb 3-5.3.1: new high-speed USB device number 25 using xhci_hcd
usb 3-5.3.1: New USB device found, idVendor=a700, idProduct=0001, bcdDevice= 0.00
usb 3-5.3.1: New USB device strings: Mfr=0, Product=4, SerialNumber=0
usb 3-5.3.1: Product: NationalChip Storage
usb 3-5.3.1: USB disconnect, device number 25
usb 3-5.3.1: new high-speed USB device number 26 using xhci_hcd
usb 3-5.3.1: New USB device found, idVendor=a700, idProduct=0001, bcdDevice= 0.00
usb 3-5.3.1: New USB device strings: Mfr=0, Product=4, SerialNumber=0
usb 3-5.3.1: Product: NationalChip Storage

Из этого лога видно, что у подключенного устройства VID 0xA700 и PID 0x0001.

2. Создайте в каталоге /etc/udev/rules.d файл NationalChipVIDA700PID0001.rules:

$ sudo gedit /etc/udev/rules.d/NationalChipVIDA700PID0001.rules

Имя файла NationalChipVIDA700PID0001.rules выбрано произвольно, это просто информативное имя, отражающее назначение файла.

3. Добавьте в этот файл строку:

SUBSYSTEM=="usb", ATTRS{idVendor}=="a700", ATTRS{idProduct}=="0001", OWNER="username", GROUP="plugdev", TAG+="uaccess"

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

4. Если вы как пользователь не входите в группу plugdev, то туда необходимо себя добавить. Посмотреть пользователей в группе plugdev можно командой getent group:

$ getent group plugdev
plugdev:x:46:user
$ getent group plugdev | awk -F: '{print $4}' |  tr "," " "
user

Если вы как пользователь не входите в группу plugdev, то добавьте себя туда командой usermod [8].

$ usermod -a -G plugdev username

Здесь вместо username подставьте свое имя пользователя в системе.

5. Отключите устройство GX8008C от порта USB, подключите его обратно. Удерживая кнопку BOOT, нажмите на кнопку RST. Устройство NationalChip Storage обнаружится в системе, и будет доступно на полный доступ. Теперь утилита bootx сработает с правами обычного пользователя без всяких проблем:

$ bootx-master/bootx -m leo_mini -t u -c "download 0 output/vsp.bin;reboot"
Version : v1.5.3 (20191009)
NationalChip GX8010 Download Tools
Copyright (C) 2001-2019 NationalChip Co., Ltd
ALL RIGHTS RESERVED!
 
Please press BOOT button and power on or restart the board...
downloading [1/2] : 
[==========][100%]
downloading [2/2] : 
[==========][100%]
Excute cmd : download 0 output/vsp.bin
[==========][100%]
done
Excute cmd : reboot
done

Это позволяет сделать встроенная команда compgen.

Чтобы отобразить все группы, запустите команду:

$ compgen -g

Чтобы показать всех пользователей, запустите команду:

$ compgen -u

Также всех пользователей можно показать командой:

$ cut -d ":" -f 1 /etc/passwd

К сожалению, утилита zip создает архивы с сохранением полных путей до файлов, что при использовании рекурсивного сохранения файлов в архив (zip -r) создает неудобства. Гораздо лучше использовать утилиту командной строки 7z:

$ sudo apt install p7zip-full
$ 7z --help

Пример упаковки с рекурсией папки ~/asm/Quark в архив quark.zip, находящийся в текущей директории:

$ 7z a -r quark.zip ~/asm/Quark

Иногда необходимо положить архив не все содержимое папки, а только некоторые выбранные файлы. Выбранные файлы удобно держать в виде списка, в отдельном файле, чтобы потом построчно его обработать и каждую строку передать в команде архиватору 7z. Это можно сделать с помощью цикла while/do скрипта bash.

Предположим, что список файлов для архивации находится в файле backuplist.txt (в списке могут быть как имена отдельных файлов, так и имена папок):

backupGX8008C.sh
backuplist.txt
vsp_sdk/.config
vsp_sdk/Kconfig
vsp_sdk/Makefile
vsp_sdk/configs/nationalchip_public_version/8008c_wukong_prime_1v4_hid_demo.config
vsp_sdk/configs/nationalchip_public_version/8008c_wukong_prime_1v4_led.config
vsp_sdk/configs/nationalchip_public_version/8008c_wukong_prime_uac48k_up_4mic2ref.config
vsp_sdk/configs/nationalchip_public_version/bypass_bin_demo.config
vsp_sdk/configs/nationalchip_public_version/gx8008_wukong_1.0_voice_play_demo.config
vsp_sdk/configs/nationalchip_public_version/USB_GS_bypass_bin_demo.config
vsp_sdk/mcu/vsp/hook/Kconfig
vsp_sdk/mcu/vsp/hook/Makefile
vsp_sdk/mcu/vsp/hook/vsp_hook_led.c
vsp_sdk/mcu/vsp/hook/vsp_hook_null.c
vsp_sdk/mcu/vsp/hook/vsp_hook_spotter.c
vsp_sdk/mcu/vsp/hook/vsp_hook_USB_GS_demo.c
vsp_sdk/mcu/3rdparty/Makefile
vsp_sdk/mcu/3rdparty/OneButton
vsp_sdk/mcu/drivers/uart/dw_uart.c
vsp_sdk/mcu/include/driver/uart.h

Тогда для архивации файлов из этого списка может быть применен следующий скрипт:

#!/bin/bash
 
# Каталог, относительно которого находятся архивируемые файлы в списке:
SRCDIR=$HOME/National/SDK
# Имя создаваемого архива:
ARCHIVE_NAME=$HOME/MyDoc/NationalChip/GX8008C-SDK.zip
# Удаление временных файлов, чтобы они случайно не попали в архив:
find $SRCDIR -name "*.o" -type f -delete
find $SRCDIR -name "*.d" -type f -delete  
# Переход в каталог, где находятся архивируемые файлы из списка:
cd $SRCDIR  
# В этом файле находится список файлов для архивации:
input="backuplist.txt"
# Построчная обработка списка, с передачей в командную строку архиватора
# каждого файла из списка:
while IFS= read -r linedo 7z a $ARCHIVE_NAME $line
done < "$input"  
# Генерация уникального имени файла для архива из метки времени [9]: autoname $ARCHIVE_NAME --pattern:YYMMDDhhmmss

Пример построчной обработки файла см. в предыдущем совете "7z: как заархивировать файлы по списку".

Это может быть удобно, когда найденный файл двоичный, или организован как одна очень большая строка. В этом случае вывод может быть очень громоздким, и даже не поместиться в буфер консоли.

Решить проблему поможет добавление опции -l, например:

$ grep -rnwl admin@mydomain.ru /var

[ncdu]

Мне для этой цели очень нравится программа ncdu:

$ sudo apt install ncdu
$ ncdu /var

Вы можете ограничить поиск для файлов в той же самой файловой системе с помощью опции -x:

$ ncdu -x /

.. это будет игнорировать смонтированный файловые системы внутри файловой системы root.

Некоторую оптимизацию можно обеспечить опцией -q, которая увеличивает время между обновлениями экрана. Опции можно комбинировать:

$ ncdu -xq /var

[du]

Команда du суммарно покажет использование диска для каждого файла, рекурсивно для директорий, например:

$ du -hs /path/to/directory

Здесь опция -h задает числа в формате "human readable", т. е. 140M вместо 143260 (размер по умолчанию показывается в килобайтах). Опция -s покажет суммарную информацию, иначе вы получите не только размер папки, но и каждой субдиректории в этой папке.

С использованием опции -h можно применить sort для сортировки размеров папок:

$ du -h | sort -h

Если нужно ограничить анализ вложенности папок, можно применить опцию --max-depth. Например, если надо ограничиться только одним уровнем вложенности, то укажите --max-depth=1.

$ du -h --max-depth=1 /path/to/directory

Следующий пример отобразит рекурсивно размер, и поместит его рядом с именем каждой папки вместе с общим размером внизу, все в формате удобном для чтения человеком:

$ du -hsc *

Тоже самое, с сортировкой:

$ du -sch | sort -rh

[dust]

Существует утилита dust, работает на Windows, MAC, Linux.

C:\git> dust
   0B       ┌── templates           │                                      █ │   0%
   0B     ┌─┴ git-core              │                                      █ │   0%
   0B   ┌─┴ share                   │                                      █ │   0%
  76B   ├── readme.md               │                                      █ │   0%
 156K   │   ┌── less.exe            │▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒█ │   2%
 2.7M   │   ├── git-remote-https.exe│▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒█████████████████ │  42%
 3.6M   │   ├── git.exe             │▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒██████████████████████ │  56%
 6.5M   │ ┌─┴ git-core              │███████████████████████████████████████ │ 100%
 6.5M   ├─┴ libexec                 │███████████████████████████████████████ │ 100%
 6.5M ┌─┴ .

Можно скопировать информацию владельца (owner), принадлежность группе (group), права доступа (permission) и метку времени (timestamp), т. е. атрибуты файла, с помощью параметра --reference команд chown, chmod, touch. Ниже приведен скрипт, который выполнит это действие.

Этот скрипт следует запускать с привилегиями root или через sudo (чтобы смогла правильно отработать chown), и с двумя параметрами: директория источника и директория назначения. В этой версии скрипт просто выводит то, что он изменит. Если проверочный запуск вас удовлетворил, то чтобы он произвел реальную работу нужно поменять строку myecho=echo на myecho=.

#!/bin/bash
# Filename: cp-metadata
myecho=echo
src_path="$1"
dst_path="$2" 
find "$src_path" |
  while read src_file; do
    dst_file="$dst_path${src_file#$src_path}"
    $myecho chmod --reference="$src_file" "$dst_file"
    $myecho chown --reference="$src_file" "$dst_file"
    $myecho touch --reference="$src_file" "$dst_file"
  done

Следующая команда установит атрибут "разрешено для выполнения" для всех файлов *.sh в текущей директории и всех её подкаталогах:

$ find . -type f -iname "*.sh" -exec chmod +x {} \;

Несколько команд можно сразу запустить в одной командной строке. В качестве разделителей для отдельных команд можно считать символы и последовательности символов ';', '&&', '||'. Также используют одиночные символы '&' и '|', что имеет особое значение.

Вот несколько упрощенное описание, как это работает [10]:

A ; B   # Запускается команда A и затем B, независимо от успешного завершения A
A && B  # Команда B запустится только в случае успешного завершения A
A || B  # Команда B запустится только в случае неудачного выполнения A
A &     # Команда A запустится в фоновом режиме.
A | B   # stdout команды A в реальном времени будет передаваться в stdin B

См. также [11].

Обсуждение вопроса см. здесь:
How to show the transfer progress and speed when copying files with cp? site:askubuntu.com

Мне больше всего понравилась утилита gcp:

$ sudo apt-get install gcp

Обсуждение вопроса см. здесь:
How to compare binary files to check if they are the same? site:stackoverflow.com

Сравнивать файлы могут: diff, Double Commander, vbindiff, meld, kompare. Мне больше понравилась vbindiff.

$ sudo apt install vbindiff

Таким способом указывается номер раздела man-документации - программирование, системные утилиты и т.д. Информацию о номерах разделов можно получить командой man man:

$ man man
...
(1) Исполняемые программы или команды шелла.
(2) Системные вызовы (функции, предоставляемые ядром OS).
(3) Библиотечные вызовы (функции внутри программных библиотек).
(4) Специальные файлы (которые обычно находятся в /dev).
(5) Форматы файлов и различные соглашения, например /etc/passwd.
(6) Игры.
(7) Разное (включая macro-пакеты и соглашения), например man(7), groff(7), man-pages(7).
(8) Команды системного администрирования (обычно только для root).
(9) Подпрограммы ядра [не стандарт].
...

На номер раздела обычно можно не обращать особого внимания, но иногда он полезен. Например printf есть в шелле bash, но также есть и одноименный системный вызов, и чтобы их различать, существует номер.

Команды printenv, env, export, set, unset позволяют просматривать (printenv), запускать программы с модифицированным окружением (env), экспортировать переменную в окружение (export), устанавливать и модифицировать переменные окружения (set), удалять переменную из окружения (unset).

Подробнее см. [12].

С помощью команд find и sort (и опционально tail и head) можно выполнить эту задачу, подробнее см. [13].

Такая ошибка обычно возникает из-за не завершенной пары if/fi скрипта bash, или другой ошибки синтаксиса. Исправить ошибку довольно легко, поскольку файл .bashrc можно восстановить из резервной копии /etc/skel/.bashrc.

На Ubintu столкнулся с проблемой, что двойной клик на текстовый файл запускал не gedit, как мне хотелось, а Gnome Text Editor. Не нашел никакого другого способа решить эту проблему, кроме как удалить его. Как это сделать:

1. Нажмите клавишу Win, начинайте вводить App, появится иконка App Center, запустите его.

2. В строке поиска наверху наберите Text, увидите в списке Text Editor, кликните на него.

uninstall Gnome Text Editor fig01

3. Откроется окно GNOME Text Editor, кликните Uninstall.

uninstall Gnome Text Editor fig02

См. также Change default open with application in Ubuntu site:onetransistor.eu.

Для Ubuntu 20.04 и 22.04 это делается по-разному, разработчики снова намудрили.

Ubuntu 20.04: зайдите в настройки, раздел Регион и язык -> кликните на шестеренку пункта "Источники ввода". Выберите радиокнопку "Использовать различные источники для каждого окна".

individual keyboard lang for windows 20 04

Ubuntu 22.04: в тех же настройках выберите раздел Клавиатура (Keyboard) -> Переключение источников ввода (Input Source Switching), переключитесь на радиокнопку "Использовать свой источник для каждого окна" (Switch input sources individually for each window).

individual keyboard lang for windows 22 04

После этого в каждом открытом окне раскладка клавиатуры будет переключаться независимо от других.

Не запускается диалог поиска файла по имени на горячую клавишу Alt+F7, вместо этого происходит перемещение окна. Причина в том, что эта комбинация клавиш назначена и перехватывается на системном уровне.

Как исправить: Settings -> Keyboard -> Keyboard Shortcuts -> View and Customize Shortcuts -> Windows -> запретите горячую клавишу для Move Window. Для этого кликните на неё мышью и нажмите на Backspace.

После этого в Double Commander начнет работать поиск файла по горячей клавише Alt+F7.

Проблема такого странного сообщения при попытке запуска скрипта bash в том, что в тексте скрипта используются неправильные окончаниях строк 0D0A. Как исправить. см. [15].

Помог wine, описание установки взял в статье [16]. Другие средства, которые упоминались в этой статье - Winetricks, PlayOnLinux - мне не подошли.

Установка на Ubuntu, Debian, Mint:

sudo dpkg --add-architecture i386
wget -nc https://dl.winehq.org/wine-builds/Release.key
sudo apt-key add Release.key
sudo add-apt-repository "deb https://dl.winehq.org/wine-builds/ubuntu/ artful main"
sudo apt-get update
sudo apt-get install --install-recommends winehq-stable

Используйте команды find, locate, whereis, grep. Много полезных советов нашел в [17].

[Примеры использования find]

$ find /путь/до/каталога/гдеискать -iname имяфайла
$ find -iname имяфайла

В этом примере первая команда ищет файл относительно корневого каталога в указанной папке, вторая команда ищет файл в текущем каталоге (текущий каталог . указывать необязательно).

Как искать по всему диску без сообщений "отказано в доступе":

$ find / -iname 'SCons' 2>/dev/null

Вот ещё полезные перенаправления:

>файл перенаправить стандартный вывод (stdout) в файл.
&>файл перенаправить стандартный вывод (stdout) и ошибки в файл.
2>&1 | tee файл копировать вывод ошибок в stdout, показывать на экране и одновременно писать в файл.

[Примеры использования grep]

Поиск файла (или файлов, если таких попадется несколько) в указанной папке на содержимое текста по шаблону регулярного выражения pattern:

$ grep -rnw -e 'pattern' /путь/где/искать/

Часто используемые опции grep (в этом примере использовались следующие опции r, n, w):

-r или -R рекурсивно искать по всем каталогам относительно указанного пути.
-n показывать номер строки, где был найден указанный текст.
-w означает, что совпадение должно быть со строкой целиком. Без -w допускается совпадение с частью строки.
-l (буква L в нижнем регистре) можно добавить, чтобы выводить просто имена файлов, где в его содержимом найдено совпадение указанного текста.
-e шаблон регулярного выражения для поиска текста.
-i не обращать внимание на регистр символов.

Поиск слова word в файлах текущего каталога и его подкаталогах (для поиска используется текущий каталог, если не указано, где искать):

$ grep -rn word

Если в искомом тексте встречается точка, то её нужно экранировать обратным слешем '\'. Экранирование также надо применять к символам '?' и символам двойной или одинарной кавычки.

$ grep -rn "usb\.h"

Если в искомом тексте есть пробел, то его надо заключать в двойные кавычки:

$ grep -rn "Hello World"

Чтобы искать в файлах определенного вида, можно применять шаблоны имен файлов (wildcards * и ?), для чего используется опция --include=. Шаблоны необходимо заключать в двойные кавычки. Например, для поиска текста в заголовочных файлах языка C используйте следующую команду:

$ grep --include="*.h" -rnw sprintf

См. также [18].

Операционные системы семейства Linux, в отличие от Windows, не ищут запускаемый скрипт или программу в текущем каталоге. Поэтому если скрипт (или программа) находится в текущем каталоге, то необходимо указать перед его именем комбинацию символов ./ иначе скрипт не запустится. Это сделано в целях безопасности, чтобы пользователь случайно не запустил что-нибудь, что может навредить системе.

~$ work
 
Команда «work» не найдена. Возможно, вы имели в виду:
 
  command 'zork' from snap zork (1.0.2)
  command 'worm' from deb bsdgames (2.17-28build1)
 
See 'snap info < snapname>' for additional versions.

Если запустить через ./, то команда выполнится правильно:

~$ ./work
Detecting the Python interpreter
Checking "python" ...
Checking "python3" ...
Python 3.8.10
"python3" has been detected
Adding ESP-IDF tools to PATH...
Using Python interpreter in /home/домен/пользователь/.espressif/python_env/idf4.4_py3.8_env/bin/python
Checking if Python packages are up to date...
Python requirements from /home/домен/пользователь/esp/esp-idf/requirements.txt are satisfied.
Added the following directories to PATH:
  /home/домен/пользователь/esp/esp-idf/components/esptool_py/esptool
  /home/домен/пользователь/esp/esp-idf/components/espcoredump
  /home/домен/пользователь/esp/esp-idf/components/partition_table
  /home/домен/пользователь/esp/esp-idf/components/app_update
  /home/домен/пользователь/.espressif/tools/xtensa-esp32-elf/esp-2021r2-patch3-8.4.0/xtensa-esp32-elf/bin
  /home/домен/пользователь/.espressif/tools/xtensa-esp32s2-elf/esp-2021r2-patch3-8.4.0/xtensa-esp32s2-elf/bin
  /home/домен/пользователь/.espressif/tools/xtensa-esp32s3-elf/esp-2021r2-patch3-8.4.0/xtensa-esp32s3-elf/bin
  /home/домен/пользователь/.espressif/tools/riscv32-esp-elf/esp-2021r2-patch3-8.4.0/riscv32-esp-elf/bin
  /home/домен/пользователь/.espressif/tools/esp32ulp-elf/2.28.51-esp-20191205/esp32ulp-elf-binutils/bin
  /home/домен/пользователь/.espressif/tools/esp32s2ulp-elf/2.28.51-esp-20191205/esp32s2ulp-elf-binutils/bin
  /home/домен/пользователь/.espressif/tools/openocd-esp32/v0.11.0-esp32-20211220/openocd-esp32/bin
  /home/домен/пользователь/.espressif/python_env/idf4.4_py3.8_env/bin
  /home/домен/пользователь/esp/esp-idf/tools
Done! You can now compile ESP-IDF projects.
Go to the project directory and run:
 
  idf.py build

Чтобы иметь возможность не указывая ./ запускать скрипт или программу, необходимо записать исполняемый файл в один из каталогов, на который указывает переменная окружения $PATH (отдельные пути отделены друг от друга двоеточием):

$ echo $PATH
/home/linuxbrew/.linuxbrew/bin:/home/linuxbrew/.linuxbrew/sbin:/home/домен/пользователь/.local/bin
 :/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin

[Запуск "через точку", команда source]

Скрипт в текущем каталоге можно запускать, указав перед именем скрипта точку и пробел:

$ . work
Detecting the Python interpreter
Checking "python" ...
Checking "python3" ...
Python 3.8.10
"python3" has been detected
Adding ESP-IDF tools to PATH...
Using Python interpreter in /home/домен/пользователь/.espressif/python_env/idf4.4_py3.8_env/bin/python
Checking if Python packages are up to date...
Python requirements from /home/домен/пользователь/esp/esp-idf/requirements.txt are satisfied.
Added the following directories to PATH:
  /home/домен/пользователь/esp/esp-idf/components/esptool_py/esptool
  /home/домен/пользователь/esp/esp-idf/components/espcoredump
  /home/домен/пользователь/esp/esp-idf/components/partition_table
  /home/домен/пользователь/esp/esp-idf/components/app_update
  /home/домен/пользователь/.espressif/tools/xtensa-esp32-elf/esp-2021r2-patch3-8.4.0/xtensa-esp32-elf/bin
  /home/домен/пользователь/.espressif/tools/xtensa-esp32s2-elf/esp-2021r2-patch3-8.4.0/xtensa-esp32s2-elf/bin
  /home/домен/пользователь/.espressif/tools/xtensa-esp32s3-elf/esp-2021r2-patch3-8.4.0/xtensa-esp32s3-elf/bin
  /home/домен/пользователь/.espressif/tools/riscv32-esp-elf/esp-2021r2-patch3-8.4.0/riscv32-esp-elf/bin
  /home/домен/пользователь/.espressif/tools/esp32ulp-elf/2.28.51-esp-20191205/esp32ulp-elf-binutils/bin
  /home/домен/пользователь/.espressif/tools/esp32s2ulp-elf/2.28.51-esp-20191205/esp32s2ulp-elf-binutils/bin
  /home/домен/пользователь/.espressif/tools/openocd-esp32/v0.11.0-esp32-20211220/openocd-esp32/bin
  /home/домен/пользователь/.espressif/python_env/idf4.4_py3.8_env/bin
  /home/домен/пользователь/esp/esp-idf/tools
Done! You can now compile ESP-IDF projects.
Go to the project directory and run:
  idf.py build

Это сделано для того, чтобы скрипт мог экспортировать результаты своей работы (например модификацию переменной $Path) в текущее рабочее окружение (сеанс работы в консоли команд). Поэтому чтобы из скрипта можно было поменять текущую директорию, надо запускать его через точку или команду команду source.

Примечание: команда точка эквивалентна команде source, т. е. для этого примера . work и source work дадут одинаковый результат.

Сообщения об ошибках системы нужно смотреть в файлах системного лога (/var/log/syslog) и лога ядра (/var/log/kern.log) [19]. Также очень удобна для этой цели утилита journalctl (запускать надо с правами администратора, через sudo), она подсвечивает сообщения определенного вида разными цветами.

Это можно сделать командой lspci. Более подробный вывод можно получить, если добавить опцию -v, и еще более подробный если опцию -vv.

Также в очень удобном виде информацию о системе предоставляет программа hardinfo (установка командой sudo apt install hardinfo). Вот пример вывода команды hardinfo:

hardinfo

Нажмите Alt+F8, после этого клавишами со стрелками можно изменить размеры окна.

Иногда при открытии файла окно открывается на другом мониторе, да еще и так, что недоступна верхняя плашка окна. Как в таком случае перетащить окно на другое место?

Способ 1. Можно воспользоваться предыдущим советом - уменьшить размер окна, чтобы стала доступна верхняя плашка окна. Потом можно за эту верхнюю плашку перетащить окно.

Способ 2. Нажмите клавишу Win и кликните правой кнопкой мыши на окно. Появится контекстное меню, в которой будет пункт "Переместить". Выберите этот пункт, после этого окно будет перемещаться вслед движениям мыши.

Примечание: по умолчанию на Ubuntu 22.04 настроена горячая клавиша Alt+F7 на функцию перемещения окна.

Как поменять пароль у текущего пользователя:

$ passwd

Как поменять пароль у любого пользователя:

$ sudo passwd имя_пользователя

[Как задать короткий пароль]

По умолчанию при смене пароля обычным пользователем система не даст создать пароль меньше 8 символов. Администраторам разрешено задавать любые пароли. Поэтому, если вы хотите установить короткий пароль, используйте команду passwd, запущенную с привилегиями админа через sudo:

$ sudo passwd имя_пользователя

При запуске VScode на ровном месте начало всплывать окно с требованием ввода пароля: "Authentication required. The password you use to log in to your computer np longer matches that of your login keyring.". Это может произойти, когда вы поменяли пароль для своей учетной записи командой passwd.

gnome keyring error

Если вы помните старый пароль, то введите его. Но есть радикальный способ устранить эту ошибку:

1. Перейдите в папку $HOME (~).

2. Нажмите Ctrl+H (или кликните View -> Show Hidden Files). Я пользуюсь Double Commander, у которого настроено отображение скрытых папок, для этого случая этот шаг необязателен.

3. Выполните двойной клик на папке .gnome2, или если у вас Ubuntu >= 14, то на папке .local/share/keyrings.

4. Выполните двойной клик на папке keyrings.

5. Удалите все файлы в папке keyrings.

6. Перезапустите окно терминала или перелогиньтесь. Если не поможет, то перезагрузите систему.

Совет взят отсюда: "I continue to get this when trying to log into ubuntu one from the ubuntu desktop".

При подключении устройств к портам USB операционная система Linux автоматически создает в папке /dev символические имена. Какое это будет имя - зависит от разновидности устройства и драйвера, под которым от работает. Например, устройства виртуального последовательного порта обычно подключаются под именами /dev/ttyUSBn, где n это число, обозначающее порядковый номер подключенного устройства.

Проблемы возникают, когда таких однотипных устройств может быть несколько, и необходимо четко знать, какое символическое имя какому устройству принадлежит. Решить проблему идентификации последовательных портов можно как минимум двумя способами: с помощью конфигурационных файлов /etc/udev/rules.d/ и с помощью символических ссылок в каталоге /dev/serial/by-id/.

[Способ 1. Правила /etc/udev/rules.d/]

Идентификацию последовательных портов можно сделать с помощью файлов правил в каталоге /etc/udev/rules.d/.

Предположим, что у вас есть три устройства виртуальных последовательных портов с разными серийными номерами (серийный номер подключенного устройства можно узнать с помощью утилиты dmesg [19]). Необходимо настроить правила udev таким образом, чтобы определенному серийному номеру соответствовало заранее известное вам имя. Как это сделать, процесс по шагам:

1. Создайте в каталоге /etc/udev/rules.d/ файл 99-ftdi.rules (для этого необходимо обладать правами администратора sudo).

2. Добавьте в этот файл для каждого устройства строку:

SUBSYSTEM=="tty", ATTRS{serial}=="серийный_номер", SYMLINK+="имя_устройства"

Например, файл может выглядеть следующим образом:

SUBSYSTEM=="tty", ATTRS{serial}=="B0037XKY", SYMLINK+="ttyUSB_dev1"
SUBSYSTEM=="tty", ATTRS{serial}=="B0029YLY", SYMLINK+="ttyUSB_dev2"
SUBSYSTEM=="tty", ATTRS{serial}=="B0038237", SYMLINK+="ttyUSB_dev3"

Теперь если вы подключите, например, устройство с серийным номером B0029YLY, то оно получит имя /dev/ttyUSB1, и udev автоматически создаcт для него в каталоге /dev символическую ссылку ttyUSB_dev2:

Список виртуальных последовательных портов до подключения устройства с серийным номером B0029YLY:

$ ls /dev | grep ttyUSB
ttyUSB0

Список виртуальных последовательных портов после подключения устройства с серийным номером B0029YLY:

$ ls /dev | grep ttyUSB
ttyUSB0
ttyUSB1
ttyUSB_dev2

Подробнее про систему udev можно почитать в статье udev (Русский). См. также man udev.

[Способ 2. Символические ссылки каталога /dev/serial/by-id/]

Предположим, что у вас есть устройство на чипе FT4232H, при подключении которого в системе создается 4 виртуальных последовательных порта (вывод команды sudo dmesg -w [19]):

[53443.742062] usb 3-7: new high-speed USB device number 17 using xhci_hcd
[53443.868983] usb 3-7: New USB device found, idVendor=0403, idProduct=6011, bcdDevice= 8.00
[53443.869001] usb 3-7: New USB device strings: Mfr=1, Product=2, SerialNumber=0
[53443.869006] usb 3-7: Product: Quad RS232-HS
[53443.869011] usb 3-7: Manufacturer: FTDI
[53443.880421] ftdi_sio 3-7:1.0: FTDI USB Serial Device converter detected
[53443.880463] usb 3-7: Detected FT4232H
[53443.880747] usb 3-7: FTDI USB Serial Device converter now attached to ttyUSB1
[53443.881048] ftdi_sio 3-7:1.1: FTDI USB Serial Device converter detected
[53443.881074] usb 3-7: Detected FT4232H
[53443.881269] usb 3-7: FTDI USB Serial Device converter now attached to ttyUSB2
[53443.881491] ftdi_sio 3-7:1.2: FTDI USB Serial Device converter detected
[53443.881510] usb 3-7: Detected FT4232H
[53443.881699] usb 3-7: FTDI USB Serial Device converter now attached to ttyUSB3
[53443.881969] ftdi_sio 3-7:1.3: FTDI USB Serial Device converter detected
[53443.881991] usb 3-7: Detected FT4232H
[53443.882183] usb 3-7: FTDI USB Serial Device converter now attached to ttyUSB4

Также система Ubuntu автоматически создает для устройств ttyUSB1, ttyUSB2 ttyUSB3, ttyUSB4 символические имена в папке /dev/serial/by-id/:

$ ls -la /dev/serial/by-id/
total 0
drwxr-xr-x 2 root root 140 апр  3 07:45 .
drwxr-xr-x 4 root root  80 апр  2 16:55 ..
lrwxrwxrwx 1 root root  13 апр  3 07:45 usb-FTDI_Quad_RS232-HS-if00-port0 -> ttyUSB1
lrwxrwxrwx 1 root root  13 апр  3 07:45 usb-FTDI_Quad_RS232-HS-if01-port0 -> ttyUSB2
lrwxrwxrwx 1 root root  13 апр  3 07:45 usb-FTDI_Quad_RS232-HS-if02-port0 -> ttyUSB3
lrwxrwxrwx 1 root root  13 апр  3 07:45 usb-FTDI_Quad_RS232-HS-if03-port0 -> ttyUSB4
lrwxrwxrwx 1 root root  13 апр  2 16:55 usb-Quectel_Quectel_EM05-CN-if00-port0 -> ttyUSB0

Таким образом, можно к этим отдельным портам ttyUSB1, ttyUSB2 ttyUSB3, ttyUSB4 обращаться по следующим именам:

/dev/serial/by-id/usb-FTDI_Quad_RS232-HS-if00-port0
/dev/serial/by-id/usb-FTDI_Quad_RS232-HS-if01-port0
/dev/serial/by-id/usb-FTDI_Quad_RS232-HS-if02-port0
/dev/serial/by-id/usb-FTDI_Quad_RS232-HS-if03-port0

Следующая команда покажет лог ошибок системы с момента предпоследней загрузки (-b -1), с переходом на страницу самых последних записей лога (-e):

$ journalctl -b -1 -e

См. также:

man journalctl
How to find out from the logs what caused system shutdown? site:stackexchange.com

Из Википедии:

"В операционных системах семейства Unix термины "device file", "device node" или "special file" это интерфейс к драйверу устройства, который появляется в файловой системе как если бы это был обычный файл. Подобные специальные файлы существуют также в DOS, OS/2 и Windows. Эти специальные файлы позволяют программе приложения взаимодействовать с устройством с помощью его драйвера устройства через вызовы системы стандартного ввода/вывода. Использование стандартных системных вызовов упрощает многие задачи программирования и приводит к непротиворечивым механизмам ввода-вывода пользовательского пространства, независимо от характеристик и функций устройства."

read -p "Press any key..."
read -p "Press any key..." -s
read -p "Press any key..." -n1 -s

Практический пример:

while true
do echo "1) Нажмите 1 для действия A" echo "2) Нажмите 2 для действия B" echo "3) Нажмите 3 для действия C" echo "q) Нажмите q для выхода" #read -p "" choice read -n 1 choice case "$choice" in 1 ) echo "" echo "Действие A" Действие_A ;; 2 ) echo "" echo "Действие B" Действие_B ;; 3 ) echo "" echo "Действие C" Действие_C ;; q|Q ) exit ;; * ) echo "Недопустимый ввод!" ;; esac
done

Вариант read -p "" choice требует после ввода выбранной клавиши нажать Enter. Вариант read -p 1 choice срабатывает сразу после нажатия выбранной клавиши.

См. также: How to make shell script wait for key press to proceed... site:linuxquestions.org.

Как это делается на Windows, см. статью "Как заставить bat-скрипт ждать нажатия клавиши?".

Пример запуска:

$ zip -r $ARCHIVE $PROJECTFOLDER -x@./$PROJECTFOLDER/excludezip.txt

В этом примере $ARCHIVE это имя файла архива, $PROJECTFOLDER имя архивируемой папки (например myproject), а excludezip.txt это файл, где находится список исключаемых папок. Пример файла excludezip.txt:

myproject/__pycache__/*
myproject/doc/*
myproject/log.txt

geoffmeyers / interceptty (https://github.com/geoffmeyers/interceptty)

Как использовать:

$ ./configure
$ make
$ make install
$ interceptty /dev/ttyACM0

Это как раз такой случай, когда сообщение об ошибке ничего не говорит о том, в чем проблема. Самая вероятная причина - файл, который вы пытаетесь запустить, оформлен как текстовый файл Windows, т. е. его окончания строк двухбайтовые, из символов CR и LF (0x0D, 0x0A).

Решить проблему можно с помощью утилиты dos2unix:

$ sudo apt install dos2unix
$ dos2unix имя_скрипта.sh

Обычно это используется для настройки среды кросс-компиляции для какой-нибудь отладочной платы. Например, нам нужно скомпилировать код для платы Luckfox Pico Mini, и тулчейн для компиляции находится в каталоге luckfox-pico/tools/linux/toolchain/arm-rockchip830-linux-uclibcgnueabihf/bin домашней директории пользователя /home/user. Нам необходимо обеспечить возможность запуска утилит директории тулчейна из любой текущей папки.

Создайте скрипт exp.sh со следующим содержимым:

#!/bin/bash

TOOLCHAIN_DIR=/home/user/luckfox-pico/tools/linux/toolchain/arm-rockchip830-linux-uclibcgnueabihf/bin
export PATH=$TOOLCHAIN_DIR:$PATH

В результате переменная окружения PATH будет модифицирована таким образом, что папка тулчейна получить приоритет в поиске исполняемого файла, потому что она будет подставлена первой в список путей.

Поместите скрипт exp.sh в каталог вашего проекта, в котором вы запускаете компиляцию. Для того, чтобы изменения переменной PATH вступили в силу, запускайте скрипт exp.sh в этой папке командой:

$ . ./exp.sh

.. или:

$ source ./exp.sh

Результат измененной переменной PATH:

$ printenv PATH
/home/user/luckfox-pico/tools/linux/toolchain/arm-rockchip830-linux-uclibcgnueabihf/bin:
/home/user/.pyenv/shims:/home/user/.pyenv/bin:/home/user/.cargo/bin:/usr/local/sbin:
/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin:
/snap/bin:/home/user/mavlink/pymavlink/tools

Я настраиваю у себя на Ubuntu сетевой интерфейс Ethernet enp0s31f6 командой:

$ sudo ifconfig enp0s31f6 192.168.1.1 netmask 255.255.255.0 up

Некоторое время этот интерфейс работает нормально, но через 10 секунд система выдает сообщение: "Connection failed. Activation of network connection failed", и настройки интерфейса enp0s31f6 обнуляются:

$ ifconfig enp0s31f6
enp0s31f6: flags=4163< UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        ether c4:c6:e6:cc:11:fa  txqueuelen 1000  (Ethernet)
        RX packets 262  bytes 38890 (38.8 KB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 413  bytes 67634 (67.6 KB)
        TX errors 0  dropped 25 overruns 0  carrier 0  collisions 0
        device interrupt 16  memory 0xbc300000-bc320000

Вот так выглядит сообщение об ошибке:

Connection Activation Failed

Если зайти в свойства сети, то переключатель активации интерфейса enp0s31f6 переводится в левое (не активное) положение.

Почему сбрасываются настройки интерфейса enp0s31f6?

Проблема возникает из-за конфликта между ручной настройкой через `ifconfig` и сетевым менеджером (NetworkManager), который управляет сетевыми интерфейсами в Ubuntu.

Что происходит:

Вы вручную настраиваете интерфейс командой ifconfig
NetworkManager обнаруживает, что интерфейс был изменен без его ведома
Через 10-30 секунд NetworkManager перезаписывает ваши настройки своими конфигурациями
Интерфейс возвращается в исходное состояние

Решения:

Вариант 1: Отключить NetworkManager для этого интерфейса

sudo nmcli dev set enp0s31f6 managed no

После этого можно настраивать интерфейс через ifconfig без вмешательства NetworkManager.

Вариант 2: Настроить интерфейс через NetworkManager

# Через nmcli
sudo nmcli con add type ethernet ifname enp0s31f6 con-name "my-ethernet"
sudo nmcli con modify "my-ethernet" ipv4.addresses 192.168.1.1/24
sudo nmcli con modify "my-ethernet" ipv4.method manual
sudo nmcli con up "my-ethernet"
# Или через графический интерфейсnm-connection-editor

Вариант 3: Настроить через systemd-networkd (альтернатива)

Отключите NetworkManager и включите systemd-networkd:

sudo systemctl stop NetworkManager
sudo systemctl disable NetworkManager
sudo systemctl enable systemd-networkd
sudo systemctl start systemd-networkd

Создайте конфигурационный файл:

sudo nano /etc/systemd/network/10-enp0s31f6.network

Добавьте содержимое:

[Match]
Name=enp0s31f6 [Network]
Address=192.168.1.1/24

Вариант 4: Постоянная настройка через /etc/network/interfaces

sudo nano /etc/network/interfaces

Добавьте:

auto enp0s31f6iface enp0s31f6 inet static
    address 192.168.1.1
    netmask 255.255.255.0

Затем перезапустите сеть:

sudo systemctl restart networking

Рекомендация: Используйте Вариант 2 (настройка через NetworkManager) - это наиболее правильный способ в современных версиях Ubuntu.

Способ 1: Через командную строку (nmcli)

Создание нового подключения:

# Создаем новое подключение с статическим IP
sudo nmcli con add type ethernet ifname enp0s31f6 con-name "my-ethernet" ip4 192.168.1.1/24
# Или пошагово: sudo nmcli con add type ethernet ifname enp0s31f6 con-name "my-ethernet" sudo nmcli con modify "my-ethernet" ipv4.addresses 192.168.1.1/24 sudo nmcli con modify "my-ethernet" ipv4.method manual sudo nmcli con modify "my-ethernet" ipv4.gateway 192.168.1.254 # если нужен шлюз sudo nmcli con modify "my-ethernet" ipv4.dns "8.8.8.8,8.8.4.4" # DNS серверы

Активация подключения:

# Активируем созданное подключение
sudo nmcli con up "my-ethernet"
# Или перезапускаем интерфейс sudo nmcli dev disconnect enp0s31f6 sudo nmcli con up "my-ethernet"

Способ 2: Через текстовый интерфейс (nmtui)

# Запускаем текстовый интерфейс
sudo nmtui

В меню выбираете:

  1. "Edit a connection"
  2. "Add" → "Ethernet"
  3. Заполняете параметры:
    • Device: enp0s31f6
    • IPv4 configuration: "Manual"
    • Addresses: 192.168.1.1/24
    • Gateway/DNS при необходимости
  4. "OK" → "Back" → "Activate a connection"

Способ 3: Через графический интерфейс

# Запускаем графический редактор подключений
nm-connection-editor

Или через системные настройки:

  • Откройте "Settings" → "Network"
  • Нажмите ⚙️ рядом с Ethernet подключением
  • Выберите закладку "IPv4"
  • Установите "Manual" метод
  • Добавьте адрес: 192.168.1.1, маска: 255.255.255.0

[Полезные команды для управления]

Просмотр статуса:

# Все подключения
nmcli con show# Активные подключения
nmcli con show --active# Статус устройств
nmcli dev status# Детальная информация о конкретном подключении
nmcli con show "my-ethernet"

Управление подключениями:

# Отключить подключение
sudo nmcli con down "my-ethernet"
# Удалить подключение sudo nmcli con delete "my-ethernet"
# Перезагрузить NetworkManager sudo systemctl restart NetworkManager

Автозапуск при загрузке:

# Включить автоподключение (по умолчанию включено)sudo nmcli con modify "my-ethernet" connection.autoconnect yes

[Пример полной настройки]

# Убедимся, что интерфейс управляется NetworkManager
sudo nmcli dev set enp0s31f6 managed yes
# Создаем новое подключение sudo nmcli con add type ethernet ifname enp0s31f6 con-name "static-enp0s31f6"
# Настраиваем статический IP sudo nmcli con modify "static-enp0s31f6" ipv4.addresses "192.168.1.1/24" sudo nmcli con modify "static-enp0s31f6" ipv4.method manual sudo nmcli con modify "static-enp0s31f6" ipv4.gateway "192.168.1.254" sudo nmcli con modify "static-enp0s31f6" ipv4.dns "8.8.8.8"
# Активируем подключение sudo nmcli con down "static-enp0s31f6" sudo nmcli con up "static-enp0s31f6"
# Проверяем nmcli con show "static-enp0s31f6" ifconfig enp0s31f6

[Решение возможных проблем]

Если интерфейс не управляется NetworkManager:

# Проверить статус
nmcli dev status# Если показывает "unmanaged", включить управление
sudo nmcli dev set enp0s31f6 managed yes

Если нужно временно отключить NetworkManager для интерфейса:

sudo nmcli dev set enp0s31f6 managed no

Рекомендую использовать Способ 1 (nmcli) - он надежный, работает в терминале и легко автоматизируется. После настройки через NetworkManager интерфейс будет стабильно работать без сбросов.

К рабочей станции Ubuntu, на которой есть доступ в Интернет через сетевой интерфейс wlp0s20f3, подключена платка LuckFox Pico Mini через другой сетевой интерфейс enp0s31f6:

$ ifconfig
enp0s31f6: flags=4163< UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.1.1  netmask 255.255.255.0  broadcast 192.168.1.255
        ether c4:c6:e6:cc:11:fa  txqueuelen 1000  (Ethernet)
        RX packets 2340  bytes 282440 (282.4 KB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 1803  bytes 252179 (252.1 KB)
        TX errors 0  dropped 35 overruns 0  carrier 0  collisions 0
        device interrupt 16  memory 0xbc300000-bc320000
wlp0s20f3: flags=4163< UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet 192.168.116.185 netmask 255.255.255.0 broadcast 192.168.116.255 inet6 fe80::bb8a:a175:f994:2786 prefixlen 64 scopeid 0x20 ether 8c:e9:ee:b2:56:4c txqueuelen 1000 (Ethernet) RX packets 51781 bytes 23058801 (23.0 MB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 41676 bytes 12006261 (12.0 MB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0

Ubuntu и платка LuckFox нормально видят друг друга через сеть 192.168.1\8 (ping проходит нормально в обе стороны). Вопрос следующий: как настроить доступ в Интернет для платки LuckFox Pico Mini через рабочую станцию Ubuntu?

[Решение]

Для этого нужно рабочую станцию Ubuntu превратить в роутер и включить на нем NAT для маршрутизации трафика между интерфейсами wlp0s20f3 (через него осуществляется доступ в Интернет) и enp0s31f6 (через него подключена платка LuckFox Pico Mini).

Чтобы обеспечить доступ в Интернет для платки LuckFox Pico Mini через вашу Ubuntu-станцию, вам нужно настроить IP-форвардинг и NAT. Вот пошаговая инструкция:

[Настройки на рабочей станции Ubuntu]

1. Включите IP-форвардинг на Ubuntu

# Временно включить (до перезагрузки)
sudo sysctl net.ipv4.ip_forward=1

# Постоянно включить (добавить в конфигурацию)
echo 'net.ipv4.ip_forward=1' | sudo tee -a /etc/sysctl.conf

2. Настройте iptables для NAT

# Очистите существующие правила (осторожно!)
sudo iptables -F
sudo iptables -t nat -F

# Добавьте правило MASQUERADE для интерфейса с интернетом sudo iptables -t nat -A POSTROUTING -o wlp0s20f3 -j MASQUERADE

# Разрешите форвардинг между интерфейсами sudo iptables -A FORWARD -i enp0s31f6 -o wlp0s20f3 -j ACCEPT sudo iptables -A FORWARD -i wlp0s20f3 -o enp0s31f6 -m state --state RELATED,ESTABLISHED -j ACCEPT

3. Сохраните правила iptables (опционально)

Для сохранения правил после перезагрузки:

# Установите iptables-persistent
sudo apt update
sudo apt install iptables-persistent

# Сохраните текущие правила sudo iptables-save > /etc/iptables/rules.v4

[Настройки на платке LuckFox Pico]

4. Настройте маршрут по умолчанию на LuckFox Pico

На платке LuckFox Pico Mini выполните:

# Установите шлюз по умолчанию (ваш Ubuntu-компьютер)
route add default gw 192.168.1.1
# Или используйте:
# ip routeip route add default via 192.168.1.1 dev eth0

Для постоянной настройки добавьте в /etc/network/interfaces:

auto eth0iface eth0 inet static
    address 192.168.1.100
    netmask 255.255.255.0
    gateway 192.168.1.1
    dns-nameservers 8.8.8.8 1.1.1.1

5. Настройте DNS на LuckFox Pico

Добавьте DNS-серверы в /etc/resolv.conf:

nameserver 8.8.8.8nameserver 1.1.1.1

6. Настройка разрешения DNS-имен на LuckFox Pico

# echo "nameserver 8.8.8.8" > /etc/resolv.conf
# echo "nameserver 1.1.1.1" >> /etc/resolv.conf
# echo "nameserver 192.168.1.1" >> /etc/resolv.conf

7. Проверьте соединение

На LuckFox Pico выполните:

# Проверьте доступность шлюза
ping 192.168.1.1
# Проверьте доступ в интернет
ping 8.8.8.8
# Проверьте DNS
ping google.com

[Устранение проблем]

Если что-то не работает, проверьте следующее.

Проверьте форвардинг:

cat /proc/sys/net/ipv4/ip_forward

Проверьте правила iptables:

sudo iptables -t nat -L -n -v
sudo iptables -L -n -v

Включите логирование (если нужно):

sudo iptables -t nat -A POSTROUTING -o wlp0s20f3 -j LOG --log-prefix "NAT: "

После выполнения этих шагов ваша платка LuckFox Pico Mini должна иметь доступ в Интернет через Ubuntu-станцию.

Если разрешить интерфейс Ethernet то он через некоторое время сам переводится в отключенное состояние. При этом всплывает сообщение "Connection failed. Activation of network connection failed":

Connection Activation Failed

В системном логе (можно посмотреть командой sudo tail -f /var/log/syslog) при этом появляется сообщение:

2025-09-24T15:32:22.036128+03:00 TAG-5779 NetworkManager[8040]: < info>  [1758717142.0350] device (enp0s31f6):
 state change: ip-config -> failed (reason 'ip-config-unavailable', sys-iface-state: 'managed')
2025-09-24T15:32:22.037096+03:00 TAG-5779 NetworkManager[8040]: < warn>  [1758717142.0361] device (enp0s31f6):
 Activation: failed for connection 'netplan-enp0s31f6'
2025-09-24T15:32:22.037193+03:00 TAG-5779 NetworkManager[8040]: < info>  [1758717142.0364] device (enp0s31f6):
 state change: failed -> disconnected (reason 'none', sys-iface-state: 'managed')
2025-09-24T15:32:22.046901+03:00 TAG-5779 NetworkManager[8040]: < info>  [1758717142.0467] dhcp4 (enp0s31f6):
 canceled DHCP transaction
2025-09-24T15:32:22.047047+03:00 TAG-5779 NetworkManager[8040]: < info>  [1758717142.0467] dhcp4 (enp0s31f6):
 activation: beginning transaction (timeout in 45 seconds)
2025-09-24T15:32:22.047105+03:00 TAG-5779 NetworkManager[8040]: < info>  [1758717142.0468] dhcp4 (enp0s31f6):
 state changed no lease
2025-09-24T15:32:22.047731+03:00 TAG-5779 avahi-daemon[1613]: Withdrawing address record for 192.168.1.1 on
 enp0s31f6.
2025-09-24T15:32:22.047828+03:00 TAG-5779 avahi-daemon[1613]: Leaving mDNS multicast group on interface
 enp0s31f6.IPv4 with address 192.168.1.1.
2025-09-24T15:32:22.047863+03:00 TAG-5779 avahi-daemon[1613]: Interface enp0s31f6.IPv4 no longer relevant
 for mDNS.

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

Чтобы отключить управление интерфейсом `enp0s31f6` в NetworkManager, есть несколько способов:

1. Через командную строку (рекомендуемый)

sudo nmcli dev set enp0s31f6 managed no

2. Проверить статус управления

nmcli dev status

После выполнения команды интерфейс enp0s31f6 должен показывать статус "unmanaged".

$ nmcli dev status
DEVICE TYPE STATE CONNECTION
wlp0s20f3 wifi connected ProxyNetwork
lo loopback connected (externally) lo docker0 bridge connected (externally) docker0
enxf665bcd7769f ethernet disconnected -- p2p-dev-wlp0s20f3 wifi-p2p disconnected -- cdc-wdm1 gsm unavailable --
enp0s31f6 ethernet unmanaged --

3. Через конфигурационный файл

Создайте или отредактируйте файл конфигурации:

sudo nano /etc/NetworkManager/conf.d/99-unmanaged.conf

Добавьте содержимое:

[keyfile]
unmanaged-devices=interface-name:enp0s31f6

4. Перезапустить NetworkManager

sudo systemctl restart NetworkManager

5. Проверить результат

nmcli dev status

Для возврата управления обратно:

sudo nmcli dev set enp0s31f6 managed yes
sudo systemctl restart NetworkManager

После этих действий NetworkManager перестанет управлять указанным интерфейсом, и вы сможете настроить его вручную через `/etc/network/interfaces` или другие методы.

См. также Q080.

Это можно сделать утилитами file или binwalk:

$ file output/image/rootfs.img
output/image/rootfs.img: UBI image, version 1
$ binwalk output/image/rootfs.img
DECIMAL       HEXADECIMAL     DESCRIPTION
--------------------------------------------------------------------------------
0             0x0             UBI erase count header, version: 1, EC: 0x0,
                              VID header offset: 0x800, data offset: 0x1000

Если у вас определенный интерфейс не обслуживается NetworkManager (см. Q083), то его нужно как-то настроить вручную под определенную конфигурацию. В этом совете приведен способ настройки через файл /etc/network/interfaces.

В Ubuntu настройка статического IP-адреса через /etc/network/interfaces — классический метод, который до сих пор работает, хотя в современных версиях часто используется netplan.

Отредактируйте файл конфигурации:

$ sudo nano /etc/network/interfaces

Ниже приведено несколько примеров содержимого файла /etc/network/interfaces.

Пример 1. Сетевой интерфейс enp0s31f6 подключен к внешнему роутеру с IP-адресом 192.168.1.1 (пример для типичной домашней сети):

auto lo
iface lo inet loopback
auto enp0s31f6 iface enp0s31f6 inet static address 192.168.1.100 netmask 255.255.255.0 gateway 192.168.1.1 dns-nameservers 8.8.8.8 8.8.4.4

Пример 2. На сетевом интерфейсе enp0s31f6 настроен IP 192.168.1.1, и хост Ubuntu сам настроен как маршрутизатор для раздачи трафика через NAT (см. Q082):

auto enp0s31f6
iface enp0s31f6 inet static
    address 192.168.1.1
    netmask 255.255.255.0

Пример 3. Настройка для беспроводного интерфейса (обычно wlan0 или wlp2s0), который подключается к базовой станции роутера:

auto wlan0
iface wlan0 inet static
    address 192.168.1.100
    netmask 255.255.255.0
    gateway 192.168.1.1
    dns-nameservers 8.8.8.8 8.8.4.4
    wpa-ssid YourWiFiName
    wpa-psk YourWiFiPassword

Пример 4. Расширенные настройки, указание сети и широковещательного адреса:

auto enp0s31f6
iface enp0s31f6 inet static
    address 192.168.1.100
    netmask 255.255.255.0
    network 192.168.1.0
    broadcast 192.168.1.255
    gateway 192.168.1.1
    dns-nameservers 8.8.8.8 8.8.4.4

Пример 5. Несколько IP-адресов на одном интерфейсе:

auto enp0s31f6
iface enp0s31f6 inet static
    address 192.168.1.100
    netmask 255.255.255.0
    gateway 192.168.1.1
auto enp0s31f6:0 iface enp0s31f6:0 inet static address 192.168.1.101 netmask 255.255.255.0

[Определение имени сетевого интерфейса]

$ ip link show

Или:

$ ifconfig -a

Показать только активные интерфейсы:

$ ip addr show

[Применение изменений]

Чтобы применить сделанные изменения после редактирования файла /etc/network/interfaces, используйте следующие команды.

Перезапуск сетевой службы (в системах с Systemd):

$ sudo systemctl restart networking

Или перезапуск конкретного интерфейса:

$ sudo ifdown enp0s31f6 && sudo ifup enp0s31f6

Или полная перезагрузка сети:

$ sudo systemctl restart systemd-networkd

[Проверка настроек]

Проверить IP-адрес:

$ ip addr show enp0s31f6

Проверить маршрутизацию:

$ ip route show

Проверить DNS:

$ systemd-resolve --status
$ ping mail.ru

Тестирование соединения:

$ ping -c 3 8.8.8.8

[Важные замечания]

Резервное копирование:

$ sudo cp /etc/network/interfaces /etc/network/interfaces.backup

Адаптируйте под вашу сеть:

address - желаемый статический IP
netmask - маска подсети (обычно 255.255.255.0)
gateway - IP вашего роутера
dns-nameservers - DNS серверы

Если что-то пошло не так, вернуть динамический IP (DHCP):

auto enp0s31f6
iface enp0s31f6 inet dhcp

[Для современных Ubuntu (18.04+)]

В новых версиях Ubuntu используется netplan. Конфигурация будет в /etc/netplan/, пример файла /etc/netplan/01-netcfg.yaml:

network:
version: 2
renderer: networkd
ethernets:
eth0:
addresses:
- 192.168.1.100/24
gateway4: 192.168.1.1
nameservers:
addresses: [8.8.8.8, 8.8.4.4]

Применить:

$ sudo netplan apply

Рекомендация: проверьте, какой метод настройки сетевых интерфейсов (или конкретного интересующего вас интерфейса) использует ваша версия Ubuntu, так как в современных дистрибутивах способ /etc/network/interfaces может быть устаревшим.

$ sudo netstat -ntulp
[sudo] password for user: 
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address   Foreign Address State  PID/Program name
tcp        0      0 127.0.0.54:53   0.0.0.0:*       LISTEN 1310/systemd-resolv 
tcp        0      0 127.0.0.1:631   0.0.0.0:*       LISTEN 33747/cupsd
tcp        0      0 127.0.0.1:11434 0.0.0.0:*       LISTEN 2860/ollama
tcp        0      0 127.0.0.53:53   0.0.0.0:*       LISTEN 1310/systemd-resolv
tcp        0      0 0.0.0.0:7070    0.0.0.0:*       LISTEN 2157/anydesk
tcp        0      0 0.0.0.0:22      0.0.0.0:*       LISTEN 1/init
tcp6       0      0 ::1:631         :::*            LISTEN 33747/cupsd
tcp6       0      0 :::7070         :::*            LISTEN 2157/anydesk
tcp6       0      0 :::22           :::*            LISTEN 1/init
udp        0      0 0.0.0.0:36201   0.0.0.0:*              1879/avahi-daemon:
udp        0      0 0.0.0.0:5353    0.0.0.0:*              1879/avahi-daemon:
udp        0      0 127.0.0.54:53   0.0.0.0:*              1310/systemd-resolv
udp        0      0 127.0.0.53:53   0.0.0.0:*              1310/systemd-resolv
udp        0      0 0.0.0.0:50001   0.0.0.0:*              2157/anydesk
udp6       0      0 :::5353         :::*                   1879/avahi-daemon:
udp6       0      0 :::47534        :::*                   1879/avahi-daemon:

Avahi-daemon — это реализация технологии "нулевого администрирования сети", Zeroconf (Zero Configuration Networking) для Linux. Проще говоря, это служба, которая позволяет компьютерам в локальной сети автоматически находить друг друга и предоставляемые ими службы без необходимости ручной настройки (без DNS-сервера и без прописывания хостов в файле /etc/hosts).

Его часто называют "Bonjour для Linux", так как Bonjour — это реализация Zeroconf от Apple.

Представьте, что у вас дома есть несколько устройств:

• Ноутбук с Ubuntu
• Принтер
• Медиа-сервер (например, Plex или Kodi)
• Умная колонка

Без Avahi, чтобы подключиться к принтеру по имени `my-printer.local` или найти медиа-сервер, вам пришлось бы вручную настраивать DNS или прописывать IP-адреса всех устройств. Avahi делает это автоматически.

Avahi использует для этого два основных протокола:

mDNS (Multicast DNS): когда устройству нужно найти сервис по имени (например, `my-pc.local`), оно отправляет широковещательный (multicast) запрос "Кто такой `my-pc.local`?" в сеть. Устройство с этим именем откликается и сообщает свой IP-адрес. Это полностью децентрализованная система, не требующая сервера.

DNS-SD (DNS Service Discovery): поверх mDNS работает механизм обнаружения служб. Устройства анонсируют, какие сервисы они предоставляют (например, "я принтер для печати", "я общая сетевая папка"), а другие устройства могут просматривать список доступных сервисов в сети.

Где вы с ним сталкиваетесь (примеры использования в Ubuntu)?

• Сетевые принтеры: многие современные принтеры используют Avahi для автоматического обнаружения в системе. Он позволяет вам увидеть принтер в списке доступных без установки драйверов вручную.
• Общий доступ к файлам: при использовании `System Config -> Sharing -> File Sharing` включается служба, которая анонсирует себя через Avahi. Другие компьютеры в сети (включая macOS и Windows с установленным Bonjour) увидят ваш компьютер в сетевом окружении.
• Удаленный доступ по SSH: если у вас включен SSH-сервер, вы можете подключиться к другому компьютеру по команде `ssh username@hostname.local`, вместо того чтобы помнить его IP-адрес.
• Обнаружение медиа-серверов: такие приложения, как Plex, Kodi, Rhythmbox, используют Avahi для поиска медиа-серверов в локальной сети.
• Серверы для разработки: при веб-разработке некоторые инструменты могут использовать `.local` адреса для тестирования на нескольких устройствах.

[Технические детали и управление]

 • Имя хоста: по умолчанию Avahi использует имя вашего хоста в Ubuntu, добавляя к нему суффикс `.local`. Если ваш хостнейм `ubuntu-pc`, то в сети он будет доступен как `ubuntu-pc.local`.

• Демон: слово `daemon` в `avahi-daemon` означает, что это фоновая служба (демон), которая постоянно работает и обрабатывает запросы.

• Утилиты: вместе с `avahi-daemon` часто устанавливаются утилиты для командной строки:

   - avahi-browse -al: показывает все (`-a`) сервисы, доступные в локальной сети.
   - avahi-resolve-host-name: преобразует `.local` имя в IP-адрес.

[Частые вопросы и проблемы]

1. Безопасен ли Avahi?

По умолчанию Avahi достаточно безопасен. Он работает только в пределах локальной сети и не передает данные наружу. Однако, в корпоративных сетях или при использовании публичных Wi-Fi его иногда отключают, чтобы не "светить" информацию о своем компьютере.

2. Нужно ли его отключать Avahi?

В большинстве случаев — НЕТ. Это легковесная служба, которая почти не потребляет ресурсов и очень полезна в домашней сети. Отключать ее стоит только если:

• У вас есть конкретные проблемы с сетевым обнаружением.
• Требования безопасности вашей сети запрещают использование mDNS.
• Вы не используете никакие сервисы, которые его требуют.

3. Как отключить Avahi?

Если вы все же решили его отключить, это можно сделать несколькими способами:

Временная остановка:

$ sudo systemctl stop avahi-daemon

Постоянное отключение (чтобы он не запускался при загрузке):

$ sudo systemctl disable avahi-daemon

Полное удаление пакета:

$ sudo apt remove avahi-daemon

Будьте осторожны, это может удалить и другие пакеты, которые от него зависят, например, `cups` — система печати.

4. Почему Avahi иногда "висит" в списке процессов и использует немного CPU?

Это нормально. Демон "прослушивает" multicast-трафик в сети и периодически отправляет анонсы о себе. Небольшая нагрузка — это штатная работа.

Итог:

Avahi-daemon — это удобный и элегантный компонент Ubuntu, который делает работу в локальной сети Plug-and-Play. Он избавляет вас от рутины по запоминанию и вводу IP-адресов, позволяя обращаться к устройствам по понятным именам и автоматически находить общие принтеры, файлы и медиа-серверы. В подавляющем большинстве случаев его стоит оставить включенным.

[Словарик]

PPA Personal Package Archives, пакеты, не предназначенные для официального распространения по разным причинам. Т. е. возможно это пока что софт для тестирования. Часто это проприетарные пакеты для ПО и драйверов Linux.

[Ссылки]

1. ubuntu: как вернуть текстовый режим загрузки.
2. Midnight Commander: команды и горячие клавиши site:mydebianblog.blogspot.com.
3. УСТАНОВКА ОБНОВЛЕНИЙ UBUNTU site:losst.ru.
4. Linux: аббревиатуры и термины.
5. How to Copy Paste in Linux Terminal [For Absolute Beginners] site:itsfoss.com.
6. Рекурсивное удаление файлов с определенным расширением имени.
7. BRLTTY site:brltty.app.
8. Add a User to a Group (or Second Group) on Linux site:howtogeek.com.
9. Утилита autoname.
10. Which one is better: using ; or && to execute multiple commands in one line? site:askubuntu.com.
11Операторы командной строки Linux: использование |, >, >>, &, &&, !, =, (\).
12. Команды управления переменными окружения Linux.
13. Отсортированный по времени модификации список файлов директории.
14. How do I determine the total size of a directory (folder) from the command line? site:askubuntu.com.
15. Ошибка скрипта bash, неверный интерпретатор: Нет такого файла или каталога.
16. 5 способов установить Windows-программы на Linux site:lifehacker.ru.
17. How to find all files containing specific text (string) on Linux? site:stackoverflow.com.
18. Команда Grep в Linux (поиск текста в файлах) site:routerus.com.
19. Просмотр сообщений dmesg в реальном времени.