คุณจำเป็นต้องเพิ่มอย่างชัดเจน CAP_MKNOD ความสามารถที่คุณภาชนะ
lxc.cap.keep
Specify the capability to be kept in the container. All other
capabilities will be dropped. When a special value of "none"
is encountered, lxc will clear any keep capabilities specified
up to this point. A value of "none" alone can be used to drop
all capabilities.
คุณสามารถลองทำสิ่งนี้โดยอัตโนมัติ (หากคุณใช้systemd
ภายในคอนเทนเนอร์) โดยใช้:
lxc.hook.autodev
A hook to be run in the container's namespace after mounting
has been done and after any mount hooks have run, but before
the pivot_root, if lxc.autodev == 1. The purpose of this hook
is to assist in populating the /dev directory of the container
when using the autodev option for systemd based containers.
The container's /dev directory is relative to the
${LXC_ROOTFS_MOUNT} environment variable available when the
hook is run.
ซึ่งสามารถชี้ไปที่สคริปต์ที่ทำงานmknod
อยู่
การใช้docker
สิ่งนี้ทำได้ง่ายมาก โดยค่าเริ่มต้นภาชนะด้อยโอกาส
ในตัวอย่างนี้ฉันดึงtrusty
ภาชนะจากรีจิสทรี:
sudo -r sysadm_r docker pull corbinu/docker-trusty
Pulling repository corbinu/docker-trusty
...
Status: Downloaded newer image for corbinu/docker-trusty:latest
และฉันเริ่มต้นในโหมดอินเทอร์แอคทีฟแจ้งเกี่ยวกับความสามารถที่ฉันต้องการภายใน:
sudo -r sysadm_r docker run --cap-drop ALL --cap-add MKNOD \
-i -t corbinu/docker-trusty bash
root@46bbb43095ec:/# ls /dev/
console fd/ full fuse kcore mqueue/ null ptmx pts/ random shm/ stderr stdin stdout tty urandom zero
root@46bbb43095ec:/# mkdir /dev/net
root@46bbb43095ec:/# mknod /dev/net/tun c 10 200
root@46bbb43095ec:/# ls -lrt /dev/net/tun
crw-r--r--. 1 root root 10, 200 Apr 6 16:52 /dev/net/tun
ตรงข้ามกับ:
sudo -r sysadm_r docker run --cap-drop ALL \
-i -t corbinu/docker-trusty bash
root@9a4cdc75a5ec:/# mkdir /dev/net
root@9a4cdc75a5ec:/# mknod /dev/net/tun c 10 200
mknod: ‘/dev/net/tun’: Operation not permitted
lxc.mount.entry = /dev/net/tun dev/net/tun none bind,create=file
ไฟล์ config ของคอนเทนเนอร์ดังที่อธิบายไว้ที่นี่: superuser.com/a/1205662/130915จากนั้นฉันก็วิ่ง openvpn เป็นรูทที่มี sudo อยู่ภายในคอนเทนเนอร์