Skip to content

ファイルサーバ構築

This content is not available in your language yet.

:CIFS/SMB:
Windowsでは各種ネットワークサービスを提供するためにSMB(Server Message Block)というプロトコルを利用しています。このSMBはMicrosoft社独自のプロトコルで仕様も正式には公開されていませんでした。しかし現在ではSMBを拡張し、Windows以外でもWindowsネットワークを利用できるよう仕様を公開したCIFS(Common Internet File System)がリリースされており、SMBもCIFSに統合されています。Windows2000以降はこのCIFSを利用するのが主流になっています。

:NetBIOS:
Windowsネットワーク上でコンピュータ同士が通信を行う際に使用するインターフェイスのAPIです。アプリケーションはこのAPIに準拠したインターフェイスを呼び出すことで、各種ネットワークサービスを提供します。NetBIOS名はWindowsネットワーク上のコンピュータ名などを識別するためのユニークな名前です。また、同じワークグループ内で別々のマシンが同じNetBIOS名を使うことはできません。

  • 公式サイト
    • http://www.samba.org/
      • ミラーサイトへの入り口になっています。
      • 内容、及び言語(英語で書かれている)は全て同じです。

SambaはCIFSを実装したUNIX系OS向けのサーバソフトウェアです。このSambaによって公開された共有リソースはWindowsのファイル共有機能を使って利用することができます。また、Sambaはオープンソースのソフトウェアとして開発され、無料で配布されています。

  • Sambaを使う事で実現できるWindowsのネットワークサービス
    • ファイルやプリンタ共有サービス
    • コンピュータ名などの一覧を管理するサービス
    • NetBIOS名とIP アドレスの対応を一元的に管理するためのサービス
    • WindowsネットワークにおけるNT互換のドメインコントローラの機能を提供

これらのSambaの機能を使ってUNIXとWindowsマシン間でファイルやプリンタを共有し、相互運用することができます。

本講義ではファイル共有を行える簡単なファイルサーバを構築します。

Windowsネットワークにおけるファイルの共有

Section titled “Windowsネットワークにおけるファイルの共有”
  • WindowsではNetBIOS名をIPアドレスに対応させてそれぞれのマシンを識別しています。
    • NetBIOS名とUNIXのホスト名は別の物です。従ってUNIXマシンはWindows側から識別できるようにNetBIOS名を持っている必要があります。
  • また、Windowsの共有で個々のマシンはワークグループと呼ばれるグループに所属しています。
    • ワークグループの外(他のワークグループ)であっても相手のマシンを直接指定すれば共有は可能です。

UNIXマシンは通常Windowsマシンを識別できず、また自分自身もWindowsマシンから識別されないため、
そのままではWindowsネットワークの共有には参加できません。

  • Windowsネットワークの共有の様子
    • 共有できるマシンとそのフォルダやプリンタ等が見える。

samba01.png

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で通信することも可能です。

  • Sambaはこの二つのデーモンにより、各種サービスを実現しています。

:smbd:
CIFS/SMBクライアントにファイル共有と印刷サービスを提供するサーバデーモン。

:nmbd:
NetBIOS ネームサービスとブラウジング機能を提供するサーバデーモン。

  • Sambaが使用するポートは以下の通りです。
サービス名ポート番号tcp/udp
NetBios ネームサービス137udp
NetBios データグラムサービス138udp
NetBios セッションサービス139tcp
ダイレクトホスティング SMB サービス445tcp
  • これらはWindowsにおいて共有を行う時と同じポートです。
  • 運用の際にはこれらのポートを開けるよう、Firewallを設定します。
  • 本講義ではファイル共有についての説明のみ行いますが、Sambaには他にも多くの機能があります。そのなかの重要な機能の一つにドメインコントローラ機能があります。

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ディレクトリにソースを置いて、インストール作業を行うのがセオリーです。

  • CP932パッチを適用したlibiconvをインストールします。 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
  • /usr/local/opt/libiconvにインストールします。
cd libiconv-1.9.1
./configure --prefix=/usr/local/opt/libiconv
make
make install
  • ライブラリにパスを通すために/etc/ld.so.confにパスを追加します。
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
  • configureを実行し、コンパイル、インストールを行います。
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
  • —with-libiconvは先ほどインストールしたlibiconvの場所を指定します。
  • —libdirから—with-swatdirまではそれぞれファイルの場所を指定しています。 Samba本体はデフォルトで/usr/local/sambaにインストールされるように設定されています。
ファイル場所
設定ファイル関連/etc/samba
キャッシュファイル/var/lib/samba
pidファイル/var/run
SWAT/usr/local/samba/swat

: —with-syslog :
syslogへの出力機能をサポートします。

: —with-pam :
PAM認証機構をサポートします。

: —with-pam_smbpass :
ほかのアプリケーションから利用可能なPAMモジュールを構築します。

コンパイル、インストールを行います。

Section titled “コンパイル、インストールを行います。”
make
make install

通常FedoraCoreではrootユーザのログインシェルにbashが設定されています。
特に変更を行わなければこのbashを使って作業を行うので、bashの設定ファイルである.bashrcを設定します。

.bashrcはそのユーザが新しくシェルを作成する度に読み込まれ、設定されます。
.bash_profileもbashの設定ファイルですが、これはユーザがログインした時に一度だけ読み込まれ、設定されます。
  • ログインシェルの確認
getent passwd root
root:x:0:0:root:/root:/bin/bash
  • rootユーザでSambaのコマンドを使用できるようにbashの設定ファイルにパスを設定しておきます。
    • .bashrcに次の設定を追加します。
    • 「=」の前後にスペースを入れないようにしてください。
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という名前で、各セクションごとに設定を行います。[ ] で囲った名前がそれぞれセクションの名前になります。

  • 3つの特別なセクション([global]、[homes]、[printers])

:globalセクション:
このセクション中のパラメータは、サーバ全体、 もしくは各セクションで項目が定義されていない時の 既定値として適用されます。同じ項目が他のセクションで定義されている時は、そちらが優先されます。NetBIOS名や所属するワークグループの設定を行う必須のセクションです。

:homesセクション:
クライアントがsmb.confファイルに存在しない共有に接続しようとすると、Sambaは [homes] セクションが定義されているかどうかを確認します。定義されている場合、その存在しない共有の共有名をUNIXのユーザ名とみなし、Sambaは登録されているユーザ名の中に、該当するユーザ名があるかどうか検索します。ユーザ名が見つかれば、SambaはクライアントをSambaサーバ上の自分のホームディレクトリに接続を試みているユーザとして扱います。

:printersセクション:
クライアントが smb.confファイルに存在しない共有に接続しようとして、その共有名がSambaサーバに登録されているユーザ名でもない場合に、Sambaはそれがプリンタ共有かどうかをチェックします。プリンタの設定ファイル(通常 /etc/printcap)を読み込んで、要求された共有名の定義が存在するかどうかを調べ、存在する場合はSamba はそのプリンタ名の共有を作成します。

本講義ではプリンタの共有は行わないのでprintersセクションの設定は行いません。

既にSambaがインストールしてある人は、/etc/samba以下にsmb.confがあると思いますが、その設定ファイルはコメントが多く編集し辛いので、既に置いてある設定ファイルの名前を変更しておいて、新しく設定ファイルを作ります。

  • 既にsmb.confがあるかどうか調べる。
ls /etc/samba/smb.conf

のコマンドで下のように表示される人は既にsmb.confが存在します。

/etc/samba/smb.conf
  • 上記のように表示された人は次の操作で設定ファイルの名前を変更して置きます。
    • 何も表示されない人はsmb.confが無い人なので次の操作は必要ありません。
mv /etc/samba/smb.conf /etc/samba/smb.conf.default
vi /etc/samba/smb.conf
  • 本日定義、設定を行うセクションは次の3つです。

    • global
    • homes
    • Shared
  • netbios nameはSERVER(の部分は各自のマシン番号)を設定してください。

    • マシン番号5番の人はSERVER05
    • マシン番号23番の人はSERVER23
  • 本講義では以下の通りに設定してもらいます。

    • これは一つの設定例で、用途によって設定は異なります。
[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

:netbios name:
SambaサーバのNetBIOS名を設定します。本講義ではこちらで指定したNetBIOS名を設定してもらいます。(SERVER**)

:server string:
サーバの説明を記述します。Windowsからはコメントとして表示されます。%Lは環境変数(SambaサーバのNetBIOS名)です。

:workgroup:
所属するワークグループを設定します。本講義ではCUBEGROUPというワークグループに所属させます。

:dos charset、unix charset、display charset:
それぞれWindowsで使用する文字コード、UNIXで使用する文字コード、SWATで使用する文字コードを指定します。

: security :
クライアントがどのようにサーバの応答に応えるかを指定します。
security=userはクライアントが共有リソースにアクセスする際に、ユーザ名とパスワードを使ったログオンを必要とします。

:log level、log file :
保存するログのレベルと保存する場所を指定します。ログレベルが高いほどより詳細なログが残ります。%mはクライアントマシンのNetBIOS名をあらわす環境変数です。この変数を使うことで、クライアントマシン毎にログファイルを作成できます。

: comment :
コメントを記述します。%Sは環境変数(現在利用している共有の名前)です。

: browsable :
net viewコマンドやブラウズリスト中に表示される、利用可能な共有一覧に表示させるかどうかを指定します。(デフォルトはyes)

: readonly :
ファイルを読み取り専用で開くかどうかを指定します。(デフォルトはyes)

共有するリソースを定義し、設定を行います。

:comment:
homesに同じ

: create mode:
Samba経由で作成されたファイルのパーミッションはデフォルトのままだと744に設定されます。これを他のユーザもそのファイルを編集できるように666に変更します。

  • 同様にdirectory modeでディレクトリ(フォルダ)のパーミッションも設定できます。(デフォルトは755)

:writeable:
ファイルの書き込み、作成を可能にするかどうかを指定します。(デフォルトはno)

  • readonlyの逆の意味

Sambaにはsmb.confの内容が正しく書かれているかを確認するtestparmというコマンドがあります。

testparm

このコマンドを実行すると各セクションのチェックが行われ、内容が正しい場合は最後に、

Press enter to see a dump of your service definitions

と表示されます。

そしてEnterキーを押すとSambaサーバが認識する設定内容が出力されます。
ここでエラーが出た人はsmb.confの内容を確認してください。

パーミッションとログ保存用のディレクトリの作成

Section titled “パーミッションとログ保存用のディレクトリの作成”
  • root以外が設定ファイルを参照出来ないようにパーミッションを落します。
chmod 700 /etc/samba
chown -R root: /etc/samba
  • 設定ファイルで指定したログの保存場所を作成し、同様にパーミッションを設定します。
mkdir /var/log/samba
chmod 700 /var/log/samba
  • smb.confのSharedセクションで指定した場所に共有するディレクトリを作ります。
mkdir /home/shared
  • また、全てのユーザが読み書き出来るようにパーミッションを変更します。
chmod 777 /home/shared
  • スクリプトのサンプルがsamba-3.0.5/packaging/Fedora/以下に置いてあるのでそれを流用します。(smb.init)
cp /usr/local/src/samba-3.0.5/packaging/Fedora/smb.init /etc/init.d/smb
  • 修正する個所はsmbd、nmbdのパスとsmbd、nmbdのオプションの設定です。
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
  • 共有を行うユーザをSambaに登録し、パスワードを設定します。
    • UNIX側に作成されているアカウントのみSambaに登録できます。
      • ただし、rootアカウントは登録しないでください。
    • ここで設定するユーザ名、パスワードはUNIXアカウントのユーザ名、パスワードと同じものにして下さい。
smbpasswd -a ユーザ名
New SMB password:
Retype new SMB password:

ここで登録したユーザは/etc/samba/smbpasswdに保存されます。

  • smbpasswdの使い方(一部)
smbpasswd -a ユーザ名   Sambaにユーザを登録する。
smbpasswd ユーザ名     Sambaに登録されているユーザのパスワードを変更する。
smbpasswd -x ユーザ名   Sambaに登録されているユーザを削除する。(UNIXのアカウントは削除されません。)
  • パスワードの変更について パスワードを変更する時はUNIXのアカウント情報と、Sambaに登録されているアカウント情報の両方を変更する必要があるので注意してください。
passwd ユーザ名
smbpasswd ユーザ名
Sambaのパスワードを変更する時は、この二つを両方行う事(ユーザ名は同一のもの)
  • /etc/sysconfig/iptablesを次のように設定して、Windowsマシンから個々のサーバにアクセスできるようにします。
# 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のルールについて
iptablesは上の行から順番にルールを適用していきます。よってある行でアクセスを拒否するように設定すると、
それより下の行でアクセスを許可するように設定してあってもそのルールが適用されません。順番に注意してルールを追加してください。
/etc/init.d/iptables restart
  • 以下の手順であなたのサーバがWindowsネットワークの共有に参加できていることの確認を行います。 ++UNIXでSambaに登録したユーザのホームディレクトリにファイルを作成する。
    ++1.で作成したファイルをWindowsから編集し、sharedディレクトリにファイルを作成する。
    ++2.で作成したsharedディレクトリのファイルがcreate modeで設定したパーミッションになっている事を確認する。

    3.まで成功すれば、本日の演習は終了です。

一般ユーザでホームディレクトリに適当なファイルを作ります。

su - 一般ユーザ名   <- 一般ユーザに変更
echo test > test.txt

次はWindowsマシンを使った確認作業を行います。ここまでの作業が終わった人から順番に、机ごとに設置されているWindowsマシンで確認作業を行ってください。

  • マイネットワークから自分のUNIXサーバにアクセスします。 デスクトップから
マイネットワーク -> ネットワーク全体 -> Microsoft Windows Network -> CUBEGROUP

と開くと各自のマシンがsmb.confで設定したNetBIOS名で表示されていると思います。

  • 各々、自分のマシンにアクセスします。 アクセスすると認証を求められるので、Sambaに登録したユーザ名とパスワードを入力してください。
画像のServer-ratはWindowsマシン自身、Literacy01、Literacy02はテスト用に構築したSambaサーバです。

samba02.png

次にホームディレクトリにアクセスし、UNIX側で作ったファイルを編集します。
画像ではratというユーザをSambaに登録したのでratというフォルダを開いてます。

samba03.png

編集は好きなように行って構いません。ここではSambaに登録したユーザのホームディレクトリにアクセスし、
ファイルの内容を変更し、保存できるということを確認できればOKです。

次にSharedフォルダにアクセスして、適当なファイルを作成して下さい。

samba04.png

  • 再び自分のサーバで作業を行います。
  • sharedディレクトリに移動して、Windowsで作ったファイルのパーミッションを確認します。
    • 666になっていれば成功です。
cd /home/shared
ls -al

samba05.png

症状考えられる原因対処法
コンピュータの一覧に自分のサーバが表示されない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以下に保存するようにしています。)
  • 例えば接続が拒否された(connection refused等)というメッセージからは、サーバが接続を拒否するように設定してある。もしくは応答できない状態にある事が予想できます。

今回の演習内容を実践することにより、将来研究室のメンバー同士でファイルを共有したり、各々のホームディレクトリにファイルを保存しておけたりする共有サービスを提供できると思います。また、より複雑な設定(容量制限、ACLの利用等)や他のソフトウェアとの連携はドキュメントを読んだりGoogleで他の運用例を検索する等をして、自分で調べてみてください。