Linux の 302 (Mixed Environment) 試験対策: CIFS 連携

Linux を SMB/CIFS サーバーのクライアントとして使用する

Linux コンピューターは、Windows ネットワークでサーバーとして機能するだけではありません。クライアントを兼ねることも、あるいはサーバーではなくクライアントとして機能することもできます。その場合、ftp のようなプログラムによってファイルを転送してサーバーを変更するか、Samba またはWindows Server マシンから Linux コンピューターに共有をマウントして、通常のプログラムがサーバー上のファイルに直接アクセスできるようにします。けれどもそうするには、オリジナルの SMB プロトコルとその拡張である CIFS の特徴に留意しなければなりません。このことは特に、Windows Server マシンにアクセスする場合に当てはまります。Windows Server マシンの場合、Linux コンピューターがサポートするすべてのファイルシステム機能にアクセスできるとは限らないからです。

Roderick W. Smith, Consultant and author

Roderick Smith author photoRoderick W. Smith はコンサルタントであり、『The Definitive Guide to Samba 3』、『Linux in a Windows World』、『Linux Professional Institute Certification Study Guide』など、UNIX や Linux に関する数々の著作もあります。彼は現在、ロードアイランドのウーンソケットに住んでいます。



2011年 11月 25日

この連載について

この連載は Linux システム管理タスクの学習に役立つだけでなく、LPIC-3 (Linux Professional Institute Certification レベル 3) 試験に備えるための教材にもなります。

連載の各記事についての説明とリンクについては、developerWorks の LPIC-3 ロードマップを参照してください。現在進行中のこのロードマップは、LPIC-3 試験の最新の目標 (2010年 11月) を反映しています。完成した記事はその都度ロードマップに追加されていきます。

この記事では、以下の内容について学びます。

  • SMB (Server Message Block) プロトコルと CIFS (Common Internet File System) プロトコル
  • CIFSの機能とこのプロトコルを使用する利点
  • Linux クライアントに CIFS 共有をマウントする方法

この記事は、LPIC-3 Specialty「302 Mixed Environment Exam」試験の主題 314 の目標 314.1 の試験対策となります。この目標の重要度は 3 です。

前提条件

この記事では、読者が Linux コマンドライン関数の実用的な知識を持っていること、そして Samba 構成の基本を理解していることを前提とします。また、smb.conf 構成ファイルの全体的な構成や、Linux が (mount コマンドと /etc/fstab ファイルを使用して) ローカル・ファイルシステムとリモート・ファイルシステムをマウントする方法を十分に理解している必要があります。標準的な Linux テキスト・モードの ftp コマンドを熟知していることは、記事の内容を理解する上で役立ちますが、必須ではありません。


SMB/CIFS の概要

選択的な LPI-302 試験について

LPIC (Linux Professional Institute Certification) には、さまざまなレベルがあり、レベルが上がるにつれ、より深い知識と経験が必要になってくるという点で、他の多くの認定と似ています。LPI-302 試験は、LPIC レベル階層のレベル 3 に位置する選択的な Specialty 認定試験であり、Linux システム管理に関する高度な知識が求められます。

LPIC レベル 3 (LPIC-3) 認定を取得するには、2 つのレベル 1 試験 (101 と 102)、2 つのレベル 2 試験 (201 と 202)、そして LPIC-3 Core Exam (301) に合格しなければなりません。これらの試験に合格した後、LPI-302 などの選択的な Specialty 認定試験を受けることができます。

Linux を SMB/CIFS サーバーのクライアントとして使用する方法について説明する前に、この 2 つのプロトコルの特徴を復習し、ファイルシステムに対する Linux の要求をどれだけ満たせるのかを説明しておきます。そのために、まずはオリジナルの SMB プロトコルについて説明し、次に、その後の CIFS 拡張が SMB の基本をどのように変えているかを説明します。参考として、LPI の目標 310.1 を取り上げている developerWorks の記事を読むことをお勧めします。そのなかで、SMB/CIFS の背後にある基本概念が紹介されています (「参考文献」にリンクを記載)。

SMB の基本機能

ネットワーキングの観点から見て、SMB には独特の機能がいくつかあります。具体的には、例えば SMB 固有のコンピューターのネーミング・システム (NetBIOS (Network Basic Input/Output System) 名)、ワークグループ、ユーザー認証プロトコルなどが挙げられます。SMB と CIFS が Linux ファイル共有クライアントのプロトコルとして機能する仕組みを理解する上で最も重要なのは、それぞれのプロトコルが提供する一連のメタデータです。

メタデータは、ファイルに含まれるデータではなく、ファイルに関するデータです。メタデータの例には、ファイルのタイム・スタンプ、所有者、パーミッションなどがあります。さらに、ファイル名もメタデータの 1 つです。Linux コンピューターのファイルに共通するメタデータのいくつかは、皆さんもきっとご存知のことでしょう。また、Linux と他のオペレーティング・システム (Windows など) との間のメタデータの違いについても十分ご存知かもしれません。SMB は DOS、Windows、および IBM OS/2 (Operating System/2) を対象に設計されたため、SMB にはこれらのオペレーティング・システムと共通するメタデータが数多くあります。

しかし何よりも重要な点は、SMB には UNIX および Linux のメタデータ (所有者、グループ、ほとんどのパーミッションなど) のサポートが欠けていることです。また、シンボリック・リンクとハード・リンクのサポート、そしてデバイス・ノードなどといった特殊なファイル・タイプもサポートしていません。その一方、SMB には Linux が通常は理解しないメタデータがいくつかあります (hidden、archive、および system ビットなど)。このようなメタデータは、SMB の読み取り専用属性 (read only ビット) を Linux のパーミッションの書き込み権限のビットに対応付けるなど、Linux のパーミッションのビットに対応付けることができます。

皆さん独自のフィードを作成してください

新しい記事が追加された際、あるいは内容が更新された際に通知を受けられるように、RSS、Atom、または HTML によるカスタム・フィードを作成することができます。それには、developerWorks RSS フィードにアクセスしてください。対象のゾーンとしては「Linux」を選択し、情報の種類としては「記事」を選択して、キーワードには「Linux Professional Institute」と入力します。そして最後にフィードの種類を選択します。

SMB が持つもう 1 つの制約は、そのファイル・サイズが 2GiB に制限されていることです。最近ではバックアップ・ファイルやマルチメディア・ファイルなどのサイズが数ギビバイト (gibibyte) に及ぶことも珍しくないなか、この制限は明らかに問題になります。

ファイルシステムに対する Linux の要求と SMB の仕様の違いに対処するには、Linux SMB クライアントはこれらの違いを無視するか、あるいはデータを「偽造」する方法を提供しなければなりません。これらの方法は、NTFS (NT File System) や FAT (File Allocation Table) ファイルシステムを Linux にマウントする際に使用するような方法と同様です。幸い、CIFS ではそれよりも数多くの優れた方法で SMB の制限に対処することができます。

SMB が使用するネットワーク・ポートについても理解する必要があります。SMB は、名前解決およびデータグラム・サービスに UDP (User Datagram Protocol) ポート 137 および 138 を使用し、セッション・サービス (つまり、ほとんどのファイル転送) に TCP ポート 139 を使用します。この情報は、下位レベルのネットワーク診断ツールを使用して SMB をデバッグしなればならなくなったときに必要となります。

SMB の CIFS 拡張

1990年代の半ばに、Microsoft では SMB の名前を CIFS に変更すると同時に、一連の新機能を追加することを決定しました。これらの追加機能には、シンボリック・リンクとハード・リンクのサポート、そしてより大きなファイル・サイズのサポートも含まれていました。さらに、CIFS は従来のポート 139 に加え、ポート 445 でのサーバー・アクセスもサポートしています。

Microsoft が CIFS で独自に行った SMB の拡張と同じくらいあるいはそれ以上に重要なのは、Microsoft 以外で行われた CIFS の拡張です。特に、UNIX 拡張として知られる一連の CIFS 機能は、ファイルの所有権やパーミッションなどの UNIX 形式のメタデータをサポートします。これらの機能をクライアントとサーバーの両方がサポートする場合、SMB だけをサポートするサーバーを使用する場合よりも、遥かに効率的に Linux から CIFS サーバーを利用することができます。ご想像のとおり、Windows Server オペレーティング・システムは UNIX 拡張をサポートしないため、これらの機能が役立つのは、Linux クライアントが Samba サーバーに接続する場合に限られます。UNIX 拡張を使用するには、Samba サーバーにも以下のグローバル・オプションを設定する必要があります。

unix extensions = Yes

このオプションは、バージョン 3.0 より前の Samba ではデフォルトで No に設定されていましたが、Samba 3.0 でデフォルトが Yes に変更されました。したがって、Samba 3.0 以降ではこのオプションを明示的に設定する必要はありません。


smbclient の使用

Linux から SMB/CIFS サーバーにアクセスするには、いくつかの点から、smbclient として知られるテキスト・モード・ユーティリティーを使用するのが最も簡単です。このプログラムは昔ながらの ftp クライアント・プログラムと似ているため、ftp を使い慣れていれば、ほとんど問題なく smbclient を使用できるはずです。ftp に馴染みがない方のために説明しておくと、このプログラムの背後にある概念は、従来のように共有をマウントすることなくサーバーへの接続を開始することです。共有をマウントするのではなく、ユーザーがコマンドを入力することによって、ファイルの表示、削除、ダウンロード、またはアップロードを行います。

smbclient を使用するには、このプログラム名に続けてサービス名を入力します。サービス名は、//<サーバー名>/<サービス名> という形で入力し、例えば、TANGO サーバー上の GORDON 共有にアクセスする場合は、//TANGO/GORDON と入力します。サーバーの構成によっては、パスワードの入力を求められることがあります。パスワードを正しく入力すれば、各種のコマンドを入力することによってサーバー上のファイルを操作できるようになります。表 1 に、とりわけ重要な smbclient コマンドを抜粋して簡単に説明します。これ以外のあまり標準的でないコマンドについての詳細は、このユーティリティーのメイン・ページを調べてください。

表 1: 重要な smbclient コマンド
コマンド説明
? または helpコマンドの使い方の要約を表示します。
cdカレント・ディレクトリーをサーバー上の新しいディレクトリーに変更します。
delファイルを削除します。
dir または lsカレント・ディレクトリー (または指定したディレクトリー) に格納されているファイルを表示します。
exit または quitセッションを終了します。
getサーバーからクライアントに 1 つのファイルを転送します。
lcdローカル・コンピューター上の作業ディレクトリーを変更します。
md または mkdirサーバー上にディレクトリーを作成します。
mgetサーバーからクライアントに複数のファイルを転送します。
moreファイルの内容をページで区切って表示するローカルの機能を使用して、リモート・ファイルの内容を表示します。
mputクライアントからサーバーに複数のファイルを転送します。
putクライアントからサーバーに 1 つのファイルを転送します。
rd または rmdirディレクトリーを削除します。
renameサーバー上でのファイルの名前を変更します。
rmサーバー上の 1 つ以上のファイルを削除します。

デフォルトでは、smbclient は現行ユーザー名を使用してサーバーに接続しますが、-U オプションによってユーザー名を変更することができます。実際、他にも使用できるコマンドライン・オプションがいくつかあります。例えば、smbclient の対話モードに切り替えることなくファイルを転送できるようにするオプションもあるので、スクリプトの中で smbclient を使用して自動ファイル転送を行うこともできます。詳細については、このプログラムのメイン・ページを参照してください。

リスト 1 に、smbclient を使用したセッションの例を記載します。

リスト 1. smbclient セッションの例
$ smbclient //TANGO/GORDON/
Enter gordon's password: 
Domain=[RINGWORLD] OS=[Unix] Server=[Samba 3.4.12]
smb: \> cd mystuff
smb: \mystuff\> ls
  .                                   D        0  Mon May 16 19:20:08 2011
  ..                                  D        0  Mon May 16 19:18:12 2011
  xv-3.10a-1228.1.src.rpm                3441259  Tue May 18 19:09:26 2010
  License.txt                              27898  Mon May 16 19:17:15 2011
  xorg.conf                                 1210  Fri Jan 21 04:18:13 2011

		51198 blocks of size 2097152. 2666 blocks available
smb: \mystuff\> get xorg.conf
getting file \mystuff\xorg.conf of size 1210 as xorg.conf (9.4 KiloBytes/sec)
(average 9.4 KiloBytes/sec)
smb: \mystuff\> exit

ヒント:smbclient は優れたデバッグ・ツールになります。smbclient は単純で、共有をマウントする以外の方法でネットワークにアクセスする手段となるため、問題をデバッグしようとする場合に役立つことがあります。


SMB/CIFS 共有のマウント

smbclient は有用なツールですが、このツールによるアクセスは、Windows クライアントからサーバーにアクセスする際に慣れているようなシームレスなアクセスではありません。シームレスなアクセスが必要な場合には、他のツールを使って SMB/CIFS 共有をマウントする必要があります。それには、Linux の標準的な mount コマンドを使用することができます。あるいは、/etc/fstab ファイルを編集して、コンピューターのブート時に自動的に SMB/CIFS 共有がマウントされるようにするという方法もあります。

共有を一時的にマウントする

SMB/CIFS 共有をマウントするには、ローカル・ボリュームまたは NFS (Network File System) エクスポートをマウントするときと同じ mount コマンドを使用することができます。ファイルシステムのタイプを cifs として指定すれば、通常、mount はコマンドの構文に基づいてこのドライバーを使用するという判断ができるはずです。あるいは、ヘルパー・プログラム mount.cifs を直接呼び出すこともできます。基本的に、ローカル・ファイルシステムをマウントする場合との違いは、デバイスの指定だけです。したがって、例えば TANGO サーバーの GORDON 共有をマウントするには、root として以下のように入力することができます。

# mount //TANGO/GORDON /mnt

けれども実際には、上記のコマンドの使用方法には問題があります。このコマンドは、root をユーザー名としてサーバーに渡しますが、サーバーが root のログインを許可しなければ、マウントは失敗するからです。この問題は、-o user=name オプションを使用してユーザー名をサーバーに渡すことによって解決することができます。

# mount -o user=gordon //TANGO/GORDON /mnt
Password:

-o オプションと一緒に mount コマンドに渡せるオプションは他にもあります。そのうち、とりわけ役に立つオプションを表 2 にまとめます。他のオプションについては、mount.cifs のメイン・ページを参照してください。

表 2: 重要な mount.cifs のオプション
オプション説明
user=name または username=nameサーバーに送信するユーザー名を指定します。
password=passサーバーに送信するパスワードを指定します。パスワードを指定しない場合、mount.cifs は PASSWD 環境変数の値を使用します。この値が設定されていなければ、プログラムがパスワードの入力を求めるプロンプトを出します。
credentials=filenameユーザー名、パスワード、そしてオプションでワークグループ名が含まれるファイルを指定します。各値は、それぞれ username=password=workgroup= という文字列で始まる個別の行に示されます。
uid=UID共有からマウントされるファイルの所有者とするユーザーのユーザー ID (UID) を設定します。
gid=GIDuid=UID オプションと同様ですが、このオプションの場合は UID ではなくグループ ID (GID) を設定します。
file_mode=modeサーバーからのファイルに割り当てるファイル・モード (パーミッション) を数値形式で設定します。
dir_mode=modefile_mode=mode と同様ですが、ファイルではなく、ディレクトリーを対象とします。
guestパスワードの入力を促されなくなります。このオプションは一般に、共有がゲスト・アクセスをサポートする場合にのみ機能します。
hardサーバーがアクセス不可能になった場合、サーバー上のファイルにアクセスしようとするプロセスは、サーバーが復旧するまで中断されます。
softサーバーがアクセス不可能になった場合、サーバー上のファイルにアクセスしようとするプロセスは、エラー・メッセージを受け取ります。これがデフォルトの振る舞いです。

通常、uidgidfile_modedir_mode オプションは、CIFS UNIX 拡張をサポートするサーバーに接続する場合には不要ですが、その場合でも、サーバーが提供する値を変更するためにこれらのオプションを使用することができます。もう 1 つ注意する点として、上記のオプションはいずれもクライアント上でファイルを表示する際に影響を及ぼしますが、サーバー上でのパーミッションと所有権に影響することはありません。

マウントされた SMB/CIFS 共有には、ローカル・ボリュームや NFS ボリュームとまったく同じようにアクセスすることができます。cp でファイルをコピーすることも、rm でファイルを削除することも、テキスト・エディターやその他のプログラムでファイルを直接編集することなどもできます。ただし、サーバーがサポートしていない機能については使用できないことに注意してください。例えば、サーバーが UNIX 拡張をサポートしているのではない限り、chmod を使ってファイルのモードを変更することはできません (chmod の場合、一部の例外として、書き込み権限を変更することはできます。SMB の読み取り専用属性 (read only ビット) が書き込み権限のビットと対応付けられるためです)。

共有を使用し終わったら、ローカル・ファイルシステムを操作する場合とまったく同じように、umount コマンドを使用して共有をアンマウントすることができます。

# umount /mnt

SMB を使用した共有のマウント

カーネル 2.6.37 まで、Linux カーネルには SMB ドライバーと CIFS ドライバーがそれぞれ単独で組み込まれていました。したがって、ファイルシステムのタイプを smbfs に指定するか、smbmount プログラムを使用することで、オリジナルの SMB プロトコルを使って共有をマウントすることができました。こうした方法は、ファイルシステム・タイプ・コードとして cifs を指定する場合や mount.cifs プログラムを使用する場合とほとんど同じように機能しましたが、一部の詳細は異なりました。SMB プロトコルを使用した場合、CIFS UNIX 拡張をはじめとする CIFS 専用の機能を使用することはできないのです。

かつては、SMB を使用するのが妥当な場合もありました。例えば、非常に古い Microsoft Windows 9x/Me コンピューターによってエクスポートされた共有は、cifs を使用するとマウントすることができませんが、Linux の smbfs ドライバーを使用すればマウントすることができます。しかし、最近の cifs 実装では以前にあった制約のほとんどを克服しているため、現在はそのような問題はめったにありません。ただし、そうした問題が発生していると考えられる場合には、カーネル 2.6.37 もしくはそれより前のバージョンのカーネルをインストールして、smbfs ドライバーによってこの問題が解決されるかどうかを確かめてみてください。

共有を恒久的にマウントする

コンピューターに SMB/CIFS 共有を恒久的にマウントさせたい場合には、/etc/fstab にエントリーを追加します。このプロセスは、他の mount コマンドを /etc/fstab エントリーに記述する場合とまったく同じですが、共有を恒久的にマウントするというコンテキストの場合、表 2 に記載されたオプションの 1 つ、credentials について特に触れておく必要があります。ほとんどの SMB/CIFS サーバーはパスワードを使って認証を行うため、共有をマウントするのに /etc/fstab を使用するとしたら、パスワードを永久に保管する必要があります。password オプションを使用してパスワードを直接 /etc/fstab に保管することもできますが、この方法はお勧めできません。なぜなら、/etc/fstab はすべてのコンピューターのユーザーが読み取れるようにする必要があるため、この方法で保管されたパスワードは、誰にでも読み取り可能になってしまうからです。一方、credentials を使用すれば、root だけが読み取り可能なファイルにパスワードを保管することができるため、パスワードのセキュリティーが強化されます。

SMB/CIFS 共有に有効な /etc/password エントリーは、以下のようになります。

//TANGO/BACKUPS  /saveit  cifs  credentials=/etc/samba/creds.txt  0 0

以下は、上記のエントリーに関連付けられたクレデンシャル・ファイルの例です。

username=buuser
password=Iw2bUmS[t

注意: クレデンシャル・ファイルには必ず適切なパーミッションを設定してください。通常は 0600 または 0400 を設定し、所有権は root、またはファイルにクレデンシャルが保管されているユーザーに設定されます。

上記のように構成すると、ユーザーがコンピューターをリブートするか、mount -a を入力するたびに、//TANGO/BACKUPS 共有が自動的にマウントされます。この機能が働かない場合には、ユーザー名とパスワードが正しいことを確認してから mount コマンドでテストし、さらに他の所定のトラブルシューティング手順を行ってください。


次回の予告

この連載の次回の記事「Linux の 302 (Mixed Environment) 試験対策: NetBIOS と WINS」では、WINS (Windows Internet Name Service) とブラウジング機能を使用した名前解決によって、コンピューターと共有からなるツリーのような階層から、コンピューターがネットワーク共有を見つけられるようにする仕組みを説明します。

参考文献

学ぶために

議論するために

  • My developerWorks コミュニティーに加わってください。ここでは他の developerWorks ユーザーとのつながりを持てる他、開発者が主導するブログ、フォーラム、グループ、ウィキを調べることができます。

コメント

developerWorks: サイン・イン

必須フィールドは(*)で示されます。


IBM ID が必要ですか?
IBM IDをお忘れですか?


パスワードをお忘れですか?
パスワードの変更

「送信する」をクリックすることにより、お客様は developerWorks のご使用条件に同意したことになります。 ご使用条件を読む

 


お客様が developerWorks に初めてサインインすると、お客様のプロフィールが作成されます。会社名を非表示とする選択を行わない限り、プロフィール内の情報(名前、国/地域や会社名)は公開され、投稿するコンテンツと一緒に表示されますが、いつでもこれらの情報を更新できます。

送信されたすべての情報は安全です。

ディスプレイ・ネームを選択してください



developerWorks に初めてサインインするとプロフィールが作成されますので、その際にディスプレイ・ネームを選択する必要があります。ディスプレイ・ネームは、お客様が developerWorks に投稿するコンテンツと一緒に表示されます。

ディスプレイ・ネームは、3文字から31文字の範囲で指定し、かつ developerWorks コミュニティーでユニークである必要があります。また、プライバシー上の理由でお客様の電子メール・アドレスは使用しないでください。

必須フィールドは(*)で示されます。

3文字から31文字の範囲で指定し

「送信する」をクリックすることにより、お客様は developerWorks のご使用条件に同意したことになります。 ご使用条件を読む

 


送信されたすべての情報は安全です。


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=60
Zone=Linux
ArticleID=775783
ArticleTitle=Linux の 302 (Mixed Environment) 試験対策: CIFS 連携
publish-date=11252011