KOF 2019 の講演資料です。 参考となる情報にはPDF中からリンクをしていますが、資料中のリンクは Speaker Deck 上ではクリックできないので PDF をダウンロードしてご覧ください。
ྺ࢙〾ඥղ。 Linux じがぼ゚〣ぢアふべػೳKOF 2019Ճ౻ହจʢ@ten_forwardʣ2019-11-08lxc-jp Project1/39
View Slide
ࣗݾհʢ1ʣՃ౻ହจTwitter @ten_forwardgithub https://github.com/tenforwardٕज़ϒϩά https://tenforward.hatenablog.com/ॴଐ גࣜձࣾ IDC や゜アふくぎ / lxc-jp Project2/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
ぢアふべ〝〤ぢアふべ〝〤ゆ゜なと〜『:• ී௨〠ىಈ「〔ゆ゜なと〝〤গ「ҧ⿸ʮଐੑʯࢦఆ〜 • ゆ゜なとぇִ͞Εۭͨؒ〜࣮ߦ『• ゆ゜なと〠゙ぬがと੍ݶぇઃఆ〜 • なずゔ゙ふくʮଐੑʯぇઃఆ〜 • 〟〞ʜ7/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
ぢアふべ〣やきぐ゚てとふわ• ぢアふべ〣ぐゐがで〤りとぷ〣⿴ぶく゛ぜぷ゙ҎԼ〠ల։《ぁ〈〝ଟ⿶• りとぷ〾〤ぢアふべぐゐがで〣び゙がぇؚ〶〛『〮〛ݟ⿺• ぢアふべ〜〤ぢアふべ〣び゙が「ݟ⿺〟⿶りとぷ〾ݟ〔ぶく゛ぜぷ゙び゙が ぢアふべ〾ݟ〔ぶく゛ぜぷ゙び゙が〈ぁ〤〞⿸〹〘〛࣮ݱ《ぁ〛⿶〣ʁ10/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 jail2002 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 / lxcexecʣ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
〉ਗ਼ௌ⿴〿〝⿸〉》⿶〳「〔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