TenForward

技術ブログ。はてなダイアリーから移転しました

Google Chrome の Namespace 利用のメモ

(2016-05-16 Chromium の参考ページが移動していたので更新)

過去に勉強会なんかで「Linux 版の Chrome は Namespace を使ってる」という話をしたことあるけど、そういえば確認したことはなかったので確認したメモ。

参考はこの辺り。

pidns と netns を使ってそうです。

まず Google Chrome を起動します。最近 Linux 版は重くて使ってないけど。

$ pstree -p
    :(snip)
        |-chrome(29616)-+-chrome-sandbox(29618)---chrome(29620)-+-chrome(29630)-+-chrome(29701)-+-{chrome}(29702)
        |               |                                       |               |               |-{chrome}(29720)
    :(snip)
        |               |                                       `-chrome-sandbox(29624)---nacl_helper(29625)
    :(snip)

chrome-sandbox ってのがこの辺り作りそうですね。

まずはinitの名前空間を確認します。

# ls -l /proc/1/ns
合計 0
lrwxrwxrwx 1 root root 0  3月  9日  19:02 ipc -> ipc:[4026531839]
lrwxrwxrwx 1 root root 0  3月  9日  19:02 mnt -> mnt:[4026531840]
lrwxrwxrwx 1 root root 0  3月  9日  19:02 net -> net:[4026531956]
lrwxrwxrwx 1 root root 0  3月  9日  19:02 pid -> pid:[4026531836]
lrwxrwxrwx 1 root root 0  3月  9日  19:02 user -> user:[4026531837]
lrwxrwxrwx 1 root root 0  3月  9日  19:02 uts -> uts:[4026531838]

次に chrome-sandbox の子プロセスの chrome の ns を確認。

# ls -l /proc/29620/ns
合計 0
lrwxrwxrwx 1 karma users 0  3月  9日  20:06 ipc -> ipc:[4026531839]
lrwxrwxrwx 1 karma users 0  3月  9日  20:06 mnt -> mnt:[4026531840]
lrwxrwxrwx 1 karma users 0  3月  9日  20:06 net -> net:[4026532408]
lrwxrwxrwx 1 karma users 0  3月  9日  20:06 pid -> pid:[4026532406]
lrwxrwxrwx 1 karma users 0  3月  9日  20:06 user -> user:[4026531837]
lrwxrwxrwx 1 karma users 0  3月  9日  20:06 uts -> uts:[4026531838]

net と pid が異なるのが、上記の特殊なシンボリックリンク先でわかりますね (数字が違う)。他は同じです (数字が同じ)。

実際この Namespace 内に入ってみましょう。

# nsenter -t 29620 -n -p

まずは netns の確認。

# ip a
1: lo: <LOOPBACK> mtu 65536 qdisc noop state DOWN group default 
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00

新たに netns を作ったので、インターフェースはループバックしかありません。

次に pidns の確認。ps とかのこの辺り確認するコマンドは /proc を見ますので、このままだと親 ns の結果が出ますので使えません (うっかりしててハマった ^^;)。新たに procfs をマウントしてみます。

# mount -t proc proc /mnt
# ls /mnt
1/   acpi/      dma          key-users   mtrr          sysrq-trigger
11/  asound/    driver/      keys        net@          sysvipc/
21/  buddyinfo  execdomains  kmsg        pagetypeinfo  thread-self@
28/  bus/       fb           kpagecount  partitions    timer_list
3/   cgroups    filesystems  kpageflags  sched_debug   tty/
4/   cmdline    fs/          loadavg     scsi/         uptime
58/  config.gz  interrupts   locks       self@         version
6/   consoles   iomem        meminfo     slabinfo      vmallocinfo
82/  cpuinfo    ioports      misc        softirqs      vmstat
9/   crypto     irq/         modules     stat          zoneinfo
93/  devices    kallsyms     mounts@     swaps
97/  diskstats  kcore        mpt/        sys/

pidns 内の PID=1 はこんなです。

# cat /mnt/1/cmdline ; echo
/opt/google/chrome/chrome --type=zygote