Hatena::ブログ(Diary)

momota.log このページをアンテナに追加 RSSフィード

2013-03-16

[][] 複数NTPサーバを指定するときに優先度をつける  複数NTPサーバを指定するときに優先度をつけるを含むブックマーク  複数NTPサーバを指定するときに優先度をつけるのブックマークコメント

複数のNTPサーバをタイムサーバとして指定するときに、設計上、優先したいサーバプライマリ設定したい場合があるかも知れない。

ケースとしてはレアだけど、たとえば、NTPサーバの時刻精度やサーバ性能が、サーバ間で明らかに違うことが分かっているときとか。

そんなときにちょっとだけはまったのでメモ。

OSは、CentOS 6.0だったはず。

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

[][] screenからtmuxへ移行した 23:29  screenからtmuxへ移行したを含むブックマーク  screenからtmuxへ移行したのブックマークコメント

f:id:Makots:20130211135450p:image:right

tmuxは、GNU screenに代わる次世代ターミナル・マルチプレクサです。

screen同様、ターミナルウィンドウをたくさん起動しなくてよくなったり、ターミナルでの作業の中断や再開が簡単(デタッチ/アタッチ機能)になります。導入後のイメージは右の図を参照。

今更ながら移行しようと思った理由は、screenよりも流行っているから。screenとtmuxはコマンドもよく似ているので、すんなりと移行できると思います。

導入にあたり、以下を参考にしました。よくまとまっているので、本エントリーは完全に自分用のメモ。



install

それぞれのパッケージ管理システムで簡単にインストールが可能です。

Macの場合

$ brew install tmux

CentOSの場合

$ sudo yum install tmux

ubuntuだとapt-getでインストールできるはず。



設定

設定ファイル ~/.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を押しながら右クリックでいける。





ターミナルマルチプレクサ tmux 入門


zshの本 (エッセンシャルソフトウェアガイドブック)

2013-02-01

[][][] rubyで簡易ポートスキャン  rubyで簡易ポートスキャンを含むブックマーク  rubyで簡易ポートスキャンのブックマークコメント

ファイアウォールなどネットワーク機器のフィルタ設定変更後に、linuxサーバからファイアウォール越しに複数のサーバに対して疎通確認しますよね。確認項目が多い場合にラクしたくて書きました。

ちょうどトラブルで小一時間待ちだったし。

準備

gemでnet-pingインストールします。

$ 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



たのしいRuby 第3版

プログラミングRuby 第2版 言語編

2012-08-13

[][] Ubuntu linuxMongoDBインストールする  Ubuntu linuxにMongoDBをインストールするを含むブックマーク  Ubuntu linuxにMongoDBをインストールするのブックマークコメント

以下の本を読書中だけど、6章でMongoDBを使ったサンプロプログラムが掲載されていたので、MongoDBインストールすることにした。

Node Web Development


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の事前準備

MongoDBaptインストールするため、リポジトリサーバ証明書を追加します。

まずは、証明書のダウンロードを行います。

$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

続いて、MongoDBリポジトリURLを登録します。

"/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. MongoDBaptインストールする

あとは、"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 Web Development (2)  読書メモ - Node Web Development (2)を含むブックマーク  読書メモ - Node Web Development (2)のブックマークコメント

2012-07-14 - momota.log の続き。

Node Web Development

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

最新のようなので、次にNode.jsインストールします。

$ 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)

イケテル。