Windows+MacファイルサーバをLinuxで構築する。
前提
Sambaの導入
yum install samba
netatalkの導入
LinuxサーバをMacOSのファイルサーバとして動作させたいとき、OSSのAppleTalkサーバ、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")