В Linux всё начинается с одного корня /. Диски, флешки и сетевые шары не получают букв, а монтируются в каталоги этого дерева.
Куда что кладут
/etc: конфиги системы и сервисов./var: изменяемые данные: логи (/var/log), очереди, кеши, базы./home/<user>: домашние каталоги, у root свой/root./tmp: временные файлы, часто чистится при перезагрузке./usr/bin,/usr/lib: программы и библиотеки из пакетов;/usr/localдля собранного вручную;/optдля сторонних приложений целиком./procи/sys: виртуальные ФС ядра. Это не файлы на диске, а окно в состояние процессов и устройств./dev: файлы устройств (/dev/sda,/dev/null).
Inode и имя файла
Файл на диске это inode: номер, владелец, права, размер, время и указатели на блоки данных. Имени в inode нет. Имя живёт в каталоге: каталог это таблица «имя → номер inode». Поэтому:
ls -iпоказывает номер inode;mvвнутри одной ФС только переписывает запись в каталоге, данные не копируются;- место может кончиться по inode, когда байты ещё есть (миллионы мелких файлов). Проверка:
df -i.
Жёсткие и символьные ссылки
ln data.txt hard.txt # жёсткая: вторая запись на тот же inode
ln -s data.txt soft.txt # символьная: отдельный файл с путём внутри
Жёсткая ссылка равноправна с оригиналом: удалили data.txt, данные живы, пока счётчик ссылок (вторая колонка ls -l) больше нуля. Нельзя делать на каталог и между разными ФС. Символьная ссылка хранит путь: удалили цель, ссылка «висит». Зато работает на каталоги и через границы ФС.
Права: rwx для трёх классов
-rwxr-x--- 1 deploy www 4096 ... app.sh
Первый символ: тип (- файл, d каталог, l ссылка). Дальше три тройки: владелец, группа, остальные. Цифрами: r=4, w=2, x=1, значит rwxr-x--- это 750.
Для каталога смысл другой:
r: можно прочитать список имён;w: можно создавать, удалять и переименовывать файлы внутри (даже чужие, если нет sticky bit);x: можно войти и обратиться к файлу по имени.
Удаление файла зависит от прав на каталог, а не на сам файл.
chmod 640 secret.conf # rw-r-----
chmod u+x,g-w deploy.sh # символьная форма
chown deploy:www app.sh # владелец и группа
chmod -R g+rX shared/ # X: x только каталогам и уже исполняемым
umask
umask убирает биты у новых файлов. Базовые права: 666 для файлов, 777 для каталогов. При umask 022 файл получит 644, каталог 755. При umask 027 файл 640, каталог 750. Бит x новому файлу umask не добавит никогда.
Специальные биты
- SUID (
4xxx,sв правах владельца): программа запускается с правами владельца файла. Пример:/usr/bin/passwdпишет в/etc/shadow, принадлежащий root. На скриптах ядро SUID игнорирует. - SGID (
2xxx): на каталоге новые файлы наследуют группу каталога. Удобно для общих папок команды. - Sticky bit (
1xxx,tв конце): в каталоге удалить файл может только его владелец. Так устроен/tmp(1777).
Поиск SUID-файлов при аудите: find / -perm -4000 -type f 2>/dev/null.
Root и capabilities
Root (UID 0) обходит проверки прав. Современное ядро дробит его силу на capabilities: например CAP_NET_BIND_SERVICE разрешает слушать порты ниже 1024 без полного root. Это основа безопасности контейнеров.
Частые ошибки
- Ставят
chmod 777, чтобы «заработало». Чинить надо владельца или группу. - Путают права каталога и файла: файл
600, а его всё равно удалили, потому что каталог доступен на запись. - Делают
chmod -R 755по всему проекту и получают исполняемые конфиги. Для смешанных деревьев естьXилиfind -type d/find -type f. - Думают, что удаление файла освобождает место. Если процесс держит файл открытым, место вернётся только после закрытия (об этом в модуле про диски).
Что спросят на собесе
- Что такое inode и чем жёсткая ссылка отличается от символьной.
- Как читать
-rwxr-x---и что значитxу каталога. - Какие права получит новый файл при umask 027.
- Что такое SUID, SGID и sticky bit, зачем sticky у
/tmp. - Почему место на диске есть, а файл создать нельзя.