Большой, который я слушаю регулярно, является Шоу Действия Linux. Предъявитель шоу говорит настолько быстро, Вы получаете путь больше фактов/час, чем какой-либо другой подкаст Linux... забавный в местах также.
$ sudo ack-grep -a 'MyString' /
Я использовал для этого системные контейнеры (чтобы они могли запускаться автоматически при загрузке), но с маппируемыми UID/GIDs (пространства имен пользователей).
редактируйте /etc/subuid,subgid (я отобразил uid/gids 10M-100M в корне и использовал 100K на контейнер)
$ sudo ack-grep -aG '.*txt' MyString
для первого контейнера, используйте u/gids 10000000-10099999 в /var/lib/lxc/CTNAME/config
смонтируйте контейнерное хранилище на /var/lib/lxc/CTNAME/rootfs (или ничего не делайте, если не используете отдельный том/набор данных/что бы ни было на контейнер)
$ ack-grep --cpp 'SomeFunctionName'
chown 10000000: 10000000 /var/lib/lxc/CTNAME/rootfs
lxc-usernsexec -m b:0:10000000:100000 -- /bin/bash
Теперь вы в первом пользовательском пространстве имен контейнеров. Все то же самое, но ваш процесс считает, что uid равен 0, в то время как на самом деле в пространстве имён хоста это uid 10000000. Проверьте /proc/self/uid_map, чтобы узнать, отображен ваш uid или нет. Вы заметите, что больше не можете читать из /root и кажется, что он никому не принадлежит/nogroup.
Находясь в пространстве имён пользователей, Я rsync с оригинального хоста.
Вне пространства имен пользователей вы увидите, что файлы в /var/lib/lxc/CTNAME/rootfs теперь принадлежат не ожидаемым (таким же) uids, как в исходной установке, а скорее 10000000+remote_uid. Это то, что вам нужно.
Вот и все. Когда вы синхронизируете данные, удалите все из /etc/fstab контейнера, чтобы он не пытался монтировать вещи, и он должен запуститься. Могут быть и другие изменения, проверьте, что делает LXC-шаблон для контейнерного дистрибутива. Вы определённо можете удалить ядро, grub, ntp и любые аппаратные пакеты в контейнере (вам даже не нужно запускать его, вы можете chroot в контейнер из пользовательского пространства имен)Если у вас нет запущенной удалённой ВМ, вы также можете смонтировать оригинальное хранилище ВМ в пространстве имён хоста и rsync/SSH обратно в localhost. Эффект будет тот же самый. Если вы (как кажется) просто хотите изменить контейнер с привилегиями на непривилегированный, вы можете просто добавить отображение uid/gid, добавить отображение, как описано выше, в конфигурацию контейнера, а затем сделать что-нибудь вроде:
Это должно быть все, что нужно сделать, теперь вы должны быть в состоянии запустить контейнер без привилегий. Приведенный выше пример крайне неэффективен, uidshift, вероятно, сделает это лучше (но я его еще не использовал).
HTH.[1178541]
Я хотел предупредить, что примерный код Борута Мрака изменит права собственности на файлы в хост-системе, а также когда символьные ссылки указывают на эти файлы в контейнере! Совсем не то, чего бы ты хотел!
Вы должны использовать флаг -h для chown/chgrp и/или -mount для поиска в случае, если у вас есть выделенная файловая система.
Вот моя более быстрая более умная версия:
find "/var/lib/lxc/$name/rootfs" -mount -uid '-65536' -printf '%U\n'|sort -n|uniq|while read i; do
find "/var/lib/lxc/$name/rootfs" -mount -uid "$i" -exec chown -h "$((200000+i))" \{\} \;
done
find "/var/lib/lxc/$name/rootfs" -mount -gid '-65536' -printf '%G\n'|sort -n|uniq|while read i; do
find "/var/lib/lxc/$name/rootfs" -mount -gid "$i" -exec chgrp -h "$((200000+i))" \{\} \;
done
Alpine Linux теперь использует uidmapshift
, преобразованный в lua
для преобразования привилегированных контейнеров в непривилегированные. Посмотрите на initd
скрипт, чтобы увидеть другие разрешения и требования к папкам, которые устанавливаются/создаются. (/etc/subuid
& /etc/subgid
)