AND OR  

Nagios

統合監視ツールのNagiosについてまとめます。

  • 環境
    CentOS 5.x, Ubuntu 11.x (x86_64)
    Nagios 3.2.x

プラグイン

よく利用されるNagiosプラグインについて整理する。

ディスク容量の監視 (check_disk)

check_disk -w <WARNING閾値> -c <CRITICAL閾値> [オプション]

HTTPサーバの監視 (check_http)

check_http -H <vhost> | -I <IP-address> [-u <uri>] [-p <port>] [-w <warn time>] [-c <critical time>] [-t <timeout>] [-L] [-a auth] [-b proxy_auth] [-f <ok|warning|critcal|follow|sticky|stickyport>] [-e <expect>] [-s string] [-l] [-r <regex> | -R <case-insensitive regex>] [-P string] [-m <min_pg_size>:<max_pg_size>] [-4|-6] [-N] [-M <age>] [-A string] [-k string] [-S] [--sni] [-C <age>] [-T <content-type>] [-j method]

ロードアベレージの監視 (check_load)

check_load [-r] -w WLOAD1,WLOAD5,WLOAD15 -c CLOAD1,CLOAD5,CLOAD15

MySQLサーバの監視 (check_mysql)

check_mysql [-d database] [-H host] [-P port] [-s socket] [-u user] [-p password] [-S]

MySQLサーバの監視 2 (check_mysql_query)

check_mysql_query -q SQL_query [-w warn] [-c crit] [-H host] [-P port] [-s socket] [-d database] [-u user] [-p password]

Zabbix

統合監視ツールのZabbixについてまとめます。

  • 環境
    CentOS 5.x, Ubuntu 11.x (x86_64)
    Zabbix 2.0.x

テンプレート

Template App MySQL

Zabbixにデフォルトで入っているMySQL監視用テンプレートの設定について整理する。

  • zabbix_agentd.conf
    zabbix_agentd 稼働ホストの設定ファイルにMySQL監視用コマンドを追加する。
    # UserParameter=key,command
    UserParameter=mysql.status[*], /usr/bin/mysqladmin  extended-status 2>/dev/null | awk '/ $1 /{print $$4}'
    UserParameter=mysql.ping, /usr/bin/mysqladmin  ping | grep alive | wc -l
    UserParameter=mysql.version, /usr/bin/mysqladmin -V
    実行するコマンドを ''UserParameter'' にキーと併せて設定する。ワイルドカードに入ってくる文字列値は $1 で参照できる。例えば、mysql.status[Uptime] で指定された場合は awk '/Uptime /{print $$4} ' と展開される。MySQLのユーザー認証情報は mysqladmin のオプションに適宜追加する。
     
    あとは zabbix_server 稼働ホストの zabbix_get コマンドで動作確認。
    $ zabbix_get -s <対象のホスト名> -k 'mysql.ping'
    1
    $ zabbix_get -s <対象のホスト名> -k 'mysql.status[Uptime]'
    3186761
    $ zabbix_get -s <対象のホスト名> -k 'mysql.version'
    /usr/bin/mysqladmin  Ver 8.42 Distrib 5.5.30, for Linux on x86_64

Supervisor: A Process Control System

Supervisor
Python製のプロセス管理ツール。コマンドラインの管理ツールやWebインタフェースも付属している。また、イベント機能 Events - supervisor を使えばプロセス管理だけでなく監視ツールとしても活用できる。フォアグラウンドで動作するプログラムをバックグラウンドで起動する(デーモン化)機能もあるので daemontools の代替ツールとして有用。

  • インストール
    インストールは easy_install や pip から簡単にできる。yum でインストールできるバージョンは古いので注意。
    $ pip install supervisor

configuration

設定項目については以下のエントリーの内容を参考にさせていただいた。
supervisord を使って Tornado をデプロイする

以下は設定ファイルの各セクションの説明(必須設定項目は太字)。サンプル設定は公式ドキュメントから引用。

  • ''unix_http_server'' セクション
    ローカルの supervisorctl から supervisord にアクセスするためのUNIXドメインソケットの設定。
    ''file''UNIXドメインソケットファイルのパス
    chmodUNIXドメインソケットファイルの権限(デフォルト 0700)
    chownUNIXドメインソケットファイルの所有者(デフォルトは supervisord を起動したユーザー)
    username認証用のユーザー名
    password認証用のパスワード、平文かSHA1ハッシュを指定
    • sample
      [unix_http_server]
      file = /tmp/supervisor.sock
      chmod = 0777
      chown= nobody:nogroup
      username = user
      password = 123
  • ''inet_http_server'' セクション
    ネットワーク経由で supervisorctl やWebブラウザから supervisord にアクセスするためのTCPソケットの設定。
    ''port''ホストとポートの指定
    username認証用のユーザー名
    password認証用のパスワード、平文かSHA1ハッシュを指定
    • sample
      [inet_http_server]
      port = 127.0.0.1:9001
      username = user
      password = 123
  • ''supervisord'' セクション
    supervisord (デーモンプロセス)の設定。
    logfileログファイルのパス名(デフォルト $CWD/supervisord.log)
    logfile_maxbytesログファイルの最大ファイルサイズ(デフォルト 50MB)
    logfile_backupsログローテートで残すログファイル数(デフォルトは 10 で、 0 なら削除しない)
    loglevel出力するログレベル(デフォルト info)
    pidfilepidファイルのパス名(デフォルト $CWD/supervisord.pid)
    umasksupervisord プロセスの umask(デフォルト 022)
    nodaemonsupervisord をフォアグラウンドで起動するか(デフォルト false)
    minfdssupervisord の起動に必要なファイルディスクリプタの数(デフォルト 1024)
    minprocssupervisord の起動に必要なプロセスディスクリプタの数(デフォルト 200)
    nocleanup起動時に古い子プロセスログを削除しないか(デフォルト false)
    childlogdir子プロセスのログファイルを作成するパス(デフォルトは Python の tempfile.get_tempdir() の値)
    usersupervisord の実行ユーザー(root で起動すると指定したユーザーにスイッチする)
    directorysupervisord 起動時のカレントディレクトリの指定
    strip_ansiエスケープシーケンスを削除するか(デフォルト false)
    environment子プロセスに引き渡す環境変数を key1=value1,key2=value2 の形式で指定 Subprocess Environment
    identifiersupervisord プロセスの識別子、RPCインタフェースで利用される
    • sample
      [supervisord]
      logfile = /tmp/supervisord.log
      logfile_maxbytes = 50MB
      logfile_backups=10
      loglevel = info
      pidfile = /tmp/supervisord.pid
      nodaemon = false
      minfds = 1024
      minprocs = 200
      umask = 022
      user = chrism
      identifier = supervisor
      directory = /tmp
      nocleanup = true
      childlogdir = /tmp
      strip_ansi = false
      environment = KEY1=value1,KEY2=value2
  • ''supervisorctl'' セクション
    supervisorctl (管理用コマンドラインツール)の設定。
    serverurl接続する supervisord のURL、前述の unix_http_server または inet_http_server で指定した場所 (デフォルトは http://localhost:9001
    username認証用のユーザー名
    password認証用のパスワード
    promptプロンプトとして表示する文字列(デフォルトは supervisor)
    history_filereadline ライブラリで使う履歴ファイルのパス(デフォルトでは履歴ファイルを作成しない)
    • sample
      [supervisorctl]
      serverurl = unix:///tmp/supervisor.sock
      username = chris
      password = 123
      prompt = mysupervisor
  • ''program:x'' セクション
    管理対象のプログラムの設定。
    ''command''起動する外部プログラムを指定
    process_nameプロセスの名前を定義する(デフォルト %(process_num)s)
    numprocs起動するプロセス数(デフォルト 1)
    numprocs_startプロセス番号のオフセット(デフォルト 0)
    priority起動/終了の優先順位、値が小さいほど先に開始し、後に終了する(デフォルト 999)
    autostartsupervisord の起動時にプロセスを自動起動するか(デフォルト true)
    autorestartプロセス終了時の再起動の指定、true なら常に再起動、 false なら常に再起動しない、 unexpected なら 終了コードが exitcodes のあるもの以外なら再起動(デフォルト unexpected)
    startsecsここに指定した秒数より早く終了したら、終了コードにかかわらず起動失敗とみなす(デフォルト 1)
    startretries起動に失敗した場合にリトライする回数(デフォルト 3)
    exitcodes正常終了とみなす終了コード(デフォルト 0, 2)
    stopsignalプロセスを終了させるために使うシグナル(デフォルト TERM)
    stopwaitsecsこの秒数が経ってもプロセスが終了しない場合、 SIGKILL を送信する(デフォルト 10)
    killasgroupSIGKILL を送信する際にプロセスグループ全体に送信するか(デフォルト false)
    userプロセスの実行ユーザー(root で起動すると指定したユーザーにスイッチする)
    redirect_stderr標準エラー出力を supervisord の標準出力にリダイレクトするか(デフォルト false)
    stdout_logfile標準出力ログのファイル名
    stdout_logfile_maxbytes標準出力ログがこのサイズを超えたらローテートする(デフォルト 50MB)
    stdout_logfile_backupsログローテートで残すファイル数 (デフォルト 10)
    stdout_capture_maxbytesCapture Mode 時のバッファサイズ(デフォルト 0)Capture Mode
    stdout_events_enabled標準出力への出力時に PROCESS_LOG_STDOUT イベントを発生させるか(デフォルト false)Capture Mode
    stderr_logfile標準エラー出力のファイル名
    stderr_logfile_maxbytes標準エラー出力ログがこのサイズを超えたらローテートする(デフォルト 50MB)
    stderr_logfile_backupsログローテートで残すファイル数(デフォルト 10)
    stderr_capture_maxbytesCapture Mode 時のバッファサイズ(デフォルト 0)
    stderr_events_enabled標準エラー出力への出力時に PROCESS_LOG_STDERR イベントを発生させるか(デフォルト false)
    environmentプロセスに渡す環境変数を key1=value1,key2=value2 の形式で指定
    directory起動時のカレントディレクトリの指定(デフォルトは supervisord セクションの設定を継承)
    umaskプロセスの umask の指定 (デフォルトは supervisord セクションの設定を継承)
    serverurlSUPERVISOR_SERVER_URL 環境変数に渡すURL(デフォルトは AUTO で自動設定 )
    • sample
      [program:cat]
      command=/bin/cat
      process_name=%(program_name)s
      numprocs=1
      directory=/tmp
      umask=022
      priority=999
      autostart=true
      autorestart=true
      startsecs=10
      startretries=3
      exitcodes=0,2
      stopsignal=TERM
      stopwaitsecs=10
      user=chrism
      redirect_stderr=false
      stdout_logfile=/a/path
      stdout_logfile_maxbytes=1MB
      stdout_logfile_backups=10
      stdout_capture_maxbytes=1MB
      stderr_logfile=/a/path
      stderr_logfile_maxbytes=1MB
      stderr_logfile_backups=10
      stderr_capture_maxbytes=1MB
      environment=A=1,B=2
      serverurl=AUTO
      ''command に環境変数まで書いてしまうミスをたまに見かけるが、環境変数は environment に設定する。''
  • ''include'' セクション
    外部設定ファイルのパス設定。
    ''files''外部設定ファイル名、スペース区切り、ワイルドカード指定も可能
    • sample
      [include]
      files = /an/absolute/filename.conf /an/absolute/*.conf foo.conf config??.conf
  • ''group:x'' セクション
    プロセスグループの設定。管理対象プロセスをグループ化して管理できる。
    ''programs''グループに属するプログラムの指定、カンマ区切り
    priority起動/終了の優先順位、値が小さいほど先に開始し、後に終了する(デフォルト 999)
    • sample
      [group:foo]
      programs=bar,baz
      priority=999
  • ''evantlistener:x'' セクション
    イベントリスナーの設定。例えば、プロセスが落ちたらメール通知などのイベントリスナーを設定したりできる。
    まだ調査中。。。
  • ''rpcinterface:x'' セクション
    RPCインターフェースの設定。supervisorctl を使う場合は設定必須。基本的には以下のように設定しておけば良い。
    rpcinterface:xRPCインタフェースのファクトリ関数のエントリーポイントを指定
    • sample
      [rpcinterface:supervisor]
      supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface
  • sample
    上述の各セクションをまとめた設定例を示す。
    ## supervisord.conf
    [supervisord]
    user = supervisor
    logfile = /var/log/supervisord/supervisord.log
    logfile_maxbytes = 10MB
    logfile_backups = 3
    loglevel = info
    pidfile = /var/run/supervisord/supervisord.pid
    nodaemon = false
    
    [inet_http_server]
    port = rest-term.com:9001
    username = myuser
    password = myuserpassword
    
    [supervisorctl]
    user = supervisor
    serverurl = http://rest-term.com:9001
    
    [include]
    files = supervisord.d/program.conf
    
    [rpcinterface:supervisor]
    supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface
    
    ## supervisord.d/program.conf
    [program:resweb]
    command = /usr/local/sbin/resweb
    environment = RESWEB_SETTINGS=/usr/local/etc/resweb_settings.py
    user = supervisor
    group = wheel
    numprocs = 1
    stdout_logfile = /var/log/supervisord/resweb_stdout.log 
    stdout_logfile_maxbytes = 1MB
    stdout_logfile_backups = 3
    stderr_logfile = /var/log/supervisord/resweb_stderr.log
    stderr_logfile_maxbytes = 1MB
    stderr_logfile_backups = 3
    autostart = true
    autorestart = true

logging

  • ログレベル
    ログレベルは7段階。デフォルトは info になっている。
    ''critical/error/warn/info/debug/trace/blather''
    • sample
      2007-09-08 14:43:22,886 DEBG 127.0.0.1:Medusa (V1.11) started at Sat Sep  8 14:43:22 2007
             Hostname: kingfish
             Port:9001
      2007-09-08 14:43:22,961 INFO RPC interface 'supervisor' initialized
      2007-09-08 14:43:22,961 CRIT Running without any HTTP authentication checking
      2007-09-08 14:43:22,962 INFO supervisord started with pid 27347
      2007-09-08 14:43:23,965 INFO spawned: 'listener_00' with pid 27349
      2007-09-08 14:43:23,970 INFO spawned: 'eventgen' with pid 27350
      2007-09-08 14:43:23,990 INFO spawned: 'grower' with pid 27351
      2007-09-08 14:43:24,059 DEBG 'listener_00' stderr output:
       /Users/chrism/projects/supervisor/supervisor2/dev-sandbox/bin/python:
      can't open file '/Users/chrism/projects/supervisor/supervisor2/src/supervisor/scripts/osx_eventgen_listener.py':
      [Errno 2] No such file or directory
      2007-09-08 14:43:24,060 DEBG fd 7 closed, stopped monitoring <PEventListenerDispatcher at 19910168 for
      <Subprocess at 18892960 with name listener_00 in state STARTING> (stdout)>
      2007-09-08 14:43:24,060 INFO exited: listener_00 (exit status 2; not expected)
      2007-09-08 14:43:24,061 DEBG received SIGCHLD indicating a child quit
      debug 以下を指定するとプログラムのSTDOUT/STDERRなどもログに出力されるので開発時に有用。
  • Capture Mode
    Capture Mode
    プロセスのログ出力を検知して任意の処理を実行することができる。まだ調査中。。

supervisorctl

コマンドラインの管理ツール。supervisordや管理しているプロセスの起動/終了、ログの確認などが行える。

既存のプロセスの設定を変更した場合は、updateでプロセスの設定更新を忘れないように。

バックアップツール

ここではLinux OSで利用できるバックアップツールについて整理する。

  • 環境
    CentOS 5.x, Ubuntu 12.x (x86_64)

rdiff-backup

atodekaku

duplicity

librsync, gnupg が必要

  • SYNOPSIS
    duplicity [options] source_directory target_url
    duplicity [options] source_url target_directory
    duplicity full [options] source_directory target_url
    duplicity incremental [options] source_directory target_url
    duplicity restore [options] source_url target_directory
    duplicity verify [options] source_url target_directory
    duplicity collection-status [options] target_url
    duplicity list-current-files [options] target_url
    duplicity cleanup [options] [--force] target_url
    duplicity remove-older-than time [options] [--force] target_url
    duplicity remove-all-but-n-full count [options] [--force] target_url
    duplicity remove-all-inc-of-but-n-full count [options] [--force] target_url

atodekaku

ネットワーク関連

Linuxのネットワーク系コマンド関連のメモ
情報量が増えてきたので今後の更新はNetworkページで

tcpdump

tcpdump - ネットワークのトラフィックをダンプする
tcpdump [ -adeflnNOpqRStvxX ] [ -c count ] [ -F file ]
        [ -i interface ] [ -m module ] [ -r file ]
        [ -s snaplen ] [ -T type ] [ -w file ]
        [ expression ]

ネットワークインターフェースを通過するパケットを監視し、expression(評価式)にマッチしたパケットの概要を表示する。

  • オプション
    -A全てのパケットをASCII表示
    -c 数値指定した数のパケットを受信したら終了
    -Dtcpdump(8)でキャプチャできるネットワークインタフェース一覧を表示
    -e全てのパケットのリンクレベルヘッダを表示
    -F ファイル名評価式の入力に使用するファイルを指定
    -i インタフェース指定したネットワークインタフェースのパケットを監視
    -lバッファを標準出力にも出力
    -nアドレス、ポート番号の名前解決を行わない
    -Nホスト名のドメイン部分を表示しない
    -r ファイル名パケットを-wオプションで作成したrawファイルから読み込む
    -STCPシーケンス番号を相対値ではなく絶対値で表示
    -tダンプ表示に時間を表示しない
    -w ファイル名パケット解析を指定したファイルにrawで出力
    -x出力を16進数で表示
    -X出力を16進数とASCIIで表示
    expression与えられない場合はネットワークインターフェースを通る全てのパケットを出力
    • expression
      typehost/net/portを指定、デフォルトはhost
      dirsrc/dst/src or dst/src and dstを指定、デフォルトはsrc or dst
      protoip/ip6/arp/icmp/tcp/udpを指定
## 192.168.2.98:80にアクセスするパケットヘッダを16進数とASCIIで出力
$ tcpdump -i eth0 -X dst host 192.168.2.98 and dst port 80

Deprecated Linux networking commands

ネットワーク関連のdeprecate対象のコマンドとその代替コマンドについて。
参考: Deprecated Linux networking commands and their replacements
ifconfig や netstat など普段からよく利用しているものも含まれているので注意しておこう。基本的に ip コマンドひとつで置き換えできそう。

NFS (Network File System)

以下、CentOS 6でのNFSv4サーバ構築手順を整理する。

  • NFS関連パッケージのインストール (共通)
    $ sudo yum install nfs-utils.x86_64 
    依存パッケージとして rpcbind なども一緒にインストールされる。
  • rpcbind, nfsサービスの起動 (サーバ)
    $ sudo service rpcbind start
    Starting rpcbind:                                          [  OK  ]
    $ sudo service nfs start
    Starting NFS services:                                     [  OK  ]
    Starting NFS quotas:                                       [  OK  ]
    Starting NFS mountd:                                       [  OK  ]
    Starting NFS daemon:                                       [  OK  ]
  • rpcbind, nfsサービスの自動起動設定 (サーバ)
    $ sudo chkconfig rpcbind on
    $ sudo chkconfig nfs on
  • 公開ディレクトリの設定 (サーバ)
    /etc/exports に公開するディレクトリやマウントを許可するIPなどを記述する。
    /mnt/data 192.0.1.0/24(rw)
  • 設定を反映し、公開状態の確認 (サーバ)
    $ sudo exportfs -ra
    $ sudo exportfs -v
    /mnt/data       192.0.1.0/24(rw,wdelay,root_squash,no_subtree_check)
  • rpcbindサービスの起動 (クライアント)
    $ sudo service rpcbind
    Starting rpcbind:                                          [  OK  ]
  • 公開ディレクトリをNFSマウント (クライアント)
    $ sudo mount -t nfs4 192.0.1.13:/mnt/data /mnt/data
  • マウント状態を確認 (クライアント)
    $ mount -t nfs4
    192.0.1.13:/mnt/data on /mnt/data type nfs4 (rw,addr=192.0.1.13)

RHEL 6.x系以前で利用していた portmap は削除され、6.x系では rpcbind に集約されている。NFSv4はファイアウォールを通過してインターネット上で動作するため(TCPが必須となる)、実は rpcbind サービスは不要。iptablesが有効な場合はTCPポート 2049を開放しておくのを忘れないように。

無線LAN

  • 環境
    Ubuntu 14.04 LTS (kernel: 3.13.0-24-generic)
    BUFFALO WLI-UC-GNM
 750x499

最近のLinuxは無線LAN環境を比較的簡単に構築できる。まずはLANの無線子機を接続してOSから認識されるか確認。

lsusblsusb is a utility for displaying information about USB buses in the system and the devices connected to them.
iwconfigconfigure a wireless network interface
iwlistGet more detailed wireless information from a wireless interface
wpa_supplicantWi-Fi Protected Access client and IEEE 802.1X supplicant
$ lsusb
Bus 002 Device 003: ID 0411:01a2 BUFFALO INC. (formerly MelCo., Inc.) WLI-UC-GNM Wireless LAN Adapter [Ralink RT8070]

iwconfig コマンドは無線LANインタフェースの状態を表示、設定する。引数を与えない場合はネットワークインタフェースの無線情報を表示する。

$ iwconfig
eth0      no wireless extensions.

lo        no wireless extensions.

wlan0     IEEE 802.11bgn  ESSID:off/any
          Mode:Managed  Access Point: Not-Associated   Tx-Power=20 dBm
          Retry  long limit:7   RTS thr:off   Fragment thr:off
          Power Management:on

iwlist コマンドでアクセスポイントの検知を行うには scan サブコマンドを指定する。

$ iwlist scan
eth0      Interface doesn't support scanning.

lo        Interface doesn't support scanning.

wlan0     Scan completed :
         Cell 01 - Address: 00:1D:73:EF:E2:4C
                   Channel:10
                   Frequency:2.457 GHz (Channel 10)
                   Quality=61/70  Signal level=-49 dBm
                   Encryption key:on
                   ESSID:"PISCES"
                   Bit Rates:1 Mb/s; 2 Mb/s; 5.5 Mb/s; 11 Mb/s
                   Bit Rates:6 Mb/s; 9 Mb/s; 12 Mb/s; 18 Mb/s; 24 Mb/s
                             36 Mb/s; 48 Mb/s; 54 Mb/s
                   Mode:Master
                   Extra:tsf=0000012dd9943df5
                   Extra: Last beacon: 31424ms ago
                   IE: Unknown: 0006504953434553
                   IE: Unknown: 010482848B96
                   IE: Unknown: 03010A
                   IE: Unknown: 2A0100
                   IE: Unknown: 2F0100
                   IE: IEEE 802.11i/WPA2 Version 1
                       Group Cipher : TKIP
                       Pairwise Ciphers (1) : TKIP
                       Authentication Suites (1) : PSK
                   IE: Unknown: 32080C1218243048606C
                   ... 省略

ここではGUIから指定のアクセスポイントに接続したが、wpa_supplicant コマンドを利用した接続方法も後で試す。

システム管理

  • 環境
    CentOS 7.x (x86_64) , Ubuntu 14.04 LTS (x86_64)

起動関連

/etc/default/grub でCUI/GUIを切り替えることが出来る。(Ubuntuの場合)

GRUB_DEFAULT=0
GRUB_HIDDEN_TIMEOUT=0
GRUB_HIDDEN_TIMEOUT_QUIET=true
GRUB_TIMEOUT=10
GRUB_DISTRIBUTOR=`lsb_release -i -s 2> /dev/null || echo Debian`
GRUB_CMDLINE_LINUX_DEFAULT="quiet splash"  ## GUIモード
#GRUB_CMDLINE_LINUX_DEFAULT="text"         ## CUIモード
GRUB_CMDLINE_LINUX=""

編集が完了したらGRUBを更新するのを忘れずに。

$ sudo update-grub
Generating grub configuration file ...
Warning: Setting GRUB_TIMEOUT to a non-zero value when GRUB_HIDDEN_TIMEOUT is set is no longer supported.
Linux イメージを見つけました: /boot/vmlinuz-3.13.0-24-generic
Found initrd image: /boot/initrd.img-3.13.0-24-generic
Found memtest86+ image: /boot/memtest86+.elf
Found memtest86+ image: /boot/memtest86+.bin
完了

systemd

RHEL 7.x系から導入されたシステム管理デーモン(systemd,journald等)、ユーティリティツール(systemctl,journalctl等)。

  • ユニットファイル
    systemdは従来のサービス起動スクリプトの代わりにユニットファイルというものを作成する。
    ユニットファイル例 (/usr/lib/systemd/system/daemon-test.service)
    [Unit]
    Description=daemon test
    
    [Service]
    ExecStart=/path/to/daemon-test.py
    ExecStop=/usr/bin/kill -TERM $MAINPID
    Restart=always                                                                                                                                                                                     
    Type=simple
    
    [Install]
    WantedBy=multi-user.target
    内容は見ればだいたいわかると思うけど設定項目については後で整理する。
  • ユーティリティ
    サービス管理は従来の service コマンドに代わって systemctl コマンドを利用する。
    atodekaku
    また、ログはjournaldが管理しており、journalctl コマンドで確認できる。
    $ journalctl -u daemon-test

systemdは設計思想がUNIX哲学に反しているという理由から過去にいろいろと論争があったらしいが、僕自身はその世代から少し外れているので詳細はよく知らない。systemdに対する批判も少なくないようなので、歴史的な背景も含めて調べておきたい。systemdは少なくとも表面的には便利な仕組みに見えているのだけど。

firewalld

RHEL 7.x系から導入されたファイアウォール管理ツール。
atodekaku

swapの拡張

単一ファイルをスワップ領域として利用できるように設定する。

## 任意の名前、サイズのファイルを作成する
$ sudo dd if=/dev/zero of=/newswap bs=1024 count=128000
128000+0 records in
128000+0 records out
131072000 bytes (131 MB) copied, 1.7639 seconds, 74.3 MB/s

## 作成したファイルをswap領域として利用できるように変換する
$ sudo mkswap /newswap
mkswap: /newswap: warning: don't erase bootbits sectors
       on whole disk. Use -f to force.
Setting up swapspace version 1, size = 127996 KiB
no label, UUID=91588fb6-ac01-47f6-bb42-064c1c7c4599

## もし既にswap領域が存在する場合は一時的に外しておく
## swap内のデータはメモリに書き出されるのでメモリ残容量に注意
$ sudo swapoff /dev/vda2
## 作成したファイルをswap領域としてシステムに追加設定する
$ sudo swapon /newswap

設定したswap用ファイルをOS再起動時に自動でマウントするように /etc/fstab を編集する。

/newswap    swap    swap   defaults 0 0

sudo

  • secure_path
    /etc/sudoers の env_keep にPATHを追加しても引き継がれない場合は ''secure_path'' が設定されているか確認する。これはCentOS 5.x系では存在していない。
    Defaults    secure_path = /sbin:/bin:/usr/sbin:/usr/bin
    これをコメントアウトするのは良くないはずなので、/usr/local/bin とか必要最低限のPATHのみを追加するのが良いと思う。
  • always_set_home
    /etc/sudoers 内で ''always_set_home'' が設定されている場合は変身対象ユーザのホームディレクトリにセットされるので注意(つまりsudoで$HOMEは引き継がれない)。

package-clearnup (yum-utils)

OSアップデート後の古いパッケージ削除などを安全に行うためのユーティリティツール。/bootの容量が少なくなってカーネルアップデートに失敗するようになったら利用すると良い。

Usage:
    package-cleanup: helps find problems in the rpmdb of system and correct them

    usage: package-cleanup --problems or --leaves or --orphans or --oldkernels
## yum-utils パッケージをインストールする
$ sudo yum install yum-utils
## oldkernels オプションを付けると古いカーネルを削除してくれる
## count オプションを付けると最新N個のカーネルを残す
$ sudo package-clearnup --oldkernels --count=2

ただし、2.6系から3.1系へのカーネルアップデートをした際、2.6系のカーネルを残しておくと、他のrpmパッケージ(カーネルに依存するgrubbyパッケージ等)の更新で失敗することが多いので注意。

/etc/tmpfiles.d

CentOS7.x系では /run ディレクトリがtmpfsにマウントされているため、OSを再起動すると/run (=/var/run)に置かれたファイルは全て削除される。PIDファイルを /run 配下に置いている場合は注意。ここで、/etc/tmpfiles.d 配下に設定ファイルを作っておくと、OS起動時に指定したディレクトリが自動的に作成される。

$ cat /etc/tmpfiles.d/nginx.conf
d /run/nginx 0755 root root

/usr/lib/tmpfiles.d 配下に既存の設定ファイルが置かれているので参考に。

その他

GCC

最適化オプションの確認。比較的新しいGCC(4.4以降?)では -Q オプションを利用することにより、有効化される最適化オプションを確認することができる。

## 例) -march=native を付けた時に有効化されるオプションを確認
$ gcc -Q --help=target -march=native
... 省略
 -msse                                 [enabled]
 -msse2                                [enabled]
 -msse2avx                             [disabled]
 -msse3                                [enabled]
 -msse4                                [enabled]
 -msse4.1                              [enabled]
 -msse4.2                              [enabled]
 -msse4a                               [disabled]
 -msseregparm                          [disabled]
 -mssse3                               [enabled]
... 省略

Python 2.x

gccがバージョン別に複数インストールされている場合は使いたい方を明示しよう。Unicodeの扱いはUCS-4でコンパイルした方が良い。

configureオプション

./configure --prefix=/usr/local/python-2.7.5 --enable-shared --enable-unicode=ucs4 CC=/usr/bin/gcc44 CXX=/usr/bin/g++44

makeするといくつかのモジュールが組み込めないと警告される(エラーではない)。

Python build finished, but the necessary bits to build these modules were not found:
_tkinter           bsddb185           dl
gdbm               imageop            readline
sunaudiodev
To find the necessary bits, look in setup.py in detect_modules() for the module's name.

必要なものは入れておこう。もし上記リスト内に _ssl モジュールが挙げられていたら openssl-devel を入れておくこと。HTTPS通信を行うためには必要。

$ sudo yum install openssl-devel.x86_64

また、readline はCUIでの各操作が多い場合は入れておくことをオススメ。

$ sudo yum install readline-devel.x86_64
  • SciPyのインストール
    pipでSciPyをインストールするにはBLASとLAPACK, NumPyが環境にインストール済みな必要がある。
    ## BLAS/LAPACK/ATLASのインストール
    ## ATLASはBLAS実装のひとつでリファレンス実装(CBLAS)より最適化されている
    $ sudo yum install blas-devel.x86_64 lapack-devel.x86_64 atlas-devel.x86_64
    ## NumPyのインストール
    # sudo pip numpy
    ## SciPyのインストール
    $ sudo pip install scipy
    コンパイル時間は長いので気長に待とう。

CMake

最近はOpenCVやMySQLなどビルドにCMakeを利用するプロダクトも増えてきた。しかし、yumで入るCMakeのバージョンはremiでもrpmforgeでも古いのでソースからコンパイルしてインストールする必要に迫られるかもしれない。

OpenSSL

SSL関連については別ページに整理する。

その他メモ

  • 改行コード変換
    trコマンドを利用する。
    ## CRLF(Windows) -> LF(Unix)
    $ tr -d '\r' <windows.txt >unix.txt
  • ターミナル起動
    Ubuntu (Unity) では「Ctrl」+「Alt」+「T」で起動できる。