ラベル Linux の投稿を表示しています。 すべての投稿を表示
ラベル Linux の投稿を表示しています。 すべての投稿を表示

2009年2月21日土曜日

Debian 5.0 lenny

Debian 5.0 (lenny)がリリースされたのでアップグレードしました。
思兼 GNU/Linuxからアップグレードを繰り返してそろそろ10年でしょうか。

find /etc/ -type f | xargs ls -ltdr | head
で/etc内にある一番古いファイルが2000/01/29でした。

アップグレードの中でproftpdがはまることがわかっています。FTPにはそもそもファイル名に関する規定がありません。今までproftpdは8bit cleanでしたが、Debian 5.0にパッケージされているproftpd 1.3.1は8bit cleanではなくなり、日本語ファイル名を通すことが困難になりました。
こんなときでもDebianは古いパッケージをholdしておけば共存できます。つまりproftpdとそれに依存するパッケージはDebian 4.0のままで、それ以外はDebian 5.0に移行しました。

それでもまだはまることがあるんですね。
iptablesがバージョンアップして以前のiptables.confが使えませんでした。おかげでfirewall設定が消えて外部から攻撃を受ける羽目に…。
udev絡みでしょうか、mdのデバイスファイル名が/dev/md/1から/dev/md1に変わってしまいました。おかげでmount失敗に泣きました。
dhcpサーバが設定に厳しくなりました。ノートパソコンに対して無線LAN経由でも有線LANでも同じIPアドレスを割り当てていましたが、まとめて1つの設定にできなくなり、2つに分ける必要がありました。
rexecプロトコルが勝手にtcpd経由にされ、接続できなくなりました。tcpd嫌いっ

Apache、samba辺りは設定もややこしく毎回見直すべきなのは、それなりに。

まぁそれでもいい感じにアップグレードできたと思います。
ちなみにGCC周りが4.1から4.3にアップグレードされていますが、なぜか4.1のパッケージも残ったままなので手動で消す必要があります。

2009年1月15日木曜日

RAIDの拡張

Linuxのsoftware RAID(md)の場合、disk controllerをまたがって好きなようにRAIDを構成できるため重宝します。云々はに書きました。

今回ハードディスクを更新したので、RAIDの拡張をしてみました。

md2 : active raid5 sdf[0] sdg[3] sde[2] sdh[1]
という4玉構成のRAID5に対してsda4とsdc4を追加して6玉構成にしようと思います。

# mdadm /dev/md2 -a /dev/sda4
# mdadm /dev/md2 -a /dev/sdc4
# mdadm /dev/md2 -G -n 6
最初にSpare Devicesとして2玉追加し、次にgrowコマンドでActive Devicesを6玉に変更します。えー、7800min後に完了とか言い出しました。

よく見ると
md: reshape of RAID array md2
md: minimum _guaranteed_ speed: 1000 KB/sec/disk.
md: using maximum available idle IO bandwidth (but not more than 200000 KB/sec) for reshape.
md: using 128k window, over a total of 488386496 blocks.
とか言って本気を出していません。
こんなときLinux Kernelはオープンソースなので出しているメッセージや理由、どうすればいいかなどをソースコードから調べることができます。

# cat /proc/sys/dev/raid/speed_limit_min
1000
# echo 6000 > /proc/sys/dev/raid/speed_limit_min
他のプロセスの邪魔にならないようにこうやって速度が抑えられていたようです。その上で、早く完了させたいためスピードアップしてみました。これで残り1300minに…それでも丸一日かかるのね。

2009年1月11日日曜日

S.M.A.R.T on Linux

久々にハードディスクの健康状態が知りたくなり、smartmontoolsで情報を見てみました。
まずはありきたりなところからHDDの温度

# for d in a b c d e f g h; do echo -n "sd$d "; smartctl -a -d ata /dev/sd$d|grep Temperature_Celsius; done
sda 194 Temperature_Celsius 0x0022 035 055 000 Old_age Always - 35 (Lifetime Min/Max 0/17)
sdb 194 Temperature_Celsius 0x0002 196 196 000 Old_age Always - 28 (Lifetime Min/Max 16/55)
sdc 194 Temperature_Celsius 0x0002 196 196 000 Old_age Always - 28 (Lifetime Min/Max 16/58)
sdd 194 Temperature_Celsius 0x0022 034 047 000 Old_age Always - 34 (Lifetime Min/Max 0/16)
sde 194 Temperature_Celsius 0x0002 214 214 000 Old_age Always - 28 (Lifetime Min/Max 14/50)
sdf 194 Temperature_Celsius 0x0022 120 099 000 Old_age Always - 30
sdg 194 Temperature_Celsius 0x0002 230 230 000 Old_age Always - 26 (Lifetime Min/Max 14/38)
sdh 194 Temperature_Celsius 0x0022 120 097 000 Old_age Always - 30
あからさまな温度差はなさそうです。
次にread error
# for d in a b c d e f g h; do echo -n "sd$d "; smartctl -a -d ata /dev/sd$d|grep Raw_Read_Error_Rate; done
sda 1 Raw_Read_Error_Rate 0x000f 109 099 006 Pre-fail Always - 0
sdb 1 Raw_Read_Error_Rate 0x000b 094 094 016 Pre-fail Always - 851977
sdc 1 Raw_Read_Error_Rate 0x000b 085 085 016 Pre-fail Always - 6029424
sdd 1 Raw_Read_Error_Rate 0x000f 119 091 006 Pre-fail Always - 0
sde 1 Raw_Read_Error_Rate 0x000b 100 100 016 Pre-fail Always - 0
sdf 1 Raw_Read_Error_Rate 0x000f 200 200 051 Pre-fail Always - 0
sdg 1 Raw_Read_Error_Rate 0x000b 100 100 016 Pre-fail Always - 0
sdh 1 Raw_Read_Error_Rate 0x000f 200 200 051 Pre-fail Always - 0
sdbとsdcでエラーが出てる…そろそろやばいかも。

そして「for d in a b c d e f g h; do echo sd$d; smartctl -A -d ata /dev/sd$d; done」を眺めて気になる表示をピックアップ。
sda 190 Unknown_Attribute 0x0022 064 045 045 Old_age Always In_the_past 756809764
sda 195 Hardware_ECC_Recovered 0x001a 061 058 000 Old_age Always - 6361756
sdd 190 Unknown_Attribute 0x0022 064 053 045 Old_age Always - 740032548
sdd 195 Hardware_ECC_Recovered 0x001a 067 064 000 Old_age Always - 42581156


そこでテストを実行し、エラーの確認
# for d in a b c d e f g h; do smartctl -t short -d ata /dev/sd$d; done
# for d in a b c d e f g h; do echo "sd$d "; smartctl -l error -d ata /dev/sd$d; done
(特にエラーなし)
# for d in a b c d; do smartctl -t long -d ata /dev/sd$d; done
# for d in a b c d e f g h; do echo sd$d; smartctl -l selftest -d ata /dev/sd$d; done
sbc
Num Test_Description Status Remaining LifeTime(hours) LBA_of_first_error
# 1 Extended offline Completed: read failure 30% 22500 387518271
うわーsbcダメかも。

2008年5月16日金曜日

Boost.Asio

BoostというC++ライブラリが気になっていたのですが、1.35がリリースされ、Boost.Asioという非同期I/Oライブラリが追加されていることを知りました。このライブラリはWindows、Linux、各種Unix上で動作し、各種コンパイラをサポートしています。さらによく見たらOpenSSLによるSSLまでサポートしていました。

まずは試しに同期I/Oでhttps clientを書いてみました。

io_service i;
ssl::context c( i, ssl::context::sslv3_client );
ssl::stream s( i, c );
s.lowest_layer().connect( *ip::tcp::resolver(i)
.resolve( ip::tcp::resolver::query( "ホスト名", "https" ) ) );

s.handshake( ssl::stream_base::client );

write( s, buffer( "GET / HTTP/1.0\r\n\r\n" ) );

asio::streambuf res;
error_code e;
while( read( s, res, transfer_at_least(1), e ) )
cout << &res;
うーん、これだけで動いちゃいました。

2008年2月20日水曜日

RAIDデバイス名の変更

Linuxのsoftware RAID(md)の場合、disk controllerをまたがって好きなようにRAIDを構成できるため重宝します。またhardware RAIDの場合、raid controllerが故障すると読み出せませんが、そのような欠点もありません。
mdはディスク内に自身のデバイス名(md0)などを保持しています。ここで例えばディスク交換のために、/パーティションをmd0からmd1にコピーした場合、新たに作られる/はmd1というデバイス名を持ってしまいます。これを繰り返すとデバイス名がどんどんいびつになっていきます。
これをどうにか整理したかったのですが、どこにも書かれていなかったので自力で解決しました。

まだまだ説明が続きます。多くのドキュメントではmdのcreateについてしか記述されていませんでした。しかし実際にはassembleとstopという行為が重要になってきます。なぜこれらが記述されていないのかというと、Linuxの各ディストリでは起動時やshutdown時のscriptにあらかじめ組み込まれていて、説明する必要がないわけです。そして、試した結果わかったのですが、「mdはディスク内に自身のデバイス名(md0)などを保持しています。」これはcreate時だけでなくassemble時にも更新されるようです。

いよいよデバイス名の変更の仕方です。例えばmd2をmd1に変更するには

# umount md2
# mdadm -S /dev/md2
# mdadm -A /dev/md1 /dev/sd... /dev/sd...
# mount ...
わかってしまえば簡単でした。
このあと/etc/fstabの変更も忘れずに。

ただしこれができるのはumount可能なパーティションだけです。CD bootなどでもいいかもしれません。
CD bootできなくてもがんばれば更新できます。例えば/のデバイス名をmd0に変更する場合kernel optionで
raid=noautodetect md=0,/dev/sd...,/dev/sd... root=/dev/md0
で変更されます。raid=noautodetectを指定しておかないと、autodetectされ、保持されているデバイス名でassembleされてしまい変更できません。またデバイス名が変わるためroot=/dev/md0の指定をしないと起動に失敗します。
このあと/boot/grub/menu.listや/etc/fstabの更新も忘れずに。

2008年2月11日月曜日

ハードディスクの2TBの壁

750GB×4のハードウェアRAID5で、2.25TBになります。このときハードディスクのパーティションテーブルは32bit sectors(4giga sectors)×512bytes/sector=2TBまでしか表現できないという、2TBの壁にぶつかりました。
Debian GNU/Linux(etch)をインストールしたところ、パーティションエディタは2TBの壁を超えるために新しいGPT形式に対応していて、ファイルのインストール自体はできました。ところがブートローダのGRUBがGPTに未対応のバージョンのため、結局ブート不可能なインストール結果となってしまいました。