Hatena::ブログ(Diary)

(ひ)メモ このページをアンテナに追加 RSSフィード

2017-07-10 (Mon)

たくさんのホストにpingするのに便利なツールpingerを書きました

たくさんのホストにpingするのに便利なツールpingerをgoで書きました。

こちらから Linux, macOS, Windows 用のバイナリがダウンロードできるので是非お試しください。(手元に環境がないのでWindowsでは動作確認していません)

メンテナンス時、特にネットワーク関連のメンテには、多数のホストへの到達性をモニタリングしがら作業したいことがあると思いますが、(自分が知ってる限りの)既存のツールでは一覧性がよいものがなかったのがこのpingerを書いた動機です。

pingerを実行すると、このように上部には指定したホストの状況を2カラムで表示し、下部に失敗したホストの履歴を表示するので、現在の状況(上部)と過去の状況(下部)を同時に把握できるのが便利ポイントです。


ping対象のホストはpingerの引数にホスト名かIPアドレスで指定してください。思うがままにたくさん指定してください。

pingerの実行にはroot権限が必要なので、いずれかの方法で実行してください。

  • sudo pingerで実行する
  • rootで実行する
  • root で chown root pinger; chmod 4755 pinger しておいてから実行する
  • Linuxの場合、root で setcap cap_net_raw=ep pinger しておいてから実行する (azs! id:mapk0y

ESCかC-cをタイプすると終了します。

終了すると画面がクリアされてしまいます。pingに失敗した履歴を保存しておきたい場合は、標準エラー出力をファイルにリダイレクトしてください。

$ sudo pinger example.com example.net 192.0.2.1 192.0.2.2 192.0.2.3 2> pinger.log

ホスト名(IPアドレス)の横に2つの数値が表示されますが、左のはRTT、右の括弧内のは最大10個の直近の結果の平均RTTで、どちらも単位は ms です。


それではよいpingライフを!

2016-12-14 (Wed)

hardware clockがずれる件と 11 minute mode

localtimeにしていたhardware clockをなんとなくUTCにしてみたら10分ぐらいで元に戻っちゃうというお話です。環境は Ubuntu 16.04 です。

結局、reboot しないとダメだったんですが、いい方法あったら教えてください><



hardware clockがlocaltimeになっているかUTCになっているかは、timedatectl の "RTC time" や "RTC in local TZ" のところを見るか、

### UTCの場合
$ sudo timedatectl
      Local time: Wed 2016-12-14 19:19:46 JST
  Universal time: Wed 2016-12-14 10:19:46 UTC
        RTC time: Wed 2016-12-14 10:19:46 # ココ
        Timezone: Asia/Tokyo (JST, +0900)
     NTP enabled: yes
NTP synchronized: yes
 RTC in local TZ: no # ココ
      DST active: n/a

### localtimeの場合
$ sudo timedatectl
      Local time: Wed 2016-12-14 19:34:20 JST
  Universal time: Wed 2016-12-14 10:34:20 UTC
        RTC time: Wed 2016-12-14 19:34:20 # ココ
        Timezone: Asia/Tokyo (JST, +0900)
     NTP enabled: yes
NTP synchronized: no
 RTC in local TZ: yes # ココ
      DST active: n/a

Warning: The RTC is configured to maintain time in the local time zone. This
         mode is not fully supported and will create various problems with time
         zone changes and daylight saving adjustments. If at all possible use
         RTC in UTC, by calling 'timedatectl set-local-rtc 0'.

hwclock --show --debug でも確認できます。

### UTCの場合
$ sudo hwclock --show --debug
hwclock from util-linux 2.20.1
Using /dev interface to clock.
Last drift adjustment done at 1478666918 seconds after 1969
Last calibration done at 1478666918 seconds after 1969
Hardware clock is on UTC time
Assuming hardware clock is kept in UTC time. # ココ
Waiting for clock tick...
...got clock tick
Time read from Hardware Clock: 2016/12/14 10:36:58
Hw clock time : 2016/12/14 10:36:58 = 1481711818 seconds since 1969
Wed Dec 14 19:36:58 2016  -0.074581 seconds

### localtimeの場合
$ sudo hwclock --show --debug
hwclock from util-linux 2.20.1
Using /dev interface to clock.
Last drift adjustment done at 1481708948 seconds after 1969
Last calibration done at 1481708948 seconds after 1969
Hardware clock is on local time
Assuming hardware clock is kept in local time. # ココ
Waiting for clock tick...
...got clock tick
Time read from Hardware Clock: 2016/12/14 19:37:03
Hw clock time : 2016/12/14 19:37:03 = 1481711823 seconds since 1969
Wed Dec 14 19:37:03 2016  -0.031894 seconds

hwclock --systohc --utc や timtdatectl set-local-rtc 0 で hardware clock を localtime から UTC に変更できるのですが、10分ぐらいするとなぜか元に戻っちゃいました。

これは hwclock(8) に依れば "11 minute mode" という、system clockがずれていないと信頼できるような環境で有益な、11分ごとにhardware clockをsystem clockの時刻に合わせるモードが原因でした。

"11 minute mode" が有効になっているかどうかは、ntptime の実行結果の status 行を見れば確認できます。ここにUNSYNCがなければ有効、あれば無効です。

### "11 minute mode" が有効になっている(=UNSYNCがない)
$ ntptime | grep status
  status 0x2001 (PLL,NANO),

### "11 minute mode" が無効になっている(=UNSYNCがある)
$ ntptime | grep status
  status 0x41 (PLL,UNSYNC),

もしくは adjtimex --print の実行結果の status の数値の 64 ビット目が0(STA_UNSYNC)ならば "11 minute mode" が有効になっていることを示します。


hwclock(8) にも書いてありますが、手元の環境でも ntpd を起動すると "11 minute mode" が有効になりました。(落とすと無効になる)


というわけで、ntpd を起動すると "11 minute mode" が有効になり kernel(?) が認識しているタイムゾーンと異なるのか、10分ぐらいすると hardware clock の時刻がずれてしまいました。

いろいろ

  • /etc/adjtime を消して hwclock --systohc --utc
  • timtdatectl set-local-rtc 0

やってみたんですが、解消できず、結局は ntpd を落として hardware clock を UTC にして reboot したら直りました。(起動後に ntpd を起動してももうずれない)

2016-10-04 (Tue)

MySQL 5.7のmysqld --initializeと鶏卵問題

MySQLのデータディレクトリの初期化にはこれまで mysql_install_db が使われてきましたが、MySQL 5.7からは mysqld --initialize を使うことが推奨されています。

mysqld --initialize は datadir 配下にファイルやサブディレクトリがあるとエラー終了します。


# mysqld --initialize --user=mysql
2016-10-04T11:39:01.313174Z 0 [ERROR] --initialize specified but the data directory has files in it. Aborting.
2016-10-04T11:39:01.313222Z 0 [ERROR] Aborting

なので datadir をスッカラカンにして再度実行してみます。my.cnf はこんな内容で、datadir の下に tmpdir、InnoDBのデータとログのディレクトリがある構成です。

datadir  = /data/mysql
tmpdir   = /data/mysql/tmp
innodb_data_home_dir            = ibdata
innodb_log_group_home_dir       = iblog
# rm -fr /data/mysql/*
# mysqld --initialize --user=mysql
# echo $?
1
# cat /data/mysql/mysqld.err
mysqld: Can't create/write to file '/data/mysql/tmp/ibSY07SU' (Errcode: 2 - No such file or directory)
2016-10-04T11:41:18.876953Z 0 [ERROR] InnoDB: Unable to create temporary file; errno: 2
2016-10-04T11:41:18.876965Z 0 [ERROR] InnoDB: Plugin initialization aborted with error Generic error
2016-10-04T11:41:18.876971Z 0 [ERROR] Plugin 'InnoDB' init function returned error.
2016-10-04T11:41:18.876975Z 0 [ERROR] Plugin 'InnoDB' registration as a STORAGE ENGINE failed.
2016-10-04T11:41:18.876980Z 0 [ERROR] Failed to initialize plugins.
2016-10-04T11:41:18.876983Z 0 [ERROR] Aborting

/data/mysql/tmp が存在しないので /data/mysql/tmp/ibSY07SU が作れずエラー終了しています。

InnoDBのデータ、ログディレクトリについても同様で、自動ではサブディレクトリを作ってくれません。

[ERROR] InnoDB: Operating system error number 2 in a file operation.
[ERROR] InnoDB: The error means the system cannot find the path specified.
[ERROR] InnoDB: If you are installing InnoDB, remember that you must create directories yourself, InnoDB does not create them.
[ERROR] InnoDB: File ibdata/ibdata1: 'create' returned OS error 71. Cannot continue operation
[ERROR] InnoDB: Cannot continue operation.
[ERROR] InnoDB: Operating system error number 2 in a file operation.
[ERROR] InnoDB: The error means the system cannot find the path specified.
[ERROR] InnoDB: If you are installing InnoDB, remember that you must create directories yourself, InnoDB does not create them.
[ERROR] InnoDB: File iblog/ib_logfile101: 'create' returned OS error 71.
[ERROR] InnoDB: Cannot create iblog/ib_logfile101
[ERROR] InnoDB: InnoDB Database creation was aborted with error Generic error. You may need to delete the ibdata1 file before trying to start up again.
[ERROR] Plugin 'InnoDB' init function returned error.
[ERROR] Plugin 'InnoDB' registration as a STORAGE ENGINE failed.
[ERROR] Failed to initialize plugins.
[ERROR] Aborting

というわけで、初期化にはサブディレクトリが必要なわけですが、サブディレクトリがあると mysqld --initialize はエラー終了します。

_人人人人人人人人人人人人人人人人人人_

> どうすりゃいいねん!!!!!!! <

 ̄Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y ̄



途方に暮れそうになりましたが、ドキュメントにちゃんと書いてありました。

As of MySQL 5.7.11, an existing data directory is permitted to be nonempty if every entry either has a name that begins with a period (.) or is named using an --ignore-db-dir option.

https://dev.mysql.com/doc/refman/5.7/en/data-directory-initialization-mysqld.html

というわけで、予め必要なサブディレクトリを作っておいて、必要なだけ --ignore-db-dir で繰り返しそれを指定すればOKです。

# rm -fr /data/mysql/*
# install -d -o mysql -g mysql -m 750 /data/mysql/{tmp,ibdata,iblog}
# mysqld --initialize  --user=mysql --ignore-db-dir=tmp --ignore-db-dir=ibdata --ignore-db-dir=iblog
# echo $?
0
2003 | 11 | 12 |
2004 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 10 | 11 | 12 |
2005 | 01 | 02 | 03 | 05 | 08 | 09 | 10 | 11 | 12 |
2006 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2007 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2008 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2009 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2010 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2011 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 12 |
2012 | 01 | 02 | 03 | 06 | 08 | 10 | 11 | 12 |
2013 | 01 | 02 | 03 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2014 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 10 |
2015 | 01 | 02 | 07 | 10 |
2016 | 01 | 05 | 10 | 12 |
2017 | 07 |
Connection: close