Linux에서 Azure Files 문제 해결(SMB)
이 문서에서는 Linux 클라이언트와 SMB Azure 파일 공유를 사용할 때 발생할 수 있는 일반적인 문제를 나열합니다. 또한 이러한 문제의 가능한 원인과 해결 방법을 제공합니다.
AzFileDiagnostics를 사용하여 증상 감지를 자동화하고 Linux 클라이언트에 올바른 필수 구성 요소가 있는지 확인할 수 있습니다. 또한 최적의 성능을 얻기 위해 환경을 설정하는 데 도움이 됩니다. 이 정보는 Azure 파일 공유 문제 해결사에서도 찾을 수 있습니다.
Important
이 문서는 SMB 공유에만 적용됩니다. NFS 공유에 대한 자세한 내용은 NFS Azure 파일 공유 문제 해결을 참조하세요.
적용 대상
파일 공유 유형 | SMB | NFS |
---|---|---|
표준 파일 공유(GPv2), LRS/ZRS | ||
표준 파일 공유(GPv2), GRS/GZRS | ||
프리미엄 파일 공유(FileStorage), LRS/ZRS |
파일을 복사할 때 타임스탬프를 분실했습니다.
Linux/Unix 플랫폼에서 cp -p
다른 사용자가 파일 1과 파일 2를 소유하는 경우 명령이 실패합니다.
원인
COPYFILE의 힘 플래그 f
는 Unix에서 실행됩니다 cp -p -f
. 이 명령은 또한 소유하지 않은 파일의 타임 스탬프를 유지하지 않습니다.
해결 방법
스토리지 계정 사용자를 사용하여 파일을 복사합니다.
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>'에 액세스할 수 없음: 입력/출력 오류
명령을 사용하여 ls
Azure 파일 공유의 파일을 나열하려고 하면 파일을 나열할 때 명령이 중단됩니다. 다음과 같은 오류가 표시됩니다.
ls: '<path>'에 액세스할 수 없음: 입력/출력 오류
솔루션
이 문제를 수정하는 다음 버전으로 Linux 커널을 업그레이드합니다.
- 4.4.87+
- 4.9.48+
- 4.12.11+
- 4.13 이상 모든 버전
심볼 링크를 만들 수 없음 - ln: 심볼 링크를 만들 수 없음 ‘t’: 지원되지 않는 작업
원인
기본적으로 SMB를 사용하여 Linux에 Azure 파일 공유를 탑재하면 symlink(심볼 링크)를 지원할 수 없습니다. 다음과 같은 오류가 표시될 수 있습니다.
sudo ln -s linked -n t
ln: failed to create symbolic link 't': Operation not supported
솔루션
Linux SMB 클라이언트는 SMB 2 또는 3 프로토콜을 통한 Windows 스타일의 심볼 링크 생성을 지원하지 않습니다. 현재 Linux 클라이언트는 만들기 및 따르기 작업 모두에 대해 Mishall+French symlinks라는 다른 스타일의 심볼 링크를 지원합니다. 심볼 링크가 필요한 고객은 "mfsymlinks" 탑재 옵션을 사용할 수 있습니다. Mac이 사용하는 형식이기도 하므로 "mfsymlinks"를 사용하는 것이 좋습니다.
symlink를 사용하려면 SMB 탑재 명령 끝에 다음을 추가합니다.
,mfsymlinks
따라서 명령은 다음과 같습니다.
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
wiki에서 제안된 대로 symlink를 만들 수 있습니다.
이름에 공백이 있거나 끝에 점이 있는 폴더 또는 파일에 액세스할 수 없습니다.
Linux에 탑재된 동안 Azure 파일 공유에서 폴더 또는 파일에 액세스할 수 없습니다. du 및 ls 및/또는 타사 애플리케이션과 같은 명령이 공유에 액세스하는 동안 “해당하는 파일이나 디렉터리가 없습니다.”라는 오류와 함께 실패할 수 있지만 Azure Portal을 통해 관련 폴더에 파일을 업로드할 수 있습니다.
원인
폴더 또는 파일은 이름 끝에 있는 문자를 다른 문자로 인코딩하는 시스템에서 업로드되었습니다. Macintosh 컴퓨터에서 업로드된 파일은 0x20(공백) 또는 0X2E(마침표) 대신 “0xF028” 또는 “0xF029” 문자가 있을 수 있습니다.
솔루션
Linux에서 공유를 탑재하는 동안 공유에서 mapchars 옵션을 사용합니다.
다음 대신:
sudo mount -t cifs $smbPath $mntPath -o vers=3.0,username=$storageAccountName,password=$storageAccountKey,serverino
다음 사용:
sudo mount -t cifs $smbPath $mntPath -o vers=3.0,username=$storageAccountName,password=$storageAccountKey,serverino,mapchars
Azure Storage 계정의 실시간 마이그레이션과 관련된 DNS 문제
탑재된 파일 시스템의 파일 I/O에서 "호스트가 다운됨" 또는 "사용 권한 거부됨" 오류를 제공하기 시작합니다. 클라이언트의 Linux dmesg 로그에는 다음과 같은 반복되는 오류가 표시됩니다.
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
또한 이제 서버 FQDN이 현재 연결된 IP 주소와 다른 IP 주소로 확인되는 것을 볼 수 있습니다. 이 문제는 계정 마이그레이션과 같이 서버 IP 주소가 변경될 수 있는 모든 시나리오에서 발생할 수 있습니다. 또 다른 알려진 시나리오는 DNS 매핑이 변경 될 수 있기 때문에 스토리지 계정 장애 조치(failover)입니다.
원인
용량 부하 분산을 위해 스토리지 계정은 한 스토리지 클러스터에서 다른 스토리지 클러스터로 실시간 마이그레이션되는 경우가 있습니다. 계정 마이그레이션은 대상 클러스터를 가리키도록 DNS 매핑을 업데이트하여 원본 클러스터에서 대상 클러스터로 리디렉션되도록 Azure Files 트래픽을 트리거합니다. 이렇게 하면 해당 계정의 원본 클러스터에 대한 모든 트래픽이 차단됩니다. SMB 클라이언트는 DNS 업데이트를 선택하고 추가 트래픽을 대상 클러스터로 리디렉션해야 합니다. 그러나 Linux SMB 커널 클라이언트의 버그로 인해 이 리디렉션은 적용되지 않았습니다. 결과적으로 데이터 트래픽은 마이그레이션 후 이 계정의 서비스를 중단한 원본 클러스터로 계속 이동했습니다.
해결 방법
이 문제는 클라이언트 OS를 다시 부팅하기만 하면 완화될 수 있지만, 계정 마이그레이션 지원을 통해 클라이언트 OS를 Linux 배포판 버전으로 업그레이드하지 않으면 문제가 다시 발생할 수 있습니다.
공유를 분리하고 다시 탑재하면 일시적으로 문제가 해결되는 것처럼 보일 수 있지만 영구 솔루션은 아닙니다. 클라이언트가 서버에 다시 연결하면 문제가 다시 발생할 수 있습니다. 임시 완화는 새 탑재 작업이 SMB 커널 캐시를 우회하고 사용자 공간에서 DNS 주소를 확인하므로 발생합니다. 그러나 커널 DNS 캐시는 네트워크 연결 끊김 복구 중에 사용되므로 문제가 다시 발생할 수 있습니다. 이 동작은 스토리지 계정 마이그레이션 외부에서도 유지됩니다.
이 문제를 더 잘 해결하려면 커널 DNS 확인자 캐시를 지웁다.
다음 명령을 실행하여 커널
dns_resolver
모듈의 상태를 표시합니다.grep '.dns_resolver' /proc/keys
다음 예제와 같은 명령 출력이 표시됩니다.
132b6bbf I------ 1 perm 1f030000 0 0 keyring .dns_resolver: 1
다음 명령을 실행하여 커널 DNS 확인자 캐시의 선택을 취소합니다.
sudo keyctl clear $((16#$(grep '.dns_resolver' /proc/keys | cut -f1 -d\ ) ))
커널
dns_resolver
모듈의 상태를 다시 표시합니다.grep '.dns_resolver' /proc/keys
캐시가 비어 있음을 나타내는 다음 예제와 같은 명령 출력이 표시됩니다.
132b6bbf I------ 1 perm 1f030000 0 0 keyring .dns_resolver: empty
공유를 분리하고 다시 탑재하여 문제를 완화합니다.
참고 항목
일부 이전 Linux 배포판에서는 완화 단계가 작동하지 않을 수 있습니다. 이러한 경우 클라이언트 OS를 다시 부팅하면 문제가 일시적으로 해결됩니다. 영구 수정을 위해 스토리지 계정에 프라이빗 엔드포인트를 추가하고 프라이빗 링크를 사용하여 파일 공유에 연결할 수 있습니다.
솔루션
영구 수정을 위해 계정 마이그레이션 지원을 사용하여 클라이언트 OS를 Linux 배포판 버전으로 업그레이드합니다. Linux SMB 커널 클라이언트에 대한 몇 가지 수정 사항이 기본 Linux 커널에 제출되었습니다. 다음 배포판에는 수정 사항이 있습니다.
- Ubuntu: 20.04, 22.04, 24.04 및 AKS 22.04(수정 사항은 커널 버전 5.15.0-1068에서 롤아웃됨)
- RHEL: 8.6 이상
- SLES: 15SP2, 15SP3, 15SP4 및 15SP5
- Azure Linux: 2.0(수정 사항은 커널 버전 5.15.159.1에서 롤아웃됨) 및 3.0
일부 배포판은 이러한 수정 사항을 백포칭했습니다. 사용 중인 배포판 버전에 다음 수정 사항이 있는지 확인할 수 있습니다.
FIPS를 사용하는 경우 SMB 파일 공유를 탑재할 수 없음
Linux VM에서 FIPS(Federal Information Processing Standard)를 사용하도록 설정하면 SMB 파일 공유를 탑재할 수 없습니다. 클라이언트의 Linux dmesg 로그는 다음과 같은 오류를 표시합니다.
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
Important
FIPS는 미국 정부가 컴퓨터 시스템의 보안 및 무결성을 보장하기 위해 사용하는 일련의 표준입니다. 시스템이 FIPS 모드인 경우 이러한 표준에 설명된 특정 암호화 요구 사항을 준수합니다.
원인
SMB 파일 공유의 클라이언트는 MD5 해시 알고리즘이 필요한 NTLMSSP 인증을 사용합니다. 그러나 FIPS 모드에서는 FIPS 규격이 아니므로 MD5 알고리즘이 제한됩니다. MD5는 128비트 해시 값을 생성하는 널리 사용되는 해시 함수입니다. 그러나 MD5는 암호화 목적으로 안전하지 않은 것으로 간주됩니다.
FIPS 모드가 사용하도록 설정되어 있는지 확인하는 방법
클라이언트에서 FIPS 모드를 사용할 수 있는지 확인하려면 다음 명령을 실행합니다. 값이 1로 설정된 경우 FIPS가 사용하도록 설정됩니다.
sudo cat /proc/sys/crypto/fips_enabled
솔루션
이 문제를 해결하려면 SMB 파일 공유에 Kerberos 인증을 사용하도록 설정합니다. FIPS가 의도치 않게 사용하도록 설정된 경우 option2를 참조하여 사용하지 않도록 설정합니다.
옵션 1: SMB 파일 공유에 Kerberos 인증 사용
FIPS를 사용하는 Linux VM에 SMB 파일 공유를 탑재하려면 Kerberos/Azure AD 인증을 사용합니다. 자세한 내용은 Azure Files에 액세스하는 Linux 클라이언트의 SMB를 통해 Azure Active Directory 인증 사용을 참조하세요.
옵션 2: FIPS를 사용하지 않도록 설정하여 Samba 공유 탑재
sysctl 값을
crypto.fips_enabled
0 in/etc/sysctl.conf
으로 변경합니다.in
GRUB_CMDLINE_LINUX_DEFAULT
/etc/default/grub
파일을 수정하고 매개 변수fips=1
를 제거합니다.다음 명령을 사용하여 grub2 구성 파일을 다시 빌드합니다.
sudo grub2-mkconfig -o /boot/grub2/grub.cfg
다음 명령을 사용하여 initramfs 이미지를 다시 빌드합니다.
sudo dracut -fv
VM을 다시 부팅합니다.
자세한 내용은 Linux 배포자의 다음 문서를 참조하세요.
- RedHat: 커널 중단 CIFS 탑재에서 FIPS 모드를 사용하도록 설정하는 이유
- SUSE: "탑재 오류(2): 이러한 파일 또는 디렉터리가 없음" 오류와 함께 CIFS 탑재가 실패합니다.
도움이 필요하신가요?
도움이 필요한 경우 지원에 문의하여 문제를 신속하게 해결하세요.
참고 항목
- Azure 파일 문제 해결
- Azure Files 성능 문제 해결
- Azure Files 연결 문제 해결(SMB)
- Azure Files 인증 및 권한 부여(SMB) 문제 해결
- Linux에서 일반적인 Azure Files NFS 문제 해결
- Azure 파일 동기화 문제 해결
도움을 요청하십시오.
질문이 있거나 도움이 필요한 경우 지원 요청을 생성하거나Azure 커뮤니티 지원에 문의하세요. Azure 피드백 커뮤니티에 제품 피드백을 제출할 수도 있습니다.