Crowiでもプラグインを使いたかったんです

サマリ

Crowiでオレオレjavascriptを実行できるようにした。

github.com

背景

CrowiはMarkdownでかけるwikiで、見た目もおしゃれで大変いい感じなんだけど、 pluginが使えないのがちょっと残念だったので作った。

予防線

  • 自分のJavascript知能指数は2くらいしかないので、ゴリラが文字を書くようなコードになっていてつらい
  • あんまりテストしていないのでバグってる可能性が多々ある
  • 本家crowiとは全く関係ない

使い方

  • public/js以下にpluginフォルダを作って、pluginのjsファイルを放り込む
  • 以下のようにmarkdownを書くと、plugin_name.jsをロードして、同名の関数にデータを入れたjsonを引数にしてコールしてくれる。
  • pluginはmarked(https://github.com/chjj/marked)をちょこっといじって実装しているので、返り値は必ずHTMLにすること。
  • 1ページにつき1つのプラグインしかサポートしていない
  • 複数使いたい欲張りはもっとちゃんとしたやつを作って僕にも使わせてください
 ```#plugin_name
 {json形式(改行なし)でデータを入れる}
 ```

どんなことができるの?

こんな感じで、markdownだけどフォームを入れ込んだりできる。要は調整さんとかdoodleとかの 出欠確認フォームみたいなのを作れるというわけですね。

f:id:nbisco:20160706231635p:plain

プラグインサンプルよこせ

くらえ!これがJavascript知能指数2のコードだ!!!

gist.github.com

どういう仕組みで実現しているの?

プラグインコール

markedのRenderer(markdownからhtmlに変換するところ)をoverrideして使っています。 ```# を見つけたらpluginだと判断して、#に続く文字列をevalして プラグインをコール。

参考URL

Tumbling Dice — [JavaScript]marked.jsを無理矢理拡張してオレオレパーサーを作る

プラグインロード

lib/route/page.jsで、記事の中から```#<plugin_name>を抜き出します。 renderVarsに、pluginというプロパティを定義し、<plugin_name>.jsを覚えさせておきます。 そして、lib/views/layout/layout.htmlで、pluginプロパティが定義されているときにscriptタグを追加するようにします。

なんでplugin1個だけサポートなのかというと、 Promise内にループを仕掛けるのが結構大変そうだったから。

今更ながらdockerメモ

目次

サマリ

dockerをさわってみたのでメモ。

参考文献

ていねいなユーザマニュアルが標準装備なのはたいへんありがたいですね。

docs.docker.com

dockerのインストール

Ubuntuだとaptで入れられるのでらくちんですね。 なお、以下のバージョンしか公式にサポートしていない模様。 さらに、カーネルは3.10以上じゃないとダメ。

  • dockerがサポートしているUbuntuのバージョン
  • dockerがサポートしているカーネルのバージョン
    • 3.10 以降

以下、手順。僕の環境はUbuntu 14.04。 ログアウトは、端末を開き直すだけじゃダメ。

sudo apt-get install linux-image-extra-$(uname -r) は、 aufsを使うためだけっぽいのでいらないと思う。

# aptがhttpsを使えるように
$ sudo aptitude update
$ sudo aptitude install apt-transport-https ca-certificates

# aptのGPG keyを追加
$ sudo apt-key adv --keyserver hkp://p80.pool.sks-keyservers.net:80 --recv-keys 58118E89F3A912897C070ADBF76221572C52609D

# /etc/apt/sources.list.d/docker.listをまっさらにして作りなおす
$ echo "deb https://apt.dockerproject.org/repo ubuntu-trusty main" > /etc/apt/sources.list.d/docker.list

# aptのパッケージをアップデート
$ sudo aptitude update

# lxc-dockerをすでに入れていたらpurgeしておこう
$ sudo aptitude purge lxc-docker

# aptが正しくリポジトリを認識ているか確認しよう
$ sudo apt-cache policy docker-engine

# インストール!
$ sudo apt-get install docker-engine

# Dockerグループに自分をいれておくと、sudoしなくてもdockerコマンドをたたけるようになるので
# いれておく
$ sudo gpasswd -a $USER Docker

# 一旦ログアウトしよう
$ logout

dockerでhello world

docker run hello-worldして、以下のメッセージが出てきたら成功。 最初にDocker Hubからhello-worldイメージを取ってきて、 そこから起動するみたい。

$ docker run hello-world
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
03f4658f8b78: Pull complete 
a3ed95caeb02: Pull complete 
Digest: sha256:8be990ef2aeb16dbcb9271ddfe2610fa6658d13f6dfb8bc72074cc1ca36966a7
Status: Downloaded newer image for hello-world:latest

Hello from Docker.
This message shows that your installation appears to be working correctly.

To generate this message, Docker took the following steps:
 1. The Docker client contacted the Docker daemon.
 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
 3. The Docker daemon created a new container from that image which runs the
    executable that produces the output you are currently reading.
 4. The Docker daemon streamed that output to the Docker client, which sent it
    to your terminal.

To try something more ambitious, you can run an Ubuntu container with:
 $ docker run -it ubuntu bash

Share images, automate workflows, and more with a free Docker Hub account:
 https://hub.docker.com

For more examples and ideas, visit:
 https://docs.docker.com/userguide/

Docker Hubからdocker imageを取得して動かす

GitHubみたいに、docker imageを置いておくことができる Docker Hubというものがある。 公式リポジトリがいくつかあるようなので、そこから試しにubuntuを取得してみる。 docker pull <リポジトリ>:<タグ>でdocker imageを取得できる。 <タグ>を省略すると、最新版を取得する。

例えば、以下の例では、ubuntuリポジトリのタグ"14.04"を取得する。

$ docker pull ubuntu:14.04

取得したイメージはdocker imagesで見られる。

$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
ubuntu              14.04               07c86167cdc4        2 days ago          188 MB
hello-world         latest              690ed74de00f        4 months ago        960 B

取得したものは、docker runで動かすことができる。 取得しなくとも、docker runを打つと、 勝手にDocker Hubに探しに行って取得してくれるので便利。 プログラムを動かしたままコンテナから脱出するにはCtrl-p Ctrl-q。 logoutしてしまうと、コンテナが停止してしまう。

# 単に動かす
$ docker run ubuntu echo "hello world"
### ubuntuイメージがない場合はDocker Hubから勝手に取ってきてくれる
hello world

# backgroundで動かす
$ docker run -d ubuntu echo "hello world"
### ubuntuイメージがない場合はDocker Hubから勝手に取ってきてくれる
hello world

# -itをつけると、対話型のプログラムも動かせる。
$ docker run -it ubuntu /bin/bash
root@44d395e6298d:/#

# コンテナに名前をつける
$ docker run -it --name bash_test ubuntu /bin/bash 

コンテナのリストを取得するのは、docker ps docker ps -aで、止まっているコンテナも見ることができる。

NAMES(コンテナの名前。以後コンテナ名とする)はDocker Engineが勝手につけてくれる(もちろん自分でつけてもよい)。 動かしたり止めたりするときに、コンテナIDを指定してもよいし、コンテナ名を指定してもよい。

$ docker ps -a
CONTAINER ID        IMAGE               COMMAND                CREATED             STATUS                      PORTS               NAMES
44d395e6298d        ubuntu:14.04        "/bin/bash"            13 seconds ago      Exited (0) 3 seconds ago                        sharp_panini
b4a331a7280d        ubuntu:14.04        "echo 'hello world'"   26 seconds ago      Exited (0) 25 seconds ago                       mad_hugle
a627000187a6        hello-world         "/hello"               8 minutes ago       Exited (0) 8 minutes ago                        nostalgic_bhabha

お作法としては、コンテナは使い終わったら破棄。 停止しているコンテナの破棄は、docker rmでできる。

# sharp_paniniを破棄
$ docker rm sharp_panini
sharp_panini 

# いちいち指定するのが面倒なので全部破棄
$ docker rm $(docker ps -a -q)

# --rmをつけてrunすると、終了後にdocker rm してくれる
$ docker run --rm -it ubuntu /bin/bash

オレオレdocker imageを作る

直感的なやり方

いちばん直感的なのは、コンテナ起動して、必要なプログラムをインストールした後、コミットするやり方。 例えば、sysstatをインストール済みのコンテナを作るとすると、こんな感じになる。

$ docker run -it ubuntu:14.04 /bin/bash
root@cd9379115537:/# sudo aptitude install sysstat
root@cd9379115537:/# exit
# -m はコミットログ。 -a は変更作成者。
# nbisco/sysstatというイメージを、testタグをつけて作成。
$ docker commit -m "Added sysstat" -a "nbisco" \
cd9379115537 nbisco/sysstat:test

Dockerfileを使うやり方

Dockerfileを使うと、いちいちコンテナ起動しなくても docker imageを作ることができる。

何はともあれ、まずはDockerfileを作る。

$ mkdir test 
$ cd test
$ touch Dockerfile

Dockerfileを作ったら、以下を書き込む。 何のことはない、単にやってほしいことを書くだけだ。

# コメント行
FROM ubuntu:14.04 # どのイメージをベースにするか
MAINTAINER nbisco <XXXX@XXXX.XXX>  # イメージのメンテナはだれか
RUN aptitude update && aptitude install -y sysstat # コンテナ起動後に実行するコマンド

Dockerfileを作ったら、以下のコマンドでイメージ作成。

# 最後の引数はDockerfileへのパスを指定すること。dotなので見落としがち。
$ docker build -t nbisco/sysstat:dev . 

作ったimageは同じようにdocker run nbisco/sysstat:devで起動できる。 らくちん。

Dockerのネットワーク機能

コンテナにおけるネットワークは、(1)何とも繋がないnone、(2)ホストオンリーのhost、 (3)他コンテナやホストと繋げられるbridgeの3種類に大別できる。 デフォルトはbridge。

ネットワークは、以下のコマンドで確認できる。

$ docker network ls
NETWORK ID          NAME                DRIVER
18a2866682b8        none                null                
c288470c46f6        host                host                
7b369448dccb        bridge              bridge  

ネットワークの状況は、docker network inspect <network名>で調べられる。 ※特に何も繋がっていない状況なので、"Containers"が空になっている。

$docker network inspect bridge
[
    {
        "Name": "bridge",
        "Id": "157fb4893818ff6e8fa7512b142b9e97df007f042d61f5bbc7bbdfbe9c9da2cb",
        "Scope": "local",
        "Driver": "bridge",
        "IPAM": {
            "Driver": "default",
            "Options": null,
            "Config": [
                {
                    "Subnet": "172.17.0.0/16"
                }
            ]
        },
        "Containers": {},
        "Options": {
            "com.docker.network.bridge.default_bridge": "true",
            "com.docker.network.bridge.enable_icc": "true",
            "com.docker.network.bridge.enable_ip_masquerade": "true",
            "com.docker.network.bridge.host_binding_ipv4": "0.0.0.0",
            "com.docker.network.bridge.name": "docker0",
            "com.docker.network.driver.mtu": "1500"
        }
    }
]

動かしているコンテナのネットワークを切り離すこともできる。

$ docker run -d --name networktest training/webapp python app.py
$ docker network disconnect bridge networktest

専用のbridgeネットワークを作って、コンテナ同士をつなげたりもできる。

# コンテナスタート時にネットワークを指定する場合
$ docker network create -d bridge my-bridge-network 
$ docker run -d --net=my-bridge-network --name network_test1 ubuntu
$ docker run -it --net=my-bridge-network --name network_test2 ubuntu /bin/bash
root@047745a86ac1:/# ping network_test1
PING db (172.18.0.3) 56(84) bytes of data.
64 bytes from db.my-bridge-network (172.18.0.3): icmp_seq=1 ttl=64 time=0.101 ms
64 bytes from db.my-bridge-network (172.18.0.3): icmp_seq=2 ttl=64 time=0.063 ms

# 一旦止めれば、ネットワークに接続させることもできる
$ docker run -it --name network_test3 ubuntu /bin/bash
★IPが172.18.0.0と別セグメントになっているので、届かない。
root@51057043d3ff:/# ifconfig
eth0      Link encap:Ethernet  HWaddr 02:42:ac:11:00:02  
          inet addr:172.17.0.2  Bcast:0.0.0.0  Mask:255.255.0.0
          inet6 addr: fe80::42:acff:fe11:2/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:25 errors:0 dropped:0 overruns:0 frame:0
          TX packets:8 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:4814 (4.8 KB)  TX bytes:648 (648.0 B)

lo        Link encap:Local Loopback  
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:65536  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

$ docker stop network_test3
$ docker network connect my-bridge-network network_test3
$ docker start network_test3
$ docker exec -it network_test3 /bin/bash
root@51057043d3ff:/# ifconfig
eth0      Link encap:Ethernet  HWaddr 02:42:ac:11:00:02  
          inet addr:172.17.0.2  Bcast:0.0.0.0  Mask:255.255.0.0
          inet6 addr: fe80::42:acff:fe11:2/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:26 errors:0 dropped:0 overruns:0 frame:0
          TX packets:8 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:4825 (4.8 KB)  TX bytes:648 (648.0 B)

# ★もう1個できて、network_test1/2とつながるようになった
eth1      Link encap:Ethernet  HWaddr 02:42:ac:12:00:04  
          inet addr:172.18.0.4  Bcast:0.0.0.0  Mask:255.255.0.0
          inet6 addr: fe80::42:acff:fe12:4/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:26 errors:0 dropped:0 overruns:0 frame:0
          TX packets:8 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:4825 (4.8 KB)  TX bytes:648 (648.0 B)

lo        Link encap:Local Loopback  
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:65536  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

Dockerにおけるデータ管理

コンテナ起動時に-vオプションをつけると、コンテナイメージに含まれない ボリュームを作ることができる。例えばこんな感じ。

$ docker run -d -P -v /testweb --name web training/webapp python app.py
$ docker exec -it web /bin/bash
root@fc0beb95b345:/opt/webapp# ls /
bin  boot  dev  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  testweb  tmp  usr  var
root@fc0beb95b345:/opt/webapp# 

ボリュームの場所は、docker inspectで調べられる。 ボリュームと言っても、単なるディレクトリに見えるので、作ったデータを取り出すのは簡単。

$ docker inspect web | less
()
        "Mounts": [
            {
                "Name": "08375e69b62c71792953d2dc83ac735c1c5cb8de63ac655557098f9446b95936",
                "Source": "/var/lib/docker/volumes/08375e69b62c71792953d2dc83ac735c1c5cb8de63ac655557098f9446b95936/_data",
                "Destination": "/testweb",
                "Driver": "local",
                "Mode": "",
                "RW": true,
                "Propagation": ""
            }
        ],

()

$ docker exec -it web /bin/bash
docker exec -it web /bin/bash
root@fc0beb95b345:/opt/webapp# touch /testweb/test.txt
$ ls /var/lib/docker/volumes/08375e69b62c71792953d2dc83ac735c1c5cb8de63ac655557098f9446b95936/_data
test.txt

既存のホストディレクトリをマウントすることもできる。 lsするとサブディレクトリ以下まで普通に見えてしまう。

$ mkdir /home/nbisco/test_docker
$ touch /home/nbisco/test_docker/test.txt
$ mkdir /home/nbisco/test_docker/test_docker_sub
$ docker run -d -P -v /home/nbisco/test_docker:/test_docker --name web training/webapp python app.py
$ docker exec -it web /bin/bash
root@fce1df482e8d:/opt/webapp# ls /test_docker
test_docker_sub test.txt 

ディレクトリだけでなく、ファイルもマウントできちゃう。 わざわざdotfileをcloneしたりしなくて済むね。

$ docker run --rm -it -v ~/.bash_history:/root/.bash_history ubuntu /bin/bash

もちろん、他のコンテナとディレクトリを共有することもできる。 Docker Userguideには、/dbdataを共有する例が載ってる。 コンテナ間でディレクトリを共有すると、バックアップも手軽にできちゃう。

$ docker create -v /dbdata --name dbstore training/postgres /bin/true
$ docker run -d --volumes-from dbstore --name db1 training/postgres
$ docker run -d --volumes-from dbstore --name db2 training/postgres

# バックアップの例
$ docker run --rm --volumes-from dbstore -v $(pwd):/backup ubuntu tar cvf /backup/backup.tar /dbdata

# バックアップから復元したデータでコンテナを動かす
$ docker run --rm --volumes-from dbstore2 -v $(pwd):/backup ubuntu bash -c "cd /dbdata && tar xvf /backup/backup.tar --strip 1"

以上、ざっくり基本動作のメモでした。

Node.js + Express + MongoDBでログイン機構を作る

サマリ

Node.js + Express + MongoDBでログイン機構が動くようになった。

ソースコード

ここのコミット20e71e2から2db752eの差分を取ると、express-generatorからの差分がわかる。

github.com

ぼやき

Qiitaやら個人ブログやらいろいろあってありがたいが、 Node.jsの性質なのか、APIやら関数の呼び方やらがぐにゃぐにゃと変わるせいで、 ぐぐってもぐぐっても動くサンプルに辿りつけない。つらい。

ユーザプログラムの関数トレーサを作りなおした

サマリ

ここやらここここで解説されている ユーザプログラムの関数トレーサftraceを手直しして、少し機能追加しました。 もとのftraceだと名前がまぎらわしいのと、2011年で開発が止まっているっぽかったので、 uftrace(Userspaceのu)と名前を変えて公開しました。 github.com

ちなみに、ftraceの開発者hamanoさんのレポジトリはこれ。 github.com

ビルド方法

テンプレ的な方法でいけます。autotoolsはまだ勉強途上でよくわからない・・・

$ git clone https://github.com/bisco/uftrace.git
$ cd uftrace
$ ./configure
$ make
$ sudo make install

使い方

gccのオプション-g -finstrument-functionsをつけてビルドしなおしたあと、 こんな感じで使えます。

$ uftrace <your_program> <your_program_args>

追加した機能たち

細々追加しましたが、いちばんの目玉はフィルタ機能。 大きなプログラムだといろいろ出すぎて困るので作りました。

  • ファイル名と行数を表示(ftrace-0.90から手直しして復活)
  • 関数から出た時に情報を出力(ftrace-0.90から手直しして復活)
  • フィルター機能:正規表現でパターンを指定。マッチしたパターンを出力"しない"。

ピョッコリンアドベントカレンダーを終えて

サマリ

お友達のピョッコリンさんアドベントカレンダーを主催してくれたので、 賑やかしになればと思い参加しました。主催者が各記事についてコメントをつけてくれているので、 サマリに関してはこちらを。

文章を書いたりネタを探したりするのは結構大変だったけど、 何か書くために勉強しようと思うようになったのがよかったし(目的と手段が入れ替わっている気もするけども)、 何か勉強したらメモ代わりに書こうという気持ちになったのが本当によかった。 何より楽しかったね!

ピョッコリンさん、素敵な企画をありがとう!来年もやろう!

コメント返し

(12/14) Disk I/O性能測定するときに活躍する道具たち

ちなみにこういうのって、ハードディスク換装時期の目安としても意義あったりする?(あるなら入れてみようかなと)

換装時期の目安になるかは微妙です。 個人的にはならんと思う。

fioに関してはディスクをいじめることになるので、換装時期を早めてしまうことにもなりかねない。iostatやblktraceを定期的にとって、変化点を見いだすとかまですれば効果あるかも。ただ、効果に見合わない気がする。

よく聞く話としては、

  • スループットが落ちてきているディスクはそろそろ壊れる
  • もちろん例外はある。HDDだと外周が埋まっているとか、断片化しているとか。SSDだとフラッシュチップ全域にライトした後のライトとか。
  • レスポンスが遅くなってきているディスクはそろそろ壊れる
  • SSDは書いていると遅くなるのであれだけど・・・

なので、体感で遅くなってきたら早々に換装したほうがいいと思う。

壊れるときは突然壊れるので、ある程度覚悟とバックアップや冗長化構成を取る必要がある。 SSDならRAID5(RAID1だと同時に死ぬとかありうる)、HDDならRAID1でもRAID5でも、 クラウドにバックアップしても、何でもよい。予算に合っていて、納得できる形でやるのがいちばん。

(12/16) 秒速でRAM Diskを作成する

(普段使っているので)tmpfsとの違いが知りたい気がした。

単に使うだけなら、tmpfsが圧倒的に便利。 RAM Diskをどうしても使いたいときってぱっと思いつかない・・・ 何だ、何に使うんだ?データベース?

RAM Disk tmpfs
見え方 フォーマットしていないハードディスク(フォーマットしないと使えない) ディレクトリの一部(そのままファイル置ける)
リブート時 消える 消える
メモリの使い方 できた瞬間からディスクサイズ分メモリ量が減る tmpfs以下のファイルによって使用メモリ量が変わる

CentOS7.2 plusのターゲットドライバまわりがおかしい?

サマリ

http://vault.centos.org/7.2.1511/centosplus/Source/SPackages/kernel-plus-3.10.0-327.3.1.el7.centos.plus.src.rpm で、TCM_QLA2XX=mにするとビルドできない。drivers以下のソースで、transport_init_session()の使い方が新旧まざっているせい(だと思う)。

ビルド環境

KVM上のCentOS 7.2でビルド。

% cat /etc/redhat-release 
CentOS Linux release 7.2.1511 (Core) 
% uname -a
Linux centos-kvm 3.10.0-327.3.1.el7.x86_64 #1 SMP Wed Dec 9 14:09:15 UTC 2015 x86_64 x86_64 x86_64 GNU/Linux

ビルド手順

% rpm -ivh kernel-plus-3.10.0-327.3.1.el7.centos.plus.src.rpm 
% cd ~/rpmbuild/
% rpmbuild -bp SPECS/kernel-plus.spec
% cd BUILD/kernel-3.10.0-327.3.1.el7/linux-3.10.0-327.3.1.el7.centos.plus.x86_64
% mv .config config.orig
% cp /boot/config-3.10.0-327.3.1.el7.x86_64 .config
% make menuconfig # TCM_QLA2XXXをmにする
% cp .config ~/rpmbuild/SOURCES/kernel-3.10.0-x86_64.config
% rpmbuild -bb SPECS/kernel-plus.spec

エラーメッセージ抜粋

今回はtransport_init_sessionのところに注目。

 drivers/scsi/qla2xxx/tcm_qla2xxx.c: In function 'tcm_qla2xxx_check_initiator_node_acl':
 drivers/scsi/qla2xxx/tcm_qla2xxx.c:1421:2: error: too few arguments to function 'transport_init_session'
   se_sess = transport_init_session();
   ^
 In file included from drivers/scsi/qla2xxx/tcm_qla2xxx.c:47:0:
 include/target/target_core_fabric.h:87:20: note: declared here
  struct se_session *transport_init_session(enum target_prot_op);
                     ^
 drivers/scsi/qla2xxx/tcm_qla2xxx.c: At top level:
 drivers/scsi/qla2xxx/tcm_qla2xxx.c:1757:2: error: initialization from incompatible pointer type [-Werror]
   .queue_tm_rsp   = tcm_qla2xxx_queue_tm_rsp,
   ^
 drivers/scsi/qla2xxx/tcm_qla2xxx.c:1757:2: error: (near initialization for 'tcm_qla2xxx_ops.queue_tm_rsp') [-Werror]
 drivers/scsi/qla2xxx/tcm_qla2xxx.c:1804:2: error: initialization from incompatible pointer type [-Werror]
   .queue_tm_rsp   = tcm_qla2xxx_queue_tm_rsp,
   ^
 drivers/scsi/qla2xxx/tcm_qla2xxx.c:1804:2: error: (near initialization for 'tcm_qla2xxx_npiv_ops.queue_tm_rsp') [-Werror]
 drivers/scsi/qla2xxx/tcm_qla2xxx.c: In function 'tcm_qla2xxx_register_configfs':
 drivers/scsi/qla2xxx/tcm_qla2xxx.c:1844:2: error: implicit declaration of function 'TF_CIT_TMPL' [-Werror=implicit-function-declaration]
   TF_CIT_TMPL(fabric)->tfc_wwn_cit.ct_attrs = tcm_qla2xxx_wwn_attrs;
   ^
 drivers/scsi/qla2xxx/tcm_qla2xxx.c:1844:21: error: invalid type argument of '->' (have 'int')
   TF_CIT_TMPL(fabric)->tfc_wwn_cit.ct_attrs = tcm_qla2xxx_wwn_attrs;
 
 drivers/scsi/qla2xxx/tcm_qla2xxx.c:1845:21: error: invalid type argument of '->' (have 'int')
   TF_CIT_TMPL(fabric)->tfc_tpg_base_cit.ct_attrs = tcm_qla2xxx_tpg_attrs;
                      ^
 drivers/scsi/qla2xxx/tcm_qla2xxx.c:1846:21: error: invalid type argument of '->' (have 'int')
   TF_CIT_TMPL(fabric)->tfc_tpg_attrib_cit.ct_attrs =
                      ^
 drivers/scsi/qla2xxx/tcm_qla2xxx.c:1848:21: error: invalid type argument of '->' (have 'int')
   TF_CIT_TMPL(fabric)->tfc_tpg_param_cit.ct_attrs = NULL;
                      ^
 drivers/scsi/qla2xxx/tcm_qla2xxx.c:1849:21: error: invalid type argument of '->' (have 'int')
   TF_CIT_TMPL(fabric)->tfc_tpg_np_base_cit.ct_attrs = NULL;
                      ^
 drivers/scsi/qla2xxx/tcm_qla2xxx.c:1850:21: error: invalid type argument of '->' (have 'int')
   TF_CIT_TMPL(fabric)->tfc_tpg_nacl_base_cit.ct_attrs = NULL;
                      ^
 drivers/scsi/qla2xxx/tcm_qla2xxx.c:1851:21: error: invalid type argument of '->' (have 'int')
   TF_CIT_TMPL(fabric)->tfc_tpg_nacl_attrib_cit.ct_attrs = NULL;
                      ^
 drivers/scsi/qla2xxx/tcm_qla2xxx.c:1852:21: error: invalid type argument of '->' (have 'int')
   TF_CIT_TMPL(fabric)->tfc_tpg_nacl_auth_cit.ct_attrs = NULL;
                      ^
 drivers/scsi/qla2xxx/tcm_qla2xxx.c:1853:21: error: invalid type argument of '->' (have 'int')
   TF_CIT_TMPL(fabric)->tfc_tpg_nacl_param_cit.ct_attrs = NULL;
                      ^
 drivers/scsi/qla2xxx/tcm_qla2xxx.c:1884:26: error: invalid type argument of '->' (have 'int')
   TF_CIT_TMPL(npiv_fabric)->tfc_wwn_cit.ct_attrs = tcm_qla2xxx_wwn_attrs;
                           ^
 drivers/scsi/qla2xxx/tcm_qla2xxx.c:1885:26: error: invalid type argument of '->' (have 'int')
   TF_CIT_TMPL(npiv_fabric)->tfc_tpg_base_cit.ct_attrs = NULL;
                           ^
 drivers/scsi/qla2xxx/tcm_qla2xxx.c:1886:26: error: invalid type argument of '->' (have 'int')
   TF_CIT_TMPL(npiv_fabric)->tfc_tpg_attrib_cit.ct_attrs = NULL;
                           ^
 drivers/scsi/qla2xxx/tcm_qla2xxx.c:1887:26: error: invalid type argument of '->' (have 'int')
   TF_CIT_TMPL(npiv_fabric)->tfc_tpg_param_cit.ct_attrs = NULL;
                           ^
 drivers/scsi/qla2xxx/tcm_qla2xxx.c:1888:26: error: invalid type argument of '->' (have 'int')
   TF_CIT_TMPL(npiv_fabric)->tfc_tpg_np_base_cit.ct_attrs = NULL;
 
 drivers/scsi/qla2xxx/tcm_qla2xxx.c:1889:26: error: invalid type argument of '->' (have 'int')
   TF_CIT_TMPL(npiv_fabric)->tfc_tpg_nacl_base_cit.ct_attrs = NULL;
                           ^
 drivers/scsi/qla2xxx/tcm_qla2xxx.c:1890:26: error: invalid type argument of '->' (have 'int')
   TF_CIT_TMPL(npiv_fabric)->tfc_tpg_nacl_attrib_cit.ct_attrs = NULL;
                           ^
 drivers/scsi/qla2xxx/tcm_qla2xxx.c:1891:26: error: invalid type argument of '->' (have 'int')
   TF_CIT_TMPL(npiv_fabric)->tfc_tpg_nacl_auth_cit.ct_attrs = NULL;
                           ^
 drivers/scsi/qla2xxx/tcm_qla2xxx.c:1892:26: error: invalid type argument of '->' (have 'int')
   TF_CIT_TMPL(npiv_fabric)->tfc_tpg_nacl_param_cit.ct_attrs = NULL;

drivers/scsi/qla2xxx/tcm_qla2xxx.c:1853:21: error: invalid type argument of '->' (have 'int')
  TF_CIT_TMPL(fabric)->tfc_tpg_nacl_param_cit.ct_attrs = NULL;
                     ^
drivers/scsi/qla2xxx/tcm_qla2xxx.c:1884:26: error: invalid type argument of '->' (have 'int')
  TF_CIT_TMPL(npiv_fabric)->tfc_wwn_cit.ct_attrs = tcm_qla2xxx_wwn_attrs;
                          ^
drivers/scsi/qla2xxx/tcm_qla2xxx.c:1885:26: error: invalid type argument of '->' (have 'int')
  TF_CIT_TMPL(npiv_fabric)->tfc_tpg_base_cit.ct_attrs = NULL;
                          ^
drivers/scsi/qla2xxx/tcm_qla2xxx.c:1886:26: error: invalid type argument of '->' (have 'int')
  TF_CIT_TMPL(npiv_fabric)->tfc_tpg_attrib_cit.ct_attrs = NULL;
                          ^
drivers/scsi/qla2xxx/tcm_qla2xxx.c:1887:26: error: invalid type argument of '->' (have 'int')
  TF_CIT_TMPL(npiv_fabric)->tfc_tpg_param_cit.ct_attrs = NULL;
                          ^
drivers/scsi/qla2xxx/tcm_qla2xxx.c:1888:26: error: invalid type argument of '->' (have 'int')
  TF_CIT_TMPL(npiv_fabric)->tfc_tpg_np_base_cit.ct_attrs = NULL;

drivers/scsi/qla2xxx/tcm_qla2xxx.c:1889:26: error: invalid type argument of '->' (have 'int')
  TF_CIT_TMPL(npiv_fabric)->tfc_tpg_nacl_base_cit.ct_attrs = NULL;
                          ^
drivers/scsi/qla2xxx/tcm_qla2xxx.c:1890:26: error: invalid type argument of '->' (have 'int')
  TF_CIT_TMPL(npiv_fabric)->tfc_tpg_nacl_attrib_cit.ct_attrs = NULL;
                          ^
drivers/scsi/qla2xxx/tcm_qla2xxx.c:1891:26: error: invalid type argument of '->' (have 'int')
  TF_CIT_TMPL(npiv_fabric)->tfc_tpg_nacl_auth_cit.ct_attrs = NULL;
                          ^
drivers/scsi/qla2xxx/tcm_qla2xxx.c:1892:26: error: invalid type argument of '->' (have 'int')
  TF_CIT_TMPL(npiv_fabric)->tfc_tpg_nacl_param_cit.ct_attrs = NULL;

そもそもtransport_init_sessionの何が問題か?

Kernel 3.14までは、transport_init_sessionは引数なしでコールできる。

// http://lxr.free-electrons.com/source/drivers/target/target_core_transport.c?v=3.14より

struct se_session *transport_init_session(void)
{
        struct se_session *se_sess;

        se_sess = kmem_cache_zalloc(se_sess_cache, GFP_KERNEL);
        if (!se_sess) {
                pr_err("Unable to allocate struct se_session from"
                                " se_sess_cache\n");

Kernel 3.15で、引数を取るようになった。

// http://lxr.free-electrons.com/source/drivers/target/target_core_transport.c?v=3.15 より

struct se_session *transport_init_session(enum target_prot_op sup_prot_ops)
{
        struct se_session *se_sess;

        se_sess = kmem_cache_zalloc(se_sess_cache, GFP_KERNEL);
        if (!se_sess) {
                pr_err("Unable to allocate struct se_session from"
                                " se_sess_cache\n");

で、transport_init_sessionでgrepかけてみると、使い方が新旧入り交じっていることがわかる。 ちなみに、transport_init_sessionの本体は新しいほうで定義されているので、 新しいほうに合わせるのが筋なんだろうか・・・でもKernel 3.10ベースだよね・・・?

include/target/target_core_fabric.h
87:struct se_session *transport_init_session(enum target_prot_op);
90:struct se_session *transport_init_session_tags(unsigned int, unsigned int,

drivers/infiniband/ulp/srpt/ib_srpt.c
2596:   ch->sess = transport_init_session(TARGET_PROT_NORMAL);

drivers/scsi/qla2xxx/tcm_qla2xxx.c
1421:   se_sess = transport_init_session();

drivers/target/loopback/tcm_loop.c
979:    tl_nexus->se_sess = transport_init_session(TARGET_PROT_ALL);

drivers/target/sbp/sbp_target.c
213:    sess->se_sess = transport_init_session(TARGET_PROT_NORMAL);

drivers/target/target_core_transport.c
242:struct se_session *transport_init_session(enum target_prot_op sup_prot_ops)
262:EXPORT_SYMBOL(transport_init_session);
295:struct se_session *transport_init_session_tags(unsigned int tag_num,
302:    se_sess = transport_init_session(sup_prot_ops);
314:EXPORT_SYMBOL(transport_init_session_tags);

drivers/target/tcm_fc/tfc_sess.c
214:    sess->se_sess = transport_init_session_tags(TCM_FC_DEFAULT_TAGS,

drivers/target/iscsi/iscsi_target_login.c
346:    sess->se_sess = transport_init_session(TARGET_PROT_NORMAL);

drivers/usb/gadget/tcm_usb_gadget.c
1730:   tv_nexus->tvn_se_sess = transport_init_session();

drivers/vhost/scsi.c
1659:   tv_nexus->tvn_se_sess = transport_init_session();

configファイルのdiff

長いしコマンド引数の順番間違えた・・・

--- .config 2015-12-23 21:43:13.336000000 +0900
+++ config.orig 2015-12-23 21:42:08.274000000 +0900
@@ -1,6 +1,6 @@
 #
 # Automatically generated file; DO NOT EDIT.
-# Linux/x86 3.10.0 Kernel Configuration
+# Linux/x86_64 3.10.0 Kernel Configuration
 #
 CONFIG_64BIT=y
 CONFIG_X86_64=y
@@ -362,7 +362,7 @@
 CONFIG_X86_X2APIC=y
 CONFIG_X86_MPPARSE=y
 CONFIG_X86_EXTENDED_PLATFORM=y
-# CONFIG_X86_NUMACHIP is not set
+CONFIG_X86_NUMACHIP=y
 # CONFIG_X86_VSMP is not set 
 CONFIG_X86_UV=y
 CONFIG_X86_INTEL_LPSS=y
@@ -1299,6 +1299,7 @@
 CONFIG_BT_MRVL=m
 CONFIG_BT_MRVL_SDIO=m
 CONFIG_BT_ATH3K=m
+# CONFIG_BT_WILINK is not set
 # CONFIG_AF_RXRPC is not set 
 CONFIG_FIB_RULES=y
 CONFIG_WIRELESS=y
@@ -1332,7 +1333,11 @@
 CONFIG_RFKILL=m
 CONFIG_RFKILL_LEDS=y
 CONFIG_RFKILL_INPUT=y
-# CONFIG_NET_9P is not set
+# CONFIG_RFKILL_GPIO is not set
+CONFIG_NET_9P=m
+CONFIG_NET_9P_VIRTIO=m
+# CONFIG_NET_9P_RDMA is not set
+# CONFIG_NET_9P_DEBUG is not set
 # CONFIG_CAIF is not set 
 CONFIG_CEPH_LIB=m
 # CONFIG_CEPH_LIB_PRETTYDEBUG is not set 
@@ -1540,6 +1545,7 @@
 #
 # Texas Instruments shared transport line discipline
 #
+CONFIG_TI_ST=m
 CONFIG_SENSORS_LIS3_I2C=m
 
 #
@@ -1609,7 +1615,12 @@
 CONFIG_SCSI_3W_SAS=m
 # CONFIG_SCSI_ACARD is not set 
 CONFIG_SCSI_AACRAID=m
-# CONFIG_SCSI_AIC7XXX is not set
+CONFIG_SCSI_AIC7XXX=m
+CONFIG_AIC7XXX_CMDS_PER_DEVICE=32
+CONFIG_AIC7XXX_RESET_DELAY_MS=5000
+CONFIG_AIC7XXX_DEBUG_ENABLE=y
+CONFIG_AIC7XXX_DEBUG_MASK=0
+CONFIG_AIC7XXX_REG_PRETTY_PRINT=y
 # CONFIG_SCSI_AIC7XXX_OLD is not set 
 CONFIG_SCSI_AIC79XX=m
 CONFIG_AIC79XX_CMDS_PER_DEVICE=4
@@ -1638,7 +1649,7 @@
 CONFIG_SCSI_UFSHCD_PCI=m
 # CONFIG_SCSI_UFSHCD_PLATFORM is not set 
 CONFIG_SCSI_HPTIOP=m
-# CONFIG_SCSI_BUSLOGIC is not set
+CONFIG_SCSI_BUSLOGIC=m
 CONFIG_VMWARE_PVSCSI=m
 CONFIG_HYPERV_STORAGE=m
 CONFIG_LIBFC=m
@@ -1660,7 +1671,7 @@
 # CONFIG_SCSI_IPR is not set 
 # CONFIG_SCSI_QLOGIC_1280 is not set 
 CONFIG_SCSI_QLA_FC=m
-CONFIG_TCM_QLA2XXX=m
+# CONFIG_TCM_QLA2XXX is not set
 CONFIG_SCSI_QLA_ISCSI=m
 CONFIG_SCSI_LPFC=m
 # CONFIG_SCSI_LPFC_DEBUG_FS is not set
@@ -1896,7 +1907,9 @@
 # CONFIG_NET_DSA_MV88E6123_61_65 is not set
 CONFIG_ETHERNET=y
 CONFIG_MDIO=m
-# CONFIG_NET_VENDOR_3COM is not set
+CONFIG_NET_VENDOR_3COM=y
+CONFIG_VORTEX=m
+CONFIG_TYPHOON=m
 # CONFIG_NET_VENDOR_ADAPTEC is not set
 # CONFIG_NET_VENDOR_ALTEON is not set
 # CONFIG_NET_VENDOR_AMD is not set
@@ -1952,14 +1965,14 @@
 # CONFIG_NET_VENDOR_EXAR is not set
 # CONFIG_NET_VENDOR_HP is not set
 CONFIG_NET_VENDOR_INTEL=y
-# CONFIG_E100 is not set
+CONFIG_E100=m
 CONFIG_E1000=m
 CONFIG_E1000E=m
 CONFIG_IGB=m
 CONFIG_IGB_HWMON=y
 CONFIG_IGB_DCA=y
 CONFIG_IGBVF=m
-# CONFIG_IXGB is not set
+CONFIG_IXGB=m
 CONFIG_IXGBE=m
 CONFIG_IXGBE_HWMON=y
 CONFIG_IXGBE_DCA=y
@@ -1996,13 +2009,14 @@
 CONFIG_MYRI10GE_DCA=y
 # CONFIG_FEALNX is not set
 # CONFIG_NET_VENDOR_NATSEMI is not set
-# CONFIG_NET_VENDOR_NVIDIA is not set
+CONFIG_NET_VENDOR_NVIDIA=y
+CONFIG_FORCEDETH=m
 CONFIG_NET_VENDOR_OKI=y
 CONFIG_PCH_GBE=m
 CONFIG_ETHOC=m
 CONFIG_NET_PACKET_ENGINE=y
-# CONFIG_HAMACHI is not set
-# CONFIG_YELLOWFIN is not set
+CONFIG_HAMACHI=m
+CONFIG_YELLOWFIN=m
 CONFIG_NET_VENDOR_QLOGIC=y
 CONFIG_QLA3XXX=m
 CONFIG_QLCNIC=m
@@ -2038,7 +2052,9 @@
 # CONFIG_NET_VENDOR_TEHUTI is not set
 CONFIG_NET_VENDOR_TI=y
 CONFIG_TLAN=m
-# CONFIG_NET_VENDOR_VIA is not set
+CONFIG_NET_VENDOR_VIA=y
+# CONFIG_VIA_RHINE is not set
+CONFIG_VIA_VELOCITY=m
 # CONFIG_NET_VENDOR_WIZNET is not set
 # CONFIG_FDDI is not set
 # CONFIG_HIPPI is not set
@@ -2067,6 +2083,7 @@
 CONFIG_MICREL_PHY=m
 CONFIG_FIXED_PHY=y
 CONFIG_MDIO_BITBANG=m
+# CONFIG_MDIO_GPIO is not set
 # CONFIG_PLIP is not set
 CONFIG_PPP=m
 CONFIG_PPP_BSDCOMP=m
@@ -2439,8 +2456,11 @@
 # CONFIG_KEYBOARD_QT1070 is not set
 # CONFIG_KEYBOARD_QT2160 is not set
 # CONFIG_KEYBOARD_LKKBD is not set
+CONFIG_KEYBOARD_GPIO=m
+CONFIG_KEYBOARD_GPIO_POLLED=m
 # CONFIG_KEYBOARD_TCA6416 is not set
 # CONFIG_KEYBOARD_TCA8418 is not set
+# CONFIG_KEYBOARD_MATRIX is not set
 # CONFIG_KEYBOARD_LM8323 is not set
 # CONFIG_KEYBOARD_LM8333 is not set
 # CONFIG_KEYBOARD_MAX7359 is not set
@@ -2468,6 +2488,7 @@
 CONFIG_MOUSE_BCM5974=m
 CONFIG_MOUSE_CYAPA=m
 CONFIG_MOUSE_VSXXXAA=m
+# CONFIG_MOUSE_GPIO is not set
 CONFIG_MOUSE_SYNAPTICS_I2C=m
 CONFIG_MOUSE_SYNAPTICS_USB=m
 # CONFIG_INPUT_JOYSTICK is not set
@@ -2481,7 +2502,9 @@
 CONFIG_INPUT_TOUCHSCREEN=y
 # CONFIG_TOUCHSCREEN_AD7879 is not set
 # CONFIG_TOUCHSCREEN_ATMEL_MXT is not set
+# CONFIG_TOUCHSCREEN_AUO_PIXCIR is not set
 # CONFIG_TOUCHSCREEN_BU21013 is not set
+# CONFIG_TOUCHSCREEN_CY8CTMG110 is not set
 # CONFIG_TOUCHSCREEN_CYTTSP_CORE is not set
 # CONFIG_TOUCHSCREEN_DYNAPRO is not set
 # CONFIG_TOUCHSCREEN_HAMPSHIRE is not set
@@ -2518,6 +2541,8 @@
 # CONFIG_INPUT_MMA8450 is not set
 # CONFIG_INPUT_MPU3050 is not set
 CONFIG_INPUT_APANEL=m
+# CONFIG_INPUT_GP2A is not set
+# CONFIG_INPUT_GPIO_TILT_POLLED is not set
 CONFIG_INPUT_ATLAS_BTNS=m
 CONFIG_INPUT_ATI_REMOTE2=m
 CONFIG_INPUT_KEYSPAN_REMOTE=m
@@ -2527,6 +2552,7 @@
 CONFIG_INPUT_CM109=m
 CONFIG_INPUT_UINPUT=m
 # CONFIG_INPUT_PCF8574 is not set
+# CONFIG_INPUT_GPIO_ROTARY_ENCODER is not set
 # CONFIG_INPUT_ADXL34X is not set
 # CONFIG_INPUT_IMS_PCU is not set
 # CONFIG_INPUT_CMA3000 is not set
@@ -2660,6 +2686,7 @@
 CONFIG_TCG_NSC=m
 CONFIG_TCG_ATMEL=m
 CONFIG_TCG_INFINEON=m
+# CONFIG_TCG_TIS_I2C_ST33 is not set
 # CONFIG_TCG_XEN is not set
 CONFIG_TCG_CRB=m
 CONFIG_TELCLOCK=m
@@ -2669,7 +2696,14 @@
 CONFIG_I2C_BOARDINFO=y
 CONFIG_I2C_COMPAT=y
 CONFIG_I2C_CHARDEV=m
-# CONFIG_I2C_MUX is not set
+CONFIG_I2C_MUX=m
+
+#
+# Multiplexer I2C Chip support
+#
+CONFIG_I2C_MUX_GPIO=m
+CONFIG_I2C_MUX_PCA9541=m
+CONFIG_I2C_MUX_PCA954x=m
 CONFIG_I2C_HELPER_AUTO=y
 CONFIG_I2C_SMBUS=m
 CONFIG_I2C_ALGOBIT=m
@@ -2708,10 +2742,12 @@
 #
 # I2C system bus drivers (mostly embedded / system-on-chip)
 #
+# CONFIG_I2C_CBUS_GPIO is not set
 CONFIG_I2C_DESIGNWARE_CORE=m
 # CONFIG_I2C_DESIGNWARE_PCI is not set
 # CONFIG_I2C_EG20T is not set
+# CONFIG_I2C_GPIO is not set
 # CONFIG_I2C_INTEL_MID is not set
 # CONFIG_I2C_OCORES is not set
 CONFIG_I2C_PCA_PLATFORM=m
@@ -2770,7 +2806,57 @@
 CONFIG_PTP_1588_CLOCK_PCH=m
 CONFIG_ARCH_WANT_OPTIONAL_GPIOLIB=y
 CONFIG_GPIO_DEVRES=y
-# CONFIG_GPIOLIB is not set
+CONFIG_GPIOLIB=y
+CONFIG_GPIO_ACPI=y
+# CONFIG_DEBUG_GPIO is not set
+CONFIG_GPIO_SYSFS=y
+
+#
+# Memory mapped GPIO drivers:
+#
+# CONFIG_GPIO_GENERIC_PLATFORM is not set
+# CONFIG_GPIO_IT8761E is not set
+# CONFIG_GPIO_TS5500 is not set
+# CONFIG_GPIO_SCH is not set
+CONFIG_GPIO_ICH=m
+# CONFIG_GPIO_VX855 is not set
+# CONFIG_GPIO_LYNXPOINT is not set
+
+#
+# I2C GPIO expanders:
+#
+# CONFIG_GPIO_MAX7300 is not set
+# CONFIG_GPIO_MAX732X is not set
+# CONFIG_GPIO_PCA953X is not set
+# CONFIG_GPIO_PCF857X is not set
+# CONFIG_GPIO_ADP5588 is not set
+
+#
+# PCI GPIO expanders:
+#
+# CONFIG_GPIO_AMD8111 is not set
+# CONFIG_GPIO_LANGWELL is not set
+# CONFIG_GPIO_PCH is not set
+# CONFIG_GPIO_ML_IOH is not set
+# CONFIG_GPIO_RDC321X is not set
+
+#
+# SPI GPIO expanders:
+#
+# CONFIG_GPIO_MCP23S08 is not set
+
+#
+# AC97 GPIO expanders:
+#
+
+#
+# MODULbus GPIO expanders:
+#
+
+#
+# USB GPIO expanders:
+#
+# CONFIG_GPIO_VIPERBOARD is not set
 # CONFIG_W1 is not set
 CONFIG_POWER_SUPPLY=y
 # CONFIG_POWER_SUPPLY_DEBUG is not set
@@ -2785,6 +2871,7 @@
 # CONFIG_BATTERY_MAX17042 is not set
 # CONFIG_CHARGER_MAX8903 is not set
 # CONFIG_CHARGER_LP8727 is not set
+# CONFIG_CHARGER_GPIO is not set
 # CONFIG_CHARGER_BQ2415X is not set
 CONFIG_CHARGER_SMB347=m
 # CONFIG_BATTERY_GOLDFISH is not set
@@ -2831,6 +2918,7 @@

 CONFIG_SENSORS_G760A=m
 CONFIG_SENSORS_GL518SM=m
 CONFIG_SENSORS_GL520SM=m
+# CONFIG_SENSORS_GPIO_FAN is not set
 # CONFIG_SENSORS_HIH6130 is not set
 CONFIG_SENSORS_CORETEMP=m
 CONFIG_SENSORS_IBMAEM=m
@@ -2882,6 +2970,7 @@
 CONFIG_SENSORS_UCD9000=m
 CONFIG_SENSORS_UCD9200=m
 CONFIG_SENSORS_ZL6100=m
+# CONFIG_SENSORS_SHT15 is not set
 CONFIG_SENSORS_SHT21=m
 CONFIG_SENSORS_SIS5595=m
 # CONFIG_SENSORS_SMM665 is not set
@@ -3007,6 +3096,7 @@
 # CONFIG_SSB_DEBUG is not set
 CONFIG_SSB_DRIVER_PCICORE_POSSIBLE=y
 CONFIG_SSB_DRIVER_PCICORE=y
+# CONFIG_SSB_DRIVER_GPIO is not set
 CONFIG_BCMA_POSSIBLE=y

 #
@@ -3018,6 +3108,7 @@
 # CONFIG_BCMA_HOST_SOC is not set
 CONFIG_BCMA_DRIVER_PCI=y
 CONFIG_BCMA_DRIVER_GMAC_CMN=y
+# CONFIG_BCMA_DRIVER_GPIO is not set
 # CONFIG_BCMA_DEBUG is not set

 #
@@ -3034,18 +3125,23 @@
 CONFIG_MFD_VIPERBOARD=m
 # CONFIG_MFD_RETU is not set
 # CONFIG_MFD_PCF50633 is not set
+# CONFIG_UCB1400_CORE is not set
 # CONFIG_MFD_RDC321X is not set
 CONFIG_MFD_RTSX_PCI=m
 # CONFIG_MFD_SI476X_CORE is not set
 CONFIG_MFD_SM501=m
+# CONFIG_MFD_SM501_GPIO is not set
 # CONFIG_ABX500_CORE is not set
 # CONFIG_MFD_SYSCON is not set
 # CONFIG_MFD_TI_AM335X_TSCADC is not set
 # CONFIG_TPS6105X is not set
+# CONFIG_TPS65010 is not set
 # CONFIG_TPS6507X is not set
 # CONFIG_MFD_TPS65217 is not set
+# CONFIG_MFD_TPS65912 is not set
 # CONFIG_MFD_WL1273_CORE is not set
 # CONFIG_MFD_LM3533 is not set
+# CONFIG_MFD_TIMBERDALE is not set
 # CONFIG_MFD_TMIO is not set
 CONFIG_MFD_VX855=m
 # CONFIG_MFD_ARIZONA_I2C is not set
@@ -3699,7 +3795,7 @@
 # CONFIG_FB_UDL is not set
 # CONFIG_FB_GOLDFISH is not set
 # CONFIG_FB_VIRTUAL is not set
-# CONFIG_XEN_FBDEV_FRONTEND is not set
+CONFIG_XEN_FBDEV_FRONTEND=m
 # CONFIG_FB_METRONOME is not set
 # CONFIG_FB_MB862XX is not set
 # CONFIG_FB_BROADSHEET is not set
@@ -4251,7 +4347,9 @@
 #
 CONFIG_LEDS_LM3530=m
 # CONFIG_LEDS_LM3642 is not set
-# CONFIG_LEDS_PCA9532 is not set
+CONFIG_LEDS_PCA9532=m
+CONFIG_LEDS_PCA9532_GPIO=y
+CONFIG_LEDS_GPIO=m
 CONFIG_LEDS_LP3944=m
 CONFIG_LEDS_LP55XX_COMMON=m
 CONFIG_LEDS_LP5521=m
@@ -4262,7 +4360,9 @@
 # CONFIG_LEDS_PCA9633 is not set
 # CONFIG_LEDS_BD2802 is not set
 CONFIG_LEDS_INTEL_SS4200=m
+# CONFIG_LEDS_LT3593 is not set
 CONFIG_LEDS_DELL_NETBOOKS=m
+# CONFIG_LEDS_RENESAS_TPU is not set
 # CONFIG_LEDS_TCA6507 is not set
 # CONFIG_LEDS_LM355x is not set
 # CONFIG_LEDS_OT200 is not set
@@ -4277,6 +4377,7 @@
 CONFIG_LEDS_TRIGGER_HEARTBEAT=m
 CONFIG_LEDS_TRIGGER_BACKLIGHT=m
 # CONFIG_LEDS_TRIGGER_CPU is not set
+# CONFIG_LEDS_TRIGGER_GPIO is not set
 CONFIG_LEDS_TRIGGER_DEFAULT_ON=m

 #
@@ -4504,7 +4605,8 @@
 # CONFIG_RTS5139 is not set
 # CONFIG_TRANZPORT is not set
 # CONFIG_IDE_PHISON is not set
-# CONFIG_LINE6_USB is not set
+CONFIG_LINE6_USB=m
+CONFIG_LINE6_USB_IMPULSE_RESPONSE=y
 # CONFIG_USB_SERIAL_QUATECH2 is not set
 # CONFIG_VT6655 is not set
 # CONFIG_VT6656 is not set
@@ -4525,6 +4627,7 @@
 # Speakup console speech
 #
 # CONFIG_SPEAKUP is not set
+# CONFIG_TOUCHSCREEN_CLEARPAD_TM1217 is not set
 # CONFIG_TOUCHSCREEN_SYNAPTICS_I2C_RMI4 is not set
 # CONFIG_STAGING_MEDIA is not set

@@ -4684,8 +4787,17 @@
 CONFIG_JBD2=m
 # CONFIG_JBD2_DEBUG is not set
 CONFIG_FS_MBCACHE=m
-# CONFIG_REISERFS_FS is not set
-# CONFIG_JFS_FS is not set
+CONFIG_REISERFS_FS=m
+# CONFIG_REISERFS_CHECK is not set
+CONFIG_REISERFS_PROC_INFO=y
+CONFIG_REISERFS_FS_XATTR=y
+CONFIG_REISERFS_FS_POSIX_ACL=y
+CONFIG_REISERFS_FS_SECURITY=y
+CONFIG_JFS_FS=m
+# CONFIG_JFS_POSIX_ACL is not set
+# CONFIG_JFS_SECURITY is not set
+# CONFIG_JFS_DEBUG is not set
+# CONFIG_JFS_STATISTICS is not set
 CONFIG_XFS_FS=m
 CONFIG_XFS_QUOTA=y
 CONFIG_XFS_POSIX_ACL=y
@@ -4774,7 +4886,8 @@
 CONFIG_MISC_FILESYSTEMS=y
 # CONFIG_ADFS_FS is not set
 # CONFIG_AFFS_FS is not set
-# CONFIG_ECRYPT_FS is not set
+CONFIG_ECRYPT_FS=m
+# CONFIG_ECRYPT_FS_MESSAGING is not set
 # CONFIG_HFS_FS is not set
 # CONFIG_HFSPLUS_FS is not set
 # CONFIG_BEFS_FS is not set
@@ -4866,6 +4979,9 @@
 # CONFIG_NCP_FS is not set
 # CONFIG_CODA_FS is not set
 # CONFIG_AFS_FS is not set
+CONFIG_9P_FS=m
+# CONFIG_9P_FSCACHE is not set
+# CONFIG_9P_FS_POSIX_ACL is not set
 CONFIG_NLS=y
 CONFIG_NLS_DEFAULT="utf8"
 CONFIG_NLS_CODEPAGE_437=y
@@ -5117,7 +5233,7 @@
 CONFIG_SECURITYFS=y
 CONFIG_SECURITY_NETWORK=y
 CONFIG_SECURITY_NETWORK_XFRM=y
-# CONFIG_SECURITY_PATH is not set
+CONFIG_SECURITY_PATH=y
 CONFIG_SECURITY_SECURELEVEL=y
 CONFIG_INTEL_TXT=y
 CONFIG_LSM_MMAP_MIN_ADDR=65535
@@ -5130,7 +5246,12 @@
 CONFIG_SECURITY_SELINUX_CHECKREQPROT_VALUE=1
 # CONFIG_SECURITY_SELINUX_POLICYDB_VERSION_MAX is not set
 # CONFIG_SECURITY_SMACK is not set
-# CONFIG_SECURITY_TOMOYO is not set
+CONFIG_SECURITY_TOMOYO=y
+CONFIG_SECURITY_TOMOYO_MAX_ACCEPT_ENTRY=2048
+CONFIG_SECURITY_TOMOYO_MAX_AUDIT_LOG=1024
+# CONFIG_SECURITY_TOMOYO_OMIT_USERSPACE_LOADER is not set
+CONFIG_SECURITY_TOMOYO_POLICY_LOADER="/sbin/tomoyo-init"
+CONFIG_SECURITY_TOMOYO_ACTIVATION_TRIGGER="/usr/lib/systemd/systemd"
 # CONFIG_SECURITY_APPARMOR is not set
 # CONFIG_SECURITY_YAMA is not set
 CONFIG_INTEGRITY=y
@@ -5145,6 +5266,7 @@
 CONFIG_EVM=y
 CONFIG_EVM_HMAC_VERSION=2
 CONFIG_DEFAULT_SECURITY_SELINUX=y
+# CONFIG_DEFAULT_SECURITY_TOMOYO is not set
 # CONFIG_DEFAULT_SECURITY_DAC is not set
 CONFIG_DEFAULT_SECURITY="selinux"
 CONFIG_XOR_BLOCKS=m
@@ -5386,7 +5508,6 @@
 CONFIG_TEXTSEARCH_KMP=m
 CONFIG_TEXTSEARCH_BM=m
 CONFIG_TEXTSEARCH_FSM=m
-CONFIG_BTREE=y
 CONFIG_INTERVAL_TREE=y
 CONFIG_ASSOCIATIVE_ARRAY=y
 CONFIG_HAS_IOMEM=y

KVMメモ(2回目)

はじめに

rpmbuildでカーネルアップデートごっこするためにCentOSを入れたくなったので、 KVMに入れたときのメモ。

その昔にもKVMを単に使うということをしていたけれど、 結構かわっていたので再度メモ。

nbisco.hatenablog.com

環境

まずはこれを入れる

kvm本体とVNCクライアントのnovnc。 novncはブラウザから使える

$ sudo apt install kvm libvirt virtinst virt-viewer --install-recommends 
$ sudo apt install novnc --install-recommends

VMディスク作成

直接/dev/sdXとかを使ってもよいけども、 ディスク1個しかないし、ディスクプールもないので、 標準っぽいqcow2を使う。

$  qemu-img create -f qcow2 centos.img 10G

bridgeの作成

VMにも物理マシンと同じセグメントのIPを割り当てたいので、bridge接続できるようにしておく。

/etc/network% diff -ur interfaces.bk interfaces
--- interfaces.bk 2015-12-23 09:47:39.259176355 +0900
+++ interfaces    2015-12-23 09:54:19.371194634 +0900
@@ -1,3 +1,11 @@
 # interfaces(5) file used by ifup(8) and ifdown(8)
-auto lo
+auto lo br0 eth0
 iface lo inet loopback
+iface eth0 inet manual
+
+allow-hotplug eth0
+iface br0 inet dhcp
+bridge_ports eth0
+bridge_maxwait 0
+bridge_fd 0
+bridge_stp off

VMインストールサマリ

以下のシェルスクリプトを適宜変えて使う。

必要に応じて変えるのはこれ。

  • name:VMの名前
  • ram:VMに渡すメモリサイズ(MB)
  • vcpus:VMに渡すCPUの数
  • os-variant:特に指定しなくてもよかったかもしれないけど、CentOSなのでrhelにした。
  • disk:VM用ディスク。formatをきちんと指定しないと、VM上のOSがディスクサイズを認識できない。
  • cdrom:インストールにつかうISOファイル
#!/bin/bash

sudo virt-install \
    --connect qemu:///system \
    --name centos-kvm \
    --ram 2048 \
    --disk path=/path/to/centos.img,format=qcow2 \
    --graphics vnc,port=5900,keymap=ja,listen=0.0.0.0 \
    --network bridge=br0 \
    --cdrom /path/to/CentOS-7-x86_64-DVD-1511.iso \
    --vcpus 2 \
    --os-type linux \
    --os-variant rhel7 \
    --virt-type kvm \
    --boot cdrom \
    --hvm 

インストール後にしなきゃいけないこと

そのまま再起動すると、CDドライブに何も入っていないよ!みたいな感じでブートしないので、 VMのCDドライブ部分の設定をコメントアウトする (もしかすると、にするだけでもよかったかもしれない)。

$ sudo virsh
virsh# edit centos-kvm
(diffを取り忘れてしまったけど、cdromっぽいことが書いてある部分を根こそぎ消せばよい)

novncで画面を覗く

websockifyコマンドを叩いたあとで、FirefoxなどのブラウザでアクセスすればVNC画面が現れる。 ブラウザでできるなんていい時代になったものですね。

# 以下のコマンドをたたいたあと、localhost:9000/vnc.htmlにアクセスすると、VNC画面が現れる。
$ websocify -D --web=/usr/share/novnc/ 9000 localhost:5900