高校二年生のとき、中学生の頃に買ったゲームボーイアドバンスを、初めていろいろ改造した。
ホワイトだった本体をウレタン塗料でがっつり黒に塗り、電源の LED を緑から青に変え、そして Afterburner と呼ばれるフロントライトを追加して、さらにその光量調節をボタン操作で行えるようにするチップ(Stealth Dimmer Chip)を取り付け。
続きを読む高校二年生のとき、中学生の頃に買ったゲームボーイアドバンスを、初めていろいろ改造した。
ホワイトだった本体をウレタン塗料でがっつり黒に塗り、電源の LED を緑から青に変え、そして Afterburner と呼ばれるフロントライトを追加して、さらにその光量調節をボタン操作で行えるようにするチップ(Stealth Dimmer Chip)を取り付け。
続きを読む前回までのエントリでは、Photon OS をデプロイして初期設定を行いました。
もともとの目的は、vCenter Server Appliance 6.5(vCSA 6.5)をお行儀のよい構成でインストールするために必要な DNS サーバを作ることです。よって今回は、前回構築した Photon OS 上で、bind をサービスする Docker コンテナを作ります。
こんな感じにします。
ベース OS の選択には特にこだわりはないので、流行に乗って Alpine Linux にします。最新版を使います。
設定ファイルの置き場所は悩みどころですが、設定の変更などがしやすくなるのでこうしました。ポータビリティは下がりますが、配布予定もないし単一のサーバでしかホストしないのでよしとします。
Docker Compose は蛇足です。本来は複数のコンテナを連携させるときに使うものですが、使ってみたかったので使ってみます。
以降、やっぱり文字ばかりになるので、きれいな孔雀の写真を載せておきます。配色が Photon OS のそれと似ていますね。
まずは Dockerfile です。作ります。コンテナイメージのレシピみたいなものです。
kuro@kuro-ph01 [ ~ ]$ vim Dockerfile kuro@kuro-ph01 [ ~ ]$ cat Dockerfile FROM alpine:latest RUN apk add bind --no-cache EXPOSE 53/udp CMD ["/usr/sbin/named", "-c", "/etc/bind/named.conf", "-u", "named", "-g"]
コンテナの中で動かす bind のための設定ファイルを作ります。
メインの named.conf と、ゾーン定義の二つのファイルを作りました。作ったファイルはひとつのディレクトリにまとめておきます。コンテナの中の named ユーザが読み取れるように、パーミッションも変更します。
kuro@kuro-ph01 [ ~ ]$ mkdir conf kuro@kuro-ph01 [ ~ ]$ vim conf/named.conf kuro@kuro-ph01 [ ~ ]$ cat conf/named.conf acl localnet { 127.0.0.1; 192.168.0.0/24; }; options { version "unknown"; directory "/var/bind"; pid-file "/var/run/named/named.pid"; recursion yes; notify no; listen-on { any; }; listen-on-v6 { none; }; allow-query { localnet; }; allow-query-cache { localnet; }; allow-recursion { localnet; }; allow-transfer { none; }; forwarders { 192.168.0.1; }; }; zone "kuro.local" IN { type master; file "/etc/bind/kuro.local.zone"; }; kuro@kuro-ph01 [ ~ ]$ vim conf/kuro.local.zone kuro@kuro-ph01 [ ~ ]$ cat conf/kuro.local.zone $TTL 1h @ IN SOA ns.kuro.local postmaster.kuro.local. ( 2017030501 ; serial 1h ; refresh 15m ; retry 1d ; expire 1h ; minimum ); @ IN NS ns.kuro.local. ns IN A 192.168.0.249 kuro-vc01 IN A 192.168.0.250 kuro-esx01 IN A 192.168.0.251 kuro@kuro-ph01 [ ~ ]$ chmod 755 conf kuro@kuro-ph01 [ ~ ]$ chmod 644 conf/*
ここまで用意ができたら、あとはビルドして起動させるだけです。
まずはビルドします。ビルドは build サブコマンドです。末尾でビルドしたい Dockerfile を含むディレクトリを指定します。今回はカレントディレクトリなのでドット(.)です。
kuro@kuro-ph01 [ ~ ]$ docker build -t bind . Sending build context to Docker daemon 11.78 kB Step 1 : FROM alpine:latest latest: Pulling from library/alpine 627beaf3eaaf: Pull complete Digest: sha256:58e1a1bb75db1b5a24a462dd5e2915277ea06438c3f105138f97eb53149673c4 Status: Downloaded newer image for alpine:latest ---> 4a415e366388 Step 2 : RUN apk add bind --no-cache ---> Running in 84d3fb22724e fetch http://dl-cdn.alpinelinux.org/alpine/v3.5/main/x86_64/APKINDEX.tar.gz fetch http://dl-cdn.alpinelinux.org/alpine/v3.5/community/x86_64/APKINDEX.tar.gz (1/5) Installing libgcc (6.2.1-r1) (2/5) Installing libxml2 (2.9.4-r1) (3/5) Installing bind-libs (9.10.4_p6-r0) (4/5) Installing libcap (2.25-r1) (5/5) Installing bind (9.10.4_p6-r0) Executing bind-9.10.4_p6-r0.pre-install Executing busybox-1.25.1-r0.trigger OK: 9 MiB in 16 packages ---> 29500538ea16 Removing intermediate container 84d3fb22724e Step 3 : EXPOSE 53/udp ---> Running in a8ea36f4c12f ---> f08f46db2947 Removing intermediate container a8ea36f4c12f Step 4 : CMD /usr/sbin/named -c /etc/bind/named.conf -u named -g ---> Running in a2fd9c1acd90 ---> bf1581067386 Removing intermediate container a2fd9c1acd90 Successfully built bf1581067386 kuro@kuro-ph01 [ ~ ]$ docker images REPOSITORY TAG IMAGE ID CREATED SIZE bind latest bf1581067386 41 seconds ago 8.772 MB alpine latest 4a415e366388 2 weeks ago 3.984 MB
できたイメージは images サブコマンドで確認できます。無事にできたようなので動かしてみましょう。
起動は run サブコマンドです。バックグラウンドで起動(-d)させ、ホストのポートとディレクトリをコンテナに割り当て(-p、-v)ます。
kuro@kuro-ph01 [ ~ ]$ docker run -d -p 53:53/udp -v $(pwd)/conf:/etc/bind --restart always --name bind bind 442a5494f13328641cc3ba6c526a65591874f01476255a47f962dbc8922e0f3b kuro@kuro-ph01 [ ~ ]$ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 442a5494f133 bind "/usr/sbin/named -c /" 3 seconds ago Up 2 seconds 0.0.0.0:53->53/udp bind
起動状態は ps サブコマンドで確認できます。この結果の STATUS が Up になっていれば、少なくともコンテナは正しく動いています。あとはコンテナ内で bind が正しく動いていれば問題ありません。
というわけで、まずは自分自身に DNS のクエリを投げてみます。ミニマル構成の Photon OS には nslookup も dig もないので、bindutils をインストールしてから試します。
kuro@kuro-ph01 [ ~ ]$ sudo tdnf install bindutils [sudo] password for kuro Sorry, try again. [sudo] password for kuro Installing: bindutils x86_64 9.10.4-1.ph1 6.86 M Total installed size: 6.86 M Is this ok [y/N]:y Downloading: bindutils 3116681 100% Testing transaction Running transaction Complete! kuro@kuro-ph01 [ ~ ]$ dig @192.168.0.249 kuro-vc01.kuro.local ; <<>> DiG 9.10.4-P1 <<>> @192.168.0.249 kuro-vc01.kuro.local ; (1 server found) ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 49190 ;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 1, ADDITIONAL: 2 ;; OPT PSEUDOSECTION: ; EDNS: version: 0, flags:; udp: 4096 ;; QUESTION SECTION: ;kuro-vc01.kuro.local. IN A ;; ANSWER SECTION: kuro-vc01.kuro.local. 3600 IN A 192.168.0.250 ;; AUTHORITY SECTION: kuro.local. 3600 IN NS ns.kuro.local. ;; ADDITIONAL SECTION: ns.kuro.local. 3600 IN A 192.168.0.249 ;; Query time: 0 msec ;; SERVER: 192.168.0.249#53(192.168.0.249) ;; WHEN: Tue Mar 21 00:04:46 JST 2017 ;; MSG SIZE rcvd: 98 kuro@kuro-ph01 [ ~ ]$ nslookup google.com 192.168.0.249 Server: 192.168.0.249 Address: 192.168.0.249#53 Non-authoritative answer: Name: google.com Address: 172.217.25.238
定義したゾーンの情報も引けていますし、再帰問い合わせもできています。よさそうです。
別の端末からも叩いてみます。例えば Windows から。
C:\Users\kuro>nslookup kuro-vc01.kuro.local 192.168.0.249 サーバー: UnKnown Address: 192.168.0.249 名前: kuro-vc01.kuro.local Address: 192.168.0.250 C:\Users\kuro>nslookup google.com 192.168.0.249 サーバー: UnKnown Address: 192.168.0.249 権限のない回答: 名前: google.com Address: 216.58.197.142
よいですね。
うまく動かない場合は、以下のように logs サブコマンドで named のログを見るか、
kuro@kuro-ph01 [ ~ ]$ docker logs bind 20-Mar-2017 15:00:53.955 starting BIND 9.10.4-P6 <id:a6837d0> -c /etc/bind/named.conf -u named -g 20-Mar-2017 15:00:53.955 running on Linux x86_64 4.4.41-1.ph1-esx #1-photon SMP Tue Jan 10 23:46:44 UTC 2017 20-Mar-2017 15:00:53.955 built with '--build=x86_64-alpine-linux-musl' '--host=x86_64-alpine-linux-musl' '--prefix=/usr' '--sysconfdir=/etc/bind' '--localstatedir=/var' '--with-openssl=/usr' '--enable-linux-caps' '--with-libxml2' '--enable-threads' '--enable-filter-aaaa' '--enable-ipv6' '--enable-shared' '--enable-static' '--with-libtool' '--with-randomdev=/dev/random' '--mandir=/usr/share/man' '--infodir=/usr/share/info' 'build_alias=x86_64-alpine-linux-musl' 'host_alias=x86_64-alpine-linux-musl' 'CC=gcc' 'CFLAGS=-Os -fomit-frame-pointer -D_GNU_SOURCE' 'LDFLAGS=-Wl,--as-needed' 'CPPFLAGS=-Os -fomit-frame-pointer' 20-Mar-2017 15:00:53.955 ---------------------------------------------------- 20-Mar-2017 15:00:53.955 BIND 9 is maintained by Internet Systems Consortium, 20-Mar-2017 15:00:53.955 Inc. (ISC), a non-profit 501(c)(3) public-benefit 20-Mar-2017 15:00:53.955 corporation. Support and training for BIND 9 are 20-Mar-2017 15:00:53.955 available at https://www.isc.org/support 20-Mar-2017 15:00:53.955 ---------------------------------------------------- 20-Mar-2017 15:00:53.955 found 1 CPU, using 1 worker thread 20-Mar-2017 15:00:53.955 using 1 UDP listener per interface . . .
あるいは、以下のようにしてコンテナ内のシェルに入って調査します。ps や ls をしているのはただの例なので、実際は自由にトラブルシュートしてください。
kuro@kuro-ph01 [ ~ ]$ docker exec -it bind /bin/ash / # ps -ef PID USER TIME COMMAND 1 named 0:00 /usr/sbin/named -c /etc/bind/named.conf -u named -g 8 root 0:00 /bin/ash 12 root 0:00 ps -ef / # ls -l /etc/bind/ total 8 -rw-r--r-- 1 1000 1000 306 Mar 20 13:57 kuro.local.zone -rw-r--r-- 1 1000 1000 495 Mar 20 14:04 named.conf
なお、Dockerfile で記述した通り、今回は CMD 行で named を -g で起動させています。このため、exec サブコマンドでなく attach サブコマンドを利用しても、named につながるだけで何のトラブルシュートもできない点には注意が必要です。上記のように、exec サブコマンドを利用して明示的に新規プロセスとしてシェルを起動する必要があります。また、Alpine Linux のシェルは /bin/bash ではなく /bin/ash です。
exec サブコマンドは起動中のコンテナに対してしかできない操作なので、もしそもそもコンテナの起動がコケている場合は、上記のコマンドではシェルに入れません。この場合は、exec サブコマンドを run サブコマンドに置き換えて、明示的に起動させます。これによりコンテナの CMD 指定が /bin/ash でオーバライドされるので、named は起動されずに(=コンテナが落ちずに)シェルがフォアグラウンドで実行されます。
よくあるのは、docker ps したときの STATUS が Restarting のままになるトラブルです。大体の場合、named が設定ファイルの読み込みでコケてこうなります。コケて named が落ちてコンテナが終了するものの、restart オプションによって延々と再度の起動が試行されている状態です。この場合は、ファイルのパーミッションや、ボリュームマウントの指定が正しいか確認します。
ここまでで当初の最低限の要件は満たせたので、あとはオマケです。
まっさらな状態にするために、動かしていたコンテナを停止し削除、イメージも全部消しておきます。
kuro@kuro-ph01 [ ~ ]$ docker stop bind bind kuro@kuro-ph01 [ ~ ]$ docker rm bind bind kuro@kuro-ph01 [ ~ ]$ docker rmi bind Untagged: bind:latest Deleted: sha256:bf1581067386a7eb1de3b86773c2d89a4f901ab190d6e74679c541a91e5c1d12 Deleted: sha256:f08f46db294799dbdf60b982abc0431ffb11bb046558888b434ba3cbbe47091e Deleted: sha256:29500538ea168fc7cee66a294b3ed90a3420cc299ac9d84896b2784ecf81f609 Deleted: sha256:c193e93d56d7b0dc758de256cf867bc724aa3ef55ddb14dfdb804b09303fb84e kuro@kuro-ph01 [ ~ ]$ docker rmi alpine Untagged: alpine:latest Untagged: alpine@sha256:58e1a1bb75db1b5a24a462dd5e2915277ea06438c3f105138f97eb53149673c4 Deleted: sha256:4a415e3663882fbc554ee830889c68a33b3585503892cc718a4698e91ef2a526 Deleted: sha256:23b9c7b43573dd164619ad59e9d51eda4095926729f59d5f22803bcbe9ab24c2 kuro@kuro-ph01 [ ~ ]$ docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES kuro@kuro-ph01 [ ~ ]$ docker images REPOSITORY TAG IMAGE ID CREATED SIZE
あとは、以下な感じになるようにディレクトリを切って、これまでに作ったファイルを移動させておきます。
[~/docker] └ [bind] ├ Dockerfile └ [conf] ├ kuro.local.zone └ named.conf
kuro@kuro-ph01 [ ~ ]$ mkdir -p docker/bind kuro@kuro-ph01 [ ~ ]$ mv Dockerfile conf docker/bind
では、今回作ったコンテナを、Docker Compose で操作できるようにしてみます。
本来は複数コンテナを簡単に連携させるために使うものですが、旨味は少ないながらも単一のコンテナを操作したいだけの目的でも使えます。
まずは Docker Compose をインストールします。上記ドキュメントに記載があるコマンドをそのまま実行するだけです。
kuro@kuro-ph01 [ ~ ]$ sudo curl -L "https://github.com/docker/compose/releases/download/1.11.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose % Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 100 600 0 600 0 0 330 0 --:--:-- 0:00:01 --:--:-- 330 100 8066k 100 8066k 0 0 23737 0 0:05:47 0:05:47 --:--:-- 15090 kuro@kuro-ph01 [ ~ ]$ sudo chmod +x /usr/local/bin/docker-compose kuro@kuro-ph01 [ ~ ]$ sudo docker-compose --version docker-compose version 1.11.2, build dfed245
インストールができたら、設定ファイルを作ります。
kuro@kuro-ph01 [ ~ ]$ vim docker/docker-compose.yml kuro@kuro-ph01 [ ~ ]$ cat docker/docker-compose.yml version: "2.0" services: bind: container_name: bind build: bind image: bind volumes: - ./bind/conf:/etc/bind ports: - 53:53/udp restart: always
あとは起動させるだけです。バックグラウンドで実行させたいので、up サブコマンドに -d を付けます。
kuro@kuro-ph01 [ ~ ]$ cd docker kuro@kuro-ph01 [ ~/docker ]$ sudo docker-compose up -d Building bind Step 1 : FROM alpine:latest latest: Pulling from library/alpine 627beaf3eaaf: Pull complete Digest: sha256:58e1a1bb75db1b5a24a462dd5e2915277ea06438c3f105138f97eb53149673c4 Status: Downloaded newer image for alpine:latest ---> 4a415e366388 Step 2 : RUN apk add bind --no-cache ---> Running in 7cb9b9b1d9c5 fetch http://dl-cdn.alpinelinux.org/alpine/v3.5/main/x86_64/APKINDEX.tar.gz fetch http://dl-cdn.alpinelinux.org/alpine/v3.5/community/x86_64/APKINDEX.tar.gz (1/5) Installing libgcc (6.2.1-r1) (2/5) Installing libxml2 (2.9.4-r1) (3/5) Installing bind-libs (9.10.4_p6-r0) (4/5) Installing libcap (2.25-r1) (5/5) Installing bind (9.10.4_p6-r0) Executing bind-9.10.4_p6-r0.pre-install Executing busybox-1.25.1-r0.trigger OK: 9 MiB in 16 packages ---> 3f4617f7e3e7 Removing intermediate container 7cb9b9b1d9c5 Step 3 : EXPOSE 53/udp ---> Running in 828a66a3c5f8 ---> 47c21a9ae08f Removing intermediate container 828a66a3c5f8 Step 4 : CMD /usr/sbin/named -c /etc/bind/named.conf -u named -g ---> Running in 13e41b8d96c7 ---> 85edc496264d Removing intermediate container 13e41b8d96c7 Successfully built 85edc496264d WARNING: Image for service bind was built because it did not already exist. To rebuild this image you must use `docker-compose build` or `docker-compose up --build`. Creating bind
docker-compose.yml の記述に従って、各サービス(コンテナ)が起動されます。build が指定されていた場合は、Dockerfile に従ってコンテナイメージのビルドも行います。
起動状態は、ps サブコマンドで確認できます。
kuro@kuro-ph01 [ ~/docker ]$ sudo docker-compose ps Name Command State Ports ------------------------------------------------------------------ bind /usr/sbin/named -c /etc/bi ... Up 0.0.0.0:53->53/udp
ログの確認は logs サブコマンドです。
kuro@kuro-ph01 [ ~/docker ]$ sudo docker-compose logs Attaching to bind bind | 20-Mar-2017 16:20:24.015 starting BIND 9.10.4-P6 <id:a6837d0> -c /etc/bind/named.conf -u named -g bind | 20-Mar-2017 16:20:24.015 running on Linux x86_64 4.4.41-1.ph1-esx #1-photon SMP Tue Jan 10 23:46:44 UTC 2017 bind | 20-Mar-2017 16:20:24.015 built with '--build=x86_64-alpine-linux-musl' '--host=x86_64-alpine-linux-musl' '--prefix=/usr' '--sysconfdir=/etc/bind' '--localstatedir=/var' '--with-openssl=/usr' '--enable-linux-caps' '--with-libxml2' '--enable-threads' '--enable-filter-aaaa' '--enable-ipv6' '--enable-shared' '--enable-static' '--with-libtool' '--with-randomdev=/dev/random' '--mandir=/usr/share/man' '--infodir=/usr/share/info' 'build_alias=x86_64-alpine-linux-musl' 'host_alias=x86_64-alpine-linux-musl' 'CC=gcc' 'CFLAGS=-Os -fomit-frame-pointer -D_GNU_SOURCE' 'LDFLAGS=-Wl,--as-needed' 'CPPFLAGS=-Os -fomit-frame-pointer' bind | 20-Mar-2017 16:20:24.015 ---------------------------------------------------- bind | 20-Mar-2017 16:20:24.015 BIND 9 is maintained by Internet Systems Consortium, bind | 20-Mar-2017 16:20:24.015 Inc. (ISC), a non-profit 501(c)(3) public-benefit bind | 20-Mar-2017 16:20:24.015 corporation. Support and training for BIND 9 are bind | 20-Mar-2017 16:20:24.015 available at https://www.isc.org/support bind | 20-Mar-2017 16:20:24.015 ---------------------------------------------------- bind | 20-Mar-2017 16:20:24.015 found 1 CPU, using 1 worker thread bind | 20-Mar-2017 16:20:24.015 using 1 UDP listener per interface . . .
コンテナの停止や削除は、それぞれ stop サブコマンドや rm サブコマンドで実行できます。
kuro@kuro-ph01 [ ~/docker ]$ sudo docker-compose stop Stopping bind ... done kuro@kuro-ph01 [ ~/docker ]$ sudo docker-compose rm Going to remove bind Are you sure? [yN] y Removing bind ... done kuro@kuro-ph01 [ ~/docker ]$ docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
当然ながら、それぞれネイティブの docker コマンドによる操作も可能です。
イメージの削除は docker-compose コマンドではできないので、docker コマンドで個別に行う必要があります。ただし、イメージをビルドしなおしたいだけであれば、build サブコマンドを利用するか、up サブコマンドの実行時に –build オプションを付与することで実現できます。
Docker 上で bind を動かし、Docker Compose で操作できるようにしました。
自前でがんばりたくない場合は、探せば Docker Hub に既成の bind サービス用コンテナがいくつかある(例えばこれとか)ので、そういうのを使うのも有効です。その手の既成コンテナはだいたい Webmin がくっついていて非常に楽です。
また、今回は Docker Compose を使いましたが、単一コンテナを扱いたいだけなのであれば、Makefile を利用することもできそうです。Photon OS にも make はインストールできます。
次回は vCSA 6.5 の導入を行います。
先のエントリ で以下のように書きました。
とりあえず vSphere 6.5 の環境をざっと触ってみたいので、ひとまず vCSA を立てていろいろ様子をみて、あとは素直に小さな仮想化基盤としておもちゃにします。
vCSA をお行儀よく(きちんと vCenter Server に FQDN を持たせる形で)立てたい場合は、DNS サーバがないとそもそもインストールができません。
今回はせっかくなのでお行儀のよい構成にしたいのですが、DNS サーバが欲しいからといって適当に CentOS に bind を入れるというのは自分にとって何も新しいことがなくてつまらないので、どうせなら触ったことがないものを触りましょう。
というわけで、引き続き VMware つながりで、今回は Photon OS を使ってみます。Photon OS は、VMware が公開している、コンテナホスト用の軽量 Linux ディストリビューションです。
同じ分野だと CoreOS とか CentOS Atomic Host とか、Snappy Ubuntu Core とか、そのあたりが有名です。今回のこの Photon OS は、VMware プラットフォーム上での動作に最適化されているとのことで、この点がおそらく類似のコンテナホスト用 OS との差別化要素になるのかと思われます。最近、VMware vSphere Integrated Containers という製品も GA になりましたし、VMware がこの分野に注力しているのは確かなようですね。
ちなみに Photon OS は、コンテナホスト用ではあるものの、実は vCenter Server Appliance 6.5(vCSA 6.5)のベース OS としても採用されています。vCSA 6.0 までは、Photon OS ではなく SUSE Linux Enterprise Server でした。
さて、今回の目的は DNS サーバを立てることなので、Photon OS 上に bind を動かすための Docker コンテナを作ることを目指します。本エントリではひとまず、Photon OS をデプロイして、そこで何らかの Docker コンテナを動かす、というところまで進めます。
以下、当然ですが執筆時点の情報なので、時間経過に伴って陳腐化する可能性があります。
公式の Wiki が比較的充実しているので、そこを見ながら作業します。
日本語のリソースでは、gowatana さんの VMTN のウェブログがおそらくいちばん詳しそうです。ただし、こちらは Photon OS をフルインストールした前提で記述されているので、ミニマルの構成では手順が不足する部分がある点は注意が必要です。
今回は、ISO イメージからのインストールではなく、OVA テンプレートを利用して、ミニマル構成での構築を行います。
ダウンロードページから OVA ファイルをダウンロードします。OVA テンプレートは、ミニマル構成のみの提供です。
今回は、手元の環境が vSphere 6.5 なので、仮想ハードウェアバージョンが 11 のものを選びます。
ダウンロード後、vSphere 環境にインポートします。この部分は特に書くほどの手順でもないですが、Wiki にもガイドがあります。
記載通り、パワーオンする前の仮想マシンをテンプレートに変換して保存しておくと、今後インスタンスを増やしたくなったときに便利かもしれません。
At this point, you’ve got a Photon OS instance ready to go; but before you power on that Photon OS instance, consider first converting this VM into a template. By converting this imported VM to a template, you have a master Photon OS instance that can be combined with vSphere Guest Customization to enable rapid provisioning of Photon OS instances.
以降、文字ばかりになるので、せめてかわいいねこの写真でも載せておきます。
ネットワークアダプタを適切なポートグループに接続させることで、パワーオン後、IP アドレスが DHCP サーバから取得されます。あらかじめ open-vm-tools が導入されているので、付与された IP アドレスは vSphere Client から確認できます。root ユーザでの SSH 接続もデフォルトで許可されています。
よって、起動後、ただちに SSH による接続が可能です。任意の SSH クライアントから root ユーザでログインして初期構築を進めます。初期パスワードは changeme です。
初回ログイン後、root ユーザのパスワードの変更が求められるので、指示に従います。
(current) UNIX password: New password: Retype new password:
SSH で接続しての操作では通常は意識する必要はありませんが、トラブル時など、どうしても仮想マシンのコンソールで直接操作しなければならない状態に陥ることがあります。これに備えて、キー配列を日本語キーボードに合わせて変更しておきます。
実際の設定方法は上記が参考になりますが、ミニマル構成の場合、そもそもキー配列のライブラリが入っていません。
root@photon-machine [ ~ ]# localectl list-keymaps Couldn't find any console keymaps.
よって、キー配列のパッケージのインストールから始めます。
root@photon-machine [ ~ ]# tdnf install kbd Installing: kbd x86_64 2.0.3-2.ph1 3.30 M Total installed size: 3.30 M Is this ok [y/N]:y Downloading: kbd 1599403 100% Testing transaction Running transaction Complete!
tdnf は、Photon OS のパッケージマネージャで、yum の後継である dnf の簡易版(Tiny DNF)です。/etc/yum.repos.d/ 配下の設定ファイルを読むとわかりますが、Photon OS はデフォルトで https://dl.bintray.com/vmware/ 以下のリポジトリを参照するように構成されています。
さて、これで日本語キーボードの情報が使えるようになったので、あとは実際に割り当てて完了です。
root@photon-machine [ ~ ]# localectl list-keymaps | grep jp106 jp106 root@photon-machine [ ~ ]# localectl set-keymap jp106 root@photon-machine [ ~ ]# localectl System Locale: LANG=en_US.UTF-8 VC Keymap: jp106 X11 Layout: jp X11 Model: jp106 X11 Options: terminate:ctrl_alt_bksp
反映は即時です。この変更は恒久的に保持されます。
続いて、DHCP による動的取得ではなく、静的 IP アドレスを利用するように構成します。
構成するインタフェイスは eth0 です。
root@photon-machine [ ~ ]# networkctl IDX LINK TYPE OPERATIONAL SETUP 1 lo loopback carrier unmanaged 2 eth0 ether routable configured 2 links listed.
基本的にドキュメント通り進めればよいです。systemd を利用した一般的な設定手順と同じです。
まずは静的 IP アドレスを eth0 に付与するための設定ファイルを新しく作ります。設定ミスに備え、この段階ではまだ DHCP を明示的に有効にしておきます。
root@photon-machine [ ~ ]# vim /etc/systemd/network/10-static-eth0.network root@photon-machine [ ~ ]# cat /etc/systemd/network/10-static-eth0.network [Match] Name=eth0 [Network] DHCP=yes Address=192.168.0.249/24 Gateway=192.168.0.1 DNS=192.168.0.1 root@photon-machine [ ~ ]# chmod 644 /etc/systemd/network/10-static-eth0.network
systemd.network は名前順に設定ファイルを読み込みますが、最初に [Match] の条件に一致した設定ファイルの内容以外は無視します。
このため、先に DHCP 設定が読まれてしまうと、静的 IP アドレスが付与されないことになってしまいます。このような事態を避けるため、もともと存在していた DHCP 設定用のファイルは、eth0 の設定のあとに読まれるよう、名前を変える必要があります。将来的にネットワークアダプタを追加した際の動きを考慮しないのであれば、そもそもファイル自体を消してしまっても構いません。
root@photon-machine [ ~ ]# mv /etc/systemd/network/10-dhcp-en.network /etc/systemd/network/20-dhcp-en.network
この後、ネットワークサービスを再起動します。
root@photon-machine [ ~ ]# systemctl restart systemd-networkd
10-static-eth0.network に DHCP=yes を記載したことで、ここでネットワークサービスを再起動しても、もともと DHCP で付与されていた IP アドレスが保持されます(正確には DHCP サーバから同じ IP アドレスが再度割り当てられているだけです)。SSH のセッションが切断されることなく、操作を続行できます。
以下のコマンドで、IP アドレスが 2 つ付与されていることが確認できます。
root@photon-machine [ ~ ]# ip addr 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default 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: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000 link/ether 00:50:56:87:dd:02 brd ff:ff:ff:ff:ff:ff inet 192.168.0.249/24 brd 192.168.0.255 scope global eth0 valid_lft forever preferred_lft forever inet 192.168.0.11/24 brd 192.168.0.255 scope global secondary dynamic eth0 valid_lft 86334sec preferred_lft 86334sec inet6 fe80::250:56ff:fe87:dd02/64 scope link valid_lft forever preferred_lft forever
上記のように正常に静的 IP アドレスが付与されていることが確認できたら、新しい IP アドレスに SSH で接続しなおします。
その後、改めて 10-static-eth0.network を編集し、DHCP を無効化したあと、再度ネットワークサービスを再起動し、IP アドレスが一つだけになったことを確認します。
root@photon-machine [ ~ ]# vim /etc/systemd/network/10-static-eth0.network root@photon-machine [ ~ ]# cat /etc/systemd/network/10-static-eth0.network [Match] Name=eth0 [Network] DHCP=no Address=192.168.0.249/24 Gateway=192.168.0.1 DNS=192.168.0.1 root@photon-machine [ ~ ]# systemctl restart systemd-networkd root@photon-machine [ ~ ]# ip addr 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default 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: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000 link/ether 00:50:56:87:dd:02 brd ff:ff:ff:ff:ff:ff inet 192.168.0.249/24 brd 192.168.0.255 scope global eth0 valid_lft forever preferred_lft forever inet6 fe80::250:56ff:fe87:dd02/64 scope link valid_lft forever preferred_lft forever
これで、安全に DHCP による動的取得から静的 IP アドレスの利用へ切り替えられました。
OVA テンプレートからデプロイした場合、ホスト名はデフォルトで photon-machine になっています。
ホスト名は hostnamectl コマンドで変えられます。特に目新しいことはありません。
root@photon-machine [ ~ ]# hostnamectl set-hostname kuro-ph01.kuro.local root@photon-machine [ ~ ]# hostnamectl Static hostname: kuro-ph01.kuro.local Icon name: computer-vm Chassis: vm Machine ID: 889b661d4b9446c48002b7ed596a00a4 Boot ID: 67367e5ce4094074be76a82f0a3c3a7b Virtualization: vmware Operating System: VMware Photon/Linux Kernel: Linux 4.4.41-1.ph1-esx Architecture: x86-64
反映は即時です。この変更は恒久的に保持されます。
以下のエントリによると、フルインストール構成ではいろいろと設定が必要そうです。
が、OVA からデプロイした場合は、デフォルトで時刻同期が動いていました。Google の NTP サーバと同期しているようです。
root@photon-machine [ ~ ]# timedatectl Local time: Sun 2017-03-19 10:05:43 UTC Universal time: Sun 2017-03-19 10:05:43 UTC RTC time: Sun 2017-03-19 10:05:43 Time zone: UTC (UTC, +0000) Network time on: yes NTP synchronized: yes RTC in local TZ: no
root@photon-machine [ ~ ]# systemctl status systemd-timesyncd -l ● systemd-timesyncd.service - Network Time Synchronization Loaded: loaded (/usr/lib/systemd/system/systemd-timesyncd.service; enabled; vendor preset: enabled) Active: active (running) since Sun 2017-03-19 06:22:48 UTC; 3h 42min ago Docs: man:systemd-timesyncd.service(8) Main PID: 128 (systemd-timesyn) Status: "Synchronized to time server 216.239.35.12:123 (time4.google.com)." Tasks: 2 CGroup: /system.slice/systemd-timesyncd.service `-128 /lib/systemd/systemd-timesyncd Mar 19 06:52:29 photon-machine systemd-timesyncd[128]: Synchronized to time server 216.239.35.8:123 (time3.google.com). Mar 19 09:37:34 photon-machine systemd-timesyncd[128]: Network configuration changed, trying to establish connection. Mar 19 09:37:34 photon-machine systemd-timesyncd[128]: Synchronized to time server 216.239.35.8:123 (time3.google.com). Mar 19 09:40:00 photon-machine systemd-timesyncd[128]: Network configuration changed, trying to establish connection. Mar 19 09:40:10 photon-machine systemd-timesyncd[128]: Timed out waiting for reply from 216.239.35.8:123 (time3.google.com). Mar 19 09:40:10 photon-machine systemd-timesyncd[128]: Synchronized to time server 216.239.35.12:123 (time4.google.com). Mar 19 09:40:12 photon-machine systemd-timesyncd[128]: Network configuration changed, trying to establish connection. Mar 19 09:40:12 photon-machine systemd-timesyncd[128]: Synchronized to time server 216.239.35.12:123 (time4.google.com). Mar 19 09:43:32 photon-machine systemd-timesyncd[128]: Network configuration changed, trying to establish connection. Mar 19 09:43:32 photon-machine systemd-timesyncd[128]: Synchronized to time server 216.239.35.12:123 (time4.google.com).
ConditionVirtualization は !container になっていました。コンテナ環境内でなければ勝手に動くようです。
root@photon-machine [ ~ ]# grep ConditionVirtualization /lib/systemd/system/systemd-timesyncd.service ConditionVirtualization=!container
というわけで、何もせず、タイムゾーンだけ変えます。
タイムゾーンはさすがにミニマル構成といえど入っていました。反映させるだけで完了です。
root@photon-machine [ ~ ]# timedatectl list-timezones | grep Asia/Tokyo Asia/Tokyo root@photon-machine [ ~ ]# timedatectl set-timezone Asia/Tokyo root@photon-machine [ ~ ]# timedatectl Local time: Sun 2017-03-19 19:11:09 JST Universal time: Sun 2017-03-19 10:11:09 UTC RTC time: Sun 2017-03-19 10:11:09 Time zone: Asia/Tokyo (JST, +0900) Network time on: yes NTP synchronized: yes RTC in local TZ: no root@photon-machine [ ~ ]# date Sun Mar 19 19:11:32 JST 2017
ロケールはデフォルトで en_US.UTF-8 になっています。このままでもよいのですが、せっかくなので ja_JP.UTF-8 に変更します。
が、最初は何のロケール情報もありません。
root@photon-machine [ ~ ]# localectl list-locales
必要なロケール情報を自分で生成する必要があります。
で、上記ページには /usr/share/locale/locale.alias から言語を選んで /etc/locale-gen.conf に追記して locale-gen.sh を叩けと書いてありますが、実際はそもそも /usr/share/locale/locale.alias が存在しないですし、そのまま進めても怒られてしまいます。
root@photon-machine [ ~ ]# locale-gen.sh Generating locales... en_US.ISO-8859-1...locale alias file `/usr/share/locale/locale.alias' not found: No such file or directory
というわけで、強引ですが空ファイルでよいので /usr/share/locale/locale.alias を作ってやると回避できます。これ、おそらく将来のリリースで修正されるかと。
最終的には以下の手順です。言語は好きに読み替えてください。
root@photon-machine [ ~ ]# touch /usr/share/locale/locale.alias root@photon-machine [ ~ ]# echo -e "ja_JP\t\tUTF-8" >> /etc/locale-gen.conf root@photon-machine [ ~ ]# echo -e "ja_JP.UTF-8\tUTF-8" >> /etc/locale-gen.conf root@photon-machine [ ~ ]# locale-gen.sh Generating locales... en_US.ISO-8859-1... done en_US.UTF-8... done ja_JP.UTF-8... done ja_JP.UTF-8... done Generation complete. root@photon-machine [ ~ ]# localectl list-locales en_US en_US.iso88591 en_US.utf8 ja_JP ja_JP.utf8 root@photon-machine [ ~ ]# localectl set-locale LANG="ja_JP.UTF-8" root@photon-machine [ ~ ]# localectl System Locale: LANG=ja_JP.UTF-8 VC Keymap: jp106 X11 Layout: jp X11 Model: jp106 X11 Options: terminate:ctrl_alt_bksp
反映は即時です。恒久的に保持されます。
いつまでも root なのはアレなので、一般ユーザを作ります。このユーザには Docker 操作用の特権を与えたいので、明示的に docker グループを作成して所属させます。sudo ができるように wheel にも所属させます。本当は一つのユーザに複数の役割は持たせるべきではないですが、よしとします。
root@photon-machine [ ~ ]# groupadd docker root@photon-machine [ ~ ]# useradd -m -g docker -G wheel kuro root@photon-machine [ ~ ]# passwd kuro New password: Retype new password: passwd: password updated successfully
そして実はデフォルトでは sudo コマンドがないのでインストールします。
root@photon-machine [ ~ ]# tdnf install sudo Installing: sudo x86_64 1.8.15-3.ph1 3.47 M Total installed size: 3.47 M Is this ok [y/N]:y Downloading: sudo 1319187 100% Testing transaction Running transaction groupadd: group 'wheel' already exists Complete!
kuro ユーザで SSH で接続して、問題なければ root での直接ログインを禁止させます。PermitRootLogin を no にするだけです。OVA テンプレートからデプロイした場合は、デフォルトで yes になっています。
ここ以降、kuro ユーザで操作しています。
kuro@kuro-ph01 [ ~ ]$ sudo vim /etc/ssh/sshd_config kuro@kuro-ph01 [ ~ ]$ sudo tail /etc/ssh/sshd_config Subsystem sftp /usr/libexec/sftp-server # Example of overriding settings on a per-user basis #Match User anoncvs # X11Forwarding no # AllowTcpForwarding no # PermitTTY no # ForceCommand cvs server PermitRootLogin no UsePAM yes kuro@kuro-ph01 [ ~ ]$ sudo systemctl restart sshd kuro@kuro-ph01 [ ~ ]$ sudo systemctl status sshd ● sshd.service - OpenSSH Daemon Loaded: loaded (/usr/lib/systemd/system/sshd.service; enabled; vendor preset: enabled) Active: active (running) since Sun 2017-03-19 19:52:39 JST; 9s ago Main PID: 1169 (sshd) Tasks: 1 CGroup: /system.slice/sshd.service `-1169 /usr/sbin/sshd -D Mar 19 19:52:39 kuro-ph01.kuro.local systemd[1]: Started OpenSSH Daemon. Mar 19 19:52:39 kuro-ph01.kuro.local sshd[1169]: Server listening on 0.0.0.0.... Mar 19 19:52:39 kuro-ph01.kuro.local sshd[1169]: Server listening on :: port 22. Hint: Some lines were ellipsized, use -l to show in full.
さて、ようやく本題です。が、もはやここまで来れば以降は Docker のごく一般的な操作の話なだけで特別なことはありません。
Docker 自体はデフォルトでインストールされています。
kuro@kuro-ph01 [ ~ ]$ docker -v Docker version 1.12.1, build 23cf638
自動起動は無効の状態です。起動させて、自動起動も有効にします。
kuro@kuro-ph01 [ ~ ]$ sudo systemctl start docker kuro@kuro-ph01 [ ~ ]$ sudo systemctl status docker ● docker.service - Docker Daemon Loaded: loaded (/usr/lib/systemd/system/docker.service; disabled; vendor preset: enabled) Active: active (running) since Sun 2017-03-19 19:27:00 JST; 5s ago Docs: http://docs.docker.com Main PID: 618 (dockerd) Tasks: 6 CGroup: /system.slice/docker.service `-618 dockerd --containerd /run/containerd.sock Mar 19 19:27:00 kuro-ph01.kuro.local docker[618]: time="2017-03-19T19:27:00.221740890+09:00" level=warnin...ght" Mar 19 19:27:00 kuro-ph01.kuro.local docker[618]: time="2017-03-19T19:27:00.221854117+09:00" level=warnin...ice" Mar 19 19:27:00 kuro-ph01.kuro.local docker[618]: time="2017-03-19T19:27:00.222276327+09:00" level=info m...rt." Mar 19 19:27:00 kuro-ph01.kuro.local docker[618]: time="2017-03-19T19:27:00.238793455+09:00" level=info m...lse" Mar 19 19:27:00 kuro-ph01.kuro.local docker[618]: time="2017-03-19T19:27:00.297271226+09:00" level=info m...ess" Mar 19 19:27:00 kuro-ph01.kuro.local docker[618]: time="2017-03-19T19:27:00.327413635+09:00" level=info m...ne." Mar 19 19:27:00 kuro-ph01.kuro.local docker[618]: time="2017-03-19T19:27:00.327488574+09:00" level=info m...ion" Mar 19 19:27:00 kuro-ph01.kuro.local docker[618]: time="2017-03-19T19:27:00.327504134+09:00" level=info m...12.1 Mar 19 19:27:00 kuro-ph01.kuro.local systemd[1]: Started Docker Daemon. Mar 19 19:27:00 kuro-ph01.kuro.local docker[618]: time="2017-03-19T19:27:00.333295270+09:00" level=info m...ock" Hint: Some lines were ellipsized, use -l to show in full. kuro@kuro-ph01 [ ~ ]$ systemctl enable docker Created symlink from /etc/systemd/system/multi-user.target.wants/docker.service to /usr/lib/systemd/system/docker.service.
起動しました。適当なコンテナイメージを動かしてみます。適当に vmwarecna/nginx など。
kuro@kuro-ph01 [ ~ ]$ docker run -d -p 80:80 vmwarecna/nginx Unable to find image 'vmwarecna/nginx:latest' locally latest: Pulling from vmwarecna/nginx a3ed95caeb02: Pull complete b6f2388a20dd: Pull complete a305e4b888ce: Pull complete 80596a504ef3: Pull complete 99c028eff2a4: Pull complete a1cee46bc434: Pull complete 9bd9868012b9: Pull complete 6fa7100a2613: Pull complete Digest: sha256:f73bbae0f31823c06478b1fa5efb4957bc25239802fd5ea94e4442c0a6090d23 Status: Downloaded newer image for vmwarecna/nginx:latest 02e4fcf9b805a01b0d7bc203e2b78f655fa9aed2a7ff5a6abfbc93703b13a41e
勝手にリポジトリ(Docker Hub)からコンテナイメージを探してダウンロードして起動してくれました。簡単ですね。
ダウンロードしたコンテナイメージと起動状態は以下のように確認できます。
kuro@kuro-ph01 [ ~ ]$ docker images REPOSITORY TAG IMAGE ID CREATED SIZE vmwarecna/nginx latest c237cfda7789 23 months ago 93.48 MB kuro@kuro-ph01 [ ~ ]$ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 02e4fcf9b805 vmwarecna/nginx "nginx -g 'daemon off" 2 minutes ago Up 2 minutes 0.0.0.0:80->80/tcp, 443/tcp hungry_stonebraker
ブラウザで http://<IP アドレス>/ にアクセスして、以下のようにデモンストレーションのページが開けば成功です。
動くのが分かったので、お掃除します。まずはコンテナの停止。
kuro@kuro-ph01 [ ~ ]$ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 02e4fcf9b805 vmwarecna/nginx "nginx -g 'daemon off" 2 minutes ago Up 2 minutes 0.0.0.0:80->80/tcp, 443/tcp hungry_stonebraker kuro@kuro-ph01 [ ~ ]$ docker stop 02e4fcf9b805 02e4fcf9b805 kuro@kuro-ph01 [ ~ ]$ docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 02e4fcf9b805 vmwarecna/nginx "nginx -g 'daemon off" 5 minutes ago Exited (0) 8 seconds ago hungry_stonebraker
止めたらコンテナを消します。
kuro@kuro-ph01 [ ~ ]$ docker rm 02e4fcf9b805 02e4fcf9b805 kuro@kuro-ph01 [ ~ ]$ docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
イメージも要らないので消します。
kuro@kuro-ph01 [ ~ ]$ docker rmi c237cfda7789 Untagged: vmwarecna/nginx:latest Untagged: vmwarecna/nginx@sha256:f73bbae0f31823c06478b1fa5efb4957bc25239802fd5ea94e4442c0a6090d23 Deleted: sha256:c237cfda7789b89aaed30c646fb885e89e423b4adc708f3a02981f6c4d55aed3 Deleted: sha256:7df42bfffcdf0ef09a8a7e89df5a7c3e35d10bfa2eb39fb1a367b6fdad79f858 Deleted: sha256:4c2eef2ffbe175f3372463bf3a5223ca9a524360510f30814988a620ebfb0248 Deleted: sha256:db57fe254f4599d7aa2a949a608cb41d31a828aa15e6bd9c57e6e4785e10d224 Deleted: sha256:5dab3f8810166fa8a16f74aa4e71b8d658ad6e6ebfe6851509df386d55b02ac0 Deleted: sha256:e327d626ee3d33195a1efe565a9d98415b4ef4ddfcfa5757609f86a661c13ca6 Deleted: sha256:7d433cbce64586e009ebffefa71b27573a374f3b2e6d66252a96cea88d7ccd31 Deleted: sha256:992d02669b3c389cece05fee1714f81bd9694ba23aeedff75cd054611a4b5d4c Deleted: sha256:58647153590d6ca2ecc30e0ddb208b9b24743967ce925383df462ec710699cc7 Deleted: sha256:fd622e88e74de6d4b74f9e7bf684bac2238f59b929475f70f092beb6db6b61db Deleted: sha256:f835ef83693c18a2694bedb0ecaca78e968a4846242abae2b704db2ac7140f3f Deleted: sha256:5062638dae85cb1e1c79154b25b0e2d4518f6267742638256ec619d937f3183e Deleted: sha256:3911ed2f627c2ff8e453a86182f7f1570ad95595b443507bc3d7eb05f3c53f41 Deleted: sha256:affbb86305e946bf861b7ec77af0e66287eaf8649bb4522d718eeac6079d94b7 Deleted: sha256:5f70bf18a086007016e948b04aed3b82103a36bea41755b6cddfaf10ace3c6ef kuro@kuro-ph01 [ ~ ]$ docker images REPOSITORY TAG IMAGE ID CREATED SIZE
Photon OS を OVA テンプレートからデプロイし、必要な初期設定を行ったあと、Docker の動作確認を行いました。
今回はここまで。あとはどうにでもなりますね。次回は Docker 上で bind を動かします。
Intel の NUC を買いました。第 6 世代のうちの、NUC6i5SYH です。
製品の Web ページ を見るとそろそろ第 7 世代のものが買えるようになりそうな雰囲気がありますが、待つのが嫌なので買ってしまいました。
使い道は考えていませんが、そういうときはとりあえず ESXi を入れます。新しいものが好きなので、現時点で最新の ESXi 6.5 にしました。
Intel NUC は VMware Compatibility Guide に乗っていないハードウェアです。何があって文句は言えません。
買ったメモリとストレージも、Intel がテストした構成の一覧には記載のないデバイスです。
列挙します。
SSD はデータストアとして占有させたかったので、ESXi のブート用には USB メモリを別に用意します。
全部で 9 万円くらいですね。いい時代です。
何も考えずに製品の公式の ISO イメージをそのままインストールすれば問題なしでした。
昔は非公式のドライバを自分で突っ込まないとうまくデバイスが認識されなくてダメだったようですが、最近は公式のそのままで大丈夫みたいですね。
インストール後、そのまま DCUI で IP アドレスやらホスト名やらを設定したら、vSphere Client で ESXi につないで必要な設定をします。
vSphere Client は、C# 版はもうないので、HTML5 版を使います。ESXi に組み込みで用意されていて、ブラウザで ESXi に設定した IP アドレスに接続するだけで使えます。快適です。
さて、ESXi のインストールは何の問題なく終了したものの、データストアのアクセスが異常に遅いというトラブルが発生しました。
ESXi 6.5 になって追加された新しいデフォルトの AHCI ドライバが、NUC の SATA コントローラをうまくハンドルできなかったみたいです。
以下のようにして明示的に vmw_ahci ドライバを無効化することで解決できました。
esxcli system module set -e=false -m=vmw_ahci
このトラブル、具体的には、以下のような症状です。
このログ、SAN 構成なら目にすることはありますが、DAS のストレージでは通常は出ません。真っ先に SSD の初期不良を疑い、そして NUC の初期不良も疑いましたが、調べてみると同じ症状の事例が海外で複数報告されていました。解決策も載っています。
今回は問題にはなりませんでしたが、ESXi 6.5 では USB メモリもトラブルが起きがちのようです。
これも AHCI のドライバと同様、デフォルトのものが置き換わったことが原因だとか。KB 化もされていました。
ドライバ周りはトラブルが起きるとハード障害との切り分けがしにくくて厄介ですね。
とりあえず vSphere 6.5 の環境をざっと触ってみたいので、ひとまず vCSA を立てていろいろ様子をみて、あとは素直に小さな仮想化基盤としておもちゃにします。
Rubinetto で使っているウクレレベースのジャックが接触不良気味だったので交換。
ウクレレベースは KALA の UBASS-SMHG-FS というモデル。これについているピックアップシステムは、Shadow の SH NFX EQ-T UK というものらしい。
保証期間内であれば販売店持ち込みが楽だけれど、すでに過ぎていたし、難しい話でもないので自分で。
本体の裏には作業用の穴がある。蓋は磁石での固定なのですぐ外せる。
元の配線がわからないと部品の交換ができないのだけれど、インタネットでは配線図が見つけられなかったので実物を基に書き起こした。
模式的に描くとこう。
似非回路図っぽくするとこう。いろいろと省略しているけれど。
バッテリとプリアンプのグラウンドが両方ともジャックのスリーブにつながっているのがめずらしいけれど、シールドを挿さない状態(リングとスリーブがショートしない状態)でもチューナ機能を使えるようにするためかな、たぶん。
チューナ側にも別にスイッチがあるから、きっとそういうことだと思う。
配線がわかれば、あとは新しいジャックを同じ配線で繋ぐだけ。今回買ったのは SCUD の EP=JACK2。
最初にブッシングを通さないと詰む。ありがちなミスだけれどまじで実際やらかした。
あとは適当に熱収縮チューブで絶縁しながら繋いでいく。
繋ぎ終わったらこの時点でいちど音を出してみた。問題なし。
あとは取り付け。
板の厚みを適当に読んで内側のナットの位置を決めたら、外側から締め付けてやる。
内側のナットが外側すぎると、シールドが挿し込みきれなくなって接触不良につながるので気をつける。内側のナットの位置はとてもだいじ。
固定できたらブッシングも締め付けて、外側にキャップをつけて完了。
おわり。
先日書いた 第 1 回 と 第 2 回 の Rubinetto 単独ライブ。ありがたいことにどちらも満員になり、そしてご好評をいただけたようです。
録音・録画は両ライブともばっちり行っていましたが、この二回分を組み合わせて、当日のフルプログラムになるように全 17 曲、YouTube で公開しました。
お越しいただけなかった方、ぜひどうぞ。お越しいただいていた方も、もう一度お楽しみいただければ幸いです。
全曲入りの再生リストです。再生ボタンをぽちっと押すと、17 曲ノンストップで連続で再生されます。BGM にいいですね!
前述の再生リストは、以下の全 17 曲でできています。アンコールだけは 2 公演分どちらも入れてあるので重複。
同じリストは、YouTube の再生リストのページ でも確認できます。
このうち “二階建ての校舎” は、第 2 回のみでの演奏でした。プログラムにも記載していなかった、とくべつな一曲です。
作曲者である Haracem のオリジナル CD を参考音源に、”自分のパートの楽譜は自分で書き起こしててきとうにアレンジする” という試みのもとで練習が進められて、(ぼくを含む)メンバの強い希望でめでたく本プログラム入りをはたしました。よい曲です。
オリジナル版は Haracem 自身の手でアップロード されています。
こちらが当日配布したプログラムです。あわせてどうぞ。
次は 5 月 30 日の土曜日、五月雨ギターアンサンブルコンサートに出演します。
時間もたっぷり 40 分ほど。まだなにを弾くか決めていませんが、存分にお楽しみいただけるはずです。
ぜひどうぞ!
団員もあいかわらず募集中です! どしどしご連絡ください!
Rubinetto の結成から一年。5 人で始めて、いまは 14 人。
いろいろな方々と共演する形でこれまで都合 4 回のライブに出演してきましたが、ついに Rubinetto の名義で単独でライブを開催するに至りました。
“いつもの場所” とも言えるおなじみのカフェレストラン、ポトスさんにて。2 月 15 日、土曜日。
お客さんもたくさん来てくれて満席になった(すごい!)し、終演後のわちゃわちゃもおもしろかったし、何より演奏をみんなでによによしながら楽しめたので、あんまり言うこともないのですが。
ライブの様子をさっそく二曲だけ公開したので紹介します。
まずはこちら、葉加瀬太郎さんの Girls Talk。かわいい曲です。
カホンは最近加わったのですが、ウクレレベースのふくよかかつ濃厚な低音との相乗効果で、ビート感が強烈にふくらんで推進力が爆発的に増強されます。さいこうです。
そしてこちら、これも葉加瀬太郎さんの Born to Smile。これまで MV 版 や カフェコンサート版 も公開してきましたが、人数と楽器の増強で大幅にパワーアップしました。
今回来られなかったみなさま、3 月の 14 日の土曜日に今回とおなじような演目で『第 2 回 Rubinetto 単独ライブ』を開催しますので、ぜひどうぞ。
14 時開演っていう昼間だし、登戸駅からたったの二駅の狛江駅すぐなんていうステキなロケーションなので、部活帰りの学生さんにもちょうどよい具合です。ホワイトデーですし、デート会場にでもしていただければ。
そしてそして、単独ライブ以外にも、三月末のカフェコンサート と、五月のコンサート、さらには 八月のコンサート への出演がすでに決まりつつあります。
あいかわらず、団員は募集中です。
今月すでにひとり加入してくれていますし、なんていうか、みんなで気軽に音楽を楽しめる場をひろく解放していきたいというのがぼくのなかにあるので、技量とかどうでもよくて、だからぼくらの演奏を見て聴いてみて、楽しそうだなー混ざりたいなーって思ってくれたらほんとうにまず見学に来てみちゃえばよいと思っています。
お気軽にという言葉以上にお気軽なくらいでじゅうぶんなので、お気軽にどうぞ。
来てくれたみなさま、ポトスのみなさま、ありがとうございました。ギター好きのみなさま、3 月 14 日に泉の森会館で会いましょう 🙂
ギター合奏界隈で集まってお互いに自己紹介するときに、『○○高校の△期の□□です』という言い方をよくします。ぼくでいえば、『多摩高校の 48 期の黒井です』といった具合ですね。
これ、同じ学校であればすぐにどの世代か理解できて自分との関係性も導き出せるのですが、当然ながら他校の数字で言われてもよくわかりません。それどころか、学校によっては、”期” ではなく定期演奏会の “回” で数えているところもあります。
もちろん、他校出身の友人がいるのであれば、そのひとを基準に計算することは容易いし、慣れてくれば自分の頭の中に対応表が出来上がってくるものです。最近では『多摩高校換算で××期相当』と自己紹介に最初から含めてくる強者もよく目にするようになりました。
とはいえ、そういうコミュニティの空気に慣れるまでは、それはなかなかできるものではありません。
相手の世代がわかることで、初対面でも、コンクールで弾いていた曲、交流会であったできごと、共通の先輩や後輩など、話題の幅がかんたんに広がります。とくに相手が自分に近い代である場合はなおさらで、思い出話に花を咲かせやすくなるというものです。
そんなわけで、初対面でも話のきっかけを増やせるかもしれない仕組みのひとつとして、これを作りました。
……もともとこういう変換機構は欲しいなあとは思ってはいたのですが、実装に着手したいちばん直接的な理由は、最近老害おじさん友人がこんなことをやっていたからです。
これでどうだ pic.twitter.com/jASiSVsWPi
— めがたか🦅🌳megataka (@megataka) January 12, 2015
これです。
これは、中学や高校でギター合奏を行う部活動や同好会に所属している、または所属していた方々を対象にした、
という機能をもつ Web サービスです。
スマートフォン世代の方々にはすぐ馴染めるようなインタフェイスにしたつもりです。
また、右上の [設定] ボタンからは、いくつか挙動を任意で変更できます。設定は任意のタイミングで変更可能で、変更は即座に結果に反映されます。
[定演の回を表示する] のチェックを入れると、計算結果に期数だけでなく、その期の代が引退したときの定期演奏会の回数も併せて表示されます。デフォルトは無効です。なお、定期演奏会の回数はツイートには含まれません。
[マイナス表示を許可する] のチェックを入れると、”1 期” のひとつ上を “0 期”、もうひとつ上を “-1 期”…… とさかのぼって表示するようになります。デフォルトは無効で、”1 期” より上の代はすべて “-” と表示します。”1 期” のひとつ上を “0 期” にするべきか “-1 期” にするべきかは議論の余地がありますが、実装がラクなのでひとまず “0 期” にしています。
世代の区別の根拠は学校によって “期” だったり “回” だったりといろいろなので、そういった差を吸収するため、複数の変換方法を用意しました。
また、処理を JavaScript で完結させているので、サーバとの余計な通信は発生しません。
拡張しやすくするため、学校の情報はすべてひとつの連想配列にまとめました。結果の表示枠もすべてその配列から動的に生成させているので、配列に一行足すだけで学校が追加できます。
あとは結果が “-” になる学校の分はツイートに含めないとか、入力時に学校に応じて期の選択肢が変わるとか、細かなところは手を入れています。
あくまで機械的に算出しているため、『定期演奏会が必ず一年に一度だけ開催される』という暗黙の前提を置いています。この前提に従っていない歴史がある場合は、計算結果が狂います。
おくさまに見せたら、『Facebook か Twitter と紐付けて結果をデータベースに貯めて、誰と同期だとか誰が後輩で先輩だとかわかるようにしたら?』と言われました。さすが IT やさんです。
本業のおしごとでは IT 系と言いつつ Web アプリケーション系のコードを書く機会がまるでないので、久々に趣味のプログラミングって感じでおもしろかったです。
jQuery Mobile、便利ですね。まともに使ったのは恥ずかしながら初めてだったんですが、好きになりました。
こういうのって、コードを GitHub に載せるとイイんでしょうか。最近のお作法ってどうなんだろう。
ちなみにこの勢いに乗って、実は Python + jQuery でそれなりに機能する CGI を作ったんですが、それはまた別のお話。一般公開はしていないです。
昨年の 12 月 28 日、日曜日、アルトギターを背負って足立区のギャラクシティへ。アンサンブルジターノさんの練習に混ざってきました。
先日、新日本ギターアンサンブルのギタークリスマスコンサート で、ジターノさんの中のひとが何人か来てくれていて、その時にお声かけいただいたのがきっかけです。こういうの、うれしいですよね。
ジターノさんは、所沢高校と大宮高校のギター部の OB さんを中心に 2010 年の 10 月に結成された社会人ギターアンサンブル団体です。
ぼくがジターノさんの演奏会を初めて聴きに行ったのが二年ちょっと前、2012 年の秋でした。当時はたしか 10 人も居なかったと記憶していますが、今ではもう 15 人くらいに増えています。
その 2012 年の秋、初めて聴きに行った日の、演奏会のあとのぼくの Twitter がこれです。
おわた(*´ω`) ちょう平和な空気でものすごくのんびり聴いてしまった(*´ω`)
— くろい (@kurokobo) September 30, 2012
規模が大きいわけではないけど、でもこういうギター欲ともいうべきもので集まった方々の演奏は大概たのしい。やりたくてやってる空気ってうまくいえないけどそれだけで魅力的よね(・∀・) どう理屈をこねくりまわしたところでやっぱりこれが原点だよなあと(・∀・) 次が楽しみだ(・∀・)
— くろい (@kurokobo) September 30, 2012
この感覚は今でも健在で、だから今回練習に見学に行って思ったのも、”やりたくてやっている” というモチベーションの強さでした。
中学高校の部活でもなく大学のサークルでもない団体で、社会人になって “やりたいから” “すきだから” をモチベーションにして活動を続ける、というのは実はかなり体力が要るものです。
その意味で、もう四年以上も続いているジターノさんの活動っぷりは、ぼくにとってはとても魅力的だし好きなものだし、参考にしたいものだし、そして理想的だと思っています。
練習内容はネタバレになってしまうのであまり詳しくは書けませんが、和気藹藹とした空気、根本的な “仲のよさ” はこのひとたちの明確な強みだなあと、そんなことを思いながら、みなさんに混ざってアルトギターを弾いていました。
ぼくが弾いたことがある曲もこの日の練習内容に入っていて、予想はしていたものの同じ曲でも解釈や表現が違うのはおもしろかったです。その “違う表現” に至るまでの練習の方法論も当然違ってくるわけで、これは違う団体の練習に混ざらない限り味わえない新鮮さでした。椅子の配置などの文化もけっこう違いがあるようですね。
そういえば、某音楽院が編曲して発行している楽譜に弦楽用の原譜にあるアーティキュレーションや強弱記号がぜんぜん反映されていないのは少し気になりました(もちろんジターノさんの責任ではないですが……)。
練習のあとは忘年会になった ようで、残念ながら別の集まりがあったため参加はかないませんでしたが、次は混ざっていきたいですね。ちらっちらっ。
そんなわけで、他団体の文化や空気に触れられたよい機会でした。こういう他団体の練習の見学の機会、増やしたいなあとひそかに思っています。ちらっちらっ。
今年の 9 月 23 日(水・祝)に定期演奏会を開催 するそうなので、興味のある方は是非。ぼくも聴きに行く予定です。
ジターノのみなさま、ありがとうございました。またよろしくお願いします。
昨年もまとめましたが、今年もまとめます。
今年は『イベントごとにエントリをひとつ』という記録の付け方をひそかに目標にしていました。
というわけで、だばだばと列挙していきます。
ここまでで半年。クラシックギターを中心に、ロック、吹奏楽、ボサノヴァなどに触れた日々でした。
続いて後半です。
あいかわらず中心はクラシックギターでした。人生の中で諸事情により吹奏楽成分が増えてきていますが、ほかにもオーケストラ、ビッグバンドなどなど、いろいろです。
Rubinetto が本格的に演奏活動を始めたのも、7 月以降でしたね。ぼくのギターの中心はどうしたって新日本ギターアンサンブルなので、自分の “看板” というかアイデンティティは主にそれではありますが、Rubinetto は Rubinetto で息の長い団体にしたい、という思いが強くあります。
いろいろな音を聴く、ということは、自分の音を磨くうえで絶対に必要なことだと思っています。
身近な目標、自分にとっての “理想の音” を探すこと。おおいに妄想して、脳内で “理想の音” が鳴らせるようになること。さらにその脳内の “理想の音” を磨きあげていくこと。いろいろな音を聴いて、いろいろな弾き方をみて、きれい、きたない、かっこいい、かっこわるい、そういう自分の中に湧く素直な感想をだいじにして、自分にとっての “理想の音” を高めていくこと。
ここ何年も、ずっとそういうことを続けています。
意識しよう、うたおう、よくいわれるこういう指摘は、”脳内で理想状態を思い浮かべて” と、”その理想状態をなぞるように弾く” という、ただそれだけの、ほんとうにただそれだけのことなのです。だからこそ、”理想状態” そのものを高めることが、成果に直結するわけです。
脳は万能なのですヽ(・∀・)ゝ 妄想の世界ならどんな弾き方だってできるしどんな音だって鳴らせるのですヽ(・∀・)ゝ 考えるだけで本当に鳥肌が立つような、そういう理想的で究極に至高で最高な音を、脳内で演奏できるようになろうヽ(・∀・)ゝ 出し方はあとまわしでいいのですヽ(・∀・)ゝ
— くろい (@kurokobo) August 5, 2013
人間のボトルネックは身体動作を伴うアウトプット部分で、決して脳ではないのですヽ(・∀・)ゝ 脳の万能な力を信じて、枷をはめずに、脳に自由にさせてみるのですヽ(・∀・)ゝ 言語化しようとせずにヽ(・∀・)ゝ 言語化すると言語化できる範囲の外に出られなくなりますヽ(・∀・)ゝ
— くろい (@kurokobo) August 5, 2013
脳内で至高の音を出す自分の姿が想像できたら、それを現実世界でトレスしますヽ(・∀・)ゝ 音を出した瞬間、きっと理想とのギャップに幻滅するヽ(・∀・)ゝ そこからが練習だヽ(・∀・)ゝ りそうにひたりげんじつをみつめもだえくるしんであがくのですヽ(・∀・)ゝ
— くろい (@kurokobo) August 5, 2013
宗教じみてきたけどわりとそういう感覚、ぼくは大事にしてる。想像できないものは現実にできない
— くろい (@kurokobo) August 5, 2013
『頭を使って演奏する』ことは、脳にたくさん想像と妄想をさせながら弾くことに似ている。想像する作業と指を動かす作業は半分くらい連動してて半分くらいは別人格。でもどっちもぼくの世界
— くろい (@kurokobo) August 5, 2013
理想状態を明確に想像できることはやっぱりだいじだ
— くろい (@kurokobo) August 2, 2014
顔文字がウザい(書きながら自分でそう思った)けれど、以上、一年半くらい前のツイートをお送りしました。
ギター合奏やってる人は一定以上のレベルの演奏聞く機会が他ジャンルに比べて極めて少ないよなー。理想のサウンドが脳内に無いってなんというか不幸。
— めき𓆏 (@kaerukumaen) December 18, 2014
大学では合唱サークルにいたけど、好きな合唱団ないし、アンサンブルは?
って聞かれたら、みんな何かしら答えられたよね。ルネサンスものならどこどこ、黒人霊歌はどこどこ。どこどこは此処は素晴らしいけど、ここがあんまり好きになれない等々。吹奏楽部の人なんかも答えられるのじゃないかしら。— めき𓆏 (@kaerukumaen) December 18, 2014
部活で初めて、10年、20年と合奏用ギター弾いてる人に、好きなチェンバロギター奏者は?とか聞いても、一割も答えられないんじゃなかろうか。
いや、仕方ない部分もあるけど、
それで続けていくのは俺だったらきついなー— めき𓆏 (@kaerukumaen) December 18, 2014
嘘だろ俺の弾いてる楽器こんな音出せるのかよ…、ってなったり、どうやったらこんな演奏出来るんだろうってもう動きから顔から全部真似てみたりした経験なしに熱を冷まさずにいられるもんなのかな。
— めき𓆏 (@kaerukumaen) December 18, 2014
元々市場が小さい上にグループ間交流が絶望的に少ないから、母数が小さいんである意味必然なんですよね RT @kaerukumaen: ギター合奏やってる人は一定以上のレベルの演奏聞く機会が他ジャンルに比べて極めて少ないよなー。理想のサウンドが脳内に無いってなんというか不幸。
— Jun Matsumoto (@Jun_mats) December 19, 2014
基礎練習、個人練習、アンサンブル練習それぞれと同じくらい聴きにいくことに力を割いてもよいと思うよ
— Jun Matsumoto (@Jun_mats) December 19, 2014
偉大なる先達のコトバを引用して終わりにします。
そんなわけで、全部で 35 回の演奏会に聴いたり観たり出たり手伝ったりした一年でした。前年比で 10 回増しです。
来年…… は、動きが鈍りそうな気はしますが、引き続きいろいろなところに顔を出していきたいところです。