Linux에 SMB Azure 파일 공유 탑재

주의

이 문서에서는 EOL(수명 종료) 상태에 가까워진 Linux 배포판인 CentOS를 참조하세요. 이에 따라 사용 및 플랜을 고려하세요. 자세한 내용은 CentOS 수명 종료 지침을 참조하세요. Azure Files는 사용하기 쉬운 Microsoft 클라우드 파일 시스템입니다. 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 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

참고 항목

SMB 2.1 지원이 Linux 커널 버전 3.7에 추가되었습니다. Linux 커널 3.7 이후 버전을 사용하는 경우 SMB 2.1을 지원해야 합니다.

적용 대상

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

필수 조건

  • cifs-utils 패키지가 설치되어 있는지 확인합니다. cifs-utils는 원하는 Linux 배포판의 패키지 관리자를 사용하여 설치할 수 있습니다.

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

다음으로 mount 명령을 사용하여 파일 공유를 탑재합니다. 다음 예에서 $SMB_PATH 명령은 스토리지 계정의 파일 엔드포인트에 대한 완전히 정규화된 도메인 이름을 사용하여 채워지고 $STORAGE_ACCOUNT_KEY는 스토리지 계정 키로 채워집니다.

참고 항목

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 username=$STORAGE_ACCOUNT_NAME,password=$STORAGE_ACCOUNT_KEY,serverino,nosharesock,actimeo=30,mfsymlinks

mount 명령의 탑재 옵션에서 uid/gid 또는 dir_modefile_mode를 사용하여 권한을 설정할 수 있습니다. 권한 설정 방법에 대한 자세한 내용은 UNIX 숫자 표기법을 참조하세요.

원하는 경우 동일한 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 숫자 표기법을 참조하세요.

.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" | 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 may 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 구성 파일을 업데이트합니다.

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 :$SMB_PATH" > /etc/auto.fileshares

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

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

sudo systemctl restart autofs

파일 공유 스냅샷 탑재

SMB Azure 파일 공유의 특정 스냅샷 탑재하려면 snapshot 옵션을 mount 명령의 일부로 제공해야 합니다. 여기서 snapshot은 특정 스냅샷이 @GMT-2023.01.05-00.08.20과 같은 형식으로 만들어진 시간입니다. snapshot 옵션은 버전 4.19 이후 Linux 커널에서 지원되었습니다.

파일 공유 스냅샷을 만든 후 다음 지침에 따라 탑재합니다.

  1. Azure Portal에서 스냅샷 탑재하려는 파일 공유가 포함된 스토리지 계정으로 이동합니다.

  2. 데이터 스토리지 > 파일 공유를 선택하고 파일 공유를 선택합니다.

  3. 작업 >스냅샷을 선택하고 탑재하려는 스냅샷 이름을 기록해 둡니다. 스냅샷 이름은 아래 스크린샷에서와 같이 GMT 타임스탬프가 됩니다.

    Azure 포털에서 파일 공유 스냅샷 이름 및 타임스탬프를 찾은 방법을 보여 주는 스크린샷.

  4. 타임스탬프를 mount 명령에 필요한 형식으로 변환합니다. 이 형식은 @GMT-year.month.day-hour.minutes.seconds입니다. 이 예제에서는 2023-01-05T00:08:20.0000000Z@GMT-2023.01.05-00.08.20으로 변환합니다.

  5. GMT 시간으로 snapshot 값을 지정하여 mount 명령을 실행합니다. <storage-account-name>, <file-share-name> 및 GMT 타임스탬프를 해당 값으로 바꿉니다. .cred 파일에는 공유를 탑재하는 데 사용할 자격 증명이 포함되어 있습니다(파일 공유 자동 탑재 참조).

    sudo mount -t cifs //<storage-account-name>.file.core.windows.net/<file-share-name> /media/<file-share-name>/snapshot1 -o credentials=/etc/smbcredentials/snapshottestlinux.cred,snapshot=@GMT-2023.01.05-00.08.20
    
  6. /media/<file-share-name>/snapshot1 경로에서 스냅샷을 찾을 수 있으면 탑재가 성공한 것입니다.

탑재가 실패하면 Azure Files 연결 및 액세스 문제 해결(SMB)을 참조하세요.

다음 단계

Azure Files에 대한 자세한 내용은 다음 링크를 참조하세요.