CentOS7とSambaでWindowsからアクセスできるファイルサーバを作ってみましょう

Sambaを使ってWindowsからアクセスできるファイルサーバを作ってみます

USB HDDとか、NASやownCloudを利用すればWindows PCとLinux、Macでデータ共有できますが、USB HDD経由だと接続し直さないとならないですし、NASは安いものもありますが、それでも安くはありません。ownCloudでオンプレミスにサーバを構築することもいいですが、 PCが余っていること、 PCのバックアップデータの置き場所としても利用したいので、Windowsとのデータ共有として歴史の長いSambaを使ってファイルサーバを構築したいと思います。

Sambaとは

Sambaは、Linux上でWindowsのネットワーク機能を実現するソフトウェアです。Sambaを導入することで、WindowsのファイルサーバーとしてWindowsからLinux上のディレクトリにアクセスすることができます。またSambaをLinuxに導入するとWindowsのファイルサーバにLinuxからアクセスすることができるようになります。Sambaを導入するとWindowsファイルサーバとWindowsファイルサーバにアクセスできるクライアント機能を導入することができるということになります。またプリンターサーバ機能や、Windowsドメイン(Active Directory)のサーバーになる機能も持っているということで、Windwosネットワーク上のサーバとしてLinuxを機能させることができるものです。

Windowsネットワークでは、SMB(Server Message Block)と呼ばれるWindowsネットワークの標準ファイル共有プロトコルを使ってネットワークサービスを提供しています。SMBからSambaの名称が来ていると言われています。Windowsには、SMB以外にもCIFSというネットワーク共有プロトコルがありますが、SMBとCIFSの関係は判り難い(私レベルでは)ので、SMB1.0=CIFSという認識に従っています。

少し大雑把に書きますが、Sambaは、Windowsネットワークに関連するプロトコルを実装することで、LinuxをWindowsネットワークに参加させることができるソフトウェアになります。

Sambaをインストール

Samba関連パッケージのインストール状態確認

7をminimalでインストールするとsamba関連のパッケージはインストールされていませんでした。

# yum list installed |grep samba
#

yum searchでsamba関連のパッケージを検索してみます。

# yum repolist
読み込んだプラグイン:fastestmirror
Loading mirror speeds from cached hostfile
 * base: ftp-srv2.kddilabs.jp
 * extras: download.nus.edu.sg
 * updates: download.nus.edu.sg
リポジトリー ID                               リポジトリー名                                   状態
base/7/x86_64                                 CentOS-7 - Base                                  9,911
extras/7/x86_64                               CentOS-7 - Extras                                  314
updates/7/x86_64                              CentOS-7 - Updates                                 946
repolist: 11,171

# yum search samba
読み込んだプラグイン:fastestmirror
Loading mirror speeds from cached hostfile
 * base: ftp-srv2.kddilabs.jp
 * extras: download.nus.edu.sg
 * updates: download.nus.edu.sg
======================================== N/S matched: samba ========================================
kdenetwork-fileshare-samba.x86_64 : Share files via samba
pcp-pmda-samba.x86_64 : Performance Co-Pilot (PCP) metrics for Samba
samba-client.x86_64 : Samba client programs
samba-client-libs.i686 : Samba client libraries
samba-client-libs.x86_64 : Samba client libraries
samba-common.noarch : Files used by both Samba servers and clients
samba-common-libs.x86_64 : Libraries used by both Samba servers and clients
samba-common-tools.x86_64 : Tools for Samba servers and clients
samba-dc.x86_64 : Samba AD Domain Controller
samba-dc-libs.x86_64 : Samba AD Domain Controller Libraries
samba-devel.i686 : Developer tools for Samba libraries
samba-devel.x86_64 : Developer tools for Samba libraries
samba-krb5-printing.x86_64 : Samba CUPS backend for printing with Kerberos
samba-libs.i686 : Samba libraries
samba-libs.x86_64 : Samba libraries
samba-python.x86_64 : Samba Python libraries
samba-python-test.x86_64 : Samba Python libraries
samba-test.x86_64 : Testing tools for Samba servers and clients
samba-test-libs.i686 : Libraries need by the testing tools for Samba servers and clients
samba-test-libs.x86_64 : Libraries need by the testing tools for Samba servers and clients
samba-vfs-glusterfs.x86_64 : Samba VFS module for GlusterFS
samba-winbind.x86_64 : Samba winbind
samba-winbind-clients.x86_64 : Samba winbind clients
samba-winbind-krb5-locator.x86_64 : Samba winbind krb5 locator
samba-winbind-modules.i686 : Samba winbind modules
samba-winbind-modules.x86_64 : Samba winbind modules
ctdb.x86_64 : A Clustered Database based on Samba's Trivial Database (TDB)
python-smbc.x86_64 : Python bindings for libsmbclient API from Samba
samba.x86_64 : Server and Client software to interoperate with Windows machines
samba-pidl.noarch : Perl IDL compiler

Sambaサーバを構築するために必要なパッケージ

  • samba.x86_64 : Server and Client software to interoperate with Windows machines
  • samba-common.noarch : Files used by both Samba servers and clients

Sambaサーバ関連パッケージをyumでインストール

yumコマンドでsamba関連パッケージをインストールします。sambaをインストールすると依存関係のあるsamba-commonもインストールされます。
コマンド例では yum install samba で実行していますので、途中で確認がはいります。不要ならば yum install -y samba のようにコマンドにオプションを付与します。

# yum install samba
読み込んだプラグイン:fastestmirror
Loading mirror speeds from cached hostfile
 * base: ftp-srv2.kddilabs.jp
 * extras: download.nus.edu.sg
 * updates: download.nus.edu.sg
依存性の解決をしています
--> トランザクションの確認を実行しています。
---> パッケージ samba.x86_64 0:4.7.1-6.el7 を インストール

***長いので中略***

インストール:
  samba.x86_64 0:4.7.1-6.el7

依存性関連をインストールしました:
  avahi-libs.x86_64 0:0.6.31-19.el7                 cups-libs.x86_64 1:1.6.3-35.el7
  libaio.x86_64 0:0.3.109-13.el7                    libldb.x86_64 0:1.2.2-1.el7
  libtalloc.x86_64 0:2.1.10-1.el7                   libtdb.x86_64 0:1.3.15-1.el7
  libtevent.x86_64 0:0.9.33-2.el7                   libwbclient.x86_64 0:4.7.1-6.el7
  pytalloc.x86_64 0:2.1.10-1.el7                    samba-client-libs.x86_64 0:4.7.1-6.el7
  samba-common.noarch 0:4.7.1-6.el7                 samba-common-libs.x86_64 0:4.7.1-6.el7
  samba-common-tools.x86_64 0:4.7.1-6.el7           samba-libs.x86_64 0:4.7.1-6.el7

完了しました!

samba関連パッケージのインストール確認

念のため、samba関連パッケージがインストールされたかを確認します。

# yum list installed |grep samba
samba.x86_64                         4.7.1-6.el7                       @base
samba-client-libs.x86_64             4.7.1-6.el7                       @base
samba-common.noarch                  4.7.1-6.el7                       @base
samba-common-libs.x86_64             4.7.1-6.el7                       @base
samba-common-tools.x86_64            4.7.1-6.el7                       @base
samba-libs.x86_64                    4.7.1-6.el7                       @base

Sambaを起動します

Sambaの起動と起動設定を変更します。

# systemctl start smb
# systemctl enable smb
# systemctl status smb
# systemctl start nmb
# systemctl enable nmb
# systemctl status nmb

firewallの設定を変更します

firewallでsambaを通過できるように変更します。

# firewall-cmd --list-all
public (active)
  target: default
  icmp-block-inversion: no
  interfaces: enp0s3
  sources: 
  services: ssh dhcpv6-client
  ports: 
  protocols: 
  masquerade: no
  forward-ports: 
  source-ports: 
  icmp-blocks: 
  rich rules: 
    
# firewall-cmd --add-service=samba --permanent
success
# firewall-cmd --reload
success
# firewall-cmd --list-all
public (active)
  target: default
  icmp-block-inversion: no
  interfaces: enp0s3
  sources: 
  services: ssh dhcpv6-client samba
  ports: 
  protocols: 
  masquerade: no
  forward-ports: 
  source-ports: 
  icmp-blocks: 
  rich rules: 

Sambaの設定します

/etc/samba/smb.confを編集してSambaの設定を行います。

今回の検証ではPrinterは共有しないので、Printer系はコメントアウトしています。

# vi /etc/samba/smb.conf

[global]
        workgroup = SAMBA
        security = user

        passdb backend = tdbsam

        printing = cups
        printcap name = cups
        load printers = yes
        cups options = raw

[homes]
        comment = Home Directories
        valid users = %S, %D%w%S
        browseable = No
        read only = No
        inherit acls = Yes

[printers]
        comment = All Printers
        path = /var/tmp
        printable = Yes
        create mask = 0600
        browseable = No

[print$]
        comment = Printer Drivers
        path = /var/lib/samba/drivers
        write list = @printadmin root
        force group = @printadmin
        create mask = 0664
        directory mask = 0775

変更例

[global]
#       workgroup = SAMBA
        workgroup = WORKGROUP
        security = user

        netbios name = centos7-110

        unix charset = UTF-8
        dos charset = CP932
        wins support = yes

        passdb backend = tdbsam

#       printing = cups
#       printcap name = cups
#       load printers = yes
        load printers = no
        disable spoolss = yes
#       cups options = raw

[homes]
        comment = Home Directories
        valid users = %S, %D%w%S
        browseable = yes
        writable = yes
        read only = no
        inherit acls = Yes

[Share]
        comment = Share Folder for All Users
        path = /home/samba/
        browsable = yes
        writable = yes
        read only = no

#[printers]
#       comment = All Printers
#       path = /var/tmp
#       printable = Yes
#       create mask = 0600
#       browseable = No

#[print$]
#       comment = Printer Drivers
#       path = /var/lib/samba/drivers
#       write list = @printadmin root
#       force group = @printadmin
#       create mask = 0664
#       directory mask = 0775

設定をtestparmコマンドで確認します。

# testparm
Load smb config files from /etc/samba/smb.conf
rlimit_max: increasing rlimit_max (1024) to minimum Windows limit (16384)
Processing section "[homes]"
Processing section "[Share]"
Loaded services file OK.
Server role: ROLE_STANDALONE

Press enter to see a dump of your service definitions

# Global parameters
[global]
    disable spoolss = Yes
    dos charset = CP932
    load printers = No
    security = USER
    wins support = Yes
    idmap config * : backend = tdb

[homes]
    browseable = No
    comment = Home Directories
    inherit acls = Yes
    read only = No
    valid users = %S %D%w%S
    
[Share]
    comment = Share Folder for All Users
    path = /home/samba/
    read only = No

sambaアクセス用のユーザを作成します

Linux上にsambaヘアクセスするユーザを作成します。ユーザ登録後にpdbeditコマンドでsambaアクセスユーザに登録します。例としてcentosというユーザを使用しています。

# useradd centos
# passwd centos
ユーザー centos のパスワードを変更。
新しいパスワード:
新しいパスワードを再入力してください:
passwd: すべての認証トークンが正しく更新できました。

Windowsユーザの属性を追加します。

# pdbedit -a -u centos -f "Windowsユーザ名"
new password:
retype new password:
Unix username:        centos
NT username:          
Account Flags:        [U          ]
User SID:             S-1-5-21-3756317963-3354361630-1529442382-1000
Primary Group SID:    S-1-5-21-3756317963-3354361630-1529442382-513
Full Name:            Windowsユーザ名
Home Directory:       \\centos7-110\centos
HomeDir Drive:        
Logon Script:         
Profile Path:         \\centos7-110\centos\profile
Domain:               CENTOS7-110
Account desc:         
Workstations:         
Munged dial:          
Logon time:           0
Logoff time:          木, 07  2月 2036 00:06:39 JST
Kickoff time:         木, 07  2月 2036 00:06:39 JST
Password last set:    金, 06  7月 2018 17:11:30 JST
Password can change:  金, 06  7月 2018 17:11:30 JST
Password must change: never
Last bad password   : 0
Bad password count  : 0
Logon hours         : FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF

pdeditで作成したユーザの確認をします。

# pdbedit -L -v centos
Unix username:        centos
NT username:
Account Flags:        [U          ]
User SID:             S-1-5-21-472461827-1096656396-3921945026-1000
Primary Group SID:    S-1-5-21-472461827-1096656396-3921945026-513
Full Name:
Home Directory:       \\centos7-110\centos
HomeDir Drive:
Logon Script:
Profile Path:         \\centos7-110\centos\profile
Domain:               CENTOS7-110
Account desc:
Workstations:
Munged dial:
Logon time:           0
Logoff time:          木, 07  2月 2036 00:06:39 JST
Kickoff time:         木, 07  2月 2036 00:06:39 JST
Password last set:    金, 06  7月 2018 17:11:30 JST
Password can change:  金, 06  7月 2018 17:11:30 JST
Password must change: never
Last bad password   : 0
Bad password count  : 0
Logon hours         : FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF

# pdbedit -L -w
centos:1000:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX:7F107204ECE51DD1B95D0E4ED6CF7868:[U          ]:LCT-5B4999A0:

新規ユーザ用のホームディレクトリを作成します

/etc/skel/以下に新規ユーザ用のホームディレクトリを作成します。

# mkdir /etc/skel/samba

既存ユーザ用のホームディレクトリ作成スクリプトを作成します

既存ユーザのために、次のようなスクリプトを作成しておきます。

# vi culuserhomedir.sh

#!/bin/bash

for user in `ls /home`
do
    id $user > /dev/null 2>&1
    [ $? -eq 0 ] && \
    [ ! -d /home/$user/samba ] && \
    mkdir /home/$user/samba && \
    chown $user:$user /home/$user/samba && \
    echo "/home/$user/samba create"
done

既存ユーザ用スクリプトを実行します

# sh culuserhomedir.sh

全てのユーザがアクセスできるディレクトリを作成します

作成したディレクトリは所有者をnobodyに変更します。ディレクトリ名は何でもいいですが、ここでは判り易く/home以下にsambaというディレクトリを作成しています。

# mkdir /home/samba
 chmod -R 0777 /home/samba
# chown nobody:nobody /home/samba
# ls -ld /home/samba
# ls -ld /home/samba
drwxrwxrwx. 2 nobody nobody 6  7月 14 15:36 /home/samba

sambaを再起動します

検証時間が空いてしまったため時間が、ここまでの流れと異なっていますが申し訳ございません。

# systemctl restart smb nmb
# systemctl status smb nmb
● smb.service - Samba SMB Daemon
   Loaded: loaded (/usr/lib/systemd/system/smb.service; enabled; vendor preset: disabled)
   Active: active (running) since 土 2018-07-14 17:16:30 JST; 8s ago
 Main PID: 9745 (smbd)
   Status: "smbd: ready to serve connections..."
   CGroup: /system.slice/smb.service
           ├─9745 /usr/sbin/smbd --foreground --no-process-group
           ├─9750 /usr/sbin/smbd --foreground --no-process-group
           └─9751 /usr/sbin/smbd --foreground --no-process-group

 7月 14 17:16:30 centos7-110 systemd[1]: Starting Samba SMB Daemon...
 7月 14 17:16:30 centos7-110 smbd[9745]: [2018/07/14 17:16:30.687146,  0] ../lib/util/become_...dy)
 7月 14 17:16:30 centos7-110 systemd[1]: Started Samba SMB Daemon.
 7月 14 17:16:30 centos7-110 smbd[9745]:   STATUS=daemon 'smbd' finished starting up and read...ons

● nmb.service - Samba NMB Daemon
   Loaded: loaded (/usr/lib/systemd/system/nmb.service; enabled; vendor preset: disabled)
   Active: active (running) since 土 2018-07-14 17:16:30 JST; 8s ago
 Main PID: 9746 (nmbd)
   Status: "nmbd: ready to serve connections..."
   CGroup: /system.slice/nmb.service
           ├─9746 /usr/sbin/nmbd --foreground --no-process-group
           └─9747 /usr/sbin/nmbd --foreground --no-process-group

 7月 14 17:16:30 centos7-110 systemd[1]: Starting Samba NMB Daemon...
 7月 14 17:16:30 centos7-110 nmbd[9746]: [2018/07/14 17:16:30.665307,  0] ../source3/nmbd/asy...ns)
 7月 14 17:16:30 centos7-110 nmbd[9746]:   started asyncdns process 9747
 7月 14 17:16:30 centos7-110 nmbd[9746]: [2018/07/14 17:16:30.675636,  0] ../lib/util/become_...dy)
 7月 14 17:16:30 centos7-110 systemd[1]: Started Samba NMB Daemon.
 7月 14 17:16:30 centos7-110 nmbd[9746]:   STATUS=daemon 'nmbd' finished starting up and read...ons
Hint: Some lines were ellipsized, use -l to show in full.

Windowsから接続確認します

ここではWindows8.1を使用しています。

  1. コマンドプロンプトを開きます
  2. pingコマンドでsambaサーバとの通信ができることを確認します
    通信ができないようであれば、ネットワークの設定を確認します
  3. [スタートメニュ]→[プログラムとファイル検索]にSambaサーバのサーバ名を入力します>
    名前解決をしています
  4. ユーザ名とパスワードを入力して[OK]をクリックします
  5. Samba接続

  6. エクスプローラが開きます
  7. 共有フォルダとホームフォルダが表示されていればsambaで接続が出来ています

フォルダが表示されない。フォルダを開くことができない。フォルダにファイルを作成できないなどの場合はsmb.confの設定を再確認してみてください。