2011年9月20日火曜日

CentOS 5.7 のトピックス

CentOS 5.7 で新たに追加された機能等の、自分用メモです。
(重要事項)
自分の中では、特にはなかった。

(リリースノートには書かれていないが目に留まったもの)
■tcsh617 の追加
tcsh 6.17 にリベースしたパッケージが提供されているようだ。
csh を使ってハマっている場合に、試してみると良さそう。
■rm コマンドの性能向上
https://bugzilla.redhat.com/show_bug.cgi?id=523923
1つのディレクトリに多数のファイルが存在する場合、コーディング上の工夫により、性能向上を達成するらしい。下手に C で書くよりも、rm を呼んで、その最適化されたコードを利用したほうがお得な場合もあるかも。

2011年9月10日土曜日

Fedora 16 に新採用された chrony の設定

Fedora 16 (今現在は Alpha ですが) では、NTP クライアントが ntpd から chronyd に変更されています。設定方法について、メモです。

まず、rpm 情報です。
[root@fedora16 ~]# rpm -qi chrony
Name        : chrony
Version     : 1.26
Release     : 3.20110831gitb088b7.fc16
Architecture: x86_64
Install Date: Sat 10 Sep 2011 06:54:41 AM JST
Group       : System Environment/Daemons
Size        : 546684
License     : GPLv2
Signature   : RSA/SHA256, Tue 06 Sep 2011 07:54:34 PM JST, Key ID 067f00b6a82ba4b7
Source RPM  : chrony-1.26-3.20110831gitb088b7.fc16.src.rpm
Build Date  : Wed 07 Sep 2011 12:29:09 AM JST
Build Host  : x86-14.phx2.fedoraproject.org
Relocations : (not relocatable)
Packager    : Fedora Project
Vendor      : Fedora Project
URL         : http://chrony.tuxfamily.org
Summary     : An NTP client/server
Description :
A client/server for the Network Time Protocol, this program keeps your
computer's clock accurate. It was specially designed to support
systems with intermittent internet connections, but it also works well
in permanently connected environments. It can use also hardware reference
clocks, system real-time clock or manual input as time references.
systemd の初期状態を確認。chronyd は disabled になってます。#それにしても、systemctl コマンドに慣れないなあ、、、
[root@fedora16 ~]# systemctl status chronyd.service
chronyd.service - NTP client/server
          Loaded: loaded (/lib/systemd/system/chronyd.service; disabled)
          Active: inactive (dead)
          CGroup: name=systemd:/system/chronyd.service
これを、enable に変更する。
[root@fedora16 ~]# systemctl enable chronyd.service
ln -s '/lib/systemd/system/chronyd.service' '/etc/systemd/system/multi-user.target.wants/chronyd.service'
[root@fedora16 ~]# systemctl status chronyd.service
chronyd.service - NTP client/server
          Loaded: loaded (/lib/systemd/system/chronyd.service; enabled)
          Active: inactive (dead)
          CGroup: name=systemd:/system/chronyd.service
設定ファイル (/etc/chronyd.conf) は、ntpd と似た雰囲気です。
[root@fedora16 ~]# rpm -qc chrony  ※設定ファイルの所在を確認
/etc/chrony.conf
/etc/chrony.keys
/etc/logrotate.d/chrony
# Use public servers from the pool.ntp.org project.
# Please consider joining the pool (http://www.pool.ntp.org/join.html).
server 0.fedora.pool.ntp.org iburst
server 1.fedora.pool.ntp.org iburst
server 2.fedora.pool.ntp.org iburst
server 3.fedora.pool.ntp.org iburst

# Ignore stratum in source selection.
stratumweight 0

# Record the rate at which the system clock gains/losses time.
driftfile /var/lib/chrony/drift

# Enable kernel RTC synchronization.
rtcsync

# In first three updates step the system clock instead of slew
# if the adjustment is larger than 100 seconds.
makestep 100 3

# Allow client access from local network.
#allow 192.168/16

# Serve time even if not synchronized to any NTP server.
#local stratum 10

keyfile /etc/chrony.keys

# Specify the key used as password for chronyc.
commandkey 1

# Disable logging of client accesses.
noclientlog

# Send a message to syslog if a clock adjustment is larger than 0.5 seconds.
logchange 0.5

logdir /var/log/chrony
#log measurements statistics tracking
そんでもって起動!
[root@fedora16 ~]# systemctl start chronyd.service   ※起動!
[root@fedora16 ~]# systemctl status chrnoyd.service  ※打ちにくい、、、typo した、、、
chrnoyd.service
          Loaded: error (Reason: No such file or directory)
          Active: inactive (dead)
[root@fedora16 ~]# systemctl status chronyd.service  ※確認
chronyd.service - NTP client/server
          Loaded: loaded (/lib/systemd/system/chronyd.service; enabled)
          Active: active (running) since Sat, 10 Sep 2011 20:54:47 +0900; 14s ago
         Process: 19657 ExecStartPost=/usr/libexec/chrony-helper add-dhclient-servers (code=exited, status=0/SUCCESS)
         Process: 19654 ExecStart=/usr/sbin/chronyd -u chrony $OPTIONS (code=exited, status=0/SUCCESS)
         Process: 19645 ExecStartPre=/usr/libexec/chrony-helper generate-commandkey (code=exited, status=0/SUCCESS)
        Main PID: 19656 (chronyd)
          CGroup: name=systemd:/system/chronyd.service
                  └ 19656 /usr/sbin/chronyd -u chrony
ntpq のような状態確認は、chronyc で行います。
[root@fedora16 ~]# chronyc sources -v
210 Number of sources = 4

  .-- Source mode  '^' = server, '=' = peer, '#' = local clock.
 / .- Source state '*' = current synced, '+' = OK for sync, '?' = unreachable,
| /                'x' = time may be in error, '~' = time is too variable.
||                                                 .- xxxx [ yyyy ] +/- zzzz
||                                                /   xxxx = adjusted offset,
||         Log2(Polling interval) -.             |    yyyy = measured offset,
||                                  \            |    zzzz = estimated error.
||                                   |           |                         
MS Name/IP address           Stratum Poll LastRx Last sample
============================================================================
^+ javanese.kjsl.com             2    6     18    -11ms[  -11ms] +/-  211ms
^* balthasar.gimasystem.jp       3    6     20   +321us[ +815us] +/-   53ms
^+ z2.ktroad.net                 3    6     20  +1228us[+1722us] +/-   75ms
^+ 219x123x70x90.ap219.ftth.     2    6     20  -3397us[-3397us] +/-   57ms

[root@fedora16 ~]# chronyc sourcestats -v
210 Number of sources = 4
                             .- Number of sample points in measurement set.
                            /    .- Number of residual runs with same sign.
                           |    /    .- Length of measurement set (time).
                           |   |    /      .- Est. clock freq error (ppm).
                           |   |   |      /           .- Est. error in freq.
                           |   |   |     |           /         .- Est. offset.
                           |   |   |     |          |          |   On the -.
                           |   |   |     |          |          |   samples. \
                           |   |   |     |          |          |             |
Name/IP Address            NP  NR  Span  Frequency  Freq Skew  Offset  Std Dev
==============================================================================
javanese.kjsl.com          10   6   397      2.808      6.249    -12ms   570us
balthasar.gimasystem.jp    10   8   395      0.171      8.376  +3871ns   717us
z2.ktroad.net              10   5   395      0.157      8.272  +1367us   600us
219x123x70x90.ap219.ftth.  10   6   395      2.790     10.922  -3060us   979us

ここまで書いてなんですが、ntpd が無くなったわけではないので、そちらの方が良ければ、入れれば良いです。
[root@fedora16 ~]# yum search ntp | grep ^ntp.x86_64
ntp.x86_64 : The NTP daemon and utilities

2014-05-05追記
RHEL7.0 RC を試しましたが、デフォルトの NTP クライアントは、やはり chrony に変更になっていました。設定/操作方法は、Fedora 16 で調べた時と特段変わりないようです。それと、やはり ntpd も収録されているので、そちらを使うことも可能でした。

2015-02-01追記
追記していませんでしたが、RHEL7/CentOS7 では、デフォルトの NTP クライアントは、chrony でリリースされています。
殆どの場合、/etc/chronyd.conf 中の server 行を修正して、systemctl restart chrony.service を実行するだけで良いかと思います。6ヶ月以上動かしているマシンがありますが、chrony に関して特段不都合は無い感触です。
なお、ntpd に切り替えることもできるので、これまでの運用経験値・実績を重視するのであれば、切り替える選択肢もあります。当然ではありますが、ネット上の情報量は ntpd のほうが多いというメリットもあります。

Fedora 16 Alpha で GRUB2 をパーティションにインストール

Fedora 16 Alpha を試そうと、マルチブート環境 (マシンは ThinkPad X301) のパーティションの1つにインストールしましたが、インストールの終盤で bootloader のインストールに失敗したというエラーが出て、起動できず、いきなりハマってしまいました。
バグ情報を見たら、bootloader をパーティションにインストールできないよ とありました。

http://fedoraproject.org/wiki/Common_F16_bugs
Installation issues

Installer cannot install bootloader to a system partition (but will try and fail)
link to this item - Bugzilla: #730915

Fedora 16 uses the GRUB 2 bootloader for new installations. GRUB 2 does not currently support installation to a partition (rather than the MBR), but the Fedora 16 Alpha installer will still allow you to try and install the bootloader to a partition. This will fail, and so if you attempt this, the Fedora 16 Alpha installer will not install a bootloader at all. The installed system will be functional.

To work around this issue, you can adjust your bootloader configuration from another installed operating system. You can force installation of GRUB 2 to the Fedora partition by booting the Fedora 16 Alpha installation disc in rescue mode, using chroot to access the installed system, and running grub2-install --force '(hd0,5)' (where hd0,5 is the appropriate designation for the target partition, with GRUB 2 partition numbering starting at 1 as opposed to 0 with old GRUB). Alternatively, specify an ordinary partition device name such as /dev/sda5. Note that with --force the warnings are still printed.

This issue will be resolved in Fedora 16 Beta: the installer will use the --force parameter when trying to install the bootloader to a partition.
わたしのマルチブート環境では、MBR には MBM を入れてあり、Fedora や CentOS のインストール時には、各パーティションの PBR に GRUB を入れるという構成にしています。GRUB2 の場合、PBR へのインストール時には --force オプションを指定する必要があるようですが、F16 Alpha のインストーラーが --force をつけていないために、失敗してしまうようです。

仕方が無いので、レスキューモードでなんとかなるだろうと、ほぼ初体験の GRUB2 で悪戦苦闘。GRUB1 とほぼ同じだろうと、grub2-install をかけるも NG。--force をつけても NG。その後、grub2-各種 の --help を見ながら格闘しましたが、レスキューモードではうまく行きませんでした。
そんじゃあ別のパーティションに入っている Fedora 15 に GRUB2 を入れてなんとかできないかと、さらに格闘すること1時間ぐらい、やっと成功しました。
Fedora 15 で使ったコマンドは、次のような感じです。今回、/dev/sda8 に Fedora 16 を入れています。
# mkdir /mnt_sda8
# mount /dev/sda8 /mnt_sda8
# grub2-install --force --root-directory=/mnt_sda8 /dev/sda8
# chroot /mnt_sda8
# grub2-mkconfig > /boot/grub2/grub.cfg
GRUB2 の設定ファイル grub.cfg は手書きではないようで、上記のように grub2-mkconfig で生成するという方式になっているようです。

最後にスクリーンショットでもと思ったのですが、PNG ファイルをセーブするときにクラッシュしてしまうようなので、ここまでです。なお、現在の Fedora (というか GNOME?) だと、PrtSc キー押下でスクリーンショットのキャプチャーが出来ます。つまり、Windows と同じ操作方法ということ。

2011-10-01追記
アップデートしたら、スクリーンショットが落ちなくなったので、いくつかアップします。



2011年9月1日木曜日

perl でオプション解析(getoptコマンド編)

perl から、getopt(1) コマンドを呼び出してオプション解析するテンプレートです。
#!/usr/bin/perl
#
# getopt-cmd-template.pl
#

use Text::ParseWords ;

sub usage_exit {
        print STDERR "Usage: getopt-cmd-template.pl [-a] [-d dir] item1 item2 ...\n" ;
        exit 1 ;
}

sub get_quotedwordstr {
        my $s ;
        foreach (@_) {
                $s = sprintf("$s '%s'", "$_") ;
        }
        return $s ;
}

print "@ARGV\n" ;       ####DEBUG
$argstr = get_quotedwordstr(@ARGV) ;
print "$argstr\n" ;     ####DEBUG
$optstr = `getopt -q -o ad:h -- $argstr` ; if ($? != 0) { usage_exit ; }
@opts = shellwords($optstr) ;
while (1) {
        $_ = shift @opts ;
        m/^$/  && do { next ; } ;
        m/^-a/ && do { $opt_a = 1           ; next ; } ;
        m/^-d/ && do { $opt_d = shift @opts ; next ; } ;
        m/^--/ && do { last ; } ;
        usage_exit ;
}

$argc = scalar @opts ;
print "\$argc=$argc\n" ;        ####DEBUG
print "\@opts=@opts\n" ;        ####DEBUG
print "\$opt_a=$opt_a\n" ;      ####DEBUG
print "\$opt_d=$opt_d\n" ;      ####DEBUG
ひと手間かかった部分だけ補足しますと、

空白を含むような item にも対応できるように、get_quotedwordstr を記述しています。

また、getopt(1) の処理結果をうまく単語分割して配列に格納するため、Text::ParseWords に含まれる shellwords を使いました。これの存在に気づくまで時間がかかりました。

実行結果は、次のようになります。
# ./getopt-cmd-template.pl -d dir item1 item2
-d dir item1 item2
 '-d' 'dir' 'item1' 'item2'
$argc=2
@opts=item1 item2
$opt_a=
$opt_d=dir
コマンドラインの後半でオプション指定しても、うまく処理されます。
# ./getopt-cmd-template.pl item1 item2 -d dir
item1 item2 -d dir
 'item1' 'item2' '-d' 'dir'
$argc=2
@opts=item1 item2
$opt_a=
$opt_d=dir
Getopt::Std では、このように、うまく処理はできません。次の記事を参照ください。
perl でオプション解析(Getopt::Std編)
人気ブログランキングへ にほんブログ村 IT技術ブログへ