setns(2) - wariua/manpages-ko GitHub Wiki
setns - μ€λ λλ₯Ό λ€μμ€νμ΄μ€λ‘ μ¬μ°κ³νκΈ°
#define _GNU_SOURCE /* feature_test_macros(7) μ°Έκ³ */
#include <sched.h>
int setns(int fd, int nstype);
λ€μμ€νμ΄μ€λ₯Ό κ°λ¦¬ν€λ νμΌ λμ€ν¬λ¦½ν°λ₯Ό λ°μμ νΈμΆ μ€λ λλ₯Ό κ·Έ λ€μμ€νμ΄μ€λ‘ λ€μ μ°κ³νλ€.
fd
μΈμλ /proc/[pid]/ns/
λλ ν°λ¦¬ μμ λ€μμ€νμ΄μ€ νλͺ©λ€ μ€ νλλ₯Ό κ°λ¦¬ν€λ νμΌ λμ€ν¬λ¦½ν°μ΄λ€. /proc/[pid]/ns/
μ λν μΆκ° μ 보λ namespaces(7)λ₯Ό 보λΌ. λμνλ λ€μμ€νμ΄μ€λ‘ νΈμΆ μ€λ λκ° μ¬μ°κ³λ λ nstype
μΈμλ³ μ μ½μ΄ μμΌλ©΄ μ μ©μ λ°λλ€.
nstype
μΈμλ νΈμΆ μ€λ λλ₯Ό μ΄λ€ μ’
λ₯μ λ€μμ€νμ΄μ€λ‘ μ¬μ°κ³ν μ μλμ§ λνλΈλ€. μ΄ μΈμλ λ€μ κ°λ€ μ€ νλμΌ μ μλ€.
0
- μ΄λ€ μ’ λ₯μ λ€μμ€νμ΄μ€λΌλ μ°Έμ¬λ₯Ό νμ©νλ€.
-
CLONE_NEWCGROUP
(리λ μ€ 4.6λΆν°) -
fd
κ° cgroup λ€μμ€νμ΄μ€λ₯Ό κ°λ¦¬μΌμΌ νλ€. -
CLONE_NEWIPC
(리λ μ€ 3.0λΆν°) -
fd
κ° IPC λ€μμ€νμ΄μ€λ₯Ό κ°λ¦¬μΌμΌ νλ€. -
CLONE_NEWNET
(리λ μ€ 3.0λΆν°) -
fd
κ° λ€νΈμν¬ λ€μμ€νμ΄μ€λ₯Ό κ°λ¦¬μΌμΌ νλ€. -
CLONE_NEWNS
(리λ μ€ 3.8λΆν°) -
fd
κ° λ§μ΄νΈ λ€μμ€νμ΄μ€λ₯Ό κ°λ¦¬μΌμΌ νλ€. -
CLONE_NEWPID
(리λ μ€ 3.8λΆν°) -
fd
κ° μμ PID λ€μμ€νμ΄μ€λ₯Ό κ°λ¦¬μΌμΌ νλ€. -
CLONE_NEWUSER
(리λ μ€ 3.8λΆν°) -
fd
κ° μ¬μ©μ λ€μμ€νμ΄μ€λ₯Ό κ°λ¦¬μΌμΌ νλ€. -
CLONE_NEWUTS
(리λ μ€ 3.0λΆν°) -
fd
κ° UTS λ€μμ€νμ΄μ€λ₯Ό κ°λ¦¬μΌμΌ νλ€.
fd
κ° μ΄λ€ μ’
λ₯μ λ€μμ€νμ΄μ€λ₯Ό κ°λ¦¬ν€λμ§ νΈμΆμκ° μκ³ μλ€λ©΄ (λλ μ κ²½μ°μ§ μλλ€λ©΄) nstype
μ 0μΌλ‘ μ§μ νλ©΄ μΆ©λΆνλ€. nstype
μ 0 μλ κ°μΌλ‘ μ§μ νλ κ² μ μ©ν κ²½μ°λ fd
κ° κ°λ¦¬ν€λ λ€μμ€νμ΄μ€μ μ’
λ₯λ₯Ό νΈμΆμκ° μμ§ λͺ»νκ³ κ·Έ λ€μμ€νμ΄μ€κ° νΉμ μ’
λ₯μμ 보μ₯νκ³ μΆμ λμ΄λ€. (λ€λ₯Έ νλ‘μΈμ€κ° νμΌ λμ€ν¬λ¦½ν°λ₯Ό μ΄κ³ μ κ°λ Ή μ λμ€ λλ©μΈ μμΌμ ν΅ν΄ νΈμΆμμκ² μ λ¬νλ€λ©΄ fd
κ° κ°λ¦¬ν€λ λ€μμ€νμ΄μ€ μ’
λ₯λ₯Ό νΈμΆμκ° μμ§ λͺ»ν μλ μλ€.)
κ° λ€μμ€νμ΄μ€ μ’ λ₯λ‘ μ¬μ°κ³ν λ λ€μ μΈλΆ μ¬ν λ° μ μ½μ μ μν΄μΌ νλ€.
- μ¬μ©μ λ€μμ€νμ΄μ€
-
μ€μ€λ‘λ₯Ό μ¬μ©μ λ€μμ€νμ΄μ€μ μ¬μ°κ³νλ €λ νλ‘μΈμ€λ λμ μ¬μ©μ λ€μμ€νμ΄μ€ λ΄μμ
CAP_SYS_ADMIN
μλ₯μ΄ μμ΄μΌ νλ€. (μ΄ λλ¬Έμ μμ μ¬μ©μ λ€μμ€νμ΄μ€μλ§ μ°Έμ¬κ° κ°λ₯νλ€.) νλ‘μΈμ€κ° μ¬μ©μ λ€μμ€νμ΄μ€μ μ±κ³΅μ μΌλ‘ μ°Έμ¬νλ©΄ μ¬μ©μ ID λ° κ·Έλ£Ή IDμ μκ΄μμ΄ κ·Έ λ€μμ€νμ΄μ€ λ΄μ λͺ¨λ μλ₯μ΄ μΈκ°λλ€.λ€μ€ μ€λ λ νλ‘μΈμ€λ
setns()
λ‘ μ¬μ©μ λ€μμ€νμ΄μ€λ₯Ό λ°κΏ μ μλ€.setns()
λ₯Ό μ΄μ©ν΄ νΈμΆμμ νμ¬ μ¬μ©μ λ€μμ€νμ΄μ€λ‘ μ¬μ§μ νλ κ²μ΄ νμ©λμ§ μλλ€. μ΄λ μλ₯μ λ²λ¦° νΈμΆμκ°setns()
νΈμΆμ ν΅ν΄ κ·Έ μλ₯μ λ€μ μ»λ κ²μ λ§λλ€.보μμ μ΄μ λ‘ ν νλ‘μΈμ€κ° λ€λ₯Έ νλ‘μΈμ€μ νμΌ μμ€ν κ΄λ ¨ μμ±(clone(2)
CLONE_FS
νλκ·Έλ‘ κ³΅μ λ₯Ό μ μ΄νλ μμ±λ€)μ 곡μ νκ³ μμΌλ©΄ μ μ¬μ©μ λ€μμ€νμ΄μ€μ μ°Έμ¬ν μ μλ€.μ¬μ©μ λ€μμ€νμ΄μ€μ λν λ μμΈν λ΄μ©μ user_namespaces(7)λ₯Ό 보λΌ.
- λ§μ΄νΈ λ€μμ€νμ΄μ€
-
λ§μ΄νΈ λ€μμ€νμ΄μ€λ₯Ό λ°κΎΈκΈ° μν΄μ νΈμΆμ νλ‘μΈμ€κ° μκΈ° μ¬μ©μ λ€μμ€νμ΄μ€μμ
CAP_SYS_CHROOT
λ°CAP_SYS_ADMIN
μλ₯μ κ°μ§κ³ μκ³ λμ λ§μ΄νΈ λ€μμ€νμ΄μ€λ₯Ό μμ ν μ¬μ©μ λ€μμ€νμ΄μ€μμCAP_SYS_ADMIN
μλ₯μ κ°μ§κ³ μμ΄μΌ νλ€.νλ‘μΈμ€κ° λ€μ€ μ€λ λμ΄λ©΄ μ λ§μ΄νΈ λ€μμ€νμ΄μ€λ‘ μ¬μ°κ³ν μ μλ€.
μ¬μ©μ λ€μμ€νμ΄μ€μ λ§μ΄νΈ λ€μμ€νμ΄μ€μ μνΈμμ©μ λν μμΈν λ΄μ©μ user_namespaces(7)λ₯Ό 보λΌ.
- PID λ€μμ€νμ΄μ€
-
μ PID λ€μμ€νμ΄μ€μ μ¬μ°κ³νκΈ° μν΄μ νΈμΆμκ° μκΈ° μ¬μ©μ λ€μμ€νμ΄μ€μ λμ PID λ€μμ€νμ΄μ€λ₯Ό μμ ν μ¬μ©μ λ€μμ€νμ΄μ€ λͺ¨λμμ
CAP_SYS_ADMIN
μλ₯μ κ°μ§κ³ μμ΄μΌ νλ€.fd
κ° PID λ€μμ€νμ΄μ€λ₯Ό κ°λ¦¬ν€λ κ²½μ° λ€λ₯Έ λ€μμ€νμ΄μ€λ€κ³Ό λμ λ°©μμ΄ μ’ λ€λ₯΄λ€. νΈμΆ μ€λ λμ PID λ€μμ€νμ΄μ€λ₯Ό μ¬μ°κ³νλ©΄ μ΄ν μμ±λλ νΈμΆμμ μμ νλ‘μΈμ€λ€μ΄ λ€μ΄κ° PID λ€μμ€νμ΄μ€λ₯Ό λ°κΏ λΏμ΄λ€. μ¦, νΈμΆμ μ체μ PID λ€μμ€νμ΄μ€λ λ°λμ§ μλλ€.fd
λ‘ μ§μ ν PID λ€μμ€νμ΄μ€κ° νΈμΆμμ PID λ€μμ€νμ΄μ€μ μμ(μμ, μμ, λ±)μΈ κ²½μ°μλ§ PID λ€μμ€νμ΄μ€ μ¬μ°κ³κ° νμ©λλ€.PID λ€μμ€νμ΄μ€μ λν λ μμΈν λ΄μ©μ pid_namespaces(7)λ₯Ό 보λΌ.
- cgroup λ€μμ€νμ΄μ€
-
μ cgroup λ€μμ€νμ΄μ€μ μ¬μ°κ³νκΈ° μν΄μ νΈμΆμκ° μκΈ° μ¬μ©μ λ€μμ€νμ΄μ€μ λμ cgroup λ€μμ€νμ΄μ€λ₯Ό μμ ν μ¬μ©μ λ€μμ€νμ΄μ€ λͺ¨λμμ
CAP_SYS_ADMIN
μλ₯μ κ°μ§κ³ μμ΄μΌ νλ€.setns()
λ‘ νΈμΆμμ cgroup λ€μμ€νμ΄μ€λ₯Ό λ°κΎΈμ΄λ νΈμΆμμ cgroup λ©€λ²μμ λ°λμ§ μλλ€. - λ€νΈμν¬, IPC, UTS λ€μμ€νμ΄μ€
-
μ λ€νΈμν¬ λ΄μ§ IPC, UTS λ€μμ€νμ΄μ€μ μ¬μ°κ³νκΈ° μν΄μ νΈμΆμκ° μκΈ° μ¬μ©μ λ€μμ€νμ΄μ€μ λμ λ€μμ€νμ΄μ€λ₯Ό μμ ν μ¬μ©μ λ€μμ€νμ΄μ€ λͺ¨λμμ
CAP_SYS_ADMIN
μλ₯μ κ°μ§κ³ μμ΄μΌ νλ€. EBADF
-
fd
κ° μ ν¨ν νμΌ λμ€ν¬λ¦½ν°κ° μλλ€. EINVAL
-
fd
κ° κ°λ¦¬ν€λ λ€μμ€νμ΄μ€μ μ’ λ₯κ°nstype
μ μ§μ ν κ²κ³Ό μΌμΉνμ§ μλλ€. EINVAL
- μ§μ ν λ€μμ€νμ΄μ€λ‘ μ€λ λλ₯Ό μ¬μ°κ³νλ λ° λ¬Έμ κ° μλ€.
EINVAL
- νΈμΆμκ° μ μ‘°(λΆλͺ¨, μ‘°λΆλͺ¨, λ±) PID λ€μμ€νμ΄μ€μ μ°Έμ¬νλ €κ³ νλ€.
EINVAL
- νΈμΆμκ° μ΄λ―Έ μ°Έμ¬ν΄ μλ μ¬μ©μ λ€μμ€νμ΄μ€μ μ°Έμ¬νλ €κ³ μλνλ€.
EINVAL
- νΈμΆμκ° λ€λ₯Έ νλ‘μΈμ€μ νμΌ μμ€ν
(
CLONE_FS
) μνλ₯Ό (νΉν λ£¨νΈ λλ ν°λ¦¬λ₯Ό) 곡μ νλ©΄μ μ μ¬μ©μ λ€μμ€νμ΄μ€μ μ°Έμ¬νλ €κ³ νλ€. EINVAL
- νΈμΆμκ° λ€μ€ μ€λ λμΈλ° μ μ¬μ©μ λ€μμ€νμ΄μ€μ μ°Έμ¬νλ €κ³ νλ€.
ENOMEM
- μ§μ ν λ€μμ€νμ΄μ€λ₯Ό λ°κΎΈλ λ° νμν λ©λͺ¨λ¦¬λ₯Ό ν λΉν μ μλ€.
EPERM
- νΈμΆ μ€λ λκ° μ΄ λμμ νμν μλ₯μ κ°μ§κ³ μμ§ μλ€.
μ±κ³΅ μ setns()
λ 0μ λ°ννλ€. μ€ν¨ μ -1μ λ°ννλ©° μ€λ₯λ₯Ό λνλ΄λλ‘ errno
λ₯Ό μ€μ νλ€.
리λ
μ€ μ»€λ 3.0μμ setns()
μμ€ν
νΈμΆμ΄ μ²μ λ±μ₯νλ€. glibc λ²μ 2.14μμ λΌμ΄λΈλ¬λ¦¬ μ§μμ΄ μΆκ°λμλ€.
setns()
μμ€ν
νΈμΆμ 리λ
μ€ μ μ©μ΄λ€.
clone(2)μΌλ‘ μ μ€λ λλ₯Ό μμ±ν λ 곡μ ν μ μλ μμ±λ€μ λͺ¨λ setns()
λ‘ λ°κΏ μ μλ κ²μ μλλ€.
μλ νλ‘κ·Έλ¨μ λ μ΄μμ μΈμλ₯Ό λ°λλ€. 첫 λ²μ§Έ μΈμλ κΈ°μ‘΄ /proc/[pid]/ns/
λλ ν°λ¦¬ λ΄μ λ€μμ€νμ΄μ€ νμΌ κ²½λ‘λ₯Ό λνλΈλ€. λλ¨Έμ§ μΈμλ€μ λͺ
λ Ήκ³Ό κ·Έ μΈμλ€μ μ§μ νλ€. νλ‘κ·Έλ¨μ λ€μμ€νμ΄μ€ νμΌμ μ΄κ³ , setns()
λ₯Ό μ΄μ©ν΄ κ·Έ λ€μμ€νμ΄μ€μ μ°Έμ¬νκ³ , μ§μ ν λͺ
λ Ήμ κ·Έ λ€μμ€νμ΄μ€ μμμ μ€ννλ€.
λ€μ μ
Έ μΈμ
μ (ns_exec
λΌλ λ°μ΄λλ¦¬λ‘ μ»΄νμΌ ν) μ΄ νλ‘κ·Έλ¨μ (newuts
λΌλ λ°μ΄λλ¦¬λ‘ μ»΄νμΌ ν) clone(2) 맨 νμ΄μ§μ CLONE_NEWUTS
μμ νλ‘κ·Έλ¨κ³Ό ν¨κ» μ¬μ©νλ κ²μ λ³΄μ¬ μ€λ€.
λ¨Όμ clone(2)μ μμ νλ‘κ·Έλ¨μ λ°°κ²½μΌλ‘ μ€ννλ€. κ·Έ νλ‘κ·Έλ¨μ λ³λμ UTS λ€μμ€νμ΄μ€μμ μμμ μμ±νλ€. μμμ΄ μκΈ° λ€μμ€νμ΄μ€μμ νΈμ€νΈλͺ μ λ°κΎΌ ν λ νλ‘μΈμ€ λͺ¨λ μκΈ° UTS λ€μμ€νμ΄μ€ λ΄μ νΈμ€νΈλͺ μ νμνλ©°, κ·Έλμ λμ΄ μ΄λ»κ² λ€λ₯Έμ§ λ³Ό μ μλ€.
$ su # λ€μμ€νμ΄μ€ μμ
μ νΉκΆ νμν¨
Password:
# ./newuts bizarro &
[1] 3549
clone() returned 3550
uts.nodename in child: bizarro
uts.nodename in parent: antero
# uname -n # μ
Έμμ νΈμ€νΈλͺ
νμΈ
antero
λ€μμΌλ‘ μλμ κ°μ΄ νλ‘κ·Έλ¨μ μ€νν΄μ μ Έμ μ€ννκ² νλ€. κ·Έ μ Έ λ΄μμ νΈμ€νΈλͺ μ΄ μ²« λ²μ§Έ νλ‘κ·Έλ¨μ΄ λ§λ μμμ΄ μ€μ ν κ²κ³Ό κ°μμ§ νμΈνλ€.
# ./ns_exec /proc/3550/ns/uts /bin/bash
# uname -n # ns_execκ° μμν μ
Έμμ μ€ν
bizarro
#define _GNU_SOURCE
#include <fcntl.h>
#include <sched.h>
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#define errExit(msg) do { perror(msg); exit(EXIT_FAILURE); \
} while (0)
int
main(int argc, char *argv[])
{
int fd;
if (argc < 3) {
fprintf(stderr, "%s /proc/PID/ns/FILE cmd args...\n", argv[0]);
exit(EXIT_FAILURE);
}
fd = open(argv[1], O_RDONLY); /* λ€μμ€νμ΄μ€ νμΌ λμ€ν¬λ¦½ν° μ»κΈ° */
if (fd == -1)
errExit("open");
if (setns(fd, 0) == -1) /* κ·Έ λ€μμ€νμ΄μ€μ μ°Έμ¬ */
errExit("setns");
execvp(argv[2], &argv[2]); /* λ€μμ€νμ΄μ€μμ λͺ
λ Ή μ€ν */
errExit("execvp");
}
nsenter(1)
, clone(2), fork(2), unshare(2), vfork(2), namespaces(7), unix(7)
2019-03-06