Основы Linux
Linux — семейство Unix-подобных операционных систем на базе ядра Linux. Обычно пользователь работает с дистрибутивом: ядром, системными утилитами, менеджером пакетов, библиотеками и прикладными программами.
Команды и имена файлов чувствительны к регистру:
ls
LS # другое имя; обычно такой команды нетКомментарий в shell начинается с #:
# Показать содержимое текущего каталога
lsУстановка и выбор дистрибутива
Популярные варианты:
- Ubuntu, Linux Mint — удобны для начала и настольной работы;
- Debian — стабильная система с большим набором пакетов;
- Fedora — современные версии программ и технологий;
- Rocky Linux, AlmaLinux — серверные RHEL-совместимые системы;
- Arch Linux — гибкая система с ручной настройкой;
- openSUSE — универсальный дистрибутив с удобным администрированием.
При выборе учитывают назначение системы, стабильность, частоту обновлений, поддержку оборудования, документацию, менеджер пакетов и требования к ресурсам.
Дистрибутив обычно загружается как ISO-образ и записывается на USB-накопитель. Многие настольные системы поддерживают Live-режим: Linux запускается без установки, что позволяет проверить сеть, звук и другое оборудование.
Перед установкой:
- сделайте резервную копию данных;
- проверьте контрольную сумму ISO;
- определите режим загрузки UEFI или Legacy BIOS;
- решите, будет ли Linux единственной системой;
- подготовьте свободное место на диске.
Проверка SHA-256:
sha256sum linux-image.isoМинимальная установка обычно использует корневой раздел /, EFI-раздел при UEFI и swap-файл или swap-раздел. Отдельно могут выделяться /home, /var и /boot. Для первой установки безопаснее автоматическая разметка установщика.
Менеджеры пакетов
| Семейство | Инструмент | Пример |
|---|---|---|
| Debian, Ubuntu, Mint | apt |
sudo apt install tree |
| Fedora, Rocky, AlmaLinux | dnf |
sudo dnf install tree |
| Arch Linux | pacman |
sudo pacman -S tree |
| openSUSE | zypper |
sudo zypper install tree |
Перед установкой пакетов в Debian/Ubuntu обновляют индекс:
sudo apt update
sudo apt install treesudo выполняет отдельную команду с повышенными привилегиями. Используйте его только при необходимости.
Работа в терминале
Терминал предоставляет текстовый интерфейс, а shell читает и выполняет команды. Распространённые оболочки: bash, zsh, fish, dash.
Узнать оболочку входа:
echo "$SHELL"Узнать shell текущего процесса:
ps -p $$ -o comm=Команда обычно состоит из программы, опций и аргументов:
ls -la /var/logls— программа;-lи-a— опции, объединённые в-la;/var/log— аргумент.
Длинные опции начинаются с --:
ls --all --human-readableПолезные сочетания:
| Клавиши | Действие |
|---|---|
Tab |
Автодополнение команды или пути |
↑, ↓ |
История команд |
Ctrl+C |
Прервать команду |
Ctrl+D |
Передать EOF; часто закрыть shell |
Ctrl+L |
Очистить экран |
Ctrl+A, Ctrl+E |
Начало и конец строки |
Ctrl+R |
Поиск по истории |
history # показать историю
!! # повторить последнюю командуНе запускайте неизвестные команды, особенно через sudo.
Файловая система Linux и FHS
Linux использует единое дерево каталогов с корнем /. Диски и сетевые ресурсы подключаются к нему через точки монтирования.
/home/alex/projects/app/main.pyКорень / не следует путать с домашним каталогом администратора /root.
Основные каталоги
| Каталог | Назначение |
|---|---|
/ |
Корень дерева |
/boot |
Ядро и файлы загрузчика |
/dev |
Файлы устройств |
/etc |
Общесистемная конфигурация |
/home |
Домашние каталоги пользователей |
/media |
Автоматически подключаемые носители |
/mnt |
Временные точки монтирования |
/opt |
Дополнительное стороннее ПО |
/proc |
Виртуальные данные о процессах и ядре |
/root |
Домашний каталог root |
/run |
Данные работающей системы |
/sys |
Интерфейс к устройствам и ядру |
/tmp |
Временные файлы |
/usr |
Основные программы, библиотеки и общие данные |
/var |
Журналы, кэш, очереди и другие изменяемые данные |
В современных системах /bin, /sbin и /lib часто являются ссылками на каталоги внутри /usr.
Пути
Абсолютный путь начинается с /:
cd /var/logОтносительный путь вычисляется от текущего каталога:
cd projects/app| Обозначение | Значение |
|---|---|
. |
Текущий каталог |
.. |
Родительский каталог |
~ |
Домашний каталог |
- |
Предыдущий каталог для cd |
cd ..
cd ~/projects
cd -Пути с пробелами заключают в кавычки:
cd "Мои документы"
cp "отчёт за май.txt" ~/backup/Скрытые имена начинаются с точки: .bashrc, .config, .git.
Монтирование
findmnt # файловые системы и точки монтирования
lsblk -f # блочные устройства и их файловые системы
df -h # занятое и свободное местоРучное монтирование:
sudo mkdir -p /mnt/data
sudo mount /dev/sdb1 /mnt/dataРазмонтирование:
sudo umount /mnt/dataПостоянное монтирование настраивается в /etc/fstab. Перед изменением сделайте копию:
sudo cp /etc/fstab /etc/fstab.backupПример записи:
UUID=1234-ABCD /mnt/data ext4 defaults,nofail 0 2Проверка после редактирования:
sudo mount -aОшибка в /etc/fstab может нарушить загрузку системы.
Команды для файлов и каталогов
pwd
Показывает текущий рабочий каталог:
pwd
pwd -P # физический путь без символических ссылокls
Показывает содержимое каталога:
ls
ls -la
ls -lh /var/log
ls -ld ~/projects| Опция | Назначение |
|---|---|
-l |
Подробный формат |
-a |
Включая скрытые элементы |
-h |
Читаемые размеры вместе с -l |
-R |
Рекурсивный просмотр |
-t |
Сортировка по времени |
-S |
Сортировка по размеру |
-d |
Показать сам каталог |
cd
cd /etc # абсолютный путь
cd ~/projects # путь от домашнего каталога
cd .. # на уровень выше
cd - # предыдущий каталог
cd # домашний каталогmkdir
mkdir reports
mkdir -p project/src/components
mkdir images styles scripts-p создаёт недостающие родительские каталоги и не сообщает об ошибке, если каталог уже существует.
touch
Обновляет время файла, а при отсутствии обычно создаёт пустой файл:
touch notes.txt
touch index.html styles.css script.jsСоздание файла с текстом:
printf '%s\n' 'Hello, Linux!' > hello.txtcp
cp source.txt copy.txt
cp report.pdf ~/backup/
cp -r project project-backup
cp -a website/ website-backup/| Опция | Назначение |
|---|---|
-r, -R |
Рекурсивно копировать каталог |
-a |
Архивный режим с сохранением атрибутов |
-i |
Подтверждение перед перезаписью |
-n |
Не перезаписывать существующее |
-v |
Показывать действия |
mv
Перемещает или переименовывает:
mv draft.txt final.txt
mv final.txt ~/documents/
mv -i source.txt destination.txtВ пределах одной файловой системы операция обычно выполняется быстро. Между файловыми системами данные копируются, затем исходник удаляется.
rm
rm -i notes.txt
rmdir empty-directory
rm -ri old-project| Опция | Назначение |
|---|---|
-r, -R |
Рекурсивное удаление |
-i |
Запрашивать подтверждение |
-f |
Не запрашивать подтверждение |
-v |
Показывать удаляемые элементы |
Важно: rm обычно удаляет без корзины. Комбинация rm -rf особенно опасна. Перед удалением проверяйте путь через pwd и ls.
find
Поиск по имени:
find ~/projects -name "README.md"
find . -iname "*.jpg"По типу, размеру и времени:
find . -type f
find . -type d
find /var/log -type f -size +100M
find . -type f -mtime -7Выполнение команды для результатов:
find . -type f -name "*.log" -exec gzip {} +Перед удалением сначала проверьте список:
find . -type f -name "*.tmp"
find . -type f -name "*.tmp" -exec rm -i {} \;which
Ищет исполняемый файл в каталогах из $PATH:
which python3Для алиасов, функций и встроенных команд информативнее:
type ls
type -a python3
command -v gitШаблоны и кавычки
Shell раскрывает шаблоны до запуска команды:
| Шаблон | Значение |
|---|---|
* |
Любая последовательность символов |
? |
Один символ |
[abc] |
Символ из набора |
[0-9] |
Символ из диапазона |
ls *.txt
cp image?.png ~/backup/-- завершает список опций и помогает с именами, начинающимися с дефиса:
rm -- -strange-fileОдинарные кавычки сохраняют текст буквально, двойные разрешают подстановки:
echo '$HOME' # напечатает $HOME
echo "$HOME" # напечатает путь
echo "Сегодня: $(date +%F)"Переменные с путями заключайте в двойные кавычки:
cp "$source_file" "$backup_dir/"Права доступа
Пример ls -l:
-rwxr-x--- 1 alex developers 2048 Sep 4 12:00 deploy.shПервый символ обозначает тип (- — файл, d — каталог). Следующие тройки — права владельца, группы и остальных.
| Право | Для файла | Для каталога |
|---|---|---|
r |
Читать содержимое | Читать список имён |
w |
Изменять содержимое | Создавать, удалять и переименовывать элементы |
x |
Запускать | Входить и обращаться к объектам внутри |
chmod
Категории: u — владелец, g — группа, o — остальные, a — все.
chmod u+x script.sh
chmod g+w shared.txt
chmod o-r secret.txt
chmod u=rw,g=r,o= report.txtЧисловые значения: r=4, w=2, x=1.
| Режим | Значение |
|---|---|
644 |
Владелец читает и пишет, остальные читают |
755 |
Владелец имеет все права, остальные читают и выполняют |
600 |
Только владелец читает и пишет |
700 |
Только владелец имеет все права |
chmod 644 document.txt
chmod 755 script.sh
chmod 600 private.keyНе используйте chmod -R 777 как универсальное решение. Файлам и каталогам часто нужны разные режимы:
find website -type d -exec chmod 755 {} +
find website -type f -exec chmod 644 {} +chown
sudo chown alex report.txt
sudo chown alex:developers report.txt
sudo chown :developers report.txt
sudo chown -R alex:developers /srv/projectПоследняя команда изменяет владельца рекурсивно, поэтому требует осторожности.
umask
umask снимает права при создании объектов:
umask
umask -S
umask 027 # установить для текущего shellБазовые права обычно равны 666 для файлов и 777 для каталогов. При umask 022 новые файлы обычно получают 644, каталоги — 755. При umask 077 получаются 600 и 700.
Потоки, перенаправления и пайпы
У процесса обычно есть три стандартных потока:
| Номер | Имя | Назначение |
|---|---|---|
0 |
stdin |
Стандартный ввод |
1 |
stdout |
Стандартный вывод |
2 |
stderr |
Поток ошибок |
Перенаправления
ls -la > files.txt # перезаписать файл выводом
date >> events.log # добавить вывод в конец
sort < names.txt # взять стандартный ввод из файла
find /root 2> errors.log # записать только ошибки
command > out.log 2> err.log
command > all.log 2>&1 # вывод и ошибки в один файлОтбросить вывод:
command > /dev/null 2>&1Порядок важен: 2>&1 направляет stderr туда, куда stdout направлен в этот момент.
Пайпы
Пайп | передаёт stdout первой команды в stdin второй:
ls -la | less
ps aux | grep nginx
find . -type f | wc -l
cut -d: -f7 /etc/passwd | sort | uniq -cОбычный пайп не передаёт stderr. В Bash оба потока можно объединить:
command 2>&1 | less
command |& lesstee одновременно показывает и сохраняет данные:
journalctl -b | tee boot.log | less
echo "new line" | tee -a notes.txtЗапись в защищённый файл:
echo "value" | sudo tee /etc/example.conf > /dev/nullКоды завершения
command
echo $?0 обычно означает успех.
mkdir backup && cp report.txt backup/
cp report.txt backup/ || echo "Ошибка копирования" >&2После && команда выполняется при успехе, после || — при ошибке.
Получение справки
man
man ls
man chmod
man bashКлавиши просмотра: Space — вперёд, b — назад, /текст — поиск, n — следующее совпадение, q — выход.
Поиск страниц по описанию:
man -k archive
apropos archiveРазделы руководства:
| Раздел | Содержание |
|---|---|
1 |
Пользовательские команды |
2 |
Системные вызовы |
3 |
Библиотечные функции |
5 |
Форматы файлов и конфигурация |
7 |
Обзоры и соглашения |
8 |
Административные команды |
man 1 passwd # команда
man 5 passwd # формат /etc/passwd--help, help, info
ls --help
find --help
help cd # встроенная команда Bash
help export
info coreutils
info tar--help даёт краткую справку, man — справочную страницу, info иногда содержит более подробное руководство. Для встроенных команд Bash используйте help.
Архивы: tar, gzip, zip
Архивирование объединяет файлы, сжатие уменьшает объём. tar создаёт архив, gzip сжимает поток, ZIP сочетает обе операции.
tar
tar -cf project.tar project/ # создать .tar
tar -tf project.tar # посмотреть содержимое
tar -xf project.tar # извлечь
tar -xf project.tar -C restored/ # извлечь в каталог
tar -czf project.tar.gz project/ # создать tar.gz
tar -xzf project.tar.gz # извлечь tar.gz
tar -cJf project.tar.xz project/ # создать tar.xz| Опция | Назначение |
|---|---|
-c |
Создать |
-x |
Извлечь |
-t |
Показать содержимое |
-f |
Указать файл архива |
-v |
Подробный вывод |
-z |
gzip-сжатие |
-J |
xz-сжатие |
-C |
Перейти в каталог перед операцией |
Перед извлечением незнакомого архива просмотрите его:
tar -tf archive.tar.gz | lessgzip
gzip large.log # создаст large.log.gz, заменив исходник
gzip -k large.log # сохранить исходник
gunzip large.log.gz # распаковать
gzip -dc large.log.gz | lessgzip не объединяет каталог в один архив; для этого его используют вместе с tar.
zip и unzip
zip documents.zip report.pdf notes.txt
zip -r project.zip project/
unzip -l project.zip
unzip project.zip
unzip project.zip -d restored/ZIP удобен для обмена между разными операционными системами. tar обычно лучше сохраняет Unix-атрибуты.
Настройка shell: .bashrc и алиасы
~/.bashrc — пользовательский конфигурационный файл Bash для интерактивных сеансов. В нём настраивают алиасы, функции, приглашение и параметры оболочки.
cp ~/.bashrc ~/.bashrc.backup
nano ~/.bashrc
source ~/.bashrcТочка — короткий аналог source:
. ~/.bashrcПримеры алиасов:
alias ll='ls -alFh'
alias la='ls -A'
alias grep='grep --color=auto'alias # показать все алиасы
alias ll # показать один алиас
unalias ll # удалить в текущем сеансеДля логики и аргументов лучше функция:
mkcd() {
mkdir -p -- "$1" && cd -- "$1"
}Добавленная в .bashrc функция будет доступна в новых интерактивных сеансах.
Bash также использует ~/.profile, ~/.bash_profile и общесистемные файлы. Конкретный файл зависит от login/non-login режима и дистрибутива. Ошибочную пользовательскую конфигурацию можно обойти:
bash --norcПеременные окружения и $PATH
Переменная shell создаётся без пробелов вокруг =:
project_dir="$HOME/projects/app"
echo "$project_dir"export передаёт переменную дочерним процессам:
export EDITOR=nano
printenv EDITOR
unset EDITORДля одной команды:
LANG=C sort names.txt
DEBUG=1 ./appРаспространённые переменные:
| Переменная | Назначение |
|---|---|
HOME |
Домашний каталог |
USER |
Имя пользователя |
SHELL |
Оболочка входа |
PATH |
Каталоги поиска программ |
PWD |
Текущий каталог |
LANG |
Язык и локаль |
EDITOR |
Предпочитаемый редактор |
PAGER |
Постраничный просмотрщик |
$PATH
PATH содержит разделённые двоеточиями каталоги. Поиск идёт слева направо:
echo "$PATH"
export PATH="$HOME/.local/bin:$PATH"
command -v python3
type -a python3Чтобы настройка сохранялась, добавьте export PATH=... в подходящий файл, например ~/.bashrc или ~/.profile.
Текущий каталог обычно не входит в PATH, поэтому локальный скрипт запускают явно:
chmod u+x script.sh
./script.shНе добавляйте . в начало PATH: файл из текущего каталога может подменить системную команду.
Подстановка результата команды:
today=$(date +%F)
archive="backup-${today}.tar.gz"
tar -czf "$archive" ~/documentsОбщий пример
# Создать проект
mkdir -p ~/projects/demo/{src,docs,backup}
cd ~/projects/demo
# Создать файлы
printf '%s\n' '#!/usr/bin/env bash' 'echo "Hello, Linux!"' > src/main.sh
printf '%s\n' '# Demo' '' 'Учебный проект.' > docs/README.md
# Настроить права и запустить
chmod 755 src/main.sh
chmod 644 docs/README.md
./src/main.sh
# Скопировать и найти файлы
cp -a src backup/
find . -type f | sort | tee file-list.txt
# Создать архив
cd ~/projects
tar -czf demo-$(date +%F).tar.gz demo/
# Проверить архив
tar -tzf demo-$(date +%F).tar.gz | lessКраткая памятка
| Задача | Команда |
|---|---|
| Текущий каталог | pwd |
| Список файлов | ls -la |
| Перейти в каталог | cd path |
| Создать каталог | mkdir -p path |
| Создать пустой файл | touch file |
| Копировать | cp source destination |
| Переместить/переименовать | mv source destination |
| Удалить | rm -i file |
| Найти файл | find . -type f -name "name" |
| Найти программу | command -v command |
| Изменить права | chmod 644 file |
| Изменить владельца | sudo chown user:group file |
| Показать маску | umask |
| Перезаписать файл | command > file |
| Дописать в файл | command >> file |
Создать .tar.gz |
tar -czf archive.tar.gz dir/ |
Извлечь .tar.gz |
tar -xzf archive.tar.gz |
Применить .bashrc |
source ~/.bashrc |
| Экспортировать переменную | export NAME=value |
Безопасная работа
- Проверяйте
pwdиlsперед рекурсивным удалением или сменой прав. - Заключайте переменные с путями в двойные кавычки:
"$path". - Используйте
--перед именами, которые могут начинаться с-. - Не применяйте
chmod 777как универсальное решение. - Делайте резервные копии конфигурации перед изменением.
- Просматривайте содержимое незнакомых архивов перед извлечением.
- Используйте
sudoтолько для конкретной команды. - Обращайтесь к
man,--help,helpиinfo, если не уверены в синтаксисе.