Когда вы заходите на незнакомый сервер, первый вопрос обычно один: где что лежит. Конфиг сервиса, лог, бинарник, временный файл сборки. Стандарт FHS (Filesystem Hierarchy Standard) дает на это ответ заранее: он описывает, какой каталог за что отвечает, чтобы администратор и пакеты не гадали. В этом уроке разберем назначение ключевых каталогов корня и четыре инструмента поиска - find, locate, whereis, which/type, - а заодно почему locate в 2026 это почти всегда plocate.

Как это работает
FHS делит файлы по двум осям. Первая ось - изменяемость: статичные данные (бинарники, библиотеки) отделены от переменных (логи, очереди, базы). Вторая ось - разделяемость: то, что можно смонтировать по сети и отдать многим машинам, отделено от локального. Отсюда и логика: /usr - статичный и разделяемый, /var - переменный, /etc - локальная конфигурация конкретного хоста.
Корень / должен содержать минимум, достаточный для загрузки и аварийного ремонта. Исторически /bin, /sbin, /lib были отдельно от /usr именно ради этого. В современных дистрибутивах (Debian, Ubuntu, Fedora, RHEL) действует usr-merge: /bin, /sbin, /lib - это просто символические ссылки на /usr/bin, /usr/sbin, /usr/lib. Различие "обычные утилиты против /sbin для администратора" сегодня скорее историческое, но в PATH root оно еще встречается.
Отдельная категория - виртуальные файловые системы. /proc - это интерфейс к ядру и процессам: каталог /proc/PID на каждый процесс, /proc/cpuinfo, /proc/meminfo. /sys (sysfs) описывает устройства и драйверы. /dev - файлы устройств, которые на лету создает devtmpfs и наполняет udev. Этих файлов нет на диске, они существуют только в памяти, поэтому искать по ним find бессмысленно и вредно.
Поиск делится на два подхода. find обходит дерево вживую прямо сейчас - точно, но медленно на больших ФС. locate ищет по заранее построенной базе имен путей, которую обновляет updatedb (обычно по таймеру systemd) - мгновенно, но база может отставать от реальности. whereis и which/type решают узкую задачу: найти, откуда запустится конкретная команда.
Команды и примеры
Карта корня по FHS:
Код: Выделить всё
/ корень, минимум для загрузки
/etc конфигурация этого хоста (без бинарников)
/bin основные команды (-> /usr/bin при usr-merge)
/sbin системные/админские команды (-> /usr/sbin)
/usr статичные данные: /usr/bin, /usr/lib, /usr/share
/var переменное: /var/log, /var/cache, /var/lib, /var/spool
/tmp временное, чистится при перезагрузке (часто tmpfs в RAM)
/opt стороннее ПО отдельным деревом /opt/<vendor>
/home домашние каталоги пользователей
/proc процессы и параметры ядра (виртуальная)
/sys устройства и драйверы, sysfs (виртуальная)
/dev файлы устройств (devtmpfs + udev)
Код: Выделить всё
# файлы крупнее 100 МБ в /var
find /var -type f -size +100M
# .conf в /etc, измененные за сутки
find /etc -name '*.conf' -mtime -1
# удалить старые логи безопасно, без xargs-сюрпризов
find /var/log -name '*.log.*' -mtime +30 -delete
# выполнить команду для каждого файла
find /home -name '*.sql' -exec gzip {} \;
Код: Выделить всё
# Debian/Ubuntu
apt install plocate
# RHEL/Fedora
dnf install plocate
# найти все nginx.conf
locate nginx.conf
# обновить базу вручную (нужен root)
sudo updatedb
Код: Выделить всё
whereis ssh
# ssh: /usr/bin/ssh /usr/share/man/man1/ssh.1.gz
type -a ls
# ls is aliased to `ls --color=auto'
# ls is /usr/bin/ls
which python3
# /usr/bin/python3
- locate ничего не находит сразу после установки пакета - база еще не построена. Запустите updatedb или дождитесь таймера; новые файлы база не видит до обновления.
- locate показывает удаленные файлы. База статична, файла уже нет - проверяйте существование или используйте locate -e.
- Путаница mlocate и plocate. Старый mlocate почти везде заменен на plocate (быстрее, компактнее). Команда та же - locate, - но база и формат другие; параллельно держать оба не нужно.
- Попытка искать через find по /proc или /sys. Это виртуальные ФС, обход тонет в спецфайлах и может зависнуть. Исключайте их или указывайте конкретный путь.
- which показывает не то, что выполнится в вашем шелле. which - внешняя программа и не знает про алиасы и функции; для точного ответа берите type.
- Запись пакетами в /usr/local или своего ПО прямо в /usr вручную. Стороннее кладите в /opt, локально собранное - в /usr/local, чтобы не конфликтовать с менеджером пакетов.
- Выполните ls -ld /bin /sbin /lib и определите, включен ли на вашем стенде usr-merge (ссылки или реальные каталоги).
- Командой find найдите в /etc все файлы, измененные за последние 7 дней: find /etc -type f -mtime -7.
- Установите plocate, выполните sudo updatedb и найдите locate sshd_config.
- Создайте файл touch /tmp/labtest.txt, сразу запустите locate labtest - убедитесь, что его нет в базе. Сделайте updatedb и повторите.
- Сравните вывод which, whereis и type -a для команды cat и объясните разницу.
- Прочитайте /proc/self/status и /proc/cpuinfo через less - убедитесь, что это виртуальные данные, а не файлы на диске.
- Чем принципиально различается назначение /etc, /var и /usr по двум осям FHS (изменяемость и разделяемость)?
- Почему find /proc - плохая идея, и где физически хранятся файлы из /proc, /sys, /dev?
- В каких случаях locate даст неверный результат и как этого избежать?
- Чем вывод which отличается от type -a и почему type точнее в интерактивном шелле?
- Что такое usr-merge и как проверить, включен ли он на конкретной системе?
- Куда по FHS следует устанавливать стороннее проприетарное ПО и локально собранные программы?