Базовые знания Linux админа

 

Примечание

В данной серии не будет теории и прочего

Это абсолютный базис-гайд по установке ОС и базовым навыкам в терминале

В конце будет рассмотрено несколько современных технологий в простых реализациях

После прохождения гайда у вас будет машина и несколько популярных сервисов

Все. Дальше - сами, книги, видео, стажировка

Этот гайд - выжимка на многолетние накопления вопросов на канале и сайте

Гайд будет доступен на моем сайте:

http://snakeproject.ru

Видео будут доступны на моем канале YouTube:

https://www.youtube.com/channel/UCR6j95DKI80MFXIw2iJ3f1w

 

План:

 

2 часть — базовые навыки

Подключение к системе по сети мы будем осуществлять с помощью ssh клиента

На этапе установки мы отметили галку OpenSSH сервера, что позволит нам подключаться у серверу по протоколу ssh обращаясь на 22 порт ip-адреса сервера

Существует множество ssh клиентов, конкретно я использую Putty

 

Окно подключения выглядит так:

Выше вбит адрес, который я задал при установке

Изменил шрифт на больший

 

И сохраняем настройки сессии

 

 

При первом подключении сервер представится с помощью fingerprint

 

 

 

Отпечаток пальца (fingerprint) основан на открытом (pub) ключе хоста

 

Обычно - "/etc/ssh/ssh_host_rsa_key.pub"

 

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

 

Если отпечаток пальца (fingerprint) изменился, значит компьютер, к которому вы подключаетесь, изменил свой открытый (pub) ключ

 

Это может быть связано с переустановкой ssh, но это также может указывать на то, что вы подключаетесь к другому компьютеру с тем же доменом или IP

 

Такое может произойти, когда вы подключаетесь через что-то вроде балансировщика нагрузки

 

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

 

Вывод: если вас предупреждают об изменении отпечатка пальца, будьте осторожны и дважды проверьте, действительно ли вы подключаетесь к правильному хосту через безопасное соединение

 

В данном случае у нас все в порядке, соглашаемся

 

После соглашения подключиться мы попадем в терминал

 

Терминал в Linux - устройство ввода команд и получения обратной связи от сервера

 

Попросту - устройство ввода-вывода

В Linux вся навигация идет от "корня" - /

Команды могут иметь ключи, которые изменяют функционал команд

К самим командам существуют мануалы

Давайте приведем несколько примеров для базовых навыков работы с Linux

 

Навигация, перемещение, манипуляции с файлами и директориями

 

Перемещаемся по каталогам с помощью команды cd и узнаем текущее положение с помощью команды pwd:

 

peasant@server:~$ pwd

/home/peasant

peasant@server:~$ cd /

peasant@server:/$ pwd

/

peasant@server:/$ cd /home/peasant/

peasant@server:~$ pwd

/home/peasant

 

Теперь попробуем создать, удалить, переместить файлы и директории:

 

Создание пустого файла:

peasant@server:~$ touch testfile1

 

Создаст файл со строкой "teststring1" (stdout):

peasant@server:~$ echo "teststring1" > testfile2

 

Добавит строку "teststring2" в файл (stdout):

peasant@server:~$ echo "teststring2" >> testfile2

 

Потоки ввода-вывода

 

Принимается с клавиатуры терминала

0 — стандартный ввод (stdin)

 

Выводится на экран терминала

1 — стандартный вывод (stdout)

 

Выводится на экран терминала

2 — стандартная ошибка (stderr)

 

Откроем файл редактором vi:

peasant@server:~$ vi testfile1

Чтоб войти в режим изменения нажмите "i"

Создайте пару строк (например 123 + Enter + 321)

Выйдите из режима изменения в командный режим - "Esc"

Внесите изменения и выйдите - :wq + Enter

 

Существует множество других редакторов текста в Linux (например nano)

 

Редактор "vi" имеет расширенную версию - "vim"

 

Оставлю шпаргалку по использованию:

 

Выведите на экран содержимое файлов:

 

peasant@server:~$ cat testfile1

123

321

 

peasant@server:~$ cat testfile2

teststring1

teststring2

 

Выведите на экран содержимое текущего каталога:

peasant@server:~$ ls

testfile1  testfile2

 

Ключ "-l" расширяет выводимую информацию:

peasant@server:~$ ls -l

total 8

-rw-rw-r-- 1 peasant peasant  8 Oct 30 06:32 testfile1

-rw-rw-r-- 1 peasant peasant 24 Oct 30 06:30 testfile2

 

Создадим каталог:

peasant@server:~$ mkdir testfiles

 

Переместим туда файлы:

peasant@server:~$ mv testfile1 testfile2 ./testfiles

 

Проверим, что они переместились:

peasant@server:~$ ls -l

total 4

drwxrwxr-x 2 peasant peasant 4096 Oct 30 06:34 testfiles

 

peasant@server:~$ ls -l ./testfiles/

total 8

-rw-rw-r-- 1 peasant peasant  8 Oct 30 06:32 testfile1

-rw-rw-r-- 1 peasant peasant 24 Oct 30 06:30 testfile2

 

Пробуем удалить директорию:

peasant@server:~$ rm testfiles

rm: cannot remove 'testfiles': Is a directory

 

Для рекурсивного удаления не пустой директории используем ключ "-r":

peasant@server:~$ rm -r testfiles

 

peasant@server:~$ ls -l

total 0

 

Вывести справку по команде (например rm):

peasant@server:~$ man rm

 

В разделе "OPTIONS" находим ключи, где мы увидим наш ключ "-r":

 By default, rm does not remove directories.  Use the --recursive (-r or -R)

 

Для самостоятельной работы попробуйте команду копирования файлов - "cp"

 

Кратко о процессах и потоках в Linux

 

Упрощенно говоря, операционная система Linux состоит из ядра и пользовательского пространства

 

Ядро взаимодействует с оборудованием и ресурсами вычислительной машины

 

Пользовательское пространство ограничено в доступе к ресурсам

 

В пользовательском пространстве существуют процессы и потоки (по сути тоже являются процессами, имеют собственные PID, однако делят память процесса, которому они принадлежат)

 

Каждый процесс будет иметь идентификаторы PID (process ID) и PPID (parent process ID)

 

Процессы могут создавать копии(fork), при этом происходит копирование ресурсов процесса

 

Теперь посмотрим процессы в системе с помощью команды "ps":

 

peasant@server:~$ ps

    PID TTY          TIME CMD

   1666 pts/0    00:00:00 bash

   2077 pts/0    00:00:00 ps

 

peasant@server:~$ ps -a

    PID TTY          TIME CMD

   2078 pts/0    00:00:00 ps

 

peasant@server:~$ ps -au

USER         PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND

root         620  0.0  0.1   5828  1832 tty1     Ss+  05:58   0:00 /sbin/agetty

peasant     1666  0.0  0.5   8404  5484 pts/0    Ss   06:07   0:00 -bash

peasant     2079  0.0  0.3   8876  3476 pts/0    R+   07:14   0:00 ps -au

 

peasant@server:~$ ps -aux

USER         PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND

root           1  0.1  1.1 168744 12872 ?        Ss   05:58   0:04 /sbin/init ma

root           2  0.0  0.0      0     0 ?        S    05:58   0:00 [kthreadd]

root           3  0.0  0.0      0     0 ?        I<   05:58   0:00 [rcu_gp]

...Вывод обрезан...

Для самостоятельной работы разберитесь с помощью man, что означают ключи aux

 

Процессами можно управлять, отправляя сигналы системе с помощью команды "kill"

 

Синтакисис:

kill [-s <сигнал>] <PID>

 

Перечень сигналов можно вывести командой kill -l:

 

Особенности самых часто используемых сигналов:

1) SIGHUP - понимается процессами как: перечитать свои конфигурационные файлы

2) SIGINT  - немедленно завершает процесс, можно блокировать и перехватывать

3) SIGQUIT  - идентичен SIGTERM, позволяет сохранять дамп памяти

9) SIGKILL - не блокируется, не перехватывается, немедленно завершает процесс

15) SIGTERM - завершает корректно процесс, блокируется и перехватывается

 

Пример передачи сигнала - 9 (& - создает процесс в фоне):

peasant@server:~$ sleep 600 &

[1] 2122

 

$ kill -9 2122

 

peasant@server:~$ ps ax | grep sleep

[1]+  Killed                  sleep 600

 

Чтоб посмотреть дерево процессов, воспользуйтесь утилитой "pstree":

 

peasant@server:~$ pstree

systemd──accounts-daemon───2*[{accounts-daemon}]

        ─agetty

        ─atd

        ─cron

        ─rsyslogd───3*[{rsyslogd}]

        ─systemd───(sd-pam)

        ─systemd-journal

        ─systemd-logind

        ─systemd-network

        ─systemd-resolve

...Вывод обрезан...

 

Для просмотра и управления процессами в интерактивном режиме существуют команды "top" и "htop"

 

TOP постоянно обновляет информацию о процессах в режиме реального времени, по дефолту выводит топ 20 процессов по потреблению CPU

 

TOP - имеет команды:

h - справка

k - ввести PID процесса для команды kill

r - указать PID для изменения параметра nice (приоритет процесса, -20 макс. приоритет, 19  мин. приоритет, 0 — по умолчанию)

q - завершить исполнение top

 

HTOP - более продвинутая команда по сравнению с TOP

Распознает мышь, имеет возможность управления, выделения процессов мышью и передачу горячих команд

Попробуйте поработать с ней самостоятельно

 

Установка ПО из репозиториев в Ubuntu

 

Репозитории - сервера-хранилища ПО

 

ОС подключается к репозиториям через сеть, с помощью репозиториев контролируются обновления ПО

 

После установки Ubuntu уже имеет подключенный, стандартный репозиторий ПО

 

Структура репозитория в Ubuntu

 

Имеет четыре секции:

Main — свободное ПО, официально поддерживаемое

Restricted — проприетарное ПО, официально поддерживаемое

Universe — свободное ПО, официально не поддерживаемое, поддерживается сообществом

Multiverse — проприетарное ПО, официально не поддерживаемое

 

Основные репозитории Ubuntu:

release - пакеты на момент выхода релиза

release­security - пакеты критических обновлений безопасности

release­updates - пакеты обновления системы (более поздние версии ПО, вышедшие после релиза)

release­backports - бэкпорты более новых версий ПО, которое доступно в нестабильных версиях ОС

partner - репозиторий компаний ­ партнеров

 

Существует большое количество сторонних репозиториев от авторов ПО

 

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

/etc/apt/sources.list

 

Подключить репозиторий можно командой (sudo - команда для получения прав суперпользователя):

sudo apt-add-repository Имя_Репозитория

 

Или отредактировать вручную файл "sources.list" и дать команду:

sudo apt-get update

 

Менеджер ПО - apt-get

 

apt-get - утилита управления пакетами, требует прав суперпользователя (root)

 

С помощью sudo мы можем выполнять утилиты с правами суперпользователя

 

Основные команды:

 

apt-get update - обновить информацию о пакетах из репозиториев

 

apt-get install nano - установить пакет nano

 

apt-get upgrade - оновление пакетов, для которых в репозиториях доступны новые версии

 

apt-get remove nano - удаление пакета nano из системы

 

apt-get purge nano - удаление пакета nano и очистка системы от его конфигурационных файлов

 

apt-get autoremove - очистка системы от ненужных пакетов (если пакет был установлен не сам по себе, а как зависимость для другого пакета, который был удалён)

 

 

apt-cache – утилита запросов к кешу apt

 

Основные команды:

 

apt-cache search - поиск пакета по части названия или описания (понимает регулярные выражения)

 

apt-cache show - информация о пакете

 

apt-cache depends - зависимости указанного пакета

 

 

Логи ОС Linux

 

Вся информация, ошибки ОС, работа сервисов и прочее хранятся в журналах системы

 

По умолчанию каталог -  /var/log

 

Общие логи:

/var/log/syslog

/var/log/messages

 

Лог ядра:

/var/log/dmesg

 

Вы можете просматривать журналы с помощью вывода cat, head, tail, или да текстовыми редакторами

 

Пример вывода в реальном времени информации из журнала:

peasant@server:~$ tail -f /var/log/syslog

Oct 30 06:50:45 server systemd[1]: Finished Daily apt upgrade and clean activities.

Oct 30 07:17:01 server CRON[2083]: (root) CMD (   cd / && run-parts --report /etc/cron.hourly)

...

Oct 30 07:58:18 server systemd[1]: Started PackageKit Daemon.

Oct 30 08:03:24 server PackageKit: daemon quit

Oct 30 08:03:24 server systemd[1]: packagekit.service: Succeeded.

 

В Ubuntu сеть настраивается в автоматически создаваемом файле - /etc/netplan/*.yaml

 

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

peasant@server:~$ cat /etc/netplan/00-installer-config.yaml

# This is the network config written by 'subiquity'

network:

  ethernets:

    enp0s3:

      addresses:

      - 192.168.0.180/24

      gateway4: 192.168.0.1

      nameservers:

        addresses:

        - 8.8.8.8

        search:

        - local

  version: 2

 

Тут для примера забит адрес сервера - 192.168.0.180

 

Имя сетевой карты - enp0s3

 

Если необходимо внести изменения - сохраняем, даем команду:

sudo netplan apply

 

Команда "ip a" выдаст нам текущие настройки сетевых интерфейсов