debian で DHCP サーバ

NTT の HGW の DHCP 機能がイケてないので、自分で立てた。
不満は、DHCP が配信するオプションを指定できないこと。
自分で立てた DNS を HGW が引こうとすると引けず、ローカル DNS の設定が反映されない日々が続き、嫌気が差したのであった。

やることは簡単。

# apt-get install isc-dhcp-server

このままだとエラーが出るので、更に設定ファイルを変更する。
authoritative; のコメントを外す。
log-facility を local7 とかにして、ログ出力先を制御するのもあり。
rsyslog.conf で cron.* とかが並ぶところに、local7.* と書き、出力したいパスを指定する。
最後に、rsyslog を再起動するのと、isc-dhcp-server を再起動するのを忘れないように。

サブネットの設定は、例えば以下みたくガッツリ書く。

subnet 192.168.x.0 netmask 255.255.255.0 {
    option broadcast-address    192.168.x.255;
    option routers              192.168.x.1;
    option subnet-mask          255.255.255.0;
    option domain-name          "yourdomainname.com";
    option domain-name-servers  192.168.x.y, 192.168.x.z;
    range                       192.168.x.51 192.168.x.100;
}

クラスCの場合は、例えばこんな感じ。
なお DNS の設定は、BIND9 で DNS サーバ とかを見て設定すること。

Redmine を debian wheezy に入れる

やってみたよ。

  1. mysql を入れる。→ 過去記事を参照( mysql 設定メモ
  2. パッケージを入れる。
    $ sudo apt-get install ruby ruby-rails-3.2 rubygems ruby-dev \
    > libmysqlclient-dev libapache2-mod-passenger
    
  3. gem で Ruby のパッケージ?(gem)を入れる。
    $ sudo gem install mysql2 -- --with-mysql-lib=/usr/lib/mysql
    $ sudo gem install bundler
    
  4. Redmine ディレクトリへ移動し、種々のローカル gem を入れる。
    なんか、上と同じように root で入れてもいい気がしてきたが、Redmine の公式を参考に、何となくフィーリングでローカルに入れた。

    $ bundle install --without development test rmagick postgresql sqlite
    
  5. mysql のユーザを作成。
    > grant all privileges on DBNAME.* to 'DBUSER'@'localhost';
    > create user 'DBUSER'@'localhost';
    
  6. パスワードを設定のため,パスワード設定するSQL文を書いたsqlファイルを作成.
    set password = password('PASSWORD')
    

    コマンドラインからパスワードセット.

    $ mysql -u DBUSER < passwd.sql
    

    当該ユーザでDB作成.

    $ mysql -u DBUSER -p
    > create database DBNAME character set utf8;
    
  7. config/database.yml.example を database.yml として編集。
    production:
      adapter: mysql2
      database: DBNAME
      host: localhost
      username: DBUSER
      password: DBPASS
    
  8. あとはまぁ、redmine 公式の通りに。
    $ rake generate_secret_token
    $ RAILS_ENV=production rake db:migrate
    $ RAILS_ENV=production rake redmine:load_default_data
    

    最後のコマンドを実行すると言語を聞かれるので、日本語なら ja を入力。

  9. 更に公式に従って、
    $ mkdir tmp public/plugin_assets
    $ sudo chown -R nobody files log tmp public/plugin_assets
    $ sudo chmod -R 755 files log tmp public/plugin_assets
    

    nobody を使うのは、passenger をデフォルトで動かす(PassengerDefaultUser を指定しない)場合。

  10. /etc/apache2/sites-enabled/ の指定ファイルで、VirtualHost の設定をする。
    DocumentRoot は、 /path/redmine/public
  11. apache2 を再起動すれば、OK。なんか初回アクセスはちょっと重かった。

初期データの管理者&パスワードは、admin

スマホアプリの RedminePM からアクセスするには、basic 認証にした上で、Setting > Authentication > Enable REST web service にチェックを入れておくこと。

MS Office PowerPoint 2010 でフォント設定のダイアログを表示

PPT2007 までは、プレースホルダのダイアログを開いて、欧文フォントと和文フォントを個別に変更するなどの操作ができた。
PPT2010 では、スライドマスタの編集画面でプレースホルダを右クリックしても「フォント」というメニューが出てこない。
その場合、リボンの「ホーム」にある「フォント」の右下(下図の赤○の部分)をクリックすると表示できる。

PPT 2010 フォントダイアログ
PPT 2010 フォントダイアログ

HDDが飛んだ

debian から USB3.0 経由でマウントして使っている HDD が飛んだ。
最近、smartctl から無理くり S.M.A.R.T. 情報を引いていたことの祟りではないかという気もするが、ともかくバックアップ用 HDD が飛んで心配なので、すぐに新しい HDD を手配する。

で、どうせアクセスできないので、この HDD は遊んでみることにする。

mount しながら kern.log を見ると、たまにエラーを吐く。毎回じゃないのが謎。
最初に出たエラーはこれ。
warning: mounting fs with errors, running e2fsck is recommended
言われるがまま、e2fsck するも no error だった。
んじゃスキャンするか、と思って

dd if=/dev/sdb1 of=/dev/null bs=64k

するが、たまに飛ばしていた kill -USR1 への応答がなくなり、9GB 目前で突然、停止。
その時に出たのがこの2種類のエラー。
end_request: critical target error, dev sdb, sector 1598034432
と、
end_request: I/O error, dev sdb, sector 1598034448
なおエラーセクタの番号は、アクセスする度に違う数が出る。

次に、S.M.A.R.T. 情報はこんな感じ。
笑える。

ID# ATTRIBUTE_NAME          FLAG     VALUE WORST THRESH TYPE      UPDATED  WHEN_FAILED RAW_VALUE
  1 Raw_Read_Error_Rate     0x002f   200   200   051    Pre-fail  Always       -       10260
  3 Spin_Up_Time            0x0027   163   144   021    Pre-fail  Always       -       8833
  4 Start_Stop_Count        0x0032   100   100   000    Old_age   Always       -       978
  5 Reallocated_Sector_Ct   0x0033   109   109   140    Pre-fail  Always   FAILING_NOW 726
  7 Seek_Error_Rate         0x002e   200   200   000    Old_age   Always       -       0
  9 Power_On_Hours          0x0032   086   086   000    Old_age   Always       -       10447
 10 Spin_Retry_Count        0x0032   100   100   000    Old_age   Always       -       0
 11 Calibration_Retry_Count 0x0032   100   100   000    Old_age   Always       -       0
 12 Power_Cycle_Count       0x0032   100   100   000    Old_age   Always       -       438
192 Power-Off_Retract_Count 0x0032   200   200   000    Old_age   Always       -       19
193 Load_Cycle_Count        0x0032   200   200   000    Old_age   Always       -       943
194 Temperature_Celsius     0x0022   113   093   000    Old_age   Always       -       39
196 Reallocated_Event_Count 0x0032   001   001   000    Old_age   Always       -       715
197 Current_Pending_Sector  0x0032   199   197   000    Old_age   Always       -       539
198 Offline_Uncorrectable   0x0030   200   199   000    Old_age   Offline      -       0
199 UDMA_CRC_Error_Count    0x0032   200   200   000    Old_age   Always       -       1
200 Multi_Zone_Error_Rate   0x0008   156   001   000    Old_age   Offline      -       8920

これでも、5回に1回くらいはアクセスが成功するから不思議なものだ。
なお今回は旧バックアップを最近とっているうえ、オリジナルの HDD が無事だからこんなテキトーなことしているが、普通は最初にデータ救出しましょう。

管理者ユーザ名の変更

wordpress が、ハッキング集団によりクラックされているようなので、対策をちょこっとだけしてみる。
もともと、管理者ユーザの slug を変更することはしていたが、ユーザ名がデフォルトの「admin」だったので、変えた。
ユーザを新しく作る方法だとユーザIDが変更されてしまうため、sql で DB を直接編集することにした。

> update PREFIX_users set user_login = 'NEWUSERNAME' where ID = IDnumber;

ついでにパスワードも記号の混じったものに変更した。
wordpress でパスワードに使える記号の一覧が得られなかったので、これまた DB を直接編集して書き込むことにした。
私が使っている記号群は、認証は通った。

> update PREFIX_users set user_pass = MD5('NEWPASSWORD') where ID = IDnumber;

ID は簡単に bruteforce attack で割り出されてしまうので、凝ったことはしていない。

あとは、admin でログイン仕掛けて来た PC に zip 爆弾でも返したいところ。
まだやってないけど。

SMART 情報が引けない

USB 3.0 対応 HDD ケース『GW3.5AX2-SU3』と Renesas の USB 3.0 オンボードコントローラの組で WD の HDD を接続している。
windows では smart 情報を引けたのだが、ubuntu でも debian でも smartmontools で smart 情報を引けずに苦労していた。
USB ドライバまわりや、smartctl -d で指定するドライバに usb まわりを指定していたのだが…

# smartctl -a -d sat /dev/sdX

で引けることが分かった。
そーなのかー

これで外出先から HDD の温度を観測できるぜ。

sshd の response が遅い

前提

  • 公開鍵認証を行なっている。
  • クライアントは putty
  • ユーザ名は空欄でアクセス
  • ユーザ名の入力フィールドが出るまでに5秒かかる
  • ユーザ名を入力してから認証完了までに5秒かかる
  • OSはdebian
  • ufw は有効
  • ポートは 22 から変更している
  • クライアントとサーバは Gigabit eather で接続
  • ubuntu server で同じ設定で運用していた時は高速であった
  • DNS を立ててないなど、サーバの機能も変更しているので、切り分けが必要

対策1: UseDNS off
効果: ユーザ名入力後の response は高速になった。

対策2: AddressFamily inet
効果: なし

mysql のログ

一般クエリログ、スロークエリログ、バイナリクエリログ、エラーログ、があるらしい。
エラーログは、意識しなくても標準で吐くようになっていることが多いと思う。
設定は my.cnf で行なうとして、設定方法はぐぐってもらうとして、各ログについて調べた内容とか自分の運用で知ったことをメモっておく。

エラーログ
mysql のエラー出力をログっているっぽい。
普通に稼動していると、起動時と停止時のログしか出てこない。
なんかエラー起こすとログに残るけど、その直前に実行されていた SQL 文とかサッパリ不明。
ざっと 1ヶ月くらい運用していて、サーバが DB エラーで 3 回~ 4 回くらい停止したのだけれど、クラッシュしたよ、ってメッセージしか残ってなくて原因がワケワカメ。
だみだこりゃ。
一般クエリログ
発行された全SQL文を残すらしい。これをオンにして再起動かけたら、一発でログのサイズが 6KB, 100行以上 とかになる。
これを吐きながら、月に 3回程度のエラーを待つのは容量の面やいざエラーが起こった時の解析量から見て面倒くさい。
多分、最後の手段。
スロークエリログ
インデックスを使わなかったクエリ、とか 1回の実行に○秒以上要したクエリ、とかを残せる。
中期的に観察するのに、ログを間引くのにはいいかも。でもこれで原因が特定できなかったら一般エラーログに託すことになるんだろーなー。
ちゃんとインデックスを作ってないと、めっちゃログ出るっぽい。

なんかインデックスを適切に作るには、explain select ほげほげ って感じでやるらしい。
ログ見て、特定のsql文が沢山出てきたら、ちゃんと調べよう。

バイナリログ
トランザクションとかの情報らしくって、DB のレプリケーションとか、復元後、最新状態までロールフォワードしたりするのに使われるらしい。
ファイル出力の設定が my.cnf にコメントアウト状態で書かれているけど、web で調べると DB 内に溜まったバイナリログを見たり消したりする方法が出てくる。
そも、他のログも DB 内に溜められるはずだけど。
まー個人運用レベルでは必要なさげ。例えば我が家では、定期的に mysqldump して、別 HDD に書き出している。とりあえずうちの鯖くらいなら、これで良いと思う。

zsh カスタマイズ

zsh で引数つきの alias を設定するには、
function で関数を定義するほかない。

function rmCR() {
    if test $# -ne 2; then
        return 1
    fi
    if test $1 = $2; then
        return 1
    fi
    tr -d \\r <$1 >$2
}

例えばこんな感じ。

(ついでに、特殊変数のメモ。)

$#
引数の数
$1 .. $n
n 番目の引数
$@, $*
引数全部をスペース区切りで列挙。@ と * の違いは不明。
$$
そのコマンドが実行された時の PID。

(その他)

set -o
setopt で設定されるオプションの一覧と現在の設定状況。アンダーバーを入れても無視される。(例: setopt vi = setopt v_i )
setopt no...
setopt で on に設定したオプションの打ち消し。でも、setopt novi しても、vi モードは完全には解除されなかった。
setopt transientrprompt
コマンド実行後、右プロンプトを消す。コピペしたい時に便利。