Linux за 30 минут. Руководство по выбору и использованию Linux для новичков
t.me/anon_chan_by
- Какой бывает Linux
- Ядро
- Пакетный менеджер
- Графическая система
- Командный интерпретатор
- Домашний каталог и скрытые файлы
- Ввод-вывод и пайпы
- Файловые системы
- Система каталогов
- Пользователи, права на файлы
- Ссылки
- Установка софта
- Init и systemd
- Прочие приложения
- Итоги
Совершенно не важно, какую операционку ты предпочитаешь иметь на рабочем компьютере, — Linux сегодня буквально повсюду: на серверах, на железках вроде Raspberry Pi, на умных устройствах, на компьютерах в госучреждениях... Да что там, даже в Windows теперь можно запускать Linux, чтобы легче было, к примеру, тестировать серверный софт. Хакеру же ориентироваться в Linux просто необходимо.
Огромное количество хакерского софта работает только на Linux и собрано в специализированных дистрибутивах вроде Kali. К тому же при пентесте ты часто будешь сталкиваться с системами на Linux и должен уметь с ними обращаться. Да и просто полезно иметь опыт работы с этой мощной, абсолютно бесплатной системой. В жизни пригодится, поверь!
В этой статье мы попытаемся рассказать все, что сами хотели бы знать, когда начинали интересоваться «Линуксом» много лет назад. Это и теоретические сведения, которые помогут ориентироваться, и вполне практичные советы.
Важное предупреждение
По уровню сложности это не вполне характерная для «Хакера» статья — она рассчитана на совсем‑совсем новых пользователей. Мысль о ней появилась, когда мы стали компоновать подборку материалов об использовании Linux и обнаружили, что у нас нет ничего, что подошло бы в качестве самого начала. А если и есть, то покрыто толстыми мхами.
Если ты против таких статей в «Хакере», можешь, конечно, отметиться в комментариях, но, право слово, лучше иди почитай про эксплуатацию ядра или про то, как писать минималистичный бэк‑шелл на ассемблере. Благо таких статей у нас большинство и менять в этом плане мы ничего не собираемся.
Если же тема кажется тебе в самый раз, то пристегивайся — наш звездолет отправляется, чтобы пронестись по основам Linux со сверхсветовой скоростью.
КАКОЙ БЫВАЕТ LINUX
Первое, с чем сталкивается человек, желающий установить Linux, — это огромное разнообразие дистрибутивов. Все эти названия просто невозможно упомнить, но в реальности и не нужно.
Три основных семейства дистрибутивов, о которых нужно знать в первую очередь, — это Debian, Red Hat и Arch. Еще можно вспомнить SUSE, Mandriva и Gentoo, но деньки их славы уже позади, да простят нас их пользователи!
INFO
Chrome OS — это тоже внутри вполне настоящий Linux, и в новых версиях поддерживается запуск программ для Linux. Но в один ряд с другими дистрибутивами эту ОС все же не поставишь.
Из семейства Debian в первую очередь стоит обратить внимание на Ubuntu. Это и есть самый очевидный выбор, если ты раздумываешь, с чего начать. Компания Canonical, стоящая за Ubuntu, прикладывает огромные силы для того, чтобы этот дистрибутив хорошо работал и был дружелюбен к пользователю. Для этого дистрибутива имеется широчайший выбор стабильно работающих программ — ты точно не будешь испытывать в них недостатка.
К тому же у Ubuntu огромное сообщество, что значительно упрощает решение проблем: в 99% случаев ты будешь не первый, кто испытывает ту или иную сложность. Просто копируй сообщение об ошибке, и наверняка найдешь ветку форума, где более опытные товарищи объясняют другим пострадавшим, как с этим справиться.
Есть и другие популярные дистрибутивы, основанные на Debian, — к примеру, Raspberry Pi OS, MX Linux или Kali Linux. А на Ubuntu базируются Linux Mint, elementary OS и многие другие. Кстати, Mint и elementary тоже неплохие варианты для новичков.
Ставить Kali в качестве первой системы обычно не рекомендуют: этот узкоспециализированный хакерский дистрибутив плохо приспособлен для повседневной работы, и устанавливать его предполагается в виртуалку или в качестве второй ОС. К тому же он под завязку забит хактулзами вместо обычных приложений, что будет сбивать с толку. Но если ты ставишь Linux специально, чтобы заполучить все это богатство, то кто мы такие, чтобы тебя останавливать?
Что до самого Debian, то его главная фишка — это лицензионная чистота. Разработчики внимательно следят за тем, чтобы в него не попало ни строчки кода, который распространяется не по свободной лицензии. Что может быть и похвально с точки зрения идеологии, но, когда ты хочешь освоиться с Linux, скорее всего, обернется разного рода сложностями.
К семейству дистрибутивов Red Hat относятся в первую очередь Fedora, Red Hat Enterprise Linux (RHEL) и Rocky Linux. На обычный ПК есть смысл ставить «Федору», тогда как RHEL — это коммерческое решение для серверов, а Rocky Linux — его некоммерческий клон, созданный сообществом.
И наконец, Arch — это крайне интересный «гиковский» дистрибутив, который ты можешь сам собрать по кирпичикам и настроить как тебе захочется. Однако нырять в это без предварительных познаний в Linux не советуем. Решая проблемы, ты, конечно, приобретешь много ценных знаний, но это далеко не самый простой путь, и лучше отложить хождение по нему на потом.
У Arch есть и менее суровые вариации — Manjaro и EndeavourOS. В обеих хотя бы присутствуют заранее настроенные и подготовленные к работе окружения, но тоже аскетичные. С другой стороны, отсутствие необузданного разнообразия может быть плюсом при первом знакомстве, так что начинать с Manjaro — не такая плохая идея. Особенно если ты планируешь ставить Linux на слабый компьютер.
Not Unix
В чем отличие Linux от Unix? Если очень‑очень упростить, то можно сказать, что Unix — это предок Linux. Более сложный и развернутый ответ требует немного углубиться в историю.
В семидесятые годы Ричард Столлман придумал клонировать коммерческий и по тем временам дорогостоящий Unix и создать свою операционку, которую он назвал GNU is not Unix или просто GNU. Столлман и компания переписали все компоненты Unix и опубликовали их под придуманной ими «вирусной» лицензией GPL.
Изначально словом Linux называли только созданное Линусом Торвальдсом ядро. Но название Linux и маскот‑пингвин быстро прижились, и ими теперь обозначают всю ОС — несмотря на возражения Столлмана и просьбы писать только GNU/Linux.
Linux в эпоху интернета стал быстро набирать популярность, и коммерческим вариантам Unix со временем просто не осталось места. Тем не менее до сих пор живы его потомки — операционные системы FreeBSD и OpenBSD, которые теперь бесплатны и многое заимствуют из современного «Линукса». Кстати, на FreeBSD основаны macOS и iOS.
Получается, что выбор дистрибутива — это в первую очередь выбор подхода и даже идеологии. Однако более приземленным ориентиром обычно служит набор основных компонентов, из которых строятся дистры. Давай обсудим главные из них.
ЯДРО
Ядро, хоть и критически важно для работы системы, особо не интересно с точки зрения пользователя — взаимодействовать с ним напрямую тебе вряд ли придется, пока ты не станешь настоящим гуру.
Возможно, ты часто слышал про «сборку ядра» и можешь даже самостоятельно попробовать сделать это. Поскольку ядро Linux монолитное, в него должна входить поддержка множества вещей, которые касаются всех аспектов работы компьютера. Соответственно, перед сборкой можно и нужно задать кучу всяких настроек, но ничего особенно увлекательного в этом, поверь, нет, хотя процесс крайне познавательный.
В системе может одновременно присутствовать сколько угодно ядер, а какое именно будет использоваться, ты можешь выбрать в загрузчике. Апгрейд ядра до более новой версии — совершенно рутинное дело в Linux и обычно происходит автоматически.
ПАКЕТНЫЙ МЕНЕДЖЕР
Любой Linux состоит из тысяч мелких компонентов — программ, библиотек и ресурсов (например, файлов конфигурации, наборов иконок и так далее). Распространяются они в виде пакетов (package).
Пакетный менеджер — это специальная программа, которая выполняет установку, настройку, удаление, а также обновление как отдельных приложений, так и всей системы в целом или ее компонентов.
Очень часто один пакет требует для работы наличия других, и следить за этими зависимостями вручную на современной системе невозможно. Поэтому основа каждого дистрибутива — это пакетный менеджер, который рулит установкой и обновлением софта. В дистрибутивах, основанных на Debian, он называется APT, в Red Hat — DNF, а в Arch — pacman.
Пакеты менеджер берет из репозитория — большого склада, куда создатели дистрибутива загружают их. Репозиториев зачастую можно подключить сразу несколько. Например, в Ubuntu есть четыре основных: Main (поддерживаемый разработчиками), Universe (поддерживаемый сообществом), Restricted (с проприетарным ПО) и Multiverse (с ПО, на которые действуют несвободные лицензии).
Поскольку вскоре после установки Linux ты обнаружишь необходимость в драйверах для железа, дополнительных шрифтах, кодеках и тому подобных вещах, скорее всего, понадобится разрешить системе доступ к запятнанным коммерцией репозиториям. В Ubuntu это делается в меню «Программы и обновления».
ГРАФИЧЕСКАЯ СИСТЕМА
Далеко не каждый Linux снабжен графической системой или вообще нуждается в ней — очень многие действия здесь можно делать и из командной строки. Однако современный рабочий стол — это все же иконки и окошки.
Чтобы работать с графикой, в Linux должны присутствовать сервер дисплея X.Org (традиционный вариант) либо новомодный композитор Wayland, на который сейчас переходят наиболее передовые дистрибутивы. Плюс требуется оконный менеджер — программа, которая отвечает за то, как выглядят и работают элементы интерфейса.
Впрочем, это всё довольно низкоуровневые подробности, нырять в которые с ходу не обязательно. Куда скорее тебе придется задуматься о выборе рабочей среды (Desktop Environment, DE). Это совокупность оконного менеджера и разного рода программ, мелких (например, рисующих разные панели, рабочий стол, виджеты) и крупных — вроде файлового менеджера. Сюда же обычно входит и набор базового софта: календарь, почтовик и прочее в таком духе.
Самые известные оконные среды — это GNOME и KDE. Но в реальности их список гораздо длиннее. Любители минимализма могут присмотреться к Xfce или LXDE, а Ratpoison, dwm, i3 и xmonad предоставляют среду с неперекрывающимися окнами, что некоторые находят удобным.
А еще от GNOME отвалились проекты MATE и Cinnamon — их разработчикам не понравился интерфейс GNOME 3, и они продолжили развивать вторую ветку. А в elementary OS используется своя среда под названием Pantheon, которую не встретишь больше нигде. В общем, разнообразие огромно!
Создатели дистрибутивов, в которые входит графическая среда, обычно выбирают одну или несколько сред, которые будут поддерживать официально. Но при этом тебе ничто не мешает поменять DE или установить одновременно больше одной, чтобы переключаться между ними или использовать программы одной среды из другой. Пробуй, экспериментируй, и сам поймешь, что тебе ближе.
КОМАНДНЫЙ ИНТЕРПРЕТАТОР
Пользователи Windows привыкли к тому, что в этой операционной системе имеется стандартный интерпретатор команд cmd.exe
, который принято называть командной строкой. В последних версиях винды его органично дополнил PowerShell, однако этими двумя средами ассортимент командных интерпретаторов в Windows исчерпывается.
В Linux командных интерпретаторов существует множество, и, если для Windows они лишь вспомогательное средство администрирования, здесь это один из основных и очень мощных инструментов работы с системой.
Собственно, сама история Linux началась именно с командной строки, точнее терминала или даже телетайпа. Графический интерфейс к нему приделали уже значительно позже. Именно поэтому командную строку в Linux часто называют «эмулятор терминала», а процессы с ними носят префикс tty
(teletype).
Как ты знаешь, с использованием команд в Windows можно писать скрипты, автоматизирующие какие‑либо действия: пакетные файлы (batch files) были в ходу еще со времен MS-DOS, а PowerShell заметно расширил и углубил эту технологию. В Linux можно делать то же самое: собранный в файл набор команд интерпретатора может работать как сложная программа, а сами команды являются по большому счету языком программирования.
Наборы команд, сохраненные одним файлом, принято называть сценариями или скриптами. Все скрипты в Linux начинаются с символов #!
(это сочетание называется «шебанг») и пути к интерпретатору — команде, которая будет исполнять скрипт.
Стандартным командным интерпретатором в Linux является bash — обновленная и модернизированная версия командной оболочки Bourne shell, которая была изобретена Стивеном Борном в 1978 году и использовалась еще в классическом Unix.
Прожженные линуксоиды предпочитают ставить вместо bash более продвинутый интерпретатор — Z shell (ZSH), обратно совместимый с bash, но имеющий по сравнению с ним множество улучшений. Для этой оболочки сообществом был разработан специальный открытый и бесплатный фреймворк Oh My ZSH, который содержит множество плагинов для автоматизации работы с командами и скриптами. Как минимум Oh My ZSH позволяет использовать красивые темы оформления окна командной строки, благодаря которым окружающие точно сочтут тебя гениальным хакером.
INFO
Подробнее о ZSH и Oh My ZSH читай в статье «Прокачай терминал! Полезные трюки, которые сделают тебя гуру консоли».
Предупредим о проблеме, с которой моментально сталкивается каждый новый пользователь Linux. Если ты зайдешь в какой‑то каталог и попытаешься написать название исполняемого файла, чтобы запустить его, то ничего не получится. Почему?
Причина в том, что интерпретатор ищет файлы только в каталогах, которые указаны в переменной окружения $PATH
. То есть тебе нужно либо задать полный путь к исполняемому файлу, либо явно указать на текущий каталог. Как ты знаешь, родительский каталог отмечается двумя точками (../
), а чтобы указать на текущий, нужно писать ./
. То есть вместо program
пиши ./program
, и все получится!
И еще один очень важный момент. В Windows тип файла определяется его расширением — в зависимости от него командный интерпретатор и оболочка определяют, как они будут обрабатывать файл. В Linux все устроено немного по‑другому: у bash полностью отсутствует какое‑либо уважение к расширениям файлов. Исполняемый файл отличается от обычного не расширением, а наличием права на его исполнение: если оно есть, система считает такой файл программой (или скриптом) и пытается выполнить. О правах на файлы мы подробнее поговорим чуть дальше в соответствующем разделе.
ДОМАШНИЙ КАТАЛОГ И СКРЫТЫЕ ФАЙЛЫ
Поскольку Linux изначально задумывался как многопользовательская операционная система, все пути к «домашним» папкам, переменные окружения, программы, которые запускаются при открытии терминала, и другие настройки задаются в профиле пользователя. У разных юзеров они, соответственно, разные. Благодаря этому ты можешь, например, настроить системное окружение так, как комфортно именно тебе.
Чтобы указывать на домашний каталог, очень удобно использовать символ ~
. Так, вместо /home/vasya/
можно писать просто ~/
, если ты залогинен как vasya
.
В Linux часто встречается то, что в Windows попросту невозможно: файлы, имя которых начинается с точки (пользователи винды с непривычки думают, будто это файлы без имени, имеющие одно только расширение). На самом деле в Linux так обозначают скрытые файлы. Например, имя .htacess
говорит нам о том, что этот файл скрытый, — благодаря наличию точки перед именем его легко отличить от других файловых объектов.
В домашнем каталоге пользователя хранится несколько скрытых файлов, которые могут быть очень полезны при работе в Linux. Чтобы просмотреть скрытые файлы в текущем каталоге, используй консольную команду ls -a
или поковыряйся в меню файлового менеджера: например, в Nautilus пункт «Показать скрытые файлы» прячется в меню «Вид». Обрати внимание на следующие скрытые файлы:
.bash_profile
— содержит информацию о пользовательском окружении и запускаемых при авторизации пользователя программах. В некоторых дистрибутивах, основанных на Debian, данного файла по умолчанию не существует, но ты можешь создать его самостоятельно;.bash_login
— этот файл исполняется, если отсутствует.bash_profile
, и выполняет схожую функцию. Этого файла не существует по умолчанию ни в дистрибутиве Debian, ни в дистрибутиве Red Hat;.profile
— выполняется при отсутствии.bash_profile
и.bash_login
;.bash_logout
— сценарий, который выполняется автоматически при завершении работы командной оболочки;.bash_history
— хранит информацию обо всех командах, набранных в bash;.ssh
— каталог, в котором хранятся ключи шифрования для подключения по SSH;.bashrc
— сценарий, который обычно настраивается другими сценариями для своих собственных нужд — например, запуска демонов или обработки каких‑либо команд.
Необходимый минимум команд
Итак, запоминай самые важные команды, если еще не знаешь их:
man
— чуть ли не самая важная команда — она отображает справку о команде, название которой ты напишешь следом;ls
(от слова list, список) — перечислить все файлы в текущей директории, аналог виндовой командыdir
. Самые важные ключи:-a
(all) — показывать скрытые файлы,-l
(long) — показывать подробности,-h
(human) — показывать размеры в «человеческих» единицах, а не в байтах. Можно писать все ключи сразу:ls -lha
;cd
(change directory) — сменить директорию. Дальше можно указать папку, в которую ты хочешь перейти;pwd
(print working directory) — узнать текущий путь;cp
(copy) — скопировать файл. Дальше нужно указать, что и куда копировать;mv
(move) — переместить файл. Тоже указываем какой, затем — куда;rm
(remove) — стереть файл. Если стираешь каталог, указывай опцию-r
(recursive), чтобы стереть все подкаталоги внутри, подкаталоги внутри них и так далее;chmod
иchown
— поменять права на файл или владельца файла;cat
(concatenate) — придумана, чтобы объединять файлы, но часто используется, чтобы всего лишь вывести содержимое текстового файла. Просто напиши его название послеcat
;less
— если файл длинный, то его удобно прокручивать. Для этого и придумана командаless
;head
иtail
— с опцией-n число
показывают сколько‑то строк от начала (head
) или конца (tail
) указанного файла;grep
— поиск в строке по подстроке или регулярному выражению;find
— поиск файлов;mkdir
(make directory) — создание директории;touch
— создание пустого файла. Просто укажи его название;sudo
— выполнить следующую далее команду от имени суперпользователя;df
(disk free) — посмотреть, сколько на дисках свободного места. Рекомендую писатьdf -h
по аналогии сls -h
;du
(disk usage) — узнать, сколько занимает каталог. Тоже есть опция-h
;ps
(processes) — посмотреть список запущенных тобой процессов и их идентификаторы;kill
и идентификатор — завершить какой‑то процесс.
Несколько важных сетевых команд:
ping
— попинговать узел;nslookup
— узнать информацию об узле;traceroute
— проследить путь пакетов до узла;netstat
— информация об открытых портах и соединениях;whois
— информация о регистрации домена.
Помимо этого, в Linux обычно есть несколько утилит, которые сильно облегчат тебе жизнь. Если их нет, то стоит их установить:
git
— популярнейшая система контроля версий, как и ядро Linux, созданная Линусом Торвальдсом;nano
— простейший текстовый редактор, работающий в терминале;unzip
иunrar
— думаю, ты догадываешься, зачем они нужны;curl
нужен для веб‑запросов;wget
— для скачивания больших файлов;htop
показывает уровень загрузки системы и список процессов.
Важно: выйти из программ, которые не закрываются сами, обычно можно, нажав Q. Прервать работу — Ctrl-C. А чтобы выйти из vim
, если ты его открыл случайно, набери последовательность :q!
и нажми Enter.
ВВОД-ВЫВОД И ПАЙПЫ
Большинство программ, работающих из командной строки, принимают данные на вход и что‑то выдают на выходе. При этом вывод одной программы можно направить на ввод другой и таким образом достичь какой‑то более сложной цели или автоматизировать какой‑то процесс. Давай разберемся подробнее.
Стандартный поток ввода, к которому по умолчанию «привязана» клавиатура, называется standard input (stdin). Стандартный поток вывода носит название standard output (stdout). Существует и отдельный поток вывода, предназначенный исключительно для сообщений об ошибках. Он называется standard error, или stderr. По умолчанию с этими двумя потоками вывода связан монитор.
Потоки приложений и команд можно перенаправлять в файлы или в другие команды. Поскольку стандартные потоки ввода/вывода предназначены в основном для обмена текстовой информацией, такое перенаправление позволяет наладить «общение» программ между собой.
Самый простой пример подобного общения — это когда мы передаем стандартный вывод (stdout) одной программы на стандартный ввод (stdin) другой. Такой вариант перенаправления обозначается в Linux символом |
и называется термином «конвейер» или «пайп» (pipe). Например, если мы используем запись вида команда 1 |команда 2
, это будет означать, что весь стандартный вывод команды 1, который по умолчанию был бы направлен на дисплей (stdout), будет передан на стандартный ввод (stdin) команды 2. Это и есть реализация простейшего пайпа или конвейера.
Возможно, ты уже натыкался на использование пайпов в сочетании с командой grep
, предназначенной для фильтрации текстовых данных. Работает она так:
$ команда | grep [опции] шаблон
где команда
— это команда, стандартный вывод которой перенаправляется команде grep
;
опции
— это различные параметры поиска;
шаблон
— строка или значение, которые мы ищем.
Например, команда ls | grep string
означает, что мы, получив список содержимого текущей директории c помощью консольной команды ls
, ищем в нем файл или папку, в имени которых содержится строка string
.
Еще вывод команды бывает удобно перенаправить в файл. Напиши ls -lha > list.txt
, и получишь файл list.txt
с подробным перечислением всего, что содержится в текущем каталоге.
Полезные шпаргалки
Вся мощь команд Linux — в дополнительных параметрах, которые ты можешь указать. Чтобы узнать о них, нужно читать справку (man), но есть способы схитрить и облегчить себе жизнь.
- tldr pages — сокращенная версия man, в которой дотошные описания покромсали до абсолютного минимума (подробнее);
- cheat.sh — онлайновая база данных с примерами популярных вариантов команд (подробнее);
- Marker — похожая штука, но офлайновая и с подсказками «на лету» (подробнее);
- explainshell.com — сервис, который автоматически разбирает сложную команду и объясняет значение ее составных частей.
Запомнить все параметры всех команд невозможно, поэтому даже заядлые линуксоиды прибегают к таким хитростям (и неустанно изобретают всё новые)!
ФАЙЛОВЫЕ СИСТЕМЫ
В Linux есть поддержка разных файловых систем. Любой современный Linux по умолчанию устанавливается на ext4 и требует создания отдельного раздела типа Swap (аналог файла подкачки в Windows). Помимо этого, обычно поддерживаются диски ext2 и ext3, XFS и FAT разных версий. В Ubuntu и некоторых других дистрибутивах из коробки доступна работа с разделами NTFS на чтение и запись. Что до маковских HFS+ и APFS, то для них обычно требуется отдельный драйвер.
Чтобы работать с какой‑то ФС (расположенной на жестком диске или на внешнем носителе), ее нужно примонтировать, а перед завершением работы — демонтировать. За это отвечают команды mount
и umount
. В файле /etc/fstab
указываются системы, которые Linux будет монтировать автоматически при загрузке.
Отдельного упоминания заслуживает система FUSE — Filesystem in Userspace (в противовес поддержке на уровне ядра). Через эту штуку можно подключать неподдерживаемые по умолчанию файловые системы или даже сделать подобие файловой системы из API облачного сервиса. Подробнее об этом читай в статье «Все есть файл! Монтируем Git-репозитории, FTP- и SSH-ресурсы, ZIP-архивы, торренты, магнитные ссылки и многое другое».
СИСТЕМА КАТАЛОГОВ
В любой ОС есть каталоги с системными файлами, которые лучше не трогать без лишней надобности. Но если в Windows папки с системой просто лежат в сторонке, то в Linux все наоборот: ты работаешь внутри уже заданной структуры каталогов, причем во многие из них можно и нужно заглядывать.
Одна из причин такой организации в том, что файлами в Linux могут быть не только данные на диске, но и порты, процессы и другие сущности. Как ты можешь догадаться, читать и писать в них теми же средствами, что и при работе с обычными файлами, иногда очень удобно.
Слеши «не в ту сторону» вряд ли тебя смутят, но гораздо более непривычно после Windows то, что пути полностью виртуальны и никак не связаны с дисками. Данные по разным путям могут быть на разных разделах, на разных носителях или даже на разных компьютерах.
Итак, давай посмотрим на структуру каталогов, которую ты увидишь почти в любом Linux:
/
— корневая папка, или, как ее еще называют, root directory — папка, в которой хранится все остальное содержимое файловой системы;/bin
(от слова binary) — здесь лежат двоичные исполняемые файлы со всеми основными командами;/boot
— здесь расположен загрузчик и ядро ОС (файлыvmlinuz
— это как раз оно и есть);/dev
— файлы в этой папке — это порты и устройства. Работая с этими файлами, приложения и драйверы могут обмениваться информацией напрямую с оборудованием. Впрочем, некоторые файлы — это не настоящие устройства, а виртуальные. Например, знаменитый/dev/null
принимает любую информацию и ничего с ней не делает, а/dev/random
генерирует случайные числа;/etc
— в этой папке содержатся общесистемные файлы конфигурации (тогда как пользовательские файлы конфигурации находятся в домашнем каталоге каждого пользователя). Если ты администратор системы, то сюда придется часто заглядывать при настройке разных программ;/home
— в этой папке содержатся домашние каталоги пользователей Linux. Например, если твое имя пользователя —xakep
, твоя домашняя папка будет называться/home/xakep/
;/lib
— папка для хранения библиотек, необходимых исполняемым файлам в папкахbin
иsbin
;/lost+found
— в эту папку сохраняются восстановленные в случае системного сбоя файлы;/media
— в некоторых системах дополнительный каталог, где отображаются все смонтированные в системе съемные носители информации. В старых ОС может называться/cdrom
;/mnt
— папка, содержащая временные точки монтирования: сюда монтируются файловые системы для временного использования;/opt
— каталог содержит подкаталоги для дополнительных пакетов программного обеспечения. Обычно используется проприетарным ПО, которое не подчиняется стандартной иерархии файловой системы Linux;/proc
— каталог со специальными файлами, которые предоставляют информацию о системе и процессах;/root
— домашний каталог суперпользователя root;/run
— этот каталог предоставляет приложениям стандартное место для файлов, существующих только во время работы системы (отсюда название), таких как сокеты и идентификаторы процессов;/sbin
— эта папка по своему назначению аналогична папкеbin
. Здесь лежат двоичные исполняемые файлы, которые обычно предназначены для запуска пользователемroot
в целях системного администрирования;/tmp
— папка для хранения временных файлов по умолчанию;/srv
— содержит данные о сервисах, предоставляемых системой;/usr
— в этой папке содержатся приложения и файлы пользователей системы. В старых Unix это был аналог/home
, но затем эти вещи разделили. Условно: в/usr/
— программы, в/home
— всякое барахло. Находящиеся здесь каталоги/usr/bin
,/usr/sbin
и/usr/lib
раньше имели то же назначение, что и аналоги, лежащие в корне, но для файлов пользователей (в то время как папки в корне — для файлов, используемых самой системой). А еще есть каталог/usr/local
, где есть своиbin
,sbin
иlib
! Когда‑то подразумевалось, что здесь будут программы, специфичные для конкретного компьютера, то есть в теории зависящие от его железа. На практике софт сюда попадает по самым разным причинам;/var
— от слова variable, то есть что‑то, что может меняться. Здесь лежат бэкапы, кеши, библиотеки, логи и тому подобные вещи. Одна из важных директорий — это/var/www
, где хранятся данные веб‑сайтов, если на машине установлен веб‑сервер.
Если эта система каталогов кажется тебе немного запутанной, не волнуйся, это совершенно нормально! Она создавалась годами, и что выросло, то выросло. Упрощать ее в ближайшем будущем никто не собирается, поскольку она стандартна и любые изменения повлияют на совместимость.
ПОЛЬЗОВАТЕЛИ, ПРАВА НА ФАЙЛЫ
Linux изначально задумывался как многопользовательская система, а потому разделение файлов и профилей пользователей здесь организовано на высочайшем уровне. Пользователь с ограниченными правами в системе может взаимодействовать с теми или иными файлами и каталогами.
Важно помнить, что в Linux существует суперпользователь с именем root
, обладающий полными администраторскими привилегиями в операционной системе, — так сказать, самый главный босс всех боссов. Он может создавать и удалять учетки других юзеров и вообще менять глобальные настройки ОС. Любой юзер может временно побывать в роли root
с помощью команды sudo
(Substitute User and do, дословно «подменить пользователя и выполнить»). Но сработает этот sudo, только если ты знаешь пароль от учетной записи суперпользователя.
Каждому файлу в Linux назначается определенный набор разрешений, определяющих, кто и что может делать с этим файлом. Эти разрешения обозначаются специальными буквами:
r
(read) — разрешение на чтение файла;w
(write) — разрешение на запись в файл;x
(execute) — разрешение на запуск файла;-
(прочерк) — разрешение не установлено.
Важно помнить, что каталоги Linux тоже считает файлами, поэтому для них действительны все те же разрешения и ограничения. Однако указанные разрешения не имели бы большого смысла, если бы они распространялись на всех пользователей операционной системы. К счастью, это не так: в Linux имеется три разных категории пользователей, для каждой из которых можно устанавливать свои собственные разрешения доступа к файлам:
- владелец — пользователь, который создал этот файл или назначен его владельцем. Владельцем файла может быть не только учетная запись, но и сама операционная система или приложение, которое создало файл;
- группа — группа пользователей, «привязанная» к данному файлу. Ты можешь узнать, к какой группе пользователей относится твоя учетная запись, с помощью консольной команды
groups <username>
. Список всех зарегистрированных в системе групп обычно хранится в папке/etc/group
; - другие — все, кто не относится к владельцу файлового объекта или группам пользователей.
Таким образом, разрешения доступа к любому файлу или папке можно записать в виде строки, состоящей из девяти символов и имеющей следующий вид:
Первые три символа здесь определяют разрешения для владельца файлового объекта, вторые — для группы, к которой относится владелец файла или папки, последние три — для всех остальных. Разрешения всегда следуют именно в таком порядке: «чтение, запись, запуск», то есть rwx
. Например, обозначение вида rwxrw-r--
означает, что владелец этого файла может делать с ним что угодно, члены его группы — только читать и писать в файл, но не запускать его (разрешение x
не установлено), а всем остальным пользователям системы файл доступен только на чтение.
Если эти разрешения установлены для папки, это означает, что пользователи группы также не смогут запускать хранящиеся в ней файлы, а прочим пользователям открыт доступ к содержимому папки исключительно в режиме read only.
Просмотреть права и разрешения файлов и папок можно с помощью консольной команды ls
, снабженной ключом -l
.
Чтобы изменить права доступа, существует команда chmod
(Change Mode). При помощи этой команды можно даже не прописывать все требуемые разрешения вручную: для лентяев в Linux предусмотрены цифровые обозначения стандартных наборов разрешений. Например, команда chmod 755 filename
присвоит файлу filename
разрешения rwxr-xr-x
(каждый пользователь имеет право читать и запускать на выполнение; владелец может редактировать), chmod 777 filename
даст на выходе rwxrwxrwx
(все могут делать все, что захотят), а «дьявольская» команда chmod 666 filename
— вернет rw-rw-rw-
(все пользователи могут читать и редактировать файл).
В современном Linux существуют еще так называемые специальные разрешения, но их мы рассматривать не будем: для начала информации вполне достаточно, чтобы чувствовать себя в системе более‑менее уверенно.
ССЫЛКИ
В Windows существуют ярлыки — что это такое, объяснять, думаем, никому не нужно. В Linux вместо них ссылки, причем двух видов — жесткие и символические.
Жесткая ссылка — это, считай, название файла. Просто в Linux их у файла может быть несколько, причем находиться они могут в разных каталогах. Следовательно, если ты создашь жесткую ссылку, а потом удалишь исходный файл, то он по‑прежнему будет доступен по ссылке — ведь она ничем не хуже исходного названия, которое ты стер!
Если же ты удалишь последнюю жесткую ссылку, файловая система больше не будет считать, что файл существует, и признает место, где он расположен, пригодным для записи другой информации.
Символические ссылки больше похожи на стандартные ярлыки Windows. Они содержат адрес целевого файла или каталога (жестких ссылок на каталог не бывает), и если он исчезнет, то ссылка будет вести «в никуда».
Жесткие ссылки создаются командой ln файл ссылка
, а если нужно сделать символическую ссылку, добавь ключ -s
.
УСТАНОВКА СОФТА
Тебе, конечно, никто не мешает загрузить программу в виде одного бинарного файла и запустить. Главное — не забыть дать ему права на исполнение! Но такие отдельно стоящие файлы — редкость. Обычно, чтобы программа работала, в систему нужно установить сразу много всего. Именно поэтому программы распространяются в виде пакетов через репозиторий.
Например, в Ubuntu для установки пакета достаточно написать sudo apt install пакет
. Однако рекомендуется сначала сделать sudo apt update
, чтобы ОС обновила свой список пакетов и узнала о выходе новых версий.
Важное отличие Linux заключается в том, что программа после установки будет разбросана по разным каталогам. Исполняемые файлы — в свой каталог, графические ресурсы — в свой, настройки — в свой, и так далее. При этом программы обычно используют общие библиотеки, что немного экономит место на диске, но иногда создает неудобные ситуации с версиями библиотек.
При использовании такой системы установки практически бесполезно пытаться выяснить, куда же установилась программа. Если тебе вдруг понадобится удалить ее, пиши apt remove пакет
, и его содержимое покинет твой диск, а вместе с ним уйдут и все компоненты, которые никто, кроме него, не использовал.
Но Linux — это страна свободных исходных кодов, а потому сборка программы из исходников — обычное дело. Считай, что вместо кресла ты купил «конструктор» из IKEA. Важное отличие от нее заключается в том, что вместо инструкции со смешными человечками ты получаешь Makefile — сценарий для программы make
, который соберет все сам на автопилоте. А по дороге он изучит и учтет все особенности твоей системы либо наругается на тебя из‑за отсутствия каких‑то компонентов (в отличие от пакетного менеджера, который установил бы их сам).
Итак, предположим, ты нашел на гитхабе утилиту nnn (это такой минималистичный файловый менеджер, работающий в терминале) и хочешь ее установить из исходников. Тебе понадобится сделать следующее.
- Удостовериться, что у тебя в системе есть сам Git. Если его нет — установи:
sudo apt install git
- Установить зависимости для nnn. Все их собирать из исходников — немного слишком, поэтому просто пиши
sudo apt install pkg-config libncursesw5-dev libreadline-dev
- Теперь пора достать
nnn
с GitHub. Это делается такой командой: git clone https://github.com/jarun/nnn.git
- Заходи в скачанный каталог:
cd nnn
. - Пиши
make
и жми Enter. Эта команда найдет Makefile и выполнит инструкции по компиляции. - Пиши
sudo make install
— эта команда разложит созданные бинарные файлы по каталогам.
Готово! Можешь писать nnn
, находясь в любом каталоге, и файловый менеджер запустится.
Обрати внимание, это была лишь демонстрация. В реальности проще и лучше будет установить версию nnn из репозитория. В таком случае пакетный менеджер сможет обновлять установленную программу и удалить подчистую, если понадобится. Сборка из исходных кодов может понадобиться, если софт редкий или нужна самая‑самая новая версия.
Кстати, помимо бинарных пакетов, в репозиториях бывают и пакеты с исходниками. Их сборка пройдет на автомате и позволит не морочиться с установкой зависимостей.
В последнее время набирают популярность новые системы установки, в которых программы распространяются вместе со всеми зависимостями и библиотеками: AppImage, Flatpak и Snap. Это менее экономный метод, но более удобный и надежный. Также некоторые программы удобно устанавливать через Docker — то есть вместе с миниатюрным образом Linux. Но разговор обо всем этом выходит за рамки сегодняшней статьи.
INIT И SYSTEMD
В Unix и Linux большую роль играет процесс инициализации системы, за который отвечает утилита init. Древние юниксы до пятой версии просто исполняли скрипт при включении — считай, аналог autoexec.bat. Когда софта стало слишком много, пришлось добавить такое понятие, как runlevel.
Система при загрузке переходит из одной стадии в другую и при каждом переходе запускает скрипты из определенной папки /etc/rcX.d/
, где X — один из уровней загрузки:
- 0 — система выключена;
- 1 — однопользовательский режим;
- 2 — многопользовательский;
- 3 — с поддержкой сети;
- 5 — полная загрузка;
- 6 — перезагрузка.
Так, если добавить ссылку на скрипт в папку rc0.d
, то он будет исполняться каждый раз перед выключением.
Именно так система делает все, что ей положено делать, — например, запускает проверку диска после внезапного выключения, ротирует логи, запускает и останавливает работающие в фоне службы (в Unix и Linux они называются демонами).
В современном Linux на смену этой системе пришла еще более изощренная — systemd. Она может заодно рулить устройствами и сетевыми соединениями и делать другие вещи. В systemd для каждого действия или службы создаются конфигурационные файлы, в которых указано, когда и при каких условиях нужно что‑то запускать или останавливать. Найти их список ты можешь в /lib/systemd/
, а работают с ними при помощи команды service
.
При этом система с уровнями загрузки пока что тоже поддерживается в популярных дистрибутивах, несмотря на присутствие systemd. Иначе были бы проблемы с совместимостью.
INFO
Подробнее о systemd читай в статье «Полезный демон. Как перестать бояться systemd и сделать свой сервис для Linux».
ПРОЧИЕ ПРИЛОЖЕНИЯ
При настойке сети в Linux ты, скорее всего, столкнешься с iptables — стандартным файрволом и частью системы Netfilter. Если ты выбрал Ubuntu, то настраивать его можно при помощи удобной утилиты ufw
.
Другая полезнейшая утилита в Linux — это cron. Она делает примерно то же, что и планировщик заданий в Windows. В новых системах cron работает бок о бок с уже упомянутым (и гораздо более навороченным) systemd, однако использовать cron гораздо проще. Всего лишь напиши crontab -e
, и в текстовом редакторе откроется файл со списком программ, которые запускаются в определенное время. Формат обычно описан там же.
WWW
Сайт crontab.guru очень сильно упрощает работу с crontab.
ИТОГИ
Продолжать рассказывать о Linux можно практически бесконечно, однако мы оставим это другим статьям. Нашей целью не было заменить этим текстом серьезные книги по Linux. Мы лишь хотели дать необходимый минимум тем, кто хочет начать поскорее разбираться на практике. Надеемся, что нам удалось снабдить тебя необходимым набором начальных знаний, которые помогут тебе не заблудиться и не пропасть в темных закоулках Linux!