授業用ネットワークシステム構築のお話(4)

目次

公開日 2025-02-02 更新日 -

3台目サーバーjonahの用意

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月になります。

サーバー名(代)稼働年数 稼働開始稼働終了 OSHDDmemory CPUmother boad備考
zebedee1.5年 2000-32001-8 RedHat 6.1J2.5GB(+20GB)64MB MMX Pentium 166MHz不詳第1期,第2期
joel(1)0.5年 2001-82002-1+ miracle 1.030GB+30GB128MB Pentium III 600MHzABIT BE6-II第2期
joel(2)3.6年 2002-32005-9+ ReHat 7.230GB+40GBx2512MB Pentium III 600MHzABIT BE6-II第2期
zebedee(2)5.3年 2001-82006-10 turbo→miracle4GB64MB MMX Pentium 166MHz不詳補助のサーバー
jonah7年 2005-62012-5? Sarge120GB512MB Sempron 2600+KM400A proARAID99によるraid0

Windowsからのssh接続

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

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

ldap

将来的にクライアントも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

sambaの認証をldapに

当時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もあります。これらも使って手動で訂正を加えてなんとか動かしましたが、記録が錯綜しているし検証できないので省略します。

ldap認証のsmb.conf

初にうまくいったときの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から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に更新されました。基本的な構成は変わりません。

余談ですが、旧サーバーを解体するとメモリスロット近くの小さめの電解コンデンサが少々膨張しており、これのせいで不安定だったのかと想像いたしました。