2016年12月3日土曜日

gentooでsystemd-nspawnやってみた

gentooでsystemd-nspawnしてみた


ここのところずっとSolaris Zoneばかりを触っていて、Linux系コンテナから離れていたのですが
最近、systemd-nspawnなるものを知ってしまい、どんなものかと触ってみた。

CentOS7をsystemd-nspawnで動かしてみる


gentooのカーネルは、bridge系、cgroups系、btrfs系はあらかじめ入れたカーネルで起動しておく、この辺はハショリマス

rpmのインストール


luaとcapsを入れておく
ugui7 ~ # USE="lua caps" emerge app-arch/rpm
でbtrfs
ugui7 ~ # emerge sys-fs/btrfs-progs

yumのインストール

ugui7 ~ # emerge sys-apps/yum
ホストOSのyumのディレクトリにCentOS-Base.repoを設置する、適当なCentOSから持ってきても動くはず

* /etc/yum/repos.d/CentOS-Base.repo
# CentOS-Base.repo
#
# The mirror system uses the connecting IP address of the client and the
# update status of each mirror to pick mirrors that are updated to and
# geographically close to the client.  You should use this for CentOS updates
# unless you are manually picking other mirrors.
#
# If the mirrorlist= does not work for you, as a fall back you can try the
# remarked out baseurl= line instead.
#
#

[base]
name=CentOS-$releasever - Base
mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=os&infra=$infra
#baseurl=http://mirror.centos.org/centos/$releasever/os/$basearch/
gpgcheck=0
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7

#released updates
[updates]
name=CentOS-$releasever - Updates
mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=updates&infra=$infra
#baseurl=http://mirror.centos.org/centos/$releasever/updates/$basearch/
gpgcheck=0
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7

#additional packages that may be useful
[extras]
name=CentOS-$releasever - Extras
mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=extras&infra=$infra
#baseurl=http://mirror.centos.org/centos/$releasever/extras/$basearch/
gpgcheck=0
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7

#additional packages that extend functionality of existing packages
[centosplus]
name=CentOS-$releasever - Plus
mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=centosplus&infra=$infra
#baseurl=http://mirror.centos.org/centos/$releasever/centosplus/$basearch/
gpgcheck=0
enabled=0
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7

yumがpython2系でしか動かないので切り替える
ugui7 ~ # eselect python set 1
ugui7 ~ # eselect python list
Available Python interpreters:
  [1]   python2.7 *
  [2]   python3.4
ugui7 ~ #

CentOS7のインストール


btrfsでsubvolumeを作成、あってるかどうかはわからない
ugui7 ~ # btrfs subvolume create /var/lib/machines/centos7
Create subvolume '/var/lib/machines/centos7'
ugui7 ~ #

subvolumeへcentos7をインストール

ugui7 ~ # yum -y --releasever=7 --nogpg --installroot=/var/lib/machines/centos7 --disablerepo='*' --enablerepo=base install systemd yum passwd emacs-nox iputils iproute NetworkManager

...
...
 sqlite                         x86_64   3.7.17-8.el7        base    393 k
  systemd-libs                  x86_64   219-19.el7          base    356 k
  trousers                      x86_64   0.3.13-1.el7        base    289 k
  tzdata                        noarch   2015g-1.el7         base    431 k
  ustr                          x86_64   1.0.4-16.el7        base     92 k
  util-linux                    x86_64   2.23.2-26.el7       base    1.9 M
  xz                            x86_64   5.1.2-12alpha.el7   base    200 k
  xz-libs                       x86_64   5.1.2-12alpha.el7   base    102 k
  yum-metadata-parser           x86_64   1.1.4-10.el7        base     28 k
  yum-plugin-fastestmirror      noarch   1.1.31-34.el7       base     30 k
  zlib                          x86_64   1.2.7-15.el7        base     89 k

トランザクションの要約
==========================================================================
インストール  5 パッケージ (+159 個の依存関係のパッケージ)
  
合計容量: 108 M
総ダウンロード容量: 91 M
インストール済み容量: 446 M
Downloading packages:
(1/139): emacs-common-24.3-18.el7.x86_64.rpm                                              |  20 MB     00:02
(2/139): emacs-filesystem-24.3-18.el7.noarch.rpm                                          |  58 kB     00:00
(3/139): emacs-nox-24.3-18.el7.x86_64.rpm                                                 | 2.4 MB     00:01
(4/139): expat-2.1.0-8.el7.x86_64.rpm                                                     |  80 kB     00:00
(5/139): file-libs-5.11-31.el7.x86_64.rpm                                                 | 339 kB     00:00
(6/139): filesystem-3.2-20.el7.x86_64.rpm                                                 | 1.0 MB     00:00
(7/139): findutils-4.5.11-5.el7.x86_64.rpm                                                | 559 kB     00:00
(8/139): gawk-4.0.2-4.el7.x86_64.rpm                                                      | 873 kB     00:00
(9/139): gdbm-1.10-8.el7.x86_64.rpm                                                       |  70 kB     00:00
(10/139): glib2-2.42.2-5.el7.x86_64.rpm                                                   | 2.2 MB     00:01
(11/139): glibc-2.17-105.el7.x86_64.rp (35%) 63% [==================           ] 844 kB/s | 2.3 MB     00:01 ETA
...
...
  shared-mime-info.x86_64 0:1.1-9.el7    sqlite.x86_64 0:3.7.17-8.el7    systemd-libs.x86_64 0:219-19.el7
  trousers.x86_64 0:0.3.13-1.el7    tzdata.noarch 0:2015g-1.el7    ustr.x86_64 0:1.0.4-16.el7
  util-linux.x86_64 0:2.23.2-26.el7    xz.x86_64 0:5.1.2-12alpha.el7    xz-libs.x86_64 0:5.1.2-12alpha.el7
  yum-metadata-parser.x86_64 0:1.1.4-10.el7  yum-plugin-fastestmirror.noarch 0:1.1.31-34.el7  zlib.x86_64 0:1.2.7-15.el7

完了しました!
ugui7 ~ # 

passwdの設定


rootのパスワードを設定する
ugui7 ~ # systemd-nspawn -D /var/lib/machines/centos7

# passwd root
....
machinectl loginで入れない場合は以下の設定でpts/0を追記する
guest $ echo "pts/0" >> /etc/securetty

コンテナを起動


コンテナを起動してログインしてみる、やっぱカーネルはgentoo、なんかウケる、「Ctrl + ]」の3連発でコンテナから脱出できる
ugui7 ~ # machinectl start centos7
ugui7 ~ # machinectl login centos7
Connected to machine centos7. Press ^] three times within 1s to exit session.

CentOS Linux 7 (Core)
Kernel 4.4.26-gentoo on an x86_64

centos7 login:

ネットワークの設定がよくわかってない


gentooの設定がよくわからなかった、bridgeで固定IPを設定したが設定の仕方が違う感じがする、だれか標準的なやり方教えて...

* /usr/lib64/systemd/network/80-container-ve.network

「Address=...」をコメントアウト
#  This file is part of systemd.
#
#  systemd is free software; you can redistribute it and/or modify it
#  under the terms of the GNU Lesser General Public License as published by
#  the Free Software Foundation; either version 2.1 of the License, or
#  (at your option) any later version.

[Match]
Name=ve-*
Driver=veth

[Network]
# Default to using a /28 prefix, giving up to 13 addresses per container.
# Address=0.0.0.0/28
LinkLocalAddressing=yes
DHCPServer=yes
IPMasquerade=yes
コンテナをstartして、vethをbridgeへaddifする
ugui7 ~ # brctl addif br0 ve-centos7
ゲストの中に入ってhost0を確認するとIPがついてる...DHCPになっているけどよくわからん
-bash-4.2# ip a
1: lo:  mtu 65536 qdisc noqueue state UNKNOWN qlen 1
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: host0@if5:  mtu 1500 qdisc noqueue state UP qlen 1000
    link/ether xx:xx:xx:xx:xx:xx brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet 192.168.0.111/24 brd 192.168.0.255 scope global dynamic host0
       valid_lft 86402sec preferred_lft 86402sec
    inet6 xxxx::xxxx:vvvv:xxxx:xxxx/xx scope link
       valid_lft forever preferred_lft forever
-bash-4.2#

btrfsをつかってクローンしてみる


まず止める、いいかどうかは不明
ugui7 ~ # machinectl poweroff centos7
btrfsのcloneでコンテナをファイルシステムましcloneする
ugui7 ~ # machinectl clone centos7 centos7-c
ugui7 ~ # btrfs sub list /var/lib/machines/
ID 261 gen 1102 top level 5 path srv
ID 262 gen 10687 top level 5 path var/lib/machines
ID 291 gen 10687 top level 262 path centos7
ID 292 gen 10688 top level 291 path centos7/var/lib/machines
ID 293 gen 10688 top level 262 path centos7-c
ID 294 gen 10688 top level 293 path centos7-c/var/lib/machines
ugui7 ~ #
ugui7 ~ # machinectl start centos7
ugui7 ~ # machinectl start centos7-c
ugui7 ~ # machinectl list
MACHINE   CLASS     SERVICE
centos7   container nspawn
centos7-c container nspawn

2 machines listed.
ugui7 ~ #
Linux系のコンテナまわりの違いが、わからない... LXCとかぶるんだけど、勉強し直しか、まぁでも簡単に入れられるので、gentoo 万歳