Share
Embed
歴史から紐解く Linux カーネルのコンテナ機能 / KOF2019
KOF 2019 の講演資料です。
参考となる情報にはPDF中からリンクをしていますが、資料中のリンクは Speaker Deck 上ではクリックできないので PDF をダウンロードしてご覧ください。
tenforward
November 08, 2019
Transcript
40 slides
-
ࣗݾհʢ1ʣ Ճ౻ହจ Twitter @ten_forward github https://github.com/tenforward ٕज़ϒϩά https://tenforward.hatenablog.com/ ॴଐ גࣜձࣾ
IDC や゜アふくぎ / lxc-jp Project 2/39 -
ࣗݾհʢ2ʣ झຯ〜ぢアふべ〹〘〛〳『ɻぢアふべ〣ओ〠じがぼ゚पล〣࣮〠ڵຯ⿴〿〳『ɻ 2007 ぢアふべぇ〘〔つがもと։ൃʢVirtuozzoʣ 2009 OpenVZ/LXC ৮〿〕『 2013
ୈ 1 ճぢアふべܕԾԽ〣ใަձɹ։࠵ LXC ຊޠ man pages ༁&ろがで ʢݱࡏ〤 LXD ؔ࿈〣༁ɺlinuxcontainers.org ༁〷〹〘〛〳『ʣ 2014 gihyo.jp 〜 ʮLXC 〜ֶ〫ぢアふべೖ ʵܰྔԾԽڥぇ࣮ݱ『ٕज़ʯ ࿈ࡌ։࢝ ݱࡏ CloudNative 〣〠〿ぁ 3/39 -
ຊ〣༰ ぢアふべ〝〤 ぢアふべ〣やきぐ゚てとふわ 2000 ʙ2006 〣ぢアふべք۾ ゆ゜なと〣ִ ぢアふべ〣ぼひぷゞがぜ 2009ʙ2012 〣ぢアふべք۾
2013 〣ぢアふべք ඇಛݖぢアふべʢUser namespaceʣ 2014 Ҏ߱〣ぢアふべք۾ 〳〝〶 4/39 -
ຊ〣༰ ɹʮྺ࢙ぇඥղ。ʯ〝⿶⿸のぐぷ゚〜『ɺྺ࢙ぇશ෦〘〛⿶〝࣌ؒ〿〳【えɻ࣍〣෦ 〣ゃひぜぎひゆ「〛આ໌「〳『ɻ • ぢアふべ〝〤 • ぢアふべ〣やきぐ゚てとふわ • ぢアふべ〣ぼひぷゞがぜ •
ぢアふべ〣࣮ߦݖݶ ɹ〳〔ɺ࠷ۙ〤 OCI 〠४ڌ「〔ଟ〣ぢアふべアのぐわग़〛 〛⿶〳『ɻ〈〣த〠〤 VM 〹 Unikernel 〟〞〣ٕज़ぇ〘〔アのぐわ⿴〿〳『ɺຊѻ⿸〣〤ੲ〾ʮぢアふべʯ 〝ݺ〥ぁ〛⿶〔ɺゆ゜なとִܕ〣ʮぢアふべʯ〜『ɻ ɹぢアふべ࡞〠⿸ぢろアへ〤 unshare ぢろアへɺip ぢろアへ〜『ʢDocker 〹 LXC 〤 ⿶〳【え!!ʣ ɻ 5/39 -
ຊ〣༰ ぢアふべ〝〤 ぢアふべ〣やきぐ゚てとふわ 2000 ʙ2006 〣ぢアふべք۾ ゆ゜なと〣ִ ぢアふべ〣ぼひぷゞがぜ 2009ʙ2012 〣ぢアふべք۾
2013 〣ぢアふべք ඇಛݖぢアふべʢUser namespaceʣ 2014 Ҏ߱〣ぢアふべք۾ 〳〝〶 6/39 -
Linux 〠々ぢアふべ Linux じがぼ゚〠〤ʮぢアふべʯ〝⿶⿸ػೳ〤͋Γ·ͤΜɻじがぼ゚〠࣮《ぁ〔৭ʑ〟ػೳΛ Έ߹ΘͤͯʮίϯςφʯΛ࡞Γ·͢ɻ Docker 〹 LXC/LXD 〝ݴ〘〔ぢアふべ࣮ぇ⿸い〿〠ࣗʹඞཁͳػೳ͚ͩΛબΜͰίϯ ςφΛ࡞Δ͜ͱͰ͖·͢ɻ
Linux じがぼ゚〠࣮《ぁ〔⿸〖ɺぢアふべ༻〣ओཁػೳ: Namespaceʢ໊લۭؒʣ: ʮִۭؒʯΛ࡞Δɻִ͢ΔϦιʔε͝ͱ〠 Namespace ଘࡏ cgroup: ゆ゜なと〠ର「〛Ϧιʔε੍ݶΛߦ͏ ຊ〤〈〣⿸〖 Namespace ぇத৺〠「〳『ʢKubernetes 〜〷 Namespace 〝⿶⿸໊ લग़〛 〳『ɺ〒ぁ〝〤ผ〣 Linux kernel 〣ػೳ〜『ʣ ɻ 8/39 -
ຊ〣༰ ぢアふべ〝〤 ぢアふべ〣やきぐ゚てとふわ 2000 ʙ2006 〣ぢアふべք۾ ゆ゜なと〣ִ ぢアふべ〣ぼひぷゞがぜ 2009ʙ2012 〣ぢアふべք۾
2013 〣ぢアふべք ඇಛݖぢアふべʢUser namespaceʣ 2014 Ҏ߱〣ぢアふべք۾ 〳〝〶 9/39 -
chroot ͬͱྺ࢙ͷ͋Δίϯςφʢతػೳʣ • 1979 UNIX Version 7 〜〣৽ػೳʢੜ〳ぁ〛〔ਓʂʣ •
1982 〠 BSD 〠ಋೖ • chroot 「〔ぶく゛ぜぷ゙ҎԼ「ݟ⿺〟⿶ • Linux 〠々 chroot: • ゆ゜なと〤゚がぷぶく゛ぜぷ゙〣ใぇ࣋〘〛⿶ chroot 「〛⿶〟⿶ゆ゜なと chroot 「〔ゆ゜なと 11/39 -
chroot 〣ɾたがむも゙ふく • chroot 〤ൈ々ग़【! • ൈ々ग़【〟⿶〽⿸〠『〠〤ݖݶぇണୣ『ඞཁ⿴ʢcap_sys_chroot たがむも゙ふくʣ • 〞〣〽⿸〠いぁい〾〟⿶ぢアふべごアでア〜〤⿶〚〾⿶ʢcap_sys_chroot
ඞཁ〷?ʣ たがむも゙ふく〝〤? • root ࣋〘〛⿶ݖݶぇࡉԽ「〛そ゚がゆԽ「〔〷〣ɻそ゚がゆ〉〝〠༗ޮɾແޮぇࢦ ఆ〜 12/39 -
pivot_rootʢ2.3.41/2000 ʣ • root ϑΝΠϧγεςϜࣗମΛऔΓସ͑Δʢൈ々〝⿶⿸֓೦〟⿶ʣ • chroot 〠ൺ〮〛 pivot_root 〜 ݅〤ݫ「⿶
pivot_root લ pivot_root ޙ • ʮ৽「⿶ root やきぐ゚てとふわʯ〾〤ൈ々ग़【〟⿶ • Docker 〹 LXC/LXD 〟〞〤 pivot_root ぇ༻「〛⿶ 13/39 -
bind mountʢ2.4.0/2001 ʣ • ぶく゛ぜぷ゙び゙が〣Ұ෦ぇผ〣ぶく゛ぜぷ゙ҎԼ〠ろげアぷ • ろげアぷ「〔ぶく゛ぜぷ゙ҎԼ〤ݩ〝ಉ」ゑぽݟ⿺ • りとぷ〣ぶく゛ぜぷ゙ぇぢアふべ〝ڞ༗『߹〠〷༻ pivot_root
લ pivot_root ޙ • bind mount 「〔び゙が〤ろげアぷ《ぁ〛〿やきぐ゚てとふわ〘〲。〟〣〜 pivot_root Ͱ͖Δ! 14/39 -
Mount namespaceʢ2.4.19/2002 ʣ • ぢアふべ〣ろげアぷɺろげアぷૢ࡞ぇ『 • ⿴ぢアふべ〜ߦ〘〔ろげアぷɺぎアろげアぷଞ〣ぢアふべ〠Өڹぇ༩⿺〟⿶〽⿸〠 『 • 「〟⿶〽⿸〠〷〜 ʢsystemd
〤ぶやさ゚ぷ〜「〟⿶ঢ়ଶ〜ىಈ『ʣ • ଞ〣ぢアふべ〜ߦ〘〔ろげアぷૢ࡞ݟ⿺〟⿶ 15/39 -
ぶゑʢ1ʣ pivot_root 〝 bind mount 〝 Mount namespace 〣ぶゑ Namespace
ぇ؆୯〠࡞〠〤 util_linux ଐ〣 unshare ぢろアへ⿺〳『 1. Mount namespace ぇ࡞ 2. pivot_root 『〔〶〠ぢアふべやきぐ゚てとふわぇผぶく゛ぜぷ゙〠 bind mount 『 3. mount ใぇऔಘ『〔〶〠ぢアふべ༻〠 proc やきぐ゚てとふわぇ mount 『 4. pivot_root 『ʢҎલ〣 / 〤 /old 〠ろげアぷ『ʣ 5. ぢアふべ〜 / ぇ umount 『 16/39 -
ຊ〣༰ ぢアふべ〝〤 ぢアふべ〣やきぐ゚てとふわ 2000 ʙ2006 〣ぢアふべք۾ ゆ゜なと〣ִ ぢアふべ〣ぼひぷゞがぜ 2009ʙ2012 〣ぢアふべք۾
2013 〣ぢアふべք ඇಛݖぢアふべʢUser namespaceʣ 2014 Ҏ߱〣ぢアふべք۾ 〳〝〶 17/39 -
2000 ʙ2005 〣ぢアふべք۾ɹ〒〣ଞ〣 2000 FreeBSD jail 2002 VirtuozzoʢLinux
々༻ぢアふべʣ゙゙がとʢ։ൃ〤 1999 ։࢝ʣ 2004 Solaris Containers (Zone) 2005 OpenVZ ゆ゜でこぜぷൃʢOSS ൛ Virtuozzoʣ 18/39 -
2006ʙ2008 〣ぢアふべք۾ Linux ぢアふべظ ୈҰظ 2006 UTS Namespace, IPC
Namespaceʢ2.6.19ʣ りとぷ໊ɾへゐぐア໊ぇぢアふべ〉〝〠࣋〙ɺゆ゜なとؒ௨৴〟〞ぇぢアふべ 〠ִ 2007 macvlanʢ2.6.23ʣぼひぷゞがぜぐアのがやこがと 2008 pid Namespace, Network Namespace, vethʢ2.6.24ʣ ゆ゜なとɺぼひぷゞがぜ〣ִ cpu, cpuacct, cpuset cgroupʢ2.6.24ʣ CPU 〠ର『゙ぬがと੍ݶ device cgroupʢ2.6.26ʣ freezer cgroupʢ2.6.28ʣ 19/39 -
ຊ〣༰ ぢアふべ〝〤 ぢアふべ〣やきぐ゚てとふわ 2000 ʙ2006 〣ぢアふべք۾ ゆ゜なと〣ִ ぢアふべ〣ぼひぷゞがぜ 2009ʙ2012 〣ぢアふべք۾
2013 〣ぢアふべք ඇಛݖぢアふべʢUser namespaceʣ 2014 Ҏ߱〣ぢアふべք۾ 〳〝〶 20/39 -
PID Namespaceʢ2.6.24/2008 ʣ • ぢアふべ〜〞え〟ゆ゜なとぇ࣮ߦ「〛⿶ɺଞ〣ぢアふべ〾ݟ⿺〔〾ぐん • ぢアふべ〉〝〠ಠཱ「〛 PID ぇ࣋〖〔⿶ •
〔〕「ɺりとぷ ( Namespace) 〾ぢアふべ (ࢠ〣 Namespace) 〣ゆ゜なと〤ݟ⿺ 〳『 21/39 -
ຊ〣༰ ぢアふべ〝〤 ぢアふべ〣やきぐ゚てとふわ 2000 ʙ2006 〣ぢアふべք۾ ゆ゜なと〣ִ ぢアふべ〣ぼひぷゞがぜ 2009ʙ2012 〣ぢアふべք۾
2013 〣ぢアふべք ඇಛݖぢアふべʢUser namespaceʣ 2014 Ҏ߱〣ぢアふべք۾ 〳〝〶 22/39 -
Network Namespaceʢ2.6.24/2008 ʣ Network Namespace ぼひぷゞがぜؔ࿈〣゙ぬがとぇִ『 • ぼひぷゞがぜぐアのがやこがと ʢଞ〣 Namespace
〾ݟ⿺〟。〟〿〳『ʣ • ぎへ゛と • れがぷ • ゚がふくアそ • Firewall • ʜ • ཧぐアのがやこがと〷ಛఆ〣 Namespaceʢぢアふべʣ〠ॴଐ《【〾ぁ • ಛఆ〣ぐアのがやこがとぇෳ〣 Namespaceʢぢアふべʣ〜ڞ༗〜 23/39 -
veth ぐアのがやこがとʢ2.6.24/2008 ʣ • Virtuozzo/OpenVZ ༝དྷ • ࡞『〝ର〝〟ぐアのがやこがとੜ《 ぁɻ〒〣ର〝〟ぐアのがやこがとؒ〜௨৴ ぇߦ⿸ʹ
L2 〣ぷアぼ゚ • ର〣ยํぇりとぷɺยํぇぢアふべ〣 Namespace 〠ॴଐ《【ʢҟ〟 Namespace ؒ〜〟⿶〝௨৴ෆՄʣ 24/39 -
ぶゑʢ2ʣ Network Namespace 〝 veth ぇ࡞〿ɺveth ぐアのがやこがとぇ Namespace 〠ॴଐ《【 〛௨৴『
Network Namespace ぇ࡞〠〤 iproute2 ଐ〣 ip netns ぢろアへ⿺〳『 1. Network namespace ぇ࡞ • Namespace 〣ぐアのがやこがと〣֬ೝ 2. veth ぐアのがやこがとらぎぇ࡞ 3. veth ぐアのがやこがと〣ยׂぁぇ Namespace 〠Ҡ『 4. veth ぐアのがやこがとらぎ〣〒ぁ〓ぁ〠ぎへ゛とぇׂ〿〛〛 Up 『 5. veth らぎಉ࢜〜௨৴〜 〈〝ぇ֬ೝ『 25/39 -
ຊ〣༰ ぢアふべ〝〤 ぢアふべ〣やきぐ゚てとふわ 2000 ʙ2006 〣ぢアふべք۾ ゆ゜なと〣ִ ぢアふべ〣ぼひぷゞがぜ 2009ʙ2012 〣ぢアふべք۾
2013 〣ぢアふべք ඇಛݖぢアふべʢUser namespaceʣ 2014 Ҏ߱〣ぢアふべք۾ 〳〝〶 26/39 -
2009ʙ2012 〣ぢアふべք۾ 2009 Memory, net_cls cgroupʢ2.6.29ʣ ゐゑ゙ɺぼひぷゞがぜ゙ぬがと੍ݶ 2010
blkio cgroupʢ2.6.33ʣ ゅ゜ひぜぶみぐと〣 I/O ੍ݶ 2011 setns() てとふわぢが゚ʢ3.0ʣ Namespaceʢぢアふべʣ〜ゆ゜なとぇ࣮ߦ『ʢdocker exec / lxc execʣ 2012 perf_event cgroupʢ3.3ʣ Seccomp-based system call filtering (3.5) ɹ seccomp 〜ҙ〣てとふわぢが゚やく゚の〜 〽⿸〠〟〘〔 hugetlb cgroupʢ3.6ʣ ʢࡉ⿶ػೳՃ〤ଞ〠〷⿴〿〳『ʣ 27/39 -
ຊ〣༰ ぢアふべ〝〤 ぢアふべ〣やきぐ゚てとふわ 2000 ʙ2006 〣ぢアふべք۾ ゆ゜なと〣ִ ぢアふべ〣ぼひぷゞがぜ 2009ʙ2012 〣ぢアふべք۾
2013 〣ぢアふべք ඇಛݖぢアふべʢUser namespaceʣ 2014 Ҏ߱〣ぢアふべք۾ 〳〝〶 28/39 -
2013 〣ぢアふべք ぢアふべత〠ॏཁ〟 • 3.8 kernel 〤ݱࡏいぁ〛⿶ぢアふべ〣ओཁ〟ػೳଗ〘〔ॏཁ〟゙゙がと User namespace ඇಛݖʢrootlessʣぢアふべ〣࣮ݱʢ։ൃ։࢝〤〟え〝
2.6.23, 2007 !!ʣ setns() શ Namespace 〠ର「〛༻Մೳ〠〟〘〔 • Docker ݩʢ3 ݄〠 OSS 〝「〛ެ։ʣ • Checkpoint/Restart ػೳʢ3.11ʣ ⿴࣌〣ゆ゜なと〣ঢ়ଶぇอଘɺ࠶։〜 29/39 -
ຊ〣༰ ぢアふべ〝〤 ぢアふべ〣やきぐ゚てとふわ 2000 ʙ2006 〣ぢアふべք۾ ゆ゜なと〣ִ ぢアふべ〣ぼひぷゞがぜ 2009ʙ2012 〣ぢアふべք۾
2013 〣ぢアふべք ඇಛݖぢアふべʢUser namespaceʣ 2014 Ҏ߱〣ぢアふべք۾ 〳〝〶 30/39 -
User namespaceʢ3.8/2013 ʣ • root ݖݶ〜ぢアふべぇىಈ『〝ɺぢアふべ〣 root 〤りとぷʢぢアふべ֎ʣ〣 root 〝
ಉ」ݖݶぇ࣋〘〛⿶ • ぢアふべ (Namespace) ֎〝ผ〠 User namespace 〣 uid/gid ぇ࣋〛〽⿸〠〟〘 〔ʢぢアふべ֎〣 uid/gid 〝ぢアふべ〣 uid/gid ぇろひゃアそ『ʣ • User namespace Λ͏ͱɺϗετͰಛݖΛ࣋ͨͳ͍ίϯςφ͕ىಈͰ͖Δ • User namespace ҰൠϢʔβʔͰ࡞Մೳ 31/39 -
ぶゑʢ3ʣ User Namespace ぇ࡞ ࠶〨 unshare ぢろアへぇ⿶〳『 1. Ұൠゕがづが〜〤 User
namespace Ҏ֎〣 namespace 〤࡞ぁ〟⿶〈〝ぇ֬ೝ 2. User namespace ぇ࡞〿てこ゚ぇ࣮ߦ 3. てこ゚〣ಈ࡞ݖݶぇ namespace 〝 namespace ֎〾֬ೝ 4. namespace 〜やきぐ゚ぇ࡞「ɺnamespace ֎〜ॴ༗ݖぇ֬ೝ 5. User namespace 〜ଞ〣 Namespace ぇ࡞ぁ〈〝ぇ֬ೝ 6. ࡞〘〔ぢアふべ〜〤ぢアふべ〣ゆ゜なと〕々ݟ⿺〈〝ぇ֬ೝʢPID Namespaceʣ 32/39 -
ຊ〣༰ ぢアふべ〝〤 ぢアふべ〣やきぐ゚てとふわ 2000 ʙ2006 〣ぢアふべք۾ ゆ゜なと〣ִ ぢアふべ〣ぼひぷゞがぜ 2009ʙ2012 〣ぢアふべք۾
2013 〣ぢアふべք ඇಛݖぢアふべʢUser namespaceʣ 2014 Ҏ߱〣ぢアふべք۾ 〳〝〶 33/39 -
2014ʙ2016 〣ぢアふべք۾ 2014 Overlayfsʢ3.18ʣ ゕぺざアやきぐ゚てとふわ〣࣮〜ɺぶく゛ぜぷ゙ぇॏ〢߹い【〛〧〝〙〣ぶく ゛ぜぷ゙〠ݟ【 2014 cgroup
v2, ext4 〠 project quota ػೳՃʢ4.5ʣ 2016 cgroup namespaceʢ4.6ʣ ぢアふべ〉〝〠ぢアふべઐ༻〣 cgroup ぇݟ【 34/39 -
2017ʙ2019 〣ぢアふべք۾ 2017 Namespaced file capabilitiesʢ4.14ʣ User namespace 〜
file capability ઃఆ〜 2018 ඇಛݖϚϯτʢ4.18ʣ User namespace 〜 FUSE ろげアぷ 2018 PSIʢ4.20ʣ ゐゑ゙ɺCPUɺIO 〣ෛՙ૿େ「゙ぬがとෆ「〛⿶ঢ়گぇ؍ଌ 2018 seccomp trap to userspaceʢ5.0ʣ seccomp 〣ܾఆぇゕがづがとらがと〠「〛ॲཧ『 2019 LSM stackingʢ5.1ʣ AppArmor on SELinux 〝ʜ 2019 clone3() てとふわぢが゚ʢ5.3ʣ clone() てとふわぢが゚〜なひぷ〜 やそऴྃ「〔〔〶 2019 pidfdsʢ5.3ʣ PID ࠶ར༻〣ղܾ 35/39 -
ぢアふべք۾〣〈ぁ〾 〳〕〳〕৭ʑ〟ػೳఏҊ《ぁ〛⿶〳『ɻLinux じがぼ゚〠ろがで《ぁ〷〣〷《ぁ〟⿶〷〣 〷⿴〜「〼⿸ɻ ShiftFS Ubuntu 19.04 〜⿺ʢLinux じがぼ゚〠〤〳〕ろがで《ぁ〛⿶〟⿶ʣぢア ふべぐゐがで〣やきぐ゚〣
uid/gid ぇぢアふべ〣࣮ߦゕがづが〠߹い【〛มߋ 『 Container Object ಄〜ݴ〘〔ʮLinux じがぼ゚〠〤ぢアふべ〝⿶⿸ػೳ〤⿴〿〳【えʯ ぇ࣮ݱ『ػೳ Time namespace ぢアふべ〉〝〠࣌ぇม⿺〾ぁ 36/39 -
ຊ〣༰ ぢアふべ〝〤 ぢアふべ〣やきぐ゚てとふわ 2000 ʙ2006 〣ぢアふべք۾ ゆ゜なと〣ִ ぢアふべ〣ぼひぷゞがぜ 2009ʙ2012 〣ぢアふべք۾
2013 〣ぢアふべք ඇಛݖぢアふべʢUser namespaceʣ 2014 Ҏ߱〣ぢアふべք۾ 〳〝〶 37/39 -
〳〝〶 ྺ࢙ぇ〔〞〿〟〾 Linux 〠࣮《ぁ〛⿶ぢアふべؔ࿈〣ػೳぇ΄Μͷগ͠հ「〳「〔 • Linux 〠〤ʮぢアふべʯ〝⿶⿸ػೳ〤〟。ɺ৭ʑ〟ػೳ〣〴߹い【〜ぢアふべ࡞〾ぁ • ゙ぬがと〉〝〠४උ《ぁ〔 Namespace
ػೳ〜৭ʑ〟ִۭؒぇ࡞ • MountɺPIDɺNetworkɺUser Namespace 〝ؔ࿈『ػೳぇઆ໌ • ぢアふべ〠ؔ『ػೳ〞え〞え Linux じがぼ゚〠Ճ《ぁɺࠓ〜〷ଟ〣ػೳఏҊ 《ぁ〛⿶ 38/39 -
ࢀߟ • ぐアやษڧձʮ[ぢアふべ〣ྺ࢙]Docker 〜 〳〜ʯࢿྉ • ୈ 2 ճ • ୈ
3 ճ • ぢアふべٕज़ೖ - ԾԽ〝〣ҧ⿶ぇ〿ɺཁૉٕज़ぇ৮〘〛ֶ〱⿸ʢby hayajo_77 《 え / ごアでぺぎ Hubʣ • LXC 〜ֶ〫ぢアふべೖ ʵܰྔԾԽڥぇ࣮ݱ『ٕज़ (gihyo.jp) • Linux ぢアふべ〣෦ぇあ⿸ • Linux ぢアふべ࠷৽ใʢ2013-06-01ʣ • History of containersʢS3hh’s Blogʣ 39/39