公開日 2025-02-02 更新日 -
2002年3月に修理してから順調であったjoel(2)も、2005年6月10日にHDDの不調が起こりました。
急いで交代のサーバーを組み立てました。これまでは、Windowsデスクトップ機の更新で余ったものにLinuxを入れてサーバーにしていましたが、この時期マザーボードのコンデンサが軒並み不良になるという騒ぎもあって適当なものがなく、新品のマザーボードとCPUを調達して組み立てることになりました。サーバー名はjonahにしました。
jonahの仕様
CPU Sempron 2600+
MB KM400A Pro
south:VT8237
メモリー 512MB DDR PC3200 CL3 (samsung)
HDD 120GB (ARAID99によるraid0)
OS debian Sarge
マザーボードは microATX で小さいものですが、大きなサーバー用筐体に入れました。換気をしっかりして冷やすためですが、存在感を醸し出す心理作戦でもあります。
joelが回復した様子を見せたことで交代はもう少し後になります。今考えれば原因不明でもさっさと交代させろと思いますが、当時は原因究明に力が入っていました。また、LinuxのディストリビューションをRedHat系からDebian系に代えたことによる管理方法の変化や各ソフトウェアの仕様変更への対応に時間をかけています。Linuxクライアントにむけた試行錯誤をしています。作業記録もありますが、うまく行かなかった部分だけ残っていてよくわからない部分もあります。
特にldap化で手間取っています。役割を分散させて並行して運用し、完全移行は2005年10月になります。
| サーバー名(代) | 稼働年数 | 稼働開始 | 稼働終了 | OS | HDD | memory | CPU | mother boad | 備考 |
|---|---|---|---|---|---|---|---|---|---|
| zebedee | 1.5年 | 2000-3 | 2001-8 | RedHat 6.1J | 2.5GB(+20GB) | 64MB | MMX Pentium 166MHz | 不詳 | 第1期,第2期 |
| joel(1) | 0.5年 | 2001-8 | 2002-1+ | miracle 1.0 | 30GB+30GB | 128MB | Pentium III 600MHz | ABIT BE6-II | 第2期 |
| joel(2) | 3.6年 | 2002-3 | 2005-9+ | ReHat 7.2 | 30GB+40GBx2 | 512MB | Pentium III 600MHz | ABIT BE6-II | 第2期 |
| zebedee(2) | 5.3年 | 2001-8 | 2006-10 | turbo→miracle | 4GB | 64MB | MMX Pentium 166MHz | 不詳 | 補助のサーバー |
| jonah | 7年 | 2005-6 | 2012-5? | Sarge | 120GB | 512MB | Sempron 2600+ | KM400A pro | ARAID99によるraid0 |
2005/8/17あたりの話です。まずWindowsからの操作で管理するためにsshの設定をしました。
当時は事務処理のために日常に使っているコンピュータはWindows2000でした。LinuxはまだX-Windowの設定も難しくて、漢字変換をはじめ日本語環境も快適ではありませんでした。また、印刷環境も整えるのは難しいものがありました。これはグラフィクボードやプリンタのメーカーがWindows用のドライバしか用意しないことが原因です。
サーバーとしての動作にはWindowシステムは不要なので、X-Windowは入れずに運用し、WindowsにTera-termなどのソフトを入れて接続し、CUIで操作していました。Windows側で文字コードの指定をうまく行うと日本の文字も化けずに使えて便利です。
接続方法は最初はtelnetでしたが、セキュリティの確保のためにsshが標準になり、さらにプロトコルがssh2になりました。JonahにしたときにはTera-termがssh2に対応していなかったので、puttyというソフトを使うようにしています。
sshの最初の設定では日本語の文字コードはEUC-JPでしたが、後述のsambaの設定にからんでUTF-8に変更しました。puttyはUTF-8に対応していたのでうまく行きました。ソフトの使い勝手としてはTera-termの方が好ましかったので、いつだったかはっきりしませんがTera-termがssh2とUTF-8に対応したときに戻しています。
日常に使っているコンピュータもLinuxになったときにはdebianに含まれるsshクライアントで接続します。
sambaのバージョンが、2.2系列から3.0系列へと大きく変わりました(3.0.14a-Debian 後ろに-Debianとあるのは、ディストリビューション側で変更を加えていることを表します)。
問題になるのは文字コードの指定が変わったことです。joelの指定は
client code page = 932 coding system = HEX
としていました。これはクライアントの送信してくるファイル名をCP932(拡張文字を追加したShift_JIS)と解釈して、16進コードとして記録するものです。丸付き数字やローマ数字などが含まれるときに正しく対処できるようにCP932を使います。このファイルにLinuxの側からSambaを通さずにアクセスするときには支障が出るので、文字コードを変換します。coding system の指定がこれです。EUC-JPでは拡張文字で問題が出るのでHEXを使ってきましたが、3.0系統ではHEXは標準では対応しなくなりました。次のような指定をしなければなりません
[global] unix charset = CP932/EUCJP-MS/UTF-8など dos charset = CP932 display charset = CP932/EUCJP-MS/UTF-8など
coding system は、unix charset に名前が変わりました。
EUCJP-MSを試しましたが、Windowsのファイルマネージャからの操作では①などの文字もOKですが、putty経由では若干文字化けします。UTF-8を使うことにしました。
dos charset = CP932 unix charset = UTF-8 display charset = UTF-8
sambaで保存されたファイルをLinux上のコンソールで直接操作することは、ほとんど必要ないと考えていましたが、kernel2.6になってから、ロケールを"ja_JP.UTF-8"とすることで、コンソール上でもなんとかなるように変わっていきます。これはこれで便利です。
新たに保存するファイルはこれで解決しましが、すでにjoelにあるファイルは変換作業が必要になったはずです。
ちなみにHEXの例を上げておくと、ユーザーホームのフォルダには、「最新」とか、「スタート メニュー」、「デスクトップ」、「Application Data」、「Cookies」などのフォルダがあります。これをLinux側からlsすれば、次のように見えます。Shift_JISを「:」を前置してそのまま書いています。
:8d:c5:90:56 :bd:c0:b0:c4 :d2:c6:ad:b0 :c3:de:bd:b8:c4:af:cc:df Application Data Cookies
将来的にクライアントもlinuxにしようと考えていました。つまり、サーバー側でユーザー認証する必要があります。そのための仕組みは nis , nis+ ぐらいしか知識がなかったのですが、linuxの雑誌でldapを紹介したものがあって、なんとか動かすことができました。うまく行かなかったという記録が残っていますが、いまさら追いかける気になれません。年を追うごとに自動でうまくいくようになっていますが、このときはなかなか大変でした。ldapの設定に失敗するとログインできなくなるので、通常のログインができるユーザーを残しておくことを考えて複雑になっているようです。
このときのldap-serverは、slapd 2.2.23-8 です。
ldapでログインができるようになったときの設定です。まだ授業のクライアントPCは Windows Me ですので、サーバー内でコンソールからのログインを試した記録だと思います。
jonah:/etc/pam.d# cat /etc/pam.d/login |grep -v -e '^#' -e '^$' auth requisite pam_securetty.so auth requisite pam_nologin.so auth required pam_env.so @include common-auth @include common-account @include common-session session required pam_limits.so session optional pam_lastlog.so session optional pam_motd.so session optional pam_mail.so standard noenv @include common-password
/etc/pam.d/common-auth auth sufficient pam_ldap.so auth required pam_unix.so use_first_pass
/etc/pam.d/common-account account required pam_unix.so account [default=bad success=ok user_unknown=ignore service_err=ignore system_err=ignore authinfo_unavail=ignore] pam_ldap.so
/etc/pam.d/common-session session required pam_unix.so session optional pam_ldap.so session required pam_mkhomedir.so skel=/etc/skel umask=0077
/etc/pam.d/common-password password sufficient pam_unix.so nullok obscure min=4 max=8 md5 password sufficient pam_ldap.so use_authtok
/etc/libnss-ldap.conf host 127.0.0.1 base dc=st,dc=seiai,dc=ed,dc=jp ldap_version 3 rootbinddn cn=admin,dc=st,dc=seiai,dc=ed,dc=jp nss_base_passwd ou=People,dc=st,dc=seiai,dc=ed,dc=jp?one nss_base_shadow ou=People,dc=st,dc=seiai,dc=ed,dc=jp?one nss_base_group ou=Groups,dc=st,dc=seiai,dc=ed,dc=jp?one /etc/pam_ldap.conf host 127.0.0.1 base dc=st,dc=seiai,dc=ed,dc=jp ldap_version 3 rootbinddn cn=admin,dc=st,dc=seiai,dc=ed,dc=jp pam_password smd5
# /etc/nsswitch.conf passwd: files ldap group: files ldap shadow: files ldap hosts: files dns networks: files protocols: db files services: db files ethers: db files rpc: db files netgroup: nis
当時ldapサーバーでLinuxからとWindowsからの認証を統合するというのが、流行りでした。まだ Active Directory が出てくる前でしたので古い話です。 授業のクライアントはWindows Me でしたが、これをlinuxに変更することを計画していました。さらに過渡期として生徒が起動するOSを選択できるようにすることを考えていました。そこでとりあえず Windowsからも ldapで認証することをやってみたわけです。
sambaの認証に使うためのldapの設定はかなり複雑です。まずldapにsamba用の属性の追加が必要です。次にsambaの設定、つまりsmb.confの書き換えが必要です。これには認証にldapを使うという設定と、パブリックドメインコントローラ(PDC)にするという設定があります。また、クライアントPCにjoelに認証してもらっていたものを、jonahに認証してもらうという書き換えが必要です。smbldap-toolsにsmbldap.confなどの作成例がありますし、設定を補助するスクリプトconfigure.plもあります。これらも使って手動で訂正を加えてなんとか動かしましたが、記録が錯綜しているし検証できないので省略します。
初にうまくいったときのsmb.conf は以下のようなものでした。
# Global parameters [global] dos charset = CP932 display charset = UTF-8 workgroup = VINE server string = %h server (Samba %v) map to guest = Bad User obey pam restrictions = Yes passdb backend = ldapsam:ldap://localhost, tdbsam, guest passwd program = /usr/bin/passwd %u passwd chat = *Enter\snew\sUNIX\spassword:* %n\n *Retype\snew\sUNIX\spassword:* %n\n . log level = 1 syslog = 0 log file = /var/log/samba/log.%m max log size = 1000 logon script = logon.bat logon path = \\jonah\%U\.profile logon home = \\jonah\%U\.profile domain logons = Yes os level = 64 domain master = Yes dns proxy = No wins server = 192.168.2.1 ldap admin dn = cn=admin,dc=st,dc=seiai,dc=ed,dc=jp ldap group suffix = ou=Groups ldap machine suffix = ou=Computers ldap passwd sync = Yes ldap suffix = dc=st,dc=seiai,dc=ed,dc=jp ldap user suffix = ou=People panic action = /usr/share/samba/panic-action %d host msdfs = Yes invalid users = root admin users = Administrator [homes] comment = Home Directories valid users = %S read only = No create mask = 0700 directory mask = 0700 browseable = No [netlogon] comment = Network Logon Service path = /home/netlogon write list = adachi browseable = No [printers] comment = All Printers path = /tmp create mask = 0700 printable = Yes browseable = No [print$] comment = Printer Drivers path = /var/lib/samba/printers [public] comment = public path = /home/public/%U write list = %U create mask = 0644 browseable = No [share] path = /usr/winprog write list = adachi, otawa guest ok = Yes [www] path = /zhome/httpd/html write list = adachi, otawa, ohno force group = +tch create mask = 0644 directory mask = 0775 browseable = No [prog] path = /zhome/dosprog force group = tch read only = No
さて、いよいよjoelからjonahへの移行をすることになります。joelの持っているユーザー認証やファイル保存の機能と、生徒が使っているファイルそのものを移動しなければなりません。
これまで、サーバーのデータの移行はハードディスクごと移設するか、丸ごとコピーでした。各ファイルにはどのユーザーの所有であるかのUIDがあってこれで所有ユーザーが決まります。いままでは、UIDとユーザーの対応をつけている/etc/passwdと、sambaのそれに相当するファイルもコピーすればよかったので問題がありませんでした。今回はUIDに使用する番号の範囲がOSの都合で変更になり、認証がldapになったのでコピーでは済まされません。UIDを考慮してユーザーを再度作っていく必要があります。
もう一つ、日本語ファイル名の問題があります。サーバー管理に関するファイルは常にASCII文字にしていますが、生徒の保存するファイルの名前は日本語の文字が使われいいる可能性があります。Windowsの決められたフォルダも日本語の場合があります。これまではサーバーを変更してもsambaの日本文字の扱いはいつもHEXであったので、そのままコピーしてよかったのですが、今回はUTF-8で保存することになっていますから。HEXからUTF-8への変換を考えなければなりません。
移動すべき生徒個人用データのフォルダ(たとえばユーザー名hogeなら)
/home/hoge /home/hoge/.profiles /home/public/hoge /zhome/dosprog/k2e/hoge メールスプール
移行すべき共有データ
/home/netlogon CONFIG.POL, logon.bat, jonah.js :済
/usr/winprog S:用 OpenOffice, Firefox, Thunderbird
:サーバー上のWindows用ソフトをネットワークドライブに接続して使うもの
/zhome/dosprog :winprogのdos版
Web :授業用テキスト
perlスクリプトを使ってuidを指定しながらユーザーを登録します。
ユーザー名、パスワード、uid(=gid)、gecosデータの入った一覧ファイルからデータを読み、smbldap-groupadd、smbldap-useradd を呼び出して登録、データコピーのためホーム(自動的に作られる)以外のユーザーのディレクトリを作成するperlスクリプトを自作しました。
前にも紹介した毎年のユーザー追加のスクリプトを元に改変しているので、$filename="nampasuidtest3.txt";などが並んでいます。これまで毎年生徒のアカウントを用意したファイルを指定した歴史です。年度ごとに、追加登録や、分割登録の記録になっています。卒業後のアカウント削除にはこのファイルを使用します。最後の$filename="nampasuidn05.txt";が今年度のもので、スクリプトの中でもこれだけが有効になります。ファイル中のUIDの範囲はdebianに合わせて変更しています。生徒のユーザー名は共通ですが、UIDはjoelとjonahで異なるはずです。
mkaccwaku.pl
#!/usr/bin/perl
#
# add account to ldap
# xxxxxxx copy profiles & data from jorl (.profile home_dir public k2e_profile)
# mkdir /home/public/hoge & set permission
# via smbmount copy profiles & data for KANJI character difference.
# Assuming mounted as following
# mount -t nfs joel:/zhome/dosprog /mnt/dosprog
# for k2e profiles which only ascii filename has.
if (! -d '/mnt/dosprog/k2e'){
`mount -t nfs joel:/zhome/dosprog /mnt/dosprog`;
}
print "add new user & copy data from joel\n";
$filename="nampasuidtest3.txt"; #test
$filename="nampasuidtestu.txt"; #test user : beta lamb testu
$filename="nampasuidjug.txt"; #c1a05 etc..
$filename="nampasuidtch.txt"; #teacher
$filename="nampasuidn03.txt"; #x3hoge etc..
$filename="nampasuidn04.txt"; #x4hoge etc..
$filename="nampasuidn04c.txt"; #x4hoge etc..
$filename="nampasuidn04b.txt"; #x4hoge etc..
$filename="nampasuidn04d.txt"; #x4hoge etc..
$filename="nampasuidn05.txt"; #x5hoge etc..
open(SFILE,$filename) || die "cannot open $filename";
while (<SFILE>){
($uname,$password,$uid,$gc,$os)=split(/\s+/);
next if $uname eq '';
print "$u - $p - $uid $gc $os - ";
$user_fullname=$gc . " " . $os;
print "$user_fullname // ";
# ldap
`/usr/sbin/smbldap-groupadd -a -g $uid $uname`;
`/usr/sbin/smbldap-useradd -a -u $uid -g $uid -c $uname -m -A 0 $uname`;
open(CMD, "| /usr/sbin/smbldap-passwd $uname> /dev/null");
print CMD "$password\n$password\n";
close(CMD);
print "ldap/ ";
# set quota
`quotatool -u $uname -b -q 100MB -l 110MB -i -q 3000 -l 3100 /home`;
print "quota/ ";
# for public_html
`mkdir /home/public/$uname/`;
`chown $uname:$uname /home/public/$uname/ -R`;
`chmod 0755 /home/public/$uname/ -R`;
print "mk_public/ ";
# for k2 editor
`mkdir /zhome/dosprog/k2e/$uname/`;
`cp -rf /mnt/dosprog/k2e/$uname/* /zhome/dosprog/k2e/$uname/`;
`chown $uname:$uname /zhome/dosprog/k2e/$uname/ -R`;
`chmod 0700 /zhome/dosprog/k2e/$uname/ -R`;
print "cp_dosprog/k2e/ ";
$ct=$ct+1;
print "$ct\n";
}
close(SFILE);
3つ目のサーバーjudasから、jorl,jonahの両方にsmbmountをかけてデータをコピーします。judasは初めて話に出てきますが、教員用のサーバーです。それぞれのユーザー名で接続しますが、ユーザー名は共通ですが、UIDはjorlとjonahで、それぞれ異なって解釈されます。そのためコピー後のchownは不要になります。
800人分。3時間から4時間で終わるはずでしたが、LDAPの障害があって半日の仕事になりました。
joel2jonah.pl
#!/usr/bin/perl
#
# copy profiles & data from joel (.profile home_dir public k2e_profile)
# via smbclient
# mount for each user as following
# smbmount \\\\joel\\beta /root/bin/jo -o username=beta,password=********
# smbmount \\\\jonah\\beta /root/bin/jn -o username=beta,password=********
print "add new user & copy data from joel\n";
$filename="nampasuidtest3.txt"; #test
$filename="nampasuidtestu.txt"; #test user : beta lamb testu
$filename="nampasuidjug.txt"; #c1a05 etc...
$filename="nampasuidtch.txt"; #tercher
$filename="nampasuidn03.txt"; #x3hoge
$filename="nampasuidotw.txt"; #otawa
$filename="nampasuidn04.txt"; #x4hoge
$filename="nampasuidn05.txt"; #x4hoge
open(SFILE,$filename) || die "cannot open $filename";
while (<SFILE>){
($uname,$password,$uid,$gc,$os)=split(/\s+/);
next if $uname eq '';
print "$uid - $uname -- ";
$user_fullname=$gc . " " . $os;
print "$user_fullname // ";
# mount
`smbmount //joel/$uname /root/bin/jo -o username=$uname,password=$password`;
`smbmount //jonah/$uname /root/bin/jn -o username=$uname,password=$password`;
# profile /* can't copy . files / profile-profiles
`mkdir /root/bin/jn/.profiles`;
`cp -raf /root/bin/jo/.profile/* /root/bin/jn/.profiles`;
`cp -raf /root/bin/jo/* /root/bin/jn/`;
# umount
`smbumount /root/bin/jo`;
`smbumount /root/bin/jn`;
print "cp_home/ ";
sleep 1;
# mount
`smbmount //joel/public /root/bin/jo -o username=$uname,password=$password`;
`smbmount //jonah/public /root/bin/jn -o username=$uname,password=$password`;
# for public_html
$comment = 'empty_public/ ';
if (-e '/root/bin/jo/index.html'){
`cp -raf /root/bin/jo/* /root/bin/jn/`;
$comment = 'cp_public/ ';
}
# umount
`smbumount /root/bin/jo`;
`smbumount /root/bin/jn`;
print $comment;
sleep 1;
$ct=$ct+1;
print "$ct\n";
}
close(SFILE);
LDAPの障害というのは、ldapの吐き出すログが多くて varが溢れたということです。初期設定ではログをたくさん出すように設定されていました。ログを出さないようにして継続しました。
こうして 2005年10月 サーバーがjoelからjonahに更新されました。基本的な構成は変わりません。
余談ですが、旧サーバーを解体するとメモリスロット近くの小さめの電解コンデンサが少々膨張しており、これのせいで不安定だったのかと想像いたしました。