2006-01-04 (Wed)

* ipchains で OutGoing のパケットを DENY する

この記事の直リンクURL: Permlink | この記事が属するカテゴリ: [Linux] [ネットワーク]

ipchains で OutGoing (外向き) のパケットを DENY する。

ipchains -A output -d 10.87.64.215 -j DENY

諸般の事情で iptables じゃなくて ipchains を使った。

- DENY/DROP と REJECT の違い

DENY と DROP は同義で、パケットを単に捨てるだけ。発信元へはなにも返さない。
REJECT はパケットを捨てた上で、拒否したことを ICMP を使って発信元に通告する。

2005-10-28 (Fri)

* eth0 Too much work in interrupt, status *** メッセージ

この記事の直リンクURL: Permlink | この記事が属するカテゴリ: [Linux]

3Com の NIC を搭載した 古い Linux マシンで dmesg したところ、Too much work in interrupt, status ec01. というメッセージが大量に表示されていることに気づいた。

3c59x.c 15Sep00 Donald Becker and others http://www.scyld.com/network/vortex.html
eth0: 3Com 3c905 Boomerang 100baseTx at 0x7000,  00:60:08:31:d6:0c, IRQ 3
  8K word-wide RAM 3:5 Rx:Tx split, autoselect/MII interface.
  MII transceiver found at address 24, status 786f.
  Enabling bus-master transmits and whole-frame receives.
eth0: Too much work in interrupt, status ec01.
eth0: Too much work in interrupt, status ec01.
eth0: Too much work in interrupt, status e401.
eth0: Too much work in interrupt, status f401.

カードは 3Com 3C905 無印。このマシンには 3C905B を付けてたと思ってたけど、無印の方だった。3C905B だったら 愛称は Boomerang じゃなくて Cyclone だ。

記録されていたメッセージは、割り込みをかけたけどタスクが多すぎるという内容か。エラーではないのかな。こんなメッセージはずっと出たことが無かった気がする。ただ、最近 Load Average が20以上になり、かつ激しくディスクを読み書きするような一連のジョブを実行した。それがメッセージの原因かもしれない。たかだか20程度で音を上げるなんてありえないが、ハードウェアは単なる富士通のデスクトップ PC で、カーネルも2.2系列だから仕方ないかも。

この件についてウェブを検索するとヒット。

[linux-users:84969] ログについて
http://search.luky.org/linux-users.8/msg04970.html

上記の記事から始まるスレッドでは、「ドライバか環境に原因がありそう。でも、たぶん処理はできているので気にしない。」という対処で終わっている。メッセージが出なくなるようにドライバのソースを修正してしまったとのこと。じゃあ、私も気にする必要はないか。データ化けとかも起きてないし。i82557 のカードが余ってるので換装してもよかったが、マシン室まで行って換装する時間が惜しいので、対処不要ということで。

前述のメッセージよりも前の部分もメモ。

Linux version 2.2.18-2 (support@kernel.turbolinux.com) (gcc version egcs-2.91.66 19990314/Linux (egcs-1.1.2 release)) #1 Wed Mar 14 12:38:41 JST 2001
Detected 200459 kHz processor.
Console: colour VGA+ 80x25
Calibrating delay loop... 399.76 BogoMIPS
Memory: 192292k/196608k available (1488k kernel code, 408k reserved, 2336k data, 84k init, 0k bigmem)
Dentry hash table entries: 32768 (order 6, 256k)
Buffer cache hash table entries: 262144 (order 8, 1024k)
Page cache hash table entries: 65536 (order 6, 256k)
Inode hash table entries: 16384 (128k), inode-max: 16384
VFS: Diskquotas version dquot_6.4.0 initialized
CPU: Intel Pentium MMX stepping 04
Checking 386/387 coupling... OK, FPU using exception 16 error reporting.
Checking 'hlt' instruction... OK.
Intel Pentium with F0 0F bug - workaround enabled.
POSIX conformance testing by UNIFIX
PCI: PCI BIOS revision 2.10 entry at 0xf0200
PCI: Using configuration type 1
PCI: Probing PCI hardware
Linux NET4.0 for Linux 2.2
Based upon Swansea University Computer Society NET3.039
NET4: Unix domain sockets 1.0 for Linux NET4.0.
NET4: Linux TCP/IP 1.0 for NET4.0
IP Protocols: ICMP, UDP, TCP, IGMP
TCP: Hash tables configured (ehash 262144 bhash 65536)
IPVS: Connection hash table configured (size=4096, memory=32Kbytes)
Initializing RT netlink socket
Starting kswapd v 1.5
Detected PS/2 Mouse Port.
Serial driver version 4.27 with MANY_PORTS MULTIPORT SHARE_IRQ enabled
ttyS01 at 0x02f8 (irq = 3) is a 16550A
pty: 256 Unix98 ptys configured
Real Time Clock Driver v1.09
RAM disk driver initialized:  16 RAM disks of 4096K size
keyboard: Timeout - AT keyboard not present?
keyboard: Timeout - AT keyboard not present?
loop: registered device at major 7
Uniform Multi-Platform E-IDE driver Revision: 6.30
ide: Assuming 33MHz system bus speed for PIO modes; override with idebus=xx
PIIX4: IDE controller on PCI bus 00 dev 39
PIIX4: chipset revision 1
PIIX4: not 100% native mode: will probe irqs later
    ide0: BM-DMA at 0x7830-0x7837, BIOS settings: hda:pio, hdb:pio
    ide1: BM-DMA at 0x7838-0x783f, BIOS settings: hdc:pio, hdd:pio
hda: QUANTUM FIREBALL SE4.3A, ATA DISK drive
hdb: QUANTUM FIREBALL EX3.2A, ATA DISK drive
hdc: ST38410A, ATA DISK drive
ide0 at 0x1f0-0x1f7,0x3f6 on irq 14
ide1 at 0x170-0x177,0x376 on irq 15
hda: QUANTUM FIREBALL SE4.3A, 4110MB w/80kB Cache, CHS=524/255/63
hdb: QUANTUM FIREBALL EX3.2A, 3079MB w/418kB Cache, CHS=782/128/63
hdc: ST38410A, 8223MB w/512kB Cache, CHS=16708/16/63
FDC 0 is a post-1991 82077
LVM version 0.9  by Heinz Mauelshagen  (13/11/2000)
lvm -- Driver successfully initialized
md driver 0.90.0 MAX_MD_DEVS=256, MAX_REAL=12
raid5: measuring checksumming speed
raid5: MMX detected, trying high-speed MMX checksum routines
  pII_mmx  :  295.656 MB/sec
  p5_mmx    :  348.234 MB/sec
  8regs    :  212.979 MB/sec
  32regs    :  151.638 MB/sec
using fastest function: p5_mmx (348.234 MB/sec)
Loading I2O Core - (c) Copyright 1999 Red Hat Software
I2O configuration manager v 0.04
(C) Copyright 1999 Red Hat Software
scsi : 0 hosts.
scsi : detected total.
md.c: sizeof(mdp_super_t) = 4096
Partition check:
hda: hda1
hdb: hdb1 hdb2 hdb3
hdc: [PTBL] [1048/255/63] hdc1
autodetecting RAID arrays
autorun ...
... autorun DONE.
apm: BIOS version 1.2 Flags 0x03 (Driver version 1.13)
VFS: Mounted root (ext2 filesystem) readonly.
Freeing unused kernel memory: 84k freed
Adding Swap: 129016k swap-space (priority -1)
usb.c: registered new driver usbdevfs
usb.c: registered new driver hub
usb-uhci.c: $Revision: 1.237 $ time 12:46:08 Mar 14 2001
usb-uhci.c: High bandwidth mode enabled
usb-uhci.c: USB UHCI at I/O 0x7800, IRQ 11
usb-uhci.c: Detected 2 ports
usb.c: new USB bus registered, assigned bus number 1
usb.c: USB new device connect, assigned device number 1
hub.c: USB hub found
hub.c: 2 ports detected

このマシン、リモートログインさえできればいいので、キーボードも外してある。キーボードを付けていないと、keyboard: Timeout - AT keyboard not present? って出るんだね。

2005-10-18 (Tue)

* シェルのプロンプトに時刻を表示する

この記事の直リンクURL: Permlink | この記事が属するカテゴリ: [unix] [Linux] [bash]

.bash_profile の記述を変更して以下のようにし、プロンプトに時刻が表示されるようにした。プロンプトに時刻が入っていると、コマンドの実行を開始したおおよその時間がわかるので便利。

export PS1="\[\033[1;32m\][\t][\u@\h \w]$\[\033[0m\] "

時刻を表示してくれているのは [\t] の部分。\u はユーザ名、\h はホスト名。ちなみに先頭の \[\033[1;32m\] と 末尾の [\033[0m\] は、プロンプトを緑色にするための設定。私は端末の背景色を黒にしているので、緑色が映える。それに、プロンプトの色を地の文の色と変えておくと、長い出力があった後にスクロールバーを操作してプロンプトを探そうとしたときに見つけやすい。

実際のプロンプトは以下のように表示される。
[23:06:33][hiroaki@sonic64 ~]$

2005-10-06 (Thu)

* coLinux で Unable to mount root fs on unknown-block(117,0) エラー

この記事の直リンクURL: Permlink | この記事が属するカテゴリ: [Linux] [coLinux]

私が coLinux を使う上で遭遇したトラブルとその回避方法のメモ。2005-10-03 の「coLinux で exit code 84a08401 CO_RC_ERROR_ERROR エラー」の続編。

今回は Unable to mount root fs on unknown-block(117,0) エラー。

- Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(117,0) エラー

SourceForge.net: Project Filelist
http://sourceforge.net/project/showfiles.php?group_id=98788

上記の coLinux 配布サイトから coLinux-0.6.2.exe と Debian-20040605-mit.ext3.1610mb.bz2 をダウンロードしてインストールし、default.colinux.xml に root file system のイメージファイル名を記述し、メモリ割当量を64MB から512MB に増やし、さあ起動というところでエラーが発生。

Linux version 2.6.10-co-0.6.2 (karrde@callisto.yi.org) (gcc version 3.3.5 (Debian 1:3.3.5-8)) #5 Sat Feb 5 10:19:16 IST 2005
512MB LOWMEM available.

(略)

EXT3-fs warning: checktime reached, running e2fsck is recommended
EXT3 FS on cobd0, internal journal
EXT3-fs: mounted filesystem with ordered data mode.
VFS: Cannot open root device "cobd0" or unknown-block(117,0)
Please append a correct "root=" boot option
Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(117,0)

ext3 の fsck を実行しようとしてカーネルパニックになってる。ただ、もう一度起動を試みたところ問題なく fsck が実行され、起動することができた。

起動はできたが、さっきのカーネルパニックの原因がわからないのは怖い。原因を突き止めようとして、何回かイメージファイルの展開と default.colinux.xml の設定を繰り返したところ、default.colinux.xml を初期値に近い記述だけにして起動したときはエラーにならないことに気づいた。結局、メモリ割り当て量が大きすぎることが原因のようだということがわかった。

<!-- this line allows you to specify the amount of memory available
    to coLinux -->
<memory size="512" />

メモリ割り当て容量をデフォルトの 64MB に戻して起動たら、エラーなく起動できた。メモリを 2GB 積んだマシンなので coLinux に割り当てるメモリを驕ったのが良くなかったか。でも。512MB ってそんなに大きいというほどじゃないよね。

- エラーが発生したときの起動時のメッセージ全文

一応全文を載せておく。

Cooperative Linux Daemon, 0.6.2
Compiled on Sat Feb  5 10:19:28 2005

Linux version 2.6.10-co-0.6.2 (karrde@callisto.yi.org) (gcc version 3.3.5 (Debian 1:3.3.5-8)) #5 Sat Feb 5 10:19:16 IST 2005
512MB LOWMEM available.
initrd enabled: start: 0xdfea2000  size: 0x0015db27)
On node 0 totalpages: 131072
  DMA zone: 0 pages, LIFO batch:1
  Normal zone: 131072 pages, LIFO batch:16
  HighMem zone: 0 pages, LIFO batch:1
Built 1 zonelists
Kernel command line: root=/dev/cobd0
Initializing CPU#0
Setting proxy interrupt vectors
PID hash table entries: 4096 (order: 12, 65536 bytes)
Using cooperative for high-res timesource
Console: colour CoCON 80x25
Dentry cache hash table entries: 131072 (order: 7, 524288 bytes)
Inode-cache hash table entries: 65536 (order: 6, 262144 bytes)
Memory: 514304k/524288k available (1502k kernel code, 0k reserved, 548k data, 104k init, 0k highmem)
Calibrating delay loop... auto selecting TAP
found TAP device named "ローカル エリア接続 2"
opening TAP: "ローカル エリア接続 2"
driver version 8.1
enabling TAP...
1215.69 BogoMIPS (lpj=6078464)
Mount-cache hash table entries: 512 (order: 0, 4096 bytes)
CPU: After generic identify, caps: 078bfbff e3d3fbff 00000000 00000000
CPU: After vendor identify, caps:  078bfbff e3d3fbff 00000000 00000000
CPU: L1 I Cache: 64K (64 bytes/line), D cache 64K (64 bytes/line)
CPU: L2 Cache: 512K (64 bytes/line)
CPU: After all inits, caps:        078bfbff e3d3fbff 00000000 00000010
CPU: AMD Athlon(tm) 64 Processor 3000+ stepping 00
Enabling fast FPU save and restore... done.
Enabling unmasked SIMD FPU exception support... done.
Checking 'hlt' instruction... OK.
checking if image is initramfs...it isn't (no cpio magic); looks like an initrd
Freeing initrd memory: 1398k freed
NET: Registered protocol family 16
devfs: 2004-01-31 Richard Gooch (rgooch@atnf.csiro.au)
devfs: boot_options: 0x0
cofuse init 0.1 (API version 2.2)
Initializing Cryptographic API
serio: cokbd at irq 1
io scheduler noop registered
io scheduler anticipatory registered
io scheduler deadline registered
io scheduler cfq registered
RAMDISK driver initialized: 16 RAM disks of 4096K size 1024 blocksize
elevator: using anticipatory as default io scheduler
cobd: loaded (max 32 devices)
loop: loaded (max 8 devices)
conet: loaded (max 16 devices)
conet0: initialized
mice: PS/2 mouse device common for all mice
input: AT Translated Set 2 keyboard on cokbd
NET: Registered protocol family 2
IP: routing cache hash table of 4096 buckets, 32Kbytes
TCP: Hash tables configured (established 131072 bind 65536)
NET: Registered protocol family 1
NET: Registered protocol family 17
RAMDISK: Compressed image found at block 0
EXT2-fs warning: checktime reached, running e2fsck is recommended
VFS: Mounted root (ext2 filesystem).
ReiserFS: cobd0: warning: sh-2021: reiserfs_fill_super: can not find reiserfs on cobd0
kjournald starting.  Commit interval 5 seconds
EXT3-fs warning: checktime reached, running e2fsck is recommended
EXT3 FS on cobd0, internal journal
EXT3-fs: mounted filesystem with ordered data mode.
VFS: Cannot open root device "cobd0" or unknown-block(117,0)
Please append a correct "root=" boot option
Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(117,0)

なんだか私って coLinux に限ってトラブルが多い気がする。私と coLinux の相性が悪いのかな?

2005-10-03 (Mon)

* coLinux で exit code 84a08401 CO_RC_ERROR_ERROR エラー

この記事の直リンクURL: Permlink | この記事が属するカテゴリ: [Linux] [coLinux]

Windows 上で仮想の Linux を動かせるソフトウェア coLinux (コーリナックス) をインストールした。

今では無事 WindowsXP 上で Debian GNU/Linux Sarge が稼働しているが、インストールや設定中にいくつかエラーに見舞われたので、それらの回避方法をメモ。「どうやって動かすか」という情報も有用だけど、「トラブルやエラーが起きたときにどう対処したか」という情報も有用だ。

- daemon: exit code 84a08401 daemon: error - CO_RC_ERROR_ERROR, line 33, file colinux/os/current/user/file.o

SourceForge.net: Project Filelist
http://sourceforge.net/project/showfiles.php?group_id=98788

上記の coLinux 配布サイトから coLinux-0.6.2.exe と Debian-20040605-mit.ext3.1610mb.bz2 をダウンロードしてインストールし、default.colinux.xml に root file system のイメージファイル名の記述も終わってさあ起動、というところでエラーが発生。

C:\Documents and Settings\hiroaki>e:\coLinux\colinux-daemon.exe -c e:\coLinux\default.colinux.xml
Cooperative Linux Daemon, 0.6.2
Compiled on Sat Feb  5 10:19:28 2005

daemon: exit code 84a08401
daemon: error - CO_RC_ERROR_ERROR, line 33, file colinux/os/current/user/file.o
(37)

うーん、何が悪いのかな? 私の PC の CPU が Athlon64 だから? とまずハードウェア環境を疑ったが、エラーメッセージはファイルI/O 関連のもののようだ。ひょっとしてパスか何かの問題ではないかと思い、以下のようにカレントドライブをインストール先の e: に移動し、カレントディレクトリを e:\colinux に移動したら無事起動した。

C:\Documents and Settings\hiroaki>e:

E:\>cd e:\colinux

E:\coLinux>e:\coLinux\colinux-daemon.exe -c e:\coLinux\default.colinux.xml

2005-04-19 (Tue)

* Linux のシグナルの種類

この記事の直リンクURL: Permlink | この記事が属するカテゴリ: [unix] [Linux]

プロセスに送るシグナルの種類をメモ。

- シグナルってなに?

シグナルは、プロセスに対して送信するメッセージのようなもの。

apache などのデーモンを再起動するときに使う SIGHUP 1 や、プロセスを強制終了するときに使う kill -9 で有名な SIGKILL 9 などがある。シグナルの種類と番号の割り当て方にはいくつかの流派がある。POSIX シグナルとか SysVシグナルとか BSDシグナルなどがあるようだ。

Manpage of SIGNAL
http://www.linux.or.jp/JM/html/LDP_man-pages/man7/signal.7.h ...
Linux は POSIX 信頼シグナル (reliable signal; 以後 "標準シグナル"と表記) と POSIX リアルタイムシグナルの両方に対応している。

- POSIX シグナルの種類

http://www.linux.or.jp/JM/html/LDP_man-pages/man7/signal.7.h ...
POSIX.1 に定義されているシグナルを示す。

シグナル 値 動作 コメント
-----------------------------------------------------------
SIGINT  2 Term キーボードからの割り込み (Interrupt)
SIGQUIT  3 Core キーボードによる中止 (Quit)
SIGILL  4 Core 不正な命令
SIGABRT  6 Core abort(3) からの中断 (Abort) シグナル
SIGFPE  8 Core 浮動小数点例外
SIGKILL  9 Term Kill シグナル
SIGSEGV 11 Core 不正なメモリ参照
SIGPIPE 13 Term パイプ破壊: 読み手の無いパイプへの書き出し
SIGALRM 14 Term alarm(2) からのタイマーシグナル
SIGTERM 15 Term 終了 (termination) シグナル
SIGUSR1 30,10,16 Term ユーザ定義シグナル 1
SIGUSR2 31,12,17 Term ユーザ定義シグナル 2
SIGCHLD 20,17,18 Ign 子プロセスの一旦停止 (stop) または終了
SIGCONT 19,18,25  一旦停止 (stop) からの再開
SIGSTOP 17,19,23 Stop プロセスの一旦停止 (stop)
SIGTSTP 18,20,24 Stop 端末 (tty) より入力された一旦停止 (stop)
SIGTTIN 21,21,26 Stop バックグランドプロセスの tty 入力
SIGTTOU 22,22,27 Stop バックグランドプロセスの tty 出力

シグナル SIGKILL と SIGSTOP はキャッチ、ブロック、無視できない。

あれ? SIGHUP 1 が無いね。なんでだろう?

私が普段使うのはこのくらいかな。

SIGHUP 1 デーモンを再起動させたいときなど。
SIGINT 2 CTRL + C でプロセスを終わらせるときなど。
SIGKILL 9 kill -9 でプロセスを即座に強制終了させるとき。
SIGTERM 15 kill -15 を送ってプロセスを平和的に終わらせるとき。

kill -9 だとプロセスは問答無用で即終了するけど、kill -15 だとプロセスが自分の使ったテンポラリファイルやその他の資源の後始末をしてくれることが多い。

2005-04-11 (Mon)

* Linux をインストールした FMV のメモリを192MBに増設

この記事の直リンクURL: Permlink | この記事が属するカテゴリ: [PC] [Linux]

pro は 私の管理している Linux マシン。64MB の PC66 SDRAM を2枚搭載し、128MBの広大なメモリ空間を誇る。

- メモリが手に入った

pro の128メガバイトというメモリ容量は今の一般的な Windows デスクトップマシンと比べると少なく感じるが、ファイルサーバ、DB サーバ、ウェブサーバ、その他 Perl や Ruby を実行するためのアプリケーションサーバとしては十分だった。インターネット向けではなくイントラネット向けのため、トランザクションも少ない。

ひょんなことから、PC66 の 128MB メモリが2枚手に入った。pro は 64MB * 2 で 128MB だったはずなので、128 * 2 に換装すれば一気に倍のメモリ空間を使えることになる。Socket7 のため、L2 キャッシュはマザー側に実装。たぶん128か64MBを超えると L2 を使わないか遅くなるとは思うけど、200MHz の MMX Pentium が5%遅くなったところで気になるレベルではない。CPU パワーが必要なジョブは他のマシンで実行するし。

- lilo.conf の書き換え

実は、pro では ブートローダで搭載メモリ量を指定している。Linux でも搭載メモリ量は基本的に自動で認識されるが、このマシンと OS の組み合わせだと 64MB しか認識されなかった。そのため、ブートローダ lilo のパラメータで明示的に搭載している物理メモリ量を指定しているのだ。

リモートの作業しやすいターミナルから、あらかじめ lilo の設定ファイル lilo.conf を書き換えておくことにした。lilo のインストールは換装完了後にコンソールからやる予定。

lilo.conf をバックアップしておくため lilo.conf.mem128M としてリネームコピーする。

[hiroaki@pro ~]$ cat /etc/lilo.conf.mem128M
boot=/dev/hda
map=/boot/map
install=/boot/boot.b
prompt
timeout=50
lba32
default=linux

image=/boot/vmlinuz
        label=linux
        read-only
        root=/dev/hdb3
        append="mem=128M"

lilo.conf を開き、mem=128M を 256M に変更。

        append="mem=256M"

さあ、準備完了。電源を落とすのはコンソールからやりたいので、いったんログアウトし、pro の筐体の前に向かう。

- 換装作業

pro には普段キーボードもマウスも繋がっていない。リモートログインすればいいので、必要ないのだ。別のマシンに繋がっていたキーボードを借りてきて、pro に繋げる。コンソールにログインし、root になって shutdown -h now を発行すると、ほどなくして電源が落ちた。

電源供給をしているケーブルを抜き、pro のケースを開ける。所々に少し埃がある。DIMM スロット数は2。静電気を逃がすために金属に触れてから、2枚の64MB PC66 SDRAM を抜き、128 MB PC66 SDRAM を挿す。そして電源投入。簡単なものだ。

- 256MB のメモリを認識してくれない

電源を投入すると、様子がおかしい。BIOS のメモリチェックでは 64MB しか認識していない。

とりあえず DIMM1 と DIMM2 を入れ替えてみたが、256MB にならない。もとの 64MB PC66 SDRAM を2枚挿すと 128MB になる。もしかして、このマザーボードは3バンクまでしか認識しないのかな。DIMM1 に片面実装の 64MB PC66 SDRAMを、DIMM2 に 両面実装の 128MB PC66 SDRAM を挿したところ、無事認識された。ビンゴだ。やはり3バンクまでしか使えないらしい。となると、128 * 2 は無理だな。まあ仕方ない。

とりあえずこの状態で Linux が起動するかどうかをテスト。lilo.conf は書き換えたが、/sbin/lilo でブートローダを再インストールしていないので設定は 128MB のまま。無事起動することを確認。

あらかじめ作っておいた 256MB 指定の lilo.conf を 192MB に書き換え、/sbin/lilo でブートローダを再インストールし、shutdown -r now を実行。

[hiroaki@pro ~]$ cat /etc/lilo.conf
boot=/dev/hda
map=/boot/map
install=/boot/boot.b
prompt
timeout=50
lba32
default=linux

image=/boot/vmlinuz
        label=linux
        read-only
        root=/dev/hdb3
        append="mem=192M"

free で確認すると、無事 192MB 分認識されてる。OK。おつかれさまでした。

2004-08-31 (Tue)

* at で時間指定コマンド自動実行

この記事の直リンクURL: Permlink | この記事が属するカテゴリ: [Linux]

いつも使っているサーバのある建物が9月最初の週末に停電するという。停電の前日にマシンをシャットダウンしておきたいが、その日は該当マシンにログインできる場所にいない。仕方がないので、停電の前日の夕方に自動的にシャットダウンするように at を仕込んでおくことにした。

- at と cron の違い

cron を使っても at と同じように時刻を指定してコマンドを実行することはことはできるが、at は cron と違って一回だけのコマンド実行に適している。とあるサーバで cron を削除するのを忘れていて、次の年の同じ月の同じ日にコマンドが起動してしまった例を目撃したことがある。私の管理しているマシンではなかったので私に被害はなかったけど。先達の失敗を教訓とするため、今回は cron は使わずに at を使うことにした。

- at の使い方を調べる

実は私は at を使ったことがない。Windows の at コマンドはよく使うが、Unix の at を使うのは初めてだ。まずはマニュアルを読むことにする。

Manpage of AT
http://www.linux.or.jp/JM/html/at/man1/at.1.html
書式
at [-V] [-q queue] [-f file] [-mldbv] TIME
at -c job [job...]

解説
at と batch は、標準入力や指定されたファイルからコマンドを読み取り、後で /bin/sh を使って実行する。
(略)
at ではある程度複雑な TIME 指定ができる。これは POSIX.2 標準を拡張したものである。ジョブを実行する時刻は HH:MM という形式で指定できる。 (すでにその時刻を過ぎているときは次の日に実行する。) また midnight (真夜中), noon (正午), teatime (午後4時のお茶の時間) とか、 AM , PM も指定できる。さらに、コマンドの実行日を指定することもできる。日付の指定は month-name day ( year も追加できる) のようにする。または MMDDYY, MM/DD/YY, DD.MM.YY なども可能である。日付の指定は、その日の時刻の後に指定しなければならない。

なるほど、わかった。やってみよう。

- at でコマンドを設定する

来月の3日の18時に、すなわち 2004年9月3日の18:00に ls を実行するよう at をセットしてみる。

[hiroaki@pro ~]$ echo ls |at  6pm + 3 days
warning: commands will be executed using /bin/sh
job 2 at 2004-09-03 18:00

できた。warning は気にしなくても良いのかな? コマンドラインに誤りがないんだったら、warning じゃなくて notice って書いてほしいな。

よし、次は shutdown コマンドをスケジュールしてみよう。一般ユーザでも大丈夫なのかな。そういえば、私は英語的な表記で日時を指定するはあんまり好きじゃないんだよね。見る分には構わないんだけど、入力するときは煩雑に感じる。スラッシュで日付を区切る表記で書いてみよう。

[hiroaki@pro ~]$ echo "/sbin/shutdown -h now" |at 18:00 03/09/2004
warning: commands will be executed using /bin/sh
job 4 at 2004-03-09 18:00
よしよし、一般ユーザでもセットすることだけはできるようだ。実際は実行時に権限がないというエラーが出るだろうけど。atrm でジョブを削除して、と。

2004年9月1日追記。
Output from your job 4 という件名のメールが来ていた。root じゃないと シャットダウンできないよ、という内容が書かれていた。
shutdown: must be root.

- 失敗

よし、次は本番のコマンドをセットするぞ。root に su - してさっきのコマンドラインをコピーアンドペースト、と。

# echo "/sbin/shutdown -h now" |at 18:00 03/09/2004

[root@pro /root]#
Broadcast message from root Tue Aug 31 18:36:17 2004...

The system is going down for system halt NOW !!

え!? ちょっと待って! なんで今シャットダウンしてるの? あああああ、待ってー! あ、putty ターミナルが応答しなくなった。

ほんとにシャットダウンしちゃったよ。何で? ・・・って、コマンド実行日が 2004年9月3日じゃなくて 2004年3月9日になってる。スラッシュを使った日付指定では MM/DD/YY で指定するのか。ピリオドを使った DD.MM.YY 形式の指定と間違えてた。2004年3月9日は既に過ぎていたのでキューに追加された瞬間に実行したってワケか。なるほど。

幸い、私以外にこのマシンにログインしていたユーザはいなかったし、イントラネット内で使っている開発用サーバだったので被害はほぼなかった。これがインターネット上にある本番のサーバだったら始末書ものだったところだ。

注意力が散漫になっている今の状態でこのマシンを扱うのは、今日はもうやめておこう。明日もう一度テストしてから at をセットすることにしよう。

2004年9月1日追記。
まずテスト。一分後にシャットダウンするようにしてみる。
# echo "/sbin/shutdown -h now" |at 15:05 09/01/2004

OK。ちゃんと電源が落ちた。

本番用の日付で仕込んで完了。
# echo "/sbin/shutdown -h now" |at 18:00 09/03/2004

2004-08-16 (Mon)

* ポートノッキングと隠蔽技術

この記事の直リンクURL: Permlink | この記事が属するカテゴリ: [Linux] [セキュリティ]

ポートノッキングとは、ある特定の順番でポートを叩いたときだけ接続を許可する仕組み。コードは見ていないが、きっと SYN を監視しているんだろう。

japan.linux.com | ポートノッキング批判
http://japan.linux.com/security/04/08/13/0250213.shtml
表題は「ポートノッキング批判」だけど、ポートノッキングそのものを批判してるんじゃなくて、セキュリティ関連の技術についての考え方や使い方についての記事だった。

ポートノッキングという仕組みはこの記事を読んで初めて知った。面白い機能だ。単体では信頼性に難があるが、既存の技術と組み合わせればセキュリティをより強固にできる。

この記事を読んでいると「内密チャンネル」や DNS を使ってトンネリングする「TCP over DNS」を想起させる。とくに重要そうに見えないデータには別の意味があり、そこに大事な情報が隠されているってシチュエーション、なんだかワクワクする。

内密チャンネル
http://www.dd.iij4u.or.jp/~okuyamak/Information/convert_chan ...

TCP over DNS
http://www.nantoka.com/~kei/diary/?200311a&to=200311041# ...
http://61.203.92.65/~fkz/daiary/200406.html#d020858

2004-07-23 (Fri)

* 複数サーバから fetch する .fetchmailrc

この記事の直リンクURL: Permlink | この記事が属するカテゴリ: [Linux] [メール]

メールサーバが増えたので、2003-12-08 に書いた .fetchmailrc を修正して複数のサーバのメールを fetchmail するようにした。
set postmaster hiroaki
set nobouncemail
defaults
        protocol pop3
        keep
        smtphost localhost
        mda "/usr/bin/procmail"

poll 10.50.200.3
        user "私の名前"
        pass PASSWORD

poll 10.99.31.3
        user saitou@example.com
        pass PASSWORD

2004-06-13 (Sun)

* Linux 用の圧縮ファイルシステム

この記事の直リンクURL: Permlink | この記事が属するカテゴリ: [Linux]

Windows の NTFS には、ファイル単位・ディレクトリ単位に適用できるファイルシステムレベルの圧縮機能がある。元から圧縮されている音楽や画像・動画には全くと言っていいほど効果がなくて単に遅くなるだけだが、テキスト形式のログや html ファイル、XML ファイルには有効だ。元のファイルの60%から50%くらいまで容量を抑えることができる。Linux でも同じ様なことができないかなーと思い、Linux で使える圧縮ファイルシステムを探してみた。

- e2compr

http://e2compr.sourceforge.net/

後述する e2compress の "The Modern Age" バージョン。April 20, 2004 にリリースされたバージョンは linux-2.4.26-e2compr-0.4.44-1.diff.bz2 となっていることから、Linux カーネル 2.4.26 に対応している模様。カーネル 2.6 への移植も予定しているとのこと。ext3 のジャーナリングと同時には使えない。何ができて何ができないのかについては http://e2compr.sourceforge.net/faq.html の FAQ が参考になる。

- e2compress

ext2 用。上記 e2compr の前身。http://e2compr.sourceforge.net/ では "The Third Age" と呼ばれていた。カーネル 2.2 の頃は結構使われていたようで、ウェブにもドキュメントや導入事例がたくさんあった。ただ、最近ではあまり使われていない模様。カーネル 2.4.17 まで対応している。それ以降のカーネルには前述の e2compr を使う。

e2compress
http://www.alizt.com/
Transparent compression of ext2 filesystem for kernel 2.4

- cloop

knoppix でおなじみの圧縮ループバックファイルシステム。読み取り専用のようだ。

- AVFS

WindowsXP の圧縮フォルダみたいな機能らしい。

use-avfs
http://add10.hp.infoseek.co.jp/rox/avfs.html
AVFS は圧縮アーカイブ(例えば zip、gzip、bzip2)や tar、rpm などを仮想ファイルシステムに展開し、内部に降りていく機能を提供します。

- Cramfs

JF: Linux Kernel 2.4 Documentation: cramfs.txt
http://www.linux.or.jp/JF/JFdocs/kernel-docs-2.4/filesystems ...
読み取り専用の圧縮ファイルシステム。組み込み機器などで使うらしい。

- NEW Ext4 filesystem for linux (with on the fly transparent compression)

http://www.geocities.com/maxcompress/

タイトルの表記は Ext4 となっているが、本文中では Extended Z Filesystem For Linux と呼んでいる。
Extended Z filesystem = Extended 3 filesystem + on-the-fly transparent compression + automatic encryption.
(略)
It is compatible with all 2.4.x and later kernels.

Extended Z filesystem は ext3 に透過的な圧縮と暗号化を付加したもので、カーネル 2.4系列に対応と書かれている。本当だとしたら素晴らしい。

パッケージは www.geocities.com/maxcompress/ExtZ.zip からダウンロードできたようだが、今では 404 Not Found になってしまう。もしかして、このサイトってもうメンテナンスされていないんじゃないか? 試しに http://www.geocities.com/maxcompress/ に HTTP HEAD してみる。
Date: Thu, 10 Jun 2004 02:38:37 GMT
うーん、どう見ても放置状態だ。これじゃダメだ。

- zisofs

iso9660 用の圧縮ファイルシステム。 安定版の Last release が 06-Nov-2002 だから、結構古い。

The zisofs filesystem is an extension to the ISO9660 filesystem that allows files, on a file-by-file basis, to be stored compressed and decompressed in real time. The zisofs filesystem is supported by recent versions of Linux (2.4.14 or later).

- DMSDOS fs

http://www.noizumi.org/~noizumi/linux/dmsdos.html
Win95等で使われている圧縮ドライブをLinuxで使用可能にする。

Windows の圧縮ドライブって、信頼性に問題があったような気がする。あまり魅力的じゃないなあ。

- gzexe

圧縮ファイルシステムとはちょっと違う。実行ファイルを gzip で圧縮して、それを呼び出すためのシェルスクリプトを生成する。シェルスクリプトには、圧縮された元の実行ファイルのデータが付加される。

Manpage of GZEXE
http://www.linux.or.jp/JM/html/GNU_gzip/man1/gzexe.1.html
gzexe - 実行ファイルを実行できる形で圧縮する

cygwin にも gzexe が入っていたので、試しに /bin/cat を gzexe してみた。
$ gzexe /bin/cat
sed: can't read /bin/cat: No such file or directory
cp: `/bin/cat' and `gz720' are the same file
gzip: /bin/cat: No such file or directory
gzexe: compression not possible for /bin/cat, file unchanged.

あれ? そんなファイルは無いって? おかしいな。/bin/ca までタイプして tab キーでファイル名を補完させてみる。
$ gzexe /bin/ca
cal.exe        captoinfo.exe  cat.exe
あ、なるほど。windows 上のファイル名で指定しないとダメなのか。

gzexe が置き換えた実行ファイルの中身。ちなみにサイズは圧縮前が 17KB で、圧縮後が 9KB だった。なかなかいい。
#!/bin/sh
skip=22
set -C
umask=`umask`
umask 77
if /usr/bin/tail -n +$skip "$0" | "/usr/bin"/gzip -cd > /tmp/gztmp$$; then
  umask $umask
  /bin/chmod 700 /tmp/gztmp$$
  prog="`echo $0 | /bin/sed 's|^.*/||'`"
  if /bin/ln /tmp/gztmp$$ "/tmp/$prog" 2>/dev/null; then
    trap '/bin/rm -f /tmp/gztmp$$ "/tmp/$prog"; exit $res' 0
    (/bin/sleep 5; /bin/rm -f /tmp/gztmp$$ "/tmp/$prog") 2>/dev/null &
    /tmp/"$prog" ${1+"$@"}; res=$?
  else
    trap '/bin/rm -f /tmp/gztmp$$; exit $res' 0
    (/bin/sleep 5; /bin/rm -f /tmp/gztmp$$) 2>/dev/null &
    /tmp/gztmp$$ ${1+"$@"}; res=$?
  fi
else
  echo Cannot decompress $0; exit 1
fi; exit $res
(以下、バイナリが続く)

- 今時の圧縮ファイルシステムは特殊用途向け

今回調べて見た限りでは、Linux 向けの圧縮ファイルシステムは、特殊用途向けにしか存在しないようだ。デスクトップマシンやサーバなどでよく使われる ext3 や xfs などのファイルシステムに圧縮機能を追加したものはみつけられず、あったとしても ext2 などにしか対応していない。

やっぱりディスク容量がこれだけ大きくなってくると、需要がないんだろうな。圧縮すればディスク I/O も減るけど、CPU 資源を消費してしまう。CPU は余ってるけど I/O がいっぱいいっぱいで、かつ圧縮が効くテキストデータを主にサービスするサーバって・・・2ちゃんねるの過去ログ倉庫サーバとか? あ、でもあれは gzip した dat を収めてるんだっけ?

過去ログといえば、みみずん検索 http://www1.odn.ne.jp/mimizun/ のみみずん氏は Namazu + Windows2000 で2ちゃんねるの過去ログ検索をサービスしてて、NTFS 圧縮は便利って言ってたっけ。でもこれもある意味特殊用途だなあ。

- 参考

[linux-users:100451] ファイルシステムの圧縮(Kernl2.4)
http://search.luky.org/linux-users.a/msg00400.html

いわわメモ 圧縮ファイルシステム
http://www.si-linux.co.jp/iww/diary/?200301c&to=20030129 ...
e2compr(ext2) dmsdos cloop cramfs jffs2 AVFS fuse どれか

2004-04-22 (Thu)

* jigdo Windows 版で Debian の CD を作成

この記事の直リンクURL: Permlink | この記事が属するカテゴリ: [Linux]

Windows 環境で、jigdo を使って Debian Woody のインストール CD を作成する。

「install - Debian GNU/Linux スレッドテンプレ 」http://debian.fam.cx/index.php?install#content_1_14 にも書かれているとおり、Debian GNU/Linux 3.0 Woody は全8枚あるインストール CD のうち、一枚目さえあればインストールできる。現時点での最新版は 3.0 Release 2 なので、debian-30r2-i386-binary-1_NONUS.iso を作成する手順を記す。

- 作業内容の要約

jigdo 本体をダウンロード。
NONUS の一枚目の iso の .jigdo と .template をミラーサイトからダウンロード。
jigdo-lite-settings.txt に deb パッケージのミラーサイトやプロキシ設定を記述。
jigdo-lite.bat を実行して enter キー連打。
jigdo が勝手に iso イメージを作って md5 ハッシュによる整合性チェックまでやってくれて生成完了。

- 一枚目の CD だけでインストールできる

Debian 3.0 woody は、一枚目だけでインストールできる。「最低でも三枚目まで必要」と書いているサイトもあったが、私の環境では一枚目だけで bf24フレーバーで Kernel 2.4 環境をインストールすることができた。

- jigdo を使う理由 - iso を直接ダウンロードするよりも jigdo の方が楽

Linux ディストリビューションの多くは iso 形式でインストール CD を配布しているが、Debian では iso はあまりお目にかからない。jigdo という便利なツールがあるためだ。

jigdo を使うと、たくさんの debian パッケージファイルをダウンロードして自動的に統合して、インストール用 iso を作ってくれる。ダウンロードしたファイルが壊れていないことも自動的にチェックしてくれるので非常に楽だ。また、旧バージョンのインストール CD を持っていれば、差分だけをダウンロードして最新の iso を作ることもできる。

- jigdo のダウンロードと起動

jigdo のサイトからダウンロード。
http://atterer.net/jigdo/

今回は jigdo-lite 0.7.0a for Windows http://atterer.net/jigdo/jigdo-win-0.7.0a.zip をダウンロードした。zip ファイルを十分な空き容量があるドライブに展開し、jigdo-lite.bat をダブルクリックすると jigdo が起動する。

- 設定ファイル jigdo-lite-settings.txt にあらかじめ設定を記述する

jigdo は対話形式のツールとなっているが、あらかじめ設定ファイルを作っておき、それに従って半自動で動作させた方が楽だ。また、proxy サーバを使う場合も、設定ファイルを書いておいた方が起動時にいちいち proxy のアドレスを指定する手間を省ける。

設定ファイルは jigdo-lite-settings.txt だ。jigdo-lite.bat と同じディレクトリに jigdo-lite-settings.txt が既に存在するならば、メモ帳などで編集する。もしなければ、jigdo-lite.bat を実行して jigdo を起動したあと、何も入力せずに enter キーを何回か押すと jigdo が終了して jigdo-lite-settings.txt が自動生成される。

自動生成された jigdo-lite-settings.txt の中身は以下のようになっていた。ここに設定を書き加えていけばいい。
jigdo=''
debianMirror=''
nonusMirror=''
tmpDir='.'
jigdoOpts='--cache jigdo-file-cache.db'
wgetOpts='--passive-ftp --dot-style=mega --continue --timeout=30'
scanMenu=''

- jigdo='' に jigdo テンプレートサイトの URL を指定

.jigdo ファイルと .template ファイルのダウンロード先を指定する。しかし、私はこれらのファイルは自分の手でダウンロードすることを勧める。

「jigdo をつかって Debian CD イメージをダウンロードする」 http://www.debian.org/CD/jigdo-cd/ を見ると、「公式イメージ」としてus.cdimage.debian.org や non-us.cdimage.debian.org を紹介しているが、これらのサイトはいつも混雑していて重く、遅い。事実、米国ミラーの us.cdimage.debian.org などは接続さえできなかった。.jigdo ファイルは数十キロバイトのサイズしかないが、.template ファイルは数十メガバイトになることもあるので、できれば高速なミラーサイトを指定したいところだ。

ただ、ここで .jigdo を提供するミラーサイトの URL を指定しても、実はあまり意味がないようだ。というのも、.jigdo ファイルはミラーサイトからダウンロードしてくれるのだが、.template ファイルは jigdo='' の設定を無視して常に us.cdimage.debian.org からダウンロードしようとするからだ。もしかしたら私の環境固有で発生する問題なのかもしれないが、何度やっても jigdo は .template ファイルを us.cdimage.debian.org からダウンロードしようとするので非常に困った。

この問題の対策は、.template ファイルを jigdo を使わずに自分でダウンロードし、jigdo-lite.bat と同じディレクトリに配置することだ。こうすることで、us.cdimage.debian.org にアクセスせずに済む。

.template を自分でダウンロードするときのミラーは、日本からアクセスするのであれば、以下のサイトがよいだろう。us.cdimage.debian.org などよりも遙かに高速にダウンロードできるだろう。

debian.gr.jp: http://ftp.debian.gr.jp/jigdo/official/i386/
いしかわむつみさんのミラー http://hanzubon.jp/jigdo/official/i386/

今回は、http://ftp.debian.gr.jp/jigdo/official/i386/woody-i386-1_NON ... を使うことにした。ちなみに、これらのサイトは Google で woody-i386-1_NONUS.template を検索して見つけた。jigdo テンプレートをミラーしているサイトはあまり無いようなので、これらのサイトは貴重だ。ありがたく使わせてもらおう。

jigdo-lite-settings.txt には以下のように記述した。
jigdo='http://ftp.debian.gr.jp/jigdo/official/i386/woody-i386-1_NONUS.jigdo'

- debian パッケージのミラーサイトを指定

debianMirror='' と nonusMirror='' に、debian パッケージのミラーサイトを指定する。

日本なら RingServer のどれかを指定すると良いだろう。もし企業や大学などで自分のネットワーク内にミラーを持っている場合はそちらを使う。どの RingServer を指定するかで速度や安定性が左右されるので、できるだけ自分のネットワークから近いサーバを指定する方が良い。

わからなければ、近いサーバに自動転送される http://www.t.ring.gr.jp/ を使うか以下の大手ミラーを使おう。

OCN: http://ring.ocn.ad.jp/archives/linux/debian/debian/
パワードコム: http://ring.pwd.ne.jp/archives/linux/debian/debian/
wakwak: http://ring.wakwak.com/archives/linux/debian/debian/

本当はこうやって候補を挙げてしまうと、これらのサーバにリクエストが集中するので良くない。ただ、海外のミラーや本家のサーバに接続されるよりはずっといいので、ここに記しておく。

私の場合、使用しているプロバイダの上流プロバイダがパワードコムだったので、パワードコムが提供している RingServer を指定することにした。

debianMirror='http://ring.pwd.ne.jp/archives/linux/debian/debian/'
nonusMirror='http://ring.pwd.ne.jp/archives/linux/debian/debian-non-US/'

- jigdo が使う proxy サーバの指定

プロキシを使用する場合、wgetOps に記述する。10.5.8.6 の ポート 10586 にあるプロキシを使うのであれば以下のようにする。
wgetOpts='--passive-ftp --dot-style=mega --continue --timeout=30 -e ftp_proxy=http://10.5.8.6:10586/ -e http_proxy=http://10.5.8.6:10586/'

- 完成した jigdo-lite-settings.txt

jigdo='http://ftp.debian.gr.jp/jigdo/official/i386/woody-i386-1_NONUS.jigdo'
debianMirror='http://ring.pwd.ne.jp/archives/linux/debian/debian/'
nonusMirror='http://ring.pwd.ne.jp/archives/linux/debian/debian-non-US/'
tmpDir='.'
jigdoOpts='--cache jigdo-file-cache.db'
wgetOpts='--passive-ftp --dot-style=mega --continue --timeout=30 -e ftp_proxy=http://10.5.8.6:10586/ -e http_proxy=http://10.5.8.6:10586/'
scanMenu=''

- いざ jigdo-lite.bat を実行

jigdo-lite.bat を実行すると、jigdo テンプレートの URL やミラーサイトの URL を尋ねてくる。先ほど jigdo-lite-settings.txt に書いておいた内容が初期値として設定されているので、enter キーを連打するだけで設定通りに作業が進む。実に楽だ。

-----------------------------------------------------------------
To resume a half-finished download, enter name of .jigdo file.
To start a new download, enter URL of .jigdo file.
You can also enter several URLs/filenames, separated with spaces,
or enumerate in {}, e.g. `http://server/cd-{1_NONUS,2,3}.jigdo'
jigdo [http://ftp.debian.gr.jp/jigdo/official/i386/woody-i386-1_NONUS.jigdo]:
上記は「jigdo ファイルの URL を入れてね」というメッセージ。jigdo-lite-settings.txt に設定した値が初期値として表示されている。初期値でよければそのまま enter キーを押すだけ。

-----------------------------------------------------------------
If you already have a previous version of the CD you are
downloading, jigdo can re-use files on the old CD that are also
present in the new image, and you do not need to download them
again. Enter the path to the old CD ROM's contents (e.g. `d:\').
Alternatively, just press enter if you want to start downloading
the remaining files.
Files to scan:

上記は「古い debian の CD 持ってるんだったら、その CD より新しいパッケージだけダウンロードするから CD 入れてね」というメッセージ。持ってないんだったら何も入力しないで enter キーを押す。持っている場合は、CD のパスを入力する。CD-ROM ドライブが d: だったら、d:\ と入力する。CD じゃなくても、CD の中身を含んだディレクトリなら利用できるようだ。

-----------------------------------------------------------------
The jigdo file refers to files stored on Debian mirrors. Please
choose a Debian mirror as follows: Either enter a complete URL
pointing to a mirror (in the form
`ftp://ftp.debian.org/debian/'), or enter any regular expression
for searching through the list of mirrors: Try a two-letter
country code such as `de', or a country name like `United
States', or a server name like `sunsite'.
Debian mirror: [http://ring.pwd.ne.jp/archives/linux/debian/debian/]:

上記は「ミラーサイトの URL を入れてね」というメッセージ。初期値で良ければそのまま enter キーを押す。

-----------------------------------------------------------------
The jigdo file also refers to the Non-US section of the Debian
archive. Please repeat the mirror selection for Non-US. Do not
simply copy the URL you entered above; this does not work because
the path on the servers differs!
Debian non-US mirror: [http://ring.pwd.ne.jp/archives/linux/debian/debian-non-US/]:

上記は「non-US のミラーサイトの URL を入れてね」というメッセージ。初期値で良ければそのまま enter キーを押す。

ここまで指定するとファイルのダウンロードが始まる。あとは jigdo が勝手にやってくれるので、見てるだけだ。お茶を飲んだり、ゆっくり音楽を聴いたりして待とう。

ダウンロードが終わると、.iso ファイルができているはずだ。その後放っておくと、自動的にファイルの正当性チェックまでやってくれる。CTRL + C でチェックを強制的に終わらせることもできるが、チェックしてもらった方が安心だ。
Finished!
The fact that you got this far is a strong indication that
`debian-30r2-i386-binary-1_NONUS.iso'
was generated correctly. I will perform an additional,
final check,
which you can interrupt safely with Ctrl-C if you do not
want to wait.

OK: Checksums match, image is good!

OK: Checksums match, image is good! が出たらすべて無事完了ということになる。

- 参考にしたサイト

Debian Jigdo mini-HOWTO
http://www.linux.or.jp/JF/JFdocs/Debian-Jigdo/

jigdo をつかって Debian CD イメージをダウンロードする
http://www.debian.org/CD/jigdo-cd/

2004-04-14 (Wed)

* Webupdate PkgUpload GPackage

この記事の直リンクURL: Permlink | この記事が属するカテゴリ: [Linux]

月例のWindows Update をしていたら、Windows の SUS (Software Update Service) みたいな機能を持っているフリーのシステムってないかなあ、とふと思った。

- Software Update Service とは

@IT:運用 Microsoft Software Update Servicesの実力を探る 1.Software Update Servicesの概要
http://www.atmarkit.co.jp/fwin2k/operation/sus1/sus1_02.html
SUSは、次々と発表されるWindowsの修正プログラム(修正プログラムにはいくつか種類があるが、以下ではSUSの機能に合わせてHotfixと呼ぶ)を、安全に社内中のクライアント・マシンへ配布して、自動的にインストールするためのシステムである。マイクロソフト社のWindows Updateサーバから最新のHotfixモジュール類を定期的に収集して、それをユーザー組織内に用意したSUSサーバに蓄積しておく。そして各クライアントへは、このSUSサーバから直接Hotfixを配布し(送信し)、インストールすることができる。どのHotfixを、どのタイミングでクライアントへ配布するかは、Active Directoryのグループ・ポリシーを使って制御する。SUSを利用すれば、最大でも2日以内の遅れで(Windows UpdateサーバからSUSサーバへの同期作業に最長1日、そこからクライアントへの同期にさらに1日)、公開されているHotfixをクライアントへ適用することができる。Hotfixを適用後、必要ならば自動的にシステムの再起動も行う。

 ただし、マイクロソフト社のWindows Updateサーバ経由でWindows Updateを行う場合とまったく同じ機能が実現できるのかというと、残念ながらそうではない。まず最初にSUSでできることと、できないことについて簡単にまとめておこう。

- Google で検索

Google で debian apt 管理 クライアント 配信を検索。検索語が曖昧というか普遍的な単語であるためノイズが多い検索結果となってしまったが、トップでヒットしたサイトが似たシステムを公開していたが、結局希望のシステムは見つけられなかった。

Debian GNU/Linux上で動作する簡易パッケージ管理システム
http://desktop.good-day.net/gpackage.html
グッデイでは、情報処理推進機構 (IPA)のオープンソフトウェア活用基盤整備事業の一環として、Debian GNU/Linux上で動作する簡易パッケージ管理システムを開発いたしました。

簡易アプリケーション管理機能
  グラフィカルな環境でのアプリケーションの追加と削除を実現します。

更新されたアプリケーション情報の自動通知機能
  アプリケーションのヴァージョンアップを自動的に通知・ダウンロード・インストールする機能です。

Webベースのアプリケーションインストール機能
  ブラウザから、ワンクリックでデスクトップアプリケーションのインストールやアップデートが行えます。

IPA のサイトを検索すると、以下がヒットした。なるほど、できたてのシステムなんだな。

平成15年度オープンソフトウエア活用基盤整備事業 公募結果
http://www.ipa.go.jp/software/open/2003/saitaku/goodday.html

- ソースとマニュアルが公開されている

http://desktop.good-day.net/gpackage.html のページはどこがリンクになっているのかわかりにくいが、とりあえずマニュアルとソースが公開されている。まだ読み終えていないので確かなことは言えないが、アプリケーションを配信することはできるが、どのクライアントにどのアプリケーションのどのバージョンがインストールされているかを管理することはできないようだ。ただ、今の純粋な apt よりもこういったインターフェイスがあると、初心者ユーザやコマンドラインに馴染みのないユーザには非常に心強い。

- GPackage

クライアント側で動作するフロントエンド。

http://desktop.good-day.net/gpackage_manual/
GPackageとは、Debian GNU/Linux(以下Debian)上で動作するインストール、アップデートシステムのGUIフロントエンドである。

- Webupdate

配信サーバ側で動作する。登録済みのパッケージをジャンル毎に分類したり、アプリケーションの情報を編集したりできる。どのアプリケーションにどのパッケージが関連づけられるのか、といった情報はここで管理できる。

http://desktop.good-day.net/webupdate_manual/
Webupdateとは、Debian GNU/Linux(以下Debian)のアプリケーションをWebベースでインストール、アップデートするシステムのサーバサイドのスクリプトである。

- PkgUpload

配信サーバ側で動作する。パッケージのアップロード受付機能と、登録済みパッケージの閲覧と削除機能がある。

http://desktop.good-day.net/pkgupload_manual/
PkgUploadとは、Debianパッケージやそのソースを、アプリケーション配信サーバにアップロードし、パッケージやソースの削除・登録・一覧・情報閲覧ができる、PHPによるサーバサイドスクリプトである。

- ライセンスは GPL2

ところで、このシステムのライセンスはどうなってるんだろう? Google で ライセンス site:desktop.good-day.net を検索しても、このシステムのライセンスは見つけられなかった。Debian ベースだし、「オープンソフトウエア活用基盤整備事業」というプロジェクト名から推察するに、自由度の高いライセンスだとは思うが。

http://desktop.good-day.net/gpackage/packages/ からソースをダウンロードできる。gpackage-1.2.2 の tar ball を展開して見てみたところ、README には GPL2 とあった。

2004-04-10 (Sat)

* Debian マシンに60GBのハードディスクを増設

この記事の直リンクURL: Permlink | この記事が属するカテゴリ: [Linux] [PC]

Debian woody に samba を入れたマシンをファイルサーバにしている。60GB のハードディスクが余っているので、このマシンにつけることにした。2003年の3月26日にもほぼ同様の作業をしていたので、その手順を踏襲した。

- 対象マシンのスペック

マザーボード: Epox P55 VP3 Socket7
BIOS: 2000/04/11 http://www.motherboards.org/files/biosup/94/vp300411.exe
CPU: K6-2 333MHz
Memory: 512MB (256MB + 128MB + 128MB)
HDD: ST38410A 8GB、Maxtor 96147H6 60GB
NIC: Intel Corp. 82557 [Ethernet Pro 100] (rev 01)
Video: Trident Microsystems 3DIm`age 975 (rev f3)

増設するディスクは Maxtor 96147U8 60GB。

- 物理的にドライブを取り付け

3.5インチベイはもう一杯なので5インチベイを使うことにするが、マウンタがない。友達に車を出してもらってドスパラ宇都宮店に買いに行った。ここで IDE を IEEE1394や USB に変換する機器を買っても良いのだが、もっと手頃な値段の3.5-5インチ変換マウンタを2つ購入した。ainex の PA-008BK 税込み504円 * 2。一つは仕事場用。
http://ainex.jp/list/case_in/pa-008bk.htm
http://ainex.jp/list/case_in/pa-008bk_s.htm
商品説明には FDD や MO のことしか書いていないが、ハードディスクの取り付けにも問題なく使える。

帰ってきてドライブを取りつけてブート。念のため BIOS 設定画面を確認。実はこのマシンのマザーはいわゆる「34GB の壁」の問題を抱えている。ただ、2003-03-28 にも書いたとおり、カーネルさえ対応していれば34GB を超える容量の IDE ハードディスクでも問題なく使える。その場合は BIOS が関わり合いになると逆にトラブルになるので、該当ドライブを BIOS から見えないようにしておく方が良い。ここでは Secondary Slave が None となっていることを確認した。

- fdisk でパーティションを切る

Debian をブート。セカンダリのスレーブとして接続しているので、/dev/hdd が割り当てられるはず。dmesg で確認すると、正しく認識されていた。

sonic:/home/hiroaki# dmesg |grep hdd
    ide1: BM-DMA at 0xe008-0xe00f, BIOS settings: hdc:DMA, hdd:DMA
hdd: Maxtor 96147U8, ATA DISK drive
hdd: attached ide-disk driver.
hdd: 120060864 sectors (61471 MB) w/2048KiB Cache, CHS=119108/16/63, UDMA(33)

まずは fdisk でパーティションを切る。普通ならそのまま新しいパーティションを切るだけなのだが、今回は BIOS が認識していないドライブにパーティションを作成するので、エキスパートモードに入ってシリンダ、ヘッダ、セクタを指定する必要がある。いわゆるジオメトリの上書きが必要なわけだ。

dmesg では
hdd: 120060864 sectors (61471 MB) w/2048KiB Cache, CHS=119108/16/63, UDMA(33)
と認識されていたので、C すなわちシリンダに 119108、H すなわちヘッダに 16、S すなわちセクタに 63 を指定してやればいい。

fdisk のプロンプトで x を押す。
Expert command (m for help) のプロンプトが出るので、c を押してシリンダを指定。
Number of cylinders (1-131071, default 7304): 119108
とした。同じように h を押してヘッダを指定、s を押してセクタを指定。最後に r を押して、エキスパートモードを抜ける。エキスパートモードを抜けたら n でパーティションを作成し、w でパーティションテーブルを書き込んで fdsik を終了。

- ファイルシステムを作成してフォーマット

ファイルシステムは ext3 にした。音楽ファイルなどを置くためのサーバなので、ブロックサイズは大きめに。スーパユーザ用予約領域は不要なので -m 0 を指定。
# mke2fs -c -T largefile -m 0  -j -J size=16 /dev/hdd1
さあフォーマット開始。・・・? あれ? なんだかキーボードが反応しなくなったよ? 別のマシンから ping を打っても返ってこない。カーネルごとフリーズしてるようだ。仕方ないのでハードウェアリセットし、もう一度 fdisk から作業し直すも、同じ現象が再発。以前60GB のディスクを増設したときと同じオプションで mk2fs してるんだけどなあ。

-c のチェック中にフリーズしてるようなので -c を外してフォーマット。あまり良くないけど、チェックは後回しにしよう。-c を外したらあっという間に mk2fs は完了。

- /etc/fstab に追加

/etc/fstab に以下を追加してリブート。本当ならマウントのテストなどをするべきだけど、私の個人用マシンだしまあ良いだろう。
/dev/hdd1      /home/archive2  ext3    defaults,noatime      0      2

- samba から書き込んでると・・・

samba から今回増設したドライブにファイルをコピーしていると、またもやフリーズ。ハードウェアリセットして、fsck /dev/hdd1 するとフリーズ。まさかこのディスク、壊れてるのか? Linux でカーネルごとフリーズするときは、たいていハードウェアが壊れている。ましてや woody は Debian の stable リリースなので、ソフトウェア的な問題である可能性は極めて低い。

- カーネルをアップデートしてもダメ

念のため kernel-image-2.4.24-2-k6 2.4.24-2woody.1 にアップデートしても状況が改善しない。これはもう十中八九ハードディスクの故障だろうな。でも、もしかしたらこのマシンの固有の環境が原因なのかもしれない。このドライブは取り外して、他の OS が入ったマシンで試してみることにしよう。たぶんダメだろうけど。残念。

- Widows2000 でもダメ

Windows2000 Pro SP3 をインストールして試してみる。やはりダメ。パーティションを切ったりフォーマットするところは問題ないのだが、起動中にフリーズ。

- 原因は何だろう?

サウスブリッジとドライブの速度不一致か何かが原因かと考え、ドライブ側のインターフェイスを UDMA33 に固定しようとしても、Maxtor のサイトにはツールがなかった。Maxblast 3 にはそういうツールは入ってなかったし。敗北宣言。このマシンでこのドライブを使うのは諦めた。

ドライブの故障だと思ってたけど、よく考えたらドライブの SMART 情報には問題ないし、異音があるわけでもない。ディスクが壊れているのではなくマザーとの相性が悪いだけなのかもしれない。あとは他のチップセットを搭載したマシンで試してみる。それでダメなら処分だな。

2004-04-08 (Thu)

* Linux マシンのメモリ使用量を節約する

この記事の直リンクURL: Permlink | この記事が属するカテゴリ: [Linux]

メモリ使用量を節約したいなら、余計なサービスやアプリケーションを起動しないようにすることだ。

- 不要なサービスを止める

サービスの止め方はディストリビューションによって微妙に流儀が異なる。Debian の場合をメモ。

Debian セキュリティマニュアル 3.6 必要最小限のサービスを走らせる
http://www.jp.debian.org/doc/manuals/securing-debian-howto/c ...

- 仮想コンソールの数を減らす

仮想コンソールとは、マシンに直接ログインするときに使うものだ。ALT + ファンクションキーで切り替えて使う。いつもはリモートから telnet や ssh でログインして使ってるので、仮想コンソールは使っていない。使う機会は年一回くらいのメンテナンスの時だろう。そのときも1個か2個あれば十分だ。

仮想コンソールがいくつ起動しているかは、ps -aux すれば確認できる。
USER      PID %CPU %MEM  VSZ  RSS TTY      STAT START  TIME COMMAND
root      325  0.0  0.3  1036  412 tty1    S    Mar30  0:00 /sbin/mingetty tty1
root      326  0.0  0.3  1036  412 tty2    S    Mar30  0:00 /sbin/mingetty tty2
RSS が物理メモリ消費量なので、仮想コンソール一つあたり412キロバイトを消費していることがわかる。

仮想コンソールの数を減らすには
http://www.atmarkit.co.jp/flinux/rensai/linuxtips/310delvcon ...

仮想コンソール
http://www.linux.or.jp/JF/JFdocs/Small-Memory/vconsole.html
3. 仮想コンソール
仮想コンソールの数を減らすと、使用メモリを大幅に節約できます。大部分の Linux ディストリビューションでは、初期状態で 6 個の仮想コンソールが作動していまが、 6 個の仮想コンソールを作動させると、だいたい平均で、約 4MB のメモリを消費します。この数を減らせば、数 MB 単位でメモリを節約できます。たいていのユーザは、 3 個か 4 個で充分です。いくつまで減らすかは使う人の好みにもよりますが、仮想コンソールの数を減らせば減らすだけ、その分アプリケーションが使用できるメモリの量が増えるということを忘れないでください。

仮想コンソールをいくつ動作させるかは、/etc/inittab に記述されています。仮想コンソールの数を減らすには、次のようにしてください。

1.テキストエディタで、/etc/inittab を開きます。

2.次のように書かれている行を見つけます(先頭が c1 で始まっているところがポイントです)。

  c1:12345:respawn:/sbin/getty tty1 38400 linux

このような行のうち、一番大きな数字で始まる行(たとえば、c6 )の行頭に # を書き込んでコメントアウトします(左側に空白をいれないようにしてください)。この作業を必要な回数だけ繰り返してください。1 行コメントアウトするごとに、起動するコンソールがひとつ減ります。

3.システムを再起動すると、設定が有効になります。

- Debian スレッドテンプレにも書いておこう

上記2点をまとめて書いておいた。

少しでもメモリ使用量を節約したい Tips - Debian GNU/Linux スレッドテンプレ
http://debian.fam.cx/index.php?Tips#content_1_10

2004-03-19 (Fri)

* ftp + tar + gpgで暗号化ネットワーク・バックアップ

この記事の直リンクURL: Permlink | この記事が属するカテゴリ: [Linux] [gpg] [ftp] [バックアップ]

ftp を使ったネットワークバックアップについての記事を 2003-12-01 に書いた。この手法の欠点の一つは、暗号化されないことだ。ftp に暗号化機能がないので仕方がないが、他のツールを組み合わせれば、暗号化できる。

- 何を暗号化するか

暗号化には通信経路上の暗号化とファイルの暗号化がある。通信経路上の暗号化だと、バックアップ先サーバへたどり着いた後のファイルは生のままになる。ファイルの暗号化だと、バックアップ先サーバに到達した後もファイルはずっと暗号化されたままだ。

通信経路の暗号化とファイルの暗号化のどちらが良いかは場合による。もちろん両方やっても良い。バックアップ先が共用のファイルサーバで、そのサーバの管理者を含め、自分以外のユーザがアクセスする可能性があるなら、ファイルそのものを暗号化したほうがいいだろう。

一方、バックアップ先が自分しかアクセスしないサーバだったら、通信経路上だけを暗号化してファイルを生で保存しておいた方が便利だろう。いざディスクがクラッシュして復旧しようとしているのに、暗号化解除のパスワードがわからない、といったトラブルも防げる。また、ファイルを暗号化しただけでは ftp のアカウントのパスワードが生のままネットワーク上を流れてしまうが、通信経路自体を暗号化すればこれも解決できる。

- 通信の暗号化

通信の暗号化を組み合わせたネットワークバックアップは、やったことがないのでとくに書かない。ssh、scp、sftp を使ったり、VPN を使ったり、方法はいくらでもあると思う。一応 ssh を使ったやり方について記事を見つけたのでメモしておく。

Q. cron 等から起動されるバッチ処理の中で ssh を利用したいのですが、ログインを自動化するにはどうすればよいですか?
http://www.jp.freebsd.org/QandA/HTML/2255.html

- ファイルの暗号化

暗号化できるならどんなツールでもいいが、今回の用途で使うならば、自動化ができて、強い暗号強度を持ち、無償で利用できるものがいい。この条件を満たす暗号化ツールとしては gpg がある。2004-01-08 に書いた「gpg: ファイルをパスワード/パスフレーズだけで暗号化/復号する」や「gpg: 標準入力からパスフレーズを渡してバッチ処理でファイルを暗号化」が参考になるだろう。

tar の出力を gpg に通して暗号化してやればいいのだが、私が使っている ftp コマンドは送信ファイル指定部分にパイプを使ったコマンドラインを記述できないようなので、該当部分はシェルスクリプトにした。

以下のようなスクリプトを用意して、tar で固めたデータを暗号化して出力できるようにする。
#!/bin/sh

PASS_PHRASE="passphrase"
TAR_TARGET="script etc"
BASE_DIR=/home/hiroaki

echo $PASS_PHRASE | { tar -C $BASE_DIR -zcf - $TAR_TARGET 2>/dev/null |gpg --batch -c --passphrase-fd 3;} 3>&0

これを 2003-12-01 の ftp バックアップスクリプトで呼ぶだけだ。tar で出力したファイルを暗号化しているので、拡張子に .gpg を付けている。
ftp -i -v -n 10.39.38.89 << END
user USER_ID PASSWORD
cd /d/backup
bin
put |/home/hiroaki/script/hgpg.sh "backup_`date +%a`.tar.gz.gpg"
quit
END

gpg 自体が圧縮機能を持っているので、gzip する必要性は薄いかもしれない。そのあたりはお好みで。

2003-12-23 (Tue)

* Debian GNU/Linux スレッドテンプレ

この記事の直リンクURL: Permlink | この記事が属するカテゴリ: [Linux]

http://debian.fam.cx/

FAQ の「インストールについて」が乱雑になっていたので、インストールメディア別に整理してみた。Wiki って簡単でいいなあ。
http://debian.fam.cx/index.php?FAQ

2003-12-16 (Tue)

* procmail Insufficient privileges エラー

この記事の直リンクURL: Permlink | この記事が属するカテゴリ: [Linux]

procmail がエラーを出している。

/var/tmp/dead.letter にエラーが記録されていた。
Dec 16 16:01:03 pro procmail[15195]: Insufficient privileges to deliver to "root"
Dec 16 16:01:03 pro sendmail[15194]: QAA15185: QAA15194: DSN: Insufficient permission

Google で Insufficient privileges to deliver to で検索するとヒット。
[linux-users:82563] Re: sendmail and procmail help me
http://search.luky.org/linux-users.8/msg02563.html
要するに procmail は root 権限がないと正常に動作しないよ、ということか。

root 権限で動作させるためには、setuid などの仕組みを使う。sticky bit や setuid などは普段意識していないため調べてみた。

UNIXの部屋 検索結果 chmod
http://x68000.startshop.co.jp/~68user/unix/pickup?keyword=ch ...
4000 user s-bit を立てる (setuid・suid)
2000 group s-bitを立てる (setgid・sgid)
1000 sticky bit を立てる

というものがある。

% chmod 4755 file

あるいは

% chmod u+sx file

で setuid を立てることができ、

% chmod 2755 file

あるいは

% chmod g+sx file

で setgid を立てられる。setuid・setgid の意味については setuid の項を参照してほしい。
(用語集 setuid *)

sticky bit というのは、ディレクトリの下にあるファイルの削除に関する設定である。例えば /tmp ディレクトリを考えてみよう。/tmp は一時ファイルを作成するためのディレクトリで、誰でもファイル・ディレクトリを作成できる。しかし /tmp のパーミッションを 777 にすると、あるユーザが作ったファイルを他のユーザが消すことができてしまう。そこで /tmp のパーミッションを 777 にし、さらに sticky bit を立てる。すると、

誰でもそのディレクトリの下にファイル・ディレクトリを新規作成できる
しかし、それを消せるのは作成したユーザ (ファイル・ディレクトリのオーナー) のみ
となる。実際、/tmp は sticky bit が立っている。

% ls -ld /tmp
drwxrwxrwt 7 bin bin 1024 Oct 10 10:24 /tmp

最後の「rwt」の「t」が sticky bit を表している。

% chmod 1777 dir
% chmod a+rwxt dir

などで sticky bit を ON にできる。

setuid 特定の権限でコマンドを実行する仕組み (suid・s-bit・sbit)
http://x68000.q-e-d.net/~68user/unix/pickup?setuid

2003-12-15 (Mon)

* procmail が sendmail にメールを渡すときにエラー

この記事の直リンクURL: Permlink | この記事が属するカテゴリ: [Linux]

procmail が sendmail にメールを渡すときに、
procmail: Error while writing to "/usr/sbin/sendmail"
というエラーが出ることがある。
エラーになるメールを調べてみると、以下の共通点があることがわかった。To: には数百人の名前が指定されており、サイズも 50KB を超える。また、E-Mail アドレスにマルチバイト文字列を使っているユーザがいる。どちらが原因になっているかはわからないので、まずはマルチバイト文字を削除してから sendmail に渡すようフィルタを書いてみることにする。

- 対象となる文字列

<Unknown_Internet_Mail_Address@10.3.50.200>,
"=?ISO-2022-JP?B?GyRCQX4kJCQiJHMkQSQvJDckZyQmGyhC?="
<マルチバイトの文字列>,
これを以下のように置換する。
<Unknown_Internet_Mail_Address@10.3.50.200>,
"=?ISO-2022-JP?B?GyRCQX4kJCQiJHMkQSQvJDckZyQmGyhC?="
<NGSTRING_nn_NGSTRING>,

- スクリプトを書いて試してみる

久々の one liner だ。ちょっとマッチする範囲が大きすぎるかもしれない。
|perl -pe 's/<(\W+)>/"<NGSTRING_" . unpack("H2", $1) . "_NGSTRING>"/eg;'
上記フィルタを .procmailrc に入れて試してみたが効果がない。やはり To: の数が多すぎるのか。では、ヘッダが大きすぎるとき To: を削除するフィルタを書くとしよう。
|perl -0777 -pe 's/(To: .*?),.*?(?=^\w)/$1\n/sm;'
procmail は一通ごとにフィルタを起動するので、正規表現の g オプションは付けない。

上記フィルタを組み込んだところ、正常動作するようになった。フィルタ発動の閾値は、ヘッダが 8192 バイトを超えた場合とした。
PATH=/usr/bin:/usr/sbin:/usr/ucb:/usr/local/bin:/pub/bin:.
LOGFILE=$HOME/log/procmail.log

# ヘッダだけを対象にしたフィルタ
:0 fhH
* > 8192
|perl -0777 -pe 's/^(To: .*?),.*?(?=^\w)/$1\n/sm;'
# |perl -pe 's/<(\W+)>/"<NGSTRING_" . unpack("H2", $1) . "_NGSTRING>"/eg;'

:0
! saitou-hiroaki@example.co.jp

2003-12-14 (Sun)

* fetchmail がログを出力してくれない

この記事の直リンクURL: Permlink | この記事が属するカテゴリ: [Linux] [メール]

fetchmail にログを出力させるために、.fetchmailrc に以下を記述したが、ログが出力されない。
set logfile "/home/hiroaki/log/fetchmail/fetchmail_setlogfile.log"

文法が間違ってるのかな、と思って Google で set logfile fetchmailrc を検索したところヒット。文法は正しかったが、fetchmail の仕様で出力されなかったようだ。

[debian-users:37402] Re: fetchmail の log機能
http://lists.debian.or.jp/debian-users/200306/msg00175.html
$ man -LC fetchmail
[...]
      The -L <filename> or --logfile <filename> option
      (keyword: set logfile) allows you to redirect status
      messages emitted while detached into a specified
                        ^^^^^^^^^^^^^^
      logfile (follow the option with the logfile name).
[...]

ということで detach、言い換えると background(あるいは
daemon) として動作しないとログをファイルに記録しないことが仕
様のようです。

松田陽一さんの ~/.fetchmailrc の内容は分かりませんが
"fetchmail --logfile ~/fetchmaillog -v -v" でデーモン動作し
ないならログファイルが存在しないときログをファイルに記録しな
いことになりそうです。

ちなみに私は fetchmail をデーモン動作させて使用していますが、
『ログファイルは「なければ自動的に作成」』しています。

ログファイルが存在するとデーモン動作させなくてもログをファイ
ルに記録しますよね? 一貫性がなくてなんだか良く分からない仕様・
動作ではあります。はい。

2003-12-13 (Sat)

* delegate / ftp server 間の接続方法を強制する

この記事の直リンクURL: Permlink | この記事が属するカテゴリ: [Linux] [ftp]

以下の環境の時、delegate <-> ftp server の接続方法を強制する。
client <-> delegate <-> ftp server

- 何のためにこの設定をするのか?

たとえば、途中に ファイアウォールがあるため、pasv で接続しようとすると弾かれてしまう場合、この設定をすることで ftp 接続を確立できるようになる。

- 設定方法

delegate 起動時のオプションに、FTPCONF=nopasv を追加する。
/usr/local/bin/delegated SERVER=ftp VARDIR=/var/delegate ADMIN="admin@example.com" FTPCONF=nopasv

DeleGate version 8.7 リファレンスマニュアル の日本語訳
http://irish.ubiq.reset.jp/docs/Manual.htm#FTPCONF
FTPCONF parameter*  ==    FTPCONF=ftpControl[:{sv|cl}]
       ftpControl  ==  nopasv | noport | noxdc | rawxdc
           --    default: none

nopasv
データ接続の PASV コマンドを使用不可とする。
noport
データ接続の PORT コマンドを使用不可とする。
noxdc
制御接続で、データ伝送の XDC モードを使用不可にする。
rawxdc
XDC モードにおいて、伝送データをBASE64エンコードしない。
上で列挙された ftpControl は、"nopasv:sv" のように ":sv" または ":cl" がつづく場合、例えば、ftpControl は、それぞれ、サーバ側、または、クライアント側のみに適用されます。

2003-12-12 (Fri)

* 添付ファイル付きメールをコマンドラインから送信

この記事の直リンクURL: Permlink | この記事が属するカテゴリ: [Linux] [メール]

cron で定期的に添付ファイル付きメールを送りたい。
添付ファイルは tar で生成する。さて、メールをどうやって生成しよう。普段ならスクリプトを書くところだが、今日はあり合わせのコマンド群でできるならそれを使いたい気分。
早速 Google で linux コマンドライン 添付ファイル メール 送信を検索。linux-users の記事などがヒット。いくつかスクリプトやコマンドが紹介されていたが、mpack というツールを使うことにした。

[linux-users:83133] Re: sendmailで添付ファイルをつけて送れるか?
http://search.luky.org/linux-users.8/msg03133.html

mpack
ftp://ftp.andrew.cmu.edu/pub/mpack/

メール本文を指定できないとか、いくつか不満はあるがとりあえずはこれでもいい。
#!/bin/sh
tar -C /home/hiroaki/ log.txt chalow-0.20 script public_html/log -Ivcf /home/hiroaki/changelog.tar.bz2 >/dev/null
mpack -s "[ChangeLog Pack] `date`" /home/hiroaki/changelog.tar.bz2 example@example.com

・・・と思ったが、from を指定できないのはダメだな。やはりスクリプトを書かなければならないか・・・。

- 2004-10-09 追記

Ruby 1.8 の標準ライブラリだけで動作する添付ファイル付きメール送信スクリプトを 2004-10-09 に書いた。

2003-12-11 (Thu)

* You have mail と表示してるのは誰かを調査

この記事の直リンクURL: Permlink | この記事が属するカテゴリ: [Linux] [メール]

2003-12-08 に fetchmail + procmail を導入して以来、ログイン時に You have mail と言われるようになった。pro は外部からの smtp を受け付けないし、メールを受け取るような cron も設定していない。いったいどこからメールが来てるんだろう、と不思議に思って調べると、.procmailrc に
:0 c
とルールを記述していたため、ローカルのメールボックスにメールを残しつつ転送するようになっていたことが原因だとわかった。どこかのウェブページにあった .procmailrc を、内容を吟味せずにほとんどそのまま使ってしまったので当然の結果だ。

- You have mail って誰が言ってるの?

ところで、You have mail って誰が出してるメッセージなんだろう、と思って調べてみた。
ログインしたときに出てる訳だから、ログイン時に実行されるスクリプトあたりだろうか、と推測し、/etc/profile, /etc/bashrc, $HOME/.login, $HOME/.bash_profile, $HOME/.bashrc を調べてみたが、どこにもそれらしきスクリプトは無かった。唯一 /etc/profile に
USER=`id -un`
LOGNAME=$USER
MAIL="/var/spool/mail/$USER"
というメールスプールのパスを設定している記述があるだけだ。

もうこうなったら Google に聞くしかない。Google で ログイン "you have mail" を検索すると、JM のページがトップでヒット。

Manpage of LOGIN
http://www.linux.or.jp/JM/html/shadow/man1/login.1.html
ログインに成功すると、システムメッセージやメールの有無が表示される。ログインディレクトリに長さ 0 のファイル .hushlogin を作っておけば、システムメッセージファイルである /etc/motd の表示を無効にできる。メールに関するメッセージは、メールボックスの状態によって "You have new mail.", "You have mail.", "No Mail." のいずれかになる。

なるほど、login コマンドそのものが出力していたのか。でも、「メールボックスの状態によって」というのが気になる。どんな状態だとどのメッセージが出るのかはわからなかった。login のソースを読むのが近道かなあ。

2003-12-09 (Tue)

* delegate 構築メモ

この記事の直リンクURL: Permlink | この記事が属するカテゴリ: [Linux] [ftp]

以前作ったメモを発掘。2002年6月11日の時点では ChangeLog メモを使ってなかったので未収録だった。
delegate 構築メモ

作成者 : 齋藤宏明 (example@example.com)
作成日 : 2002年06月11日

ダウンロードとインストール :
http://www.delegate.org/delegate/ から DeleGate/7.9.5 (May 22, 2002) 、
delegate7.9.5.tar.gz をダウンロードした。

tar ball を展開。
[hiroaki@sonic hiroaki]$ tar zxvf delegate7.9.5.tar.gz
[hiroaki@sonic hiroaki]$ cd delegate7.9.5

configure なしでいきなり make
[hiroaki@sonic delegate7.9.5]$ make

Enter your E-mail address [hiroaki@sonic]: example@example.com
で、メールアドレスを入力。

あとは自動的に make が進む。

src/delegated がバイナリ。これを /usr/local/bin にコピーする。

/var/delegate を作成。
/var/delegate/log を作成
/var/delegate/work を作成。

起動用スクリプト /etc/rc.d/init.d/delegated.rc を作成。
#!/bin/sh
/usr/local/bin/delegated SERVER=ftp VARDIR=/var/delegate ADMIN="example@example.com" MAXIMA=delegated:32

inetd と tcpwrapper の設定
/etc/inetd.conf に以下の記述を追加。
ftp-proxy stream tcp nowait root /usr/sbin/tcpd /etc/rc.d/init.d/delegated.rc

/etc/hosts.allow に以下の記述を追加。
# ftp-proxy
delegated.rc: 10.42.2., 10.31.3.

/etc/services に ftp-proxy を追加
ftp-proxy      8021/tcp        # ftp-proxy

上記設定を有効にするために、inetd を再起動。

ftp クライアントからの接続の仕方 :
ftp で 10.50.2.54 8021 へ接続。
ユーザ名@接続したいホスト名 を入力。
接続したいホストのパスワードを入力。

ex) ftp 10.50.2.54 8021
user hiroaki@10.24.3.1
Password:*********

これで接続完了。

以上

- logrotate の設定

/etc/logrotate.d/delegate に記述。
/var/delegate/log/8021 {
    monthly
    rotate 60
    create
}

/var/delegate/log/8021.ftp {
    monthly
    rotate 60
    create
}

2003-12-08 (Mon)

* fetchmail + procmail でメール転送

この記事の直リンクURL: Permlink | この記事が属するカテゴリ: [Linux] [メール]

今使っている MUA は NetscapeMessanger 4.8 だ。大学の頃から使い続けている。振り分けや検索などの基本機能はきちんと押さえられており、非常に使いやすい。セキュリティ的にも OutlookExpress よりずっと安心。何より勝手にメールを開いたりしないし。欠点としては、POP アカウントは一つしか登録できないという点だろうか。

fetchmail + procmail を使えば複数サーバのメール一つのアカウントにをまとめられるので、欠点を解消できる。

- .fetchmailrc

POP ユーザ名が shift_jis のマルチバイト文字という凶悪なアカウントなので、.fetchmailrc は shift_jis で記述した。あんまり各行を精査してないので、冗長な記述があるかも。
set postmaster hiroaki
set nobouncemail
defaults
protocol pop3
keep
no mimedecode
smtphost localhost
poll 10.58.30.2
user "私の名前"
password PASSWORD
mda "/usr/bin/procmail"

- .procmailrc

procmail のレシピ。

PATH=/usr/bin:/usr/sbin:/usr/ucb:/usr/local/bin:/pub/bin:.
LOGFILE=$HOME/log/procmail.log

:0
* ! ^X-Loop: hiroaki@example.com
! hiroaki@example.com

- cron

# fetch mail
*/5 8-23 * * * /usr/bin/fetchmail -f $HOME/.fetchmailrc 2>&1 >>$HOME/log/fetchmail.log

9時5時ではなく8時から23時というところがエンジニアらしい。

2003-12-07 (Sun)

* ディレクトリのパーミッション

この記事の直リンクURL: Permlink | この記事が属するカテゴリ: [Linux]

ファイルのパーミッションとディレクトリのパーミッションは意味合いが異なる。

UNIX のパーミッション
http://www.loveruby.net/ja/misc/perm.html
ディレクトリのパーミッション
r そのディレクトリを ls できる
w そのディレクトリの中でファイルを作成・消去できる
x そのディレクトリの中のファイルにアクセスできる

GNOME 1.4 ユーザガイド Appendix A. Linux/UNIX初心者のあなたへ パーミッション(アクセス権)
http://www.gnome.gr.jp/docs/gnome-users-guide/primer-permiss ...
ファイルと同じように、ディレクトリにもパーミッション(アクセス権)がある。ここでも、パーミッション(アクセス権)の種類は3つだ。読み、書き、実行。でも、ディレクトリの場合には意味がちがう。つまりディレクトリを "読む" パーミッションは、そのディレクトリの中身を見たり、中のファイルを検索する許可だ。 "書く" のは、そのディレクトリの中にファイルを作ったり、ディレクトリのファイルを削除したりするパーミッションだ。そして "実行" は、そのディレクトリのファイルをアクセスする権限のことだ。

ちなみに、あるファイルのパーミッション(アクセス権)は、そのファイルが置かれているディレクトリのパーミッション(アクセス権)にも依存する。ファイルが読めるには、そのファイル自身の読み出し権限と、それが含まれるディレクトリの "実行" 権限が必要になる。だから sasha が、ほかのだれにも自分のファイルを見られたくなければ、ホームディレクトリの実行権限を、他のユーザには認めないようにすればいい。こうすれば sasha 自身(そしてもちろん root)以外は、だれもかれのファイルを読めなくなる。かれの個別ファイルのアクセス権はまったく影響しない。

以前メモしたような気もしたが、検索しても引っかかってこなかったので改めてメモ。

2003-12-06 (Sat)

* service possibly not wrapped の意味

この記事の直リンクURL: Permlink | この記事が属するカテゴリ: [Linux]

tcpdmatch を使ったときに出ていた service possibly not wrapped という warning の意味がやっとわかった。読んだままの通り、tcpwapper でラップされてないという意味だ。原因は、/etc/inetd.conf の記述ミス。以下の NG の記述では、/usr/sbin/tcpd を呼んでいない。やれやれ。
# OK
ftp-proxy stream tcp nowait root /usr/sbin/tcpd /etc/rc.d/init.d/delegated.rc

# NG
ftp-proxy stream tcp nowait root /etc/rc.d/init.d/delegated.rc in.delegated

2003-12-01 (Mon)

* ftp + tar + cron で自動ネットワーク・バックアップ

この記事の直リンクURL: Permlink | この記事が属するカテゴリ: [Linux] [ftp] [バックアップ]

ftp コマンドには、標準入力から読ませたデータに好きなファイル名を付けてアップロードする機能がある。これを利用してネットワークバックアップスクリプトを作成する。スクリプトを毎日 cron で回せば、リモートマシンに毎日バックアップを自動で ftp アップロードすることができる。

- ftp + tar によるバックアップの長所と短所

ftp + tar を使ったバックアップの長所は、どちらも unix システムなら標準でインストールされているコマンドなので、ツールのインストールが不要で設定が超簡単なことと、ネットワーク経由のバックアップなので外部マシンにデータを持っていくことが楽なことだ。短所は、ネットワーク経由のバックアップなので帯域が細い環境では使いにくいかもしれないこと、ftp アカウントが必要なこと、暗号化されないこと、ftp アカウントをシェルスクリプト中に埋め込まなければならないことだろうか。

暗号化については、tar の出力を gpg に通したり、scp や sftp を利用すれば解決できる。2004-03-19 に「ftp + tar + gpgで暗号化ネットワーク・バックアップ」という記事を書いた。 ftp + tar + gpg の利用について解説とサンプルスクリプトがある。

- バックアップで一番大切なこと

バックアップで一番大切なことは、バックアップすることだ。手間がかかるからといってやらないでいる時に限ってトラブルがやってくる。だから、とにかくまず手間がかからなくてシンプルな方法を考えよう。rsync や samba を使ったり、pdumpfs や afio や ArcServe などのバックアップツールを使った方法もある。tar + ftp よりも他の方法を使った方が楽にバックアップシステムを構築できるなら、迷わず楽な方を使った方が良い。とにかくまずバックアップすることが大切だ。

- ftp にコマンドの出力結果をアップロードさせる

冒頭にも書いたが、ftp コマンドには標準入力の内容をアップロードする機能がある。これを利用してバックアップスクリプトを作成する。以下、man ページから引用。

Manpage of FTP
http://www.linux.or.jp/JM/html/netkit/man1/ftp.1.html
ファイル名の変換
ftp の引き数として指定されたファイル名は、以下の規則に従って変更される。

1. ファイル名として `- ' が指定された場合、(読み込みとして) stdin が、(書き出しとして) stdout が使われる。
2. ファイル名の最初の文字が `|' の場合、残りの引き数はシェルコマンドとして解釈される。そして、 ftp は与えられた引き数を popen(3) に渡してシェルを fork し、stdout を読み込み、stdin に書き出す。シェルコマンドがスペースを含む場合、 " ls -lt" のように引き数をクォートしなければならない。この機構の特に役立つ例としては、dir more がある。

- バックアップスクリプトの例

tar から標準出力に出力した内容を ftp が標準入力で受けてアップロードする。ファイル名に曜日を使っているので、7世代までバックアップが残る。ファイル名に日付を使えば、一か月前まで残せる。
#!/bin/sh

# log setting
LOGDIR=/var/log
LOG=$LOGDIR/ftpbackup.log
LOG_TAR=$LOGDIR/ftpbackup_tar.log

echo `date` backup start >>$LOG
echo `date` backup start >>$LOG_TAR

# ftp and tar backup start
ftp -i -v -n 10.3.31.89 << END >>$LOG
user USER_ID PASSWORD
cd /d/backup
bin
put |"tar -C / -zvcf - etc home --exclude=music --exclude=backup 2>>$LOG_TAR" "`hostname`_`date +%a`.tar.gz"
quit
END

echo `date` backup complete >>$LOG_TAR
echo `date` backup complete >>$LOG

- 解説

以下ではコマンドのオプションや使われ方を解説する。細かく書いたので長い。必要なところだけ読んでほしい。

ftp -i -v -n 10.3.31.89 << END >>$LOG
-i オプションはバッチ処理のために、-v はログに詳細を記録するために、-n は .netrc ファイルを使用せずに ftp サーバへのログインに使用するパスワードを指定するためにここで指定している。10.3.31.89 は今回使用した ftp サーバ名。

-i
複数のファイルの転送中に対話 (interactive) プロンプトを出さないようにする。

-v
詳細表示 (verbose) オプションを使うと、 ftp はデータ転送の結果だけでなく、リモートサーバからの全てのレスポンスを表示する。

-n
ftp が最初の接続で 自動ログイン (auto-login) しようとするのを抑制する。自動ログインが可能な場合、 ftp はユーザーのホームディレクトリにある .netrc ファイル ( netrc(5) を参照) でリモートマシンのアカウントが記述されているエントリをチェックする。エントリがない場合、 ftp はリモートマシンのログイン名 (デフォルトではローカルマシンでログイン名) を要求するプロンプトを出す。必要ならば、ログインに使うパスワードとアカウントを要求するプロンプトを出す。

<< END は、次に END が出てくるまでに記述された内容を、ftp コマンドに渡すためのリダイレクト。>>$LOG は ftp コマンドの結果を $LOG に追記する。

user USER_ID PASSWORD
cd /d/backup
bin
USER_ID に ftp サーバにログインするための ID を指定、PASSWORD にパスワードを指定。例を挙げておこう。ID が operator で パスワードが backup_command なら、
user operator backup_command
とすればよい。その後はログイン後に実行させるコマンドを列記する。私が使っているサーバではバックアップファイルをアップロードするディレクトリが /d/backup なので、cd コマンドでディレクトリを移動。その後転送モードをバイナリモードに明示的に変更。

put で始まる行がこのスクリプトの要となる部分。
put |"tar -C / -zvcf - etc home --exclude=music --exclude=backup 2>>$LOG_TAR" "`hostname`_`date +%a`.tar.gz"
まず put コマンドでファイルをアップロードする。ただし、put の第一引数は | で始まっているので、アップロードする中身はファイルではなく "" で囲まれた tar コマンドが出力したものとなる。"" で囲まれた部分はパイプを使ったコマンドラインは記述できないようだ。パイプを使った複雑なコマンドラインを書きたい場合は、シェルスクリプトにすればいい。

tar の部分を解説しよう。
"tar -C / -zvcf - etc home --exclude=music --exclude=backup 2>>$LOG_TAR"
まず -C で tar を実行するディレクトリを / に移動し、その中の etc ディレクトリと home ディレクトリをバックアップ対象としている。ただし、music または backup という名のファイルやディレクトリはバックアップ対象から除外する。-z が指定されているのでこれらを gzip で圧縮し、-f - が指定されているので圧縮結果を標準出力に出力している。2>>$LOG_TAR の部分は、tar コマンドの標準エラー出力への出力結果を $LOG_TAR に追記している。tar は標準エラー出力に詳細を出力するので、それを受けてログに書いているというわけだ。

以下の部分は put コマンドの第2引数として扱われる。
"`hostname`_`date +%a`.tar.gz"
put は第2引数でアップロード先にどんなファイル名で格納するかを指定できる。ここでは、 hostname コマンドの出力結果と date +%a コマンドの出力結果を利用している。date +%a は現在の曜日を返す。よって、マシン名が sonic で 今日が火曜日だとすると、最終的なファイル名は sonic_Tue.tar.gz となる。ehco で表示させるとわかりやすいかな。
[hiroaki@sonic ~]$ echo `hostname`_`date +%a`.tar.gz
sonic_Tue.tar.gz

2003-11-25 (Tue)

* From を指定してコマンドラインからメールを送る

この記事の直リンクURL: Permlink | この記事が属するカテゴリ: [Linux]

vodafone は from が無かったり、名前を引けなかったりすると reject してしまうようだ。from を指定したいが、標準の mail コマンドで from を指定できるインターフェイスを見つけられなかった。仕方がないので、sendmail コマンドで代用することにした。

Manpage of SENDMAIL
http://www.linux.or.jp/JM/html/sendmail/man8/sendmail.8.html
$ echo -e "Subject: Test Posting\nTo: saitou-hiroaki@example.com\nFrom: \"SendTest\"<saitou-hiroaki@example.com> \n`date`" | /usr/sbin/sendmail -f 'Test Posting <saitou-hiroaki@example.com>' -t saito_hiroaki@phone.example.com,saitou-hiroaki@example.com

-v を付ければ smtp サーバとのやりとりを見せてくれる。
$  echo -e "Subject: Test Posting\nTo: saitou-hiroaki@example.com\nFrom: \"SendTest\"<saitou-hiroaki@example.com> \n`date`" | /usr/sbin/sendmail -v -f 'Test Posting <saitou-hiroaki@example.com>' -t saito_hiroaki@phone.example.com,saitou-hiroaki@example.com
saito_hiroaki@phone.example.com,saitou-hiroaki@example.com... Connecting to smtp.example.com. via smtp...
220 adm.example.com ESMTP
>>> EHLO pro.example.com
250-adm.example.com
250-PIPELINING
250 8BITMIME
>>> MAIL From:<saitou-hiroaki@example.com>
250 ok
>>> RCPT To:<saito_hiroaki@phone.example.com>
250 ok
>>> RCPT To:<saitou-hiroaki@example.com>
250 ok
>>> DATA
354 Enter mail, end with "." on a line by itself
>>> .
250 ok 1069746582 qp 14753
saito_hiroaki@phone.example.com,saitou-hiroaki@example.com... Sent (ok 1069746582 qp 14753)
Closing connection to smtp.example.com.
>>> QUIT
221 adm.example.com

2003-11-07 (Fri)

* find + xargs と find -exec の使い分け

この記事の直リンクURL: Permlink | この記事が属するカテゴリ: [Linux]

ファイル名をクオートしなくても良いなら xargs を使った方が速い。
find -exec はクオートを勝手にやってくれてるというか、うまく処理してくれているようだ。

find UNIXの部屋 検索結果
http://x68000.startshop.co.jp/~68user/unix/pickup?find
ソースの中から文字列「hogehoge」を検索するには

% find . -name \*.c -exec grep hogehoge {} \;

とすればよいが、これでは *.c のファイルの数だけ grep コマンドが実行され、時間がかかる。そういう場合は

% find . -name \*.c -print | xargs grep hogehoge

とすればよい。もっときっちりやるなら

% find . -name \*.c -print0 | xargs -0 grep hogehoge /dev/null

なのだが、詳しくはマニュアルを読んでくれい。

2003-10-29 (Wed)

* date コマンドって超便利

この記事の直リンクURL: Permlink | この記事が属するカテゴリ: [Linux]

date --date で書式を指定すれば、自由自在に日付計算ができる。一か月前とか18年前とか5日後とかの日付や曜日を簡単に求められる。また、+%Y などの出力書式文字列と同時に使うこともできるので、日付と時刻を好きな形式で整形して文字列として出力できる。

JM 読んでたらしっかり書いてあった。
date date.1 in GNU_sh-utils
http://www.linux.or.jp/JM/html/GNU_sh-utils/man1/date.1.html

perl の Date::Calc モジュールも調べてみたんだけど、
一行プログラムを書くときは date コマンドの方が使いやすそう。

- YYYY-mm-dd や YYYYmmdd 文字列を得る

%F で YYYY-mm-dd 文字列を得ることができる。数字が一桁の場合はゼロ詰めされる。%Y-%m-%d と書いても同じ。
%F  same as %Y-%m-%d

$ date +%F
2004-06-24

ハイフン - を入れない YYYYmmdd 文字列がほしいなら、%Y%m%d と書けばよい。
$ date +%Y%m%d
20040624

- HH:MM:SS 文字列を得る

時分秒がほしいなら、%T を使う。数字が一桁の場合はゼロ詰めされる。コロンを入れたくないなら、%H%M%S と書けばよい。
$ date +%T
10:50:02

$ date +%H%M%S
105007

- apache のログを grep するために、一か月前の月名と西暦を得る

$ date --date '1 month ago' +%b/%Y:
Sep/2003:
ちなみに apache のログはこんな感じ。
10.3.31.91 - - [29/Oct/2003:09:40:53 +0900] "POST /cgi-bin/hiroaki/bad.cgi/read HTTP/1.1" 500 615

- 10日後

$ date --date '10day' +%Y%m%d
20031108

- 「・・・15年ぶりだね」

$ date --date '15 year ago'
Wed Sep 13 15:48:42 JST 2000

注意。上記の例は結果を2000年9月13日にしたいがために、事前に以下のコマンドを実行してシステムクロックを変更してあります。
# date --set 2015-09-13

- ago の位置で結果が変わる

ago より前の指定を現在から引き算しているようだ。複雑なのであんまり深追いしたくないな。
$ date --date '4year ago 2month 5day 2hour 8minute 58second'
Mon Jan  3 18:03:24 JST 2000

$ date --date '4year 2month ago 5day 2hour 8minute 58second'
Fri Sep  3 18:03:31 JST 1999

2003-10-28 (Tue)

* logrotate は二度死ぬ

この記事の直リンクURL: Permlink | この記事が属するカテゴリ: [Linux]

昨日 2003-10-27 に仕込んだ logrotate が動いているかをチェックしたところ、見事に失敗していた。

Google で logrotate ローテート されない を検索したところ、原因がわかった。
要するに、もう一日経たないとローテートされないということだ。
次からは、config ファイルが正しいことと /var/lib/logrotate.status にエントリが
追加されたことを確認しておく必要があるな。

logrotateの設定
http://kamoland.com/comp/logrotate.html
/var/lib/logrotate.status に,ローテイト対象ファイルごとに,前回実行日時が記録されている.

例)
"/var/log/messages" 2003-4-20

このファイルに該当行が存在しない場合,まず初回logrotate実行時に該当行がその当日日付で作成され
(このときローテイトは実行されない!), 2回目から実際のローテイト処理が行われる.

- テストしたら昨日の疑問も氷解

圧縮方法とレベルは gzip -9 でいいようだ。
テストで /usr/sbin/logrotate /etc/logrotate.d/sqlserver_backup -v したら、以下の出力があった。
compressing new log with: gzip -9 /home/hiroaki/backup/kessandb_current_sql_server_backup.1

2003-10-27 (Mon)

* DB サーバのバックアップファイルのローテーションと圧縮

この記事の直リンクURL: Permlink | この記事が属するカテゴリ: [Linux] [バックアップ]

毎日 MS SQL Server からデータをダンプしたものを ftp でバックアップサーバに転送してはいるが、ファイル名が同じなので毎回上書きされてしまう。ちょっと怖いので、一週間でローテーションすることにした。
compress オプションも追加。一日で 80MB 弱のサイズだから、ちょっとでも小さくしたい。
そもそも MS SQL Server は圧縮してくれてないようだし。

試しに gzip -9 kessandb_current_sql_server_backup してみたら、80MB が 12MB まで縮んだ。
実際は gzip じゃなくて compress をだったり、圧縮レベルも違うかもしれないけど。

ということで、以下を /etc/logrotate.d/sqlserver_backup として作成。
/home/hiroaki/backup/example_db_current_sql_server_backup {
    daily
    rotate 8
    compress
    nocreate
}

2003-10-14 (Tue)

* Linux マシン pro の /dev/hda のバックアップと換装

この記事の直リンクURL: Permlink | この記事が属するカテゴリ: [Linux] [バックアップ]

pro の /dev/hda の調子が悪い。
3.5 GB よりも後ろの部分あたりに書き込もうとすると、IDE デバイスだかなんだかがそのまま無反応になってしまい、コンソールに延々とエラーメッセージが表示されるという状態になる。このまま使い続けるのは怖いので、ハードディスクを交換することにした。交換するドライブは /home が入っている。以下では、データの移行について調べたこと、試したことを記録する。

- やりたいこと

/home パーティションなので、新しいディスクにデータを全部引き継ぎたい。さてどうするか。

- 環境

OS: TurboLinux 6.5 Server

- /dev/hda について

$dmesg |grep hda
hda: Maxtor 84320D5, ATA DISK drive
hda: Maxtor 84320D5, 4119MB w/256kB Cache, CHS=525/255/63

$ df -h
/dev/hda1            4.0G  2.5G  1.3G  65% /home

ちょうど一台使われていないマシンがあるので、そのマシンに 84320D5 と 新しいドライブを接続し、knoppix を使ってコピーするとしよう。コピーは単純に cp -r でいいかな。この方法でファイルオーナーやパーミッションが引き継がれれればいいんだけど。

・・・と思ったけど、tar でやるのが楽なようだ。
[linux-users:58294] Re: HDD まるごと複製
http://search.luky.org/linux-users.5/msg07977.html

tar -c -l -S -f - / | (cd /newroot && tar -x -v -f -)
-c, --create 新しいアーカイブを作成する
-l, --one-file-system ローカルなファイル・システムに限定してアーカイブを作成する
-S, --sparse 疎らなファイルを効率的に処理する
-f, --file [HOSTNAME:]F Fというアーカイブ・ファイルまたはデバイスを使う(デフォルトは/dev/rmt0)

-f - がよくわからない。付けても付けなくても変わらなかった。もしかして、標準出力を意味するのだろうか?

() で括ってそこに 標準出力をパイプできるなんて初めて知った。もっとも、tar には -C, --directory DIR DIRにcdしてから動作を行なう があるから、-C を使ってもいいかも。

パーミッションとオーナーも同じにしたいが、
以下の報告があったため tar のマニュアルを確認してみた。
[linux-users:58424] Re: HDDまるごと複製
http://search.luky.org/linux-users.5/msg08107.html
> >  tar -c -l -S -f - / | (cd /newroot && tar -x -v -f -)
>
> これでやったわけですが、私は結局遠隔にあるコピー元?にログインして
> 一旦 tarball をつくって、それをダウンロードして手元で複製、という
> 工程になったので、標準入出力を使う上記方法にはならなかったのですが、
> 少なくとも一旦 tarball を作ってからの場合だと、復元の再に -p オプションも
> ないとだめのようです。パーミッションが狂ってしまって慌てました。

以前この ML で tar では symlink の owner.group が復元されないという
話がありましたが、大丈夫ですか?
正しく復元できたのでしたら、使用された tar の option, version を教えて
ください。

# cpio なら symlink の owner もちゃんと復元されるのですが、hard link
  の保存方法がわからなくて挫折。
  今は tar で full backup 取って、戻す時は tar xpf ... のあと / で
  ls -lR しておいたログを元に chown してまわっています。
  symlink の owner なんてどうでも良いと以前は思ってましたけど、apache
  で SymLinksIfOwnerMatch 使うようになってからは...

上記報告を踏まえ、
ファイルオーナーとパーミッションを同じにするため以下のオプションを付けてみることにした。
--same-owner アーカイブ内のファイルのものと同じ所有属性でファイルを抽出する
-p, --same-permissions, --preserve-permissions 許可情報を全て抽出する

- 最終的に実行するコマンド

tar -c -p -l -S -f - / | (cd /newroot && tar -x -v -p --same-owner -f -)

- Hard Disk Upgrade Mini How-To 7. 元の HD から新しい HD へのファイルのコピー

http://www.linux.or.jp/JF/JFdocs/Hard-Disk-Upgrade/copy.html
に気になる記述がある。シンボリックリンクのオーナーの件だろうか・・・?
この Mini How-To の以前のバージョンではハードディスクをコピーするのに
tar コマンドも使えると書きましたがこの方法にはバグがあります。

- いざ環境作り

結局 knoppix はブートしなかった。
Uncompressing Linux... Ok, booting the kernel.
で止まってしまう。
http://www.dnsbalance.ring.gr.jp/archives/linux/knoppix/iso/ の knoppix_20030924-20031002.iso でもダメ。

仕方がないので、手元にあった debian woody 3.0 の CD でブートさせた。シェルを起動し、woody のインストーラでパーティションを切る。ディスク丸ごと1パーティションにした。次に、
# mke2fs -m 0 -cc -T news
でフォーマット。ロッカーに転がってたディスクなので、不良セクタがあるおそれがある。不良ブロックを検査 をするために、-cc で read-write test を実行するように指定した。

また、-m 0 オプションを付けて root 用の予約領域をゼロにした。これは、以下の情報を元にやってみたことだ。

Debian GNU/Linux スレッド Ver. 19
http://pc.2ch.net/test/read.cgi/linux/1065374560/193
http://pc.2ch.net/test/read.cgi/linux/1065374560/197
http://pc.2ch.net/test/read.cgi/linux/1065374560/200
193 :login:Penguin [sage] :03/10/15 21:52 ID:bLLfhwtE
ext3 な /home の空きが少なくなってきたので悪足掻きに

tune2fs -m 0 /dev/hoge

で reserved-blocks を無くした。sid で一般ユーザでやると

% /sbin/tune2fs -m 0 /dev/hda8
tune2fs 1.35-WIP (21-Aug-2003)
/sbin/tune2fs: 許可がありません while trying to open /dev/hda8
Couldn't find valid filesystem superblock.

とエラーが出るんだけど、woody だと一般ユーザでも出来ちった…

% /sbin/tune2fs -m 0 /dev/hda11
tune2fs 1.27 (8-Mar-2002)
Setting reserved blocks percentage to 0 (0 blocks)

そ、そーゆーもんなん?(;´Д`)

197 : [sage] :03/10/15 22:33 ID:i5NBqHn0
>>193
予約領域ってゼロにしても大丈夫なのかな。

200 :login:Penguin [sage] :03/10/16 00:50 ID:kXslWQqp
>>197
rootは/home一杯になっても別に困らんから。

- mke2fs -cc って長いよ・・・

4GB のマシンで、仮想コンソールが2つあったので2台のドライブを同時並行でフォーマットしてみた。

- 実際の作業

コンソールでの作業だったため、文中のエラーメッセージは正確ではないので注意。もしかしたら入力したコマンドも実際のものと違っているかもしれない。

まず2台のディスクを移設用マシンに接続し、woody の CD-ROM でブートさせる。ALT + F2 でコンソールに切り替え、各ドライブをマウントする。/bin/cp -a でファイルを全部コピーする。今回は /home しかコピーしないので、これが一番簡単。
# /bin/cp -af /mnt/old/* /mnt/new

コピーが完了したら、新しいドライブを本番マシンに接続。本来ならばこれで作業が終わるはずだったが、ブートローダが起動しないという状況に見舞われた。完全に忘れていたが、今回の対象ドライブは /dev/hda である。ブートローダをインストールしなければならない。

woody の CD には lilo が入っているが、lilo を実行しようとすると、/target にルートファイルシステムをマウントしないと使えないよ、といったエラーメッセージが出てしまう。いくつか試行錯誤をしてみたがうまくいかない。ライブラリのバージョンが違う、といったエラーメッセージまで出てしまう。元のシステムは TurboLinux 6.5 Server であるため、整合性がとれないのだろうか? /sbin ってスタティックリンクしてるからライブラリは関係ないんじゃないか? と思っていろいろ試そうとしたが、諦めて TurboLinux 6.5 Server の CD-ROM でブートすることにした。ところが、今度はなんと lilo がない。/sbin にも /usr/sbin にもない。

CD に無くても、/dev/hdb に入ってるルートファイルシステムにあるじゃんと途中で気づき、/dev/hdb2 をマウントしようとするが、なんだかうまくマウントできない。これも当たり前で、/dev/hdb2 は swap パーティションだったのだ。 気づけば単純なことだが、無機質で乾燥したマシン室では注意力が落ちるということを、身をもって知らされた。ちなみに、/dev/hdb1 は /boot だ。

ルートファイルシステムをマウントし、lilo を実行。
/mnt/tmp/sbin/lilo -C /etc/lilo.conf
しかし、これでもうまくいかない。/boot/boot.b が無いとかいうエラーメッセージが出る。無ければコピーしてしまえ、ということで、
cp /mnt/tmp/boot/* /boot
を実行したが、今度は 0x100 なんてデバイスは知らないよ、といったメッセージが出る。

ここで一度 lilo について調べた方が良い気がしたので、JM で lilo の man を見る。すると、
-r root-directory 操作を行う前に、 chroot でルートディレクトリを変更する。
というオプションがあることに気づいた。これを指定してやればいいんじゃないか、と思い実行するとうまくいった。最終的に実行したのは、以下のコマンドだ。
/mnt/tmp/sbin/lilo -r /mnt/tmp -C /etc/lilo.conf

無事ブートローダのインストールが終わり、ドライブ換装作業は完了。pro は今快調に動作している。後で耐久テストでもやってみることにしよう。

2003-10-08 (Wed)

* w3m はすごい

この記事の直リンクURL: Permlink | この記事が属するカテゴリ: [Linux]

pro に w3m をインストール。

w3m のページ
http://www2u.biglobe.ne.jp/~hsaka/w3m/index-ja.html から tar ball をダウンロード。
./configure でいろいろ質問に答えた後、make して make install。

すごい。table レイアウトがきちんとレンダリングされる。動作も軽い。
インライン画像を表示するをオフにしてしまったのは失敗だったかもしれない。
sonic には画像表示をオンにしてインストールしてみよう。
・・・と思ったけど、画像表示は X だけのようだ。当たり前か。

2003-09-17 (Wed)

* Partimageに関する覚え書き

この記事の直リンクURL: Permlink | この記事が属するカテゴリ: [Linux] [バックアップ]

http://buxus.s31.xrea.com:8080/pukiwiki/pukiwiki.php?%5B%5Bp ...
パーティションをまるごとバックアップするツール。
ネットワーク越しにバックアップすることもできる。
パーティションは unmount してある必要があるけど。

2003-09-16 (Tue)

* 大規模サイトの為のLinuxカーネルチューニング

この記事の直リンクURL: Permlink | この記事が属するカテゴリ: [Linux]

2003-09-08 (Mon)

* crontab の @reboot

この記事の直リンクURL: Permlink | この記事が属するカテゴリ: [Linux]

http://yoshi.init.org/diary/?20030904#20030904
DWN 35th より、サーバ reboot 時に個々のユーザが自動的にプログラムを起動させる
init.d のような仕組みが欲しいという話題に、Watson が
How about using @reboot lines in users' crontabs instead? とコメントしている。
そんな方法があったのか…。と言うことで試しに crontab -e に
@reboot echo 'hello, world' > /tmp/boot.log
と言うのを追加して reboot してみたらちゃんとファイルが出来てました。

ユーザ権限で使えるところが良い。いろいろ使い方が広がりそうだ。たとえば・・・。・・・。・・・。無いな。まあそのうち何か必要に迫られて使うときが来るでしょう。

2003-08-27 (Wed)

* logrotate で Apache のログに YYYYMMDD をつけて圧縮

この記事の直リンクURL: Permlink | この記事が属するカテゴリ: [Linux]

PC関係のメモ から。
http://mylab.jp/diary/20030819.html#p01 よりも
http://mylab.jp/diary/20030821.html#p01 の方が正しそうなのでそちらを転載。

/usr/local/apache/logs/host1-access_log /usr/local/apache/logs/host2-access_log
{
rotate 50
daily
sharedscripts

postrotate
  /bin/kill -HUP `cat /usr/local/apache/logs/httpd.pid 2> /dev/null` 2> /dev/null
  EXT=`date +%Y%m%d`
  for f in $1;
    do mv $f.1 $f.$EXT;
    /bin/gzip -f $f.$EXT
  done
endscript
}

- 試してみたがうまく動かない

ローテーション回数を50としているが、古いファイルを削除できていない。-v オプションを付けて logrotate を実行するとよくわかるが、単に .1 .2 といったファイルを探して削除しようとしているので、名前を変えていると削除できないのだ。 find でタイムスタンプが一定以上古いファイルを探し出して rm に渡して消すとか、そういった仕組みを入れてあげないとうまくいかないだろう。

2003-08-20 (Wed)

* syslog の活用と Perl からのログ書き込み

この記事の直リンクURL: Permlink | この記事が属するカテゴリ: [Linux] [Perl]

2003-08-13 で書いた、syslog の使い方について調査。

運用ツール、夜間バッチなどでエラーや作業結果をログに書くとき、
アプリケーション独自のログに書くよりも、syslog に書いた方が汎用的だし、管理もしやすい。

- 事前準備とテスト

syslog.conf を設定。
/etc/syslog.conf に、テスト用のログのファシリティと出力先をセット。
# syslog test
local6.*                                                /var/log/syslog_test.log

コマンドラインから syslog にメッセージを送ってみる。
$ logger -p local6.debug -i -t "sample" "sample log"
$ tail -f /var/log/syslog_test.log

Aug 20 15:14:20 pro sample[4826]: sample log

書けたようだ。

- perl から syslogd にメッセージを送る

ツールは シェルスクリプトや perl スクリプトで書く場合が多い。
そんな時にどうすれば楽かを調べた。perl から syslog に書くためのモジュールがあるようだ。

- perl から syslod に書くためのサンプルスクリプト

perl-lesson ML の過去ログに良さそうなものがあった。
Sys::Syslog モジュールを使う時の設定
http://www.egroups.co.jp/message/perl-lesson/722

冗長だと思われる部分を削り、テスト環境固有の情報を追加したのが以下のコード。
#!/usr/bin/perl
use Sys::Syslog; # all except setlogsock, or:
print "Syslog test\n";
openlog(__FILE__, 'cons,pid', 'local6');
syslog('debug', 'this is another test');
closelog();

これだけ。

- 環境

[hiroaki@sonic hiroaki]$ cat /etc/turbolinux-release
Turbolinux Server 6.5 (Jupiter)

[hiroaki@sonic hiroaki]$ perl -v
This is perl, version 5.005_03 built for i386-linux

- ライブラリが足りない。

上記スクリプトを動かす前に -wc のチェックをかけたところ、エラーが発生した。
$ perl -wc syslog.pl
Constant subroutine __stub_lgammal redefined at /usr/lib/perl5/5.00503/i386-linux/gnu/stubs.ph line 58.
Constant subroutine __stub_lgammal_r redefined at /usr/lib/perl5/5.00503/i386-linux/gnu/stubs.ph line 64.
Can't locate stdarg.ph in @INC (did you run h2ph?) (@INC contains: /usr/lib/perl5/5.00503/i386-linux /usr/lib/perl5/5.00503 /usr/lib/perl5/site_perl/5.005/i386-linux /usr/lib/perl5/site_perl/5.005 .) at /usr/lib/perl5/5.00503/i386-linux/sys/syslog.ph line 7.
BEGIN failed--compilation aborted at syslog.pl line 3.

- did you run h2ph?

did you run h2ph? というエラーメッセージにあるとおり、h2ph という作業が必要なようだ。h2ph はシステムにあるヘッダを perl から扱えるようにする perl スクリプト。作者は Larry Wall だ。Google で h2ph perl syslog を検索すると、qm-pop3d-pw というツールの readme.txt がヒット。そこの最後の行に記述があった。

おまけ
  perlでSys::Syslogモジュールを使うのはちょっと面倒です。
  うまく設定できていないと、-lオプションを付けると認証できなくなります。
    # cd /usr/include
    # h2ph *
    # cd /usr/include/sys
    # h2ph *
  を行って、syslog.phを作成しておいてください。
  また、Syslog.pmの一部のバージョンではうまく動かないことがありますが、
  そのような場合、connect関数内にある、my $syslog = &_PATH_LOGをmy $syslog = &_PATH_LOG()とすると動くことがあります。

なるほど、システムのインクルードファイルを変換する必要があるのだな。
ということで作業。しかし、上記作業をしても、stdarg.ph がない、というエラーが出てしまう。
Google で syslog stdarg.ph を検索したら、見事にヒット。Nomail というツールの FAQ に、stdarg.ph のことが書いてあった。

http://www.ku3g.org/negi/nomail/FAQ
Q. stdarg.ph が無いというエラーが出るんですけど

A. Linux の glibc-2.1.x では syslog.h から stdarg.h が include
  されています。stdarg.h は

  /usr/lib/gcc-lib/i586-redhat-linux/2.95.3/include/

  とか非常にわかりにくいところにあり,Perl をインストールする時
  に見落していることが多いようです。

  # cd /usr/lib/gcc-lib/i586-redhat-linux/2.95.3/include/
  # h2ph stdarg.h

  として生成してください。

これを参考にして h2ph を実行したらうまくいった。それでも、-w スイッチを付けてスクリプトを実行すると以下のような警告が表示されてしまう。まあ致命的ではないので問題はないだろう。

$ perl -wc /home/hiroaki/test/syslog.pl
Constant subroutine __stub_lgammal redefined at /usr/lib/perl5/5.00503/i386-linux/gnu/stubs.ph line 58.
Constant subroutine __stub_lgammal_r redefined at /usr/lib/perl5/5.00503/i386-linux/gnu/stubs.ph line 64.
Constant subroutine __need___va_list undefined at /usr/lib/perl5/site_perl/5.005/i386-linux/stdarg.ph line 9.
/home/hiroaki/test/syslog.pl syntax OK

- まだ書けない。

実行してみたが、全然書かれない。tail -f /var/log/syslog_test.log しているが、一行も書き込まれないのだ。Google で perl Sys::Syslog を検索すると、再び perl-lesson ML がヒット。

Re: [perl-lesson] Sys::Syslog モジュールを使う時の設 定
http://www.egroups.co.jp/message/perl-lesson/728
> Syslog.pmを覗いてみたところ、UDPでsyslogに書き込んでるみたいですが、
> 僕のRed Hat 6.2に入ってるsysklogd-1.3.31-17は、
> デフォルトではUDP経由での書き込みを受け付けません。
> #man syslogdでrオプションのところに書いてありました。

perldoc Sys::Syslogしてみると、

      setlogsock $sock_type (added in 5.004_02)
          Sets the socket type to be used for the next call to
          openlog() or syslog() and returns TRUE on success,
          undef on failure.

          A value of 'unix' will connect to the UNIX domain
          socket returned by the _PATH_LOG macro…

と書かれているので、「setlogsock 'unix';」とopenlogの前に書いたら
syslogdのオプションを変えなくてもうまく行きそうです。
(「use Sys::Syslog qw(:DEFAULT setlogsock);」とされてますし」

- 書けた。

setlogsock を呼ぶようにしたら書けた。最終的なコードは以下のようになった。

#!/usr/bin/perl

# use Sys::Syslog; # all except setlogsock, or:
use Sys::Syslog qw(:DEFAULT setlogsock);    # default set, plus setlogsock
print "Syslog test\n";

setlogsock 'unix';
openlog(__FILE__, 'cons,pid', 'local6');
syslog('debug', 'this is another test');
closelog();

2003-08-16 (Sat)

* col コマンドの使用例 man ページから制御コードを削除

この記事の直リンクURL: Permlink | この記事が属するカテゴリ: [Linux]

man表示内容をファイル保存させたい
http://www.itmedia.co.jp/help/tips/linux/l0697.html

col を使って、man の出力から制御コードを取り除いている。
$ man ls | col -bfx > ls.txt

2003-08-13 (Wed)

* syslog とログの管理、サーバの監視

この記事の直リンクURL: Permlink | この記事が属するカテゴリ: [Linux]

サーバで動いてるサービスを監視できる仕組みを作る必要がある予感。
perl などから syslog に書けるようにする必要があるだろう。

アプリケーション毎のログファイルに出力しても良いのだが、
それを毎日一つ一つチェックするのは大変。
ここでも「ポケット一つ原則」を適用すべきだろう。

なにかトラブルやその予兆があったら自動的にメールする、
といったことも syslog に任せられるみたいだし。

- syslog の仕組みと使い方

ログ管理 〜syslogとその周辺〜
http://www.infoscience.co.jp/technical/press/

Linux管理者への道 第3回 システム管理の基礎 syslogdの設定をマスターしよう
http://www.atmarkit.co.jp/flinux/rensai/root03/root03a.html

Linux管理者への道 第4回 サーバのログ監視ツールを使いこなそう
http://www.atmarkit.co.jp/flinux/rensai/root04/root04a.html

いちばん近道な Linuxマスター術 第4回:システムログの読み方を理解しよう
http://www.itmedia.co.jp/help/howto/linux/0007master/04/

- 出力されたログをチェックする

Swatchでログ監視する
http://www.deer-n-horse.jp/linux/tips/swatch.html

2003-07-16 (Wed)

* sync for me, sync for you, sync for god

この記事の直リンクURL: Permlink | この記事が属するカテゴリ: [Linux]

[linux-users:30811] Re: about warm and cold reboot
http://search.luky.org/linux-users.3/msg00811.html

紅茶を淹れるときのおまじないに、
One for me, one for you, one for pot (god). というのがある。
ロンドンの水は硬水なので、最後の one for pot がないと
よく抽出できないことから、このおまじないができたそうだ。

これを sync に置き換えたものが sync for me。
sync; sync; sync; shutdown ...
と入力することへの言葉遊びといったところか。

2003-07-12 (Sat)

* nfs を使えるようになった

この記事の直リンクURL: Permlink | この記事が属するカテゴリ: [Linux]

今までできなかったけど、google で調べてちょっと設定したら使えてしまった。
http://web.archive.org/web/20030422054541/http://www.niwa.dn ... や Redhat のマニュアルが参考になった。
2002-08-30 に一度試みて失敗してるから、足かけ約一年。何やってるんだ私は。

ちなみに、公開してるのはこれだけ。
/home/samba/public/music (ro,all_squash)

- サーバー側の設定

NFSサービスがインストールされているか確認する。
#rpm -qa |grep netcfg-nfsexports
#rpm -qa |grep nfs-utils
#rpm -qa |grep portmap

いずれもインストールされていなかったら新規インストールする。

exportsファイルにエクスポートするディレクトリ/homeを指定する。
#vi /etc/exports
----------------------------------------------
/home 192.168.xxx.0/255.255.255.0(rw,no_root_squash)
----------------------------------------------
保存終了する。

turboserviceでportmapサービスを開始する。
nfsサービスを開始する。
nfslockサービスを開始する。

NFSが動作しているか確認する。
#rpcinfo -p
これでportmapper,rquotad,mountd,nfs,nlockmgr,statusがリストにあればOK。
もし,/etc/exportsを再編集したらnfsdに再読み込みさせるために次のコマンドを実行する。
#exportfs -ra
turboserviceでランレベル3のportmap,nfs,nfslockを有効にする。

- クライアント側の設定

portmapperとnfsロッキングが動作しているか確認する。
#rpcinfo -p
portmapper,nlockmgrがリストにあればOK。
もしなければturboserviceでportmapとnfslockを開始する。

マウントポイントを作成する。
#mkdir /mnt/server

マウントする。
#mount -t nfs server:/home /mnt/server

以上でLinuxクライアントからNFSサーバーのエクスポートディレクトリにアクセスすることができる。

/etc/fstabに次の記述を追加する。
--------------------------------------------------
server:/home /mnt/server nfs defaults 0 0
--------------------------------------------------
turbofscfgで/mnt/serverのマウントポイントをマウントする。
turboserviceでランレベル3,4,5のportmapを有効にする。

- 以前出てたエラーは何だったのかわからないけど

2003-07-12 で出てたエラーの原因は、今となってはわからない。おそらく、RPC サービスが立ち上がっていなかったか、/etc/hosts.allow でアクセスを許可する記述が欠けいていたかのどちらかだと思う。ちなみにエラーメッセージは以下の通り。
nfs: server 10.3.31.54 still not responding
nfs_get_root: getattr error = 5
NFS: cannot create RPC transport.
nfs: server 10.3.31.54 is not responding

HP のサイトにトラブルシューティング情報があったのでメモ。
[10.X/11.X] NFSマウント時のエラー server not responding
http://www3.jpn.hp.com/cgi/service/knavi/doc_disp.cgi?catego ...

- OS 起動時に自動で nfs マウントする

/etc/rc.d に以下の行を追加。

mount -t nfs 10.69.130.204:/music /mnt/sonic-server/root_music
mount -t nfs 10.224.68.204:/home/hiroaki/music /mnt/sonic-server/home_hiroaki_music
mount -t nfs 10.158.212.89:/backup /mnt/sfu_nfs

2003-07-11 (Fri)

* LVMによるディスクパーティションの動的化(前編)

この記事の直リンクURL: Permlink | この記事が属するカテゴリ: [Linux]

http://www.itmedia.co.jp/enterprise/0307/11/epn01.html

LVM は今まで全く使ったことがない。そもそも使う必要がなかったし。
でもスナップショットは素晴らしい機能だと思う。業務では役に立ちそうな予感。
kernel 2.6 では LVM 2.0 が搭載される。その頃には使ってるかもしれないな。

2003-07-10 (Thu)

* Linux で自動ログイン

この記事の直リンクURL: Permlink | この記事が属するカテゴリ: [Linux]

[redhat:12685] Re: LinuxでのAuto Loginは可能でしょうか?
sl.sakura.ne.jp/archives/redhat/?12685

http://www.otsune.com/diary/2003/07/10.html#200307104
/etc/gettytabにal=ユーザー名を追加すれば常にログイン状態。

2003-07-09 (Wed)

* ifconfig のネットワーク転送量カウンタ

この記事の直リンクURL: Permlink | この記事が属するカテゴリ: [Linux]

cat /proc/net/dev の値を使っているようだ。確認した環境は以下の通り。
[hiroaki@sonic hiroaki]$ uname -a
Linux sonic 2.2.18-2 #1 Wed Mar 14 12:38:41 JST 2001 i586 unknown

32bit で宣言されているようなので、4GB を超えると 0に戻ってしまう。64bit になれば 2^64 = 18446744073709551616 byte = 16384 Peta byte まで増えるので、長期稼働しているファイルサーバでこの値を見て、「たくさん仕事したね」と褒めてあげられるんだけどな。

2003-06-17 (Tue)

* SCO が主張する「Linux に流用された技術」

この記事の直リンクURL: Permlink | この記事が属するカテゴリ: [Linux]

http://www.itmedia.co.jp/enterprise/0306/17/epn11.html
さらにソンタグ氏によると、流用されたコードには、
NUMA(Non Uniform Memory Access)技術を使うマルチプロセッササーバで
Linuxを動かすための拡張機能、Journaled File Systemが含まれる。
加えて、マルチプロセッササーバで一部メモリのボトルネックを軽減するための
RCU(Rea-Copy Update)も流用されたという。

2003-06-06 (Fri)

* 実行時間が100000分を超えたプロセスは top でどう表示されるのか

この記事の直リンクURL: Permlink | この記事が属するカテゴリ: [Linux]

- sonic で動かしている seti が、いつの間にか CPU 時間100000分を超えたようだ。

以前は分単位だった実行時間表示が、時間単位になっていた。
99999時間を超えると、日単位になるのだろうか?
99999日を超えると、月単位になるのだろうか?
99999月を超えると、(以下略)。
ソースを見ればどう表示されるのかなんて丸わかりだが、それじゃあ野暮だ。

$ date
Fri Jun  6 14:16:43 JST 2003

$ top
  2:16pm  up 83 days, 19:37,  1 user,  load average: 1.00, 1.00, 1.00
34 processes: 32 sleeping, 2 running, 0 zombie, 0 stopped
CPU states:  0.8% user,  6.0% system, 93.0% nice,  0.0% idle
Mem:    65128K av,  61080K used,    4048K free,      0K shrd,  10604K buff
Swap:  257032K av,    1644K used,  255388K free                  17960K cached

  PID USER    PRI  NI PAGEIN  SIZE SWAP  RSS SHARE LC STAT %CPU %MEM  TIME COMMAND
7747 hiroaki  20  19 115933 15816  40  15M  404  0 R N  86.0 24.2  1677h setiathome

$ ps -auxww |grep seti
hiroaki  7747 95.5 24.2 17388 15776 ?      RN  Mar25 100513:53 /home/hiroaki/dist/setiathome-3.03.i386-pc-linux-gnu-gnulibc2.1/setiathome -proxy 172.16.4.1:17241

2003-06-05 (Thu)

* マシン間のディレクトリの同期を取る

この記事の直リンクURL: Permlink | この記事が属するカテゴリ: [Linux]

unix だったら rsync でも mirror でもよりどりみどり。
問題は MS Windows だ。
共有フォルダとかオフラインフォルダとかブリーフケースなどが用意されているようだが、基本的にクライアント用の機能で、サーバで使うのは信頼性に欠ける。
rsync は Windows 版がないようだ。mirror は perl で書かれているので、動きそうな予感。

今回は MS Windows 環境でディレクトリの同期をとらなければならないので、mirror を使うことにした。

- 参考

ミラーリングがしたい〜mirror編〜
http://www.itmedia.co.jp/help/tips/linux/l0518.html

mirrorをWeb pageの更新に使う
http://www.atikoro.org/~iyoda/mirror.html

- mirror をミラーしているサイト

http://sunsite.tus.ac.jp/pub/archives/packages/mirror/
ftp://sunsite.tus.ac.jp/pub/archives/packages/mirror/mirror. ...

- 環境

テストに使った ActivePerl の環境は以下の通り。
ActivePerl v5.6.1 built for MSWin32-x86-multi-thread build 633 Built 21:33:05 Jun 17 2002

- mirror_defaults のサンプル。

サーバが IIS 5.0 なので、remote_fs=dosish を指定する。
また、ActivePerl では getgrnam() が実装されていないので、group を指定すると動作しない。
group を指定しなくても、今のところ不具合は無い。
mail_to も windows 環境では動作しないとマニュアルに書いてあったので指定していない。

package=distserver
site=10.38.81.89
local_dir=/home/Administrator/mirror
remote_user=anonymous
remote_password=example@example.com
remote_dir=/mirror_test
get_file=true
dir_mode=0755
file_mode=0644
remote_fs=dosish

- 2004年10月28日追記

高機能 ftp クライアント lftp も同期に使える。2004-05-08 の「lftp を使った ftp ミラーリングと便利機能」を参照。

2003-06-03 (Tue)

* /etc/cron.hourly にあるスクリプトが実行されたときに、

この記事の直リンクURL: Permlink | この記事が属するカテゴリ: [Linux]

メールを送信させない
[analog-jp:01351] Re: root 宛てのメールの停止方法
http://jp.analog.cx/ml/archive/200209.month/1351.html
ここではなく、各cron.daily等のディレクトリ中に入っている
各実行ファイル内につけます。例えば、/etc/cron.daily/中に
あるslocate.cronは、以下のような使い方をしています。

2003-05-06 (Tue)

* Linux ディストリビューションとバージョンの表示

この記事の直リンクURL: Permlink | この記事が属するカテゴリ: [Linux]

- 使用しているディストロとバージョンが書かれたファイルが /etc にある。

これは Linux だけに存在する慣習かもしれないけど。

$ cat /etc/turbolinux-release
Turbolinux Server 6.5 (Jupiter)

ちなみに debian だと /etc/debian_version にあるそうだ。

2003-04-29 (Tue)

* Redhat9 を入手するには

この記事の直リンクURL: Permlink | この記事が属するカテゴリ: [Linux]

Redhat Linux スレ用のテンプレ。

▼ Linux: Redhat9 を入手するには
● インストールして使うだけなら、shrike-i386-disc1.iso から disc3 をダウンロード。
開発などでソースコードも必要なら、shrike-SRPMS-disc1.iso などもダウンロード。

● どの iso イメージにも日本語版が入っています。
RedHat Linux 7.1 以降は、日本語版が本家に統合されました。
650MB の CD-R メディアに収まります。700MB のメディアを用意する必要はありません。

- Redhat9 ミラーサイト http://www.redhat.com/download/mirror.html

http://princo.org:8080/linux/redhat/9.0/iso/
ftp://jpix.ftp.ne.jp/pub/redhat/linux/9/en/iso/i386/
ftp://61.206.118.113/pub/RedHat9/
ftp://ftp.kddlabs.co.jp/pub/Linux/packages/RedHat/redhat/lin ...
ftp://ftp.riken.go.jp/pub/redhat/redhat/linux/9/en/iso/i386/
ftp://ftp.sfc.wide.ad.jp/pub/Linux/redhat/linux/9/en/iso/i38 ...

- Winny を使ってダウンロードする http://www.geocities.co.jp/SiliconValley/2949/

以下の3行を、winny ディレクトリの download.txt に追加する。
(OS) RedHat Linux 9 shrike-i386-disc1.iso,,0,0,400c7fb292c73b793fb722532abd09ad,1
(OS) RedHat Linux 9 shrike-i386-disc2.iso,,0,0,6b8ba42f56b397d536826c78c9679c0a,1
(OS) RedHat Linux 9 shrike-i386-disc3.iso,,0,0,af38ac4316ba20df2dec5f990913396d,1

- BitTorrent を使ってダウンロードする

BitTorrent Files for Slashdot Effect Victims http://f.moya.scarywater.net/

- md5sum

400c7fb292c73b793fb722532abd09ad shrike-i386-disc1.iso
6b8ba42f56b397d536826c78c9679c0a shrike-i386-disc2.iso
af38ac4316ba20df2dec5f990913396d shrike-i386-disc3.iso

2003-04-26 (Sat)

* ln コマンドでシンボリックリンク作成

この記事の直リンクURL: Permlink | この記事が属するカテゴリ: [Linux] [unix]

TARGET へのリンクを DIRECTORY に作成する。いつも TARGET と DIRECTORY の順番で迷ってしまうのでメモ。

$ ln -s TARGET DIRECTORY

man ln によると、TARGET だけを指定したときはカレントディレクトリに TARGET へのリンクを作成するとのことなので、一引数だけの指定をした方が良いかもしれない。

2003-04-22 (Tue)

* ユーザ毎の cron の設定ファイルのパス

この記事の直リンクURL: Permlink | この記事が属するカテゴリ: [Linux]

/var/spool/cron/

2003-04-11 (Fri)

* Linux で iso イメージをループバックマウント

この記事の直リンクURL: Permlink | この記事が属するカテゴリ: [Linux]

# mount -r -t iso9660 -o loop /home/hiroaki/shrike-i386-disc1.iso /home/samba/public/iso/redhat9/disc
# umount /home/samba/public/iso/redhat9/disc1

JM の mount(8) も参考になる。
http://www.linux.or.jp/JM/html/util-linux/man8/mount.8.html

2003-04-02 (Wed)

* Redhat9 を入手するには

この記事の直リンクURL: Permlink | この記事が属するカテゴリ: [Linux]

- Winny を使ってダウンロードする

Winny http://www.geocities.co.jp/SiliconValley/2949/
以下の3行を、winny ディレクトリの download.txt に追加する。
(OS) RedHat Linux 9 shrike-i386-disc1.iso,,0,0,400c7fb292c73b793fb722532abd09ad,1
(OS) RedHat Linux 9 shrike-i386-disc2.iso,,0,0,6b8ba42f56b397d536826c78c9679c0a,1
(OS) RedHat Linux 9 shrike-i386-disc3.iso,,0,0,af38ac4316ba20df2dec5f990913396d,1

- BitTorrent を使ってダウンロードする

BitTorrent Files for Slashdot Effect Victims http://f.scarywater.net/

- md5sum を確認する おすすめツール: http://www.md5summer.org/

Redhat9 md5sum 情報源: http://slashdot.org/comments.pl?sid=59033&cid=5633208
400c7fb292c73b793fb722532abd09ad shrike-i386-disc1.iso
6b8ba42f56b397d536826c78c9679c0a shrike-i386-disc2.iso
af38ac4316ba20df2dec5f990913396d shrike-i386-disc3.iso

2003-03-28 (Fri)

* 137GB を超える IDE HDD を使う

この記事の直リンクURL: Permlink | この記事が属するカテゴリ: [Linux]

Linux kernel-2.4.19 からは 48bit LBA に対応した IDE ドライバが組み込まれている。よって、BIOS が対応しているかどうかは関係なく利用可能。ただし、BIOS が誤認識してしまったり、起動時にフリーズしてしまうならば、BIOS が HDD を認識しないように設定する必要があるかも。
たとえば、
・32GB Clip のジャンパで、BIOS に対しては 32GB のディスクとして振る舞わせる
・BIOS のドライブ自動検出を OFF にする。

もう一台 HDD を用意してそちらにシステムを入れ、137GB 超のディスクはデータ置き場としてのみ使う、というやり方なら簡単。この場合は カーネルが対応してさえすればいいので、137GB の壁を簡単に超えられる。

[vine-users:057577] Big Drive (137GB 以上)のHDD を使う
http://search.luky.org/vine-users.5/msg07572.html

200GB IDE HDD
http://tach.arege.net/d/20030125.html
i810で200GBのディスクを使用している実例。

137Gbytes 超 IDE ディスクの正しい使い方
http://www.atmarkit.co.jp/fpc/experiments/009over137hdd/
Linux 向けの内容ではないが、ハードウェアが対応しなくともドライバ次第で137GBを超えるディスクを使える、ということがわかる。

2003-03-21 (Fri)

* hdparm でディスクのチューニング

この記事の直リンクURL: Permlink | この記事が属するカテゴリ: [Linux]

とりあえずいろいろやってみる。
-X66 を記述してもしなくても同じだったので、とりあえず指定しないようにした。
http://pc.2ch.net/test/read.cgi/linux/1002445806/158 として投稿。

VP_IDE: VIA vt82c586b (rev 41) IDE UDMA33 controller on pci00:07.1
ide0: BM-DMA at 0xe000-0xe007, BIOS settings: hda:DMA, hdb:DMA
hda: ST38410A, ATA DISK drive
hda: 16841664 sectors (8623 MB) w/512KiB Cache, CHS=16708/16/63, UDMA(33)

# hdparm -i /dev/hda
/dev/hda:
Model=ST38410A, FwRev=3.03, SerialNo=6CS1JE84
Config={ HardSect NotMFM HdSw>15uSec Fixed DTR>10Mbs RotSpdTol>.5% }
RawCHS=16383/16/63, TrkSize=0, SectSize=0, ECCbytes=4
BuffType=unknown, BuffSize=512kB, MaxMultSect=32, MultSect=16
CurCHS=16383/16/63, CurSects=16514064, LBA=yes, LBAsects=16841664
IORDY=on/off, tPIO={min:240,w/IORDY:120}, tDMA={min:120,rec:120}
PIO modes: pio0 pio1 pio2 pio3 pio4
DMA modes: mdma0 mdma1 mdma2 udma0 udma1 *udma2 udma3 udma4
AdvancedPM=yes: unknown setting WriteCache=enabled
Drive Supports : Reserved : ATA-1 ATA-2 ATA-3 ATA-4 ATA-5

# hdparm -m16 -c1 -u1 -d1 -tT /dev/hda
/dev/hda:
setting 32-bit I/O support flag to 1
setting multcount to 16
setting unmaskirq to 1 (on)
setting using_dma to 1 (on)
multcount = 16 (on)
I/O support = 1 (32-bit)
unmaskirq = 1 (on)
using_dma = 1 (on)
Timing buffer-cache reads: 128 MB in 3.13 seconds = 40.89 MB/sec
Timing buffered disk reads: 64 MB in 5.31 seconds = 12.05 MB/sec

2003-03-18 (Tue)

* debian のインストール

この記事の直リンクURL: Permlink | この記事が属するカテゴリ: [Linux]

debian woody 3.0r1 をインストールしてみた。

jigdo を使って powerd.com から non-us パッケージをダウンロードし、
binary-1-NON-US を作成。

CD-ROM からブート。Kernel2.4 を使いたかったので、bf24 を指定。
bf24 では i82557 チップ搭載のネットワークカードは自動認識されなかったので、インストールが終わった後に手動で設定して認識させた。

2003-02-27 (Thu)

* lynx で指定 URL のリソースを標準出力に表示して終了

この記事の直リンクURL: Permlink | この記事が属するカテゴリ: [Linux]

CGI を cron で定期的にアクセスして実行させるために、lynx を使ってhttp リクエストを投げる方法。

/usr/bin/lynx -source http://wwww.example.com/build.php
basic 認証が必要なら、それも指定できる。
参考:
[linux-users:72629] Re: lynxを使ったダウンロード
http://search.luky.org/linux-users.7/msg02627.html

- wget でもできる。というか、こっちを採用。

5 9 * * * nice -19 /usr/bin/wget http://www.example.com/build.php?mode=buildall --output-document=/dev/null --http-user=USERNAME --http-passwd=PASSWORD

2002-10-10 (Thu)

* hdparm による IDE ハードディスクのチューニング

この記事の直リンクURL: Permlink | この記事が属するカテゴリ: [Linux] [PC]

hdparm を使うと、IDE ハードディスクの設定を確認したり変更したりできる。
$ /sbin/hdparm -a128 -c1 -d1 -m16 -f -t -T /dev/hda
ベンチマークは、 -f -t -T オプションを付けて行う。

pro setting
/sbin/hdparm -a128 -c1 -d1 -X34 -m16 -k1 /dev/hda
/sbin/hdparm -a128 -c1 -d1 -X34 -m16 -k1 /dev/hdb

UDMA33 に対応していそうなものだが、現在の 環境では
使用不可なので、-X34 setting xfermode to 34 (multiword DMA mode2) とした。

dmesg を見ると、以下のようなエラーがものすごい勢いで記録されていく。
カーネルまたはドライバが悪いのか、ハードウェアが悪いのかはわからない。
hdb: timeout waiting for DMA
ide_dmaproc: chipset supported ide_dma_timeout func only: 14
hdb: irq timeout: status=0x59 { DriveReady SeekComplete DataRequest Error }
hdb: irq timeout: error=0x84 { DriveStatusError BadCRC }
ide0: reset: success

- sonic のセッティング

/sbin/hdparm -a128 -c1 -p4 -X34 -m16 -k1 /dev/hda
/sbin/hdparm -a128 -c1 -p4 -X34 -m32 -k1 /dev/hdb

sonic の hdb はマルチカウントが 32 という特徴がある。

-u1 は クラッシュの原因になっているようなので使わない。
-f -t -T によるベンチマークは無事完了したが、
いざmknmz しながら、samba で書き込みしたら IDE がパニック。
詳しいエラーメッセージは覚えてないが。
-u1 が犯人、という根拠は特にないが、「同時割り込みを許可する」というところに不穏な空気を感じる。

- 起動時に自動設定

/etc/rc.d/rc.local に書いておく。

2002-08-30 (Fri)

* nfs クライアントから nfs マウントできない

この記事の直リンクURL: Permlink | この記事が属するカテゴリ: [Linux]

http://www.linux.or.jp/JF/JFdocs/NFS-HOWTO/troubleshooting.h ... などを参照したが未解決。
クライアントから NFS マウントしようとすると以下のエラーが出る。しかもクライアントのシェルは操作不能になっちゃう。kill -9 しないと復活しない。困った。
環境は、Turbolinux 6.5 Server 付属の nfs サーバとクライアント。
nfs: server 10.31.73.84 still not responding
nfs_get_root: getattr error = 5
NFS: cannot create RPC transport.
nfs: server 10.31.73.84 is not responding

- 関連記事

2003-07-12 Linux: nfs を使えるようになった

すべての記事の見出し (全1029件)
全カテゴリの一覧と記事の数
カテゴリごとに記事をまとめ読みできます。記事の表題だけを見たい場合は、すべての記事の見出し (カテゴリ別表示) へ。

直近30日分の記事
2007-04-23 (Mon)
2007-03-07 (Wed)
2007-02-27 (Tue)
2007-01-17 (Wed)
2007-01-15 (Mon)
2007-01-14 (Sun)
2007-01-08 (Mon)
2006-12-01 (Fri)
2006-11-22 (Wed)
2006-11-20 (Mon)
2006-11-19 (Sun)
2006-09-30 (Sat)
2006-08-29 (Tue)
2006-08-04 (Fri)
2006-07-27 (Thu)
2006-07-23 (Sun)
2006-07-17 (Mon)
2006-07-10 (Mon)
2006-07-06 (Thu)
2006-07-03 (Mon)
2006-06-29 (Thu)
2006-06-28 (Wed)
2006-06-27 (Tue)
2006-06-25 (Sun)
2006-06-19 (Mon)
2006-06-18 (Sun)
2006-06-15 (Thu)
2006-06-11 (Sun)
2006-06-01 (Thu)
2006-05-30 (Tue)
プロファイル
斎藤 宏明。エンジニアです。宇都宮市に住んでいます。
リンク
RSS
スポンサードリンク
Powered by
さくらインターネット

© 斎藤 宏明 Saito Hiroaki Gmail Address
Landscape - エンジニアのメモ http://sonic64.com/
Landscape はランドスケープと読みます。
ひらがなだと らんどすけーぷ です。