この記事では、以下の内容について学びます。
- 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 コマンドを熟知していることは、記事の内容を理解する上で役立ちますが、必須ではありません。
Linux を SMB/CIFS サーバーのクライアントとして使用する方法について説明する前に、この 2 つのプロトコルの特徴を復習し、ファイルシステムに対する Linux の要求をどれだけ満たせるのかを説明しておきます。そのために、まずはオリジナルの SMB プロトコルについて説明し、次に、その後の CIFS 拡張が SMB の基本をどのように変えているかを説明します。参考として、LPI の目標 310.1 を取り上げている developerWorks の記事を読むことをお勧めします。そのなかで、SMB/CIFS の背後にある基本概念が紹介されています (「参考文献」にリンクを記載)。
ネットワーキングの観点から見て、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 のパーミッションのビットに対応付けることができます。
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 をデバッグしなればならなくなったときに必要となります。
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 以降ではこのオプションを明示的に設定する必要はありません。
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 は単純で、共有をマウントする以外の方法でネットワークにアクセスする手段となるため、問題をデバッグしようとする場合に役立つことがあります。
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=GID | uid=UID オプションと同様ですが、このオプションの場合は UID ではなくグループ ID (GID) を設定します。 |
file_mode=mode | サーバーからのファイルに割り当てるファイル・モード (パーミッション) を数値形式で設定します。 |
dir_mode=mode | file_mode=mode と同様ですが、ファイルではなく、ディレクトリーを対象とします。 |
guest | パスワードの入力を促されなくなります。このオプションは一般に、共有がゲスト・アクセスをサポートする場合にのみ機能します。 |
hard | サーバーがアクセス不可能になった場合、サーバー上のファイルにアクセスしようとするプロセスは、サーバーが復旧するまで中断されます。 |
soft | サーバーがアクセス不可能になった場合、サーバー上のファイルにアクセスしようとするプロセスは、エラー・メッセージを受け取ります。これがデフォルトの振る舞いです。 |
通常、uid、gid、file_mode、dir_mode オプションは、CIFS UNIX 拡張をサポートするサーバーに接続する場合には不要ですが、その場合でも、サーバーが提供する値を変更するためにこれらのオプションを使用することができます。もう 1 つ注意する点として、上記のオプションはいずれもクライアント上でファイルを表示する際に影響を及ぼしますが、サーバー上でのパーミッションと所有権に影響することはありません。
マウントされた SMB/CIFS 共有には、ローカル・ボリュームや NFS ボリュームとまったく同じようにアクセスすることができます。cp でファイルをコピーすることも、rm
でファイルを削除することも、テキスト・エディターやその他のプログラムでファイルを直接編集することなどもできます。ただし、サーバーがサポートしていない機能については使用できないことに注意してください。例えば、サーバーが
UNIX 拡張をサポートしているのではない限り、chmod を使ってファイルのモードを変更することはできません
(chmod の場合、一部の例外として、書き込み権限を変更することはできます。SMB の読み取り専用属性 (read only ビット) が書き込み権限のビットと対応付けられるためです)。
共有を使用し終わったら、ローカル・ファイルシステムを操作する場合とまったく同じように、umount コマンドを使用して共有をアンマウントすることができます。
# umount /mnt |
コンピューターに 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) とブラウジング機能を使用した名前解決によって、コンピューターと共有からなるツリーのような階層から、コンピューターがネットワーク共有を見つけられるようにする仕組みを説明します。
学ぶために
- 「Linux の 302
(Mixed Environments) 試験対策: 概念」(developerWorks、2011年2月) で、SMB および CIFS
の基本原理を説明しています。
- Samba Wiki に、CIFS UNIX
拡張の技術的詳細を説明するページがあります。
- LPIC Program サイトでは、LPI の 3 つの Linux
システム管理資格認定レベルについて、詳しい目標、タスクのリスト、そして出題例を調べられます。特に、LPI-302
の具体的な目標とタスクおよび出題例を調べてください。
- developerWorks の連載「LPI exam
prep」をすべて読んで、Linux の基礎を学び、2009年4月以前の LPI 試験の目標に基づくシステム管理者認定試験に備えてください。
- 「Exam
Preparation Resources for Revised LPIC Exams」に、LPI で管理している他の認定の教材がリストされています。
- developerWorks Linux ゾーンで、Linux
開発者および管理者向けのハウツー記事とチュートリアル、そしてダウンロード、ディスカッション、フォーラムなど、豊富に揃った資料を探してください。
- Twitter で developerWorks
をフォローするか、developerWorks で Linux
に関するツイートのフィードに登録してください。
- さまざまな IBM 製品および IT 業界についての話題に絞った developerWorks の Technical
events and webcasts で時代の流れをキャッチしてください。
- 無料の developerWorks
Live! briefing に参加して、IBM 製品およびツール、そして IT 業界の傾向を素早く学んでください。
- developerWorks の on-demand
demos で、初心者向けの製品のインストールとセットアップから、熟練開発者向けの高度な機能に至るまで、さまざまに揃ったデモを見てください。
議論するために
- My developerWorks
コミュニティーに加わってください。ここでは他の developerWorks ユーザーとのつながりを持てる他、開発者が主導するブログ、フォーラム、グループ、ウィキを調べることができます。
