CentOS7でunboundのrpmを作る

いま借りてるCent7でunboundをyum installすると、1.4系が入ってくる。 これは脆弱性がある古いバージョンらしいので、1.5系が欲しい。 CentOS6ならば以下のFedoraのepelに1.5系のrpmがあったんだけど、CentOS7はなさそう。

http://dl.fedoraproject.org/pub/epel/6/x86_64/unbound-1.5.1-1.el6.x86_64.rpm

unboundの最新版が欲しくて、以下のサイトを参考にrpmを作ってみることにした。

heartbeats.jp

上記のURLとは対応バージョンが異なるので、バージョンの記載だけ変更する。

rpmbuildをすると以下のエラーが。

checking for libevent... configure: error: Cannot find the libevent library in /usr/local /opt/local /usr/lib /usr/pkg /usr/sfw /usr
You can restart ./configure --with-libevent=no to use a builtin alternative.
Please note that this alternative is not as capable as libevent when using
large outgoing port ranges.
エラー: /var/tmp/rpm-tmp.ud07R2 の不正な終了ステータス (%prep)

libeventは/usr/lib64にあったんだけど、そこをみてくれていないみたい。 rpmbuildの変数とかは大丈夫そうなんだけど。。。

[foxtrot@test src]$ rpmbuild --showrc | grep 64
〜
-14: _libdir    %{_prefix}/lib64
〜

configureをみてみると以下の記載が。。

  --with-libevent=pathname
                          use libevent (will check /usr/local /opt/local
                          /usr/lib /usr/pkg /usr/sfw /usr or you can specify
                          an explicit path). Slower, but allows use of large
                          outgoing port ranges.

pathnameをspecファイルに追加してあげればよいのかと、以下のように変更した

--with-libevent=/usr/lib64

けれどもいっこうにエラーは解消せず、同じメッセージばかり。pathの書き方をいろいろ変えてみたけど、同じだった。 仕方なく力技で/usr/lib配下にシンボリックリンクを作ってあげたら、通るようになった。

sudo ln -s /usr/lib64/libevent-2.0.so.5 /usr/lib/libevent

rpmファイルはできたけど、果たしてこれで動くのやら。

[root@test unbound-1.5.7]# ls /root/rpmbuild/RPMS/x86_64/unbound*
/root/rpmbuild/RPMS/x86_64/unbound-1.5.7-1.el7.centos.x86_64.rpm  /root/rpmbuild/RPMS/x86_64/unbound-debuginfo-1.5.7-1.el7.centos.x86_64.rpm

明日以降頑張ってみる。

conohaでfirewalld

conohaのNWの制御がよくわかっていない。。 コントロールパネルで制御するのか、iptablesなのか、firewalldなのか。 いくら、コントールパネルであけても、iptablesもfirewalldも変化がない。。。 もっと上のレイヤーなんだろう。

nginxを入れてみて、なんとなくわかったのは、firewalldで開けてあげないと接続できなかったこと。 以下はfirewalld を触ったときのメモ

# zoneの情報表示
[root@test foxtrot]# firewall-cmd --list-all
public (default, active)
  interfaces: eth0
  sources:
  services: dhcpv6-client http ssh
  ports:
  masquerade: no
  forward-ports:
  icmp-blocks:
  rich rules:
# サービスの表示
[root@test foxtrot]# firewall-cmd --list-service --zone=public
dhcpv6-client http ssh
# サービスの追加(一時的に)
[root@test foxtrot]# firewall-cmd --add-service=https --zone=public
success
[root@test foxtrot]#
[root@test foxtrot]# firewall-cmd --list-service --zone=public
dhcpv6-client http https ssh
# reload (reloadしたら一時的に追加したサービスは消える)
[root@test foxtrot]# firewall-cmd --reload
success
[root@test foxtrot]#
[root@test foxtrot]# firewall-cmd --list-service --zone=public
dhcpv6-client http ssh
# サービスの追加(こちらだとreloadしても消えない)
firewall-cmd --add-service=https --zone=public --permanent
#追加後は反映のためreloadが必要
firewall-cmd --reload 
# サービスを削除する場合
[root@test foxtrot]# firewall-cmd --list-service --zone=public
dhcpv6-client http https ssh
[root@test foxtrot]#
[root@test foxtrot]# firewall-cmd --remove-service=https --zone=public
success
[root@test foxtrot]#
[root@test foxtrot]#
[root@test foxtrot]# firewall-cmd --list-service --zone=public
dhcpv6-client http ssh
[root@test foxtrot]#
[root@test foxtrot]#
[root@test foxtrot]# firewall-cmd --reload
success
[root@test foxtrot]#
[root@test foxtrot]#
[root@test foxtrot]# firewall-cmd --list-service --zone=public
dhcpv6-client http https ssh
[root@test foxtrot]#
[root@test foxtrot]#
[root@test foxtrot]# firewall-cmd --remove-service=https --zone=public --permanent
success
[root@test foxtrot]#
[root@test foxtrot]#
[root@test foxtrot]# firewall-cmd --list-service --zone=public
dhcpv6-client http https ssh
[root@test foxtrot]#
[root@test foxtrot]#
[root@test foxtrot]# firewall-cmd --reload
success
[root@test foxtrot]#
[root@test foxtrot]#
[root@test foxtrot]# firewall-cmd --list-service --zone=public
dhcpv6-client http ssh

firewalldで追加すると、firewalldがiptablesを開けてくれる。(という認識なんだけど。。)

Chain IN_public_allow (1 references)
 pkts bytes target     prot opt in     out     source               destination
    0     0 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            tcp dpt:80 ctstate NEW
    0     0 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            tcp dpt:22 ctstate NEW
    0     0 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            tcp dpt:443 ctstate NEW

systemctlも勉強しないと。。

sedのお勉強2 特定文字列に一致した次の行を操作するスクリプト

前回の内容を応用して、特定文字列に一致した次の行を操作するスクリプトを書いてみる。

昨日と同じくこんなテストファイ

[root@testsv sedtest]# cat sedtest.txt
1111
2222
3333
4444
5555
6666
7777
8888
9999
0000

nを使って2222の行の次の行が3333ならば表示する。

[root@testsv sedtest]# sed -n '/2222/{n;/3333/p}' sedtest.txt
3333

逆に2222の行の次の行が3333ならば削除する。

[root@testsv sedtest]# sed  '/2222/{n;/3333/d}' sedtest.txt
1111
2222
4444
5555
6666
7777
8888
9999
0000

2222の行の次の行が3333ならば削除する&&削除した次の行が4444ならば「tikan」という文字列に置換する。

[root@testsv sedtest]# sed -e '/2222/{n;/3333/d}' -e 's/4444/tikan/' sedtest.txt
1111
2222
tikan
5555
6666
7777
8888
9999
0000

2222の行の次の行が3333ならば、「tikan」という文字列に置換する。

[root@testsv sedtest]# sed -e '/2222/{n;s/3333/tikan/}' sedtest.txt
1111
2222
tikan
4444
5555
6666
7777
8888
9999
0000

{}の中は;で区切ってどんどん繋ぐことができる。

[root@testsv sedtest]# sed -e '/2222/{n;s/3333/tikan/;n;s/4444/tikan2/}' sedtest.txt
1111
2222
tikan
tikan2
5555
6666
7777
8888
9999
0000

次はホールドスペースのお勉強かな〜。

sedのお勉強1

sedは奥が深いデスネ。。いっつもsed&awk特集でsedはちょこっとawkどっさりなイメージがあるけれど、あらためてsedを見てみた。

sedはtextを1行ずつ読み込んで処理する。読み込んだ1行を保持するのがパターンスペースで、明示的に保持しておくためのバッファにホールドスペースがある。

ストファイルはこんなファイル

1111
2222
3333
4444
5555
6666
7777
8888
9999
0000

-n は明示的にprintをしない限り、出力しない。

パターンスペースの内容を吐き出し次の行へ。ふと思ったけど、nextのnなのかな?
nありの場合
[root@testsv sedtest]$ sed -n '/3333/p' ./sedtest.txt
3333
nなしの場合
3333を読み込んだ時に一致するので、出力している。
[root@testsv sedtest]# sed '/3333/p' ./sedtest.txt
1111
2222
3333
3333
4444
5555
6666
7777
8888
9999
0000

{}はコマンドブロック。まとめて実行してくれる。

{}なしの場合
[root@testsv sedtest]$ sed -n '/3333/n;p' ./sedtest.txt
1111
2222
4444
5555
6666
7777
8888
9999
0000
{}ありの場合
3333の次の行がパターンスペースに追加されて出力された。
[root@testsv sedtest]$ sed -n '/3333/{n;p}' ./sedtest.txt
4444

ホールドスペース

3333から5555までをホールドスペースに保持し、末尾に追加する。
改行が入っているのはsedの仕様かな?
[root@testsv sedtest]# sed '/3333/,/5555/H;$G' ./sedtest.txt
1111
2222
3333
4444
5555
6666
7777
8888
9999
0000

3333
4444
5555

まだよくわかってないので、もうちょっと勉強しないと。。

conohaを申し込んでみた

vpsサーバが欲しいなぁと思って探していて、sakuraとconohaが候補にあがったけど、1000円クーポンがもらえるらしいので、conohaを申し込んだ。 どちらも900円だったけど、1000円クーポンがあれば1ヶ月お試しってことだしね。

yahooとかでconohaで検索したら広告で ここから申し込めば1000円クーポン!の表示がある。申し込み自体はすんなりでけた。

(以下はお友達紹介のリンク。ここから申し込んで頂くと私が得します。)

ConoHa - スマート&パワフルなクラウドの新提案。ひと月900円から。


申し込みからsshへの設定は以下のまとめがわかりやすいと思う。

ConohaにVPSを設置して、SSHログイン、ポート番号変更、rootログイン禁止までを30分で! - Qiita

ネームタグはコントロールパネルに表示されるサーバー名みたいなのにも使われていたので、デフォルトのままOKしちゃったら、後でショックを受けた。 webサーバとかつけたかったのにみたいな。。。

私はsshの設定の前に、申し込み時に選択できた「接続許可ポート」が気になりすぎて、、、コントロールパネルからも操作できたんだけど、、 とりあえず、全部開けるのは嫌なので、「ssh」と「web」だけにした。

f:id:foxtrot0304:20151129022629p:plain

それでOSインストール後、sshでログイン&iptablesを叩くと22番ポートしか空いていないようにみえる。 (どうでもよいけど、OSインストール中に一回エラーメッセージが出た。どうしようかとまごまごしてたら、勝手にインストールが終わったので、良しとしてる。)

[root@server ~]# /sbin/iptables -L IN_public_allow -n -v
Chain IN_public_allow (1 references)
 pkts bytes target     prot opt in     out     source               destination
    5   308 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            tcp dpt:22 ctstate NEW
[root@server ~]#
[root@server ~]#
[root@server ~]# /sbin/iptables -L -n -v | grep -e 80 -e 443
[root@server ~]#

なんでだろうなぁーと考えていると、そもそもCentOS7なので、iptablesじゃなくてFirewalldではと思いつき、ググりながらwebのポートが空いているか確認する。

[root@server ~]# firewall-cmd --state
running
[root@server ~]# firewall-cmd --list-all
public (default, active)
  interfaces: eth0
  sources:
  services: dhcpv6-client ssh
  ports:
  masquerade: no
  forward-ports:
  icmp-blocks:
  rich rules:
[root@server ~]# ls -l /etc/firewalld/zones/
合計 4
-rw-r--r--. 1 root root 315  4月 14  2015 public.xml
[root@server ~]#

なんかよくわからなかったけど、webのポートは空いていないような気がスル。。
もしかしてサービスを起動しないとfirewalldも対応してくれないとか。
早々とつまづいてしまって、なぜ気軽にCentOS7とか入れたんだろうとちょっと後悔。
firewalldを無効化してiptablesを有効にする方法もありそうだけど、そこはこらえてCentOS7を勉強します。。

複合キーのauto increment実験

前回に引き続き、mysqlのauto incrementをさわってみる。 今回は複合キーのauto incrementについて。 複合キーは複数のカラムで1つのキーとみなす。つまり同じカラムでは重複を許すけれども、複数のカラムを合わせてみると他のレコードと重複していないようなキー。 それにauto incrementをつけてみる。

まずcreate table。MyISAMのみ許される。InnoDBの場合は怒られる。

mysql> create table test ( id1 int(2) , id2 int(3) auto_increment , primary key (id1,id2) ) engine=MyISAM;
Query OK, 0 rows affected (0.11 sec)

mysql>
mysql>
mysql> create table test2 ( id1 int(2) , id2 int(3) auto_increment , primary key (id1,id2) ) engine=InnoDB;
ERROR 1075 (42000): Incorrect table definition; there can be only one auto column and it must be defined as a key

こんな状態のときにinsertするといい感じでauto incrementしてくれる。

mysql> select * from test;
+-----+-----+
| id1 | id2 |
+-----+-----+
|   1 |   1 |
|   1 |   3 |
+-----+-----+
2 rows in set (0.00 sec)

mysql> insert into test(id1) values (1);
Query OK, 1 row affected (0.00 sec)

mysql>
mysql> select * from test;
+-----+-----+
| id1 | id2 |
+-----+-----+
|   1 |   1 |
|   1 |   3 |
|   1 |   4 |
+-----+-----+
3 rows in set (0.00 sec)

追加でid1に別の数字を入れた場合もいい感じにしてくれる。

ysql> insert into test(id1) values (2);
Query OK, 1 row affected (0.00 sec)

mysql>
mysql> select * from test;
+-----+-----+
| id1 | id2 |
+-----+-----+
|   1 |   1 |
|   1 |   3 |
|   1 |   4 |
|   2 |   1 |
+-----+-----+
4 rows in set (0.00 sec)

このときのauto_incrementの次の値をみてみると1のまま。毎回計算していれてくれているのかな?

mysql> select auto_increment from information_schema.tables where table_name='test';
+----------------+
| auto_increment |
+----------------+
|              1 |
+----------------+
1 row in set (0.00 sec)

なおid1を指定せずにid2だけ指定してinsertした場合、id1にはdefaultの0がinsertされた

mysql> insert into test(id2) values (1);
Query OK, 1 row affected (0.00 sec)

mysql> select * from test;
+-----+-----+
| id1 | id2 |
+-----+-----+
|   0 |   1 |
|   1 |   1 |
|   1 |   3 |
|   1 |   4 |
|   1 |   5 |
|   2 |   1 |
+-----+-----+
6 rows in set (0.00 sec)

mysql> show create table `test`;
+-------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table                                                                                                                                                        |
+-------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| test  | CREATE TABLE `test` (
  `id1` int(2) NOT NULL DEFAULT '0',
  `id2` int(3) NOT NULL AUTO_INCREMENT,
  PRIMARY KEY (`id1`,`id2`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 |
+-------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

調子にのって再度id2だけ指定してinsertしてみると、怒られる。当たり前だけど、こちらはauto incrementしてくれない。

mysql> insert into test(id2) values (1);
ERROR 1062 (23000): Duplicate entry '0-1' for key 'PRIMARY'

mysqlのauto incrementを調べてみる

auto incrementは勝手に連番を振ってくれる機能。 これがあれば、採番テーブルはいらない?

作成するためには、create tableするときにauto incrementをつけてあげればOK。

mysql> create table test (
    -> id int(2) NULL auto_increment,
    -> name varchar(20),
    -> primary key (id)
    -> );

あとはinsertするたびに増えていく。

mysql> insert into test(name) values ('test1');
Query OK, 1 row affected (0.09 sec)

mysql>
mysql> select * from test;
+----+-------+
| id | name  |
+----+-------+
|  1 | test1 |
+----+-------+
1 row in set (0.00 sec)

mysql>
mysql> insert into test(name) values ('test2');
Query OK, 1 row affected (0.10 sec)

mysql>
mysql> select * from test;
+----+-------+
| id | name  |
+----+-------+
|  1 | test1 |
|  2 | test2 |
+----+-------+
2 rows in set (0.00 sec)

auto incrementの次の値はinformation_schemaでみることができる。

mysql> show columns from information_schema.tables;
+-----------------+---------------------+------+-----+---------+-------+
| Field           | Type                | Null | Key | Default | Extra |
+-----------------+---------------------+------+-----+---------+-------+
| TABLE_CATALOG   | varchar(512)        | NO   |     |         |       |
| TABLE_SCHEMA    | varchar(64)         | NO   |     |         |       |
| TABLE_NAME      | varchar(64)         | NO   |     |         |       |
| TABLE_TYPE      | varchar(64)         | NO   |     |         |       |
| ENGINE          | varchar(64)         | YES  |     | NULL    |       |
| VERSION         | bigint(21) unsigned | YES  |     | NULL    |       |
| ROW_FORMAT      | varchar(10)         | YES  |     | NULL    |       |
| TABLE_ROWS      | bigint(21) unsigned | YES  |     | NULL    |       |
| AVG_ROW_LENGTH  | bigint(21) unsigned | YES  |     | NULL    |       |
| DATA_LENGTH     | bigint(21) unsigned | YES  |     | NULL    |       |
| MAX_DATA_LENGTH | bigint(21) unsigned | YES  |     | NULL    |       |
| INDEX_LENGTH    | bigint(21) unsigned | YES  |     | NULL    |       |
| DATA_FREE       | bigint(21) unsigned | YES  |     | NULL    |       |
| AUTO_INCREMENT  | bigint(21) unsigned | YES  |     | NULL    |       | ★
| CREATE_TIME     | datetime            | YES  |     | NULL    |       |
| UPDATE_TIME     | datetime            | YES  |     | NULL    |       |
| CHECK_TIME      | datetime            | YES  |     | NULL    |       |
| TABLE_COLLATION | varchar(32)         | YES  |     | NULL    |       |
| CHECKSUM        | bigint(21) unsigned | YES  |     | NULL    |       |
| CREATE_OPTIONS  | varchar(255)        | YES  |     | NULL    |       |
| TABLE_COMMENT   | varchar(2048)       | NO   |     |         |       |
+-----------------+---------------------+------+-----+---------+-------+
21 rows in set (0.00 sec)

mysql> select AUTO_INCREMENT from information_schema.tables where table_name='test';
+----------------+
| AUTO_INCREMENT |
+----------------+
|              3 |
+----------------+
1 row in set (0.00 sec)

alterコマンドでauto incrementの次の値を変更可能

mysql> ALTER TABLE test AUTO_INCREMENT=10;
Query OK, 0 rows affected (0.14 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql>
mysql>
mysql> select AUTO_INCREMENT from information_schema.tables where table_name='test';
+----------------+
| AUTO_INCREMENT |
+----------------+
|             10 |
+----------------+
1 row in set (0.00 sec)

mysql> select * from test;
+----+-------+
| id | name  |
+----+-------+
|  1 | test1 |
|  2 | test2 |
+----+-------+
2 rows in set (0.00 sec)

mysql>
mysql> insert into test(name) values ('test3');
Query OK, 1 row affected (0.10 sec)

mysql>
mysql> select * from test;
+----+-------+
| id | name  |
+----+-------+
|  1 | test1 |
|  2 | test2 |
| 10 | test3 |
+----+-------+
3 rows in set (0.00 sec)

auto incrementの値におかしな設定は入れることができない。

mysql> ALTER TABLE test AUTO_INCREMENT=1;
Query OK, 0 rows affected (0.10 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql>
mysql>
mysql> select AUTO_INCREMENT from information_schema.tables where table_name='test';
+----------------+
| AUTO_INCREMENT |
+----------------+
|             11 |
+----------------+
1 row in set (0.00 sec)

mysql>
mysql>
mysql> insert into test(name) values ('test4');
Query OK, 1 row affected (0.13 sec)

mysql> select * from test;
+----+-------+
| id | name  |
+----+-------+
|  1 | test1 |
|  2 | test2 |
| 10 | test3 |
| 11 | test4 |
+----+-------+
4 rows in set (0.00 sec)

mysql>
mysql> ALTER TABLE test AUTO_INCREMENT=5;
Query OK, 0 rows affected (0.11 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> select AUTO_INCREMENT from information_schema.tables where table_name='test';
+----------------+
| AUTO_INCREMENT |
+----------------+
|             12 |
+----------------+
1 row in set (0.00 sec)

mysql> insert into test(name) values ('test5');
Query OK, 1 row affected (0.09 sec)

mysql>
mysql> select * from test;
+----+-------+
| id | name  |
+----+-------+
|  1 | test1 |
|  2 | test2 |
| 10 | test3 |
| 11 | test4 |
| 12 | test5 |
+----+-------+
5 rows in set (0.00 sec)