15%

Спести 15% на всички хостинг услуги

Тествай уменията си и получи Отстъпка за всеки хостинг план

Използвайте код:

Skills
За начало
09.10.2024

Директории за двоични файлове в 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`rootroot`755`
`/usr/sbin`rootroot`755`
`/usr/local/bin`rootroot`755`
`/usr/local/sbin`rootroot`750` или `755`
`/opt/<package>`rootroot`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>)`.

15%

Спести 15% на всички хостинг услуги

Тествай уменията си и получи Отстъпка за всеки хостинг план

Използвайте код:

Skills
За начало