sambaによるLinuxとWindowsのファイル共有

LinuxWindowsでは、ファイルシステムNTFSext3)と文字コード(shift-jis、euc-jp、utf-8)が異なります。したがって、両者の間で正常にファイルをコピーするためには、ファイルシステム文字コードを相互に変換する必要があります。このLinuxWindowsファイルシステム文字コードの差異を意識せず、両者でファイルを共有する仕組みを提供するのがsambaと呼ばれるプログラムです。

必要なパッケージのインストール

$ sudo aptitude install samba smbfs

sambaの設定方法

まずは、sambaの設定ファイルを書き換えます。

[/etc/samba/smb.conf]
[global]

## Browsing/Identification ###
   workgroup = Windowsで設定したワークグループ
   server string = %h server on samba %v
   dos charset = cp932
   display charset = utf-8
   unix charset = utf-8
;   wins support = no
;   wins server = w.x.y.z
   dns proxy = no
;   name resolve order = lmhosts host wins bcast

#### Debugging/Accounting ####
   log file = /var/log/samba/log.%m
   max log size = 1000
;   syslog only = no
   syslog = 0
   panic action = /usr/share/samba/panic-action %d

####### Authentication #######
   security = user
   encrypt passwords = true
   passdb backend = tdbsam
   obey pam restrictions = yes
;   guest account = nobody
   invalid users = root
;   unix password sync = no
   passwd program = /usr/bin/passwd %u
   passwd chat = *Enter\snew\sUNIX\spassword:* %n\n *Retype\snew\sUNIX\spassword:* %n\n .
;   pam password change = no

########## Domains ###########
;   domain logons = yes
;   logon path = \\%N\profiles\%U
;   logon path = \\%N\%U\profile
;   logon drive = H:
;   logon home = \\%N\%U
;   logon script = logon.cmd
; add user script = /usr/sbin/adduser --quiet --disabled-password --gecos "" %u

########## Printing ##########
;   load printers = yes
;   printing = bsd
;   printcap name = /etc/printcap
;   printing = cups
;   printcap name = cups
;   printer admin = @ntadmin

######## File sharing ########
;   preserve case = yes
;   short preserve case = yes

############ Misc ############
;   include = /home/samba/etc/smb.conf.%m
   socket options = TCP_NODELAY SO_RCVBUF=8192 SO_SNDBUF=8192
;   message command = /bin/sh -c '/usr/bin/linpopup "%f" "%m" %s; rm %s' &
;   domain master = auto
;   idmap uid = 10000-20000
;   idmap gid = 10000-20000
;   template shell = /bin/bash
;   winbind enum groups = yes
;   winbind enum users = yes

[homes]
   comment = /home/%u
   path = /home/%S
   browseable = no
   writable = yes
   create mask = 0644
   directory mask = 0755

;[netlogon]
;   comment = Network Logon Service
;   path = /home/samba/netlogon
;   guest ok = yes
;   writable = no
;   share modes = no

;[profiles]
;   comment = Users profiles
;   path = /home/samba/profiles
;   guest ok = no
;   browseable = no
;   create mask = 0600
;   directory mask = 0700

[printers]
   comment = All Printers
   browseable = no
   path = /var/spool/samba
   printable = yes
   public = no
   writable = no
   create mode = 0700

[print$]
   comment = Printer Drivers
   path = /var/lib/samba/printers
   browseable = yes
   read only = yes
   guest ok = no
;   write list = root, @ntadmin

;[cdrom]
;   comment = Samba server's CD-ROM
;   writable = no
;   locking = no
;   path = /cdrom
;   public = yes

;   preexec = /bin/mount /cdrom
;   postexec = /bin/umount /cdrom

sambaを利用すると、接続先のファイルシステムを操作できます。しかし、すべてのユーザからのアクセスを許可することはセキュリティ上よろしくないので、事前に登録したユーザのみsambaを利用することができます。samba3.0のユーザ登録にはsmbpasswdとpdbeditというコマンドを利用します。このとき、入力するパスワードは、WindowsからLinuxファイルシステムにアクセスする際、またLinuxからWindowsファイルシステムにアクセスする際に入力する必要があるパスワードです。

$ sudo smbpasswd -a username
$ sudo pdbedit -a -u username

現在登録済みのユーザは以下のコマンドで確認することができます。

$ sudo pdbedit -L

最後にsmbdを起動します。

$ sudo /etc/init.d/samba restart

WindowsからLinuxファイルシステムにアクセスする

事前にsambaを設定しておきます。そして、Windowsのexploreにおけるパスを"\\hostname\username"と直打ちすれば、Linuxの自分のホームディレクトリにアクセスできます。ファイルのコピー、削除、編集も自由自在です。
Windowsのネットワークドライブを利用すれば、一つのドライブとして認識させることもできます。また、smb.confのworkgroupがWindowsで設定してあるWORKGROUPと同一であれば、マイネットワークから同様にアクセスすることができます。

LinuxからWindowsファイルシステムにアクセスする

事前にsambaを設定しておきます。ここでは、Windows(host名はwinhost)のフォルダD:\shareLinux(host名はlinhost)の~/mnt/winhostにマウントしたいと仮定します。
まず、フォルダD:\shareのプロパティの[共有]タブから共有設定を有効にしておきます。そして、Linux側から

$ smbmount //winhost/share ~/mnt/winhost -U username

を実行すれば、~/mnt/winhost以下にD:\shareがマウントされます。アンマウントする場合は、以下の通りです。

$ smbumount ~/mnt/winhost