2013-03-16
■[ntp][linux] 複数NTPサーバを指定するときに優先度をつける

複数のNTPサーバをタイムサーバとして指定するときに、設計上、優先したいサーバをプライマリ設定したい場合があるかも知れない。
ケースとしてはレアだけど、たとえば、NTPサーバの時刻精度やサーバ性能が、サーバ間で明らかに違うことが分かっているときとか。
そんなときにちょっとだけはまったのでメモ。
OKパターン
ntp.conf
最優先するサーバに"prefer"属性を付与するとOK。
/etc/ntp.confは以下。
# -- NTP Servers server 10.0.0.1 prefer # gps#1 server 10.0.0.2 # gps#2 server 10.0.0.3 # tell#1 server 10.0.0.4 # tell#2
確認
ntpdをリスタート後、ntpqで確認。直後と、10分程度経過後の結果。
[root@login-server ~]# ntpq -p remote refid st t when poll reach delay offset jitter ============================================================================== 10.0.0.1 .GPS. 1 u 3 64 1 1.663 5.124 0.000 10.0.0.2 .GPS. 1 u 2 64 1 0.860 4.307 0.000 10.0.0.3 .TJJY. 1 u 1 64 1 0.919 4.430 0.000 10.0.0.4 .TJJY. 1 u - 64 1 0.882 3.224 0.000 [root@login-server ~]# ntpq -p remote refid st t when poll reach delay offset jitter ============================================================================== *10.0.0.1 .GPS. 1 u 60 64 17 1.456 5.577 1.212 +10.0.0.2 .GPS. 1 u 64 64 17 1.052 5.599 1.472 +10.0.0.3 .TJJY. 1 u 61 64 17 0.919 4.430 1.174 10.0.0.4 .TJJY. 1 u 59 64 17 0.882 3.224 1.572
NGパターン
ntp.conf
stratumをstaticに設定して、任意のNTPサーバの優先度を上げようとしたがNGだった。
/etc/ntp.confは以下。
# -- NTP Servers server 10.0.0.1 # gps#1 server 10.0.0.2 # gps#2 server 10.0.0.3 # tell#1 server 10.0.0.4 # tell#2 # -- priority fudge 10.0.0.2 stratum 8 fudge 10.0.0.3 stratum 9 fudge 10.0.0.4 stratum 10
確認
ntpdをリスタート後、ntpqで確認。直後と、10分程度経過後の結果。
意図した優先順位にならなかった。
stratumも"st"列にあるようにすべて1となっている。詳しく調べてないけど問合せ先のNTPサーバがstratum値をリプライしてそれが優先されるのかな。
[root@login-server ~]# ntpq -p remote refid st t when poll reach delay offset jitter ============================================================================== 10.0.0.1 .GPS. 1 u 10 64 1 1.636 5.293 0.000 10.0.0.2 .GPS. 1 u 9 64 1 0.794 4.256 0.000 10.0.0.3 .TJJY. 1 u 8 64 1 0.762 4.301 0.000 10.0.0.4 .TJJY. 1 u 7 64 1 1.284 2.906 0.000 [root@login-server ~]# ntpq -p remote refid st t when poll reach delay offset jitter ============================================================================== +10.0.0.1 .GPS. 1 u 48 64 37 1.636 5.293 1.258 *10.0.0.2 .GPS. 1 u 49 64 37 0.794 4.256 0.826 10.0.0.3 .TJJY. 1 u 48 64 37 0.762 4.301 0.889 +10.0.0.4 .TJJY. 1 u 47 64 37 1.046 4.629 1.329
はじめてのOSコードリーディング ~UNIX V6で学ぶカーネルのしくみ (Software Design plus)
[24時間365日] サーバ/インフラを支える技術 ~スケーラビリティ、ハイパフォーマンス、省力運用 (WEB+DB PRESS plusシリーズ)
2013-02-11
■[linux][tmux] screenからtmuxへ移行した

tmuxは、GNU screenに代わる次世代ターミナル・マルチプレクサです。
screen同様、ターミナルウィンドウをたくさん起動しなくてよくなったり、ターミナルでの作業の中断や再開が簡単(デタッチ/アタッチ機能)になります。導入後のイメージは右の図を参照。
今更ながら移行しようと思った理由は、screenよりも流行っているから。screenとtmuxはコマンドもよく似ているので、すんなりと移行できると思います。
導入にあたり、以下を参考にしました。よくまとまっているので、本エントリーは完全に自分用のメモ。
- 時代はGNU screenからtmuxへ - Dマイナー志向
- 株式会社シャノン技術ブログ: tmuxの紹介
- 第127回 ターミナルマルチプレクサ tmuxを使ってみよう:Ubuntu Weekly Recipe|gihyo.jp … 技術評論社
- GNU Screen から tmux へと移行した - まちゅダイアリー(2013-01-12)
install
それぞれのパッケージ管理システムで簡単にインストールが可能です。
Macの場合
$ brew install tmux
CentOSの場合
$ sudo yum install tmux
設定
設定ファイル ~/.tmux.conf を作成します。以下をコピペしたらviライクなキーバインドになります。(ペイン分割v, hは直感と反するんだけど)
# -------------------------------------------- # Option # -------------------------------------------- # -- tmux起動時にzshを使う set-option -g default-shell /bin/zsh # -- prefix set-option -g prefix C-t set-window-option -g utf8 on set-window-option -g mode-keys vi set-window-option -g automatic-rename off set-option -g base-index 1 # -- mouse set-option -g mode-mouse on set-option -g mouse-resize-pane on set-option -g mouse-select-pane on set-option -g mouse-select-window on # -------------------------------------------- # KeyBindings # -------------------------------------------- unbind l unbind ^C bind C-r source-file ~/.tmux.conf # -- ペインの移動: Ctrl-tの連続入力で移動 bind C-t next-window bind c new-window # -- ペインの分割 bind v split-window -v bind h split-window -h # -- ペインサイズの変更: h,j,k,l bind -r C-h resize-pane -L 5 bind -r C-l resize-pane -R 5 bind -r C-j resize-pane -D 5 bind -r C-k resize-pane -U 5 bind -r s swap-pane -U bind k kill-pane bind K kill-window bind i display-panes bind y copy-mode bind p paste-buffer bind C-t next-window # -------------------------------------------- # View # -------------------------------------------- set -g status-interval 5 set -g status-left-length 16 set -g status-right-length 50 set -g status-bg black set -g status-fg white set -g status-left '#[fg=cyan,bold][#14H:#S]#[default]]' set -g status-right '|#[fg=magenta,bold]#(load.sh)#[default]| #[fg=blue,bold][%a %m/%d %H:%M]#[default]' set -g message-attr bold set -g message-fg white set -g message-bg red set -g pane-active-border-fg cyan set -g pane-active-border-bg black setw -g window-status-current-fg blue set-window-option -g mode-bg white set-window-option -g mode-fg black set-window-option -g window-status-fg white set-window-option -g window-status-bg black set-window-option -g window-status-current-attr bold set-window-option -g window-status-current-bg black set-window-option -g window-status-current-fg green
起動 (tmuxセッションの作成)と停止(tmuxセッションの削除)
$ tmux # セッション名FOOを付けて起動 $ tmux new[-session] -s FOO
tmux起動時に、すでにペイン画面を分割しておきたかったため、泥臭いですが.bashrcに以下を記述しています。(以下は3画面分割)
alias tms='tmux new-session \; split-window -v -d \; resize-pane -D 15 \; split-window -h -d \; resize-pane -R 15 \;'
デタッチとアタッチ
上記で設定した.tmux.confでの場合。(デフォルトプリフィックスはCtrl-b)
- デタッチ
作業を中断するときには、以下のコマンド。
Ctrl-t + d
- アタッチ
作業を再開するときには、以下のコマンド。
$ tmux a[ttach] # セッション名FOOを指定してアタッチ $ tmux a[ttach] -t FOO
- セッションの確認
$ tmux ls
- セッションの削除
# 最後のセッションを削除する $ tmux kill-session # セッション名FOOを指定してセッションを削除する $ tmux kill-session -t FOO # すべてのセッションを削除する $ tmux kill-server
コマンド
| キーバインド | コマンド |
|---|---|
| Ctrl-t ? | ショートカットキーのリストを表示 |
| Ctrl-t c | 新しいウィンドウを作成 |
| Ctrl-t n | 次のウィンドウへ移動 |
| Ctrl-t p | 前のウィンドウへ移動 |
| Ctrl-t w | ウィンドウの選択メニューを表示 |
| Ctrl-t d | セッションのデタッチ |
| Ctrl-t Ctrl-r | 設定ファイル($HOME/.tmux.conf)の再度読み込み 反映 |
| Ctrl-t : | コマンドプロンプトの開始 |
| Ctrl-t [ | コピーモードの開始 |
| space | コピーモード始点の選択 |
| return | コピーモード終点の選択 |
| Ctrl-t ] | バッファ内容のペースト |
| Ctrl-t q | ペインのインジケータを表示 |
| Ctrl-t t | ペイン全体に時計を表示 |
| Ctrl-t v | ウィンドウを横のペインに分割 (デフォルト") |
| Ctrl-t h | ウィンドウを縦のペインに分割 (デフォルト%) |
| Ctrl-t o | 次のペインへ移動 |
| Ctrl-t { | ペインの入れ替え |
| Ctrl-t } | ペインの入れ替え(逆順) |
| Ctrl-t ↑ | ペインの上下分割位置を上へ移動 |
| Ctrl-t ↓ | ペインの上下分割位置を下へ移動 |
| Ctrl-t ← | ペインの左右分割位置を左へ移動 |
| Ctrl-t → | ペインの左右分割位置を右へ移動 |
| Ctrl-t x | ペインの破棄 |
| Ctrl-t ! | ペイン分割の解除 |
その他tips
windowsのクリップボード連携
puttyなどの右クリックでクリップボードペーストする場合は、Shiftを押しながら右クリックでいける。
2013-02-01
■[network][linux][ruby] rubyで簡易ポートスキャン

ファイアウォールなどネットワーク機器のフィルタ設定変更後に、linuxサーバからファイアウォール越しに複数のサーバに対して疎通確認しますよね。確認項目が多い場合にラクしたくて書きました。
ちょうどトラブルで小一時間待ちだったし。
準備
$ gem search --remote ping *** REMOTE GEMS *** ... net-ping (1.5.3 ruby x86-mingw32, 1.3.2 x86-mswin32-60) ... $ sudo gem install net-ping --remote
code
#!/usr/local/bin/ruby require 'rubygems' require 'net/ping' class Portscan def initialize(host = '127.0.0.1', ports = 1..65536) @host = host @ports = ports end def do_portscan @ports.each { |p| ping_tcp = Net::Ping::TCP.new(@host, p) puts "#{@host} \t[#{p}]" if ping_tcp.ping? } end end # --------------------------------------------- # main # --------------------------------------------- @input_file = ARGV[0] || "./pinglist.txt" @ports = [ 'http', 'https', 'ssh', 'ftp', 'telnet', 3389 #RDP ] File::open( @input_file ) { |f| f.each { |line| Portscan.new(line.chomp, @ports).do_portscan puts "-------------------------------" } } # default: TCP ping to localhost (port 1 - 65536) #Portscan.new.do_portscan
使い方
引数に宛先リストを指定して実行する。引数がない場合は、./pinglist.txtをデフォルトで入力ファイルとみなす。
$ ruby portscan.rb [file]
入力ファイルpinglist.txt(宛先IPアドレスリスト)は以下のような感じで改行区切り。宛先のIPアドレス[名前解決可能なホスト名]を列挙するだけ。
192.168.0.1 www.yahoo.co.jp 192.168.0.25 172.30.5.1 ...
スキャンしたいTCPポートを増やしたい場合は、コンストラクタに渡す配列@portsに追加すればOK。"http"のようなキーワード形式でも良いですが、何がキーワードとして定義されているのかが分からなかったのでTCPポート番号を直接書き込むほうが確実。
# つか、外部ファイルに書き出すべきだったかな
こんなんで、同一セグメントの全ホストに対してportscan攻撃するのもありですね。
for i in 1..254 Portscan.new("192.168.0.#{i}", 1..65536).do_portscan end
etc
githubにあげてみた。 > momota/network_check ? GitHub
2012-08-13
■[mongodb][ubuntu] Ubuntu linuxにMongoDBをインストールする

以下の本を読書中だけど、6章でMongoDBを使ったサンプロプログラムが掲載されていたので、MongoDBをインストールすることにした。
MongoDBは、wikipediaによると以下のようなDB。
MongoDB は、高パフォーマンス、スキーマレス、オープンソースのドキュメント指向データベースである。C++言語で記述されている。 MongoDBはRDBMSではない。MongoDBは、BSONというJSONのバイナリ版のような形式でドキュメントを表現し、そのコレクションを管理する。この形式は、複雑な階層を持たせることができ、なおかつクエリやインデックスが容易である。これにより、多くのアプリケーションは、自身のネイティブなデータ型や構造に合った自然な方法でデータを格納できる。
Mongoという名前は、英単語の"humongous"(ばかでかい)に由来する。
MongoDBの開発は10genによって2007年10月から開始され、最初の公開リリースは2009年2月に行われた。
http://ja.wikipedia.org/wiki/MongoDB
今回は、ubuntuなのでパッケージ管理システムaptでインストールを行います。
なお、インストール環境は以下のとおり。
$uname -a Linux ubuntu 2.6.35-22-generic #33-Ubuntu SMP Sun Sep 19 20:34:50 UTC 2010 i686 GNU/Linux $cat /etc/lsb-release DISTRIB_ID=Ubuntu DISTRIB_RELEASE=10.10 DISTRIB_CODENAME=maverick DISTRIB_DESCRIPTION="Ubuntu 10.10"
1. aptの事前準備
MongoDBをaptでインストールするため、リポジトリのサーバ証明書を追加します。
$curl -O http://jp.docs.mongodb.org/10gen-gpg-key.asc $cat 10gen-gpg-key.asc -----BEGIN PGP PUBLIC KEY BLOCK----- Version: GnuPG v1.4.10 (Darwin) mQENBEtsQe8BCACm5G0/ei0IxyjVEp6EEtbEbWK1Q4dKaONtiCODwB8di+L8tlUd Ra5QYxeyV90C+dqdh34o79enXxT6idHfYYqDdob2/kAPE6vFi4sLmrWIVGCRY++7 RPclZuezPm1sxG1TRAYEsW0VZUE9ofdoQ8xlUZDyn2BSjG8OCT2e4orRg1pHgzw2 n3hnWqJNuJS4jxcRJOxI049THIGUtqBfF8bQoZw8C3Wg/R6pGghUfNjpA6uF9KAH gnqrC0swZ1/vwIJt9fnvAlzkqLrssYtKH0rMdn5n4g5tJLqY5q/NruHMq2rhoy3r 4MC1w8GTbP7qR83wAyaLJ7xACOKqxB3SrDFJABEBAAG0I1JpY2hhcmQgS3JldXRl ciA8cmljaGFyZEAxMGdlbi5jb20+iQE4BBMBAgAiBQJLbEHvAhsDBgsJCAcDAgYV CAIJCgsEFgIDAQIeAQIXgAAKCRCey+xGfwzrEGXbB/4nrmf/2rEnztRelmup3duI eepzEtw1cv3uHg2oZXGS6S7o5Fsk+amngaWelWKfkSw5La7aH5vL4tKFKUfuaME1 avInDIU/0IEs8jLrdSWq601HowLQcxAhqNPdaGONDtHw56Qhs0Ba8GA6329vLWgZ ODnXweiNSCDrv3xbIN6IjPyyO5AoUkxmJfD0mVtp3u5Ar7kfIw7ieGGxokaHewNL Xzqcp9rPiUR6dFw2uRvDdVRrXFUPlgVugaHKytm15JpHmQfyzQiMdYXnIz0oofJO WM/PY1iw+QJZ2M7PnfbTJeADXIc/EoOAJDRggih533SjhiCaT6FdPMMk6rCZ5cgl uQENBEtsQe8BCADlNPIJZVSL2i6H9X19YK4CpEqsjIUGISMB1cDT311WFSnhfuMs GL9xYRb8dlbyeJFFOyHNkIBmH5ekCvGRfS6qJYpcUQZZcWSjEMqBYQV5cw1efd0B ek64jfvrsLz8+YhKzn+NI8O3nyGvpEEWvOhN4hNjwkDhYbXLvAlsqagbnSMf+Htf 3lgCGYa2gLiNIqNKWCsEVAan/Er6KS39WANGXi6ih0yjReBiU8WR6Qh2ylMi2xKw yHnTOsbWxP0hqALUa7N4AEGCXS/qn+vUz/hcIbt+eUNy45qoZcTT3dZsWGfJqknh RFMIuPiej7/WY4Ugzes5NG02ecDkDkpJvrSNABEBAAGJAR8EGAECAAkFAktsQe8C GwwACgkQnsvsRn8M6xABeggAlNkqbqa12L1bgaCgnGGdCiuXB3F6/VFmSQdUKpts EuqWH6rSp30r67PupzneX++ouh+9WD5O7gJ0kP3VQJpmXjT/QnN5ANjI4kAtRZUW qCXlXOxVAeXHL5oiKz0NM23Xc2rNAyfBQY8+SUYrKBalNBq5m68g8oogX8QD5u2F x+6C+QK9G2EBDD/NWgkKN3GOxpQ5DTdPHI5/fjwYFs1leIaQjjiyJwAifxB/1+w0 VCHe2LDVpRXY5uBTefF2guhVYisKY6n5wNDaQpBmA8w17it5Yp8ge0HMN1A+aZ+6 L6MsuHbG2OYDZgAk8eKhvyd0y/pAhZpNuQ82MMGBmcueSA== =74Cu -----END PGP PUBLIC KEY BLOCK-----
続いて、証明書(キー)を登録します。
"apt-key add"で登録、"apt-key list"で登録されているキーの一覧を確認できます。
$sudo apt-key add ./10gen-gpg-key.asc $sudo apt-key list /etc/apt/trusted.gpg -------------------- pub 1024D/437D05B5 2004-09-12 uid Ubuntu Archive Automatic Signing Key <ftpmaster@ubuntu.com> sub 2048g/79164387 2004-09-12 pub 1024D/FBB75451 2004-12-30 uid Ubuntu CD Image Automatic Signing Key <cdimage@ubuntu.com> pub 2048R/7F0CEB10 2010-02-05 uid Richard Kreuter <richard@10gen.com> sub 2048R/A89B0149 2010-02-05
"/etc/apt/sources.list.d/"に以下の内容の"10gen.list"を配置します。
$cat /etc/apt/sources.list.d/10gen.list deb http://downloads-distro.mongodb.org/repo/ubuntu-upstart dist 10gen deb http://downloads-distro.mongodb.org/repo/debian-sysvinit dist 10gen
最新のパッケージリストに更新します。
$sudo apt-get update
以上で準備は終わりです。
2. MongoDBをaptでインストールする
あとは、"apt-get install"するだけです。簡単。
sudo apt-get install mongodb-10gen
3. インストールを確認します
mongoがDBクライアントで、mongodがデーモンです。
$which mongo /usr/bin/mongo $which mongod /usr/bin/mongod $mongo --version MongoDB shell version: 2.0.7
実はインストールされると、すでにmongodプロセスは起動されています。
$ps aux |grep mongo |grep -v grep mongodb 2250 0.3 4.2 129256 29856 ? Ssl 13:28 1:10 /usr/bin/mongod --config /etc/mongodb.conf
"/etc/mongodb.conf"が設定ファイルです。
mongoで対話的にサムシング。
$mongo
MongoDB shell version: 2.0.7
connecting to: test
> help
db.help() help on db methods
db.mycoll.help() help on collection methods
rs.help() help on replica set methods
help admin administrative help
help connect connecting to a db help
help keys key shortcuts
help misc misc things to know
help mr mapreduce
show dbs show database names
show collections show collections in current database
show users show users in current database
show profile show most recent system.profile entries with time >= 1ms
show logs show the accessible logger names
show log [name] prints out the last segment of log in memory, 'global' is default
use <db_name> set current database
db.foo.find() list objects in collection foo
db.foo.find( { a : 1 } ) list objects in foo where a == 1
it result of the last line evaluated; use to further iterate
DBQuery.shellBatchSize = x set default number of items to display on shell
exit quit the mongo shell
いけてますね。
MongoDBの起動、停止、再起動
起動。
$sudo service mongodb start → sudo /etc/init.d/mongodb startでもOK
停止。
$sudo service mongodb stop → sudo /etc/init.d/mongodb stopでもOK
再起動。
$sudo service mongodb restart → sudo /etc/init.d/mongodb restartでもOK
参考
2012-08-04
■[node] 読書メモ - Node Web Development (2)

mac OSXにNode.jsとnpmをインストールします。
インストールする環境は、Mac OSX ver. 10.8 (mountain lion).
Nodeをインストールする
パッケージ管理システムのmacportsを使えば簡単。
まず、portツリーを最新化します。
$ sudo port selfupdate Password: ---> Updating MacPorts base sources using rsync MacPorts base version 2.1.2 installed, MacPorts base version 2.1.2 downloaded. ---> Updating the ports tree ---> MacPorts base is already the latest version The ports tree has been updated. To upgrade your installed ports, you should run port upgrade outdated
$ sudo port install nodejs ---> Computing dependencies for nodejs ---> Fetching archive for nodejs ---> Attempting to fetch nodejs-0.8.5_0+python27+ssl.darwin_12.x86_64.tbz2 from http://packages.macports.org/nodejs ---> Fetching distfiles for nodejs ---> Attempting to fetch node-v0.8.5.tar.gz from http://distfiles.macports.org/nodejs ---> Verifying checksum(s) for nodejs ---> Extracting nodejs ---> Configuring nodejs ---> Building nodejs ---> Staging nodejs into destroot ---> Installing nodejs @0.8.5_0+python27+ssl ---> Activating nodejs @0.8.5_0+python27+ssl ---> Cleaning nodejs ---> Updating database of binaries: 100.0% ---> Scanning binaries for linking errors: 100.0% ---> No broken files found.
ソースコードからのインストールは、http://nodejs.jp/からtarballをダウンロードし、以下のようにやればOK。
$ curl -O http://nodejs.org/dist/v0.8.5/node-v0.8.5.tar.gz $ tar xvzf node-v0.8.5.tar.gz $ cd node-v0.8.5 $ ./configure $ make $ sudo make install
問題なくインストールできたみたいなので、ちょいと動作確認します。
$ node -v
v0.8.5
$ node
> console.log("hello, workd!")
hello, workd!
undefined
いいっすね。
localhostで動くwebサーバも簡単に書けちゃう。すごい。
var http = require('http'); http.createServer(function (req, res) { res.writeHead(200, {'Content-Type': 'text/plain'}); res.end('Hello World\n'); }).listen(8080, '127.0.0.1'); console.log('Server running at http://127.0.0.1:8080/');
npmをインストールする
npmは、node.jsのライブラリパッケージ管理システムで、rubyでいうgemみたいなもの。
shellスクリプトを以下のようにダウンロード→実行する。
$ curl http://npmjs.org/install.sh | sudo sh
インストールできたみたいなので、確認します。
$ which npm /opt/local/bin/npm $ npm install socket.io . . . socket.io@0.9.9 node_modules/socket.io ├── policyfile@0.0.4 ├── redis@0.7.2 └── socket.io-client@0.9.9 (xmlhttprequest@1.4.2, uglify-js@1.2.5, active-x-obfuscator@0.0.1, ws@0.4.21)
イケテル。

