Windows+MacファイルサーバをLinuxで構築する。

前提

  • 人数少ない(10名程度)
  • Windows/OS9/OSXが混在
  • みんなが読み書きできる共有がほしい
  • 個人のファイルを保管でき、他の人が消したりできないフォルダがほしい
  • みんなのアカウントはshareグループにする

環境

今回は、CentOS 4.5 Server (x86_64) に導入しました。
RAIDカードのドライバがRHEL4用しかなかったので。

Sambaの導入

yum install samba

netatalkの導入

LinuxサーバをMacOSのファイルサーバとして動作させたいとき、OSSAppleTalkサーバ、netatalkが必要です。
OSXはSambaで対応することになるとおもうので、OS9等を想定しています。

入手

公式で入手できるものは、日本語の扱いが怪しいそうです。
その場合はソースコードにパッチを適用するのですが、今回は適用済みのRPMパッケージを利用します。
Netatalk&Samba RPM配布所から、openslpとnetatalkのSPRMをいただきます。

cd /usr/src/redhat/SRPMS
wget http://ohkawa.biz/Linux/8/SRPMS/openslp-2.0.0-0.1.a3.fc8.src.rpm
wget http://ohkawa.biz/Linux/8/SRPMS/netatalk-2.1.0-0.1.24.dev.fc8.src.rpm
rpm -ihv openslp-2.0.0-0.1.a3.fc8.src.rpm
rpm -ihv netatalk-2.1.0-0.1.24.dev.fc8.src.rpm
RPMのビルド

まずはOpenSLPから。

cd ../SPECS
rpmbuild -bb openslp.spec
(省略)
書き込み中: /usr/src/redhat/RPMS/x86_64/openslp-2.0.0-0.1.a3.x86_64.rpm
書き込み中: /usr/src/redhat/RPMS/x86_64/openslp-devel-2.0.0-0.1.a3.x86_64.rpm

足りないパッケージはyumでインストールできます。
c++コンパイラが必要なので、gcc-c++をいれときましょう。
ビルドが終わったらインストール。

su
rpm -ihv /usr/src/redhat/RPMS/x86_64/openslp*

続いて、netatalkですが、今回使用したSRPMSに含まれていたSPECでは、with-cracklibが有効になっていて、この関係で、cracklib-develパッケージが要求されていました。
CentOS4.5では、このパッケージは入手できなそうだったので、今回はこのオプションは外しておきました。

vi netatalk.spec
# Requiresから「cracklib」を外す
# BuildRequiresから「cracklib-devel」を外す
# %configureから、「--with-cracklib \」を削除

で、ビルド。
足りないパッケージはyumで。

rpmbuild -bb netatalk.spec
(省略)
書き込み中: /usr/src/redhat/RPMS/x86_64/netatalk-2.1.0-0.1.24.dev.x86_64.rpm
書き込み中: /usr/src/redhat/RPMS/x86_64/netatalk-devel-2.1.0-0.1.24.dev.x86_64.rpm

さらに、

su
rpm -ihv /usr/src/redhat/RPMS/x86_64/netatalk*

ディレクトリの構成

/home/share root:root 755
/home/share/public root:share 770
/home/share/username username:share 740

設定

Sambaの設定

/etc/samba/smb.conf

[global]
  unix charset = UTF-8
  display charset = UTF-8
  dos charset = CP932
  workgroup = WORKGROUP
  server string = FileServer
  hosts deny = ALL
  hosts allow = 192.168.1.1/24 127.
; Macがつくるファイルを見えなくする
  veto files = /Temporary Items/Network Trash Folder/TheVolumeSettingsFolder/

; 共用
[share]
  comment = All User shared Directories
  path = /home/share/public
  read only = No
  create mask = 0660
  directory mask = 0770
  force group = share

; 個人用
[たすらむ]
  comment = "たすらむのフォルダ"
  path = /home/share/taslam
  read only = No
  create mask = 0640
  directory mask = 0740
  guest ok = Yes
netatalkの設定

/etc/atalk/afpd.conf

# 以下を追記
- -uamlist uams_clrtxt.so,uams_dhx.so -savepassword -maccodepage MAC_JAPANESE -unixcodepage UTF8

/etc/atalk/netatalk.conf

# AppleTalkDaemonは遅いそうなので使わないことに。
#ATALKD_RUN=yes
ATALKD_RUN=no

#ATALK_MAC_CHARSET='MAC_ROMAN'
#ATALK_UNIX_CHARSET='LOCALE'
ATALK_MAC_CHARSET='MAC_JAPANESE'
ATALK_UNIX_CHARSET='UTF8

/etc/atalk/AppleVolumes.default

# 末尾に追加
# デフォルトのCNID管理方法は脆いので、
# より堅牢なものに変更
cnidscheme:dbd
# 共有用
/home/share/public "share"
# 個人用
/home/share/taslam "taslam"

ユーザ作成

※僕はこのサーバはこれ以上ログイン可能なユーザを作成しないので、/etc/skel内の.bashrc等を全て削除しました。共有フォルダ内にあると混乱のもとになるので。
Linuxユーザ作成

useradd -d /home/share/taslam -s /sbin/nologin -g share taslam
passwd taslam

Sambaユーザ作成

smbpasswd -a taslam

サービス起動

service smb start
service atalk start
chkconfig smb on>CentOS4.5って、微妙に古いバージョンを使うのは何故?
RAIDカードのドライバが、RHEL5版がなかったのでこちらにしました。
>atalkdを動かしていないのにatalkd.confを設定する意味ってあるのかな。
そうですね、修正しました。

chkconfig atalk on

ユーザ作成スクリプト

簡単につくったユーザ作成用スクリプトです。
Linuxユーザ作成及び、設定ファイルの更新、再起動を行ってくれます。
ご自由に。(無保証です)

使いかたは、

./createuser.rb taslam たすらむ
passwd taslam
smbpasswd -a taslam
#!/usr/bin/ruby

# ./createuser.rb username japanesename
# passwd username
# smbpasswd -a username


# /usr/sbin/groupadd -g 10000 share
# でグループを作成しておく。

# 設定
groupname = 'share'
atalk = '/etc/atalk/AppleVolumes.default'
samba = '/etc/samba/smb.conf'

$KCODE = 'u'

username = ARGV.shift
japanesename = ARGV.shift

home_dir = "/home/share/#{username}"

# ホームディレクトリ作成
# mkdir /home/share/username
system("mkdir #{home_dir}")

# ユーザ作成
# /usr/sbin/useradd -d /home/share/username -s /sbin/nologin -g share username
system("/usr/sbin/useradd -d #{home_dir} -s /sbin/nologin -g share #{username}")

# ホームディレクトリのパーミッション設定
# chown username:share /home/share/username
# chmod 750 /home/share/username
system("chown #{username}:share #{home_dir}")
system("chmod 750 #{home_dir}")

# netatalk設定追加
File.open(atalk, 'a') do |f|
  f.write "#{home_dir} \"#{japanesename}\"\n"
end

# samba設定追加
File.open(samba, 'a') do |f|
  f.write <<-EOF
[#{japanesename}]
  comment = "#{japanesename}のフォルダ"
  path = #{home_dir}
  read only = No
  create mask = 0640
  directory mask = 0740
EOF
end

# 再起動
system("/sbin/service atalk restart")
system("/sbin/service smb restart")