Что такое Linux? Статья-шпаргалка для новичков

Что такое Linux?

Салют! Это статья — попытка систематизировать некие базовые знания об Linux«ах, которая может быть полезна для продвинутых пользователей, разработчиков и админов Windows, которые еще не имели (или имели крайне небольшой и отрывочный) опыт работы с Linux системами и не знают, с чего начать, однако хотят попробовать — сами, или по причине производственной необходимости. Каждый пункт содержит не исчёрпывающие сведения, а лишь отправные пункты для дальнейшего изучения (гуглежа) материала.

Содержание:


  1. Linux Kernel aka Ядро
  2. GNU Core Utilities (coreutils)
  3. Bash — интерпретатор командной строки
  4. Package managers — пакетные менеджеры
  5. Init systems — системы инициализации
  6. systemd
  7. Ваш первый вход на сервер
  8. Управляем пользователями
  9. Сети
  10. FHS — Filesystem Hierarchy Standard — навигация в файловых системах Linux
  11. Window system / display server — сервер экранов
  12. Полезные ссылки и список литературы для изучения

Если интересно — прыгайте под кат


А что такое Linux?

Под именем Linux сегодня люди понимают одну из двух вещей:
1) Операционные Системы на базе GNU/Linux ядра, или, как их по-другому называют, дистрибутивы. Наиболее популярные RedHat/CentOS, Debian, Ubuntu и другие. Маленькая часть из них была представлена на КДПВ :)
2) Ядро GNU/Linux и, опционально, набор программ GNU coreutils.

Несколько слов об ядре

Давайте я расскажу вам чуть больше о GNU\Linux ядре.
Первое, вы должны знать, что все ядра ОС бывают трех типов

  • микроядро
  • монолит (Linux)
  • гибрид (OS X, Windows 7)

Основная разница между монолитным и микроядром в том, что микроядра включают только:

  • IPC (систему межпроцессного взаимодействия), управление памятью, планировщик и диспетчер


В то время как монолитные ядра также включают в себя:

  • Файловую систему (системы), драйвера, VFS (в случае с Linux kernel)

Ядро Линукса занимается:

  • Управлением процессами
  • Управлением памятью
  • Взаимодействием с устройствами (через драйвера)
  • Системными вызовами и безопасностью

Все программы, запускаемые пользователем, работают в так называемом пользовательском пространстве (user space). Эти программы взаимодействуют с ядром через интерфейс системных вызовов (system call interface, SCI). Также, Ядро ограничивает доступ к ЦПУ, памяти для пользовательских программ, в то время как код из ядра имеет неограниченным доступ к ресурсам компьютера. Все пользовательские программы взаимодействуют с друг другом при помощи межпроцессной коммуникации (interprocess communication, IPC)

Так же, несмотря на то, что большинство считает Ядро монолитным, оно использует модули. Модули могут быть встроенными или подгружаемыми. Последние могут быть включены или выключены во время работы ОС. Больше про модули можно прочесть на АрчВики

C помощью вышеуказанных механизмов, Ядро может быть использовано для продвинутых настроек [безопасности](https://www.redhat.com/en/topics/security), [создание контейнеров](https://www.redhat.com/en/topics/containers), и [виртуальных машин](https://www.redhat.com/en/topics/virtualization/what-is-a-virtual-machine).

GNU Core Utilities (coreutils)


GNU Core Utilities (coreutils) — набор программ, системных утилит, которые есть почти на всех GNU\Linux сборках. Они включают в себя:

довольно много утилит
 — chmod — изменяет разрешения на файлах
— chown — изменяет владельца файла и его группу
— chroot — изменяет корневую (root) директорию
— cp — копирует файлы и директории
— dd — копирует, конвертирует файлы
— df — показывает свободное место на файловой системе
— du — показывает занятое место на файловой системе
— ln — создаёт ссылки
— ls — показывает содержимое директории
— mkdir — создает директорию
— mv — перемещает (переименовывает) файлы
— rm — удаляет файлы
— rmdir — удаляет пустые директории
— touch — изменяет таймметку на или создает пустой файл
— basename — удаляет путь до файла и его расширение
— cat — выводит содержимое файла в терминал (стандартный вывод)
— comm — сравнивает построчно два файла
— cut — выводит только определенные части строк из файла в терминал
— dirname — оставляет только путь, удаляя имя файла из его полного пути.
— echo — выводит в терминал строку текста.
— expand, unexpand — конвертирует табы в пробелы и обратно
— false — возвращает ошибочный статус выхода из приложения.
— fmt — форматтер текста
— fold — разбивает строчку на сегменты фиксированной ширины
— head — выводит первую строку файла
— join — соединяет две строки из разных файлов по общему полю
— md5sum — считает MD5 хэш
— paste — соединяет строки файлов
— pr — конвертирует файлы для печати
— seq — выводит числовые последовательности
— sleep — приостаналивает выполнение на указанное время
— sort — сортирует строки текстовых файлов
— split — разделяет файл на части
— tail — выводит последнюю часть файла
— tee — отправляет вывод в разные файлы.
— test — проверяет типы файлов и сравнивает значения
— tr — переводит или удаляет символы
— true — возвращает успешный статус выхода.
— uniq — удаляет повторяющиеся строки в отсортированном файле
— wc — выводит количество байт, слов и строк в файле
— yes — выводит одну и ту же строчку

— date — выводит или устанавливает текущую дату и время.
— env — выводит или изменяет текущие параметры окружения (environment).
— groups — выводит группы, в которых пользователей состоит.
— hostname — выводит или устанавливает имя компьютера.
— id — выводит uid/gid пользователя.
— nice — изменяет приоритет планировщика.
— pwd — — выводит текущую директорию (полный путь).
— su — позволяет вам получить id другого пользователя (переключиться в него). Чуть больше особенностей su в Debian
— uname — выводит системную информацию.
— who — выводит список всех пользователей, которые сейчас залогинены в системе in.
— whoami — выводит текущий id пользователя.

Также туда входят следующие утилиты
chgrp, cksum, csplit, dir, dircolors, expr, factor, hostid, install, link, logname, mkfifo, mknod, nl, nohup, od, pathchk, pinky, printenv, printf, ptx, shred, stty, sum, sync, tac, [tsort](https://manpages.debian.org/man/tsort.1 «DebianMan»), [tty](https://manpages.debian.org/man/tty.1 «DebianMan»), [unlink](https://manpages.debian.org/man/unlink.1 «DebianMan»), [users](https://manpages.debian.org/man/users «DebianMan»), [vdir](https://manpages.debian.org/man/vdir.1 «DebianMan»)

Мои коллеги очень просили добавить меня следующее: вы всегда можете получить справку, напечатав «man name_of_the_tool`. Альтернативный вариант, чтобы получить справку, который является более-менее стандартным для всех CLI (command line interface) утилит, это «name_of_the_tool --help`.

Теперь, когда мы уже чуть-чуть знаем об ядре, системных утилитах, нам нужно познакомиться еще с несколькими моментами, и мы сможем начать работать с нашей машиной под управлением GNU\Linux, и начать, пожалуй, стоит со среды, в которой выполняются все вышеуказанные программы — в командной строке Bash.

Bash — интерпретатор командной строки

Теперь я хочу вам рассказать о командной строке в Linux. Командная строка — это интерфейс для ввода команд, а Bash — оболочка (shell) и интерпретатор комманд. Большинство людей знакомы с command.exe в DOS, Windows или более новым и продвинутым PowerShell, то вот сюрприз о Linux’e: их здесь много. Целое семейство разных интерпретаторов. Некоторые из них проще, другие сложнее, какие-то имеют маленький размер, и так далее. Факт в том, что если вы будете работать с Linux серверами, вы будете работать с одним из них.

Bash является оболочкой по умолчанию в Linux дистрибутивах на протяжении многих лет, и используется в RHEL/CentOS, Oracle Linux и так далее. Но у него есть популярные альтернативы: Dash (Debian, Ubuntu), zsh, и другие. Они все в целом похожи друг на друга, потому что поддерживают стандарт POSIX, но имеют небольшие отличия в деталях.

Bash — Bourne Again Shell, имя которого является игрой слов на тему Bourne — born (рожденный). Борн — фамилия автора оригинальной командной строки Bourne shell (1979) или просто shell для Version 7 Unix. Первая версия Bash была написана Брайаном Фоксом, и вышла в свет в 1989, как одна из попыток заменить проприетарный Bourne Shell открытым продуктом. В свою очередь, Bash, сохраняя совместимость с оригинальным интерпретатором, принёс много новых фич, а также взял некоторые идеи из других проектов. Так, команда `history` была «позаимствована» из проектов csh и ksh.

Пакетные менеджеры


В то время как в Windows, вы обычно идёте на какой-то сайт, скачиваете exe файл программы или инсталлятора, копируете или устанавливаете его, в Linux системах, обычно это делается по-другому. Хотя да, вы всё ещё можете скачать файл и установить его, но это считается наименее популярным методом установки.

Наиболее популярный — через установку с помощью пакетного менеджера.
Пакетные менеджеры делают следующее:
1) Устанавливают пакеты (программы), включая их зависимости
2) Обновляет их
3) Деинсталлирует их
Почему я отдельно указал на установку зависимостей? Дело в том, что пока Windows программы обычно хранят их зависимости в той же папке, что и программа (\*.dll файлы, к примеру), в Linux системах зависимости устанавливаются в общую для всех программ директорию с целью последующего переиспользования данных зависимостей и библиотек. Обычно, \*.so — расширение файлов библиотек в Linux.
Конечно, с появлением платформы .Net Framework, проблема значительно облегчилась и тем самым сократилось количество необходимых зависимостей, но, тем не менее, это то, как это работает в Windows.
Linux путь предполагает написание маленьких вещей, которые делают хорошо одну задачу. В том числе поэтому здесь большое количество зависимостей и есть проблема с тем, чтобы содержать их в порядке.

Существуют две наиболее популярные системы управления пакетами для GNU\Linux.
Первая называется Yum (или DNF).
Используется в следующих дистрах:
— RedHat Enterprise Linux/CentOS
— Fedora
— Oracle Enterprise Linux
— SUSE/OpenSUSE

Вторая — Apt. Наиболее популярные дистрибутивы с ней:
— Debian
— Ubuntu
— Linux Mint

Slackware, Arch используют свои собственные пакетные менеджеры: slackpkg и pacman.

Каждая Linux система, которая идет с предустановленным пакетным менеджером, содержит преднастроенные Интернет-репозитории (или, как иначе говорят, репы — такой вот жаргонизм). Так же, системный администратор может легко добавить свои собственные репозитории.

Наконец, если вы оказались в изолированной от Интернета сети, то вы можете установить пакеты из инсталляционных файлов.
`rpm -i filename.rpm`
Это установит пакет в RHEL/CentOS, Fedora, Oracle Linux, SUSE/OpenSUSE
`dpkg -i filename.deb`
Это установит пакет в Debian, Ubuntu, Linux Mint

Еще одна возможность для пользователей ПК. В последнее время, часть разработчиков софта для конечных пользователей решила использовать дистрибутива-независимые пакетные менеджеры. Для этого, все зависимости упаковываются в один файл. Наиболее популярные варианты: Snap, Flatpak, AppImage. Первые два предлагают возможность обновление установленного через них ПО с помощью загрузки обновлений из их репозиториев, AppImage не имеет такой возможности. Snap идёт предустановленным в Ubuntu, начиная с 16.04 LTS.

Система инициалиазации


Другая подсистема, которая не является частью Ядра, но является второй по значимости после него — это init система, которая используется для инициализации пользовательского пространства (user space) и управлением пользовательских процессов.
Здесь есть несколько альтернатив, давайте обозначим наиболее популярные из них:
— SysVinit (sysvinit, sysv, или просто 'init') — прямой потомок (порт) системы инициализации из ОС UNIX' System V. Был наиболее популярной системой инициализации на протяжении 20+ лет (1991–2011).
— Upstart — первая хорошая попытка заменить SysVinit, которая исправляла его недостатки, но позже популярность этого решения сошла на нет. Первоначально разработана Canonical в 2006. Сегодня единственная ОС (хоть и не GNU\Linux), которая его использует, это Chrome OS.
— OpenRC — легковесный, простой аналог sysvinit. Используется в Gentoo Linux, Alpine Linux, и некоторых других легких дистрибутивах.
— systemd — сегодняшнее решение в большинстве Linux дистрибах.

Особняком стоит Slackware, популярный дистрибутив, который использует собственное BSD-подобное решение в качестве инит системы.

В Линуксе, все процессы имеют номер (Process ID, PID). Ядро использует процесс 0, любая система инициализации — PID 1, и она же является родителем для любых пользовательских процессов. Кстати, полезная штука — в Linux отображаются не только PID собственно процесса, но и его родителя.

Так случается, что в процессе завершения процессов, иногда остаются процессы, у которых не осталось родителя — такие процессы называются осиротевшими (orphaned processes) и указывают на наличие проблем на данной системе. Другой момент, с которым тоже, возможно, придется столкнуться — это процессы, которые отображаются с состоянием «Terminated» (завершены). Такие процессы, в свою очередь, называются зомби -процессами (zombie-processes).

systemd

Скорее всего, вы будете работать с этой системой инициализации. Самое главное, пожалуй, с чего стоит начать знакомство, это с утилит systemctl и journalctl. У первой довольной простой синтаксис
`systemctl ». К примеру, `systemctl status networking` покажет текущее состояние демона (службы) сетевых интерфейсов. «systemctl restart mysql» перезагрузит демона сервера MySQL. stop/start сделают остановку или запуск указанного демона.
Для отладки придётся часто заглядывать в журнал и искать там ошибки,
`journalctl -xe».
С помощью systemd можно сделать из обычной программы программу-сервис.
Больше о systemd можно прочесть здесь: https://en.wikipedia.org/wiki/Systemd

Ваш первый вход на Linux сервер

Конечно, вы можете подключиться к серверу с помощью клавиатуры, мышки и монитора. Но обычно большинство людей подключаются к серверам удаленно. Для этих целей служит сервис (демон) sshd (ssh daemon, или ssh server). Он слушает 22 TCP порт. Позволяет подключаться как с логином-паролем, так и с помощью ключей. Настройки входа зависят от конкретной инсталляции.
Для Windows есть клиент Putty — маленький, простой, бесплатный клиент для входа на удаленные Linux сервера. Должен отметить, что Putty не мог входить по обычной паре ключей и нуждался в ключе в формате ppk — здесь инструкция, как сконвертировать ключ в нужный формат.
Если вы хотите настроить вход по ключу, вам надо сгенерировать пару ключей (приватный и публичный), вписать содержимое публичного ключа на удаленном сервере в файл authorized_keys, который расположен в папке `~/.ssh`. ~ — обозначает домашнюю директорию пользователя, '.' — что файл или папка — скрытые. Если папка не существует, её нужно создать командой `mkdir .ssh`, перейти в неё командой `cd .ssh`, далее создать файл `vi authorized_keys`. Важный момент — чтобы выйти из текстового редактора vi, нажмите `esc`, потом впечатайте `: wq` (выйти с записью). После этого нужно установить корректные разрешения на этот файл с помощью команды `chmod 0600 authorized_keys`. Где 0600 обозначает, что пользователю-владельцу разрешено читать (4) и изменять (2) —, а потому, в сумме, 6 — этот файл, пользователям из его группы (0) и другим пользователям (0) не разрешено ничего с этим файлом.
Кроме того, система разрешений еще может указывать на исполняемость файла (1). Так, к примеру, пользователь может разрешить другим пользователям запускать какой-то файл, и тогда права будут 0755 — себе полные права (4+2+1), остальные пользователи могут считать (4) и запустить (1) исполняемый файл.
Часто разрешения представлены в текстовой форме. Так, rwx значит 7, rw- значит 6, r-x значит 5, and so on. К примеру, r--r--r-- значит 444 — файл только для чтения для всех пользователей, включая владельца.

Управление пользователями

В большинстве случаев новый сервер будет выдан с рутовой учетной записью (пользователем root), которая является суперпользователем («админом» в терминах Линукс систем). Однако, очень рекомендуется не использовать root пользователя в ежедневной работе. Для этого, вам нужно научиться управлять пользователями. Это довольно просто и логично
`useradd` — создает нового пользователя, ключ -d позволяет указать домашнюю директорию
`usermod` — изменяет пользователя
`userdel -r` — удаляет пользователя и его домашнюю папку
passwd $username — меняет пароль пользователя
Есть команда `chage (-l)`, которая позволяет установить (посмотреть) срок истечения пароля, а также есть опция для блокировки пользователя целиком или только для входа в систему (поведение и точная команда зависит от дистра)

Сети

Раньше, наиболее популярным пакетом с сетевыми утилитами был net-tools. Он предоставлял такие утилиты как ifconfig (просмотр сетевых интерфейсов), netstat (просмотр сетевых соединений), и другие полезные утилиты.

Но всё течет, всё меняется, и теперь пакет net-tools не установлен по умолчанию, будучи замененным на более современный пакет iproute2.

Так, «ifconfig» был заменен на «ip addr», «ip link», «ip -s»;
«arp» заменен на «ip n»,
«iptunnel» на «ip tunnel», «iwconfig» на «iw», «nameif» на «ip link.
«netstat» заменен на «ss»,
«netstat -r» на «ip route»,
«netstat -i» на «ip -s link»,
«netstat -g» на «ip maddr».

Настройка и конфигурирование сетевых адаптеров имеет несколько «базовых» вариантов, поэтому лучше искать как это делается конкретно в вашем дистрибутиве (не забывая указывать его версию). Так, к примеру, в RedHat настройки интерфейсов живут по адресу /etc/sysconfig/network-scripts/. В относительно старых Ubuntu — /network/interfaces, а в новых всё делается через утилиту netplan.

Также стоит отметить про встроенный «файерволл» — в старых системах использовался iptables, который задавал правила для компонента ядра Netfilter; сейчас рекомендуется использовать ufw, как обладающий более человекопонятным интерфейсом.

FHS — стандарт иерархии файловой системы (Filesystem Hierarchy Standard)


Я когда-то любил простоту Windows. A:\ для флоппика (да, я достаточно старый), C:\ для системы, и зачастую, единственный диск вообще (если нет, то D:\ для дистрибутивов игр, фото и видео), и, наконец, E:\ для CD-ROM. Всё просто!
А теперь я покажу минимальный минимум, который вам встретится в большинстве дистрбов, лол:
/
/boot — файлы загрузчика
/dev — файлы устройств
/root — домашняя папка для пользователя root (опционально). Может быть слинковано с /home/root
/etc — хранит конфигурацию машины
/home — корневая директория для «хомяков» пользователей
/lib — хранит важные общие библиотеки и модули ядра
/media — точка монтирования к извлекаемым накопителям
/mnt — mount point for a temporary mounted filesystems
/usr — user installed
/opt — for software installation
/var — usually this part contains files subject to modification. Logs, for example:)
/sbin — system binaries
/bin — essential user command binaries (for use by all users_
/srv — directory for storing data of the services (such as web servers and so on)
/tmp — temp directory, data stored there is subject for deleting between sessions of the services / boots of the server.

Большинство файлов могут быть поделены на четыре группы по двум признакам:
«Расшариваемые»-«Не расшариваемые» («shareable»-«unshareable»)
«Расшариваемые' файлы хранятся на одной машине и могут быть доступны с других. «Нерасшариваемые» — файлы, которые не предназначены для организации общего доступа

«Статичные» — «Изменяемые («static»-«variable»)
«Статичные» файлы включают в себя библиотеки, бинарники, документацию и тп, которые меняются только при участии системного администратора
«Изменяемые» файлы это файлы, которые не статичны и могут быть изменены во время работы системы, пользователей или программ. К примеру, при организации резервного копирования, такие файлы нуждаются в более частом расписании бэкапова.

Понимание этого концепта облегчит понимание стандарта иерархии и организации файловой системы.

Кроме того, есть смысл сказать об inodes — файловых дескрипторов. Они содержат метаинформацию о создаваемых файлах, и, в некоторых инсталляциях, могут тупо закончиться, если вы пишете на диск много маленьких файлов (например, лог чата). При этом места свободного может быть много, но создать новые файлы вы не сможете. Проверить текущее состояние можно командой `df -hTi`.

Что хочется написать дополнительно — что если в Windows ФС по умолчанию — NTFS, то в Linux их гораздо больше, среди популярных стоит отметить — ext3, ext4, xfs, btrfs. Каждая используется в тех или иных дистрах, имеет свои преимущества и недостатки.

Window server/Display system

Хорошо, теперь, когда вы начитаны о командной строке, вы думаете — ага, именно поэтому Linux не популярен среди обычных пользователей! К счастью, не по этой причине. Linux имеет два популярных сервера дисплеев на текущий момент: X11 server (легаси, но все еще самая популярная опция) и Wayland. Последний находится в экспериментальном статусе уже около десяти лет. Поверх дисплей сервера устанавливаются десктопные окружения (Desktop Environments, DE), которых ну очень много. Самые популярные: Gnome, KDE, Unity, и другие. Если установлен дисплей сервер и десктопное окружение, то система выглядит почти как обычный ПК. С окошками, рабочим столом, панелью и прочим.

Полезные ссылки

https://distrowatch.com/images/other/distro-family-tree.png — «дерево» дистрибутивов (чтобы оценить, насколько далеко зашла страсть к созданию новых дистрибутивов)
https://wiki.archlinux.org/ — Вики дистрибутива Арч
https://wiki.gentoo.org/wiki/Main_Page — Вики дистрибутива Генту
https://codernet.ru/books/linux/Evi_Nemet_i_dr_Unix_i_Linux_Rukovodstvo_sistemnogo_administratora/ — Unix и Linux руководство системного администратора от Эви Немет
https://codernet.ru/books/linux/komandnaya_stroka_linux_polnoe_rukovodstvo/ — Командная строка Linux. Полное руководство. Уильям Шоттс

На эти книги (курсы) я ссылок не дам, но ищущий да найдет:
RH124: Red Hat System Administration I
RH134: Red Hat System Administration II
RH254: Red Hat System Administration III
RH342: Troubleshooting and Diagnostic
RH442: Performance Tuning
Причем, материалы курсов доступны и на русском языке.

https://www.linuxfromscratch.org/ — Собираем свой дистрибутив с нуля. Как водится, у него тоже есть форки, но это отличное пособие для того, чтобы понять, что делают мейнтейнеры дистрибутивов и разобраться в этой «кухне».

P.S.: я не настоящий Linux админ и никогда им не был, поэтому, если вы найдете какие-то замечания — пишите, всё поправлю. Однако, когда я переходил с Windows на Linux (Ubuntu 12.04) и начинал разрабатывать в нём, мне подобной статьи не хватало.

4grsvmsm5sw0egnzdsywndvb9jc.png

© Habrahabr.ru