الخادم: RHEL 5.9 / smbd 3.0.33 - العملاء: متنوعون ، على الرغم من أنهم جميعًا كانوا يستخدمون mount.cifs الحالي (5.2)

لقد قمت بالفعل بحل هذه المشكلة ، لكن كان الأمر بمثابة كابوس للبحث عن رموز الخطأ هذه ، شعرت أنها بحاجة إلى توثيق عالمي.

الأعراض : فشل تحميل متقطع لا يمكن التنبؤ به من عميل cifs محدد إلى خادم linux samba. كل ما عندي من عملاء لينكس pam_mount منازل المستخدم عند تسجيل الدخول. بشكل عشوائي ، وبشكل متقطع ، بدأت حوامل دير المنزل بالفشل على جهاز واحد . استمرت عمليات تسجيل الدخول والتركيبات في العمل بشكل لا تشوبه شائبة على جميع العملاء الآخرين. في البداية اعتقدت أن قدرًا غير معتاد من النشاط على العميل المعطل كان يتسبب في نزوة smbd ، لكن الإخفاقات المتقطعة استمرت حتى بعد توقف الاستخدام.

محاولة التثبيت باليد وإخفاق التقارير:

Errors from underlying mount program
mount error(12): Cannot allocate memory
Refer to the mount.cifs(8) manual page (e.g. man mount.cifs)

اضبط <debug enable="1"/>/etc/security/pam_mount.conf.xml للحصول على مزيد من المعلومات من pam_mount:

command: 'mount' '-t' 'cifs' '//my_server/watdo' '/home/watdo' '-o' 'user=watdo,uid=666,gid=666'
pam_mount(misc.c:38): set_myuid<pre>: (ruid/rgid=0/0, e=0/0)
pam_mount(misc.c:38): set_myuid<post>: (ruid/rgid=0/0, e=0/0)
pam_mount(mount.c:64): Errors from underlying mount program:
pam_mount(mount.c:68): mount error(12): Cannot allocate memory
pam_mount(mount.c:68): Refer to the mount.cifs(8) manual page (e.g. man mount.cifs)`

/var/log/kern.log أبلغ أيضًا عن هذا الحدث:

kernel: [4316790.256149] CIFS VFS: cifs_mount failed w/return code = -12

"صدى 1> / إجراءات / خ م / CIFS / cifsFYI" السواعد يصل mount.cifs التصحيح (الكتابة إلى / فار / سجل / التصحيح). إليك الجزء الجيد (تبدو مألوفًا؟):

CIFS Session Established successfully
For smb_command 117
Sending smb:  total_len 88
cifs_sync_mid_result: cmd=117 mid=54307 state=4
Mapping smb error code 0xc0000205 to POSIX err -12

في هذه المرحلة ، لا توجد معلومات أخرى متاحة من جانب العميل. يخرج طلب cifs mount ويموت العميل على الفور تقريبًا. خطأ mount.cifs (12) غير مفيد إلى حد ما (صفحة الدليل لا تساعد ، شكرًا يا رفاق). يكشف البحث المكثف على الإنترنت أن هذا رمز خطأ شائع ، ويؤكد أيضًا أنه غير مفيد.

حان الوقت للتحقق من الخادم! تعيين log level = 3لـ smbd في /etc/samba/smb.conf (من كتاب استخدام Samba: "المستويات فوق 3 للاستخدام من قبل المطورين وتفريغ كميات هائلة من المعلومات المشفرة." لول!). هذا هو السطر المناسب:

[2013/02/08 10:18:03, 3] smbd/error.c:error_packet_set(106) error packet at smbd/reply.c(514) cmd=117 (SMBtconX) NT_STATUS_INSUFF_SERVER_RESOURCES

لقد انتهيت تقريبًا ... من أرشيف القائمة البريدية للشركات الصغيرة والمتوسطة ، وجدت شخصًا يبلغ عن مشكلة مماثلة ، تم تحديدها على أنها حد مشاركة مرتبط على اتصال فردي بشركة صغيرة. سرد المشاركات المفتوحة على الخادم:

smbstatus -S | grep <serverIP> | wc -lعاد 2048 . واضح جدا.

smbstatus -Sكشف فحص المخرجات بالفعل عن آلاف الإدخالات لـ "IPC $". تكشف مستندات Samba على IPC $ أنها متورطة في تصفح مشاركة مجهول والوصول إلى "بعض الموارد الأخرى". قمت بتعيين رفض المضيف على الخادم في /etc/samba/smb.conf:

[IPC$]
hosts deny = 0.0.0.0/0

يعمل بشكل رائع الآن. حسنًا ، آمل أن يساعد شيء ما هنا بعض الروح الفقيرة في وقت ما في المستقبل.

أعتقد بروح الموقع سوف أطرح سؤالاً: لماذا لا يقوم smbd بتنظيف أسهم IPC $؟ لماذا إنشاء IPC دولار واحد لكل مستخدم اتصال إلى مشاركة بدلاً من واحد لكل اتصال عميل؟ هل يمكنك تعطيل إنشاء سهم IPC $ من جانب العميل؟ هل هناك طريقة لزيادة الحد الأقصى لعدد الاتصالات لكل مشاركة (وليس هذا من شأنه أن يساعد في هذه الحالة)؟ لم أره في المستندات.

answer

هذا قديم ، ولكن بالنظر إلى أنه لم يتم الرد عليه وكنت أبحث في IPC $ و Samba ، سأجربه من أجل التوثيق.

Why would smbd not clean up IPC$ shares?

كما هو مذكور أعلاه في التعليقات على سؤالك ، يتم استخدام الخدمة للإدارة عن بعد والاتصال بين الخوادم ، وخاصة في Samba ، حيث يتم استخدامها لبعض أغراض التصفح و tcp / ip. ما لم تكن بحاجة إليه لسبب ما أو لسبب ما لا يعمل ، فمن الآمن تعطيله. [1]

Why establish one IPC$ per user connection to a share rather than one per client connection?

لأن المستخدم يمكن أن يكون لديه اتصالات متعددة بالعميل.

Can you disable IPC$ share creation from the client side?

نعم و لا. إنه لا يعطل حقًا إنشاء مشاركة IPC $ ، ولكن يمكنك تعطيل الوصول إليها من عميل windows. [2]

بالنسبة لنظام التشغيل windows Vista و Windows 7 و Windows 8 و Windows 10 ، يمكنك إجراء تحرير السجل التالي:

  1. انقر فوق ابدأ ، واكتب "regedit" في مربع البحث ، ثم انقر فوق regedit.exe في نتائج البحث. يظهر مربع الحوار "التحكم في حساب المستخدم".
  2. قل "نعم" لموجه UAC ويجب فتح محرر التسجيل.
  3. افتح فرع HKEY_LOCAL_MACHINE.
  4. افتح فرع النظام.
  5. افتح فرع CurrentControlSet.
  6. افتح فرع الخدمات.
  7. افتح فرع LanmanServer.
  8. حدد فرع المعلمات.
  9. حدد تحرير ، جديد ، "قيمة DWORD (32 بت)"
  10. اكتب "AutoShareWks" واضغط على Enter. (اترك القيمة الافتراضية 0.)
  11. أعد تشغيل أو أعد تشغيل الخدمة باستخدام موجه الأوامر (DOS أو Terminal): "net stop server" ثم "net start server".

Is there a way to increase the max # connections per share (not that this would have helped in this case)? I didn't see it in the docs.

نعم: 3]. أسفل المشاركة أدخل فقط:

[share]
   max connections = ##

حيث XX هو عدد الاتصالات.

مصادر: