использование chroot-тюрьмы для изменения результатов uname -n

Я только что узнал, что такое chroot jail, так что извините, если эти вопросы не имеют особого смысла.

В основном у меня есть два процесса, выполняющихся локально на моей машине, и хотелось бы, чтобы результаты «uname -n» были разными для каждого из этих процессов (и всех их дочерних элементов). Как я могу использовать chroot-тюрьму, чтобы сделать это для меня?

Вы не можете сделать это с помощью chroot. Но вы можете сделать это, изменив пространство имен UTS , например, используя unshare .

mysystem# unshare --uts sh -c 'hostname test; uname -n'; uname -n test mysystem 

То же, в интерактивном режиме:

Первый терминал:

 mysystem# unshare --uts bash mysystem# hostname test mysystem# exec bash # to refresh prompt test# uname -n test test# strace uname -n 2>&1|tail brk(NULL) = 0x5592a93f6000 brk(0x5592a9417000) = 0x5592a9417000 uname({sysname="Linux", nodename="test", ...}) = 0 fstat(1, {st_mode=S_IFIFO|0600, st_size=0, ...}) = 0 write(1, "test\n", 5test ) = 5 close(1) = 0 close(2) = 0 exit_group(0) = ? +++ exited with 0 +++ test# 

Второй терминал, без изменений:

 mysystem# uname -n mysystem mysystem# 

Просто выйдя из оболочки на первом терминале, возвращается к вызывающему, который никогда не менял пространство имен:

 test# exit mysystem# 

Обратите внимание, что изменяется только имя хоста. Существуют похожие пространства имен для различных функций (сеть, точки монтирования …). Это основополагающий элемент контейнеров: все они используются (другой основной элемент для контейнеров – cgroups ).