다음을 통해 공유


Linux 클라이언트에 SMB Azure 파일 공유 탑재

Azure 파일 공유는 SMB 커널 클라이언트를 사용하여 Linux 배포판에 탑재할 수 있습니다.

Linux에서 Azure 파일 공유를 탑재하는 권장 방법은 SMB 3.1.1을 사용하는 것입니다. 기본적으로 Azure Files는 전송 중에 암호화가 필요하며 이는 SMB 3.0 이상에서 지원됩니다. Azure Files는 전송 중에 암호화를 지원하지 않는 SMB 2.1도 지원합니다. 하지만 보안상의 이유로 다른 Azure 지역 또는 온-프레미스에서 SMB 2.1을 사용하여 Azure 파일 공유를 탑재하지 않을 수 있습니다. 애플리케이션에서 SMB 2.1을 특별히 요구하지 않는 한 SMB 3.1.1을 사용합니다. SMB 2.1 지원이 Linux 커널 버전 3.7에 추가되었으므로 3.7 이후 Linux 커널 버전을 사용하는 경우 SMB 2.1이 지원됩니다.

배포 SMB 3.1.1(권장) SMB 3.0
Linux 커널 버전
  • 기본 3.1.1 지원: 4.17
  • 기본 탑재: 5.0
  • AES-128-GCM 암호화: 5.3
  • AES-256-GCM 암호화: 5.10
  • 기본 3.0 지원: 3.12
  • AES-128-CCM 암호화: 4.11
Ubuntu AES-128-GCM 암호화: 18.04.5 LTS 이상 AES-128-CCM 암호화: 16.04.4 LTS 이상
Red Hat Enterprise Linux(RHEL)
  • 기본: 8.0+
  • 기본 탑재: 8.2 이상
  • AES-128-GCM 암호화: 8.2 이상
7.5+
Debian 기본: 10+ AES-128-CCM 암호화: 10 이상
SUSE Linux Enterprise Server AES-128-GCM 암호화: 15 SP2 이상 AES-128-CCM 암호화: 12 SP2 이상

Linux 배포가 위 표에 나열되지 않은 경우 uname 명령을 사용하여 Linux 커널 버전을 확인할 수 있습니다.

uname -r

참고 항목

이 문서의 모든 탑재 스크립트는 기본 0755 Linux 파일 및 폴더 권한을 사용하여 SMB 파일 공유를 탑재합니다. 이는 파일/디렉터리 소유자의 경우 읽기, 쓰기 및 실행 권한을, 소유자 그룹 사용자의 경우 읽기 및 실행 권한을, 기타 사용자의 경우 읽기 및 실행 권한을 의미합니다. 조직의 보안 정책에 따라 탑재 옵션에서 uid/gid 또는 dir_mode 권한과 file_mode 권한을 대체하여 설정할 수 있습니다. 권한 설정 방법에 대한 자세한 내용은 UNIX 숫자 표기법을 참조하세요. 탑재 옵션 목록은 탑재 옵션을 참조하세요.

적용 대상

파일 공유 유형 SMB NFS
표준 파일 공유(GPv2), LRS/ZRS 예 아니요
표준 파일 공유(GPv2), GRS/GZRS 예 아니요
프리미엄 파일 공유(FileStorage), LRS/ZRS 예 아니요

필수 조건

  • cifs-utils 패키지가 설치되어 있는지 확인합니다. 선택한 Linux 배포판에서 패키지 관리자를 사용하여 최신 버전의 cifs-utils 패키지를 설치합니다.

Ubuntu 및 Debian에서는 apt 패키지 관리자를 사용합니다.

sudo apt update
sudo apt install cifs-utils

다른 배포판에서는 적절한 패키지 관리자를 사용하거나 소스에서 컴파일합니다.

  • 최신 버전의 Azure CLI(Azure 명령줄 인터페이스)를 사용해야 합니다. Azure CLI를 설치하는 방법에 대한 자세한 내용은 Azure PowerShell CLI 설치를 참조하고 해당 운영 체제를 선택합니다. PowerShell 6 이상에서 Azure PowerShell 모듈을 사용하려는 경우 사용할 수 있지만, 이 문서의 지침은 Azure CLI에 대한 것입니다.

  • 포트 445가 열려 있는지 확인: SMB는 TCP 포트 445를 통해 통신합니다. 방화벽 또는 ISP가 클라이언트 머신에서 TCP 포트 445를 차단하고 있지 않은지 확인합니다. <your-resource-group><your-storage-account>를 바꾸고 다음 스크립트를 실행합니다.

    RESOURCE_GROUP_NAME="<your-resource-group>"
    STORAGE_ACCOUNT_NAME="<your-storage-account>"
    
    # This command assumes you have logged in with az login
    HTTP_ENDPOINT=$(az storage account show \
        --resource-group $RESOURCE_GROUP_NAME \
        --name $STORAGE_ACCOUNT_NAME \
        --query "primaryEndpoints.file" --output tsv | tr -d '"')
    SMBPATH=$(echo $HTTP_ENDPOINT | cut -c7-${#HTTP_ENDPOINT})
    FILE_HOST=$(echo $SMBPATH | tr -d "/")
    
    nc -zvw3 $FILE_HOST 445
    

    연결되면 다음 출력과 유사한 내용이 표시됩니다.

    Connection to <your-storage-account> 445 port [tcp/microsoft-ds] succeeded!
    

    회사 네트워크에서 포트 445를 열 수 없거나 ISP에 의해 이러한 작업이 차단된 경우 VPN 연결 또는 ExpressRoute를 사용하여 포트 445를 처리할 수 있습니다. 네트워킹에 대한 자세한 내용은 직접 Azure 파일 공유 액세스를 위한 네트워킹 고려 사항을 참조하세요.

요청 시 탑재를 사용하여 Azure 파일 공유 탑재

Linux OS에 파일 공유를 탑재하면 원격 파일 공유가 로컬 파일 시스템의 폴더로 표시됩니다. 파일 공유를 시스템의 어디에나 탑재할 수 있습니다. 다음 예는 /media 경로 아래에 탑재됩니다. $MNT_ROOT 변수를 수정하여 원하는 경로로 변경할 수 있습니다.

<resource-group-name>, <storage-account-name><file-share-name>을 사용자 환경에 적합한 정보로 바꾸어야 합니다.

RESOURCE_GROUP_NAME="<resource-group-name>"
STORAGE_ACCOUNT_NAME="<storage-account-name>"
FILE_SHARE_NAME="<file-share-name>"

MNT_ROOT="/media"
MNT_PATH="$MNT_ROOT/$STORAGE_ACCOUNT_NAME/$FILE_SHARE_NAME"

sudo mkdir -p $MNT_PATH

다음으로, 다음 스크립트를 실행하여 자격 증명 파일을 초기화합니다.

# Create a folder to store the credentials for this storage account and
# any other that you might set up.
CREDENTIAL_ROOT="/etc/smbcredentials"
sudo mkdir -p "/etc/smbcredentials"

# Get the storage account key for the indicated storage account.
# You must be logged in with az login and your user identity must have
# permissions to list the storage account keys for this command to work.
STORAGE_ACCOUNT_KEY=$(az storage account keys list \
    --resource-group $RESOURCE_GROUP_NAME \
    --account-name $STORAGE_ACCOUNT_NAME \
    --query "[0].value" --output tsv | tr -d '"')

# Create the credential file for this individual storage account
SMB_CREDENTIAL_FILE="$CREDENTIAL_ROOT/$STORAGE_ACCOUNT_NAME.cred"
if [ ! -f $SMB_CREDENTIAL_FILE ]; then
    echo "username=$STORAGE_ACCOUNT_NAME" | sudo tee $SMB_CREDENTIAL_FILE > /dev/null
    echo "password=$STORAGE_ACCOUNT_KEY" | sudo tee -a $SMB_CREDENTIAL_FILE > /dev/null
else
    echo "The credential file $SMB_CREDENTIAL_FILE already exists, and was not modified."
fi

# Change permissions on the credential file so only root can read or modify the password file.
sudo chmod 600 $SMB_CREDENTIAL_FILE

이제 자격 증명 파일을 사용하여 명령으로 mount 파일 공유를 탑재할 수 있습니다. 다음 예에서 $SMB_PATH 명령은 스토리지 계정의 파일 엔드포인트에 대한 정규화된 도메인 이름을 사용하여 채워집니다. SMB 탑재 옵션 목록은 탑재 옵션을 참조하세요.

참고 항목

Linux 커널 버전 5.0부터 SMB 3.1.1이 기본 협상 프로토콜입니다. 5.0 이전의 Linux 커널 버전을 사용하는 경우 탑재 옵션 목록에서 vers=3.1.1을 지정합니다.

# This command assumes you have logged in with az login
HTTP_ENDPOINT=$(az storage account show \
    --resource-group $RESOURCE_GROUP_NAME \
    --name $STORAGE_ACCOUNT_NAME \
    --query "primaryEndpoints.file" --output tsv | tr -d '"')
SMB_PATH=$(echo $HTTP_ENDPOINT | cut -c7-${#HTTP_ENDPOINT})$FILE_SHARE_NAME

STORAGE_ACCOUNT_KEY=$(az storage account keys list \
    --resource-group $RESOURCE_GROUP_NAME \
    --account-name $STORAGE_ACCOUNT_NAME \
    --query "[0].value" --output tsv | tr -d '"')

sudo mount -t cifs $SMB_PATH $MNT_PATH -o credentials=$SMB_CREDENTIAL_FILE,serverino,nosharesock,actimeo=30,mfsymlinks

원하는 경우 동일한 Azure 파일 공유를 여러 탑재 지점에 탑재할 수도 있습니다.

Azure 파일 공유 사용을 마치면 sudo umount $mntPath를 사용하여 공유를 분리합니다.

파일 공유 자동 탑재

Linux OS에 파일 공유를 탑재하면 원격 파일 공유가 로컬 파일 시스템의 폴더로 표시됩니다. 파일 공유를 시스템의 어디에나 탑재할 수 있습니다. 다음 예는 /media 경로 아래에 탑재됩니다. $MNT_ROOT 변수를 수정하여 원하는 경로로 변경할 수 있습니다.

MNT_ROOT="/media"
sudo mkdir -p $MNT_ROOT

Linux에서 Azure 파일 공유를 탑재하려면 스토리지 계정 이름을 파일 공유의 사용자 이름으로 사용하고 스토리지 계정 키를 암호로 사용합니다. 스토리지 계정 자격 증명은 시간이 지남에 따라 변경될 수 있기 때문에 탑재 구성과 별도로 스토리지 계정에 대한 자격 증명을 저장해야 합니다.

다음 예에서는 자격 증명을 저장할 파일을 만드는 방법을 보여 줍니다. <resource-group-name><storage-account-name>를 사용자 환경에 대한 적절한 정보로 바꾸어야 합니다.

RESOURCE_GROUP_NAME="<resource-group-name>"
STORAGE_ACCOUNT_NAME="<storage-account-name>"

# Create a folder to store the credentials for this storage account and
# any other that you might set up.
CREDENTIAL_ROOT="/etc/smbcredentials"
sudo mkdir -p "/etc/smbcredentials"

# Get the storage account key for the indicated storage account.
# You must be logged in with az login and your user identity must have
# permissions to list the storage account keys for this command to work.
STORAGE_ACCOUNT_KEY=$(az storage account keys list \
    --resource-group $RESOURCE_GROUP_NAME \
    --account-name $STORAGE_ACCOUNT_NAME \
    --query "[0].value" --output tsv | tr -d '"')

# Create the credential file for this individual storage account
SMB_CREDENTIAL_FILE="$CREDENTIAL_ROOT/$STORAGE_ACCOUNT_NAME.cred"
if [ ! -f $SMB_CREDENTIAL_FILE ]; then
    echo "username=$STORAGE_ACCOUNT_NAME" | sudo tee $SMB_CREDENTIAL_FILE > /dev/null
    echo "password=$STORAGE_ACCOUNT_KEY" | sudo tee -a $SMB_CREDENTIAL_FILE > /dev/null
else
    echo "The credential file $SMB_CREDENTIAL_FILE already exists, and was not modified."
fi

# Change permissions on the credential file so only root can read or modify the password file.
sudo chmod 600 $SMB_CREDENTIAL_FILE

파일 공유를 자동으로 탑재하려면 /etc/fstab 유틸리티를 통한 정적 탑재 사용 또는 autofs 유틸리티를 통한 동적 탑재 사용 중에서 선택할 수 있습니다.

/etc/fstab을 사용하여 정적 탑재

이전 환경을 사용하여 탑재 폴더 아래에 스토리지 계정/파일 공유에 대한 폴더를 만듭니다. <file-share-name>을 Azure 파일 공유의 적절한 이름으로 바꿉니다.

FILE_SHARE_NAME="<file-share-name>"

MNT_PATH="$MNT_ROOT/$STORAGE_ACCOUNT_NAME/$FILE_SHARE_NAME"
sudo mkdir -p $MNT_PATH

마지막으로 Azure 파일 공유에 대한 /etc/fstab 파일에 레코드를 만듭니다. 아래 명령에서 기본 0755 Linux 파일 및 폴더 권한은 소유자에 대한 읽기, 쓰기 및 실행(파일/디렉터리 Linux 소유자 기반), 소유자 그룹의 사용자에 대한 읽기 및 실행, 시스템의 다른 사용자에 대한 읽기 및 실행을 의미합니다. 원하는 대로 탑재에 대한 대체 uidgid 또는 dir_modefile_mode 권한을 설정할 수 있습니다. 권한 설정 방법에 대한 자세한 내용은 UNIX 숫자 표기법을 참조하세요. SMB 탑재 옵션 목록은 탑재 옵션을 참조하세요.

.NET Core 애플리케이션을 실행하는 Docker 컨테이너가 Azure 파일 공유에 쓸 수 있도록 하려면 바이트 범위 잠금 요청을 서버에 보내지 않도록 SMB 탑재 옵션에 nobrl을 포함합니다.

HTTP_ENDPOINT=$(az storage account show \
    --resource-group $RESOURCE_GROUP_NAME \
    --name $STORAGE_ACCOUNT_NAME \
    --query "primaryEndpoints.file" --output tsv | tr -d '"')
SMB_PATH=$(echo $HTTP_ENDPOINT | cut -c7-${#HTTP_ENDPOINT})$FILE_SHARE_NAME

if [ -z "$(grep $SMB_PATH\ $MNT_PATH /etc/fstab)" ]; then
    echo "$SMB_PATH $MNT_PATH cifs _netdev,nofail,credentials=$SMB_CREDENTIAL_FILE,serverino,nosharesock,actimeo=30,mfsymlinks" | sudo tee -a /etc/fstab > /dev/null
else
    echo "/etc/fstab was not modified to avoid conflicting entries as this Azure file share was already present. You might want to double check /etc/fstab to ensure the configuration is as desired."
fi

sudo mount -a

참고 항목

Linux 커널 버전 5.0부터 SMB 3.1.1이 기본 협상 프로토콜입니다. vers 탑재 옵션을 사용하여 대체 프로토콜 버전을 지정할 수 있습니다(프로토콜 버전은 3.1.1, 3.02.1임).

autofs를 사용하여 동적 탑재

autofs 유틸리티를 사용하여 파일 공유를 동적으로 탑재하려면 선택한 Linux 배포에 패키지 관리자를 사용하여 설치합니다.

Ubuntu 및 Debian 배포판에서는 apt 패키지 관리자를 사용합니다.

sudo apt update
sudo apt install autofs

다음으로 autofs 구성 파일을 업데이트합니다. SMB 탑재 옵션 목록은 탑재 옵션을 참조하세요.

FILE_SHARE_NAME="<file-share-name>"

HTTP_ENDPOINT=$(az storage account show \
    --resource-group $RESOURCE_GROUP_NAME \
    --name $STORAGE_ACCOUNT_NAME \
    --query "primaryEndpoints.file" --output tsv | tr -d '"')
SMB_PATH=$(echo $HTTP_ENDPOINT | cut -c7-$(expr length $HTTP_ENDPOINT))$FILE_SHARE_NAME

echo "$FILE_SHARE_NAME -fstype=cifs,credentials=$SMB_CREDENTIAL_FILE,serverino,nosharesock,actimeo=30,mfsymlinks :$SMB_PATH" > /etc/auto.fileshares

echo "/fileshares /etc/auto.fileshares --timeout=60" > /etc/auto.master

마지막 단계는 autofs 서비스를 다시 시작하는 것입니다.

sudo systemctl restart autofs

탑재 옵션

Linux에서 SMB Azure 파일 공유를 탑재할 때 다음 탑재 옵션을 사용할 수 있습니다.

탑재 옵션 권장되는 값 설명
username= 스토리지 계정 이름 NTLMv2 인증에 필수입니다.
password= 스토리지 계정 기본 키 NTLMv2 인증에 필수입니다.
password2= 스토리지 계정 보조 키 가동 중지 시간 없음 키 회전이 바람직한 경우에 권장됩니다.
mfsymlinks 해당 없음 권장. 탑재가 기호 링크를 지원하도록 강제하여 git와 같은 애플리케이션이 symlink로 리포지토리를 복제할 수 있도록 합니다.
actimeo= 30~60 권장. actimeo를 지정하면 acregmin, acregmax, acdirminacdirmax가 모두 동일한 값으로 설정됩니다. 파일 및 디렉터리에 대한 특성 캐시가 너무 빨리 만료되므로 30초 미만의 값을 사용하면 성능이 저하될 수 있습니다. actimeo를 30~60초 사이로 설정하는 것이 좋습니다.
nosharesock 해당 없음 선택 사항. SMB 탑재에 대한 기존 연결이 있더라도 클라이언트가 항상 서버에 새 연결을 설정하도록 합니다. 이렇게 하면 각 탑재 지점이 다른 TCP 소켓을 사용하므로 성능이 향상될 수 있습니다. 경우에 따라 nosharesock 동일한 클라이언트의 두 탑재에서 열 때 동일한 파일을 캐시하지 않아 성능이 저하될 수 있습니다.
max_channels= 4 SMB 다중 채널을 사용할 때 권장합니다. 파일 공유에 대한 최대 채널 수(네트워크 연결)를 지정합니다. SMB 다중 채널을 사용하는 경우 채널 수가 4개를 초과하면 성능이 저하됩니다.
remount 해당 없음 파일 공유를 다시 탑재하고 지정된 경우 탑재 옵션을 변경합니다. 원래 탑재 후 password2 만료된 암호를 수정하기 위해 대체 암호를 지정하려는 경우 이 옵션과 함께 사용합니다.
nobrl 해당 없음 권고 잠금이 필요한 경우 단일 클라이언트 시나리오에서 권장됩니다. Azure Files는 권고 잠금을 지원하지 않으며, 이 설정은 바이트 범위 잠금 요청을 서버로 보내는 것을 방지합니다.
snapshot= 시간 파일 공유의 특정 스냅샷을 탑재합니다. 시간은 요청된 스냅샷을 식별하는 양의 정수여야 합니다(1601년 1월 1일 이후 경과된 100나노초 단위로 또는 GMT 형식으로 지정할 수 있습니다.) @GMT-2024.03.27-20.52.19)
closetimeo= 5 지연된 닫기 시간 제한(캐시 처리)을 초 단위로 구성하거나 0으로 설정하여 사용하지 않도록 설정합니다. 기본값은 5초입니다.
nostrictsync 해당 없음 fsync()에서 플러시하도록 서버에 요청하지 마세요. 일부 서버는 기본적으로 버퍼링되지 않은 쓰기를 수행하며, 이 경우 플러시가 중복됩니다. 이 옵션은 클라이언트가 작은 쓰기 + fsync 조합을 많이 수행하고 네트워크 대기 시간이 서버 대기 시간보다 훨씬 높은 워크로드의 성능을 향상시킬 수 있습니다.
multiuser 해당 없음 서버에 액세스할 때 사용자 액세스를 개별 자격 증명에 매핑합니다. 기본적으로 CIFS 탑재는 공유에 액세스할 때 단일 사용자 자격 증명 집합(탑재 자격 증명)만 사용합니다. 이 옵션을 사용하면 클라이언트는 대신 새 사용자가 탑재에 액세스할 때마다 사용자의 자격 증명을 사용하여 서버와 함께 새 세션을 만듭니다. 해당 사용자의 추가 액세스는 해당 자격 증명도 사용합니다. 커널이 암호를 입력하라는 메시지를 표시할 수 없으므로 다중 사용자 탑재는 암호가 필요하지 않은 옵션을 사용하여 sec= 탑재로 제한됩니다.
cifsacl 해당 없음 이 옵션은 CIFS/NTFS ACL을 Linux 권한 비트에 매핑하고, SID를 UID 및 GID에 매핑하고, 보안 설명자를 가져오고 설정하는 데 사용됩니다. NTLMv2 인증에 대해서만 지원됩니다.
idsfromsid,modefromsid 해당 없음 클라이언트가 클라이언트에서 적용한 권한 부여를 수행해야 하는 경우 권장됩니다. Unix 스타일 권한을 사용하도록 설정합니다. 모든 클라이언트에서 UID/GID가 균일한 경우에만 작동합니다. NTLMv2 인증에 대해서만 지원됩니다.
sec= krb5 Kerberos 인증에 필요합니다. Kerberos 보안 모드를 사용하도록 설정하려면 .sec=krb5 이 옵션을 사용할 때는 사용자 이름 및 암호를 생략해야 합니다. Linux 클라이언트는 도메인에 가입되어 있어야 합니다. Linux 클라이언트에 대한 SMB를 통한 Active Directory 인증 사용을 참조 하세요.
uid= 0 선택 사항. 서버에서 소유권 정보를 제공하지 않는 경우 탑재된 파일 시스템의 모든 파일 또는 디렉터리를 소유할 uid를 설정합니다. 사용자 이름 또는 숫자 uid로 지정할 수 있습니다. 지정하지 않으면 기본값은 0입니다.
gid= 0 선택 사항. 서버가 소유권 정보를 제공하지 않을 때 탑재된 파일 시스템의 모든 파일 또는 디렉터리를 소유할 gid를 설정합니다. 그룹 이름 또는 숫자 gid로 지정할 수 있습니다. 지정하지 않으면 기본값은 0입니다.
file_mode= 해당 없음 선택 사항. 서버가 CIFS Unix 확장을 지원하지 않는 경우 기본 파일 모드를 재정의합니다.
dir_mode= 해당 없음 선택 사항. 서버에서 CIFS Unix 확장을 지원하지 않는 경우 디렉터리의 기본 모드를 재정의합니다.
handletimeout= 해당 없음 선택 사항. 클라이언트가 다시 연결될 때까지 대기하는 장애 조치(failover) 후 서버가 파일 핸들을 예약해야 하는 시간(밀리초)입니다.

다음 단계

Linux에서 SMB Azure 파일 공유를 사용하는 방법에 대한 자세한 내용은 다음을 참조하세요.