Отчёт по заданию 2. Занятиe 2. Администрирование Linux. Выполнил Бершауэр Владислав. Практическая работа №1,2,3,4,5. Ход работы: ## **Часть 2.1. Основы мониторинга OS Linux с помощью утилит df, du, free, iostat, mpstat, vmstat, w, htop.** ### 1. Команда df в linux Утилита df поставляется по умолчанию во всех дистрибутивах Linux и имеет очень простой синтаксис. Фактически вы можете просто набрать df и уже получить результат, но чтобы сделать вывод более читаемым используются дополнительные опции. Вот основной синтаксис: `$ df опции устройство` ![](https://i.imgur.com/ptLYMHt.png) Устройство указывать необязательно, но можно указать раздел диска, о котором мы хотим посмотреть информацию. А теперь рассмотрим основные опции утилиты: - a, –all – отобразить все файловые системы, в том числе виртуальные, псевдо и недоступные; ![](https://i.imgur.com/kffd6Pu.png) - B – изменить размер одного блока перед выводом данных, например, можно использовать BM, чтобы вывести все данные в мегабайтах; ![](https://i.imgur.com/L6LeNZW.png) - h – выводить размеры в читаемом виде, в мегабайтах или гигабайтах; ![](https://i.imgur.com/nxTm58e.png) - H – выводить все размеры в гигабайтах; ![](https://i.imgur.com/eQuKq0b.png) - i – выводить информацию об inode; ![](https://i.imgur.com/SC2v183.png) - k – выводить размеры в килобайтах; ![](https://i.imgur.com/UfJ8tcJ.png) - –output – использовать специальный формат вывода, если не задано, выводит все поля. Доступны такие варианты: ‘source’, ‘fstype’, ‘itotal’, ‘iused’, ‘iavail’, ‘ipcent’, ‘size’, ‘used’, ‘avail’, ‘pcent’, ‘file’ и ‘target’; ![](https://i.imgur.com/s0HX0rq.png) - P – использовать формат вывода POSIX; ![](https://i.imgur.com/Eh5yPve.png) - –total – выводить всю информацию про использованное и доступное место; ![](https://i.imgur.com/PfsWW9e.png) - t, –type – выводить информацию только про указанные файловые системы; ![](https://i.imgur.com/vyYvZGT.png) - x – выводить информацию обо всех, кроме указанных файловых систем; ![](https://i.imgur.com/tXcF4BS.png) - Теперь, после основных опций рассмотрим подробнее как примеры df linux. **Посмотрим, что говорит справка. Результат выполнения df –help** *Основные параметры:* - a, –all. показать все файловые системы. - h. Опция позволяет показать информацию более наглядной. Размеры выводятся в мегабайтах и гигабайтах. - H. Размеры показываются в гигабайтах. - k. Данная опция показывает на экране терминала размеры в килобайтах. - t, –type. Выводит информацию только про указанную файловую систему. - –total. Опция показывает всю информация о дисковом пространстве. - Как пользоваться df Чтобы посмотреть доступное пространство на всех примонтированных разделах и информацию о них достаточно набрать: `df` ![](https://i.imgur.com/oJlosuc.png) Утилита отображает стандартный набор колонок, но понять в ее выводе что-то с первого раза сложно. Все данные выводятся в килобайтах. Теперь давайте попросим утилиту выводить данные в более читаемом формате: `df -h` ![](https://i.imgur.com/zLYPzOg.png) Это самое популярное сочетание опций, потому что оно дает максимально понятную информацию и уже можно судить о том, что происходит на диске. Например, мы видим, что в домашней папке уже занято 87% места и, возможно, пора что-то удалить. Если задать опцию -a, вы можете получить информацию обо всех файловых системах известных ядру, которые были смонтированы: `df -a` ![](https://i.imgur.com/LAI68Mv.png) Здесь отображается огромное количество виртуальных файловых систем ядра. Если вы хотите вывести только информацию про реальные файловые системы на жестком диске можно использовать опцию -x чтобы отфильтровать все tmpfs: `df -x tmpfs` ![](https://i.imgur.com/TrhuVBQ.png) Также можно отфильтровать две файловые системы: `df -x devtmpfs -x tmpfs` ![](https://i.imgur.com/yW8UNmH.png) Или же указать файловую систему, которую нужно отображать: `df -t ext4` ![](https://i.imgur.com/cqV0NUO.png) Также можно указать интересующий вас раздел, как вы видели в синтаксисе команды: `df -h /dev/sdb6` ![](https://i.imgur.com/iyTdqim.png) С помощью опции -i вы можете посмотреть информацию про состояние inode в вашей файловой системе: `df -hi /dev/sdb6` ![](https://i.imgur.com/fe0lBnN.png) Вывести объем доступного пространства в каталоге: `df -h /home` ![](https://i.imgur.com/WbwVDZg.png) Команда df – очень простой в освоении, но эффективный инструмент, позволяющий всегда быть в курсе использования дискового пространства в ваших системах. ### 2. Команда du в Linux **Команда du** , сокращение от «использование диска», сообщает приблизительный объем дискового пространства, используемого данными файлами или каталогами. Это практически полезно для поиска файлов и каталогов, занимающих большие объемы дискового пространства. `du [OPTIONS]... FILE...` Если данный FILE является каталогом, du будет суммировать использование диска для каждого файла и подкаталога в этом каталоге. Если *FILE* не указан, *du* сообщит об использовании диска в текущем рабочем каталоге . При выполнении без какой-либо опции du отображает использование диска для данного файла или каталога и каждого из его подкаталогов в байтах. ![](https://i.imgur.com/YO2WIcQ.png) Вы также можете передать команде du несколько файлов и каталогов в качестве аргументов: ![](https://i.imgur.com/hNHQeOm.png) Если вы запустите du для файла или каталога, для которого у вас нет прав, вы получите что-то вроде «du: невозможно прочитать каталог». В этой ситуации вам нужно будет добавить к команде sudo . **du много опций, я выделю только наиболее часто используемые.** Параметр -a указывает du сообщать об использовании дискового пространства каждым файлом в каталоге. ![](https://i.imgur.com/W5PGVxV.png) Обычно вы хотите отображать только пространство, занимаемое данным каталогом, в удобочитаемом формате. Для этого используйте параметр *-h* . Например, чтобы получить общий размер */var/lib* и всех его подкаталогов, вы должны выполнить следующую команду: ![](https://i.imgur.com/HOh10zS.png) Мы используем sudo потому что большинство файлов и каталогов внутри каталога /var/lib принадлежат пользователю root и не доступны для чтения обычным пользователям. Результат будет выглядеть примерно так: (Чтобы сообщить только общий размер указанного каталога, а не подкаталогов, используйте параметр *-s* :) ![](https://i.imgur.com/GP1unTO.png) Параметр *-c* указывает *du* сообщать общую сумму. Это полезно, когда вы хотите получить объединенный размер двух или более каталогов. ![](https://i.imgur.com/v0BMqcw.png) Если вы хотите отобразить использование диска подкаталогами *n-уровня*, используйте параметр *--max-depth* и укажите уровень подкаталогов. Например, чтобы получить отчет о каталогах первого уровня, вы должны использовать: ![](https://i.imgur.com/RD6RO2l.png) По умолчанию утилита *du* повторно использует дисковое пространство, используемое каталогом или файлом. Чтобы узнать очевидный размер файла, используйте переключатель *--apparent-size* . «Видимый размер» файла — это фактический объем данных в файле. ![](https://i.imgur.com/J5QTXKa.png) du также позволяет использовать шаблон оболочки. Например, чтобы получить размер всех каталогов, начинающихся с «Do» в вашем домашнем каталоге, вы должны запустить: ![](https://i.imgur.com/9Uda3cj.png) **Использование du с другими командами** Команду *du* можно комбинировать с другими командами с конвейерами. Например, чтобы напечатать 5 самых больших каталогов внутри каталога */var* вы должны передать вывод du в команду sort чтобы отсортировать каталоги по их размеру, а затем передать результат в команду head которая распечатает только 5 верхних каталогов: ![](https://i.imgur.com/vIIVz8z.png) **Выводы** К настоящему моменту вы должны хорошо понимать, как использовать команду *du* . В отличие от *df* который выводит информацию об использовании диска смонтированными файловыми системами , команда *du* дает вам оценку дискового пространства, используемого данными файлами или каталогами. ### 3. Команда free в Linux Сколько свободной оперативной памяти доступно в моей системе Linux? Достаточно ли свободной памяти для установки и запуска новых приложений? В системах Linux вы можете использовать команду free чтобы получить подробный отчет об использовании памяти системой. Команда free предоставляет информацию об общем объеме физической памяти и памяти подкачки , а также о свободной и используемой памяти. **Содержание** - Как использовать команду free - Отображение использования памяти в удобочитаемом формате - Отображение использования памяти в других показателях - Отображение итоговых значений столбца - Непрерывно печатать результат - Как использовать команду free Синтаксис free команды следующий: `free [OPTIONS]` При использовании без какой-либо опции команда free будет отображать информацию о памяти и подкачке в килобайтах. 1 килобайт (КиБ) равен 1024 байтам. **free** Вывод будет включать три строки, заголовок, одну строку для памяти и одну для свопа: ![](https://i.imgur.com/aUbeSXB.png) В более старых версиях Linux вывод может немного отличаться. Вот что означает каждый столбец: - total — это число представляет общий объем памяти, который может быть использован приложениями. - used — Используемая память. Он рассчитывается как: used = total - free - buffers - cache - бесплатно — Свободная / неиспользуемая память. - общий — этот столбец можно игнорировать, поскольку он не имеет значения. Это здесь только для обратной совместимости. - buff / cache — объединенная память, используемая буферами ядра, а также страничным кешем и блоками. Эта память может быть освобождена в любое время, если это необходимо приложениям. Если вы хотите, чтобы буферы и кеш отображались в двух отдельных столбцах, используйте параметр -w . ![](https://i.imgur.com/nlOVb36.png) Доступно — оценка объема памяти, доступного для запуска новых приложений без подкачки. По умолчанию команда free показывает информацию о памяти в килобайтах. Чтобы просмотреть информацию в удобочитаемом формате (обычно в мегабайтах и гигабайтах), используйте параметр **-h :** ![](https://i.imgur.com/hKHnQPg.png) Отображение использования памяти в других показателях Команда free также позволяет вам указать единицы измерения памяти. Допустимые варианты: - b , --bytes — отображать вывод в байтах. ![](https://i.imgur.com/AhDX4PU.png) - -kilo — отображать вывод в килобайтах (1 КБ = 1000 байт). ![](https://i.imgur.com/myQ6l0E.png) - -mega — отображать вывод в мегабайтах. ![](https://i.imgur.com/oPSxATx.png) - -giga — Показать вывод в гигабайтах. ![](https://i.imgur.com/0S3LgpT.png) - -tera — Показать вывод в терабайтах. ![](https://i.imgur.com/z6dqtPy.png) - k , --kibi — Показать вывод в килобайтах. (1 КБ = 1024 байта). Это единица измерения по умолчанию. ![](https://i.imgur.com/ZOONSVu.png) - m , --mebi — Показать вывод в мегабайтах. ![](https://i.imgur.com/X9dsYWk.png) - g , --gibi — Показать вывод в гигабайтах. ![](https://i.imgur.com/ZTtqnTZ.png) - -tebi — отображать вывод в теробайтах. ![](https://i.imgur.com/LsCRrYC.png) - -peti — Показать вывод в перобайтах. ![](https://i.imgur.com/NsaXOKo.png) - -si — вместо 1024 используйте --mebi --si 1000. Например, --mebi --si равно --mega . ![](https://i.imgur.com/z4PbHrJ.png) **Например, чтобы отобразить результат в мегабайтах, введите:** ![](https://i.imgur.com/jQQ3FkX.png) **Отображение итоговых значений столбца** Чтобы отобразить строку, показывающую итоги столбца, используйте параметр -t . Это дает вам сумму памяти и свопа в столбцах total, used и free. ![](https://i.imgur.com/RhFKvvz.png) **Непрерывно печатать результат** Чтобы постоянно отображать информацию о памяти на экране, вызовите free с параметром -s ( --seconds ), за которым следует число, определяющее задержку. Например, чтобы распечатывать информацию о памяти каждые пять секунд, вы должны выполнить: ![](https://i.imgur.com/4lhsU3N.png) free команда будет продолжать отображать результат, пока вы не нажмете CTRL+C Это похоже на поведение команды watch . Чтобы отображать результат определенное количество раз, используйте параметр -c ( --count ). В примере ниже команда выведет результат десять раз: ![](https://i.imgur.com/WZbu5qq.png) ### 3.1 Команда free в Linux с примерами Автоматизируйте команду free и запускайте ее непрерывно или периодически Еще одна отличная особенность – возможность автоматизировать команду. Есть два варианта, которые помогают нам настроить этот инструмент: Есть параметр ‘-s’, которая запускает команду free в течение заданного интервала секунд, пока пользователь не закроет программу (^ + C). Существует также «-c», который можно использовать отдельно или в сочетании с параметром секунд. Если вы введете только «-c» и целое число (n), команда будет запускаться n раз. По умолчанию используются интервалы в одну секунду. Допустим, вы хотите открыть серию приложений и посмотреть, как влияет ваша память. Для тестового вывода мы будем использовать читаемый человеком формат, используя степени 1000 (Gb) вместо 1024 (GiB). Мы собираемся записать в течение 20 секунд, чтобы проанализировать воздействие. Мы собираем данные каждые 5 секунд, и будем делать это за 4 цикла. Вот этот пример, отформатированный для командной строки и ее вывода: ![](https://i.imgur.com/spnP57z.png) Мы подождали несколько секунд, а затем открыли несколько вкладок браузера и получил доступ к некоторым закладкам. Стресс этих видов деятельности отмечен колебаниями объема производства. Обратите внимание, что эффект будет более выраженным при использовании выходного формата с меньшим округлением. В наших чисто демонстрационных целях это не нужно. Если вы хотите постоянно отслеживать использование памяти командой free, но не хотите, чтобы ее вывод загромождал экран, вы можете использовать команду watch вместе с командой free. Это покажет вам только один вывод для команды free, но этот вывод будет изменяться через регулярные промежутки времени. `watch free -h` ![](https://i.imgur.com/NlYuuff.png) ### 4. iostat Процесс установки iostat очень прост. iostat является частью пакета sysstat, который можно установить на вашей соответствующей системе одной из команд ниже: ![](https://i.imgur.com/R18Dr8A.png) **Запуск IOSTAT** IOSTAT инструмент, который доступен через команду iostat. Введите эту команду, чтобы увидеть, как она работает: ![](https://i.imgur.com/b7p3qAK.png) **Синтаксис iostat очень простой. Вам достаточно выполнить:** `$ iostat опции устройство интервал` Параметры устройство и интервал необязательные. Первый указывает по какому устройству показывать статистику, а второй, с каким интервалом обновлять данные. Давайте сначала рассмотрим опции программы, которые могут вам пригодится: - с - отобразить только информацию об использовании процессора; ![](https://i.imgur.com/bt6wg0x.png) - d - отобразить только информацию об использовании устройств; ![](https://i.imgur.com/k6kZAWk.png) - h - выводить данные в отчёте в удобном для чтения формате; ![](https://i.imgur.com/x9iyvzw.png) - k - выводить статистику в килобайтах; ![](https://i.imgur.com/g7lypBv.png) - m - выводить статистику в мегабайтах; ![](https://i.imgur.com/0a2LmZ8.png) - o JSON - выводить статистику в формате JSON; ![](https://i.imgur.com/szReZFM.png) - p - вывести статистику по устройству и всех его разделам; ![](https://i.imgur.com/uPHr0nQ.png) - x - вывести расширенную статистику; ![](https://i.imgur.com/p44GawY.png) - y - отображать статистику с момента запуска утилиты, а не системы; ![](https://i.imgur.com/01mv4Th.png) - z - спрятать информацию о дисках, у которых нет активности. - ![](https://i.imgur.com/LvvcrbV.png) Самый простой пример использования утилиты, это запустить её без параметров. Она выведет отчёт с со средней статистикой с момента включения системы до момента запуска программы: `sudo iostat` ![](https://i.imgur.com/kRy1pVP.png) В первой части отчёта находится информация о загруженности процессора. Тут есть такие колонки: - %user - процент использования процессора программами, запущенными на уровне пользователя; - %nice - процент использования процессора программами запущенными тоже в пространстве пользователя, но только с изменённым приоритетом; - %system - процент использования процессора ядром; - %iowait - процент времени затраченного на ожидание завершения операций ввода/вывода; - %steal - процент простоя виртуального процессора, пока гипервизор отдаёт мощность другому виртуальному процессору; - %idle - процент времени пока процессор не занят ничем. Если значение параметра %iowait слишком большое, то это может означать, что у вас проблема с производительностью диска и слишком много времени тратится на ожидание завершения ввода/вывода. Для устройств ввода/вывода тоже отображается ряд колонок с информацией. Разберемся что они означают: - tps - означает количество запросов на чтение или запись к устройству в секунду; - KB_read/s, MB_read/s - количество килобайт или мегабайт, прочитанных с устройства за секунду; - KB_wrtn/s, MB_wrtn/s - количество килобайт или мегабайт записанных на устройство в секунду; - KB_dscd/s, MB_dscd/s - скорость освобождения блоков данных на устройстве, килобайт или мегабайт в секунду; - KB_read, MB_read - общее количество прочитанных данных с диска с момента загрузки системы; - KB_wrtn, MB_wrtn - количество записанных данных с момента загрузки системы; - KB_dscd, MB_dscd - количество освобождённых блоков на диске в результате выполнения операции trim в килобайтах или мегабайтах. С чтением и записью, я думаю, что всё понятно. Освобождение блоков с данными с помощью операции trim или discard актуально для SSD дисков. Этой операцией файловая система сообщает какие блоки больше хранить физически не нужно и можно использовать для других целей. Утилита отображает с какой скоростью эти блоки освобождаются, а также сколько блоков или мегабайт данных было освобождено. Рассмотрим ещё несколько примеров. Для просмотра данных в удобном формате выполните: ![](https://i.imgur.com/0n294UG.png) Чтобы посмотреть данные по нужному устройству просто укажите это устройство: ![](https://i.imgur.com/J1E8KLG.png) Можно посмотреть статистику по каждому разделу устройства, тогда надо воспользоваться опцией -p: ![](https://i.imgur.com/9d4uv0d.png) Чтобы утилита автоматически обновляла данные каждую секунду просто добавьте интервал. Например: ![](https://i.imgur.com/KRsxCoH.png) Если вы не хотите чтобы утилита суммировала все данные с момента запуска операционной системы, то можно использовать опцию -y. Но работает она только если задан интервал: ![](https://i.imgur.com/6nhr5Du.png) ### 4.1 Профилирование нагрузки на файловую систему с помощью iostat Зачастую работа «в поле» требует сбора и анализа информации на сайте заказчика в условиях наличия крайне скудного списка утилит. В частности собрать информацию об использовании системы ввода-вывода в течении дня. В статье я попробую показать, как располагая только iostat и gnuplot можно попробовать провести анализ системы и какие выводы можно сделать. Я не претендую на доскональное владение предметом и точное использование терминов. Более того, я постараюсь говорить «обычным» языком и не бросаться терминами. Все описанное ниже есть плод опыта, ошибок, гугления, курения манов и прочая **Небольшой ликбез** В терминах оценки производительности системы ввода-вывода в части хранения, есть несколько характеристик: Пропускная способность (байт в секунду) — максимальная линейная скорость с которой устройство пишет или читает один, но очень большой файл. IOPS (операций в секунду) — число запросов, отправленных на устройство. Это скорость работы с большим числом мелких файлов. Время обработки (миллисекунд) — время за которое в среднем обрабатывается запрос на ввод-вывод включая ожидание в очереди, причем наиболее характерно именно ожидание, ибо оно зависит от загрузки, а не собственно размера запроса. Чем выше это время, тем «тормознутее» отзыв системы на запрос приложения, но остальные приложения в принципе не затрагиваются. Загрузка (проценты) — оценка загруженности системы на ввод-вывод. При значениях близких к 100% система «встает», в том числе все приложения. Процессора уходят в iowait, а процессы, желающие ввода-вывода — в `[Disk]` Sleep При этом нужно понимать, что ни один из этих параметров не может дать полноценный профиль использования файловой системы. Сложно увидеть и оценить «чистую» работу файловой подсистемы, хотя бы из-за того, что в стеке ее работы присутствуют различные кеши: буфер диска, кеш RAID контроллера, системный кеш. Соответственно более менее экстраполируемые цифры могут быть получены только вблизи от пиковой нагрузки. А тема правильного тестирования систем хранения, сравнения и оценки результатов это вообще поле не паханое и можно писать диссертации. **Базовые характеристики** Так как измерять абсолютные цифры вообще дело не очень благодарное, я предпочитаю оценивать их значение опираясь на какой то базис, и после этого уже оперировать какими то относительными мерками. Причем опыт работы с СУБД намекает, что сравнивать стоит не значения, а их порядки. За такой базис я для себя принял следующие цифры: Средний серверный жесткий диск 10 тысяч оборотов в секунду, подключенный по SAS к путному RAID контроллеру (с кешем на батарейке): имеет пропускную способность около 300 Мегабайт в секунду при последовательном доступе выдает порядка 150 iops (в попугаях) при времени обработки запросов порядка 10 мс Если все это живет в RAID то соответственно в зависимости от типа рейда цифры множатся или делятся на число дисков. Например: 4 диска в RAID 1+0 должны показать половину суммарных iops всех четырех дисков. Если тесты показывают, что система работает, выдавая примерно эти цифры, значит никто при тестировании не «нажал», никаких чудес нет и можно работать дальше. Иначе стоит сначала разобраться что с железом (может RAID восстанавливается или винт сыпется). В основном результаты тестирования я использую для оценки эффективности работы с системой хранения и влияние настроек СУБД и нашего софта, на то как они её используют, а так же быстрой диагностики наличия проблем с СУБД. **Измерения** **Подготовка** Для начала разумно сохранить df -hl для того чтобы понимать о каких разделах идет речь. ![](https://i.imgur.com/NlD7NLD.png) Кстати, полезно еще помнить на каком из разделов располагается swap. Хорошо будет, если физическое устройство разбито на разные логические разделы для каждого компонента. Этим мы сможем оценить профиль использования системы ввода-вывода для каждого разнесенного компонента. **Наблюдение** В отличии от других утилит iostat не очень приспособлен для логирования с учетом времени. Ну ничего, awk в помощь. **Строчка для получения лог файла:** ![](https://i.imgur.com/SvTbZHU.png) Естественно, запускать это надо в скрине. Следует обратить внимание на параметр -t 10. Это интервал, за который усредняются значения и вычисляются «средние» в секундах. Если значение будет слишком мало — будут на графике лишние пики и выбросы. Если слишком велико — существенных пиков заметно не будет. По моему интервал 3-10 секунд оптимальный. **Ввод нашего лога будет примерно таким**: ![](https://i.imgur.com/XxGDZvD.png) Первый блок это измерения за период работы с момента старта. Остальные за время указанный интервал. Запускаем это логгирование на некий интервал (например пару суток, а потом просим прислать лог. **Анализ** Ну что по таким цифрам можно сказать? В первую очередь обратим внимание на последнюю колонку *%util*. Хотя бы потому, что большое значение этого параметра (90%-100%) для пользователя выглядит как «сервер висит». У нас sda загружен менее чем на 9%. Нормально. Причем в основном разделом *sda7(SQL)*. **Далее параметры записи/чтения:** пропускная способность колонки rkB/s, wkB/s. Пишем 219 KБ/с iops колонки r/s, w/s — 10,5 запросов в секунду время обработки запроса: await — 156 ms, из них собственно выполнение svctm 8 ms О чем это говорит: Диск не загружен, числа не большие. Но запросы стоит в очереди 200ms время приемлемое, но при «первом шухере расколется», сама подсистема паршивенькая. Хотя однозначно сказать нельзя? ибо опять таки диск не сильно грузится вот и не торопятся данные отправлять из очереди. Что еще полезно: rrqm/s, wrqm/s это собственно число запросов, которые приложения попросили выполнить, но система смогла их объединить в блоки в среднем по avgrq-sz байт. Данные цифры помогут оптимизировать работу приложения: Если вы откроете 100500 файлов, начнете произвольно прыгать по открытым файлам и заниматься прочими излишествами, выкушаете кеш системы — r/s,w/s начнут стремиться к rrqm/s и wrqm/s, и avgrq-sz падать. Это ситуация чистого Random Access — самый медленный сценарий использования диска. А если все будет последовательно, то стремиться они будут к единичке (а лучше к нолику), а avgrq-sz расти. Единственный запрос за интервал — это чистой воды Sequential Access — самый быстрый сценарий использования диска. Понятно, что всегда последовательной работы добиться трудно, а часто и невозможно, но сопоставляя эти цифры — можно оценить улучшило или ухудшило изменение логики работы с диском нагрузку на него. ### 5. mpstat Утилита mpstat для мониторинга производительности Unix/Linux mpstat — отчет о использовании процессоров. Команда mpstat пишет в стандартный вывод на экран о каждом имеющемся процессоре, 0-й процессор будет выведен на первое место. Параметр «interval» определяет количество времени в секундах между каждым отчетом. Значение 0 (или без параметров) показывает статистику о процессорах и отчетность будет представляться с момента запуска системы (загрузки). ### 5.1 Отображение всей информации Опция «-А», показывает всю информацию, которая может быть отображена с помощью команды mpstat, как показано ниже. Это действительно эквивалентно команде «-I ALL -u -P mpstat ALL» команды: `mpstat -A` ![](https://i.imgur.com/LWNHWUz.png) ### 5.2 Показать статистику CPU индивидуального процессора (или) ядра Параметр «-P ALL», покажет все индивидуальные процессоры или ядра вместе со статистикой: `mpstat -P ALL` ![](https://i.imgur.com/yc9jMWo.png) ### 5.3 Для отображения статистически о конкретном CPU или ядре, используйте опцию «-P», как показано ниже: `mpstat -P 0` ![](https://i.imgur.com/lkHE0c1.png) ### 5.4 Можно выполнить «mpstat -V» чтобы показать версию утилиты: ![](https://i.imgur.com/Tg9OTf6.png) ### 5.5 Дополнительные опции ![](https://i.imgur.com/zl6jbKj.png) ### 6. vmstat В первую очередь нужно вызвать команду vmstat, ![](https://i.imgur.com/J2LWxHU.png) которая предоставляет краткую информацию о различных ресурсах системы и связанных с ними неполадках, приводящих к снижению производительности. Отчет команды vmstat содержит статистическую информацию о нитях ядра, находящихся в очереди выполнения и ожидающих запуска, а также об оперативной памяти, подкачке, дисках, прерываниях, системных вызовах, переключении контекста и работе процессора. В информации о процессоре указывается доля времени, в течение которой процессор работал в пользовательском режиме, системном режиме, простаивал и ожидал завершения операции дискового ввода-вывода. Для получения информации о работе процессора удобнее использовать команду vmstat, а не iostat, так как ее построчный вывод проще анализировать, а в случае, когда к системе подключено много дисков, ее вывод намного менее объемный. Приведенный ниже пример иллюстрирует применение vmstat для обнаружения программ, которые потребляют слишком много ресурсов CPU. **vmstat -a** (active/inactive memory) - активная/неактивная память ![](https://i.imgur.com/jH6d1Y7.png) **vmstat -f** (number of forks since boot) - количество вилок с момента загрузки ![](https://i.imgur.com/FG3c7Io.png) **vmstat -d** (disk statistics) - статистика диска ![](https://i.imgur.com/VkwEhrc.png) **vmstat -D** (summarize disk statistics) - (общая статистика диска) ![](https://i.imgur.com/O6SRbLw.png) **vmstat --help** ![](https://i.imgur.com/XbWkwRj.png) vmstat 1 - 60 - через какое количество секунд выводить информацию ### 7. Утилита/команда " w " Выводит краткую сводку о работающих в системе в данный момент пользователях (залогиненных пользователях), а также о том, какие процессы у них запущены ![](https://i.imgur.com/rNVJSue.png) В таблице для каждого пользователя выводятся следующие поля: ``` USER — имя пользователя. TTY — название терминала. FROM — название удаленного компьютера или IP-адрес. LOGIN — время входа в систему. IDLE — время бездействия. JCPU — время, использованное всеми процессами, подключенными к tty. Оно не включает завершенные фоновые задания, но включает фоновые задания, работающие в данный момент. PCPU — время, использованное текущим процессом, который указан в поле WHAT. WHAT — текущий процесс (командная строка текущего процесса). ``` - h Не выводить заголовок у таблицы. ![](https://i.imgur.com/jxQD9TA.png) - u Игнорировать имена пользователей при определении времени текущего процесса и времени CPU. ![](https://i.imgur.com/Zj4hsj7.png) - s Использовать сокращенный формат вывода. Не выводить колонки JCPU и PCPU. ![](https://i.imgur.com/bIq2HxO.png) - f Включить или выключить вывод поля from, которое соответствует имени удаленного хоста (remote hostname). В зависимости от дистрибутива Linux (версии утилиты w), поле from может выводиться или не выводиться по умолчанию. ![](https://i.imgur.com/9SCrTKp.png) - i Выводить в поле from IP-адрес вместо имени хоста (hostname), если это возможно. ![](https://i.imgur.com/Emd6Xcb.png) - o Выводить информацию в старом формате. Время, которое меньше 1 минуты, не выводится. ![](https://i.imgur.com/StHVbgI.png) - V Вывести версию утилиты w. ![](https://i.imgur.com/Z4thJzk.png) ### 8. Утилита htop ![](https://i.imgur.com/RUK1jvq.png) **Как установить htop** Установите пакет с именем htop используя менеджер пакетов для вашего дистрибутива. ![](https://i.imgur.com/g3LVMLo.png) **Как просмотреть все процессы в Linux** Команду htop можно запускать как с правами обычного пользователя: ![](https://i.imgur.com/M7jBAk3.png) Так и с привилегиями суперпользователя, для этого используйте sudo: `sudo htop` Права суперпользвоателя нужны только для некоторых действий: для изменения приоритета (nice) процессов, для закрытия процессов других пользователей. **Как и в случае с программой top, окно разделено на два основных раздела:** ``` обобщённая информация о системе подробная информация о процессах область с информацией о системе ``` **В самом верху показана нагрузка на каждое ядро центрального процессора (цифры от 1 до 12).**` ``` Mem — это общее количество оперативной памяти и используемая память. Task — обобщённая статистика по процессам Swp — уровень занятости файла подкачки (если он есть) Load average — средняя загрузка центрального процессора Uptime — время работы операционной системы с момента последней загрузки ``` **Теперь перейдём к области с информацией о запущенных процессах**. ***Значение столбцов htop*** Программа htop выводит следующие столбцы: *PID* Идентификатор процесса. *USER* Имя пользователя владельца процесса или ID если имя не может быть определено. *PRI* Приоритет — внутренний приоритет ядра для процесса, обычно это просто значение nice плюс двадцать. Отличается для процессов имеющих приоритет выполнения real-time. *NI* NICE значение процесса от 19 (низкий приоритет) до -20 (высокий приоритет). Более высокое значение означает, что процесс «приятный» для других и позволяет им иметь более высокий приоритет выполнения. *VIRT* Размер виртуальной памяти процесса (M_SIZE). *RES* Размер резидентного набора (text + data + stack) процесса (т.е. размер используемой физической памяти процесса, M_RESIDENT). *SHR* Размер общих страниц процесса (M_SHARE). *S* STATE, состояние процесса, может быть: ``` S для спящих (в простое) R для запущенных D для сна диска (бесперебойный) Z для зомби (ожидает родитель считает его статус выхода) T для отслеживания или приостановки (т. е. от SIGTSTP) W для подкачки ``` *CPU%* Процент процессорного времени, которое процесс использует в данный момент. *MEM%* Процент памяти, используемой процессом в данный момент (в зависимости от размера резидентной памяти процесса, см. M_RESIDENT выше). *TIME+* Время, измеренное в часах, указывает на то, сколько процесс провёл в пользовательском и системном времени. *Command* Полная командная строка процесса (то есть имя программы и аргументы). **Как ускорить или замедлить частоту обновления htop** Для установки времени обновления htop используйте опцию -d после которой укажите время обновления в десятой части секунд. *Например, чтобы программа обновляла окно каждую 1/10 секунды:*`sudo htop -d 1` ![](https://i.imgur.com/k2VU0c5.png) *Чтобы программа выводила новые данные раз в 5 секунд:*`sudo htop -d 50` ![](https://i.imgur.com/NF6bhwB.png) **Как вывести процессы в виде дерева** *Для вывода процессов в виде дерева используйте опцию -t:*`sudo htop -t` ![](https://i.imgur.com/s5hwbiN.png) ## **Часть 2.2. Установка и настройка сервера SSH в Linux** ## 1. Установка пакетов SSH Как уже говорилось система ssh в Linux-системах распространяется в виде составного метапакета, поэтому для установки всех требуемых утилит ssh нужно выполнить всего одну команду: ![](https://i.imgur.com/ZzB85HG.png) *После чего начнется процесс установки* Как видно, менеджер пакетов сам распознает все зависимые и связанные пакеты и установит их. Также, по завершению установки, автоматически будет запущен SSH-сервер в режиме демона. Это можно проверить командой: `$ systemctl status sshd` или: `$ service sshd status` даст тот же вывод. Теперь сервер работает с базовыми настройками по-умолчанию. ![](https://i.imgur.com/2KcFITu.png) ## 2. Настройка SSH Режим работы SSH-сервера с настройками по-умолчанию хоть и является вполне работоспособным для небольших частных сетей, всё же нуждается в задании некоторых важных параметров для использования на высоконадёжных публичных серверах. Настройки демона хранятся в файле `/etc/ssh/sshd_config`. Посмотреть его можно командой `cat /etc/ssh/sshd_config` ![](https://i.imgur.com/ozLCLWs.png) ![](https://i.imgur.com/hsBAB22.png) ![](https://i.imgur.com/Vz34BJT.png) В первую очередь следует обратить внимание на следующие параметры: Port, AddressFamily, ListenAddress. Первый глобально задаёт номер порта, через который будет работать соединение и если оставить его стандартным, т. е. 22, то велика вероятность, что он будет слишком часто сканироваться роботами. **Примечание:** для задания активации параметра необходимо раскомментировать соответствующую строку — убрать символ «#» в её начале. Второй параметр задаёт семейство используемых IP-адресов — IPv4 и IPv6. Если, к примеру, используются только адреса IPv4, то очень рекомендуется установить для параметра - AddressFamily значение inet: - AddressFamily inet - Для адресов семейства IPv6 используется значение inet6. **Параметр ListenAddress позволяет задавать порты для отдельных сетевых интерфейсов:** - ListenAddress 10.24.205.75:2123 - ListenAddress 10.24.205.76:2124 Поскольку реализация openSSH позволяет работать с протоколами SSH1 и SSH2, то разумно отключить использование SSH1, т. к. эта версия является устаревшей. Работа по SSH1 крайне не рекомендуется: Protocol 2 - Очень полезным является параметр, позволяющий проводить авторизацию и шифрование трафика с помощью специальных SSH-ключей: `PubkeyAuthentication yes` - Следует заметить, что в таком случае серверу необходимо явно указывать, где хранятся открытые ключи пользователей. Это может быть как один общий файл для хранения ключей всех пользователей (обычно это файл `etc/.ssh/authorized_keys`), так и отдельные для каждого пользователя ключи. Второй вариант предпочтительнее в силу удобства администрирования и повышения безопасности: `AuthorizedKeysFile etc/ssh/authorized_keys # Для общего файлаAuthorizedKeysFile %h/.ssh/authorized_keys # Файл -> пользователь` - Во втором варианте благодаря шаблону автоподстановки с маской «%h» будет использоваться домашний каталог пользователя. **Важно также отключать парольный доступ:** `PasswordAuthentication no` - Или же, в случае, если всё-таки необходимо использовать доступ по паролю, то обязательно нужно отключать авторизацию по пустому паролю: `PermitEmptyPasswords no` - Для указания разрешённых или запрещённых пользователей и групп служат директивы DenyUsers, AllowUsers, DenyGroups, и AllowGroups. Значениями для них являются списки имён, разделяемых пробелами, например: ``` DenyUsers fred john AllowGroups root clients administrators ``` - Следует также отключать root-доступ: `PermitRootLogin no` - Иногда, когда следует задавать мультисерверную конфигурацию, очень удобно использовать алиасы (Aliases), что позволяет настроить сразу несколько режимов доступа (с разными хостами, портами и т. д.) и использовать их, указывая при этом конкретный алиас: `$ ssh alias_name` Настройки для алиасов хранятся либо глобально в `/etc/ssh/ssh_config`, либо раздельно для пользователей в `~/.ssh/config`. Здесь нужно не спутать с `ssh_config!` Пример: ``` Host your_alias Port your_ssh_port HostName 0.0.0.0 # IP или имя хоста User your_user_name ``` **Для применения сделанных настроек необходим перезапуск SSH-сервера:** `$ systemctl restart sshd` **или:** `$ service sshd restart` ![](https://i.imgur.com/FMtE9CL.png) ## 3. Настройка и использование клиента SSH - Для подключения по к серверу используется команда: `$ ssh user_name@host_name` где **user_name** – имя пользователя в системе, **host_name** – имя узла, к которому производится подключение, например: ![](https://i.imgur.com/kTdI7K8.png) При этом утилита ssh запросит (в зависимости от настроек сервера) **логин, пароль** или парольную фразу для разблокировки приватного ключа пользователя. В случае авторизации по ключу, должна быть предварительно сгенерирована пара SSH-ключей — открытый, который хранится на стороне сервера, обычно в файле `.ssh/authorized_keys` в домашнем каталоге пользователя, и закрытый — используется для авторизации клиента и хранится, как правило, в каталоге `.ssh/` домашней директории пользователя. Открытый ключ представляет собой «цифровой слепок» закрытого ключа благодаря которому сервер «знает», кто «свой», а кто «чужой». ## 4. Для генерации ключей используется утилита ssh-keygen: `$ ssh-keygen` ![](https://i.imgur.com/echZ0QY.png) Утилита предложит выбрать расположение ключей (лучше всё оставить по-умолчанию), обычно это каталог `~/.ssh/,` ввести парольную фразу для закрытого ключа. После чего будут сгенерированы открытый ключ `id_rsa.pub` и закрытый `— id_rsa`. Теперь нужно скопировать открытый ключ, т. е. «слепок» закрытого на сервер. Проще всего этого можно добиться командой: `ssh-copy-id -i ~/.ssh/id_rsa.pub user_name@host_name` ![](https://i.imgur.com/e7TvklU.png) Теперь можно выполнить подключение командой ssh и запустить защищённый сеанс удалённого управления. Важно заметить, что использование сгенерированных `openSSH`-ключей несовместимо с PPK-форматом, используемым по-умолчанию в таких комплексах как PuTTY. Поэтому необходимо конвертировать имеющиеся `openSSH`-ключи в формат PPK. Удобнее всего это делать с помощью утилиты **PuTTY – puttygen.exe.** ![](https://i.imgur.com/mr0uksh.png) ![](https://i.imgur.com/jPf6WYS.png) ![](https://i.imgur.com/gKq3ldw.png) ## **Часть 2.3. "Установка и настройка SSH-authorized_keys"** Исходя из теории, сначала создается ключ, экспортируется на хост назначения, или сервер, после чего можно зайти на этот сервер без пароля, по ключу. Но с этим не все так гладко. Я пробовал сделать все указанные шаги с Linux --> Windows, но не получилось: Генерация ключа: ![](https://i.imgur.com/VegaNR8.png) Экспорт: ![](https://i.imgur.com/te2uWFs.png) Попытка подключится: ![](https://i.imgur.com/H6Cf0PY.png) ![](https://i.imgur.com/3jddMqj.png) На скриншоте видно, что SSH требует пароль, а это не подходит под условия задачи. В чем проблема - не знаю, не смог выяснить или решить. Если делать все тоже самое но на самой Linux, все впорядке: ![](https://i.imgur.com/L0aaZge.png) Конфиг был следующий: ![](https://i.imgur.com/wc0O9un.png) На windows ключ просто не записывался в файл: ![](https://i.imgur.com/BAsso3p.png) Попытка подключения, со следующим конфигом: ![](https://i.imgur.com/ft9YjiZ.png) ![](https://i.imgur.com/OjFkYAP.png) Говоря о выполнении поставленной задачи, это получилось, но с debian. Использовался тот же сгенерированный (на скриншоте ранее) ключ: ![](https://i.imgur.com/81QysBb.png) Подключалось что с паролем, что без. ## **Часть 2.4. "Сбор информации о Linux и WGET"** ### 1.Базовый сбор информации Начнём со сбора информации о дистрибутивах *cat /etc/release - информация о дистрибутиве и какая версия его* ![](https://i.imgur.com/fzM4s3b.png) **По ядру linux можно понять следующее:** **uname -a** ![](https://i.imgur.com/mCFSfcY.png) **whoami** Как следует из названия, команда whoami выводит имя пользователя для эффективного идентификатора пользователя. Другими словами, он отображает имя текущего вошедшего в систему пользователя. ![](https://i.imgur.com/2hDGC2e.png) **Команда uptime покажет, когда и сколько система работала и соответственно, если она работала без перерыва 3 года, то злоумышлинник может воспользоваться старыми уязвимостями для получения доступа или внедрения кода.** ![](https://i.imgur.com/VEX57wr.png) **Давайте посмотри права директории /home** ![](https://i.imgur.com/Zk4Wa6N.png) **Чтобы ограничить права другим пользователям делаем следующее sudo chmod o-rx /home/kali** ![](https://i.imgur.com/rspiLLF.png) *Давайте рассмотрим, почему нам надо изменять права. по умолчанию каждый из пользователей может попасть в директорию любого пользователя, т.е. пользователь kali может попасть в директорию любого пользователя.* **ip neigh - показывает с какими компьютерами происходит обмен данными** ![](https://i.imgur.com/cOvbvU8.png) **sudo ss -tlnp - показывает какие сервисы и с какими портами запущены** ![](https://i.imgur.com/GldZmiY.png) **sudo -l - позволяет нам понять, что есть в этом машинки и что пользователь может** ![](https://i.imgur.com/WGi3mGE.png) ### 2.Суидные файлы **Suid** *setuid и setgid являются флагами прав доступа в Unix, которые разрешают пользователям запускать исполняемые файлы с правами владельца или группы исполняемого файла. В Unix-подобных системах приложение запускается с правами пользователя, вызвавшего указанное приложение. Это обеспечивает дополнительную безопасность, так как процесс с правами пользователя не сможет получить доступ на запись к важным системным файлам, например /etc/passwd, который принадлежит суперпользователю root.* В системе могут быть различные закладки `sudo find / -user root -perm -4000 -exec ls -ldb {} \\; 2> /dev/null` ![](https://i.imgur.com/dp7zibg.png) **Базовый сбор информации может происходить не только вручную ![](https://i.imgur.com/ar39rVx.png) **далее необходимо разаархивировать вводим следующее:** tar xfv lynis-3.0.3.tar.gz ![](https://i.imgur.com/sv4o7yS.png) *где* **Основные опции:** - c, --create — создать архив; - a, --auto-compress — дополнительно сжать архив с компрессором который автоматически определить по расширению архива. Если имя архива заканчивается на *.tar.gz то с помощью GZip, если *.tar.xz то с помощью XZ, *.tar.zst для Zstandard и.т.п; - r, --append — добавить файлы в конец существующего архива; - x, --extract, --get — извлечь файлы из архива; - f, --file — указать имя архива; - t, --list — отобразить список файлов и папок в архиве; - v, --verbose — выводить список обработанных файлов. затем давайте проверим контрольную сумму с сайта и то, что мы скачали ![](https://i.imgur.com/1ySSJbK.png) Контрольные суммы различны из-за разных версий утилиты. **далее переходим в директорию lynis** ![](https://i.imgur.com/98uNjkU.png) **далее запускаем утилиту lynis** ![](https://i.imgur.com/hXMsFCg.png) ![](https://i.imgur.com/p4FKC79.png) ![](https://i.imgur.com/rAvzqtg.png) **ещё можно набрать команду** `./lynis show options` ![](https://i.imgur.com/UKpf0vM.png) **Перенаправлять файлы лучше через стандартный report утилиты:** ### 3. Проверка целостностей пакетов **Как проверить целостность системы, что никто не поменял, есть способа проверить** dpkg — это программное обеспечение, являющееся основой системы управления пакетами в Debian и ряде других операционных систем, основанных на Debian, например Ubuntu. dpkg используется для установки, удаления, и получения информации о .deb пакетах. **dpkg** является довольно низкоуровневой утилитой. Существуют более высокоуровневые утилиты, например APT, которые могут загружать пакеты из сетевого репозитория и отслеживать зависимости между пакетами. Конечным пользователям следует использовать утилиты с более дружественным интерфейсом, такие как Aptitude или Synaptic, предоставляющие лёгкий способ просмотра списка пакетов, их описания и зависимостей. **debsums** служит, в первую очередь, для нахождения изменённых администратором файлов установленных в системе пакетов или повреждённых файлов из-за некачественного носителя и в какой-то мере используется в качестве инструмента обеспечения безопасности. [https://parallel.uran.ru/book/export/html/472](https://parallel.uran.ru/book/export/html/472) для просмотра пакетов в системе ``` dpkg -l ``` ![](https://i.imgur.com/MvHofmH.png) для просмотра установленных утилит необходимо набрать следующую команду ``` dpkg -L coreutils ``` - она покажет все штатные утилиты ![](https://i.imgur.com/91JUtV4.png) например рассмотрим утилиту /bin/dir /bin/dir --help которая позволяет нам работать по сути как ls ![](https://i.imgur.com/zwI0smg.png) что будет если мы поменяем /bin/false на /bin/dir тем самым с имитируем подмену или правку кода программы сделаем backup sudo mv /bin/dir /bin/dir.bak ![](https://i.imgur.com/cmKTtvf.png) вводим команду sudo cp /bin/false /bin/dir ![](https://i.imgur.com/jeZRG00.png) теперь при запуске dir мы можем уыидеть, что ничего не будет происходить, кроме как если посмотреть логическую ложь, то будет ошибка ``` echo $? ``` ![](https://i.imgur.com/rBEVQx3.png) соответственно, чтобы нам быстро проверить этот пакет мы можем выполнить команду ``` debsums ``` и если она не установленна, то необходимо её установить через команду ``` sudo apt install debsums ``` ![](https://i.imgur.com/B5SEtzO.png) **debsums** служит, в первую очередь, для нахождения изменённых администратором файлов установленных в системе пакетов или повреждённых файлов из-за некачественного носителя и в какой-то мере используется в качестве инструмента обеспечения безопасности. - debsums -a - Проверяет все файлы (включая конфигурационные, которые обычно располагаются слева) ![](https://i.imgur.com/gUqZY9m.png) - debsums -e - Проверяет только конфигурационные файлы пакетов ![](https://i.imgur.com/buubCL3.png) - debsums -с - Выводит список измененных на stdout файлов ![](https://i.imgur.com/ErV5xHN.png) - debsums -I - Отображает файлы, в которых отсутствует информация о md5sum ![](https://i.imgur.com/hplZZMS.png) ![](https://i.imgur.com/oIhCc1S.png) - debsums -s - Выводит только ошибки; при их отсутствии не производит никаких действий ![](https://i.imgur.com/dgU1BCq.png) debsums <название программного пакета> - Отображает пакеты, которые необходимо проверить с помощью debsums - `debsums -ac coreutils` - запуск проверки - `debsums -cs coreutils` - запуск проверки ![](https://i.imgur.com/rTp1G0o.png) можно также проверить утилитой ``` dpkg --verify coreutils ``` ![](https://i.imgur.com/rtW9R4q.png) но он будет более загадачным Если кто-то смог проникнуть в систему и что-то деал в ней нам поможет команда find Например, если нам надо рассмотреть какой либо инцидент: `sudo find / -printf "%T@;%Tc;%p\\n"` можно указать через пробел, но тогда будет сложно работать с выводом данных: `sudo find / -printf "%T@ %Tc %p\\n"` ``` -prinf - то где мы будем искать %T@ - время ввиде числа %Tc - время человека читаемое %p\\n - путь до файла ``` ![](https://i.imgur.com/se6jTFx.png) Далее если надо сделать по одному конкретному пользователю необходиму следующие: `sudo find /home/kali/ -printf "%T@;%Tc;%p\\n" > timeline.csv` ![](https://i.imgur.com/Dd7jouQ.png) Затем желательно это отсортировать, например: `head timeline.csv` сейчас никак не отсортированно ![](https://i.imgur.com/quwt8ps.png) Но давайте отсортируем данный файл с помощью команды: `sort -rn timeline.csv | less` где флаг `-r` как раз будет указывать, что последнее изменение будет первым ![](https://i.imgur.com/13hf2sv.png) Мы можем видеть, что менялось и в какое время, что позволит увидеть все изменения. ## **Часть 2.5. "Переменные окружения в Linux .bashrc, .bash_profile и .bash_login".** **Переменные окружения в Linux** - это специальные переменные, определенные оболочкой и используемые программами во время выполнения. Переменными окружения в операционных системах на базе ядра Linux называются те переменные, которые содержат текстовую информацию, используемую другими программами во время запуска. Обычно они включают общие системные параметры как графической, так и командной оболочки, данные о настройках пользователя, расположении определенных файлов и многое другое. Значения таких переменных указываются, например, цифрами, символами, путями к директориям или файлам. Благодаря этому множество приложений быстро получают доступ к определенным настройкам, а также появляется возможность для пользователя изменять или создавать новые опции. **Cамые важные параметры** - бы рассказать о разделении их на классы. Такое группирование определяется следующим образом: - Системные переменные. Эти опции загружаются сразу же при старте операционной системы, хранятся в определенных конфигурационных файлах (речь о них будет идти ниже), а также доступны для всех пользователей и всей ОС в целом. Обычно такие параметры считаются самыми главными и часто используемыми во время старта самых различных приложений. - Пользовательские переменные. Каждый пользователь имеет свою домашнюю директорию, где хранятся все важные объекты, к их числу относятся и конфигурационные файлы пользовательских переменных. Из их названия уже понятно, что применяются они под конкретного юзера в то время, когда он авторизован через локальный «Терминал». Действуют они и при удаленном соединении. - Локальные переменные. Существуют параметры, применяемые только в рамках одной сессии. При ее завершении они будут навсегда удалены и для повторного старта все придется создавать вручную. Они не сохраняются в отдельных файлах, а создаются, редактируются и удаляются при помощи соответствующих консольных команд. **Конфигурационные файлы для пользовательских и системных переменных** Два из трех классов переменных Linux хранятся в отдельных файлах, где собраны общие конфигурации и дополнительные параметры. Каждый такой объект загружается только при подходящих условиях и используется для разных целей. Отдельно бы хотелось выделить такие элементы: - /ETC/PROFILE — один из системных файлов. Доступен для всех пользователей и всей системы даже при удаленном входе. Единственное ограничение для него — параметры не принимаются при открытии стандартного «Терминала», то есть в этом расположении никакие значения из этой конфигурации работать не будут. - /ETC/ENVIRONMENT — более широкий аналог предыдущей конфигурации. Он функционирует на системном уровне, имеет те же опции, что и предыдущий файл, но теперь без каких-либо ограничений даже при удаленном подключении. - /ETC/BASH.BASHRC — файл только для локального использования, при удаленной сессии или соединении через интернет функционировать он не будет. Выполняется для каждого юзера отдельно при создании новой терминальной сессии. - .BASHRC— относится к конкретному юзеру, хранится в его домашней директории и выполняется каждый раз при новом запуске терминала. - .BASH_PROFILE — то же, что .BASHRC, только для удаленного взаимодействия, например, при использовании SSH. ### 1. Просмотр списка системных переменных окружения Вы можете без проблем самостоятельно просмотреть все присутствующие в Linux системные и пользовательские переменные и их понятия с помощью всего лишь одной команды, которая отобразит список. Для этого потребуется выполнить всего несколько простых действий через стандартную консоль. Пропишем команду sudo `apt-get install coreutils`, чтобы проверить наличие данной утилиты у вас в системе и сразу же установить ее при надобности. *Процесс укажет какие добавлены новые файлы или их наличии в библиотеках.* ![](https://i.imgur.com/HyC11ff.png) Теперь воспользуемся командой ``` Coreutils ``` , чтобы раскрыть список всех переменных окружения. ![](https://i.imgur.com/pG8nUap.png) *Выражение до знака = — название переменной, а после — ее значение.* ### 1.1 Список основных системных и пользовательских переменных окружения. **Обратить внимание хотелось бы на такие пункты:** - DE. Полное название — Desktop Environment. Содержит имя текущего окружения рабочего стола. В операционных системах на ядре Linux используются различные графические оболочки, поэтому приложениям важно понимать, какая сейчас активна. В этом и помогает переменная DE. Пример ее значений — gnome, mint, kde и так далее. - PATH — определяет список директорий, в которых происходит поиск различных исполняемых файлов. Например, при действии одной из команд по поиску и доступу к объектам они обращаются к этим папкам для быстрого поиска и передачи исполняемых файлов с указанными аргументами. - SHELL — хранит в себе опцию активной командной оболочки. Такие оболочки позволяют пользователю самостоятельно прописывать определенные скрипты и запускать различные процессы с помощью синтаксисов. Самой популярной оболочкой считается bash. Список остальных распространенных команд для ознакомления вы найдете в другой нашей статье по следующей ссылке. - HOME — здесь все достаточно просто. Данный параметр указывает путь к домашней папке активного юзера. У каждого юзера он разный и имеет вид: /home/user. Объяснение этому значению тоже легкое — эта переменная, например, используется программами для установления стандартного места расположения их файлов. Конечно, примеров существует еще огромное количество, но для ознакомления этого достаточно. - BROWSER — содержит в себе команду для открытия веб-обозревателя. Именно эта переменная чаще всего и определяет браузер по умолчанию, а все остальные утилиты и ПО обращаются к указанной информации для открытия новых вкладок. - PWD и OLDPWD. Все действия из консоли или графической оболочки происходят из определенного расположения в системе. Первый параметр отвечает за текущее нахождение, а второй показывает предыдущее. Соответственно, их значения меняются достаточно часто и хранятся как в пользовательских конфигурациях, так и в системных. - TERM. Программ-терминалов для Linux существует большое количество. Упомянутая переменная хранит в себе информацию о названии активной консоли. - RANDOM — содержит в себе скрипт, генерирующий каждый раз случайное число от 0 до 32767 при обращении к этой переменной. Такая опция позволяет другому софту обходиться без собственного генератора случайных чисел. - EDITOR — отвечает за открытие редактора текстовых файлов. Например, по умолчанию вы можете встретить там путь /usr/bin/nano, но ничего вам не мешает изменить его на любой другой. За более сложные действия с тестом отвечает VISUAL и запускает, например, редактор vi. - HOSTNAME — имя компьютера, а USER — имя текущей учетной записи. ### 2. Запуск команд с указанием нового значения переменной окружения Можно самостоятельно на время изменить опцию любого параметра, чтобы запустить с ним определенную программу или выполнить любые другие действия. В таком случае в консоли вам будет достаточно прописать `env VAR=VALUE`, где `VAR` — название переменной, а `VALUE` — ее значение, например, путь к папке `/home/kali`. ![](https://i.imgur.com/LgOaLeX.png) *При следующем просмотре всех параметров через упомянутую выше команду `printenv` вы увидите, что указанное вами значение было изменено. Однако оно станет таким, как было по умолчанию, сразу же после следующего обращения к ней, а также функционирует только в пределах активного терминала.* ### 2.1 Установка и удаление локальных переменных окружения Из проделанного выше вы уже знаете о том, что локальные параметры не сохраняются в файлах и активны только в рамках текущей сессии, а после ее завершения удаляются. Если вас интересует собственное создание и удаление таких опций, сделать нужно следующее: Запустите «Терминал» и напишите команду `VAR=VALUE`, после чего нажмите на клавишу `Enter`. Как обычно, VAR — любое удобное название переменной одним словом, а `VALUE` — значение. ![](https://i.imgur.com/hFVqwnF.png) Проверьте действенность произведенных действий, введя `echo $TESTKALI`. Строчкой ниже вы должны получить опцию переменной. ![](https://i.imgur.com/mIsXln7.png) Удаляется любой параметр командой `unset TESTKALI`. ![](https://i.imgur.com/Rw8eyzd.png) Проверить удаление можно также через ``` echo $TESTKALI ``` Таким нехитрым образом добавляются любые локальные параметры в неограниченном количестве. ### 2.2 Добавление и удаление пользовательских переменных Рассмотрим классы переменных, которые хранятся в конфигурационных файлах, а из этого выплывает то, что придется редактировать сами файлы. Делается это с помощью любого стандартного текстового редактора. ![](https://i.imgur.com/zRPTf8i.png) *Пользовательскую конфигурацию можно редактировать через* `sudo nano .bashrc.` ![](https://i.imgur.com/GM0wslI.png) *Обновление конфигурации произойдет после повторного старта файла, а делается это через* `source .bashrc.` ![](https://i.imgur.com/E5ffgN6.png) *Проверить активность переменной можно через ту же опцию* `echo $TESTKALI`. ![](https://i.imgur.com/lyI8DW5.png) **Что касается удаления параметров, то происходит оно тоже через конфигурационный файл. Достаточно полностью удалить строку или закомментировать ее, добавив в начале знак #.** ### 2.3 Создание и удаление системных переменных окружения **Осталось только затронуть третий класс переменных — системные.** Редактироваться для этого будет файл /ETC/PROFILE, который остается активным даже при удаленном подключении, например, через известный многим менеджер SSH. Открытие конфигурационного элемента осуществляется примерно так же, как и в предыдущем варианте: введите `nano /etc/profile` Внесём `TESTKALI2=/home/kali12345` Сохраняем и выходим. ![](https://i.imgur.com/NFAjOtp.png) Пишем команду `source /etc/profile` - чтобы изменения вступили в силу. Проверяем: `echo $TESTKALI2=/home/kali12345` ![](https://i.imgur.com/8kfQf0i.png) **Изменения в файле сохранятся даже после перезагрузки сессии, а каждый юзер и приложение смогут без каких-либо проблем получать доступ к новым данным.**