setns(2) - wariua/manpages-ko GitHub Wiki

NAME

setns - μŠ€λ ˆλ“œλ₯Ό λ„€μž„μŠ€νŽ˜μ΄μŠ€λ‘œ μž¬μ—°κ³„ν•˜κΈ°

SYNOPSIS

#define _GNU_SOURCE         /* feature_test_macros(7) μ°Έκ³  */
#include <sched.h>

int setns(int fd, int nstype);

DESCRIPTION

λ„€μž„μŠ€νŽ˜μ΄μŠ€λ₯Ό κ°€λ¦¬ν‚€λŠ” 파일 λ””μŠ€ν¬λ¦½ν„°λ₯Ό λ°›μ•„μ„œ 호좜 μŠ€λ ˆλ“œλ₯Ό κ·Έ λ„€μž„μŠ€νŽ˜μ΄μŠ€λ‘œ λ‹€μ‹œ μ—°κ³„ν•œλ‹€.

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 μ—­λŠ₯을 κ°€μ§€κ³  μžˆμ–΄μ•Ό ν•œλ‹€.

RETURN VALUE

성곡 μ‹œ setns()λŠ” 0을 λ°˜ν™˜ν•œλ‹€. μ‹€νŒ¨ μ‹œ -1을 λ°˜ν™˜ν•˜λ©° 였λ₯˜λ₯Ό λ‚˜νƒ€λ‚΄λ„λ‘ errnoλ₯Ό μ„€μ •ν•œλ‹€.

ERRORS

EBADF
fdκ°€ μœ νš¨ν•œ 파일 λ””μŠ€ν¬λ¦½ν„°κ°€ μ•„λ‹ˆλ‹€.
EINVAL
fdκ°€ κ°€λ¦¬ν‚€λŠ” λ„€μž„μŠ€νŽ˜μ΄μŠ€μ˜ μ’…λ₯˜κ°€ nstype에 μ§€μ •ν•œ 것과 μΌμΉ˜ν•˜μ§€ μ•ŠλŠ”λ‹€.
EINVAL
μ§€μ •ν•œ λ„€μž„μŠ€νŽ˜μ΄μŠ€λ‘œ μŠ€λ ˆλ“œλ₯Ό μž¬μ—°κ³„ν•˜λŠ” 데 λ¬Έμ œκ°€ μžˆλ‹€.
EINVAL
ν˜ΈμΆœμžκ°€ μ„ μ‘°(λΆ€λͺ¨, μ‘°λΆ€λͺ¨, λ“±) PID λ„€μž„μŠ€νŽ˜μ΄μŠ€μ— μ°Έμ—¬ν•˜λ €κ³  ν–ˆλ‹€.
EINVAL
ν˜ΈμΆœμžκ°€ 이미 μ°Έμ—¬ν•΄ μžˆλŠ” μ‚¬μš©μž λ„€μž„μŠ€νŽ˜μ΄μŠ€μ— μ°Έμ—¬ν•˜λ €κ³  μ‹œλ„ν–ˆλ‹€.
EINVAL
ν˜ΈμΆœμžκ°€ λ‹€λ₯Έ ν”„λ‘œμ„ΈμŠ€μ™€ 파일 μ‹œμŠ€ν…œ(CLONE_FS) μƒνƒœλ₯Ό (특히 루트 디렉터리λ₯Ό) κ³΅μœ ν•˜λ©΄μ„œ μƒˆ μ‚¬μš©μž λ„€μž„μŠ€νŽ˜μ΄μŠ€μ— μ°Έμ—¬ν•˜λ €κ³  ν–ˆλ‹€.
EINVAL
ν˜ΈμΆœμžκ°€ 닀쀑 μŠ€λ ˆλ“œμΈλ° μƒˆ μ‚¬μš©μž λ„€μž„μŠ€νŽ˜μ΄μŠ€μ— μ°Έμ—¬ν•˜λ €κ³  ν–ˆλ‹€.
ENOMEM
μ§€μ •ν•œ λ„€μž„μŠ€νŽ˜μ΄μŠ€λ₯Ό λ°”κΎΈλŠ” 데 ν•„μš”ν•œ λ©”λͺ¨λ¦¬λ₯Ό ν• λ‹Ήν•  수 μ—†λ‹€.
EPERM
호좜 μŠ€λ ˆλ“œκ°€ 이 λ™μž‘μ— ν•„μš”ν•œ μ—­λŠ₯을 κ°€μ§€κ³  μžˆμ§€ μ•Šλ‹€.

VERSIONS

λ¦¬λˆ…μŠ€ 컀널 3.0μ—μ„œ setns() μ‹œμŠ€ν…œ 호좜이 처음 λ“±μž₯ν–ˆλ‹€. glibc 버전 2.14μ—μ„œ 라이브러리 지원이 μΆ”κ°€λ˜μ—ˆλ‹€.

CONFORMING TO

setns() μ‹œμŠ€ν…œ ν˜ΈμΆœμ€ λ¦¬λˆ…μŠ€ μ „μš©μ΄λ‹€.

NOTES

clone(2)으둜 μƒˆ μŠ€λ ˆλ“œλ₯Ό 생성할 λ•Œ κ³΅μœ ν•  수 μžˆλŠ” 속성듀을 λͺ¨λ‘ setns()둜 λ°”κΏ€ 수 μžˆλŠ” 것은 μ•„λ‹ˆλ‹€.

EXAMPLES

μ•„λž˜ ν”„λ‘œκ·Έλž¨μ€ λ‘˜ μ΄μƒμ˜ 인자λ₯Ό λ°›λŠ”λ‹€. 첫 번째 μΈμžλŠ” κΈ°μ‘΄ /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");
}

SEE ALSO

nsenter(1), clone(2), fork(2), unshare(2), vfork(2), namespaces(7), unix(7)


2019-03-06

⚠️ **GitHub.com Fallback** ⚠️