Windowsでは各種ネットワークサービスを提供するためにSMB(Server Message Block)というプロトコルを利用しています。このSMBはMicrosoft社独自のプロトコルで仕様も正式には公開されていませんでした。しかし現在ではSMBを拡張し、Windows以外でもWindowsネットワークを利用できるよう仕様を公開したCIFS(Common Internet File System)がリリースされており、SMBもCIFSに統合されています。Windows2000以降はこのCIFSを利用するのが主流になっています。
Windowsネットワーク上でコンピュータ同士が通信を行う際に使用するインターフェイスのAPIです。アプリケーションはこのAPIに準拠したインターフェイスを呼び出すことで、各種ネットワークサービスを提供します。NetBIOS名はWindowsネットワーク上のコンピュータ名などを識別するためのユニークな名前です。また、同じワークグループ内で別々のマシンが同じNetBIOS名を使うことはできません。
SambaはCIFSを実装したUNIX系OS向けのサーバソフトウェアです。このSambaによって公開された共有リソースはWindowsのファイル共有機能を使って利用することができます。また、Sambaはオープンソースのソフトウェアとして開発され、無料で配布されています。
これらのSambaの機能を使ってUNIXとWindowsマシン間でファイルやプリンタを共有し、相互運用することができます。
本講義ではファイル共有を行える簡単なファイルサーバを構築します。
UNIXマシンは通常Windowsマシンを識別できず、また自分自身もWindowsマシンから識別されないため、
そのままではWindowsネットワークの共有には参加できません。
UNIXマシンの共有リソースへの認証はSambaサーバが行います。そのため予めSambaサーバに共有を行うUNIXユーザを登録する必要があります。この時、UNIXのアカウント情報(ユーザ名、パスワード)とSamba利用ユーザの情報は同一でなければなりません。
libiconvは、UNIX環境で文字コード変換を行うライブラリです。WindowsとUNIXではファイル名やディレクトリ名の表示に使用する文字コードが異なるので、Sambaはこのライブラリを利用した文字コードの変換も行います。しかしながら、このlibiconvのライブラリに含まれている変換テーブルには正確ではない部分があり、そのまま利用すると"~"などの文字が正しく変換されません。そこでこの変換テーブルを正しく修正するためのパッチを適当して利用することにします。
伝統的にWindows上で利用するファイル名やディレクトリ名の文字コードには、Shift-JIS (正確にはCP932)が利用されています。
しかし、Windows NT/2000/XPではCP932だけでなくUTF-8を利用することができます。よって、サーバの使用している文字コードがUTF-8であれば、CP932への変換を行わず、直接UTF-8で通信することも可能です。
CIFS/SMBクライアントにファイル共有と印刷サービスを提供するサーバデーモン。
NetBIOS ネームサービスとブラウジング機能を提供するサーバデーモン。
サービス名 | ポート番号 | tcp/udp |
---|---|---|
NetBios ネームサービス | 137 | udp |
NetBios データグラムサービス | 138 | udp |
NetBios セッションサービス | 139 | tcp |
ダイレクトホスティング SMB サービス | 445 | tcp |
Windows NTによって管理されるネットワーク(NTドメイン)で、ユーザやセキュリティに関する情報を管理し、ユーザ認証を行ないます。情報科学科ラボ教室で、どのマシンを使ってもWindowsへログオンが可能なのはドメインコントローラとして働いているSambaサーバでユーザ認証を行っているからです。
皆さんが使用しているキューブマシンのMACアドレスを確認したいので、Sambaの演習の前に次の作業をやって貰います。(Sambaとは関係ありません)
wget http://192.168.1.2/chkhwaddr chmod 700 chkhwaddr ./chkhwaddr
以上のようにコマンドを実行してもらえば、こちらで用意したサーバに皆さんのマシンのMACアドレスが送信されます。
UNIX系のOSのディレクトリ構造は、各々のディストリビューションでファイルやディレクトリ構造の違いによる混乱を防ぎ、互換性を保つためにFHS(Filesystem Hierarchy Standard)という標準仕様に基づいています。/usr/local/srcディレクトリはそのFHSに基づき、ソフトウェアのソースを置くためのディレクトリとして定義されています。よってソフトウェアをソースからインストール際にはこの/usr/local/srcディレクトリにソースを置いて、インストール作業を行うのがセオリーです。
libiconvのインストールから確認作業までの一連の作業はrootで行います。
su -
cd /usr/local/src wget http://192.168.1.32/pub/source/libiconv-1.9.1.tar.gz wget http://192.168.1.32/pub/source/libiconv-1.9.1-ja-patch-1.diff.gz
tar zxvf libiconv-1.9.1.tar.gz zcat libiconv-1.9.1-ja-patch-1.diff.gz | patch -p0
cd libiconv-1.9.1 ./configure --prefix=/usr/local/opt/libiconv make make install
echo "/usr/local/opt/libiconv/lib/" >> /etc/ld.so.conf
「 > 」は必ず2個つけてください。一つだけだと、既に設定されていたパスを消去してしまいます
ldconfig
/usr/local/opt/libiconv/bin/iconv -l | egrep -i '(-31j|-ms)' EUC-JP-MS EUCJP-MS EUCJP-OPEN EUCJP-WIN CP932 SJIS-OPEN SJIS-WIN WINDOWS-31J CSWINDOWS31J
cd /usr/local/src wget http://storage.cis.k.hosei.ac.jp/pub/source/samba-3.0.5.tar.gz tar zxvf samba-3.0.5.tar.gz
cd samba-3.0.5/source/ ~~~~~~~~~~~~~~~~~~ 展開したディレクトリの中のさらにsourceディレクトリに移動します。 ./configure \ --with-libiconv=/usr/local/opt/libiconv/ \ --libdir=/etc/samba \ --with-configdir=/etc/samba/ \ --with-privatedir=/etc/samba/ \ --with-lockdir=/var/lib/samba \ --with-piddir=/var/run/ \ --with-swatdir=/usr/local/samba/swat \ --with-syslog \ --with-pam \ --with-pam_smbpass
Samba本体はデフォルトで/usr/local/sambaにインストールされるように設定されています。
ファイル | 場所 |
---|---|
設定ファイル関連 | /etc/samba |
キャッシュファイル | /var/lib/samba |
pidファイル | /var/run |
SWAT | /usr/local/samba/swat |
syslogへの出力機能をサポートします。
PAM認証機構をサポートします。
ほかのアプリケーションから利用可能なPAMモジュールを構築します。
make make install
通常FedoraCoreではrootユーザのログインシェルにbashが設定されています。
特に変更を行わなければこのbashを使って作業を行うので、bashの設定ファイルである.bashrcを設定します。
.bashrcはそのユーザが新しくシェルを作成する度に読み込まれ、設定されます。 .bash_profileもbashの設定ファイルですが、これはユーザがログインした時に一度だけ読み込まれ、設定されます。
getent passwd root root:x:0:0:root:/root:/bin/bash
vi ~/.bashrc <- ~(チルダ)は作業を行っているユーザのホームディレクトリを表します。
# .bashrc # User specific aliases and functions alias rm='rm -i' alias cp='cp -i' alias mv='mv -i' # Source global definitions if [ -f /etc/bashrc ]; then . /etc/bashrc fi # Samba <- SAMBA_HOME=/usr/local/samba <- PATH=$PATH:$SAMBA_HOME/bin:$SAMBA_HOME/sbin <- この3行を追加します
source ~/.bashrc
Sambaの設定ファイルはsmb.confという名前で、各セクションごとに設定を行います。[ ] で囲った名前がそれぞれセクションの名前になります。
このセクション中のパラメータは、サーバ全体、 もしくは各セクションで項目が定義されていない時の 既定値として適用されます。同じ項目が他のセクションで定義されている時は、そちらが優先されます。NetBIOS名や所属するワークグループの設定を行う必須のセクションです。
クライアントがsmb.confファイルに存在しない共有に接続しようとすると、Sambaは [homes] セクションが定義されているかどうかを確認します。定義されている場合、その存在しない共有の共有名をUNIXのユーザ名とみなし、Sambaは登録されているユーザ名の中に、該当するユーザ名があるかどうか検索します。ユーザ名が見つかれば、SambaはクライアントをSambaサーバ上の自分のホームディレクトリに接続を試みているユーザとして扱います。
クライアントが smb.confファイルに存在しない共有に接続しようとして、その共有名がSambaサーバに登録されているユーザ名でもない場合に、Sambaはそれがプリンタ共有かどうかをチェックします。プリンタの設定ファイル(通常 /etc/printcap)を読み込んで、要求された共有名の定義が存在するかどうかを調べ、存在する場合はSamba はそのプリンタ名の共有を作成します。
本講義ではプリンタの共有は行わないのでprintersセクションの設定は行いません。
既にSambaがインストールしてある人は、/etc/samba以下にsmb.confがあると思いますが、その設定ファイルはコメントが多く編集し辛いので、既に置いてある設定ファイルの名前を変更しておいて、新しく設定ファイルを作ります。
ls /etc/samba/smb.conf
のコマンドで下のように表示される人は既にsmb.confが存在します。
/etc/samba/smb.conf
mv /etc/samba/smb.conf /etc/samba/smb.conf.default
vi /etc/samba/smb.conf
[global] netbios name=SERVER** <- 「**」のところに自分のマシン番号を入れてください server string=Samba on %L workgroup=CUBEGROUP dos charset=CP932 unix charset=UTF-8 display charset=CP932 security=user log level=1 log file=/var/log/samba/%m.log [homes] comment=%S's home directory browsable=no readonly=no [Shared] comment=Shared Directory create mode=666 path=/home/shared writeable=yes
SambaサーバのNetBIOS名を設定します。本講義ではこちらで指定したNetBIOS名を設定してもらいます。(SERVER**)
サーバの説明を記述します。Windowsからはコメントとして表示されます。%Lは環境変数(SambaサーバのNetBIOS名)です。
所属するワークグループを設定します。本講義ではCUBEGROUPというワークグループに所属させます。
それぞれWindowsで使用する文字コード、UNIXで使用する文字コード、SWATで使用する文字コードを指定します。
クライアントがどのようにサーバの応答に応えるかを指定します。
security=userはクライアントが共有リソースにアクセスする際に、ユーザ名とパスワードを使ったログオンを必要とします。
保存するログのレベルと保存する場所を指定します。ログレベルが高いほどより詳細なログが残ります。%mはクライアントマシンのNetBIOS名をあらわす環境変数です。この変数を使うことで、クライアントマシン毎にログファイルを作成できます。
コメントを記述します。%Sは環境変数(現在利用している共有の名前)です。
net viewコマンドやブラウズリスト中に表示される、利用可能な共有一覧に表示させるかどうかを指定します。(デフォルトはyes)
ファイルを読み取り専用で開くかどうかを指定します。(デフォルトはyes)
共有するリソースを定義し、設定を行います。
homesに同じ
Samba経由で作成されたファイルのパーミッションはデフォルトのままだと744に設定されます。これを他のユーザもそのファイルを編集できるように666に変更します。
ファイルの書き込み、作成を可能にするかどうかを指定します。(デフォルトはno)
Sambaにはsmb.confの内容が正しく書かれているかを確認するtestparmというコマンドがあります。
testparm
このコマンドを実行すると各セクションのチェックが行われ、内容が正しい場合は最後に、
Press enter to see a dump of your service definitions
と表示されます。
そしてEnterキーを押すとSambaサーバが認識する設定内容が出力されます。
ここでエラーが出た人はsmb.confの内容を確認してください。
chmod 700 /etc/samba chown -R root: /etc/samba
mkdir /var/log/samba chmod 700 /var/log/samba
mkdir /home/shared
chmod 777 /home/shared
cp /usr/local/src/samba-3.0.5/packaging/Fedora/smb.init /etc/init.d/smb
vi /etc/init.d/smb
まず41行目あたりにある「 RETVAL=0 」の前に次の2行を加えます
SMBDOPTIONS="-D" ~~~~~~~~~~~~~~~~ NMBDOPTIONS="-D" ~~~~~~~~~~~~~~~~ RETVAL=0
さらに47行目と、52行目で
daemon smbd $SMBDOPTIONS ↓ daemon /usr/local/samba/sbin/smbd $SMBDOPTIONS
daemon nmbd $NMBDOPTIONS ↓ daemon /usr/local/samba/sbin/nmbd $NMBDOPTIONS
chmod 755 /etc/init.d/smb chkconfig --add smb
使い方は他の起動スクリプトと同様です。
/etc/init.d/smb start <- 起動 /etc/init.d/smb restart <- 再起動 /etc/init.d/smb stop <- 停止
/etc/init.d/smb start
smbpasswd -a ユーザ名 New SMB password: Retype new SMB password:
ここで登録したユーザは/etc/samba/smbpasswdに保存されます。
smbpasswd -a ユーザ名 Sambaにユーザを登録する。 smbpasswd ユーザ名 Sambaに登録されているユーザのパスワードを変更する。 smbpasswd -x ユーザ名 Sambaに登録されているユーザを削除する。(UNIXのアカウントは削除されません。)
パスワードを変更する時はUNIXのアカウント情報と、Sambaに登録されているアカウント情報の両方を変更する必要があるので注意してください。
passwd ユーザ名 smbpasswd ユーザ名 Sambaのパスワードを変更する時は、この二つを両方行う事(ユーザ名は同一のもの)
# Firewall configuration written by system-config-securitylevel # Manual customization of this file is not recommended. *filter :INPUT DROP [0:0] :FORWARD DROP [0:0] :OUTPUT ACCEPT [0:0] -A INPUT -i lo -j ACCEPT -A INPUT -p icmp --icmp-type any -j ACCEPT -A INPUT -p tcp -m tcp --dport 22 -j ACCEPT -A INPUT -p tcp -m tcp --dport 80 -j ACCEPT -A INPUT -p udp -m udp --dport 137:138 -s 192.168.1.0/24 -j ACCEPT <- -A INPUT -p tcp -m tcp --dport 139 -s 192.168.1.0/24 -j ACCEPT <- -A INPUT -p tcp -m tcp --dport 445 -s 192.168.1.0/24 -j ACCEPT <- この3行を追加します。 -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT -A INPUT -j REJECT --reject-with icmp-host-prohibited COMMIT
iptablesは上の行から順番にルールを適用していきます。よってある行でアクセスを拒否するように設定すると、 それより下の行でアクセスを許可するように設定してあってもそのルールが適用されません。順番に注意してルールを追加してください。
/etc/init.d/iptables restart
3.まで成功すれば、本日の演習は終了です。
一般ユーザでホームディレクトリに適当なファイルを作ります。
su - 一般ユーザ名 <- 一般ユーザに変更 echo test > test.txt
次はWindowsマシンを使った確認作業を行います。ここまでの作業が終わった人から順番に、机ごとに設置されているWindowsマシンで確認作業を行ってください。
デスクトップから
マイネットワーク -> ネットワーク全体 -> Microsoft Windows Network -> CUBEGROUP
と開くと各自のマシンがsmb.confで設定したNetBIOS名で表示されていると思います。
アクセスすると認証を求められるので、Sambaに登録したユーザ名とパスワードを入力してください。
画像のServer-ratはWindowsマシン自身、Literacy01、Literacy02はテスト用に構築したSambaサーバです。
次にホームディレクトリにアクセスし、UNIX側で作ったファイルを編集します。
画像ではratというユーザをSambaに登録したのでratというフォルダを開いてます。
編集は好きなように行って構いません。ここではSambaに登録したユーザのホームディレクトリにアクセスし、 ファイルの内容を変更し、保存できるということを確認できればOKです。
次にSharedフォルダにアクセスして、適当なファイルを作成して下さい。
cd /home/shared ls -al
症状 | 考えられる原因 | 対処法 |
---|---|---|
コンピュータの一覧に自分のサーバが表示されない | smb.confの設定が間違っている可能性があります。 | /etc/samba/smb.confの設定を確認して(netbios name、workgroup辺りを中心に)、修正してください。修正したら必ずSambaを再起動してください。 |
サーバにアクセスしようとするとアクセスが拒否される | Firewall(iptables)の設定が間違っている、もしくはSambaが正しく動作していない可能性があります | /etc/sysconfig/iptablesの設定を確認し、修正してください。修正したら必ずiptablesを再起動してください。それでも上手くいかない場合は起動スクリプト(/etc/init.d/smb)も同様に確認、修正をしてSambaを再起動してください。 |
どうしても認証が通らない | Sambaに登録しているユーザ名、もしくはパスワードがUNIXアカウントのユーザ名もしくはパスワードと異なっている可能性があります。 | 登録されているユーザ名を確認して(cat /etc/samba/smbpasswd 等)ユーザ名が間違っている場合はsmbpasswdコマンドで登録しなおしてください。それでも認証が通らない場合は、パスワードを設定しなおしてみてください。 |
ファイルの名前が壊れている。 | libiconvのインストールが正しく行われていない可能性があります。 | /etc/ld.so.confの中身を確認して(cat /etc/ld.so.conf等)/usr/local/opt/libiconv/libというパスが追加されているかどうか確認し、追加されていなければ追加してください。追加したら ldconfig コマンドを忘れずに実行してください。それでも直らない場合は、libiconvをインストールした/usr/local/opt/libiconv以下を削除して(rm /usr/local/opt/libiconv -rf)、パッチを適用するところからもう一度libiconvのインストールをやり直してみてください。 |
ホームディレクトリにあるファイルを編集できない | smb.confの設定が間違っているか、そのファイルの所有者がroot等、異なるユーザになっている可能性があります。 | smb.confの設定の場合、read only、writeableの項目をよく確認してください。修正した後にはSambaの再起動を忘れずに行ってください。ファイルの所有者がSambaに登録されているユーザと異なっている場合は、「su - ユーザ名」でSambaに登録されているユーザに変更して、再度ファイルを作成してください。 |
sharedディレクトリに作成したファイルのパーミッションが設定した内容と異なる | smb.confのSharedセクションの設定が間違っている可能性があります。 | smb.confでSharedセクションの項目「create mode」の項目を中心に設定を見直して、修正してください。修正後は必ずSambaを再起動してください。 |
エラーが発生した時はまずエラーメッセージをよく読み、ログを確認する等して原因を考えてみてください。 (今回の場合、ログは/var/log/samba以下に保存するようにしています。)
今回の演習内容を実践することにより、将来研究室のメンバー同士でファイルを共有したり、各々のホームディレクトリにファイルを保存しておけたりする共有サービスを提供できると思います。また、より複雑な設定(容量制限、ACLの利用等)や他のソフトウェアとの連携はドキュメントを読んだりGoogleで他の運用例を検索する等をして、自分で調べてみてください。