Директории за двоични файлове в Linux: Пълен технически справочник
Двоичните директории на Linux са стандартизираните местоположения във файловата система, където се намират изпълнимите програми, инструментите за системна администрация и споделените библиотеки. Стандартът за йерархия на файловата система (FHS) дефинира тези пътища, за да осигури последователно разполагане на софтуера в различните дистрибуции, позволявайки предвидимо разрешаване на `PATH`, чисто управление на пакети и надеждно възстановяване на системата — дори когато несъществените файлови системи не са налични.
За всеки администратор, управляващ среда за VPS Хостинг или сървър на голо желязо, знанието точно кой двоичен файл се намира къде — и защо — не е незадължително знание. То пряко влияе върху поведението при зареждане, разделянето на привилегии, стратегията за разполагане на софтуер и укрепването на сигурността.
Защо структурата на двоичните директории е важна
Преди да се потопим в отделните директории, си струва да разберем архитектурната логика зад разделението. FHS разделя файловата система на две фундаментални оси:
- Съществени срещу несъществени: Двоичните файлове, необходими за режим с един потребител и аварийен ремонт, трябва да бъдат налични преди монтирането на `/usr`. Всичко останало може да се намира под `/usr`.
- Системно срещу потребителско ниво: Двоичните файлове, предназначени за администриране на root ниво, са отделени от тези, достъпни за непривилегировани потребители, което позволява по-строг контрол на достъпа чрез разрешения на файловата система.
Тази философия на проектиране предхожда съвременните init системи, но остава дълбоко актуална. Неправилно конфигуриран `PATH`, двоичен файл, поставен в грешна директория, или липсваща символна връзка към библиотека могат безшумно да нарушат последователностите при зареждане, cron задачите или скриптовете за стартиране на услуги.
Основните двоични директории с един поглед
| Директория | Предназначение | Изисква root? | Налична преди монтиране на `/usr`? | Управлява се от |
|---|
| — | — | — | — | — |
|---|
| `/bin` | Съществени потребителски двоични файлове | Не | Да (или символна връзка) | Мениджър на пакети |
|---|
| `/sbin` | Съществени системни двоични файлове | Да | Да (или символна връзка) | Мениджър на пакети |
|---|
| `/usr/bin` | Стандартни потребителски двоични файлове | Не | Не | Мениджър на пакети |
|---|
| `/usr/sbin` | Несъществени системни двоични файлове | Да | Не | Мениджър на пакети |
|---|
| `/usr/local/bin` | Локално инсталирани потребителски двоични файлове | Не | Не | Администратор |
|---|
| `/usr/local/sbin` | Локално инсталирани системни двоични файлове | Да | Не | Администратор |
|---|
| `/opt` | Самостоятелен софтуер на трети страни | Варира | Не | Доставчик/Администратор |
|---|
| `/lib`, `/usr/lib` | Споделени библиотеки | Н/П | Варира | Мениджър на пакети |
|---|
/bin — Съществени потребителски двоични файлове
`/bin` съдържа минималния набор от изпълними файлове, необходими за зареждане на системата и за извършване на основни операции от потребителя в режим с един потребител или режим на възстановяване. Тези двоични файлове трябва да бъдат достъпни дори когато е монтирана само root файловата система.
Канонични примери: `ls`, `cp`, `mv`, `cat`, `bash`, `echo`, `grep`, `chmod`, `ln`, `mkdir`, `rm`, `ps`
Критична техническа подробност: При дистрибуции, базирани на systemd — включително Debian 10+, Ubuntu 20.04+, Fedora, Arch Linux и RHEL 8+ — `/bin` вече е символна връзка, сочеща към `/usr/bin`. Това е част от инициативата UsrMerge, която консолидира двоичните директории на root ниво в техните аналози в `/usr`, за да опрости проектирането на initramfs и да позволи атомарни актуализации на ОС. Можете да проверите това на всяка обединена система:
“`bash
ls -la /bin
lrwxrwxrwx 1 root root 7 /bin -> usr/bin
“`
Оперативно значение: Ако пишете shell скриптове, предназначени да работят в среди за възстановяване или ранни hooks при зареждане (напр. initramfs скриптове), никога не приемайте, че `/usr/bin` е наличен. Винаги използвайте `/bin/sh` като shebang и се позовавайте само на POSIX-мандатирани помощни програми.
/sbin — Съществени системни двоични файлове
`/sbin` съдържа двоични файлове, запазени за задачи по системна администрация, които трябва да бъдат изпълними по време на зареждане и операции по поправка на файловата система, преди да е налично пълното дърво на файловата система.
Канонични примери: `fsck`, `ifconfig`, `ip`, `reboot`, `shutdown`, `mkfs`, `mount`, `umount`, `fdisk`, `modprobe`, `init`
Нюанс на привилегиите: Въпреки че двоичните файлове в `/sbin` са *предназначени* за root употреба, те са изпълними за всички на повечето дистрибуции. Ограничението се налага от самите операции — `fsck` изисква достъп до суровото устройство, `mount` изисква `CAP_SYS_ADMIN` — а не от бита за изпълнение на двоичния файл. Това е честа причина за объркване при одити на сигурността.
Съвременен статус: Подобно на `/bin`, `/sbin` е символна връзка към `/usr/sbin` на системи с обединен usr. Разграничението между `/sbin` и `/bin` вече е предимно семантично и историческо, а не структурно.
/usr/bin — Основното хранилище на потребителски двоични файлове
`/usr/bin` е най-голямата и най-често достъпвана двоична директория при типична инсталация на Linux. Тя съдържа всички стандартни потребителски помощни програми за командния ред и приложения, инсталирани чрез системния мениджър на пакети, които не са необходими за аварийни операции.
Канонични примери: `vim`, `nano`, `git`, `python3`, `perl`, `gcc`, `curl`, `wget`, `ssh`, `tar`, `gzip`, `awk`, `sed`, `find`
Мащаб на практика: При минимална инсталация на Debian сървър, `/usr/bin` може да съдържа 200–400 двоични файла. Пълна инсталация на десктоп среда може да увеличи този брой над 2 000. Тази директория винаги е в стандартния `PATH` за всички потребители.
Собственост на мениджъра на пакети: Всеки файл тук се проследява от `dpkg`, `rpm` или еквивалента на вашата дистрибуция. Ръчното поставяне на файлове в `/usr/bin` е силно обезкуражено — надстройките на пакети могат безшумно да ги презапишат без предупреждение.
/usr/sbin — Несъществени двоични файлове за системна администрация
`/usr/sbin` съдържа инструменти за системна администрация, които не са необходими по време на процеса на зареждане или възстановяване в режим с един потребител, но са от съществено значение за ежедневното управление на сървъра.
Канонични примери: `apache2`, `nginx`, `sshd`, `useradd`, `userdel`, `usermod`, `groupadd`, `iptables`, `nftables`, `cron`, `logrotate`, `tcpdump`
Архитектурна прозорливост: Разделението на `/sbin` и `/usr/sbin` първоначално е проектирано така, че системният администратор да може да зареди в режим с един потребител и да извърши ремонти, без да е необходимо монтиране на `/usr`. На практика, при съвременни системи с initramfs и ранно потребителско пространство, това разграничение до голяма степен е изчезнало. Въпреки това, разбирането му остава от съществено значение при работа с по-стари системи RHEL 6/CentOS 6 или вградени Linux среди, където `/usr` може действително да е отделен дял.
/usr/local/bin — Потребителски двоични файлове, инсталирани от администратора
`/usr/local/bin` е правилното местоположение за двоични файлове, инсталирани ръчно — извън системния мениджър на пакети — и които трябва да бъдат достъпни за всички потребители на системата.
Типични случаи на употреба:
- Софтуер, компилиран от изходен код (напр. персонализирана компилация на `nginx` с нестандартни модули)
- Python скриптове, инсталирани чрез `pip install –prefix=/usr/local`
- CLI инструменти на трети страни, разпространявани като самостоятелни двоични файлове (напр. `kubectl`, `helm`, `terraform`, `hugo`)
- Персонализирани скриптове за автоматизация, които трябва да бъдат системно-широки
Приоритет в PATH: При стандартна FHS-съвместима система, `/usr/local/bin` се появява *преди* `/usr/bin` в стандартния `PATH`. Това означава, че двоичен файл, поставен тук, ще засени двоичен файл с управление от пакети със същото име. Това е умишлено — позволява локалните персонализации да заменят стандартните настройки на дистрибуцията — но е и честа причина за фини грешки, когато версиите се разминават.
“`bash
echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
“`
Съображение за сигурност: Тъй като `/usr/local/bin` не се одитира от мениджъра на пакети, двоичните файлове, поставени тук, не получават автоматични актуализации за сигурност. На сървъри, изпълняващи производствени натоварвания — включително тези на Dedicated сървъри — установете ръчен цикъл на актуализиране или използвайте инструмент за управление на конфигурации (Ansible, Puppet, Chef) за проследяване и актуализиране на тези двоични файлове.
/usr/local/sbin — Системни двоични файлове, инсталирани от администратора
`/usr/local/sbin` отразява връзката между `/sbin` и `/bin`, но на локално ниво. Това е правилното местоположение за ръчно инсталирани инструменти за системна администрация, които изискват повишени привилегии или са предназначени само за root.
Типични случаи на употреба:
- Персонализирани скриптове за резервно копиране, изпълнявани като root чрез cron
- Ръчно компилирани агенти за мониторинг (напр. персонализирана компилация на `node_exporter`)
- Административни обвиващи скриптове, извикващи привилегировани системни извиквания
- Помощни програми за управление, предоставени от доставчика, разпространявани като tarball файлове, а не като пакети
Оперативна дисциплина: Поддържайте `README` или инвентарен файл в `/usr/local/sbin`, документиращ произхода, версията и процедурата за актуализиране на всеки двоичен файл. На споделена инфраструктура, недокументираните двоични файлове в тази директория представляват отговорност за сигурността и одитируемостта.
/opt — Самостоятелни приложения на трети страни
`/opt` е проектирана за софтуерни пакети, които не отговарят на структурата на директориите на FHS — обикновено търговски или собственически приложения, големи софтуерни пакети, разпространявани от доставчици, и приложения, които включват собствени библиотеки, за да избегнат конфликти на зависимости.
Канонични примери:
- `/opt/google/chrome/` — браузър Google Chrome
- `/opt/lampp/` — стек XAMPP
- `/opt/pycharm/` — JetBrains PyCharm IDE
- `/opt/gitlab/` — Omnibus GitLab инсталация
- `/opt/aws/` — AWS CLI v2 и SSM Agent
Структурна конвенция: Всяко приложение под `/opt` трябва да заема собствена поддиректория, следвайки шаблона `/opt/<provider>/` или `/opt/<package>/`. Двоичните файлове на приложението обикновено се намират в `/opt/<package>/bin/`, а от доставчика се очаква да инсталира символна връзка в `/usr/local/bin` или да модифицира `/etc/profile.d/`, за да добави пътя.
Кога да използвате `/opt` срещу `/usr/local`: Използвайте `/opt`, когато софтуерът се доставя като самостоятелен пакет със собствени библиотеки, конфигурация и директории с данни. Използвайте `/usr/local/bin` за инструменти с един двоичен файл или скриптове, които се интегрират чисто със съществуващия системен стек от библиотеки.
Реален граничен случай: GitLab Omnibus се инсталира изцяло под `/opt/gitlab/` и управлява собствени инстанции на PostgreSQL, Redis и Nginx. Тази изолация е умишлена — предотвратява конфликти на версии с услуги на системно ниво. Въпреки това, тя означава също, че инструментите за мониторинг на системно ниво няма автоматично да открият тези процеси, освен ако не са изрично конфигурирани да търсят в `/opt`.
/lib, /usr/lib, /lib64 и /usr/lib64 — Споделени библиотеки
Тези директории съдържат файловете на споделените обекти (файлове `.so`), от които двоичните файлове в съответните двоични директории зависят по време на изпълнение. Те не са изпълними в традиционния смисъл, но се зареждат в паметта на процеса от динамичния свързващ редактор (`ld-linux.so`).
Ключови директории и техните роли:
- `/lib` — Споделени библиотеки, необходими за двоичните файлове в `/bin` и `/sbin`. На системи с обединен usr — символна връзка към `/usr/lib`.
- `/usr/lib` — Основното хранилище за всички системни споделени библиотеки. Тук се намират библиотеките, управлявани от пакети.
- `/lib64` — 64-битов вариант на `/lib` при multilib системи (разпространен при x86_64 RHEL/CentOS). Често символна връзка към `/usr/lib64`.
- `/usr/lib64` — 64-битови споделени библиотеки при RPM-базирани дистрибуции.
- `/usr/local/lib` — Библиотеки, инсталирани заедно с ръчно компилиран софтуер.
- `/usr/lib/x86_64-linux-gnu/` — Debian/Ubuntu multiarch път за библиотеки, позволяващ съвместното съществуване на 32-битови и 64-битови библиотеки.
Механика на динамичния свързващ редактор по време на изпълнение: Когато се изпълнява двоичен файл, ядрото предава управлението на динамичния свързващ редактор, посочен в ELF заглавието (обикновено `/lib64/ld-linux-x86-64.so.2`). Свързващият редактор разрешава зависимостите на споделените библиотеки, използвайки кеша, изграден от `ldconfig`, който чете `/etc/ld.so.conf` и неговата директория за включване. Ако библиотека е инсталирана, но `ldconfig` не е бил изпълнен, двоичният файл ще се провали с грешка „споделена библиотека не е намерена”, дори ако файлът съществува.
“`bash
After installing a library to /usr/local/lib, always run:
ldconfig
Verify library resolution for a specific binary:
ldd /usr/bin/curl
“`
Честа грешка: Инсталирането на персонализирана компилирана библиотека в `/usr/local/lib` без последващо изпълнение на `ldconfig` е една от най-честите причини за грешки „cannot open shared object file” на Linux сървъри. Това е особено разпространено при изграждане на софтуер от изходен код на VPS с cPanel или подобни управлявани среди, където процесът на изграждане може да няма root достъп за изпълнение на `ldconfig`.
UsrMerge: Съвременна консолидация на файловата система
Инициативата UsrMerge (или `usr-merge`) заслужава специално внимание, тъй като фундаментално променя мисловния модел, който много администратори носят от по-стари системи.
Проблемът, който решава: Исторически, `/bin`, `/sbin`, `/lib` и `/lib64` са съществували като независими директории в root файловата система, отделени от `/usr`. Това изисквало initramfs да съдържа минимален набор от инструменти за монтиране на `/usr` преди пълната система да може да се инициализира. Тъй като initramfs стана универсален и `/usr` започна да се третира като том само за четене, потенциално монтиран по мрежата или управляван чрез снимки, разделението се превърна в пречка за атомарни актуализации и разполагания, базирани на образи.
Какво се промени: При обединени системи директориите на root ниво стават символни връзки:
“`
/bin -> usr/bin
/sbin -> usr/sbin
/lib -> usr/lib
/lib64 -> usr/lib64
“`
Дистрибуции, завършили UsrMerge:
- Fedora (от Fedora 17, 2012 г.)
- Arch Linux (от 2013 г.)
- Debian (от Debian 12 Bookworm, 2023 г.)
- Ubuntu (от Ubuntu 21.10)
- RHEL/CentOS (от RHEL 7)
Практическо въздействие: Скриптовете, които твърдо кодират `/bin/bash`, все още работят, тъй като `/bin` е символна връзка към `/usr/bin`. Въпреки това, скриптовете, които се опитват да определят дали даден път е „съществен”, като проверяват дали започва с `/bin` вместо с `/usr/bin`, ще дадат неверни резултати. Актуализирайте всяка такава логика в инструментите ви за автоматизация.
Разрешения на двоичните директории и укрепване на сигурността
Разбирането на двоичните директории е неотделимо от разбирането на техните последствия за сигурността. Няколко мерки за укрепване се прилагат директно към тези пътища.
Препоръчителни базови линии за разрешения:
| Директория | Собственик | Група | Разрешения |
|---|
| — | — | — | — |
|---|
| `/usr/bin` | root | root | `755` |
|---|
| `/usr/sbin` | root | root | `755` |
|---|
| `/usr/local/bin` | root | root | `755` |
|---|
| `/usr/local/sbin` | root | root | `750` или `755` |
|---|
| `/opt/<package>` | root | root | `755` |
|---|
SUID/SGID двоични файлове: Някои двоични файлове в `/usr/bin` и `/usr/sbin` носят SUID бита, позволявайки им да се изпълняват с повишени привилегии независимо кой ги извиква. Примерите включват `passwd`, `sudo`, `su` и `ping`. Одитирайте ги редовно:
“`bash
find /usr/bin /usr/sbin /bin /sbin -perm /4000 -o -perm /2000 2>/dev/null
“`
Неизменяеми флагове: При системи с висока сигурност, помислете за прилагане на `chattr +i` към критични двоични файлове или монтиране на `/usr` само за четене. Това предотвратява модификация по време на изпълнение от зловреден софтуер или компрометиран процес, въпреки че изисква повторно монтиране с право на запис за легитимни актуализации на пакети.
Опция за монтиране `noexec`: Монтирането на `/tmp` и `/var/tmp` с `noexec` предотвратява директното изпълнение на двоични файлове, поставени там — разпространена техника при атаки с уеб обвивки. Това не засяга самите двоични директории, но е допълнителна мярка за укрепване, актуална за всеки сървър, изпълняващ уеб приложения, включително тези, използващи среди за Споделен уеб хостинг.
Променливата на средата PATH и редът на разрешаване на двоични файлове
Променливата `PATH` определя реда, в който обвивката търси директории за изпълними файлове. Разбирането на този ред е от съществено значение за отстраняване на грешки „command not found” и за умишлено засенчване на двоични файлове.
Типичен root PATH при система Debian/Ubuntu:
“`
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
“`
Типичен PATH за непривилегирован потребител:
“`
/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games
“`
Ключови наблюдения:
- `/usr/local/bin` предхожда `/usr/bin`, така че локално инсталираните двоични файлове засенчват управляваните от пакети.
- `/sbin` и `/usr/sbin` отсъстват от стандартния PATH на непривилегирован потребител при някои дистрибуции, поради което изпълнението на `ifconfig` като не-root потребител може да се провали с „command not found”, дори ако двоичният файл съществува.
- Когато услуга се изпълнява под потребителски акаунт, различен от root (напр. потребител на уеб приложение), нейният PATH може да бъде още по-ограничен. Винаги използвайте абсолютни пътища в unit файловете на услугите и cron задачите.
Отстраняване на проблеми с PATH:
“`bash
Find all instances of a binary across PATH directories:
which -a python3
Show full PATH resolution including aliases and functions:
type -a python3
Check the effective PATH for a specific service:
systemctl show myservice | grep -i environment
“`
Практическа матрица за вземане на решения: Къде да инсталирате двоичен файл
При разполагане на софтуер на Linux сървър — независимо дали е компилиран инструмент, изтеглен двоичен файл или персонализиран скрипт — използвайте тази рамка за вземане на решения:
Управлява ли се от системния мениджър на пакети?
- Да: Мениджърът на пакети го поставя автоматично в `/usr/bin` или `/usr/sbin`. Не го премествайте.
Единичен двоичен файл или скрипт, инсталиран ръчно, предназначен за всички потребители?
- Инструмент за потребителя: `/usr/local/bin`
- Инструмент за root/администратор: `/usr/local/sbin`
Самостоятелен пакет приложение със собствени зависимости?
- Използвайте `/opt/<vendor>/<package>/` и създайте символна връзка към основния двоичен файл в `/usr/local/bin`
Временен или специфичен за потребителя инструмент?
- Поставете го в `~/bin` (създайте, ако отсъства) и добавете `~/bin` към личния си `PATH` в `~/.bashrc` или `~/.profile`
Споделена библиотека за ръчно компилирано приложение?
- Инсталирайте в `/usr/local/lib`, след което изпълнете `ldconfig`
Тази рамка предотвратява най-разпространената форма на ентропия на файловата система при дълго работещи сървъри: двоични файлове, разпръснати на произволни места, невидими за мениджъра на пакети и забравени от администратора, който ги е инсталирал.
Контролен списък с технически ключови изводи
- Проверете статуса на UsrMerge на вашата система с `ls -la /bin /sbin /lib`. Ако са символни връзки, `/bin` и `/usr/bin` са идентични пространства от имена.
- Никога не поставяйте файлове директно в `/usr/bin` или `/usr/sbin` — надстройките на пакети ще ги презапишат безшумно.
- Винаги изпълнявайте `ldconfig` след инсталиране на споделени библиотеки в `/usr/local/lib` или друг нестандартен път.
- Използвайте абсолютни пътища в cron задачи, systemd unit файлове и init скриптове — никога не разчитайте на правилно зададен `PATH` в неинтерактивни контексти.
- Одитирайте SUID/SGID двоичните файлове тримесечно на производствени сървъри: `find /usr /bin /sbin -perm /6000 -type f`
- Документирайте всеки двоичен файл, инсталиран в `/usr/local/` и `/opt/`, с версия, URL на източника и дата на инсталиране в система за управление на конфигурации или поне в локален дневник на промените.
- При системи с обединен usr, актуализирайте всяка автоматизация, която разграничава „съществените” двоични файлове по префикс на пътя — разграничението вече е чисто семантично.
- При разполагане на приложения на VPS контролни панели или управлявани хостинг среди, потвърдете дали контролният панел модифицира `PATH` или инсталира собствени версии на двоични файлове под `/opt` или `/usr/local`, тъй като това може да причини конфликти на версии със системните инструменти.
- За инструменти, свързани с SSL (`openssl`, `certbot`), потвърдете коя версия на двоичния файл се извиква — остаряла ръчно инсталирана версия в `/usr/local/bin` ще засени управляваната от пакети версия и може да носи непоправени уязвимости. Съчетайте това с правилно управление на SSL сертификати, за да гарантирате, че криптографската ви верига от инструменти е актуална от край до край.
Често задавани въпроси
Каква е разликата между `/bin` и `/usr/bin` при съвременен Linux?
При съвременни дистрибуции, завършили UsrMerge, няма функционална разлика — `/bin` е символна връзка към `/usr/bin`. Исторически, `/bin` е съдържал само двоичните файлове, необходими преди монтирането на `/usr`, докато `/usr/bin` е съдържал всичко останало. Разграничението вече е семантично при обединени системи, но остава архитектурно значимо при по-стари или вградени Linux инсталации.
Защо поставянето на двоичен файл в `/usr/local/bin` замества същия двоичен файл в `/usr/bin`?
Защото `/usr/local/bin` се появява по-рано в стандартния `PATH` от `/usr/bin`. Обвивката разрешава команди, като търси директориите на `PATH` отляво надясно и изпълнява първото съвпадение, което намери. Това наредяване е умишлено — позволява на администраторите да разполагат локални замени, без да модифицират файлове, управлявани от пакети.
Какво се случва, ако забравя да изпълня `ldconfig` след инсталиране на споделена библиотека?
Кешът на динамичния свързващ редактор (`/etc/ld.so.cache`) няма да включва новата библиотека и всеки двоичен файл, зависещ от нея, ще се провали по време на изпълнение с грешка като `error while loading shared libraries: libfoo.so.1: cannot open shared object file: No such file or directory`. Изпълнението на `sudo ldconfig` незабавно възстановява кеша и решава проблема.
Безопасно ли е да инсталирам софтуер директно в `/usr/bin` вместо в `/usr/local/bin`?
Не. Файловете в `/usr/bin` са собственост на мениджъра на пакети и се проследяват от него. Бъдеща надстройка на пакет или системна актуализация може да презапише, премести или изтрие всеки файл в тази директория без предупреждение. Винаги използвайте `/usr/local/bin` за ръчно инсталирани двоични файлове, за да поддържате чисто разделение между управлявания от пакети и управлявания от администратора софтуер.
Как да намеря от коя директория се изпълнява дадена команда?
Използвайте `which <command>` за бързо търсене на първото съвпадение в `PATH`, или `type -a <command>` за изброяване на всички съвпадения, включително вградени в обвивката, псевдоними и всяка инстанция в всички директории на `PATH`. За окончателен отговор, включително разрешаване на символни връзки, използвайте `readlink -f $(which <command>)`.
