Определение

podman позволяет входить в другой USER и MNT namespace без запуска контейнера, чтобы посмотреть что происходит не выходя за рамки обычного процесса (к слову, это лишь удобная надстройка над обычной командой unshare)

Подготовка

Проверяем поведение в другом USER namespace:

# Смотрим UID mapping
podman unshare cat /proc/self/uid_map

# Выведет nobody
podman unshare ls -ld /

# Проверяем USER/MNT namespace на хосте и в изолированном namespace
ls -l /proc/self/ns/user /proc/self/ns/mnt
podman unshare ls -l /proc/self/ns/user /proc/self/ns/mnt

Проверяем поведение в другом MNT namespace:

echo hello > /tmp/testfile
mount --bind /tmp/testfile /etc/shadow
mount: /etc/shadow: must be superuser to use mount.

podman unshare bash -c "mount -o bind /tmp/testfile /etc/shadow; cat /etc/shadow"
hello

Практика

Теперь перейдем к просмотру содержимого образа при помощи podman mount

В общем виде команда для просмотра выглядит так: podman mount <URL/Image> (можно использовать имя образа или путь к нему для предварительного podman pull ) Но podman mount требует либо повышения привилегий, либо запуск в изолированном USER namespace и тут на помощь приходит команда podman unshare, которая создает выделенный USER и MNT namespace

Помимо этого потребуется команда podman image mount, которая монтирует ФС из образа в ФС хоста и выводит полный путь к ней на хосте

Let’s try:

# Заходим в другой namespace
podman unshare

# Записываем путь в переменную
mnt=$(podman image mount <URL/image>)

# Теперь можно исследовать ФС образа
ls $mnt/var/
cat $mnt/etc/shadow

# Для завершения работы с образом
podman image unmount <URL/image>
exit