Ubuntu 10.04(lucid)sambaファイルサーバーを実行しています。数千の小さなファイルのコピーを一度に実行しながら、多数のファイルを開くWindows 7クライアントがあります。エラー「開いているファイルが多すぎます」が表示されます。この時点で数秒待ってから、[再試行]をクリックすると、ダウンロードが再開されます。
この問題を解決するためにSambaで使用できるオープンファイルの数を増やすための参考文献をいくつか見つけました。それは素晴らしいアイデアだと思い、必死にそうしようとしています...しかし、私が何をしても、1024を超えるファイルを開くことは拒否され、コピーの問題は解消されません!
これが私が試したものです:
ulimit -n 25000
を設定しました。
/etc/security/limits.confも次のように設定しました:
* soft nofiles 25000
* hard nofiles 65000
root soft nofiles 25000
root hard nofiles 65000
/etc/security/limits.dにこれを上書きするものが何もないことを確認しました。
私はsysctl fs.file-max = 199468であることを確認しました。これは十分すぎるほどです。
Sambaを妨害している可能性のあるapparmorプロファイルを見つけることができません。
/etc/init/smbd.confにlimit nofile 25000 65000
スタンザを追加しました
Smb.confでmax open files = 50000を設定し、それがsambaログファイルを介して有効であることを確認しました。
[2011/10/28 01:30:16, 0] smbd/open.c:151(fd_open)
Too many open files, unable to open more! smbd's max open files = 50000
[2011/10/28 01:30:18, 0] lib/sysquotas.c:426(sys_get_quota)
sys_path_to_bdev() failed for path [.]!
[2011/10/28 01:30:18, 0] lib/sysquotas.c:426(sys_get_quota)
sys_path_to_bdev() failed for path [.]!
[2011/10/28 01:30:18, 0] smbd/open.c:151(fd_open)
Too many open files, unable to open more! smbd's max open files = 50000
[2011/10/28 01:30:19, 0] smbd/open.c:151(fd_open)
Too many open files, unable to open more! smbd's max open files = 50000
[2011/10/28 01:30:20, 0] smbd/open.c:151(fd_open)
Too many open files, unable to open more! smbd's max open files = 50000
ディスク上でlsof | wc -l
を使用しておおよその数を示すことにより、約1000個のファイルが開いているときに問題が発生することを確認しました。何を変更しても、「再試行」ボタンが表示されてコピーが中断されるのは常に1000です。 1000未満に戻ったら、[再試行]をクリックするとコピーが再開されます。
明らかに、これはWindows 7またはSambaのバグです。気にしないでください。問題の修正のみです。私のSambaが多くの方法で要求するように、1000以上のファイルを開かないのはなぜですか?変更する必要がある他の制限はありますか?
編集:symcbeanは良い提案をしました。 /etc/init/smb.confのpre-scriptセクションにulimit -a > /tmp/samba-ulimits
を挿入した結果は次のとおりです
time(seconds) unlimited
file(blocks) unlimited
data(kbytes) unlimited
stack(kbytes) 10240
coredump(blocks) 0
memory(kbytes) unlimited
locked memory(kbytes) 64
process 15969
nofiles 25000
vmemory(kbytes) unlimited
locks unlimited
また、私はバージョン2:3.4.7〜dfsg-1ubuntu3のsambaを実行しています。
OK問題を解決しました。そうすることで、少なくともUbuntuで、ulimitがどのように機能するかをよりよく理解できるようになります。いくつかの問題があり、私はそれらすべてを整理したと思います。
最初の問題、そしてばかげた問題:nofiles
は/etc/security/limits.conf
ではnofile
である必要があります
もう1つの重要な見落とし:pam_limits.soが/etc/pam.d/common-session
に含まれていることを確認しましたが、/etc/pam.d/common-session-noninteractive
も含まれていることに気付きませんでした。後者のファイルは、sambaが使用していたファイルです。
この問題を修正すると、Sambaが修正されたように見え、Sambaは好きなだけファイル記述子を開くことができます。 Windowsのコピーが正常に完了しました。 また注意:Sambaは確かに適切なユーザーのulimitを使用します。smbdプロセスで開始されたulimitや、ルートのulimitは使用しません。 /etc/security/limits.conf
は、これを設定する場所です。pam_limits.soを使用するように/etc/pam.d/common-session-noninteractive
と/etc/pam.d/samba
のどちらかを適切に構成したら、
他の問題については、ユーザーが1024のハード制限と1024のソフト制限で動かなくなっていたため、いくつかの問題が組み合わさっていました。何よりもまず、/etc/pam.d/sshd
を指定しても、/etc/ssh/sshd_config
を「UsePAM yes」に変更しない限り、sshデーモンはPAMを使用しません。デフォルトは "no"であり、PAMを使用しない場合、pam_limits.so(limits.confの適用を担当)は機能しません。
代わりに、非PAMログインのデフォルトのulimitはpid 1(通常は「init」)を継承しているようです。これらのデフォルトのpid 1制限はcat /proc/1/limits
で確認できます。残念ながら、私が知る限り、これらの制限はカーネルのデフォルトとして設定されています。カーネルを再コンパイルしたり、PAM以外のアプリケーションにPAMを使用するように説得したりしない限り、それらを変更する方法はないようです。
また、cat /proc/<anypid>/limits
は、問題が発生している可能性がある特定のプロセスの制限をデバッグするための優れた方法であるというアドバイスも提供したいと思います。もっと早く発見できたらよかったのに。
私はubuntu 14.04 ltsで作業しており、次のことを実現するために数時間を要しました:
次のコードを挿入した行が必要でした。
制限なしファイル16384 16384
再起動がすべて正常に機能した後、ps axはsambaのプロセスIDを通知し、cat/proc/799/limitsはプロセス799の正しい最大オープンファイル制限を示します(プロセスIDと799を交換します)。
おそらくSambaの初期化スクリプトにはulimit -SHn 1024
初期化?見る /etc/init.d/smb
またはあなたの初期化スクリプトが何であれ。