Linux: CIFS / Samba mount hang selama beberapa menit

26

Saya memiliki jaringan lokal kecil yang memiliki kotak Gentoo dan kotak Windows. Saya memasang share yang berasal dari kotak Windows ke kotak Gentoo dengan perintah seperti:

mount -t cifs -o username=WindowsUsername,password=thepassword,uid=pistos //192.168.0.103/Users /mnt/windowsbox

Sebagian besar waktu, semuanya Hanya Bekerja, dan saya dapat membaca dan menulis tanpa masalah. Namun, setiap beberapa minggu sekali, koneksi atau titik pemasangan tampaknya mati atau hang, sehingga setiap proses yang mencoba mengakses titik pemasangan macet dalam keadaan D (disk, atau I / O tunggu). Proses-proses ini menjadi tahan terhadap sinyal TERM dan KILL. Memutuskan hubungan dan menghubungkan kembali kotak Windows dari jaringan tidak membantu. Keadaan beku berlangsung selama 5+ menit. Ini benar-benar membuat frustasi dan menghalangi pekerjaan normal, karena itu membekukan dialog Save As, lsperintah, dll. Jika saya mengeluarkan a umountpada titik mount, itu juga hang, atau melaporkan bahwa titik mount sedang digunakan. Akhirnya, kondisi mati teratasi dengan sendirinya, dan titik pemasangan dilepas, atau menjadi mungkin umounttanpa penundaan.

Dugaan saya adalah ini terjadi ketika koneksi / mount idle, atau ketika mesin Windows idle. Saya tidak begitu yakin.

Mengapa ini terjadi, dan apa yang bisa saya lakukan untuk mencegahnya? Atau bagaimana saya bisa berhasil membunuh proses D-state ini sesuka hati?

Mungkin terkait: Gunung CIFS menunggu dibaca

Pistos
sumber
1
Apakah ada jenis firewall yang digunakan di antara kedua mesin?
Schrute
@Schrute: Saya menganggap default apa pun yang ada di Linux (iptables?), Dan Windows sedang berjalan. Anda pikir firewall memutuskan koneksi? Saya belum pernah mendengar hal seperti itu.
Pistos
Saya pikir ini mungkin masalah pada kotak linux. Saya melihat masalah serupa - tidak dengan cifs dan Windows - tetapi dengan nfs yang dipasang. Menyimpan tidak mungkin - saya kira karena beberapa proses menggantung ketika mengakses server nfs yang tidak ada. Ini biasanya terjadi ketika server mogok.
cornelinux
1
Saran saya adalah mengatur tangkapan jaringan buffer cincin pada mesin linux (yaitu tcpdump -i eth0 -C 5 -W 10 -s 0 -v -w /tmp/cifs.pcap host 192.168.0.103 - Saya juga menjalankan di bawah layar untuk mencegah proses berhenti saat Anda memutuskan sambungan). Ketika masalah terjadi, hentikan jejak setelah beberapa detik dan Anda setidaknya harus dapat menentukan pihak mana yang menyebabkan masalah ketika meninjau paket jejak (yaitu server berhenti merespons, sesi terputus, dll).
GeekyDeaks
1
@Pistos - Wireshark adalah teman Anda! Jejaknya terlihat membingungkan, tetapi wireshark akan memecahkan kode frame untuk membantu. Anda ingin terlebih dahulu menghilangkan dasar-dasar, seperti server atau klien menjatuhkan sesi (paket FIN), kemudian maju ke yang lain seperti server berhenti merespons dll. Jika Anda punya waktu ada video sharkfest di CIFS pada 2013 ( youtube.com/watch ? v = XbvFXSPig-w ) tapi agak panjang :)
GeekyDeaks

Jawaban:

11

Tidak yakin mengapa masalah terjadi, tetapi sebagai solusinya, sudahkah Anda mencoba meletakkan sesuatu seperti touch /mnt/windowsbox/keepalive.txtatau echo "I am still alive." >/mnt/windowsbox/keepalive.txtdijalankan melalui cron setiap menit? Dengan begitu koneksi harus tetap aktif.

Janne Pikkarainen
sumber
Ide bagus. Saya sudah menempatkan ini pada tempatnya, dan akan melihat apa yang terjadi.
Pistos
2
Ini tampaknya telah menyelesaikan masalah, saya harus menyebutkan.
Pistos
Senang mendengarnya!
Janne Pikkarainen
1
sesuai jawaban @ Pat, orang dapat memangkas ini dari detak jantung setiap menit menjadi detak jantung setiap 5 menit (300 detik), yang akan ada */5 * * * *dalam jadwal crontab
woodvi
Saya menggunakan ini untuk saat ini. Dalam 3 hari, saya memiliki tiga mesin Ubuntu Server 16 LTS yang terpisah (dua fisik, satu VM) menjatuhkan koneksi SMB mereka setelah beberapa jam di-reboot. Saat startup, koneksi SMB dipasang tanpa masalah, tetapi pada akhirnya menjadi tidak responsif.
user38537
5

Saya juga mengalami ini setiap beberapa bulan. sudo umount -ladalah solusi saya. /programming//a/96288/2097284

Camille Goudeseune
sumber
0

Jawaban potensial lainnya menyarankan menulis ke file di mount secara berkala melalui cron. Saya akan menyarankan sebaliknya menggunakan program smbclient untuk terhubung ke share dan putuskan.

Saya menulis skrip bash seperti ini untuk mencapai itu:

#!/bin/bash

su usernamehere -c "smbclient \\\\\\\\\\\\\\\\servernamehere\\\\\\\\sharenamehere passwordhere -c exit" >/dev/null 2>&1

Perintah ini membuat koneksi baru ke share dan kemudian menjalankan perintah keluar, segera mematikan koneksi yang baru saja dibuat pada baris perintah. Seharusnya ada 8 garis miring sebelum nama server dan 4 sebelum nama berbagi, karena garis miring terbalik harus diloloskan, dan lolos harus diloloskan ketika berada di dalam string yang dikutip ganda. Mungkin ada cara yang lebih cerdas untuk melakukan ini, tetapi ini tampaknya berhasil.

Mungkin ada cara untuk membuat ini lebih dapat diandalkan dengan membuatnya membuat koneksi terbuka selama beberapa menit pada suatu waktu, tetapi itu sedikit keluar dari liga saya.

RedScourge
sumber
Usulan yang menarik. Saya akan mencobanya jika saya belum sukses dengan solusi yang lain.
Pistos
Saya tidak melihat bagaimana ini akan membantu? Solusi Janne adalah menjaga koneksi yang dibuat oleh klien cif tetap hidup, sedangkan ini akan menciptakan koneksi baru yang tidak terkait dengan smbclient - jadi bagaimana itu membantu?
flungo
1
FYI, smbclient mendukung garis miring jika Anda ingin menggunakannya daripada garis miring terbalik, jadi //servername/sharnamecara ini lebih mudah di tempat-tempat di mana Anda perlu banyak melarikan diri.
Steve Friedl