Linux'ta (SMB) Azure Dosyalar sorunlarını giderme
Bu makalede, Linux istemcileriyle SMB Azure dosya paylaşımları kullanılırken oluşabilecek yaygın sorunlar listelenir. Ayrıca bu sorunların olası nedenleri ve çözümleri de sağlanır.
Belirti algılamayı otomatikleştirmek ve Linux istemcisinin doğru önkoşullara sahip olduğundan emin olmak için AzFileDiagnostics kullanabilirsiniz. En iyi performansı elde etmek için ortamınızı ayarlamanıza yardımcı olur. Bu bilgileri Azure dosya paylaşımları sorun gidericisinde de bulabilirsiniz.
Önemli
Bu makale yalnızca SMB paylaşımları için geçerlidir. NFS paylaşımlarıyla ilgili ayrıntılar için bkz . NFS Azure dosya paylaşımlarında sorun giderme.
Şunlara uygulanır
Dosya paylaşımı türü | SMB | NFS |
---|---|---|
Standart dosya paylaşımları (GPv2), LRS/ZRS | ||
Standart dosya paylaşımları (GPv2), GRS/GZRS | ||
Premium dosya paylaşımları (filestorage), LRS/ZRS |
Dosyaları kopyalarken zaman damgaları kayboldu
Linux/Unix platformlarında, cp -p
farklı kullanıcıların dosya 1 ve dosya 2'ye sahip olduğu durumlarda komut başarısız olur.
Neden
COPYFILE içindeki zorlama bayrağı f
Unix üzerinde yürütülür cp -p -f
. Bu komut, sahip olmadığınız dosyanın zaman damgasını koruyamaz.
Geçici çözüm
Dosyaları kopyalamak için depolama hesabı kullanıcısını kullanın:
str_acc_name=[storage account name]
sudo useradd $str_acc_name
sudo passwd $str_acc_name
su $str_acc_name
cp -p filename.txt /share
ls: '<path>' erişilemiyor: Giriş/çıkış hatası
Komutunu kullanarak bir Azure dosya paylaşımındaki dosyaları listelemeye ls
çalıştığınızda, dosyalar listelenirken komut yanıt vermemeye başlar. Aşağıdaki hatayı alıyorsunuz:
ls: access'path<>': Giriş/çıkış hatası
Çözüm
Linux çekirdeğini bu soruna yönelik bir düzeltmesi olan aşağıdaki sürümlere yükseltin:
- 4.4.87+
- 4.9.48+
- 4.12.11+
- 4.13'ten büyük veya buna eşit tüm sürümler
Sembolik bağlantılar oluşturulamıyor - ln: 't' sembolik bağlantısı oluşturulamadı: İşlem desteklenmiyor
Neden
Varsayılan olarak, SMB kullanarak Linux'ta Azure dosya paylaşımlarının bağlanması sembolik bağlantılar (ortak bağlantılar) desteğini etkinleştirmez. Aşağıdaki gibi bir hata görebilirsiniz:
sudo ln -s linked -n t
ln: failed to create symbolic link 't': Operation not supported
Çözüm
Linux SMB istemcisi, SMB 2 veya 3 protokolü üzerinden Windows stili sembolik bağlantılar oluşturmayı desteklemez. Linux istemcisi şu anda hem oluşturma hem de takip işlemleri için Minshall+Fransızca simlink olarak adlandırılan sembolik bağlantıların başka bir stilini desteklemektedir . Sembolik bağlantılara ihtiyaç duyan müşteriler "mfsymlinks" bağlama seçeneğini kullanabilir. Mac'lerin de kullandığı biçim olduğundan "mfsymlinks" önerilir.
Symlink'leri kullanmak için SMB bağlama komutunuzun sonuna aşağıdakileri ekleyin:
,mfsymlinks
Bu nedenle komut aşağıdaki gibi görünür:
sudo mount -t cifs //<storage-account-name>.file.core.windows.net/<share-name> <mount-point> -o vers=<smb-version>,username=<storage-account-name>,password=<storage-account-key>,dir_mode=0777,file_mode=0777,serverino,mfsymlinks
Daha sonra wiki'de önerilen şekilde symlink'ler oluşturabilirsiniz.
Adında boşluk veya nokta bulunan klasörlere veya dosyalara erişilemiyor
Linux'a bağlıyken Azure dosya paylaşımından klasörlere veya dosyalara erişemezsiniz. Du ve ls ve/veya üçüncü taraf uygulamalar gibi komutlar paylaşıma erişirken "Böyle bir dosya veya dizin yok" hatasıyla başarısız olabilir; ancak Azure portalı aracılığıyla bu klasörlere dosya yükleyebilirsiniz.
Neden
Klasörler veya dosyalar, adın sonundaki karakterleri farklı bir karaktere kodlayan bir sistemden karşıya yüklendi. Macintosh bilgisayardan karşıya yüklenen dosyaların 0x20 (boşluk) veya 0X2E (nokta) yerine "0xF028" veya "0xF029" karakteri olabilir.
Çözüm
Paylaşımı Linux'a bağlarken paylaşımdaki mapchars seçeneğini kullanın:
Aşağıdaki değer yerine:
sudo mount -t cifs $smbPath $mntPath -o vers=3.0,username=$storageAccountName,password=$storageAccountKey,serverino
Şu değeri kullanın:
sudo mount -t cifs $smbPath $mntPath -o vers=3.0,username=$storageAccountName,password=$storageAccountKey,serverino,mapchars
Azure depolama hesaplarının dinamik geçişiyle ilgili DNS sorunları
Bağlı dosya sistemindeki dosya G/Ç'leri "Ana bilgisayar çalışmıyor" veya "İzin reddedildi" hataları vermeye başlar. İstemcideki Linux dmesg günlükleri aşağıdaki gibi yinelenen hatalar gösterir:
Status code returned 0xc000006d STATUS_LOGON_FAILURE
cifs_setup_session: 2 callbacks suppressed
CIFS VFS: \\contoso.file.core.windows.net Send error in SessSetup = -13
Ayrıca, sunucu FQDN'sinin artık bağlı olduğu ip adresinden farklı bir IP adresine çözümlendiğini göreceksiniz. Bu sorun, hesap geçişi gibi sunucu IP adresinin değişebileceği herhangi bir senaryoda oluşabilir. DNS eşlemesi değişebileceğinden, bilinen bir diğer senaryo da depolama hesabı yük devretmesidir.
Neden
Kapasite yükü dengeleme amacıyla, depolama hesapları bazen bir depolama kümesinden diğerine dinamik olarak geçirilir. Hesap geçişi, DNS eşlemelerini hedef kümeye işaret eden dns eşlemelerini güncelleştirerek trafiğin kaynak kümeden hedef kümeye yönlendirilmesini Azure Dosyalar tetikler. Bu, bu hesaptan kaynak kümeye gelen tüm trafiği engeller. SMB istemcisinin DNS güncelleştirmelerini alması ve trafiği hedef kümeye yönlendirmesi beklenir. Ancak, Linux SMB çekirdek istemcisindeki bir hata nedeniyle bu yeniden yönlendirme geçerli olmaz. Sonuç olarak veri trafiği, geçiş sonrasında bu hesabın sunulmasını durduran kaynak kümeye gidiyor.
Geçici çözüm
İstemci işletim sistemini yeniden başlatarak bu sorunu giderebilirsiniz, ancak istemci işletim sisteminizi hesap geçişi desteğiyle bir Linux dağıtım sürümüne yükseltmezseniz sorunla yeniden karşılaşabilirsiniz.
Paylaşımın çıkarılıp yeniden takılması sorunu geçici olarak çözebilecek gibi görünse de, kalıcı bir çözüm değildir. İstemci sunucuya yeniden bağlandığında, sorun yeniden oluşabilir. Geçici azaltma, yeni bir bağlama eylemi SMB çekirdek önbelleğini atladığı ve kullanıcı alanında DNS adresini çözümlediğinden oluşur. Ancak, çekirdek DNS önbelleği herhangi bir ağ bağlantısı kesilmesi kurtarması sırasında kullanılır ve bu da sorunun yeniden ortaya çıkarmasına neden olabilir. Bu davranış, depolama hesabı geçişleri dışında bile devam eder.
Bu sorunu daha iyi çözmek için çekirdek DNS çözümleyici önbelleğini temizleyin:
Aşağıdaki komutu çalıştırarak çekirdek
dns_resolver
modülünün durumunu görüntüleyin:grep '.dns_resolver' /proc/keys
Aşağıdaki örneğe benzer bir komut çıktısı görmeniz gerekir:
132b6bbf I------ 1 perm 1f030000 0 0 keyring .dns_resolver: 1
Aşağıdaki komutu çalıştırarak çekirdek DNS çözümleyici önbelleğini temizleyin:
sudo keyctl clear $((16#$(grep '.dns_resolver' /proc/keys | cut -f1 -d\ ) ))
Çekirdek
dns_resolver
modülünün durumunu yeniden görüntüleyin:grep '.dns_resolver' /proc/keys
Aşağıdaki örnekte olduğu gibi önbelleğin artık boş olduğunu gösteren komut çıktısını görmeniz gerekir:
132b6bbf I------ 1 perm 1f030000 0 0 keyring .dns_resolver: empty
Sorunu azaltmak için paylaşımı çıkarın ve yeniden çıkarın.
Not
Bazı eski Linux dağıtımlarında, önceki azaltma adımları çalışmayabilir. Bu gibi durumlarda, bilinen tek azaltma istemci işletim sistemini yeniden başlatmaktır.
Çözüm
Kalıcı bir düzeltme için, hesap geçişi desteğiyle istemci işletim sisteminizi Linux dağıtım sürümüne yükseltin. Linux SMB çekirdek istemcisi için ana linux çekirdeğine çeşitli düzeltmeler gönderildi. Aşağıdaki dağıtımlarda düzeltmeler vardır:
- Ubuntu: 20.04, 22.04, 24.04 ve AKS 22.04 (düzeltmeler çekirdek sürüm 5.15.0-1068'de kullanıma sunuldu)
- RHEL: 8.6+
- SLES: 15SP2, 15SP3, 15SP4 ve 15SP5
- Azure Linux: 2.0 (düzeltmeler çekirdek sürüm 5.15.159.1'de kullanıma sunuldu) ve 3.0
Bazı dağıtımlar bu düzeltmeleri geri aktardı. Kullandığınız dağıtım sürümünde aşağıdaki düzeltmelerin mevcut olup olmadığını kontrol edebilirsiniz:
cifs: sonraki çözümlemeyi zamanlamak için dns_query süre sonu çıkışını kullanın
cifs: Dosya sunucularını eşleştirmek için sunucu ana bilgisayar adının eşleştiğinden emin olun
cifs: smb3_fs_context_dup::server_hostname bellek sızıntısını düzeltme
dns: getaddrinfo() kaynağından alınan kayıtlara varsayılan TTL uygulama
anahtarlar: Örnek oluşturmada anahtar süre sonunun üzerine yazılmasını düzeltme
FIPS etkinleştirildiğinde SMB dosya paylaşımı bağlanamıyor
Linux VM'de Federal Bilgi İşleme Standardı (FIPS) etkinleştirildiğinde, SMB dosya paylaşımı bağlanamaz. İstemcideki Linux dmesg günlükleri aşağıdaki gibi hataları görüntüler:
kernel: CIFS: VFS: Could not allocate crypto hmac(md5)
kernel: CIFS: VFS: Error -2 during NTLMSSP authentication
kernel: CIFS: VFS: \\contoso.file.core.windows.net Send error in SessSetup = -2
kernel: CIFS: VFS: cifs_mount failed w/return code = -2
Önemli
FIPS, ABD hükümetinin bilgisayar sistemlerinin güvenliğini ve bütünlüğünü sağlamak için kullandığı bir dizi standarttır. Bir sistem FIPS modundayken, bu standartların ana hatlarıyla belirtilen belirli şifreleme gereksinimlerine uyar.
Neden
SMB dosya paylaşımının istemcisi, MD5 karma algoritması gerektiren NTLMSSP kimlik doğrulamasını kullanır. Ancak FIPS modunda, MD5 algoritması FIPS uyumlu olmadığından kısıtlanır. MD5, 128 bit karma değeri üreten yaygın olarak kullanılan bir karma işlevidir. Ancak MD5, şifreleme amacıyla güvenli değildir.
FIPS modunun etkinleştirilip etkinleştirilmediğini denetleme
İstemcide FIPS modunun etkinleştirilip etkinleştirilmediğini doğrulamak için aşağıdaki komutu çalıştırın. Değer 1 olarak ayarlanırsa FIPS etkinleştirilir.
sudo cat /proc/sys/crypto/fips_enabled
Çözüm
Bu sorunu çözmek için SMB dosya paylaşımı için Kerberos kimlik doğrulamasını etkinleştirin. FIPS istemeden etkinleştirildiyse devre dışı bırakmak için option2'ye bakın.
Seçenek 1: SMB dosya paylaşımı için Kerberos kimlik doğrulamasını etkinleştirme
FIPS'nin etkinleştirildiği Linux VM'de SMB dosya paylaşımını bağlamak için Kerberos/Azure AD kimlik doğrulamasını kullanın. Daha fazla bilgi için bkz. Azure Dosyalar erişen Linux istemcileri için SMB üzerinden Active Directory kimlik doğrulamasını etkinleştirme.
Seçenek 2: Samba paylaşımını bağlamak için FIPS'yi devre dışı bırakma
içindeki sysctl değerini
crypto.fips_enabled
0 olarak/etc/sysctl.conf
değiştirin.dosyasında öğesini
GRUB_CMDLINE_LINUX_DEFAULT
/etc/default/grub
değiştirin ve parametresinifips=1
kaldırın.Grub2 yapılandırma dosyasını aşağıdaki komutla yeniden oluşturun:
sudo grub2-mkconfig -o /boot/grub2/grub.cfg
Aşağıdaki komutla initramfs görüntüsünü yeniden oluşturun:
sudo dracut -fv
VM’yi yeniden başlatın.
Daha fazla bilgi için Bkz. Linux dağıtımcılarının aşağıdaki belgeleri:
- RedHat: Çekirdekte FIPS modunun etkinleştirilmesi CIFS bağlamalarını neden bozar?
- SUSE: CIFS bağlaması "bağlama hatası(2): Böyle bir dosya veya dizin yok" hatasıyla başarısız oluyor
Yardıma mı ihtiyacınız var?
Hala yardıma ihtiyacınız varsa, sorununuzun hızla çözülmesi için desteğe başvurun.
Ayrıca bkz.
- Azure Dosyalarının Sorunlarını Giderme
- Azure Dosyalar performansı sorunlarını giderme
- Azure Dosyalar bağlantı (SMB) sorunlarını giderme
- Azure Dosyalar kimlik doğrulaması ve yetkilendirme (SMB) sorunlarını giderme
- Linux'ta Azure Dosyalar genel NFS sorunlarını giderme
- Azure Dosya Eşitleme sorunlarını giderme
Yardım için bizimle iletişim kurun
Sorularınız varsa veya yardıma ihtiyacınız varsa bir destek isteği oluşturun veya Azure topluluk desteğine sorun. Ürün geri bildirimini Azure geri bildirim topluluğuna da gönderebilirsiniz.