Поделиться через


Подключение общих папок Azure SMB на клиентах Linux

Внимание

Эта статья ссылается на CentOS, дистрибутив Linux, который является состоянием "Конец жизни" (EOL). Обратите внимание на использование и план соответствующим образом. Дополнительные сведения см. в руководстве centOS End Of Life.

Файловые ресурсы Azure можно подключить в дистрибутивах Linux с помощью SMB-клиента в ядре.

Рекомендуемый способ подключения общей папки Azure в Linux состоит в использовании SMB 3.1.1. По умолчанию для Файлов Azure требуется шифрование при передаче, поддерживаемое SMB 3.0+. Файлы Azure также поддерживает SMB 2.1, который не поддерживает шифрование при передаче, но вы не можете подключить общие папки Azure с SMB 2.1 из другого региона Azure или локальной среды по соображениям безопасности. Если приложению специально не требуется SMB 2.1, используйте SMB 3.1.1.

Distribution 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 GCM: 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 отсутствует в таблицы выше, можно проверить версию ядра Linux с помощью команды uname:

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

В других дистрибутивах используйте соответствующий диспетчер пакетов или выполните компиляцию из источника.

  • Самая последняя версия интерфейса командной строки (CLI) Azure. Дополнительные сведения об установке Azure CLI см. в статье Установка Azure CLI и выберите операционную систему. Если вы предпочитаете использовать модуль Azure PowerShell в PowerShell 6+, вы можете использовать его. Однако инструкции, описанные в этой статье, предназначены для 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 в корпоративной сети или заблокировать это поставщиком услуг интернета вещей, вы можете использовать VPN-подключение или ExpressRoute для работы с портом 445. Дополнительные сведения см. в разделе Рекомендации по работе с сетями для прямого доступа к общей папке Azure.

Подключение файлового ресурса Azure по запросу с помощью

При подключении общей папки в ОС Linux удаленный файловый ресурс будет представлен в виде папки в локальной файловой системе. Общие файловые ресурсы можно подключить в любом месте системы. В следующем примере показано подключение по пути /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 является согласованным протоколом по умолчанию. Если вы используете версию ядра Linux старше 5.0, укажите 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

Можно использовать uid/gid или dir_mode и file_mode в параметрах подключения для команды mount, чтобы задать разрешения. Дополнительные сведения о настройке разрешений см . в числовых нотациях UNIX.

При необходимости можно подключить одну и ту же общую папку Azure к нескольким точкам подключения. Когда вы закончите использовать общую папку Azure, используйте sudo umount $mntPath для отключения общей папки.

Автоматически подключать общие папки

При подключении общей папки в ОС Linux удаленный файловый ресурс будет представлен в виде папки в локальной файловой системе. Общие файловые ресурсы можно подключить в любом месте системы. В следующем примере показано подключение по пути /media. Вы можете изменить его на нужный путь, поменяв переменную $MNT_ROOT.

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

Чтобы подключить общую папку Azure в Linux, используйте имя учетной записи хранения в качестве имени пользователя общей папки и ключ учетной записи хранения в качестве пароля. Так как учетные данные учетной записи хранения могут меняться со временем, следует хранить учетные данные для учетной записи хранения отдельно от конфигурации подключения.

В следующем примере показано, как создать файл для хранения учетных данных. Не забудьте заменить <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

Наконец, создайте запись в файле /etc/fstab для общей папки Azure. В приведенной ниже команде по умолчанию использованы разрешения для файлов и папок Linux 0755, что означает права на чтение, запись и выполнение для владельца (имеется в виду владелец файла/каталога Linux), права на чтение и выполнение для пользователей в группе владельца, а также права на чтение и выполнение для прочих пользователей системы. Возможно, вы хотите задать альтернативные uid и gid разрешения file_modedir_mode на подключение по мере необходимости. Дополнительные сведения о настройке разрешений см . в числовых нотациях UNIX.

Совет

Если вы хотите, чтобы контейнеры Docker под управлением приложений .NET Core могли записывать данные в общую папку Azure, включите nobrl в параметры подключения SMB, чтобы избежать отправки запросов на блокировку диапазона байтов на сервер.

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.0 и 2.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 параметр поддерживается в ядре Linux с версии 4.19.

После создания моментального снимка общей папки следуйте этим инструкциям, чтобы подключить его.

  1. В портал Azure перейдите к учетной записи хранения, содержащей общую папку, для которой требуется подключить моментальный снимок.

  2. Выберите общие папки хранилища > данных и выберите общую папку.

  3. Выберите моментальные снимки операций > и запишите имя моментального снимка , который требуется подключить. Имя моментального снимка будет меткой времени GMT, например на снимке экрана ниже.

    Снимок экрана: поиск имени моментального снимка общей папки и метки времени в портал Azure.

  4. Преобразуйте метку времени в формат, ожидаемый mount командой, которая составляет @GMT-year.month.day-hour.minutes.seconds. В этом примере вы преобразуете 2023-01-05T00:08:20.000000Z в @GMT-2023.01.05-00.08.20.

  5. mount Выполните команду, используя время GMT, чтобы указать snapshot значение. Обязательно замените <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" (SMB).

Следующие шаги

Дополнительные сведения о службе файлов Azure см. по следующим ссылкам.