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

NAME

unshare - ν”„λ‘œμ„ΈμŠ€ μ‹€ν–‰ λ¬Έλ§₯ 일뢀λ₯Ό λΆ„λ¦¬ν•˜κΈ°

SYNOPSIS

#define _GNU_SOURCE
#include <sched.h>

int unshare(int flags);

DESCRIPTION

unshare()λ₯Ό 톡해 ν”„λ‘œμ„ΈμŠ€(λ˜λŠ” μŠ€λ ˆλ“œ)κ°€ ν˜„μž¬ λ‹€λ₯Έ ν”„λ‘œμ„ΈμŠ€(λ˜λŠ” μŠ€λ ˆλ“œ)와 곡유 쀑인 μ‹€ν–‰ λ¬Έλ§₯ 일뢀λ₯Ό λΆ„λ¦¬μ‹œν‚¬ 수 μžˆλ‹€. μ‹€ν–‰ λ¬Έλ§₯ μ€‘μ—μ„œ 마운트 λ„€μž„μŠ€νŽ˜μ΄μŠ€ 같은 μš”μ†ŒλŠ” fork(2)λ‚˜ vfork(2)둜 μƒˆ ν”„λ‘œμ„ΈμŠ€λ₯Ό λ§Œλ“€ λ•Œ μ•”λ¬΅μ μœΌλ‘œ κ³΅μœ λ˜μ§€λ§Œ 가상 λ©”λͺ¨λ¦¬ 같은 λ‹€λ₯Έ μš”μ†ŒλŠ” clone(2)으둜 ν”„λ‘œμ„ΈμŠ€ λ‚΄μ§€ μŠ€λ ˆλ“œλ₯Ό λ§Œλ“€ λ•Œ λͺ…μ‹œμ μœΌλ‘œ μš”μ²­ν•΄μ„œ κ³΅μœ ν•  수 μžˆλ‹€.

unshare()의 주된 μš©λ„λŠ” ν”„λ‘œμ„ΈμŠ€κ°€ μƒˆ ν”„λ‘œμ„ΈμŠ€λ₯Ό λ§Œλ“€μ§€ μ•Šκ³ λ„ 자기 곡유 μ‹€ν–‰ λ¬Έλ§₯을 μ œμ–΄ν•  수 있게 ν•˜λŠ” 것이닀.

flags μΈμžλŠ” μ‹€ν–‰ λ¬Έλ§₯의 μ–΄λŠ μš”μ†Œλ“€μ„ 곡유 ν•΄μ œν• μ§€ μ§€μ •ν•˜λŠ” λΉ„νŠΈ λ§ˆμŠ€ν¬μ΄λ‹€. λ‹€μŒ μƒμˆ˜λ“€μ„ 0개 이상 OR ν•΄μ„œ 인자λ₯Ό μ§€μ •ν•œλ‹€.

CLONE_FILES
clone(2) CLONE_FILES ν”Œλž˜κ·Έμ˜ 효과λ₯Ό λ’€μ§‘λŠ”λ‹€. 파일 λ””μŠ€ν¬λ¦½ν„° ν…Œμ΄λΈ”μ„ 곡유 ν•΄μ œν•΄μ„œ 호좜 ν”„λ‘œμ„ΈμŠ€κ°€ 더 이상 λ‹€λ₯Έ ν”„λ‘œμ„ΈμŠ€μ™€ 파일 λ””μŠ€ν¬λ¦½ν„°λ₯Ό κ³΅μœ ν•˜μ§€ μ•Šκ²Œ ν•œλ‹€.
CLONE_FS
clone(2) CLONE_FS ν”Œλž˜κ·Έμ˜ 효과λ₯Ό λ’€μ§‘λŠ”λ‹€. 파일 μ‹œμŠ€ν…œ 속성듀을 곡유 ν•΄μ œν•΄μ„œ 호좜 ν”„λ‘œμ„ΈμŠ€κ°€ 더 이상 λ‹€λ₯Έ ν”„λ‘œμ„ΈμŠ€μ™€ 루트 디렉터리(chroot(2)), ν˜„μž¬ 디렉터리(chdir(2)), umask(umask(2)) 속성을 κ³΅μœ ν•˜μ§€ μ•Šκ²Œ ν•œλ‹€.
CLONE_NEWCGROUP (λ¦¬λˆ…μŠ€ 4.6λΆ€ν„°)
이 ν”Œλž˜κ·ΈλŠ” clone(2) CLONE_NEWCGROUP ν”Œλž˜κ·Έμ™€ νš¨κ³Όκ°€ κ°™λ‹€. cgroup λ„€μž„μŠ€νŽ˜μ΄μŠ€λ₯Ό 곡유 ν•΄μ œν•œλ‹€. CLONE_NEWCGROUP을 μ‚¬μš©ν•˜λ €λ©΄ CAP_SYS_ADMIN μ—­λŠ₯이 ν•„μš”ν•˜λ‹€.
CLONE_NEWIPC (λ¦¬λˆ…μŠ€ 2.6.19λΆ€ν„°)
이 ν”Œλž˜κ·ΈλŠ” clone(2) CLONE_NEWIPC ν”Œλž˜κ·Έμ™€ νš¨κ³Όκ°€ κ°™λ‹€. IPC λ„€μž„μŠ€νŽ˜μ΄μŠ€λ₯Ό 곡유 ν•΄μ œν•΄μ„œ 호좜 ν”„λ‘œμ„ΈμŠ€κ°€ λ‹€λ₯Έ ν”„λ‘œμ„ΈμŠ€μ™€ κ³΅μœ ν•˜μ§€ μ•ŠλŠ” IPC λ„€μž„μŠ€νŽ˜μ΄μŠ€μ˜ κ°œλ³„ 사본을 가지도둝 ν•œλ‹€. 이 ν”Œλž˜κ·Έ 지정은 μžλ™μœΌλ‘œ CLONE_SYSVSEMκΉŒμ§€ ν•¨μ˜ν•œλ‹€. CLONE_NEWIPCλ₯Ό μ‚¬μš©ν•˜λ €λ©΄ CAP_SYS_ADMIN μ—­λŠ₯이 ν•„μš”ν•˜λ‹€.
CLONE_NEWNET (λ¦¬λˆ…μŠ€ 2.6.24λΆ€ν„°)
이 ν”Œλž˜κ·ΈλŠ” clone(2) CLONE_NEWNET ν”Œλž˜κ·Έμ™€ νš¨κ³Όκ°€ κ°™λ‹€. λ„€νŠΈμ›Œν¬ λ„€μž„μŠ€νŽ˜μ΄μŠ€λ₯Ό 곡유 ν•΄μ œν•΄μ„œ 호좜 ν”„λ‘œμ„ΈμŠ€κ°€ κΈ°μ‘΄ μ–΄λŠ ν”„λ‘œμ„ΈμŠ€μ™€λ„ κ³΅μœ ν•˜μ§€ μ•ŠλŠ” μƒˆ λ„€νŠΈμ›Œν¬ λ„€μž„μŠ€νŽ˜μ΄μŠ€λ‘œ μ΄λ™ν•˜κ²Œ ν•œλ‹€. CLONE_NEWNET을 μ‚¬μš©ν•˜λ €λ©΄ CAP_SYS_ADMIN μ—­λŠ₯이 ν•„μš”ν•˜λ‹€.
CLONE_NEWNS
이 ν”Œλž˜κ·ΈλŠ” clone(2) CLONE_NEWNS ν”Œλž˜κ·Έμ™€ νš¨κ³Όκ°€ κ°™λ‹€. 마운트 λ„€μž„μŠ€νŽ˜μ΄μŠ€λ₯Ό 곡유 ν•΄μ œν•΄μ„œ 호좜 ν”„λ‘œμ„ΈμŠ€κ°€ λ‹€λ₯Έ ν”„λ‘œμ„ΈμŠ€μ™€ κ³΅μœ ν•˜μ§€ μ•ŠλŠ” κ·Έ λ„€μž„μŠ€νŽ˜μ΄μŠ€μ˜ κ°œλ³„ 사본을 가지도둝 ν•œλ‹€. 이 ν”Œλž˜κ·Έ 지정은 μžλ™μœΌλ‘œ CLONE_FSκΉŒμ§€ ν•¨μ˜ν•œλ‹€. CLONE_NEWNSλ₯Ό μ‚¬μš©ν•˜λ €λ©΄ CAP_SYS_ADMIN μ—­λŠ₯이 ν•„μš”ν•˜λ‹€. μΆ”κ°€ λ‚΄μš©μ€ mount_namespaces(7) μ°Έκ³ .
CLONE_NEWPID (λ¦¬λˆ…μŠ€ 3.8λΆ€ν„°)
이 ν”Œλž˜κ·ΈλŠ” clone(2) CLONE_NEWPID ν”Œλž˜κ·Έμ™€ νš¨κ³Όκ°€ κ°™λ‹€. PID λ„€μž„μŠ€νŽ˜μ΄μŠ€λ₯Ό 곡유 ν•΄μ œν•΄μ„œ 호좜 ν”„λ‘œμ„ΈμŠ€κ°€ κΈ°μ‘΄ μ–΄λŠ ν”„λ‘œμ„ΈμŠ€μ™€λ„ κ³΅μœ ν•˜μ§€ μ•ŠλŠ” μžμ‹λ“€μ„ μœ„ν•œ μƒˆ PID λ„€μž„μŠ€νŽ˜μ΄μŠ€λ₯Ό 가지도둝 ν•œλ‹€. 호좜 ν”„λ‘œμ„ΈμŠ€κ°€ μƒˆ λ„€μž„μŠ€νŽ˜μ΄μŠ€λ‘œ μ΄λ™ν•˜μ§€ μ•ŠλŠ”λ‹€. 호좜 ν”„λ‘œμ„ΈμŠ€κ°€ μƒμ„±ν•˜λŠ” 첫 번째 μžμ‹μ΄ ν”„λ‘œμ„ΈμŠ€ ID 1을 κ°€μ§€κ²Œ λ˜μ–΄ κ·Έ μƒˆ λ„€μž„μŠ€νŽ˜μ΄μŠ€μ—μ„œ init(1)의 역할을 λ§‘λŠ”λ‹€. CLONE_NEWPIDλŠ” μžλ™μœΌλ‘œ CLONE_THREADκΉŒμ§€ ν•¨μ˜ν•œλ‹€. CLONE_NEWPIDλ₯Ό μ‚¬μš©ν•˜λ €λ©΄ CAP_SYS_ADMIN μ—­λŠ₯이 ν•„μš”ν•˜λ‹€. μΆ”κ°€ λ‚΄μš©μ€ pid_namespaces(7) μ°Έκ³ .
CLONE_NEWUSER (λ¦¬λˆ…μŠ€ 3.8λΆ€ν„°)

이 ν”Œλž˜κ·ΈλŠ” clone(2) CLONE_NEWUSER ν”Œλž˜κ·Έμ™€ νš¨κ³Όκ°€ κ°™λ‹€. μ‚¬μš©μž λ„€μž„μŠ€νŽ˜μ΄μŠ€λ₯Ό 곡유 ν•΄μ œν•΄μ„œ 호좜 ν”„λ‘œμ„ΈμŠ€κ°€ κΈ°μ‘΄ μ–΄λŠ ν”„λ‘œμ„ΈμŠ€μ™€λ„ κ³΅μœ ν•˜μ§€ μ•ŠλŠ” μƒˆ μ‚¬μš©μž λ„€μž„μŠ€νŽ˜μ΄μŠ€λ‘œ μ΄λ™ν•˜κ²Œ ν•œλ‹€. CLONE_NEWUSER ν”Œλž˜κ·Έλ₯Ό μ“΄ clone(2)으둜 μƒμ„±ν•˜λŠ” μžμ‹ ν”„λ‘œμ„ΈμŠ€μ—μ„œμ²˜λŸΌ ν˜ΈμΆœμžκ°€ μƒˆ λ„€μž„μŠ€νŽ˜μ΄μŠ€μ—μ„œ μ™„μ „ν•œ μ—­λŠ₯ 집합을 μ–»λŠ”λ‹€.

CLONE_NEWUSERλ₯Ό μœ„ν•΄μ„  호좜 ν”„λ‘œμ„ΈμŠ€κ°€ 닀쀑 μŠ€λ ˆλ“œκ°€ μ•„λ‹ˆμ–΄μ•Ό ν•œλ‹€. CLONE_NEWUSER 지정은 μžλ™μœΌλ‘œ CLONE_THREADλ₯Ό ν•¨μ˜ν•œλ‹€. λ¦¬λˆ…μŠ€ 3.9λΆ€ν„° CLONE_NEWUSERκ°€ μžλ™μœΌλ‘œ CLONE_FSλ₯Ό ν•¨μ˜ν•˜κΈ°λ„ ν•œλ‹€. CLONE_NEWUSERλ₯Ό μœ„ν•΄μ„  호좜 ν”„λ‘œμ„ΈμŠ€μ˜ μ‚¬μš©μž ID 및 κ·Έλ£Ή IDκ°€ 호좜 μ‹œμ μ˜ 호좜 ν”„λ‘œμ„ΈμŠ€ μ‚¬μš©μž λ„€μž„μŠ€νŽ˜μ΄μŠ€ λ‚΄μ˜ μ‚¬μš©μž ID 및 κ·Έλ£Ή ID둜 λ§€ν•‘ λ˜μ–΄ μžˆμ–΄μ•Ό ν•œλ‹€.

μ‚¬μš©μž λ„€μž„μŠ€νŽ˜μ΄μŠ€μ— λŒ€ν•œ μΆ”κ°€ λ‚΄μš©μ€ user_namespaces(7) μ°Έκ³ .

CLONE_NEWUTS (λ¦¬λˆ…μŠ€ 2.6.19λΆ€ν„°)
이 ν”Œλž˜κ·ΈλŠ” clone(2) CLONE_NEWUTS ν”Œλž˜κ·Έμ™€ νš¨κ³Όκ°€ κ°™λ‹€. UTS λ„€μž„μŠ€νŽ˜μ΄μŠ€λ₯Ό 곡유 ν•΄μ œν•΄μ„œ 호좜 ν”„λ‘œμ„ΈμŠ€κ°€ λ‹€λ₯Έ ν”„λ‘œμ„ΈμŠ€μ™€ κ³΅μœ ν•˜μ§€ μ•ŠλŠ” UTS λ„€μž„μŠ€νŽ˜μ΄μŠ€μ˜ κ°œλ³„ 사본을 가지도둝 ν•œλ‹€. CLONE_NEWUTSλ₯Ό μ‚¬μš©ν•˜λ €λ©΄ CAP_SYS_ADMIN μ—­λŠ₯이 ν•„μš”ν•˜λ‹€.
CLONE_SYSVSEM (λ¦¬λˆ…μŠ€ 2.6.26λΆ€ν„°)
이 ν”Œλž˜κ·ΈλŠ” clone(2) CLONE_SYSVSEM ν”Œλž˜κ·Έμ˜ 효과λ₯Ό λ’€μ§‘λŠ”λ‹€. μ‹œμŠ€ν…œ V μ„Έλ§ˆν¬μ–΄ μ‘°μ •(semadj) 값듀을 곡유 ν•΄μ œν•΄μ„œ 호좜 ν”„λ‘œμ„ΈμŠ€κ°€ λ‹€λ₯Έ ν”„λ‘œμ„ΈμŠ€μ™€ κ³΅μœ ν•˜μ§€ μ•ŠλŠ” μƒˆλ‘œμš΄ 빈 semadj λͺ©λ‘μ„ 가지도둝 ν•œλ‹€. 이 ν”„λ‘œμ„ΈμŠ€κ°€ ν˜„μž¬ semadj λͺ©λ‘μ— λŒ€ν•œ μ°Έμ‘°λ₯Ό κ°€μ§„ λ§ˆμ§€λ§‰ ν”„λ‘œμ„ΈμŠ€μ΄λ©΄ κ·Έ λͺ©λ‘μ˜ μ‘°μ • 사항듀이 semop(2)μ—μ„œ κΈ°μˆ ν•˜λŠ” λŒ€λ‘œ ν•΄λ‹Ή μ„Έλ§ˆν¬μ–΄λ“€μ— μ μš©λœλ‹€.

μΆ”κ°€λ‘œ ν˜ΈμΆœμžκ°€ 단일 μŠ€λ ˆλ“œμ΄λ©΄ (즉 λ‹€λ₯Έ ν”„λ‘œμ„ΈμŠ€ λ‚΄μ§€ μŠ€λ ˆλ“œμ™€ μ£Όμ†Œ 곡간을 κ³΅μœ ν•˜κ³  μžˆμ§€ μ•ŠμœΌλ©΄) flags에 CLONE_THREAD, CLONE_SIGHAND, CLONE_VM을 μ§€μ •ν•  수 μžˆλ‹€. κ·Έ κ²½μš°μ— κ·Έ ν”Œλž˜κ·Έλ“€μ€ νš¨κ³Όκ°€ μ—†λ‹€. (그리고 CLONE_THREAD 지정이 μžλ™μœΌλ‘œ CLONE_VM을 ν•¨μ˜ν•˜κ³  CLONE_VM 지정이 μžλ™μœΌλ‘œ CLONE_SIGHANDλ₯Ό ν•¨μ˜ν•˜κΈ°λ„ ν•œλ‹€.) ν”„λ‘œμ„ΈμŠ€κ°€ 닀쀑 μŠ€λ ˆλ“œμΈ κ²½μš°μ—λŠ” 이 ν”Œλž˜κ·Έ μ‚¬μš© μ‹œ 였λ₯˜ κ²°κ³Όκ°€ λ‚˜μ˜¨λ‹€.

flagsλ₯Ό 0으둜 μ§€μ •ν•˜λŠ” 경우 unshare()λŠ” no-op이닀. ν˜„μž¬ ν”„λ‘œμ„ΈμŠ€μ˜ μ‹€ν–‰ λ¬Έλ§₯에 μ–΄λ–€ 변경도 ν•˜μ§€ μ•ŠλŠ”λ‹€.

RETURN VALUE

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

ERRORS

EINVAL
flags에 μœ νš¨ν•˜μ§€ μ•Šμ€ λΉ„νŠΈλ₯Ό μ§€μ •ν–ˆλ‹€.
EINVAL
flags에 CLONE_THREADλ‚˜ CLONE_SIGHAND, CLONE_VM을 μ§€μ •ν–ˆμœΌλ©° ν˜ΈμΆœμžκ°€ 닀쀑 μŠ€λ ˆλ“œμ΄λ‹€.
EINVAL
flags에 CLONE_NEWIPCλ₯Ό μ§€μ •ν–ˆλŠ”λ° 컀널이 CONFIG_SYSVIPC 및 CONFIG_IPC_NS μ˜΅μ…˜μœΌλ‘œ κ΅¬μ„±λ˜μ§€ μ•Šμ•˜λ‹€.
EINVAL
flags에 CLONE_NEWNETλ₯Ό μ§€μ •ν–ˆλŠ”λ° 컀널이 CONFIG_NET_NS μ˜΅μ…˜μœΌλ‘œ κ΅¬μ„±λ˜μ§€ μ•Šμ•˜λ‹€.
EINVAL
flags에 CLONE_NEWPIDλ₯Ό μ§€μ •ν–ˆλŠ”λ° 컀널이 CONFIG_PID_NS μ˜΅μ…˜μœΌλ‘œ κ΅¬μ„±λ˜μ§€ μ•Šμ•˜λ‹€.
EINVAL
flags에 CLONE_NEWUSERλ₯Ό μ§€μ •ν–ˆλŠ”λ° 컀널이 CONFIG_USER_NS μ˜΅μ…˜μœΌλ‘œ κ΅¬μ„±λ˜μ§€ μ•Šμ•˜λ‹€.
EINVAL
flags에 CLONE_NEWUTSλ₯Ό μ§€μ •ν–ˆλŠ”λ° 컀널이 CONFIG_UTS_NS μ˜΅μ…˜μœΌλ‘œ κ΅¬μ„±λ˜μ§€ μ•Šμ•˜λ‹€.
EINVAL
flags에 CLONE_NEWPIDλ₯Ό μ§€μ •ν–ˆλŠ”λ° ν”„λ‘œμ„ΈμŠ€κ°€ μ•žμ„œ CLONE_NEWPID ν”Œλž˜κ·Έλ‘œ unshare()λ₯Ό ν˜ΈμΆœν–ˆλ‹€.
ENOMEM
곡유 ν•΄μ œν•΄μ•Ό ν•˜λŠ” 호좜자의 λ¬Έλ§₯ μš”μ†Œλ“€μ„ 볡사할 μΆ©λΆ„ν•œ λ©”λͺ¨λ¦¬λ₯Ό ν• λ‹Ήν•  수 μ—†λ‹€.
ENOSPC (λ¦¬λˆ…μŠ€ 3.7λΆ€ν„°)
flags에 CLONE_NEWPIDλ₯Ό μ§€μ •ν–ˆλŠ”λ° PID λ„€μž„μŠ€νŽ˜μ΄μŠ€ 쀑첩 깊이 μ œν•œμ„ μ΄ˆκ³Όν•˜κ²Œ λ˜μ—ˆλ‹€. pid_namespaces(7) μ°Έκ³ .
ENOSPC (λ¦¬λˆ…μŠ€ 4.9λΆ€ν„°. μ „μ—λŠ” EUSERS)

flags에 CLONE_NEWUSERλ₯Ό μ§€μ •ν–ˆλŠ”λ° 쀑첩 μ‚¬μš©μž λ„€μž„μŠ€νŽ˜μ΄μŠ€ 수 μ œν•œμ„ μ΄ˆκ³Όν•˜κ²Œ λ˜μ—ˆλ‹€. user_namespaces(7) μ°Έκ³ .

λ¦¬λˆ…μŠ€ 3.11λΆ€ν„° λ¦¬λˆ…μŠ€ 4.8κΉŒμ§€μ—μ„œλŠ” 이 경우 진단 였λ₯˜κ°€ EUSERSμ˜€λ‹€.

ENOSPC (λ¦¬λˆ…μŠ€ 4.9λΆ€ν„°)
flags의 ν•œ 값이 μƒˆ μ‚¬μš©μž λ„€μž„μŠ€νŽ˜μ΄μŠ€ 생성을 λ‚˜νƒ€λ‚΄μ§€λ§Œ κ·Έλ ‡κ²Œ ν•˜λ©΄ /proc/sys/user μ•ˆμ˜ λŒ€μ‘ νŒŒμΌμ— κ·œμ •λœ μ œν•œμ„ μ΄ˆκ³Όν•˜κ²Œ λœλ‹€. μžμ„Έν•œ λ‚΄μš©μ€ namespaces(7) μ°Έκ³ .
EPERM
호좜 ν”„λ‘œμ„ΈμŠ€κ°€ 이 λ™μž‘μ— ν•„μš”ν•œ νŠΉκΆŒμ„ κ°€μ§€κ³  μžˆμ§€ μ•Šλ‹€.
EPERM
flags에 CLONE_NEWUSERλ₯Ό μ§€μ •ν–ˆλŠ”λ° 호좜자의 μ‹€νš¨ μ‚¬μš©μž IDλ‚˜ μ‹€νš¨ κ·Έλ£Ή ID 쀑 ν•˜λ‚˜κ°€ λΆ€λͺ¨ λ„€μž„μŠ€νŽ˜μ΄μŠ€μ— λ§€ν•‘ λ˜μ–΄ μžˆμ§€ μ•Šλ‹€. (user_namespaces(7) μ°Έκ³ .)
EPERM (λ¦¬λˆ…μŠ€ 3.9λΆ€ν„°)
flags에 CLONE_NEWUSERλ₯Ό μ§€μ •ν–ˆλŠ”λ° ν˜ΈμΆœμžκ°€ chroot ν™˜κ²½ μ•ˆμ— μžˆλ‹€. (즉, 호좜자의 루트 디렉터리가 ν˜ΈμΆœμžκ°€ μœ„μΉ˜ν•œ 마운트 λ„€μž„μŠ€νŽ˜μ΄μŠ€μ˜ 루트 디렉터리와 μΌμΉ˜ν•˜μ§€ μ•ŠλŠ”λ‹€.)
EUSERS (λ¦¬λˆ…μŠ€ 3.11λΆ€ν„° λ¦¬λˆ…μŠ€ 4.8κΉŒμ§€)
flags에 CLONE_NEWUSERλ₯Ό μ§€μ •ν–ˆλŠ”λ° 쀑첩 μ‚¬μš©μž λ„€μž„μŠ€νŽ˜μ΄μŠ€ 수 μ œν•œμ„ μ΄ˆκ³Όν•˜κ²Œ λ˜μ—ˆλ‹€. μœ„μ˜ ENOSPC 였λ₯˜ λ…Όμ˜ μ°Έκ³ .

VERSIONS

λ¦¬λˆ…μŠ€ 컀널 2.6.16μ—μ„œ unshare() μ‹œμŠ€ν…œ 호좜이 μΆ”κ°€λ˜μ—ˆλ‹€.

CONFORMING TO

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

NOTES

clone(2)으둜 μƒˆ ν”„λ‘œμ„ΈμŠ€λ₯Ό 생성할 λ•Œ κ³΅μœ ν•  수 μžˆλŠ” ν”„λ‘œμ„ΈμŠ€ 속성듀을 λͺ¨λ‘ unshare()둜 곡유 ν•΄μ œν•  수 μžˆλŠ” 건 μ•„λ‹ˆλ‹€. ꡬ체적으둜 컀널 3.8 ν˜„μž¬ unshare()λŠ” CLONE_SIGHAND, CLONE_THREAD, CLONE_VM의 효과λ₯Ό λ’€μ§‘λŠ” ν”Œλž˜κ·Έλ₯Ό κ΅¬ν˜„ν•˜κ³  μžˆμ§€ μ•Šλ‹€. ν•„μš”ν•˜λ©΄ ν–₯ν›„ 그런 κΈ°λŠ₯이 좔가될 μˆ˜λ„ μžˆλ‹€.

EXAMPLE

μ•„λž˜ ν”„λ‘œκ·Έλž¨μ€ unshare(1) λͺ…령을 κ°„λ‹¨ν•˜κ²Œ κ΅¬ν˜„ν•œ 것이닀. λ„€μž„μŠ€νŽ˜μ΄μŠ€ ν•œ κ°€μ§€ λ˜λŠ” κ·Έ 이상을 곡유 ν•΄μ œν•˜κ³  λͺ…λ Ήν–‰ 인자둜 받은 λͺ…령을 μ‹€ν–‰ν•œλ‹€. λ‹€μŒμ€ 이 ν”„λ‘œκ·Έλž¨ μ‚¬μš© μ˜ˆμ‹œμΈλ°, μƒˆ 마운트 λ„€μž„μŠ€νŽ˜μ΄μŠ€μ—μ„œ 셸을 μ‹€ν–‰ν•˜κ³ μ„œ μ›λž˜ μ…Έκ³Ό μƒˆ 셸이 λΆ„λ¦¬λœ 마운트 λ„€μž„μŠ€νŽ˜μ΄μŠ€μ— μžˆλŠ”μ§€ ν™•μΈν•œλ‹€.

$ readlink /proc/$$/ns/mnt
mnt:[4026531840]
$ sudo ./unshare -m /bin/bash
# readlink /proc/$$/ns/mnt
mnt:[4026532325]

두 readlink(1) λͺ…λ Ή 좜λ ₯이 λ‹€λ₯Έλ°, μ΄λŠ” 두 셸이 λ‹€λ₯Έ 마운트 λ„€μž„μŠ€νŽ˜μ΄μŠ€μ— μžˆμŒμ„ 보여 μ€€λ‹€.

ν”„λ‘œκ·Έλž¨ μ†ŒμŠ€

/* unshare.c

   κ°„λ‹¨ν•œ unshare(1) λͺ…λ Ή κ΅¬ν˜„: λ„€μž„μŠ€νŽ˜μ΄μŠ€λ₯Ό unshare ν•˜κ³ 
   λͺ…령을 μ‹€ν–‰
*/
#define _GNU_SOURCE
#include <sched.h>
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>

/* κ°„λ‹¨ν•œ 였λ₯˜ 처리 ν•¨μˆ˜: 'errno'의 값에 따라 였λ₯˜ λ©”μ‹œμ§€λ₯Ό
   찍고 호좜 ν”„λ‘œμ„ΈμŠ€ μ’…λ£Œ */
#define errExit(msg)    do { perror(msg); exit(EXIT_FAILURE); \
                        } while (0)

static void
usage(char *pname)
{
    fprintf(stderr, "Usage: %s [options] program [arg...]\n", pname);
    fprintf(stderr, "Options can be:\n");
    fprintf(stderr, "    -i   unshare IPC namespace\n");
    fprintf(stderr, "    -m   unshare mount namespace\n");
    fprintf(stderr, "    -n   unshare network namespace\n");
    fprintf(stderr, "    -p   unshare PID namespace\n");
    fprintf(stderr, "    -u   unshare UTS namespace\n");
    fprintf(stderr, "    -U   unshare user namespace\n");
    exit(EXIT_FAILURE);
}

int
main(int argc, char *argv[])
{
    int flags, opt;

    flags = 0;

    while ((opt = getopt(argc, argv, "imnpuU")) != -1) {
        switch (opt) {
        case 'i': flags |= CLONE_NEWIPC;        break;
        case 'm': flags |= CLONE_NEWNS;         break;
        case 'n': flags |= CLONE_NEWNET;        break;
        case 'p': flags |= CLONE_NEWPID;        break;
        case 'u': flags |= CLONE_NEWUTS;        break;
        case 'U': flags |= CLONE_NEWUSER;       break;
        default:  usage(argv[0]);
        }
    }

    if (optind >= argc)
        usage(argv[0]);

    if (unshare(flags) == -1)
        errExit("unshare");

    execvp(argv[optind], &argv[optind]);
    errExit("execvp");
}

SEE ALSO

unshare(1), clone(2), fork(2), kcmp(2), setns(2), vfork(2), namespaces(7)

λ¦¬λˆ…μŠ€ 컀널 μ†ŒμŠ€ 트리의 Documentation/userspace-api/unshare.rst (λ¦¬λˆ…μŠ€ 4.12 μ „μ—λŠ” Documentation/unshare.txt)


2019-03-06

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