ヘプタゴンの技術ブログ

サーバ/ネットワーク/linux/AWSとか青森を拠点でやってます

EC2でhostnameを固定する方法

気づけば、しばらく更新が止まっていました。。。

amazon linuxやCentOS公式AMIでは、
デフォルトのホスト名がIPベースで指定されます。
プロンプトがip-10-xxx-xxx-xxxで、
今どのインスタンスを触っているのか分からなくなりますよね。
(間違って違うインスタンスを・・・)

hostnameコマンドで指定してもrebootすれば元に戻ってしまうし、
/etc/hostnameを修正してもダメだしと諦めかけていましたが、
少し調べてみると
/etc/sysconfig/networkのHOSTNAMEを修正してrebootすればみたいです。
(前って、/etc/hostnameじゃなかったっけ??)

Dovecotでデフォルトドメインの設定

意外と日本語Docが少なかったので。

デフォルトドメインとは
smtpやpopなどの認証時にアカウントに@以降がない場合に、
自動的にドメインを補完してくれる機能です。

要は、デフォルトドメインに指定したドメインの認証では、
@前の部分だけで認証許可しますという設定ですね。

vpopmailとかCourierでは、デフォルトドメインと言いますが、
dovecotではdefault_realmと言うようです。

dovecot.confに以下を記載すれば、設定OKです。

auth_default_realm = hoge.com 

EC2でftpが接続出来ない場合の対処方法

ご存知の通りEC2にはプライベートIPアドレスが振られていて、
外部とはNATすることで通信している。

FTPでパッシブモードを使っているとクライアントには、
プライベートIPアドレスが返されてうまく通信が確立出来ずにエラーになってしまう。

パブリックIP(あるいはEIP)をクライアントに返答するように設定する必要がある。

■vsftpdの場合
vi /etc/vsftpd/vsftpd.conf
——————
pasv_address=x.x.x.x
——————

servece vsftpd restart

■proftpdの場合
vi /etc/proftpd.conf
——————
MasqueradeAddress xxx.xxx.xxx.xxx
——————

servece proftpd restart

 

Linuxでrootになれるユーザーを制限する

FreeBSDだとwheelグループ以外は
rootになれないようにデフォルトで設定されていますが、
linuxではパスワードさえわかれば一般ユーザーがrootになれます。

複数の一般ユーザーがログインするような環境では、
誰もがrootになれる(可能性がある)のは
セキュリティ上あまり好ましくないので、
特定のユーザー以外はsuできないような設定をしてみます。
環境はCentOS6ですが、他のlinuxでも同じ設定で実現出来そうです。

vi /etc/pam.d/su
—————–

auth required pam_wheel.so use_uid

auth required pam_wheel.so use_uid
—————–

設定はこれだけ。
wheelグループに属していないユーザー以外はsuが使えなくなります。
(suしようとしてもパスワードエラーになります。)

wheelグループ以外でsuできるグループを指定したい場合は、
—————–
auth required pam_wheel.so use_uid group=admin
—————–
で指定出来ます。

Inotifywaitでファイル/ディレクトリの変更を検知する

特定のファイルやディレクトリ内のファイルに追加、変更、削除等があった際に
通知出来るコマンドです。

CentOSの場合はepelからインストール出来ます。
ubuntuならaptitudeで普通に入ります。

yum --enablerepo=epel -y install inotify-tools

引数に監視したいファイル名を指定するだけです。

inotifywait /var/log/nginx/access.log

Setting up watches.
Watches established.
/var/log/nginx/access.log MODIFY

1回検知すると終了します。
オプションmを付けると終了せずに常駐します。

inotifywait -m /var/log/nginx/

Setting up watches.
Watches established.
/var/log/nginx/ MODIFY access.log
/var/log/nginx/ MODIFY access.log
/var/log/nginx/ MODIFY access.log
/var/log/nginx/ MODIFY access.log

 

オプションdでディレクトリを再帰的に監視出来ます。

inotifywait -mr /var/log/nginx/
Setting up watches. Beware: since -r was given, this may take a while!
Watches established.
/var/log/nginx/ MODIFY access.log
/var/log/nginx/ MODIFY access.log
/var/log/nginx/ MODIFY access.log
/var/log/nginx/ MODIFY access.log
/var/log/nginx/ MODIFY access.log

ファイルの変更をロギングしたり、
修正をトリガーに他のプログラムを動かすとか出来そうです。

EC2/EBSでLVMを含んだボリュームのスナップショットを復元

LVMを使っているEBSのスナップショットからボリュームを復元して、
インスタンスにアタッチすると、ボリュームは見えるのだけど、
そのままではマウントできません。

具体的には、
datavgというVG&datalvというLVをスナップショット前に作っていたんだけど、
/dev/datavg/datalvが見当たらないという状況になると思います。

ボリュームの状態を確認してみると、

pvdisplay
 --- Physical volume ---
 PV Name /dev/sdj2
 VG Name datavg
 PV Size 30.00 GiB / not usable 2.01 MiB
 Allocatable yes
 PE Size 4.00 MiB
 Total PE 7679
 Free PE 255
 Allocated PE 7424
 PV UUID xxxxxxxxxxxxxxxxxxxxxx

 vgdisplay
 --- Volume group ---
 VG Name datavg
 System ID
 Format lvm2
 Metadata Areas 1
 Metadata Sequence No 6
 VG Access read/write
 VG Status resizable
 MAX LV 0
 Cur LV 1
 Open LV 0
 Max PV 0
 Cur PV 1
 Act PV 1
 VG Size 30.00 GiB
 PE Size 4.00 MiB
 Total PE 7679
 Alloc PE / Size 7424 / 29.00 GiB
 Free PE / Size 255 / 1020.00 MiB
 VG UUID xxxxxxxxxxxxxxxxxxxxxx

lvdisplay
 --- Logical volume ---
 LV Path /dev/datavg/datalv
 LV Name datalv
 VG Name datavg
 LV UUID xxxxxxxxxxxxxxxxxxxxxx
 LV Write Access read/write
 LV Creation host, time ip-xx-xxx-xxx-xxx, 20xx-xx-xx xx:xx:xx +0000
 LV Status NOT available
 LV Size 29.00 GiB
 Current LE 7424
 Segments 1
 Allocation inherit
 Read ahead sectors auto

のように、PV/VG/LVは認識されているが、
LV StatusがNOT availableになっていると思います。

vgchangeあるいはlvchangeを使って、LV Statusを有効にします。

vgchange -ay

これですべてのLVが有効になるので、
あとはmountするなり、fsckするなりしてみてください。

Mysqlがテーブルロックされなくて困った話

元旦からバックアップ用のスクリプトを書いてたのですが、
mysqlを読み専用にしてバックアップを取ろうとしたのですが、
ロックが効いていない模様。。。

具体的には、

#!/bin/sh
:
mysql -u root -p"$_Mysql_Password" -e "flush tables with read lock;"
/bin/sh dbbackup.sh
mysql -u root -p"$_Mysql_Password" -e "unlock tables;"
:

と書いたのですが、3のところでどうやらロックされていない感じ。
コマンド単体で実行してみてもエラーもでない。

しばらくググったら、こんなのが。
http://www.mysql.gr.jp/mysqlml/mysql/msg/13772

セッション切れたらロックも外れちゃうのね。。。
とういうことで、以下のようにmysql内からシェルを実行するように変更。

#!/bin/sh
:
mysql -u root -p"$_Mysql_Password" -e "flush tables with read lock; system /bin/sh dbbackup.sh; unlock tables;"
:

これ知らなかった。。。(恥)

AWS/EC2でグローバルIPを確認する

EC2のインスタンスはprivateIPを使ってやり取りされるので、
OS上からは割当てられているglobalIPが何なのか分かりません。

もちろんElasticIP使っている環境でAPI使えば分かりますが、
APIToolsがインストールされてなかったり、
EIPを使っていなかったりなどの場合もあるので。。。

ただ単に $_SERVER[“REMOTE_ADDR”]を返すphpですが、
ip.heptagon.co.jp
にアクセスすれば分かるようにしました。

curl ip.heptagon.co.jp

でIP返します。

これだけだとつまらな過ぎるので、
シェルのプロンプト表示に組み込んでみました。

export PS1="[`curl ip.heptagon.co.jp 2> /dev/null`:\w]\\$ "

これで

[1.2.3.4:~]# cd /var/www/html/
[1.2.3.4:/var/www/html]# vi index.html

みたいになります。

気に入ったら、再ログインしても適用されるように.bashrcに書きましょう。

Linuxでメモリキャッシュを解放する

/proc/sys/vm/drop_cachesに値を書き込みことでメモリのキャッシュをクリアすることができます。
これで読み書きなどのベンチしたいときとかにいちいち再起動とかしなくて済みますね。

Linux 2.6.16以降で使えるようです。

echo 1 > /proc/sys/vm/drop_caches
ページキャッシュの解放

echo 2 > /proc/sys/vm/drop_caches
inodeとdentryの解放

echo 3 > /proc/sys/vm/drop_caches
ページキャッシュとinodeとdentryの解放

 dentryに関してはココが分かりやすかったです。

http://monoist.atmarkit.co.jp/mn/articles/1010/06/news107.html

Cstreamで書込速度をコントロールする

バックアップなどの処理でサービスに影響させないように、
niceやioniceなどを使ってみるけど、
うまく制御されているのかイマイチよくわからないので、
cstreamというのを使ってみました。
cstreamは、ファイルシステムのキャッシュを使わずに書き込んだり、
書き込みの帯域を制限できたり
デバイスへの書き込み処理の際にごにょごにょしてくれるもののようです。

レッドハット系のrpmはコチラから。

標準入力からcstream -t [速度/バイト] へ渡してあげれば良さそうです。

約500Mのsource_dirを圧縮してみましたが、
ほぼ設定値通りの速度で動いてくれました。

time tar zcfvp – source_dir | cstream -t 10000000 > /tmp.tgz
real 0m41.142s
user 0m25.514s
sys 0m1.760s

time tar zcfvp – source_dir | cstream -t 5000000 > /tmp.tgz
real 1m16.852s
user 0m22.593s
sys 0m1.056s