Подключение общей папки Azure через протокол SMB в Linux

Внимание

Эта статья ссылается на CentOS, дистрибутив Linux, который приближается к состоянию конца жизни (EOL). Обратите внимание на использование и план соответствующим образом. Дополнительные сведения см. в руководстве centOS End Of Life. Файлы Azure — это простая в использовании облачная файловая система от Майкрософт. Файловые ресурсы Azure можно подключить в дистрибутивах Linux с помощью SMB-клиента в ядре.

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

Distribution S МБ 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, она должна поддерживать S МБ 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 открыт: S МБ взаимодействует через 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 или dir_mode и file_mode. Дополнительные сведения о настройке разрешений см. в разделе Цифровая нотация UNIX в Википедии.

Совет

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

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

Подключение моментального снимка общей папки

Если вы хотите подключить определенный моментальный снимок общей папки S МБ 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 и доступом" (S МБ).

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

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