Montar o compartilhamento de arquivo do Azure via SMB no Linux

Cuidado

Este artigo faz referência ao CentOS, uma distribuição do Linux que está se aproximando do status de EOL (fim da vida útil). Considere seu uso e planeje adequadamente. Para obter mais informações, veja as Diretrizes sobre fim da vida útil do CentOS. Arquivos do Azure é o sistema de arquivos de nuvem de fácil acesso da Microsoft. Os compartilhamentos de arquivos do Azure podem ser montados em distribuições do Linux usando o cliente de kernel SMB.

A maneira recomendada para montar um compartilhamento de arquivos do Azure no Linux é usando o SMB 3.1.1. Por padrão, os Arquivos do Azure exigem criptografia em trânsito, o que é compatível com o SMB 3.0+. Os Arquivos do Azure também dão suporte ao SMB 2.1, que não dá suporte à criptografia em trânsito, mas você não pode montar compartilhamentos de arquivos do Azure com o SMB 2.1 de outra região ou local do Azure, por questões de segurança. A menos que seu aplicativo exija especificamente o SMB 2.1, use o SMB 3.1.1.

Distribuição SMB 3.1.1 (recomendado) SMB 3.0
Versão do kernel do Linux
  • Suporte básico do 3.1.1: 4.17
  • Montagem padrão: 5.0
  • Criptografia AES-128-GCM: 5.3
  • Criptografia AES-256-GCM: 5.10+
  • Suporte básico do 3.0: 3.12
  • Criptografia AES-128-CCM: 4.11
Ubuntu Criptografia AES-128-GCM: 18.04.5 LTS+ Criptografia AES-128-CCM: 16.04.4 LTS+
Red Hat Enterprise Linux (RHEL)
  • Básico: 8.0+
  • Montagem padrão: 8.2+
  • Criptografia AES-128-GCM: 8.2+
7.5+
Debian Básico: 10+ Criptografia AES-128-CCM: 10+
SUSE Linux Enterprise Server Criptografia AES-128-GCM: 15 SP2+ Criptografia AES-128-CCM: 12 SP2+

Se sua distribuição do Linux não estiver listada na tabela acima, você poderá verificar a versão kernel do Linux com o comando uname:

uname -r

Observação

O suporte ao SMB 2.1 foi adicionado ao kernel do Linux versão 3.7. Se você estiver usando uma versão do kernel do Linux posterior a 3.7, ela deverá dar suporte ao SMB 2.1.

Aplica-se a

Tipo de compartilhamento de arquivos SMB NFS
Compartilhamentos de arquivos padrão (GPv2), LRS/ZRS Sim Não
Compartilhamentos de arquivos padrão (GPv2), GRS/GZRS Sim Não
Compartilhamento de arquivos premium (FileStorage), LRS/ZRS Sim Não

Pré-requisitos

  • Certifique-se de que o pacote cifs-utils esteja instalado. O pacote cifs-utils pode ser instalado usando o gerenciador de pacotes na distribuição do Linux escolhida.

No Ubuntu e noDebian, use o gerenciador de pacotes apt:

sudo apt update
sudo apt install cifs-utils

Em outras distribuições, use o gerenciador de pacotes apropriado ou compile do código-fonte.

  • Use a versão mais recente da CLI (interface de linha de comando) do Azure. Para obter mais informações sobre como instalar a CLI do Azure, confira Instalar a CLI do Azure e selecione seu sistema operacional. Se preferir, você poderá usar o módulo do Azure PowerShell no PowerShell 6+. No entanto, as instruções neste artigo são para a CLI do Azure.

  • Verifique se a porta 445 está aberta: o SMB se comunica pela porta TCP 445, por isso confira se o firewall ou o ISP não está bloqueando as portas TCP 445 do computador cliente. Substitua <your-resource-group> e <your-storage-account>, em seguida, execute o seguinte script:

    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
    

    Se a conexão for bem-sucedida, você verá algo semelhante à seguinte saída:

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

    Se não conseguir abrir a porta 445 em sua rede corporativa ou for impedido de fazer isso por um ISP, você poderá usar uma conexão VPN ou ExpressRoute para resolver o problema da porta 445. Para obter mais informações, confira Considerações sobre rede para acesso direto do compartilhamento de arquivo do Azure.

Montar o compartilhamento de arquivos do Azure sob demanda com montar

Quando você monta um compartilhamento de arquivos em um sistema operacional Linux, o compartilhamento de arquivos remoto é representado como uma pasta em seu sistema de arquivos local. Você pode montar compartilhamentos de arquivos em qualquer lugar do sistema. O exemplo a seguir é montado sob o caminho /media. Você pode alterá-lo para o caminho da sua preferência modificando a variável $MNT_ROOT.

Lembre-se de substituir <resource-group-name>, <storage-account-name> e <file-share-name> pelas informações apropriadas para o seu ambiente:

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

Em seguida, monte o compartilhamento de arquivos usando o comando mount. No exemplo a seguir, o comando $SMB_PATH é preenchido usando o nome de domínio totalmente qualificado para o ponto de extremidade de arquivo da conta de armazenamento e $STORAGE_ACCOUNT_KEY é preenchido com a chave da conta de armazenamento.

Observação

A partir do kernel Linux versão 5.0, o SMB 3.1.1 é o protocolo negociado padrão. Se você estiver usando uma versão kernel do Linux anterior à 5.0, especifique vers=3.1.1 na lista de opções de montagem.

# 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

Você pode usar uid/gid ou dir_mode e file_mode nas opções de montagem do comando mount para definir permissões. Para obter mais informações sobre como definir permissões, consulte Notação numérica UNIX.

Você também pode montar o mesmo compartilhamento de arquivos do Azure em vários pontos de montagem, se desejar. Ao terminar de usar o compartilhamento de arquivo do Azure, use sudo umount $mntPath para desmontar o compartilhamento.

Montar automaticamente compartilhamentos de arquivos

Quando você monta um compartilhamento de arquivos em um sistema operacional Linux, o compartilhamento de arquivos remoto é representado como uma pasta em seu sistema de arquivos local. Você pode montar compartilhamentos de arquivos em qualquer lugar do sistema. O exemplo a seguir é montado sob o caminho /media. Você pode alterá-lo para o caminho da sua preferência modificando a variável $MNT_ROOT.

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

Para montar um compartilhamento de arquivos do Azure no Linux, use o nome da conta de armazenamento como o nome de usuário do compartilhamento de arquivos e a chave da conta de armazenamento como a senha. Como as credenciais da conta de armazenamento podem mudar ao longo do tempo, você deve armazenar essas credenciais separadamente da configuração de montagem.

O exemplo a seguir mostra como criar um arquivo para armazenar as credenciais. Lembre-se de substituir <resource-group-name> e <storage-account-name> pelas informações apropriadas para o seu ambiente.

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

Para montar automaticamente um compartilhamento de arquivos, você tem a opção de usar uma montagem estática por meio do utilitário /etc/fstab ou usando uma montagem dinâmica por meio do utilitário autofs.

Montagem estática com /etc/fstab

Usando o ambiente anterior, crie uma pasta para o compartilhamento de arquivos/conta de armazenamento na pasta de montagem. Substitua <file-share-name> pelo nome apropriado do seu compartilhamento de arquivos do Azure.

FILE_SHARE_NAME="<file-share-name>"

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

Por fim, crie um registro no arquivo /etc/fstab para o compartilhamento de arquivos do Azure. No comando a seguir, as permissões de arquivo e pasta padrão 0755 do Linux são usadas, o que significa leitura, gravação e execução para o proprietário (com base no arquivo/diretório do proprietário do Linux), leitura e execução para usuários no grupo proprietário e leitura e execução para outras pessoas no sistema. Talvez você queira definir permissões alternativas de uid e gid ou dir_mode e file_mode para montar, conforme desejado. Para obter mais informações sobre como definir permissões, consulte Notação numérica UNIX na Wikipédia.

Dica

Caso você deseje que os contêineres do Docker que executam aplicativos .NET Core tenham a capacidade de gravação no compartilhamento de arquivo do Azure, inclua nobrl nas opções de montagem do SMB para evitar o envio de solicitações de bloqueio de intervalo de bytes para o servidor.

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

Observação

A partir do kernel Linux versão 5.0, o SMB 3.1.1 é o protocolo negociado padrão. Você pode especificar versões alternativas de protocolo usando a opção de montagem vers (as versões de protocolo são 3.1.1, 3.0 e 2.1).

Montar dinamicamente com o autofs

Para montar dinamicamente um compartilhamento de arquivos com o utilitário autofs, instale-o usando o gerenciador de pacotes na distribuição do Linux de sua escolha.

Em distribuições Ubuntu e Debian, use o gerenciador de pacotes apt:

sudo apt update
sudo apt install autofs

Em seguida, atualize os arquivos de configuração 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

A etapa final é reiniciar o serviço autofs.

sudo systemctl restart autofs

Montar um instantâneo de compartilhamento de arquivo

Caso deseje montar um instantâneo específico de um compartilhamento de arquivo do Azure SMB, forneça a opção snapshot como parte do comando mount, em snapshot que é a hora em que o instantâneo específico foi criado em um formato como @GMT-2023.01.05-00.08.20. Há suporte para a opção snapshot no kernel do Linux desde a versão 4.19.

Depois de criar o instantâneo de compartilhamento de arquivo, siga estas instruções para montá-lo.

  1. No portal do Azure, navegue até a conta de armazenamento que contém o compartilhamento de arquivo do qual deseja montar um instantâneo.

  2. Selecione Armazenamento de dados e Compartilhamentos de arquivos e selecione o compartilhamento de arquivo.

  3. Selecione Operações e Instantâneos e anote o nome do instantâneo que deseja montar. O nome do instantâneo será um carimbo de data/hora GMT, como na captura de tela abaixo.

    Captura de tela que mostra como localizar um nome de instantâneo de compartilhamento de arquivo e um carimbo de data/hora no portal do Azure.

  4. Converta o carimbo de data/hora no formato esperado pelo comando mount, que é @GMT-year.month.day-hour.minutes.seconds. Neste exemplo, você converterá 2023-01-05T00:08:20.0000000Z em @GMT-2023.01.05-00.08.20.

  5. Execute o comando mount usando a hora GMT para especificar o valor snapshot. Substitua <storage-account-name>, <file-share-name> e o carimbo de data/hora GMT pelos seus valores. O arquivo .cred contém as credenciais a serem usadas para montar o compartilhamento (confira Montar compartilhamentos de arquivos automaticamente).

    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. Se você conseguir navegar pelo instantâneo sob o caminho /media/<file-share-name>/snapshot1, isso indicará que a montagem foi bem-sucedida.

Em caso de falha na montagem, confira Solução de problemas de conectividade e acesso dos Arquivos do Azure (SMB).

Próximas etapas

Veja estes links para obter mais informações sobre o Arquivos do Azure: