rsyncでssh使えるの知らなかった

Dr. Bonoの生命科学データ解析を読み返していたら

rsyncって-eオプションでsshに切り替えられるんじゃん!

と気づいて、ちょっと遅くなりかけてた本番環境のデータを開発環境にリモートコピーするっていうscpの作業をrsyncに切り替えたおかけで差分更新できるようになって超早くなって仕事の効率が上がって嬉しい。

ProductName Dr. Bonoの生命科学データ解析
坊農秀雅
メディカルサイエンスインターナショナル / 3240円 ( 2017-09-29 )


あとついでに職場のubuntu(16.04)調べたらrsh入ってた。デフォルトで入るのかな?

Fastladder入れてる仮想環境のHDDの容量が足りなくなったので拡張した

もともと10GのHDDで仮想環境(KVM)作ったけど溢れてしまったので拡張した。

ほぼまるごと「KVMでVMにHDD追加」を参考にした

あとは色々調べるのはvgscan, lvscan, pvscanとscan系のコマンドを使えばいい。最近(4,5年前)のFedoraはデフォルトがLVMなので容量追加とか簡単で助かる。

ホストのサーバーを起動したらゲストの仮想マシンが自動起動してそれに乗っかっているサービスも起動するようにする

最近はホストのサーバーに仮想マシン(KVM)を複数たてて、それぞれnginx+supervisord+gunirocrn+Flaskとかnginx+unicorn+RoRみたいなウェブアプリを動かすパターンが多い。というかそれが全部。

面倒くさいのだけど、(自動化するための手間をかけるほうがよりめんどくさかったので)サービスの起動まで手でやっていたのだが、ちょっと同僚に立ち上げをお願いしなきゃいけなくなって、作業手順を繰り返してもらうのもなんか悪いなーと思ったのでサーバー立ち上げればウェブアプリが動くところまで自動で進むようにすることにした。

まぁ、今更感満載だけどね…(僕はインフラエンジニアじゃないのでそっち方面詳しくないのでそういうところまでやろうとするとコストが半端無いからなぁ)と想いつつもで今どきのウェブアプリ書く人は基本として知らなあかんのかなぁとも思うとしんどいですね。

手順としては

  1. ホストサーバー起動
  2. ifupでブリッジとイーサをアクティブにする
  3. GUIのVMマネージャで仮想マシンを立ち上げ
  4. それぞれの仮想マシンにsshで入ってサービス立ち上げ(supervisordとかを起動)

なんだけど、書き出してみるとやっぱり面倒臭い。よく手動で起動していたもんだw

2. ifupでブリッジとイーサをアクティブにする

onboot=yesをつけておく。以前試したんだけど何故かうまくいかなくて放置してたけど、これを見ながらきちんと設定したら動いた。

chkconfig NetworkManager off
chkconfig network on
service NetworkManager stop
service network start

このあたりかな。あとfedora19だとこのあたりをいじるとsystemctlとcheckconfigが混在しててややこしい

3. GUIのVMマネージャで仮想マシンを立ち上げ

GUIのアプリを使って仮想マシンを起動してたんだけど、virsh便利。

sudo virsh autostart [vm_name]

で自動起動できるので、最初からそうしておけばよかった。すでにGUIは使っていない。

4. それぞれの仮想マシンにsshで入ってサービス立ち上げ(supervisordとかを起動)

unicorn+RoRな構成のよくあるRailsアプリだとRedmineをCentOS 7上で動かすーUnicornとNginx編を参考にsystemd用の定義ファイルを用意すればよいです。

supervisord+gunirocrn+Flaskが目下悩み中なのだけど/etc/init.dに書く方法しか見つからなかった。どうせだったらsystemctlコマンドで制御したいので引き続き調べる。

Fedora17で仮想化

ヒトと技術が減少していて、サーバーメンテにコストをかけられなくなってきているので、実機のトラブル時の移行コストがかかりすぎて「移行しないでいいかー」という投げやりな事案が多く発生するようになり、資産がもったいないので自分の管理サーバーは仮想化環境でなんとかすることにした。

本見ながらやったけど、色々試してたらネットワークが繋がらなくなってどうしようもなくなったのでホストを再インストールしたという。

ProductName KVM徹底入門 Linuxカーネル仮想化基盤構築ガイド
平 初
翔泳社 / 3444円 ( 2010-07-08 )


ホストのインストールとか詳しくやらんでいいから、もっとネットワーク周りを充実させて欲しいなぁと思った。 私のニーズはサーバー群を集約して、複数のwebサーバーを一台で管理したいというニーズだったんだが、そこら辺の記述が妙に少ないなぁと。

ブリッジを使ったネットワーク環境の構築

まずはホストの設定、動くのを確認したらゲストをゆっくり設定すると問題の切り分けが簡単。

  1. ホストだけでネットワークの設定をして外部につながることを確認。
  2. /etc/sysconfig/network-scripts/のifcfg-em1をコピーしてブリッジの設定をしたらネットワークを再起動してつながることを確認。プロミスキャスモードの必要はない。

ネットワークマネージャの管理下ではなくなるのでFedora17の場合は画面右上のネットワークアイコンに☓がつくがつながることを確認すればOK

  1. ゲストOSをインストールするときにハードウェアのアドバンス設定にブリッジが出るので、本のようにドメイン設定をvirshで行わなくてもOK

その他トラブルシューティング

libvirtdの軌道はsystemctl

systemctl start libvirtd.service

sshの設定は

yum install openssh-server

つながらない場合はFireWallを疑う。GUIの設定が正しいように見えても再度sshのチェックを付け直すと上手くいったりする。

というわけで、virshの便利さに驚いた6月後半であった。

Linuxネットワークプログラミングバイブルを買った

UNIXネットワークプログラミング入門ルーター自作でわかるパケットの流れを読んで、pollとかepollとかlibeventの使い方を覚えたいなぁと思ったらLinuxネットワークプログラミングバイブルってのを見つけた。

というか、ルーター自作でわかるパケットの流れの著者とソケットプログラミングを調べていたときに見つけたブログの著者の共著だったので、即買いした。

ProductName Linuxネットワークプログラミングバイブル
小俣 光之
秀和システム / 3990円 ( 2011-01 )


小さいけどきちんと動くコードがたくさん載ってて、プログラムはコードで語れという匂いが感じられるのは個人的にはありがたい。8章まで読んだけどわかりやすくて良かった。特に5章の多重化の章はボリュームがあってselect,poll,epollにマルチプロセス、マルチスレッド、ノンブロッキングI/Oのコードが一通り揃っていて知りたいことは全部入ってた。

まだ流し読みしただけで写経はしてないが、Cのネットワークプログラミングはここまでおさえておけば自分的には満足だなぁという感じなので、いい本ゲットしたなぁと思った。

プログラムからデータリンク層を扱う

Unixネットワークプログラミング入門でTCPとUDPをあつかったので、その勢いでデータリンク層をあつかってみます。

ProductName ルーター自作でわかるパケットの流れ
小俣 光之
技術評論社 / 1974円 ( 2011-07-09 )


2章は基本。

TCP,UDPと同じようにsocketを使えばいい

soc = socket(PF_PACKET,SOCK_RAW,htons(ETH_P_IP)))

ちなみにTCPの場合はこんな感じ

soc = socket(AF_INET, SOCK_STREAM, 0))

続いてbind

sa.sll_family=PF_PACKET;
sa.sll_protocol=htons(ETH_P_IP);
sa.sll_ifindex = ifreq.ifr_ifindex;
bind(soc,(struct sockaddr *)&sa, sizeof(sa))

と、socをインターフェースに関連付ける

TCPの場合もbindでアドレスとポートに結びつける

me.sin_family = AF_INET;
me.sin_addr.s_addr = htonl(INADDR_ANY);
me.sin_port = htons(port);
bind(soc_waiting, (struct sockaddr *)&me, sizeof(me))

まだ2章までしか読んでいないが、3章でパケットキャプチャ、4章でブリッジ、5章でルータを書いていくという流れになっていて、楽しみ。

ちなみに初心者向けではなくて、著者の暗黙の前提のあたりは説明がさくっと省かれている。 Unixネットワークプログラミング入門を読んでなかったら速攻挫折してたと思う。

ちなみにサンプルコードはmacでは動かない。

UNIXネットワークプログラミング入門

Nodeを触っているのは楽しいんだけど、じゃぁなんか作りたいものがあるのかと言われたらイマイチ思い浮かばない。リアルタイムウェブ〜とか言っておいて(言ってないけど)アイデアが浮かばないってのはまずかろうとソケットプログラミングの本を読んでみることにした。

ソケットプログラミングを覚えるにはいい本だった。サンプルはCで書いてあるんだけど、システムコールとかの低レベルのモジュールはPerlもPythonもほとんど一緒なので、動きがイメージできるようになって良い感じ。本を読み終えたついでにSocketServerのソースコード読んでみたけど、理解度がさらにあがった。

ProductName UNIXネットワークプログラミング入門
雪田 修一
技術評論社 / ?円 ( 2003-06-05 )


本の内容は、

  1. 一対一通信
  2. 一対一非同期通信
  3. 一対多通信
  4. 一対多非同期通信

非同期はselect使っています。8章でデーモンの入門の章だったんだけど、なんでforkを二回するのかわかりやすい説明ではなかったので、ここを読むといいですね。

3章のチャットっぽいものをPythonとPerlで書いてみた

server

import socket

host = socket.gethostbyname('localhost')
port = 50000

soc_waiting = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
soc_waiting.bind((host, port))
soc_waiting.listen(1)
print "server running at %d\n" % port

(soc, client_addr) = soc_waiting.accept()
soc_waiting.close()

print "Go ahead!"

msg = ""

while True:
    msg = raw_input()
    soc.send(msg)
    msg = soc.recv(512)
    print msg
    if msg == "quit":
        break

soc.close()

Client (Python)

import socket

host = socket.gethostbyname('localhost')
port = 50000

soc = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
soc.connect((host,port))

print "Wait\n"

while True:
    msg = soc.recv(512)
    print msg
    msg = raw_input()
    soc.send(msg)
    if msg == "quit":
        break

soc.close()

Client (Perl)

#!/usr/bin/env perl

use IO::Socket;

$soc = new IO::Socket::INET("localhost:50000");

die "IO::Socket : $!" unless $soc;

print "Wait\n";

my $msg;

while (1) {
  $soc->recv($msg, 512);
  print $msg,"\n";
  $msg = <STDIN>;
  chomp($msg);
  $soc->send($msg,512);
  last if $msg eq "quit";
}

close($soc);

Unixネットワークプログラミング欲しいなぁ

ProductName UNIXネットワークプログラミング〈Vol.1〉ネットワークAPI:ソケットとXTI
W.リチャード スティーヴンス
ピアソンエデュケーション / 8400円 ( 1999-07 )


おまけ(なんか考えた)

今度静岡でおまちバルがあるように、静岡はバルブーム、バルバブル、バブルボブル。で、バルイベントにはハッシュタグとtwitterでつぶやいて盛り上がろう的な今時なソーシャルな仕掛けも一緒についてくるんだけど、これがまじでつまらない。

ハッシュタグが漢字混じりのひらがなとかあり得ないでしょう。そもそも酒飲むイベントで打たせるか?と。全員がiPhoneに向かってカチャカチャやってるIT系のオフじゃないんだから。あと、飲んでる時にハッシュタグでtweetおいかけるのもめんどくさい。結局送りっぱなしになっちゃうので、だれかがまとめたのを読み返すくらいで、全然リアルタイムじゃないね。

というわけで、バルのtweetシステムに不満があったのでソーシャルでスマホ持ちの我々が使って楽しいシステムを考えてみた。

バルラーにちまちまと端末を打たせないように店の入口に「店なうだらー、ハッシュタグ、ジオコード」が入ったQRコードを貼っとく。これで、カメラで撮るだけでtweetできるようになるので酒が良い感じに入っていてもOK。パンフにつけておいてもいいかも。そっちは宣伝で、人気度調査用にしてもいいかもしれん。

で、サーバー側をリアルタイムウェブで、twitterのストリーム読みながらマップ上にマッピングさせていくと。ジオコードの頻度で明るくするとかでもいいしね。そうすればリアルタイムで楽しい。ユーザーの動向を線でつないでも面白いかも(どういう順番で店をまわってんのかとか)。主催者側にもそういうデータが集まればいろいろ役に立つでしょう。

そういうシステムをNode.jsでつくったら楽しいだろうなぁと思った。

ネットワーク関連の本を読んでみることにした

最近ちょっとヤル気がおきないので、別のことでもしようとネットワーク関連の本でも読んでみることにした。

ProductName UNIXネットワークプログラミング入門
雪田 修一
技術評論社 / ?円 ( 2003-06-05 )


ProductName ルーター自作でわかるパケットの流れ
小俣 光之
技術評論社 / 1974円 ( 2011-07-09 )


そういえばRWHにもSocket通信の章があったので後で読みなおしてみるか。

ProductName Real World Haskell
Bryan O'Sullivan
Oreilly & Associates Inc / 4058円 ( 2008-12-05 )


「はじめて読む486」を読んでいる

Linuxカーネル2.6解読室の流れで読み始めた。

ProductName はじめて読む486―32ビットコンピュータをやさしく語る
蒲地 輝尚
アスキー / 2548円 ( 1994-09 )


Linuxも色々勉強しておかないといけない。

ProductName Linuxカーネル2.6解読室
高橋浩和
ソフトバンククリエイティブ / 5670円 ( 2006-11-18 )


そしてこれはまだ読んでいない、積んである。

「Linuxカーネル Hacks」予約した

そういう風が吹いているということで

  • 1章 カーネル入門
  • 2章 リソース管理
  • 3章 ファイルシステム
  • 4章 ネットワーク
  • 5章 仮想化
  • 6章 省電力
  • 7章 デバッグ
  • 8章 プロファイリング、トレース