Представьте ситуацию: вам нужно протестировать скрипт от имени пользователя, которого нет в системе. Создавать аккаунты через useradd
неудобно, да и права root не всегда доступны. Именно здесь на помощь приходят Linux Namespaces – механизм изоляции процессов, позволяющий “притвориться” другим пользователем без реальных изменений в системе.
Почему chown и fakeroot не всегда работают
Допустим, вы попробовали классический подход с unshare --user
, чтобы создать изолированное пространство. Но при попытке изменить владельца файла через chown 1 a
получили ошибку Invalid argument. Дело в том, что по умолчанию вашему текущему пользователю не разрешено мапить произвольные UID (это касается безопасности системы).
Кстати, ошибка возникает потому, что внутри namespace UID 1 не сопоставлен с реальным пользователем системы. Без явного указания диапазона через
/etc/subuid
ядро блокирует операцию.
Тут может показаться, что fakeroot
– спасение. Он действительно эмулирует root-права через LD_PRELOAD, но есть нюанс: вы по-прежнему не можете запустить процесс от имени произвольного UID. Попытка su 3
упрётся в отсутствие записи в /etc/passwd
, а создавать её без прав администратора – проблематично.
Как настроить User Namespace правильно
Всё решается через маппинг UID с помощью unshare --map-users
. Для этого:
1. Проверьте свой выделенный диапазон в /etc/subuid
. Например, строка user:2000000:65536
означает, что ваш аккаунт может использовать UID от 2000000 до 2065535.
2. Запустите namespace с маппингом:
unshare -r --map-users=1:2000000:1000 bash
Здесь 1
– начальный внутренний UID, 2000000
– внешний UID из subuid, 1000
– количество доступных ID.
3. Теперь внутри namespace можно свободно менять владельцев:
touch test_file
chown 1:1 test_file # больше не вызывает ошибки
Но как запустить процесс от имени другого UID? Тут пригодится setpriv
– утилита для управления привилегиями:
setpriv --reuid=1 --regid=1 --init-groups /bin/bash -c "id"
Команда id
в этом случае покажет uid=1 gid=1
, хотя в реальной системе пользователя с таким ID нет. Если вдруг возникнет ошибка failed to drop privileges, проверьте, что в команде unshare использовался флаг -r
(он активирует полный маппинг root внутри namespace).
Обход ограничений /etc/passwd
Некоторые инструменты (например, sudo) требуют наличия пользователя в системных файлах. Для изоляции можно подменить /etc/passwd
через mount namespace:
- Создайте файл
passwd.fake
с нужными записями - Примонтируйте его поверх оригинального:
unshare -m -r
mount --bind ~/passwd.fake /etc/passwd
Важно: после этого все процессы в namespace будут видеть только вашу “фейковую” версию файла. Но не забывайте – изменения остаются внутри namespace и не затрагивают основную систему.
Если столкнётесь с ошибкой mount: permission denied, проверьте, что namespace создан с флагом -m
(активирует отдельный mount namespace) и что вы внутри выполнили unshare -r
(подлючение user namespace).
Совет: для сложных сценариев комбинируйте разные типы namespaces. Например, добавьте
--pid
для изоляции процессов или--net
для виртуальной сети.
Теперь вы можете эмулировать многопользовательскую среду без риска сломать систему. Этот подход особенно полезен для тестирования скриптов, разработки в изолированном окружении или обучения работе с правами в Linux. Главное – помните про границы namespaces: всё, что создаётся внутри, остаётся внутри.