Aracılığıyla paylaş


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 listelenmektedir. Ayrıca bu sorunların olası nedenlerini ve çözümlerini sağlar.

Belirti algılamayı otomatikleştirmek ve Linux istemcisinin doğru önkoşullara sahip olduğundan emin olmak için AzFileDiagnostics'i 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.

Uygulandığı öğe

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 kopyalandığında zaman damgaları kayboldu

Linux/Unix platformlarında, cp -p dosya 1 ve dosya 2 farklı kullanıcılara aitse 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'a> erişilemiyor: Giriş/çıkış hatası

Komutunu kullanarak ls bir Azure dosya paylaşımındaki dosyaları listelemeye çalıştığınızda, dosyalar listelenirken komut askıda kalıyor. 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

Neden

Varsayılan olarak, SMB kullanarak Linux'ta Azure dosya paylaşımlarının bağlanması sembolik bağlantılar (symlink) için destek sağlamaz. 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ü üzerinde 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. Aynı zamanda Mac'lerin 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 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:

Onun yerine:

sudo mount -t cifs $smbPath $mntPath -o vers=3.0,username=$storageAccountName,password=$storageAccountKey,serverino

Kullanmak:

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 şu anda bağlı olduğundan farklı bir IP adresine çözümlendiğini de göreceksiniz.

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 etmek üzere güncelleştirerek Azure Dosyalar trafiğinin kaynak kümeden hedef kümeye yeniden yönlendirilmesini tetikler. Bu, söz konusu hesaptan kaynak kümeye gelen tüm trafiği engeller. SMB istemcisinin DNS güncelleştirmelerini alması ve trafiği hedef kümeye yeniden yönlendirmesi beklenir. Ancak, Linux SMB çekirdek istemcisindeki bir hata nedeniyle bu yeniden yönlendirme geçerli olmaz. Sonuç olarak, veri trafiği kaynak kümeye gelmeye devam eder ve geçiş sonrasında bu hesabın sunulması durdurulur.

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 Linux dağıtım sürümüne yükseltmezseniz sorunla yeniden karşılaşabilirsiniz.

Paylaşımın çıkarılıp yeniden bağlanması 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 atlayıp 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:

  1. 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
    
  2. 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\ ) ))
    
  3. Ç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 belirten komut çıkışını görmeniz gerekir:

    132b6bbf I------     1 perm 1f030000     0     0 keyring   .dns_resolver: empty
    
  4. 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 düzeltme 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 çeşitli düzeltmeler ana linux çekirdeğine gönderilmiştir. Çekirdek sürüm 5.15+ ve Keyutils-1.6.2+ düzeltmelere sahiptir. Bazı dağıtımlar bu düzeltmeleri geri aktardı ve kullandığınız dağıtım sürümünde aşağıdaki düzeltmelerin mevcut olup olmadığını kontrol edebilirsiniz:

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 etkin olup olmadığını 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'sine bir SMB dosya paylaşımı bağlamak için Kerberos/Azure AD kimlik doğrulamasını kullanın. Daha fazla bilgi için bkz. Azure Dosyalara 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

  1. içindeki sysctl değerini crypto.fips_enabled 0 olarak /etc/sysctl.confdeğiştirin.

  2. dosyasında öğesini GRUB_CMDLINE_LINUX_DEFAULT/etc/default/grub değiştirin ve parametresini fips=1kaldırın.

  3. Grub2 yapılandırma dosyasını aşağıdaki komutla yeniden derleyin:

    sudo grub2-mkconfig -o /boot/grub2/grub.cfg
    
  4. Aşağıdaki komutla initramfs görüntüsünü yeniden oluşturun:

    sudo dracut -fv
    
  5. VM'yi yeniden başlatın.

Daha fazla bilgi için Bkz. Linux dağıtımcılarından gelen aşağıdaki belgeler:

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.

Yardım için bize ulaşın

Sorularınız veya yardıma ihtiyacınız varsa bir destek isteği oluşturun veya Azure topluluk desteği isteyin. Ürün geri bildirimini Azure geri bildirim topluluğuna da gönderebilirsiniz.