ソフトウェアエンジニア現役続行

雑多なことを綴ります

「dpkg-reconfigure tzdata」コマンドをバッチ処理

Ubuntuタイムゾーンを設定するときは「dpkg-reconfigure tzdata」コマンドを実行して、起動したインタラクティブウィンドウで Asia -> Tokyo を選択するのが良いのですが、chefなどバックグラウンドでバッチ処理で設定するときは、インタラクティブだと困ります。

そのときは以下のようにdpkg-reconfigureに「--frontend noninteractive」オプションを付けると良いです。

$ sudo echo Asia/Tokyo > /etc/timezone
$ sudo dpkg-reconfigure --frontend noninteractive tzdata

UbuntuでTimezoneを変更する方法

Ubuntuタイムゾーンを設定する方法を検索すると、主に以下の2通りが出てきます。

  1. 「cp /usr/share/zoneinfo/Asia/Tokyo /etc/localtime」コマンドを実行して再起動
  2. 「dpkg-reconfigure tzdata」コマンドを実行して、インタラクティブウィンドウが起動するので、Asia -> Tokyoを設定する

1ではなく2の方法で設定することをオススメします。

1だと、dpkg自体がこのタイムゾーン設定を覚えないため、のちのちapt-get upgradeなどで様々なパッケージがアップグレードされたときに、タイムゾーンの設定が戻ってしまいます。2だとそのようなことは起こりません。

 

 

cassandra を apt-get でインストール(debとdeb-srcはコマンドではない)

やり方は以下に書かれています。

http://wiki.apache.org/cassandra/DebianPackaging

 

が、以下を設定する方法が分からなかった。。。

deb http://www.apache.org/dist/cassandra/debian 11x main
deb-src http://www.apache.org/dist/cassandra/debian 11x main

 

上記の deb と deb-src はコマンドではありません。/etc/apt/sources.list に記載します。

ずっとFedoraを使っていて、Ubuntuは初心者だったので、理解に時間がかかりました。

 

Ubuntuフォーラムでも「debコマンドはどうやってインストールするの?」という私と同じような勘違いをしている方が多かったので、ここに記しておきます。

Can't locate local/lib.pm in @INC at ...

私の使っている Ubuntu 12.04 だけかも知れませんが、必ずCPANコマンド実行の一回目は「Can't locate local/lib.pm in @INC at...」というメッセージでエラー終了します。でもリトライすると成功します。初回時のエラーメッセージは以下のとおりです。

...

Checksum for /home/john/.cpan/sources/authors/id/A/AP/APEIRON/local-lib-1.008009.tar.gz ok
---- Unsatisfied dependencies detected during ----
----     APEIRON/local-lib-1.008009.tar.gz    ----
    ExtUtils::MakeMaker [build_requires]
Running make test
  Make had some problems, won't test
  Delayed until after prerequisites
Running make install
  Make had some problems, won't install
  Delayed until after prerequisites

Can't locate local/lib.pm in @INC (@INC contains:
    /home/john/perl5/lib/perl5
    /etc/perl
    /usr/local/lib/perl/5.14.2
    /usr/local/share/perl/5.14.2
    /usr/lib/perl5
    /usr/share/perl5
    /usr/lib/perl/5.14
    /usr/share/perl/5.14
    /usr/local/lib/site_perl
    /home/john/Desktop)
at /usr/share/perl/5.14/CPAN/FirstTime.pm line 1300.

気持ち悪いので調べたところ、CPANが利用するlocal::libがインストールされていないのが原因でした。Ubuntuなら以下のコマンドでインストールできることができます。

sudo apt-get install liblocal-lib-perl

または

sudo apt-get install cpanminus

以下のページを参考にしています。
http://stackoverflow.com/questions/16702642/cant-locate-local-lib-pm-in-inc-at-usr-share-perl-5-14-cpan-firsttime-pm

bindでゾーン転送の設定確認と手動適用

複数台のbind(DNSサーバー)を構築する場合、1台をマスターにして、残りをスレーブにするのが一般的です。そうすれば、マスターで設定したゾーンの設定が自動的にスレーブに反映されます。

「bind ゾーン転送」などで検索すると、方法が色々と出てきます。

ゾーン転送はすぐに行われるわけではなく、SOAレコードのRefresh値の頻度で行われます。1〜数時間が一般的です。となると、1) ゾーン転送の設定が正しく反映されているか確認したい、2) ゾーン転送を手動で即時に実行したい、というケースがあるので、方法を調べました。

1. ゾーン転送の設定確認

フォーマット:

$ dig @マスターサーバのIPアドレス ゾーン名 axfr

例:

$ dig @1.2.3.4 example.com axfr

2. ゾーン転送の手動適用

フォーマット:

$ rndc retransfer ゾーン名

例:

$ rndc retransfer example.com

run-parts --test で cronスクリプトが動くかテスト

結論から言うと、以下のようにrun-partsコマンドを--testオプションで実行することで、cron.dailyで実行されるスクリプト名を確認することができます。同様にcron.hourly, cron.weekly, cron.monthlyも確認可能です。

run-parts --test /etc/cron.daily

cronスクリプトを作成したときにいつも苦心していたのが、そのcronスクリプトがちゃんと動くかどうか確認することです。このオプションをもっと早く知っていれば。。。今まではマシンの時刻をずらしたり、わざとsyslog出力してスクリプトの実行を確認したり、色々と面倒なことをしていました。

しかもrun-partsのmanページを見ると分かるのですが、ubuntuなどDebian系のディストリビューションでは、cronスクリプトのファイル名に許されている文字列は、(^[a-zA-Z0-9_-]+$) のみです。つまり英数字以外で許される記号はハイフンとアンダースコアのみです(ドットなどはNG)。今までredhat系を利用していた私は、全く疑いもせずにubuntuサーバーにインストールしたcronスクリプト名にドット(.)を使ってしまい、cronスクリプトが実行されず原因究明に時間がかかりました。

PPPのtxqueuelenが小さすぎる

LinuxでイーサネットとPPPインタフェースのルーティングをすると、イーサネットからPPPインタフェースへの通信パケットをこぼしてしまうことがありました。
f:id:Oswald:20110226090524j:image
調べていった結果、PPPインタフェースのtxqueuelenが3(デフォルト値)であることが原因だと分かりました。


[root]# ifconfig ppp0
ppp0 Link encap:Point-to-Point Protocol
inet addr:x.x.x.x P-t-P:y.y.y.y Mask:255.255.255.255
UP POINTOPOINT RUNNING NOARP MULTICAST MTU:1454 Metric:1
RX packets:600700 errors:0 dropped:0 overruns:0 frame:0
TX packets:1011374 errors:0 dropped:0 overruns:0 carrier:0
Collisions:0 txqueuelen:3
RX bytes:42335282 (40.3 Mb) TX bytes:1424516252 (1358.5 Mb)

txqueuelenはパケットの送信キューのサイズです。これが3つしかなかったため、イーサネットから大量にパケットが流れてくると、PPPインタフェースの送信キューからあふれてしまってました。

txqueuelenを30にしたところ、通信パケットがこぼれる現象は起こらなくなりました。


[root]# ifconfig ppp0 txqueuelen 30

手動でifconfigコマンドを使って毎回txqueuelenを設定するのは手間と感じる場合は、ip-up.localを使って自動化します。

[root]# cat /etc/ppp/ip-up.local
INTERFACE=$1
ifconfig $INTERFACE txqueuelen 30