Системне програмування · Тема: GNU/Linux

Операційна система GNU/Linux

Вільна, відкрита та наднадійна операційна система, що живить увесь сучасний світ: від серверів, хмарних платформ і суперкомп'ютерів до мобільних пристроїв та систем безпеки.

Вільне ПЗ (GNU GPL) Ядро Linux (kernel.org) 1991 — Лінус Торвальдс

Що таке GNU/Linux?

GNU/Linux — це повнофункціональна Unix-подібна операційна система з відкритим вихідним кодом. Вона складається з двох фундаментальних компонентів:

100%
топ-500 суперкомп'ютерів світу
90%+
хмарної інфраструктури (AWS/GCP/Azure)
>600
активних дистрибутивів
33+
роки безперервного розвитку

Ключові архітектурні переваги:
• Багатозадачність і багатокористувацький режим: одночасне виконання сотень ізольованих процесів кількома користувачами.
• Розмежування прав та безпека: сувора POSIX-модель прав (rwx), механізми DAC/MAC (AppArmor, SELinux) та namespaces.
• Принцип «Все є файлом» (Everything is a file): уніфікований доступ до пристроїв (/dev), інформації про процеси (/proc) та системних налаштувань (/sys).
• Гнучкість та кастомізація: можливість заміни будь-якого компонента (ядра, шелла, графічної оболонки, менеджера пакетів).

💡

Сьогодні Linux використовується скрізь: на смартфонах під керуванням Android, у марсоходах NASA Perseverance, у серверах веб-сервісів Google, Meta та Cloudflare, а також у бортових комп'ютерах сучасних автомобілів.

Найбільш популярні дистрибутиви Linux

Дистрибутив Linux — це операційна система, зібрана на базі ядра Linux, системних утиліт GNU, пакетного менеджера та набору програмного забезпечення під конкретні задачі (робоча станція, сервер, безпека, контейнери).

🟠
Ubuntu
Найвідоміший дистрибутив від компанії Canonical на базі Debian. Величезна спільнота, підтримка PPA та Snap.
Початківцям Сервери APT / DPKG
🔵
Debian
«Універсальна операційна система». Легендарна стабільність, сувора політика вільного ПЗ, понад 59 000 пакетів.
Сервери Стабільність APT
🟢
Linux Mint
Ідеальний дистрибутив для користувачів, які переходять з Windows. Зручне оточення Cinnamon і готовність «з коробки».
Десктоп Для дому APT
💙
Fedora
Інноваційний дистрибутив від Red Hat. Завжди свіжі версії ядра, GNOME та Wayland. Полігон для корпоративного RHEL.
Розробникам Свіжий софт DNF / RPM
❤️
RHEL / Rocky / AlmaLinux
Корпоративний стандарт Red Hat Enterprise Linux та його безкоштовні бінарно-сумісні форки для продакшн-серверів.
Enterprise 10 років підтримки DNF / RPM
🔷
Arch Linux
Мінімалістичний дистрибутив за принципом KISS (Keep It Simple, Stupid). Rolling-release, репозиторій AUR і найкраща Wiki.
Rolling-Release AUR Pacman
🐉
Kali Linux
Дистрибутив для тестування на проникнення (пентест) та аудиту безпеки від Offensive Security. 600+ вбудованих утиліт.
Cybersecurity Пентест APT
🦎
openSUSE (Leap / Tumbleweed)
Потужний німецький дистрибутив із центром керування YaST, автоматичними знімками системи Snapper на Btrfs.
YaST Btrfs Zypper / RPM
🤖
Pop!_OS
Розроблений System76 на базі Ubuntu. Відмінна підтримка дискретних відеокарт NVIDIA/AMD, тайлінг вікон COSMIC.
Розробка Геймінг APT / Flatpak
🧅
Tails
Операційна система для абсолютної анонімності. Завантажується з флешки в RAM, весь інтернет-трафік спрямовує через мережу Tor.
Приватність Tor Network Live USB
🏔️
Alpine Linux
Ультралегкий дистрибутив розміром усього ~5 МБ. Побудований на musl libc та BusyBox. Де-факто стандарт для Docker-контейнерів.
Контейнери Docker APK
🦅
Manjaro
Дружній до користувача дистрибутив на базі Arch Linux із графічним установником, власними репозиторіями та стабілізацією оновлень.
Rolling Десктоп Pamac / Pacman

Приклади команд роботи в Linux CLI

Інтерфейс командного рядка (CLI) — серце адміністрування Linux. Нижче наведено детальні приклади роботи з 10 обов'язковими командами файлової системи та навігації.

1. pwd
(Print Working Directory) — показати поточну директорію
user@linux:~$ pwd
/home/user/projects/sp-course

Виводить абсолютний шлях від кореня / до каталогу, в якому зараз перебуває сеанс терміналу. Прапор -P розкриває символічні посилання до фізичного шляху.

2. echo
— вивести рядок тексту або значення змінної
user@linux:~$ echo "Ласкаво просимо до GNU/Linux!"
Ласкаво просимо до GNU/Linux!
user@linux:~$ echo -e "Користувач: $USER\nШелл: $SHELL\nДомашній каталог: $HOME"
Користувач: user
Шелл: /bin/bash
Домашній каталог: /home/user

Прапор -e активує інтерпретацію спецсимволів escape (\n — новий рядок, \t — табуляція). Прапор -n вимикає перенесення на новий рядок у кінці.

3. ls
(List) — переглянути вміст каталогу
user@linux:~$ ls -lah
total 48K
drwxr-xr-x 4 user user 4.0K Sep 26 13:00 .
drwxr-xr-x 3 root root 4.0K Sep 20 09:12 ..
-rw-r--r-- 1 user user 220 Sep 20 09:12 .bash_logout
-rw-r--r-- 1 user user 3.7K Sep 20 09:12 .bashrc
drwxr-xr-x 3 user user 4.0K Sep 26 12:45 projects
-rw-r--r-- 1 user user 1.2K Sep 26 13:00 notes.txt

Найчастіші прапори: -l (довгий формат з правами доступу, власником та розміром), -a (всі файли, включаючи приховані, що починаються з крапки), -h (human-readable розміри: K, M, G).

4. cd
(Change Directory) — перейти в інший каталог
user@linux:~$ cd /var/log && pwd
/var/log
user@linux:/var/log$ cd .. # піднятися на 1 рівень угору (у /var)
user@linux:/var$ cd ~ # повернутися в домашній каталог (/home/user)
user@linux:~$ cd - # повернутися до попередньої робочої директорії
5. touch
— створити порожній файл або оновити дату модифікації
user@linux:~$ touch config.yaml server.js .env
# Створює файли config.yaml, server.js та прихований .env нульового розміру
user@linux:~$ touch -d "2026-01-01 12:00:00" old_file.txt

Якщо вказаний файл вже існує, команда не перезаписує його вміст, а лише оновлює мітки часу atime та mtime.

6. mkdir
(Make Directory) — створити новий каталог
user@linux:~$ mkdir my-app
user@linux:~$ mkdir -p backend/src/controllers/api # створення всього ланцюжка каталогів
user@linux:~$ mkdir -m 700 secure_vault # створення з правами доступу тільки для власника

Ключ -p (parents) запобігає помилкам, якщо батьківські каталоги ще не створені, і не видає помилку, якщо папка вже існує.

7. cp
(Copy) — копіювати файли або цілі директорії
user@linux:~$ cp config.example.env .env
user@linux:~$ cp -r src/ dist/backup_src/ # рекурсивне копіювання каталогу
user@linux:~$ cp -i main.c main_old.c # інтерактивний режим із запитом перед перезаписом

Прапор -a (archive) зберігає атрибути файлів, права, власників, часові мітки та симлінки (ідеально для бекапів).

8. mv
(Move) — перемістити або перейменувати файл/папку
user@linux:~$ mv script.sh run_daemon.sh # перейменування файлу
user@linux:~$ mv *.log /var/log/archive/ # переміщення всіх .log файлів у каталог
user@linux:~$ mv -n draft.txt published.txt # прапор -n (no-clobber) не перезаписує існуючий файл
9. rm
(Remove) — видалити файли або директорії
user@linux:~$ rm temp.txt debug.log
user@linux:~$ rm -rf node_modules/ build/ # рекурсивно і примусово видалити папки
user@linux:~$ rm -i *.conf # запитувати підтвердження для кожного файлу
⚠️

Критична пересторога: У Linux немає «Кошика» для терміналу. Команда rm -rf видаляє назавжди без можливості штатного відновлення. Ніколи не запускайте sudo rm -rf /!

10. history
— переглянути історію введених команд
user@linux:~$ history | tail -n 5
 1021  ls -lah
 1022  mkdir -p src/utils
 1023  touch src/utils/math.c
 1024  gcc -Wall src/utils/math.c -o app
 1025  history | tail -n 5
user@linux:~$ !1024 # повторити команду номер 1024
user@linux:~$ !! # повторити останню команду
user@linux:~$ history -c # очистити історію поточного сеансу
user@ubuntu: ~/demo-session
user@ubuntu:~$ pwd
/home/user
user@ubuntu:~$ mkdir -p demo-lab/{src,docs,tests} && cd demo-lab
user@ubuntu:~/demo-lab$ touch src/main.sh docs/README.md tests/test1.sh
user@ubuntu:~/demo-lab$ echo '#!/usr/bin/env bash' > src/main.sh
user@ubuntu:~/demo-lab$ echo 'echo "Hello from Linux CLI!"' >> src/main.sh
user@ubuntu:~/demo-lab$ ls -lah src/
total 12K
drwxr-xr-x 2 user user 4.0K Sep 26 13:20 .
drwxr-xr-x 5 user user 4.0K Sep 26 13:19 ..
-rw-r--r-- 1 user user 55 Sep 26 13:20 main.sh
user@ubuntu:~/demo-lab$ cp src/main.sh src/main_backup.sh
user@ubuntu:~/demo-lab$ mv src/main_backup.sh docs/example.sh
user@ubuntu:~/demo-lab$ history | tail -n 5
1 mkdir -p demo-lab/{src,docs,tests} && cd demo-lab
2 touch src/main.sh docs/README.md tests/test1.sh
3 echo 'echo "Hello from Linux CLI!"' >> src/main.sh
4 mv src/main_backup.sh docs/example.sh
5 history | tail -n 5
user@ubuntu:~/demo-lab$

BASH-скрипт: Імітація текстової авторизації в системі

Скрипт демонструє класичний механізм входу до Linux у консольному режимі (TTY/SSH). Реалізовано: кольорове оформлення ANSI, ASCII-логотип системи, приховане введення пароля (read -s), лічильник невдалих спроб, блокування облікового запису на таймер та інтерактивну оболонку після входу.

login_simulation.sh
#!/usr/bin/env bash
# ==============================================================================
#  login_simulation.sh — Імітація текстової консольної авторизації в GNU/Linux
#  Курс: Системне програмування
# ==============================================================================

# --- Налаштування кольорів ANSI ---
readonly RED='\033[0;31m'
readonly GREEN='\033[0;32m'
readonly YELLOW='\033[1;33m'
readonly CYAN='\033[0;36m'
readonly BOLD='\033[1m'
readonly DIM='\033[2m'
readonly NC='\033[0m' # Скинути стиль

# --- Конфігурація системи ---
readonly HOSTNAME="sp-workstation"
readonly VALID_USER="admin"
readonly VALID_PASS="linux2026"
readonly MAX_ATTEMPTS=3
readonly LOCKOUT_TIME=10 # Секунди блокування при вичерпанні спроб

attempts=0

# --- Функція: Банер входу системи ---
print_banner() {
    clear
    echo ""
    echo -e "  ${CYAN}${BOLD}██████╗ ███╗   ██╗██╗   ██╗    ██╗     ██╗███╗   ██╗██╗   ██╗██╗  ██╗${NC}"
    echo -e "  ${CYAN}██╔════╝ ████╗  ██║██║   ██║    ██║     ██║████╗  ██║██║   ██║╚██╗██╔╝${NC}"
    echo -e "  ${CYAN}██║  ███╗██╔██╗ ██║██║   ██║    ██║     ██║██╔██╗ ██║██║   ██║ ╚███╔╝ ${NC}"
    echo -e "  ${CYAN}██║   ██║██║╚██╗██║██║   ██║    ██║     ██║██║╚██╗██║██║   ██║ ██╔██╗ ${NC}"
    echo -e "  ${CYAN}╚██████╔╝██║ ╚████║╚██████╔╝    ███████╗██║██║ ╚████║╚██████╔╝██╔╝ ██╗${NC}"
    echo -e "  ${CYAN} ╚═════╝ ╚═╝  ╚═══╝ ╚═════╝     ╚══════╝╚═╝╚═╝  ╚═══╝ ╚═════╝ ╚═╝  ╚═╝${NC}"
    echo ""
    echo -e "  ${DIM}ОС: Ubuntu 24.04 LTS (Noble Numbat) | Ядро: $(uname -r 2>/dev/null || echo '6.8.0-generic')${NC}"
    echo -e "  ${DIM}Хост: ${HOSTNAME} | Дата: $(date '+%d.%m.%Y %H:%M:%S')${NC}"
    echo ""
    echo -e "  ${YELLOW}Введіть облікові дані для авторизації:${NC}"
    echo ""
}

# --- Функція: Блокування при перевищенні ліміту ---
lockout_user() {
    echo ""
    echo -e "${RED}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}"
    echo -e "${RED}  [БЕЗПЕКА] Перевищено ліміт спроб (${MAX_ATTEMPTS})! Вхід заблоковано.${NC}"
    echo -e "${RED}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}"
    
    for ((sec=LOCKOUT_TIME; sec>0; sec--)); do
        printf "\r  Зачекайте перед повторною спробою: ${YELLOW}%02d сек${NC}... " "$sec"
        sleep 1
    done
    
    echo -e "\n\n  ${GREEN}Блокування знято. Відновлення форми входу...${NC}"
    sleep 1.5
    attempts=0
    print_banner
}

# --- Функція: Успішна авторизація (MOTD) ---
welcome_screen() {
    local user="$1"
    clear
    echo ""
    echo -e "${GREEN}=================================================================${NC}"
    echo -e "${GREEN}${BOLD}  ✓ Авторизація успішна! Ласкаво просимо, ${user}.${NC}"
    echo -e "${GREEN}=================================================================${NC}"
    echo ""
    echo -e "  ${CYAN}Системний статус (MOTD):${NC}"
    echo -e "    • Останній вхід : $(date '+%a %b %d %T %Y') з 127.0.0.1"
    echo -e "    • Uptime        : $(uptime -p 2>/dev/null || echo 'up 5 days, 12 hours')"
    echo -e "    • Використання  : Диск 34% (34G/100G) | RAM 2.4G/16G"
    echo -e "    • Доступ        : /home/${user} (права: rwx)"
    echo ""
    echo -e "  ${DIM}Доступні демо-команди: whoami, pwd, ls, date, clear, exit${NC}"
    echo ""
}

# --- Головний цикл аутентифікації ---
print_banner

while true; do
    printf "  ${HOSTNAME} login: "
    read -r input_user

    # Прапор -s вимикає echo-відображення символів пароля
    printf "  Password: "
    read -rs input_pass
    echo ""

    if [[ "$input_user" == "$VALID_USER" && "$input_pass" == "$VALID_PASS" ]]; then
        welcome_screen "$input_user"
        break
    else
        (( attempts++ ))
        local_remaining=$(( MAX_ATTEMPTS - attempts ))
        echo ""
        echo -e "  ${RED}Login incorrect. Спроба помилкова.${NC}"

        if [[ $attempts -ge $MAX_ATTEMPTS ]]; then
            lockout_user
        else
            echo -e "  ${YELLOW}Залишилось спроб: ${local_remaining} з ${MAX_ATTEMPTS}${NC}\n"
        fi
    fi
done

# --- Інтерактивна міні-оболонка після успішного входу ---
while true; do
    printf "${GREEN}${VALID_USER}@${HOSTNAME}:${CYAN}~${NC}$ "
    read -r cmd

    case "$cmd" in
        exit|logout)
            echo -e "  ${CYAN}Завершення сеансу. logout.${NC}\n"
            exit 0 ;;
        whoami)
            echo "  $VALID_USER" ;;
        pwd)
            echo "  /home/$VALID_USER" ;;
        ls)
            echo -e "  ${CYAN}Desktop  Documents  Downloads  projects  public_html${NC}" ;;
        date)
            date ;;
        clear)
            clear ;;
        "") ;;
        *)
            echo -e "  bash: $cmd: команда не знайдена (режим симуляції)" ;;
    esac
done
Виконання: bash login_simulation.sh
██████╗ ███╗ ██╗██╗ ██╗ ██╗ ██╗███╗ ██╗██╗ ██╗██╗ ██╗
ОС: Ubuntu 24.04 LTS | Ядро: 6.8.0-generic | Дата: 26.09.2026 13:25
 
Введіть облікові дані для авторизації:
 
sp-workstation login: admin
Password: ********
 
Login incorrect. Спроба помилкова.
Залишилось спроб: 2 з 3
 
sp-workstation login: admin
Password: *********
 
=================================================================
✓ Авторизація успішна! Ласкаво просимо, admin.
=================================================================
 
Системний статус (MOTD):
• Останній вхід : Sat Sep 26 13:25:10 2026 з 127.0.0.1
• Uptime : up 5 days, 12 hours
• Використання : Диск 34% (34G/100G) | RAM 2.4G/16G
 
admin@sp-workstation:~$ whoami
admin
admin@sp-workstation:~$ pwd
/home/admin
admin@sp-workstation:~
📌

Як протестувати локально:
1. Створіть файл скрипта: nano login_simulation.sh
2. Додайте права на виконання: chmod +x login_simulation.sh
3. Запустіть у терміналі: ./login_simulation.sh
Тестові дані для входу: логін: admin, пароль: linux2026.

Джерела інформації по темі GNU/Linux

Офіційні портали документації, книги, відкриті курси та корисні спільноти для поглибленого вивчення: