Upgrade to Pro — share decks privately, control downloads, hide ads and more …

コンテナの実現とその実装

0n1shi
March 27, 2019
130

 コンテナの実現とその実装

0n1shi

March 27, 2019
Tweet

Transcript

  1. 自己紹介 大西 和貴 (@_k_onishi_) https://k-onishi.github.io/ SAKURA Internet Inc. アプリケーショングループ レンタルサーバーチーム

    Typescript / Go / PHP / ... Linux / Kernel / CPU / Container / Virtualization / Pwn / C / Assembly / Python Linux Kernel 勉強会
  2. cgroupでは以下の項目(コントローラ)に制限を設けることが可能である。 • cpu: CPUへのアクセス • cpuacct: CPUについての自動レポートを生成 • cpuset: マルチコアCPUのコア単位およびメモリノードを割り当て

    • memory: メモリに対する制限設定と自動レポートの生成 • blkio: ブロックデバイスの入出力アクセス • devices: デバイスへのアクセス • net_cls: ネットワークパケットへのタグ付け • net_prio: ネットワークトラフィックの優先度を動的に設定 • freezer: タスクを一時停止または再開 コンテナの実現(cgroups)
  3. コンテナの実現(cgroups) # cgroupの作成 $ cgcreate -g blkio,memory,cpu,pids:test # 指定のプロセスをcgroupに参加させる。 $

    echo $$ 2006 $ cgclassify -g blkio,memory,cpu,pids:test 2006 # 1秒間に0.5秒CPUリソースに対するアクセスを許可する $ cgset -r cpu.cfs_period_us=1000000 test $ cgset -r cpu.cfs_quota_us=500000 test # # cgroupを削除する。 $ cgdelete -g blkio,memory,cpu,pids:test
  4. • CAP_SYS_BOOT reboot(2) と kexec_load(2) を呼び出す • CAP_SYS_CHROOT chroot(2). を呼び出す

    • CAP_SYS_MODULE カーネルモジュールのロード、アンロードを行う (init_module(2) と delete_module(2) を参照のこと) コンテナの実現(Linux Capabilities)
  5. • CAP_SYS_NICE 任意のプロセスの nice 値の変更を行う • CAP_SYS_PTRACE ptrace(2) を使って任意のプロセスをトレースする •

    CAP_SYS_TIME システムクロックを変更する (settimeofday(2), stime(2), adjtimex(2)) コンテナの実現(Linux Capabilities)
  6. ハンズオン # 新たなルートディレクトリを作成。 $ mkdir my_container; cd $_ # ライブラリとユーティリティの用意

    $ sudo cp -r /bin ./ $ sudo cp -r /lib ./ $ sudo cp -r /lib64 ./ # 名前空間の分離とルートディレクトリの変更 $ sudo unshare --pid --fork chroot . /bin/bash # ~ ここからコンテナ内部 ~
  7. ハンズオン # proc fsの作成 # mkdir -p /proc # mount

    -t proc proc /proc # psコマンドの実行 # ps PID TTY TIME CMD 1 ? 00:00:00 bash 4 ? 00:00:00 ps