Руководство по операционной системе Ubuntu и разработке на ней.
You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
byzoni 2c6382e67a Изменить 'README.md' 4 years ago
README.md Изменить 'README.md' 4 years ago

README.md

Заметки по операционной системе Ubuntu.

Терминал

В Ubuntu придется часто использовать терминал. Его можно вызвать сочетанием клавиш Ctr+Alt+T. Важно запомнить, что для большинства команд можно вызвать краткую справку:

<command> -h

Или если не работает первая:

<command> —help

Некоторые имеют подробный манул:

man <command>

Сочетания клавиш для операций копировать, вставить, вырезать работают только с зажатым Shift, например, Shift+Ctrl+V.

После запуска терминала мы по-умолчанию находимся в нашем домашнем каталоге. Он обозначается как ~. В терминале тильда в начале пути заменяется на /home/$USER. Файл ~/.bashrc сожержит команды, выполняемые интепретатором баша после запуска (например, при старте терминала). Имена исполняемых фалов, размещенных в каталогах /usr/bin или /usr/local/bin, доступны как команды.

sudo

sudo - это утилита, позволяющая выполнить команды с правами суперпользователя root. Перед именами команд, которые работают с файловой системой вне домашнего каталога, а так же для остановки root-процессов, нужно писать sudo. sudo используется для консольных приложений, в старых версиях убунту была утилита gksu которая позволяла запускать из под рута графические приложения (показывала окно ввода пароля перед запуском). Из Ubuntu 18.04 убрали ее, вместо нее предлагается использовать что-то типа gedit admin:///etc/hosts.

Если надоело sudo вводить можно авторизоваться под рутом:

zyrec@zyrec-pc:~$ sudo -i
[sudo] password for zyrec: 
root@zyrec-pc:~# 

PATH

Чтобы использовать в качестве команд исполняемые файлы из других каталогов их нужно добавить в переменную PATH. В переменной PATH хранятся пути, разделенные двоеточиями. Для этого в ~/.bashrc нужно добавить строку:

export PATH="$PATH:/path/to/executable"

Полезные команды

Операции над строками

Команда Описание
${var#*SubStr} will drop begin of string up to first occur of SubStr
${var##*SubStr} will drop begin of string up to last occur of SubStr
${var%SubStr*} will drop part of string from last occur of SubStr to the end
${var%%SubStr*} will drop part of string from first occur of SubStr to the end
echo ${first_string/Suzi/$second_string} Замена подстроки в строке
base64 <<< "Привет, мир!" Закодировать строку в base64
echo <base64> | base64 --decode Обратная операция
dd if=/dev/urandom | hexdump -C | less Просмотр данных в HEX

Информация о системе

Команда Описание
cat /etc/*-release Информация о дистрибутиве
lscpu и sudo lshw -class processor Информация о процессоре
cat /proc/cpuinfo | grep name | uniq Модель процессора
arch или uname -m Архитектура процессора
nproc или cat /proc/cpuinfo | grep process | wc -l Количество ядер процессора
sudo lshw -C display Информация о видеокарте
free -m Доступная и используемая оперативная память
sudo dmidecode --type 17 Тип и размер оперативной памяти
sudo fdisk -l | grep "Disk /dev/sd" Список дисков
cat /proc/uptime Сек., время работы CPU и время простоя в сумме для каждого ядра

Процессы

Команда Описание
top Мониторинг процессов
ps aux Список всех процессов
ps aux | grep python Список всех процессов python
kill <PID> Остановить процесс по идентификатору
killall firefox Остановить все процессы firefox
exec -a <MyProcessName> <Command> Запуск процесса под именем
pkill -f <MyProcessName> Остановка процесса с именем

Файловая система

Команда Описание
exec 3>out.txt Открыть файл в режиме чтения и записи и получить дескриптор файла
echo "Some line" >&3 Записать строку в файл, используя дескриптор файла
3>&- Закрыть дескриптор файла
-b filename Block special file
-c filename Special character file
-d directoryname Check for directory Existence
-e filename Check for file existence, regardless of type (node, directory, socket, etc.)
-f filename Check for regular file existence not a directory
-G filename Check if file exists and is owned by effective group ID
-G filename set-group-id True if file exists and is set-group-id
-k filename Sticky bit
-L filename Symbolic link
-O filename True if file exists and is owned by the effective user id
-r filename Check if file is a readable
-S filename Check if file is socket
-s filename Check if file is nonzero size
-u filename Check if file set-user-id bit is set
-w filename Check if file is writable
-x filename Check if file is executable
cat чтение из основного потока до <EOF>
cat <path/to/file> просмотр содержимого файлов
cd <path> навигация по каталогам
cp <src> <dst> копирование файлов/каталогов
mv <src> <dst> перемещение файлов/каталогов
mkdir <name> создание каталогов
nano <path/to/file> редактировать файд
rm <path/to/file> удаление файлов/каталогов
rmdir <path/to/catalog> удалить пустой каталог
rm -rf <path/to/catalog> Удалить каталог со всем его содержимым
rm *.txt Удалить все файлы с расширением .txt
ln -s <src> <dst> Создание мягкой ссылки
df -h Информация о файловой системе
sudo fdisk -l Инофрмация о "дисках"
tar -xvf <archive> Извлечь файлы из архива в текущий каталог
tar -xvf <archive> -C /path/to/extract Извлечь файлы из архива в другой каталог
curl -s http://exmaple.org/file.zip | tar -xvf - Скачать файл и разархивировать
readlink -f file.ext Получить полный путь до файла
find . -type f Вывести список файлов в директории рекурсивно
umount /dev/sd[XN] Размонтировть устройство (например, перед форматированием)
mkfs /dev/sda1 Отформатировать раздел
sudo dd if=/dev/sda of=/dev/sdb conv=notrunc,noerror Копировать жесткий диск

Установка и удаление пакетов

Команда Описание
sudo apt-get update Обновить список пакетов
sudo apt-get upgrade Обновить все пакеты
sudo apt-get install <package> -y Установить пакет без подтверждления
sudo apt-get remove <package> Удалить пакет
sudo apt-get autoremove Удалить неиспользуемые пакеты
sudo apt-get clean Удалить загруженные архивы
sudo dpkg -i <.deb package> Установить либо обновить deb-пакет
sudo apt-get install -f При ошибке предудыщей выполните эту и повторите
sudo dpkg -p <package> Удалить deb-пакет с сохранением конфигураций
sudo dpkg -P <package> Удалить deb-пакет с конфигурациями
dpkg -l | less Просмотр списка установленных deb-пакетов
./configure && make && sudo make install Установить из исходников

Помимо apt-get на Ubuntu доступен пакетный менеджер snap. Он более продвинутый. Все доступные пакеты для установки с помощью него можно увидеть на сайте snapcraft.io.

Also: GDebi Package Installer - программа для установки .deb пакетов.

Сервисы

Команда Описание
service --status-all Список сервисов
systemctl list-unit-files --type=service | grep enabled Список включенных сервисов

Сеть

Команда Описание
netstat -lt Список всех серверов, запущенных на хосте
printf 'GET / HTTP/1.0\r\nHost: google.com\r\n\r\n' | nc google.com 80 Отправить сырой TCP-запрос
curl -d <json> -H "Content-Type: application/json" -X POST <url> Отправить JSON-апрос через POST
exec {дескриптор-файла}<>/dev/{протокол}/{адрес-узла}/{номер-порта} Открыть TCP/UDP соединение (дескриптор - целое число больше 2)
wget url -O - | sh Выполнить удаленный скрипт
ssh -D 1080 -N user@server Создать socks-туннель (localhost:1080)

nginx

Команда Описание
sudo systemctl start nginx Запустить nginx
sudo systemctl stop nginx Остановить nginx
sudo systemctl restart nginx Перезапустить nginx
sudo systemctl enable nginx Включить автозапуск nginx
sudo systemctl disable nginx Выключить автозапуск nginx
sudo nginx -t Проверить конфигурацию на ошибки
sudo systemctl reload nginx Перечитать конфигурационные файлы
systemctl status nginx Статус nginx
tail -f /var/log/nginx/access.log Выводить добавлямые в лог строки
less /var/log/nginx/access.log Просмотр лога с возможностью прокрутки стрелками

Postgres

Команда Описание
sudo -u postgres psql Запуск с вводом пароля
CREATE USER "ttrss" WITH PASSWORD 'yourpass'; Создаем юзера с паролем
CREATE DATABASE name_db WITH OWNER "ttrss";' Создаем БД
GRANT ALL PRIVILEGES ON DATABASE name_db TO ttrss; Даём привилегия на запись на данную БД
\quit выход

MySQL

Команда Описание
mysql -u root -p Запуск с вводом пароля
mysqladmin -u root -p'qwerty' password '' Удаляем пароль чтобы его больше не вводить
mysql -u root -e 'show databases;' Выполнение запроса

Python

Команда Описание
python -m venv virtualenvironment Создать виртуальное окружение
. virtualenvironment/bin/activate Активировать виртуальное окружение
deactivate Дективировать виртуальное окружение
pip install requests Установить модуль
pip freeze > requirements.txt Сохранить список установленных модулей с их версиями в файл
pip install -r requirements.txt Установить модули из файла
pip freeze | xargs pip uninstall -y Удалить все установленные через pip модули

pyenv

Команда Описание
pyenv install 3.6.6 Установить определенную версию
pyenv global 3.6.6 Сделать версией по-умолчанию для команды
pyenv local 2.7.15 Сделать версией по-умолчанию для текущего каталога и всех вложенных
pyenv shell 2.7.15
pyenv versions Доступные версии

nvm

Команда Описание
nvm install 8.11.4 Установить определенную версию Node.js
nvm install node Установить последнюю версию
nvm uinstall <ver> Удалить версию
nvm alias default 8.11.4 Сделать версией по-умолчанию
nvm alias default node Сделать последнюю установленную версию версией по-умолчанию
nvm ls Список установленных версий

Vue

Команда Описание
npm i -g @vue-cli Установить vue-cli
vue create <projectName> Создать новый проект (пробел чтобы отметить пункт меню)
vue add pug -f Установка нового модуля с игнорированием Error: Plugin ... does not have a generator
npm run serve Запустить отладочный сервер
npm run build Запустить сборку проекта

Git

Команда Описание
git config --global user.email email@example.com Указать email пользователя
git config --global user.name "John Doe" Указать имя пользователя
git config --global credential.helper "cache --timeout=2592000" Хранить введенные логин и пароль в течении 30 дней
git clone https://github.com/requests.git Создать локальную копию репозитория
git pull Обновить локальный репозиторий с сервера
git add . Добавить все файлы из текущего и вложенных каталогов
git reset Отменить предыдущую операцию
git commit -m "message" Коммитим измения с целью их публикации
git push Загружаем измененнные файлы на сервер
git checkout <branch> Меняем ветку
git checkout -b <branch> Создаем новую ветку и переключаемся на нее
git rm -r --cached Удалить каталог из отслеживания
git subtree push --prefix <path/to/folder> <remote-repo> <branch> Push отдельной папки
git log --all --grep=<pattern> Поиск коммита по названию
git log -S<text> Поиск коммита по содержимому
	[alias]
    cl = clone
    cm = commit
    cs = commit -S
    ca = commit -a
    co = checkout
    st = status
    lt = log -1 HEAD
    lg = log --decorate --graph --format=fuller
    ll = log --pretty=oneline --abbrev-commit
    unchange = checkout --
    unstage = reset HEAD --
    br = branch
    lb = branch -v -a
    distclean = !git clean -fdx && git checkout -- .
    info = count-objects -vH
    zip = !git archive `git rev-parse --abbrev-ref HEAD` --prefix="`pwd | xargs basename`/" --format=zip > `pwd | xargs basename`.zip

Docker

Команда Описание
docker build -t web . Создать образ из Dockerfile в текущем каталоге
docker run -d -p 8080:8080 web Запустить образ в новом контейнере с проброской порта
docker ps -a Список запущенных контейнеров
docker stop <HASH_OR_NAME> Остановить запущенный контейнер
$ docker-compose up -d         # start containers in background
$ docker-compose kill          # stop containers
$ docker-compose up -d --build # force rebuild of Dockerfiles
$ docker-compose rm            # remove stopped containers
$ docker ps                    # see list of running containers
$ docker exec -ti [NAME] bash # ssh to the container

# list all images
docker images

# tag and publishing
docker tag <id> buonzz/name:version
docker login
docker push buonzz/name

# delete image
docker rmi -f <id>

# run an image
docker run yourusername/docker-whale

# view logs
docker logs [OPTIONS] CONTAINER

# set the port to expose in host
docker run -p 3000 my_image

# start new container interactively
docker container run -it

Прочее

Команда Описание
cloc . --exclude-dir=.vscode,venv Подсчет строк исходного кода
echo 'one two three' | xargs mkdir xargs итает входной поток и передает его в качестве аргуиентов др. команде

Рецепты

USB

Если устройство примонтировано:

$ umount /dev/sdb

Если разметка карты испорчена:

$ sudo dd if=/dev/zero of=/dev/sdb bs=512 count=1

Забиваем null-байтами первые 512 байт, где хранится информация о разметке.

Далее нужно создать файловую систему, раздел (sdb1) и отформатировать диск (sdb1).

Запись образа на диск:

sudo dd if=~/Downloads/Win10.iso of=/dev/sdb bs=8M

Установка PostgresSQL

Устанавливаем Postgres:

$ sudo apt update
$ sudo apt install postgresql postgresql-contrib

Запускаем сервер:

$ sudo systemctl start postgresql

Создаем пользователя чье имя соответствует вашему:

$ sudo -u postgres createuser --superuser $USER

Нужно так же создать одноименную БД:

$ sudo -u postgres createdb $USER

Устанавливаем пароль для юзера Zyrec:

$ sudo -u zyrec psql
psql (10.4 (Ubuntu 10.4-0ubuntu0.18.04))
Type "help" for help.

zyrec=# \password
Enter new password: 
Enter it again: 
zyrec=#

Команды в интерактивной консоли начинаются с "", т.е. надо писать "\help".

Как установить pgAdmin4

Сначала небольшое введение. В Ubuntu при стандартной установке доступны старые версии интрепретатора Python. Чтобы использовать для команды python другую версию интепретатора, я рекомендую установить менеджер версий pyenv.

$ python --version
Python 3.6.5

pgAdmin 4 не работает с Python 3.7.0: падает, встретив async как имя аргумента.

Если у вас не установлен pyenv, то вызов python везде замените на python3.

Создаем и активируем виртуальное окружение:

$ python -m venv pgadmin4
$ . pgadmin4/bin/activate

Качаем wheel:

$ wget https://ftp.postgresql.org/pub/pgadmin/pgadmin4/v4.9/pip/pgadmin4-4.9-py2.py3-none-any.whl
$ pip install pgadmin4-4.9-py2.py3-none-any.whl

Создадим локальные настройки:

$ cd /pgadmin4/lib/python3.6/site-packages/pgadmin4
$ nano config_local.py

Содержимое файла config_local.py:

import os
SERVER_MODE = False
DATA_DIR = os.path.realpath(os.path.expanduser('~/.pgadmin/'))
LOG_FILE = os.path.join(DATA_DIR, 'pgadmin4.log')
SQLITE_PATH = os.path.join(DATA_DIR, 'pgadmin4.db')
SESSION_DB_PATH = os.path.join(DATA_DIR, 'sessions')
STORAGE_DIR = os.path.join(DATA_DIR, 'storage')

Создадим сервис. Сервис не привязан к терминалу. Его можно добавить в автозагрузку, остановить и т.д.

$ gedit admin:///etc/systemd/system/pgadmin4.service

Пример файла:

[Unit]
Description=pgAdmin 4

[Service]
Type=simple
ExecStart=/home/zyrec/dev/pgadmin4/bin/python /home/zyrec/dev/pgadmin4/lib/python3.6/site-packages/pgadmin4/pgAdmin4.py

[Install]
WantedBy=multi-user.target

Запуск:

$ sudo systemctl start pgadmin4

pip freeze ignore

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

Для решения этой проблемы:

  1. Создаем виртуальное окружение и устанавливаем модули, которые нужно игнорировать;
  2. Выполняем pip freeze > ~/dev/ignore-requirements.txt;
  3. Добавляем в .bashrc строку alias pipfreezeignore='pip freeze | grep -vFxf ~/dev/ignore-requirements.txt'.

Использование:

$ pipfreezeignore > requirements.txt

Что делать если перестал работать pyenv

Возможно, в текущем каталоге либо в родительских имеется файл .python-version. Его нужно удалить.

Как создать свой сервис

В папке /etc/systemd/system создаем файл <service-name>.service.

Пример:

[Unit]
Description=<description>

[Service]
Type=simple
ExecStart=<command>

[Install]
WantedBy=multi-user.target

Нужно прописывать полный путь до команды (~ нельзя использовать).

Docker

Немного о синтаксисе

Запомнить:

  • Dockerfile может иметь сколько угодно инструкций FROM.

Алиасы для команд

Добавить в ~/.bashrc следующие строки:

alias docker-stop-all='docker stop $(docker ps -qa)'
alias docker-rm-all='docker rm -f $(docker ps -qa)'
alias docker-rmi-all='docker rmi $(docker images -q)'
alias docker-clean='docker-stop-all; docker-rm-all; docker-rmi-all'

Как из контейнера подключиться к базе на хосте

Самое простое решение - это docker run --network host... либо в docker-compose.yml добавить:

version: '3'

services:
  myservice:
    // ...
    network_mode: host

По целому ряду причин эти решения могут нам не подходить.

Итак, для начала нам нужно узнать свой локальный ip-адрес:

$ hostname -I | cut -d ' ' -f1
192.168.0.82

Этот айпи мы будем указывать в своих скриптах в качестве хоста. Сервера баз данных должны слушать этот адрес (универсальное решение в качестве хоста указать 0.0.0.0).

Postrgres
$ sudo nano /etc/postgresql/10/main/postgresql.conf

Ищем "listen_adresses":

#------------------------------------------------------------------------------
# CONNECTIONS AND AUTHENTICATION
#------------------------------------------------------------------------------

# - Connection Settings -

listen_addresses = 'localhost,192.168.0.82'
# либо можно слушать все адреса
# listen_addresses = '*'

В конец /etc/postgresql/10/main/hba_conf.conf нужно добавить строку:

host    all             all             172.17.0.0/8            md5

Это позволит избежать ошибок вида:

asyncpg.exceptions.InvalidAuthorizationSpecificationError: no pg_hba.conf entry for host "172.17.0.x"

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

$ sudo sytemctl restart postgresql
MySQL

Нужно в файле /etc/my.cnf или /etc/mysql/my.cnf изменить параметр bind-address:

[mysqld]
bind-address = 0.0.0.0

Мне этого делать не потребовалось netstat -lt показал что мускул и так слушает все хосты.

Redis
$ sudo nano /etc/redis/6379.conf

Находим и комментриуем bind 127.0.0.1:

# IF YOU ARE SURE YOU WANT YOUR INSTANCE TO LISTEN TO ALL THE INTERFACES
# JUST COMMENT THE FOLLOWING LINE.
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# bind 127.0.0.1

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

$ sudo systemctl restart redis_6379

Создание ярлыков:

$ sudo apt-get install --no-install-recommends gnome-panel
$ gnome-desktop-item-edit --create-new ~/Desktop

/sbin, /bin, /usr/bin и /usr/local/bin

/sbin , as distinct from /bin , is for system management programs (not normally used by ordinary users) needed before /usr is mounted. /usr/bin is for distribution-managed normal user programs. ... /usr/local/bin is for normal user programs not managed by the distribution package manager, e.g. locally compiled packages.

Структура файловой системы

Директория Описание
/ Корневая директория, содержащая всю файловую иерархию.
/bin/ Основные системные утилиты, необходимые как в однопользовательском режиме, так и при обычной работе всем пользователям (например: cat, ls, cp).
/boot/ Загрузочные файлы (в том числе файлы загрузчика, ядро и т.д.). Часто выносится на отдельный раздел.
/dev/ Основные файлы устройств системы (например физические устройства sata винчестеры /dev/sda, видео камеры или TV-тюнеры /dev/video или псевдоустройства, например «чёрные дыры» /dev/null, /dev/zero ).
/etc/ Общесистемные конфигурационные файлы, лежат в корне директории и файлы конфигурации установленных программ (имя происходит от et cetera).
/etc/X11/ Файлы конфигурации X Window System версии 11.
/etc/apt/ Файлы конфигурации пакетного менеджера Apt.
/etc/samba/ Файлы конфигурации сервера Samba, расшаривающего файлы по сети с windows машинами.
/home/ Содержит домашние директории пользователей, которые в свою очередь содержат персональные настройки и данные пользователя. Часто размещается на отдельном разделе.
/lib/ Основные библиотеки, необходимые для работы программ из /bin/ и /sbin/.
/media/ Точки монтирования для сменных носителей, таких как CD-ROM, DVD-ROM, flash дисков.
/opt/ Дополнительное программное обеспечение.
/proc/ Виртуальная файловая система, представляющая состояние ядра операционной системы и запущенных процессов в виде каталогов файлов.
/root/ Домашняя директория пользователя root.
/sbin/ Основные системные программы для администрирования и настройки системы, например, init, iptables, ifconfig.
/srv/ Данные, специфичные для окружения системы.
/tmp/ Временные файлы (см. также /var/tmp).
/usr/ Вторичная иерархия для данных пользователя; содержит большинство пользовательских приложений и утилит, используемых в многопользовательском режиме. Может быть смонтирована по сети только для чтения и быть общей для нескольких машин.
/usr/bin/ Дополнительные программы для всех пользователей, не являющиеся необходимыми в однопользовательском режиме.
/usr/include/ Стандартные заголовочные файлы.
/usr/lib/ Библиотеки для программ, находящихся в /usr/bin/ и /usr/sbin/.
/usr/sbin/ Дополнительные системные программы (такие как демоны различных сетевых сервисов).
/usr/share/ Архитектурно-независимые общие данные.
/usr/src/ Исходные коды (например, здесь располагаются исходные коды ядра).
/usr/local/ Третичная иерархия для данных, специфичных для данного хоста. Обычно содержит такие поддиректории, как bin/, lib/, share/. Она пригодится, когда /usr/ используется по сети.
/var/ Изменяемые файлы, такие как файлы регистрации (log-файлы), временные почтовые файлы, файлы спулеров.
/var/cache/ Данные кэша приложений. Сюда скачиваются пакеты перед их установкой в систему, здесь же они какое-то время и хранятся
/var/lib/ Информация о состоянии. Постоянные данные, изменяемые программами в процессе работы (например, базы данных, метаданные пакетного менеджера и др.).
/var/lock/ Lock-файлы, указывающие на занятость некоторого ресурса.
/var/log/ Различные файлы регистрации (log-файлы).
/var/mail/ Почтовые ящики пользователей.
/var/run/ Информация о запущенных программах (в основном, о демонах).
/var/spool/ Задачи, ожидающие обработки (например, очереди печати, непрочитанные или неотправленные письма).
/var/tmp/ Временные файлы, которые должны быть сохранены между перезагрузками.
/var/www/ Директория веб-сервера Apache, всё что находится внутри транслируется им в интернет (конфигурация по-умолчанию)