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を作ってみることにした。
上記の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」だけにした。
それで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)