openSUSEからWindows共有を使いやすく使う

openSUSEからWindowsの共有にアクセスして使い続けていると感じることがあります。
使いにくいですよね。
GUI上からWindows共有へアクセスすると、日本語のファイルを開けないことが多いです。
共有フォルダのMP3はクリック一つで再生されなくてはガマンできません。

とりあえず方法は三つあります。

・コマンドラインからファイル共有をマウントする
・fstabに記述して起動時にマウントする
・自動マウント機能を利用する (※おすすめ)

オマケ マウントしようとしたらエラーが

openSUSEからWindows上の共有フォルダにアクセスして文書ファイルを開こうとしても、日本語ファイル名によっては開けなかったりします。マルチバイト圏の悲しさです。



英文字だけのファイルならクリックして開けますが、いかにも「一旦ファイルをローカルにダウンロードしてる感」があります。
KDE標準の「ネットワークフォルダの参照」
や「ネットワークプレースの追加」がこれに相当します。GUIからWindowsの共有を使いやすくという意図なのでしょうが、Windows同士のようなシームレスさを感じることができません。
共有フォルダのMP3はクリック一つで再生されなくてはガマンできません。

なぜネットワークフォルダの参照、つまりファイルマネージャの「smb://IPアドレス/共有名」のアクセスではシームレスに動作しないのか。
それは裏側でアクセスに使用されているsmbclientソフトはあくまで対象サーバからデータをダウンロードしてくるクライアントソフトであって、音楽を再生するなどストリーミング的にデータを再生ソフトに与えることを目的にはしていないのです。
共有フォルダのMP3はクリック一つで再生されなくてはガマンできません。

どうすればWindows同士の共有フォルダのようなシームレスでストレスのない共有が出来るのか?
これは別の方法が用意されています。
ただしLinuxとWindowsの思想の違いにより、つれづれなるままにマウスで操作していったら共有ファイルに行き着くことは出来ません。
Linuxは明確な意志と操作によって、初めてリモートのデータにアクセスできるのです。

KDEにまつわるWindows共有へのアクセス設定(システム設定のsamba、ネットワークプレースの追加など)は、全てsmbclient機能に基づいています。
だからこの辺りをいくら設定しても状況は改善されません。


徒労に終わる設定群

コマンドラインからファイル共有をマウントする

カーネル2.6系からはWindowsの共有プロトコルであるCIFSが、カーネルに統合されているので普通のデバイスと同じようにマウントできます。これを使用します。
共有の閲覧というより、Windowsで言うところの「ネットワークドライブの割り当て」に相当します。

例えば/mnt/shareへWindows共有をマウントするとしましょう。
idコマンドで事前にuidとgidを確認します。

>id
uid=1000(user) gid=100(users) 所属グループ(略
>cd /mnt

>su
#mkdir share
#mount //WindowsのIPアドレス/共有 /mnt/share -o  id=1000,gid=100,user=winuser,password=winpassword
※個人的なデータならホームディレクトリの下にディレクトリを作成して(/home/user/share)、そこへマウントしても良いでしょう。

※記述したuid、gidはファイルシステムをマウントしたときの所有者の指定です。
 これが無いとroot以外のユーザからは読み取り専用でアクセスをすることになります。

 openSUSEから読み取り専用でアクセスするなら、uid/gidのパラメータは必要ありません。


これで/mnt/shareにWindowsの共有がマウントされました。ファイルへのアクセスは「/mnt/share/データ」です。
これならLinuxのアプリケーションたちも、ローカルのディレクトリにファイルがあると勘違いしてくれます。
例えばVLCPlayerが入っていれば、動画ファイルをクリックすると普通に再生されます。
これです。これを待っていたのです。

が、問題があります。
・ファイルシステムのマウントは管理権限者によって行われるべし、というLinuxの思想により、mountコマンドはrootでないと実行できません。
・一つの共有に一つのマウントディレクトリが必要です。
・Windows共有をぼんやり眺めるためだけに、こんな長いコマンドを打たねばなりません。
そんなの我慢できません。なんとか使い勝手を向上させられないでしょうか。

※もしエラーが出るなら「マウントしようとするとエラーが」を参照してください。

fstabに記述して起動時にマウントする ファイルシステムのマウントの設定ファイルといえばfstabです。
fstabへ記述しておけば、起動時に自動でマウントされます。

/etc/fstabをrootから編集し、以下の行を追加します。
uidとgidはidコマンドの結果を採用します。

//WindowsのIPアドレス/共有 /mnt/share cifs uid=1000,gid=100,user=winuser,password=winpass 0 0


これなら起動の度に自動的に/mnt/shareへマウントしてくれます。
逆に「つなぎっぱなしなど気持ち悪い。必要なときだけrootでマウントしたい。だって使用中にLAN内からSSHで入られたら、他の人にも見られちゃうだろ」という人は、noautoパラメータを加えましょう

//WindowsのIPアドレス/共有 /mnt/share cifs uid=1000,gid=100,user=winusers,password=winpassword,noauto 0 0

この場合は必要に応じて一般ユーザから

sudo mount //WindowsのIPアドレス/共有


とすればマウントされます。
あるいはデスクトップにKDEデバイスリンクを作成すれば、クリックで自動マウントされます。

ただノートパソコンのように外へ持ち出している場合、いつも対象のWindowsが起動しているとは限らない場合は、openSUSEの起動時に「Windows共有へ接続できなくてマウントに失敗したぞ!」と怒られます。

自動マウント機能を利用する

必要なときだけ自動で対象をマウントしてくれるデーモンがあります。
USBメモリやCDのように、使用されるときだけマウントしてくれるautofsという機能です。

/etc/auto.winとか適当なファイルを作成し、次の一行を追加します。

share -fstype=cifs,ro,username=winuser,password=winpassword,uid=1000,gid=100 ://WindowsのIPアドレス/共有

※「://」の前には半角スペースが入ります

冒頭から順に「マウントするディレクトリ」「ファイルシステムタイプとパラメータ」「マウント元」です。
rwは読み書き、roを指定すると読み取り専用です。コマンドでうっかりファイル削除しないために、一応roを指定します。
もちろんusername、passwordにはWindows側のID、uid/gidはLinuxの自分の値を使用します。

次に/etc/auto.masterファイルを編集し、次の一行を追加します。

/mnt/win  /etc/auto.win --timeout 60

意味は「/mnt/winの下にauto.winで指定されたディレクトリ(share)をマウントします」です。
もしWindows共有を別のパスに集めておきたければ、ルートディレクトリに「/windows」を作成して、そこを指定してもいいでしょう。
その場合auto.masterは「/windows  /etc/auto.win --timeput 60」となります。
自分のホームディレクトリ配下にマウントする場合は

/home/user/windows /etc/auto.win --timeput 60

とします。 その際、/home/user/windowsディレクトリを作成しておく必要はありません。

この場合はホームディレクトリの下にwindowsディレクトリが自動作成され、その中にshareディレクトリが作成され、そこに共有フォルダがマウントされます。
仮にすでにwindowsディレクトリとその中身がある場合、windowsディレクトリ配下はautofsによって一時的に上書きされ、見えなくなり、autofsデーモン停止時にディレクトリ構造が復元されます。
※なお$が無視されるため管理共有へはアクセスできません。C$を指定すると「C」と見なされます。

よく間違えがちなのが

auto.win
share -fstype=cifs,ro,username=winuser,password=winpassword,uid=1000,gid=100 ://WindowsのIPアドレス/共有

auto.master
/home/user  /etc/auto.win --timeout 60

という指定です。この場合、ホームフォルダ配下にshareが作成されてマウントされますが、同時に/home/userディレクトリの内容は全て見えなくなり、ただshareディレクトリ一つだけ、という事態になります。
(しかもアクセス時にマウントする、という挙動により、ログイン後しばらくするとデスクトップが停止する、という症状に見舞われます)
この場合のauto.masterの正確な記述は

/home/user/windows  /etc/auto.win --timeout 60

と、userパスの下にさらにディレクトリを指定します。
すると/home/user/windows/shareで共有フォルダへアクセスできます。

timeoutのパラメータは、「60秒アクセスしなかったら自動的にマウントを切断する」という意味です。
ここは必要のない人は削除すればいいでしょう。


次にautofsサービスを起動します。必要なら自動起動も設定します。

>su
#services autofs start
#chkconfig autofs on
#exit
>cd/mnt/share
>ls

と「/mnt/share」にアクセスすれば、そこに自動的にマウントされているのが確認します。
ファイルが書き込めるかも確認しましょう。
つれづれなるままにファイルサーバのブラウジングは出来ませんが、必要なファイルサーバの共有先を全て記述しておけば、ファイル有にストレス無くアクセスできます。

マウントしようとするとエラーが

もしマウントしようとすると

mount error: cifs filesystem not supported by the system
mount error(19): No such device
Refer to the mount,cifs(8) manual page (e.g. man mount.cifs)

というエラーが表示される場合は、イロイロ大人の事情です。
具体的にはシステムのCIFSマウント機能が有効になってません。
どんな時に発生するのでしょうか? よくわかりませんが、環境によって時々発生します。
確認事項としては二つ。

一つはサービスが起動しているかを確認します。
[YaST]-[システム]-[システムサービス(ランレベル)]をクリックします。
一覧からsmbfsが起動しているかを確認します。


もしリストにsmbfsがない、もしくは起動しようとしてもエラーが出力されて起動できない、ということはカーネルでサポートされていない可能性があります。
この状況を打破するには、カーネルソースのインストールとカーネルの再コンパイルが必要です。

「カーネルの設定変更と再構築の手順」を参考にしてください

menuconfigで[File systems]-[Network File Systems]の項目で[CIFS Support]にチェックを入れます。
モジュール<M>か静的<*>かもありますが、とりあえずモジュール<M>をチェックします。
Statisticsは統計値という意味。……要るのだろうか? わからないのでとりあえずチェックしてみます。


再構築の手順を参考に、カーネルコンパイルをします。
再起動後、Windowsの共有がマウントできるようになっています。





prev.gif