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 にチェックを入れておくこと。

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 が無事だからこんなテキトーなことしているが、普通は最初にデータ救出しましょう。

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
効果: なし

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
コマンド実行後、右プロンプトを消す。コピペしたい時に便利。

ufw の kern.log への出力を抑制する

/etc/rsyslog.d/20-ufw.conf で、 #&~ と書かれている行のコメントアウト「#」を消す。
rsyslog を再起動。
デフォルトのままで、/var/log/ufw.log にログは出ているので、そっちを見れば問題なし。

AWSについてメモ書くよ

ここに追記していく。まとまったら、またapacheの時みたく整理して記事にし直すかも。

Apache の設定 その1

/home/hoge/public_html を DocumentRoot とする時、/home/hoge が標準で 700 のため、403 が返る。
vhost を使う場合、httpd.conf の NameVirtualHost *:80 を生かして VirtualHost ディレクティブを書けば動く。
未指定の vhost を殺すには、ServerName any でデフォルト設定が書けるので、Order deny,allow かつ deny from all とする。
不要モジュール等については後日。

Amazon Linux の設定とか

sudo がパスワード無しで動いてしまう。そもそも、visudo で権限付与を見てもデフォルトユーザの ec2-user に sudo 権限ついてないしおかしい…
と思ったら、/etc/sudoers.d/cloud-init に記載されていたよ。
NOPASSWD: というのを消せば、パスワードを要求されるようになる。

httpd がサーバの OS とか apache のバージョンとか垂れ流してしまう。
ServerTokens OS の行をコメントアウトし、ServerSignature は Off とする。

まずは使い始め

AWS で Amazon Linux のインスタンスを作ってみる。
yum でパッケージ管理してるし CentOS チックだなーって思いながら apache の設定とか調べ中。
なんだこれ…

  • /etc/httpd 配下かよ
  • a2enmod とか a2ensite とかないの?どうやって有効化するの?

とか初見殺しの山。
なんか調べてみると、とにかく httpd.conf に書きまくっている感じ。debian も昔はこんな感じだった記憶があるなぁ。CentOS は今でもこうなのか。
いらん設定を消していかなければいかんらしい。

モジュールはともかく、vhost のディレクティブはまっさらから綺麗に書きたい衝動にかられる。
DocumentRoot とかベタに書くのやーめーてー

CentOS を使う

とあるプロダクトの動作保証環境の関係で、CentOS に手を出すことになった。
そのプロダクトの指定は、CentOS 5.7 なのだが、そんなものは、手に入らない。
とりあえず CentOS 公式から落とせる 5.9 を簡易インストールした。

ubuntu との差分はこんな感じ。
インストールできるパッケージが古かったり少なかったりして、あんま使えない。
パッケージ管理は yum/rpm
yum makecache (apt-get update 相当) が一般ユーザにもできる。
パッケージのバージョン違いのためか、動作が違う。(sudo は、-E オプションをつけないと、sudo 前のユーザの環境変数を引き継いでくれないなど)

これは、使いにくい…

mysql 設定メモ

追記2
mysql のデータファイルを別パーティションにうつしたので追記。
例えば、/path/mysql に移すことにする。

# service mysql stop
# mv /var/lib/mysql /path/mysql
# vi /etc/mysql/my.cnf
- datadir = /var/lib/mysql
+ datadir = /path/mysql
# vi /etc/apparmor.d/local/usr.sbin.mysqld
+ /mnt/mysql/ r,
+ /mnt/mysql/** rwk,
# service apparmor restart

↑し忘れてもちゃんと動いたので、必要かは不明、いちおう後でやっといた

# service mysql start

なお、UNIX ソケットファイル socket = hogehoge を ramdisk とか早いディスクに移しても意味がないらしい。ファイルを実際に read/write するわけではないから、だそうな。

追記
mysql を 5.5 にして、チューニングしたので追記。
詳しくは、これだけはやっておきたいMySQL 5.5系の設定 - uehatsu's tech blog

character-set-server    = utf8
skip-character-set-client-handshake
default-storage-engine  = InnoDB
collation-server        = utf8_general_ci
innodb_file_format      = Barracuda
innodb_file_per_table   = 1
innodb_use_sys_malloc   = 0

先のページの通りだとエラーが出るので、default-storage-engine はIとDBをキャピタルに。(というか、5.5系ではもともと、InnoDB がデフォルトらしいので、不要っぽい)
また、innodb の独自ヒープを使えないよ、というエラーがなんか出て気持ち悪いので、innodb_use_sys_malloc=0 を追加した。

手順

  1. バックアップ。
    # mysqldump -u USER -p --opt DBNAME --net_buffer_length=8000 | gzip > GZIPFILE

    オプションの順番はテキトー

  2. DB削除。
    上の手順で--opt をつけていれば、drop table は関係ない。
    どこまでやるかは、どれだけスッキリしたいかで変えれば良いと思う。
    mysql の該当テーブルを消す。(drop table TBLNAME;)
    データベースごと消すのもあり。(drop database DBNAME;)
    mysql を完全に消すのもあり。(apt-get purge mysql-hogehoge、hogehoge は、色々あるやつ全部)
  3. mysql 5.5 を入れる。
  4. 設定変更。
    /etc/my.cnf へ追記する内容。

    character-set-server=utf8
    skip-character-set-client-handshake
    default-storage-engine=innodb
    collation-server=utf8_general_ci
    innodb_file_format=Barracuda
    innodb_file_per_table=1
    
  5. mysql 設定反映と確認。
    # service mysql restart
    # mysql -p
    > show variables like 'inno%';
    
  6. mysql を purge した場合、php5-mysql も消えてるかも知れんので再インストール。
    # apt-get install php5-mysql
    # service apache2 restart
    
  7. リストア。
    mysql の初期設定とか、DB 作ったりとか、dump した sql ファイルの取り込みは下の旧エントリを確認のこと。

これで、もと通りのはず。
でも、CPU の非力なマシンなので、未展開の領域にアクセスした時、応答が恐しく遅くなる。
あんまり酷かったら、このオプション (Barracuda) は外すかも…

追記、ここまで。

apache2 の設定メモ の続編.
mysql の設定とか.

設定

  • # mysql_secure_installation

    で初期設定.基本,全部 Y で良い.root パスをインストール時からイチイチ変えるのがメンドイ時は,最初だけn.

  • 全てのユーザー情報が削除されているため,root ログインのみ可能.

    # mysql -u root -p
  • ユーザの追加.
    grant all privileges on databasename.* to username@localhost identified by 'password';
    show grants for username@localhost;
    flush privileges;
    
  • ユーザーの DB を作成.
    $ mysql -u username -p
    > create database databasename;
    
  • データ移行.
    $ mysql -u username -p databasename < sqlfile

その他のtips

/etc/my.cnf の [mysqld] ディレクティブに

character-set-server    = utf8
collation-server        = utf8_general_ci

を追記すると、サーバー文字コードは変更可能
DB文字コードは、mysqlクライアント内で目的のDBに接続して、

alter database DBNAME character set utf8;

文字コードの調べ方は、
mysql クライアント内で

> status

または、

> show variables like "chara%";

1行が長すぎてエディットが難しいときは、

# mysqldump -u USERNAME -pPASSWD --opt --default-character-set=utf8 DBNAME --net_buffer_length=8000 | gzip > sql.gz

としてやれば、1行毎の文字数が 8,000 文字以下となるよう出力してくれる。

ダンプした sql ファイルの取り込みは、クライアントから

> source SQLFILE;

テーブルの文字コードを調べるには、show create table TBNAME; でテーブル作成コマンドを見る。
同じように、show create database DBNAME; でデータベース作成コマンドも見れる。