Как стать автором
Обновить
1916.42

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

Уровень сложностиСредний
Время на прочтение14 мин
Количество просмотров70K

Что такое Linux?


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

Содержание:

  1. Linux Kernel aka Ядро
  2. GNU Core Utilities (coreutils)
  3. Bash — интерпретатор командной строки
  4. Системы управления пакетами и пакетные менеджеры
  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. Ядро Linux и, опционально, набор программ GNU coreutils.


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

Давайте я расскажу вам чуть больше о GNU/Linux ядре.

Первое, вы должны знать, что все ядра ОС бывают трех типов:

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


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

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


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

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


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

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


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

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

C помощью вышеуказанных механизмов, Ядро может быть использовано для продвинутых настроек безопасности, создание контейнеров, и виртуальных машин.

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, tty, unlink, users, vdir

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

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

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


Теперь я хочу вам рассказать о командной строке в Linux. Командная строка — это интерфейс для ввода команд, а Bash — оболочка (shell) и интерпретатор команд. Большинство людей знакомы с command.com в 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). В ней используется пакетный менеджер RPM (RPM Package Manager). Используется в следующих дистрах:

  • RedHat Enterprise Linux/CentOS
  • Fedora
  • Oracle Enterprise Linux
  • SUSE/OpenSUSE (опционально, а родной — zypper)


Вторая — Apt. В качестве пакетного менеджера использует dpkg. Наиболее популярные дистрибутивы с ней:

  • Debian
  • Ubuntu
  • Linux Mint


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

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

Наконец, если вы оказались в изолированной от Интернета сети, то вы можете установить пакеты из инсталляционных файлов с помощью пакетного менеджера

rpm -i filename.rpm

Это установит пакет в RHEL/CentOS, Fedora, Oracle Linux, SUSE/OpenSUSE

однако, лучше все же сделать вот так:
dnf install https://mirror.yandex.ru/epel/9/Everything/x86_64/Packages/e/epel-release-9-3.el9.noarch.rpm
dnf install ./skype.rpm
— спасибо aim

dpkg -i filename.deb

однако, лучше все же сделать вот так:
apt install ./filename.deb — спасибо WASD1

Это установит пакет в 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). При загрузке ядро инициализирует все внутренние структуры и запускает первый пользовательский (user space) процесс с PID 1 — как правило, это система инициализации. Она же является родителем для любых пользовательских процессов. Кстати, полезная штука — в Linux отображаются не только PID собственно процесса, но и его родителя. Посмотреть родителей можно так:
ps -efj

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

systemd



Скорее всего, вы будете работать с этой системой инициализации. Самое главное, пожалуй, с чего стоит начать знакомство, это с утилит systemctl и journalctl. У первой довольной простой синтаксис
systemctl command service. К примеру, systemctl status networking покажет текущее состояние демона (службы) сетевых интерфейсов. systemctl restart mysql перезагрузит демона сервера MySQL. stop/start сделают остановку или запуск указанного демона.

Для отладки придётся часто заглядывать в журнал и искать там ошибки,
journalctl -xe.

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

Больше о systemd можно прочесть здесь: en.wikipedia.org/wiki/Systemd

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


Конечно, вы можете подключиться к серверу с помощью клавиатуры, мышки и монитора. Но обычно большинство людей подключаются к серверам удаленно. Для этих целей служит сервис (демон) sshd (ssh daemon, или ssh server). Он слушает 22 TCP порт. Позволяет подключаться как с логином-паролем, так и с помощью ключей. Настройки входа зависят от конкретной инсталляции.

В 10-ку, с определенного момента, встроен ssh клиент. Для более старых версий 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) не разрешено ничего с этим файлом.
А еще есть «человеческий» метод: ssh-copy-id

Кроме того, система разрешений еще может указывать на исполняемость файла (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, а сами конфиги можно найти здесь:
/etc/network/interfaces

В ряде систем (не везде) установлен NetworkManager, и тогда статические конфигурации могут быть найдены здесь:
/etc/NetworkManager/NetworkManager.conf
Проверить, установлен ли у вас NetworkManager можно следующим путём:
/usr/sbin/NetworkManager --version или nmcli --version

В завещании, меня просили упомянуть
Васю кхм, systemd-networkd. Исправился, упомянул.

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

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


Я когда-то любил простоту Windows. A:\ для флоппика (да, я достаточно старый), C:\ для системы, и зачастую, единственный диск вообще (если нет, то D:\ для дистрибутивов игр, фото и видео), и, наконец, E:\ для CD-ROM. Всё просто!

А теперь я покажу минимальный минимум, который вам встретится в большинстве дистрбов, лол:

/
/boot — файлы загрузчика
/dev — файлы устройств
/root — домашняя папка для пользователя root (опционально). Может быть слинковано с /home/root
/etc — хранит конфигурацию машины
/home — корневая директория для “хомяков” пользователей
/lib — хранит важные общие библиотеки и модули ядра
/media — точка монтирования к извлекаемым накопителям
/mnt — точка монтирования для временно подключенных файловых систем (флешки, внешние диски, сетевые диски)
/usr — сюда попадает установленное пользователями ПО
/opt — сюда тоже попадает установленное пользователями ПО
/var — здесь хранятся вещи, которые не статичны. К примеру, логи /var/logs
/sbin — системные исполняемые файлы
/bin — общие (расшаренные) исполняемые файлы
/srv — для хранения данных сервисов (веб-серверов, к примеру)
/tmp — временный раздел, данные в нём могут быть удалены при перезагрузке сервера, выходе пользователя, остановки сервиса и так далее.

Большинство файлов могут быть поделены на четыре группы по двум признакам:
“Расшариваемые”-”Не расшариваемые” (“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, и другие. Если установлен дисплей сервер и десктопное окружение, то система выглядит почти как обычный ПК. С окошками, рабочим столом, панелью и прочим.

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





На эти книги (курсы) я ссылок не дам, но ищущий да найдет:

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

Причем, материалы курсов доступны и на русском языке.

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

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

Теги:
Хабы:
+32
Комментарии42

Публикации

Информация

Сайт
timeweb.cloud
Дата регистрации
Дата основания
Численность
201–500 человек
Местоположение
Россия
Представитель
Timeweb Cloud