درسته ما یه دنیای بسیار شگفت انگیز تو لینوکس داریم اما برای خیلی از ماها ممکنه یه دلیل اجباری برای کار کردن با ویندوز باشه. برای مثال شما ممکنه از یک سرور لینوکس برای بکآپگیری فایلهای ویندوز استفاده کنید.
این کار به راحتی با mount یک فولدر به اشتراک گذاشته شده ویندوزی در لینوکس امکان پذیره با اینکار شما به تمام فایلهای به اشتراک گذاشته شده از لینوکس خودتون دسترسی دارید و به راحتی میتونید از تمام دستورات لینوکس برای کار با این فایلها استفاده کنید.
ماونت کردن فایلهای اشتراک گذاشته شده ویندوزی توسط فایل سیستمهای مجازی cifs در کلاینت که در کرنل لینوکس به صورت درونی قرار گرفتهاند انجام میشه
ابزار کمککننده عملیات ماونت فولدرها توسط mount.cifs که بخشی از پکیج سامبا است انجام میشه
در این مثال از اسامی زیر استفاده شده:
- اسم ماشین ویندوزی: winbox
- اسم فولدر به اشتراک گذاشته شده: getme
- نامکاربری: sushi
- پسورد: yummy
هشدارهای دوست داشتنی: بصورت پیشفرض کمککننده ما mount.cifs بدون در نظر گرفتن هرگونه اقدام امنیتی بر روی فولدر به اشتراک گذاری شده تنظیم شده است. (https://bugs.centos.org/view.php?id=4537) اگه شما یه سیستم چندکاربره رو مدیریت میکنید باید تنظیمات dir_mode و file_mode رو برای mount point مورد نظرتون انجام بدید.
پکیجهای مورد نیاز
مطمئن بشید که پکیجهای زیر نصب شده باشند:
[root@host]# yum install samba-client samba-common cifs-utils
هر کدوم از پکیجها ممکنه نیاز به پیشنیازهایی برای خود داشته باشند.
نکته: cifs-utils فقط برای CentOS 6 و بالاتر موجوده
راهحل ساده
یک mount point لوکال بسازید. برای مثال:
[root@host]# mkdir /mnt/win
فایل /etc/fstab رو ویرایش کنید و خطوط زیر رو بهش اضافه کنید:
\\winbox\getme /mnt/win cifs user,uid=500,rw,suid,username=sushi,password=yummy 0 0
فولدر به اشتراکگذاری شده در ویندوز در هر بوت سیستمعامل به طور خودکار در mount point ما ماونت میشه.
اگه میخواین اینکار(ماونت خودکار فولدر ویندوزی در mount point تعریف شده) به صورت خودکار انجام نشه از آپشن noauto استفاده کنید و به طور دستی و با دستور mount /mnt/win اینکار رو انجام بدید. در این مثال کاربر لوکال ما با uid 500 مالک فایلهای ماونتشده هستش. به هر حال استفاده از flag uid به صورت اختیاریه ولی به هر حال برای قابل استفاده بودن فایل در برنامههایی مثل Acrobat فایل باید دارای مجوزهای کافی باشد.
شاید شما مایل باشید از آپشنهای دیگهی cifs هم استفاده کنید برای مثال nocase حساسیت به حروف کوچیک و بزرگ رو برای مسیرهای داده شده از بین میبره. برای اطلاع از آپشنهای بیشتر به man mount.cifs مراجعه کنید
نکته: اگه شما از ورژنهای جدیدتر smbfs رد centos استفاده میکنید باید بدونید که قضیه از centos 5 با cifs جایگزین شده چون smbf دیگه از رده خارج شده
راهحل بهتر
راهحل بالا یک مشکل کوچیک داره اونم اینکه نامکاربری و پسورد شما قابل رویت توسط همه کاربران است. میتونیم این مشکل رو با یک فایل برای اعتبارسنجی حل کنیم. یه مثال برای درک بهتر:
\\winbox\getme /mnt/win cifs user,uid=500,rw,noauto,suid,credentials=/root/secret.txt 0 0
یه مثال دیگه هم میتونه به شکل زیر باشه:
\\jellyfish\DBRefreshLogs\beta2 /media/DBRefreshLogs/beta2 cifs credentials=/root/secret.txt,_netdev,uid=oracle,gid=dba 0 0
همچنین فایل root/secret.txt/ باید مثل فایل زیر باشه:
username=sushi password=yummy
این فایل میتونه تو هر مسیری باشه ولی یادتون باشه رمزنگاری پسورد امکان پذیر نیست. حتماً دقت داشته باشید مجوزهای جوری باشه که هیچ کاربری غیر از شما نتونه این فایل رو read کنه.
نکته: هیچ کاراکتر spaceای در این فایل وجود نداره.
راهحل خیلی بهتر
وقتی قراره عملیات mount از طریق fstab انجام بشه به چون ممکنه فولدرهای به اشتراک گذاری شده در شبکه به هر دلیلی از دسترس خارج بشن (مثلاً ویندوز کرش کنه یا شبکه قطع بشه) ممکنه موقع بوت سیستمعامل با مشکلاتی مواجه بشید (یا حتی در مواقع دیگه) تو این حالت باید به طور دستی نقطه اتصال تعریف شده روunmount کنید و بعد از رفع مشکل شبکه یا ویندوز به طور دستی mount رو انجام بدید.
برای رفع این مشکل از مکانیزم automount استفاده میکنیم که وابسته به پکیج autofs هستش (اگه این پکیج رو نصب ندارید با دستور yum install autofs نصب رو انجام بدید.) مثالی برای انجام صحیح اینکار میزنیم.
اولین قدم ساخت یک نقطه اتصال جدیده:
[root@host]# mkdir /mymount
نکته: این دایرکتوری میتونه هرجایی باشه برای ما فرقی نمیکنه چون میخوایم ازش به عنوان یه نقطه اتصال استفاده کنیم.
به فایل etc/auto.master/ خط زیر رو اضافه کنید:
/mymount /etc/auto.mymount
بعدش فقط کافیه فایل /etc/auto.mymount رو ویرایش کنید و خط زیر رو قرار بدید:
winbox -fstype=cifs,rw,noperm,user=sushi,pass=yummy ://winbox/getme
یا اگه میخواین از فایل اعتبارسنجی استفاده کنید خط زیر رو اضافه کنید:
winbox -fstype=cifs,rw,noperm,credentials=/root/secret.txt ://winbox/getme
نکته جالب: مجوزهای فایل etc/auto.mymount/ به صورتیه که هرکاربری نمیتونه اون رو read کنه پس نیازی به پیکربندی اضافه نیست
یه نکته دیگه: اگه با اسم ماشین نمیتونید به ماشین وصل بشید ولی با آیپی میتونید dnsهاتون رو کنترل کنید یا فایل etc/nsswitch.conf/ رو پیکربندی کنید.
وقتی همه چی آماده بود دستور زیر رو با کاربر روت اجرا کنید:
/sbin/service autofs restart
حالا میتونید به فایلهای به اشتراکگذاری شده دسترسی داشته باشید
ls /mymount/winbox
cd /mymount/winbox
خب الان اتصال و دسترسی به صورت خودکار و پویا انجام میشه و وقتی شبکه یا فولدر در دسترس نباشه (به طور پیشفرض زمان چک کردن ۶۰ ثانیه است) نقطه اتصال به طور خودکار unmount میشه.
نکته: موقعی که automounting فعاله شما ممکنه به خطای mount_cifs.so: cannot open shared object file in /var/log/messages بر بخورید. این خطا بدون ضرره و شما به راحتی میتونید ازش بگذرید.
هنوز یه راهحل خیلی بهتر هستش
حالا اگه نیاز دشتید چندین اشتراکگذاری رو برای یک نام کاربری و پسورد انجام بدید از روش زیر استفاده کنید:
یه نقطه اتصال لوکال بسازید(به انتخاب خودتون):
[root@host]# mkdir /mnt/smb
خط زیر رو به فایل etc/auto.master/ اضافه کنید:
/mnt/smb /etc/auto.smb.top
فایلی در مسیر etc/auto.smb.top/ با محتوای زیر بسازید:
* -fstype=autofs,-Dhost=& file:/etc/auto.smb.sub
فایلی در مسیر /etc/auto.smb.sub با محتوای زیر بسازید: (تنظیمات رو طبق خواسته خودتون ویرایش کنید)
* -fstype=cifs,credentials=/root/secret.txt,uid=500,gid=100 ://${host}/&
مطمئن بشید که مجوزهای لازم برای اتصال وجود داره و بعد سرویس رو ریستارت کنید:
[root@host]# chmod 644 /etc/auto.smb.* [root@host]# /sbin/service autofs restart
حالا به سادگی میتونید به مسیر اشتراکگذاری شده دسترسی داشته باشید:
[user@host]$ cd /mnt/smb/winbox/getme
نکاتی اضافی:
اگه شما میخواین چندین فولدر اشتراکگذاری شده رو با نام کاربری و پسوردهای مختلف به اشتراک بذارید باید از شیوه زیر استفاده کنید:
* -fstype=cifs,credentials=/root/${host}.secret.txt,uid=${UID},gid=${EUID} ://${host}/&
اگه هم خواستید هر کاربر نام کاربری و پسورد خودش رو تو فولدر خودش داشته باشه تا امنیت بیشتری باشه:
* -fstype=cifs,credentials=${HOME}/${host}.secret.txt,uid=${UID},gid=${EUID} ://${host}/&
همچنین برای بهتر کردن امنیت با استفاده از samba-server میتونید از آپشن sec=ntlmv2 استفاده کنید و فایل اعتبارسنجی رو به صورت مخفی نگهدارید:
* -fstype=cifs,sec=ntlmv2,credentials=${HOME}/.${host}.secret.txt,uid=${UID},gid=${EUID} ://${host}/&
صفحه man پکیج mount.cifs رو برای اطلاعات بیشتر راجع به پارامتر sec و باقی پارامتهای cifs ببینید.
نکته: برای کاربران CentOS 5.0 و CentOS 4.5 یک باگی در فایلسیستم cifs در کرنل 2.6.18 وجود داره که به طور پیشفرض CentOS 5.0 (RHEL 5.0) و CentOS 4.5 (RHEL 4.5) اط این کرنل استفاده میکنند. این باگ باعث کرش سیستم در موارد بسیاری میشه. برای دیدن گزارش باگ به لینک http://bugs.centos.org/view.php?id=1776 مراجعه کنید.
نکته۲: این باگ در نسخه CentOS 5.1 (کرنل kernel-2.6.18-53) و 4.6 (کرنل kernel-2.6.9-67) رفع شد.