Администрирование FreeBSD, Linux, ... Ubuntu FAQ Tue, April 16 2024  

Поделиться

Нашли опечатку?

Пожалуйста, сообщите об этом - просто выделите ошибочное слово или фразу и нажмите Shift Enter.

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

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

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 instlal 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:

$ sudo apt install ncdu
$ ncdu /var

Можно скопировать информацию владельца (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

[Словарик]

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.

 

Добавить комментарий


Защитный код
Обновить

Top of Page