Виртуальный диск Google Drive иногда имеет странные разрешения, которые делают его недоступным.

Вопрос или проблема

Я использую Ubuntu 22.04 через WSL 2, и у меня есть Google Drive через Windows 11, который создает виртуальный диск на G:. Я смонтировал диск в WSL по адресу /mnt/g. Иногда, я думаю, из-за отключения сети, когда компьютер уходит в спящий режим, /mnt/g оказывается в странном состоянии, когда кажется, что он существует, но в то же время не существует. Вот вывод команды ls -al /mnt:

ls: cannot access '/mnt/g': No such device
total 16K
drwxr-xr-x  8 root    root    4.0K Nov 21 21:13 ./
drwxr-xr-x 27 root    root    4.0K Dec  2 08:52 ../
drwxr-xr-x  1 me      me      4.0K Dec  1 08:40 c/
drwxr-xr-x  2 root    root    4.0K Nov 21 21:13 d/
drwxr-xr-x  2 root    root    4.0K Jun  2  2023 f/
d?????????  ? ?       ?          ?            ? g/
drwxrwxrwt  2 root    root      60 Dec  2 08:52 wsl/
drwxrwxrwt  7 root    root     300 Dec  5 06:23 wslg/

Я понимаю, что мне нужно повторно смонтировать диск, если это произойдет. У меня есть скрипт под названием ezmount, который упрощает процесс. Вот его содержимое:

#!/usr/bin/env bash
DRIVE_LETTER="$1"

if [[ ! "$DRIVE_LETTER" ]]; then
    echo Пожалуйста, введите букву диска.
    exit 1
fi

mount_path="/mnt/${DRIVE_LETTER,,}"

if [[ ! -e "$mount_path" ]]; then
    sudo mkdir "$mount_path"
    
    if [[ "$?" ]]; then
        echo Что-то пошло не так при попытке создать каталог "$mount_path".
        exit 1
    fi
fi

sudo mount -t drvfs "${DRIVE_LETTER^^}:" "$mount_path" -o "uid=$(id -u $USER),gid=$(id -g $USER),metadata"

Когда скрипт доходит до строки sudo mkdir "$mount_path", ответом является mkdir: cannot create directory ‘/mnt/g’: File exists, и скрипт завершается без монтирования. Таким образом, хотя проверка существования /mnt/g с помощью [[ -e /mnt/g ]] возвращает false, Ubuntu все равно утверждает, что путь существует. В общем, я хочу, чтобы скрипт создавал путь монтирования, если его нет, на случай, если будет добавлен новый диск, но в этом сценарии я хочу, чтобы он понимал, что путь уже существует, и повторно монтировал его. Я не хочу вводить длинную команду mount сам, именно поэтому я написал скрипт. Есть ли какая-то команда, которую я должен использовать, кроме -e, которая сработает в этом сценарии?

Ответ или решение

Проблема, с которой вы столкнулись, связана с неправильными разрешениями или состоянием точки монтирования Google Drive в WSL 2 под Ubuntu 22.04. Рассмотрим более подробно, как можно исправить вашу ситуацию.

Анализ проблемы

При подключении Google Drive через виртуальный диск в Windows 11 и его монтировании в WSL 2, иногда появляются сложности, когда система не может корректно определить состояние точки монтирования. Это может произойти, если ваше устройство переходило в спящий режим или если у вас была потеря соединения с сетью. В результате, WSL не может корректно обработать наличие точки монтирования, что приводит к ошибкам, таким как ls: cannot access '/mnt/g': No such device, и одновременно к тому, что mkdir сообщает о существовании директории.

Решение проблемы

Ваш скрипт ezmount сталкивается с проблемой, потому что -e не всегда корректно определяет состояние точки монтирования. Чтобы избежать этой ситуации, вам следует использовать другой подход для проверки наличия монтирования. Вот предложенное решение:

  1. Проверка состояния монтирования: Вместо использования [[ -e "$mount_path" ]] можно воспользоваться mountpoint, чтобы проверить, активно ли данное монтирование:
if mountpoint -q "$mount_path"; then
    echo "Точка монтирования $mount_path уже смонтирована."
else
    sudo mkdir -p "$mount_path"
    sudo mount -t drvfs "${DRIVE_LETTER^^}:" "$mount_path" -o "uid=$(id -u $USER),gid=$(id -g $USER),metadata"
fi
  1. Добавление проверки на существование: Если необходимо создать путь, предусмотрите использование -p в команде mkdir, чтобы избежать ошибок, когда директория уже существует.

Обновленный скрипт

Вот обновлённый вариант вашего скрипта с учетом рекомендаций:

#!/usr/bin/env bash
DRIVE_LETTER="$1"

if [[ -z "$DRIVE_LETTER" ]]; then
    echo "Пожалуйста, введите букву диска."
    exit 1
fi

mount_path="/mnt/${DRIVE_LETTER,,}"

# Проверка, смонтирована ли точка
if mountpoint -q "$mount_path"; then
    echo "Точка монтирования $mount_path уже смонтирована."
else
    sudo mkdir -p "$mount_path"  # Создать директорию, если она не существует
    if [[ "$?" -ne 0 ]]; then
        echo "Что-то пошло не так при попытке создать директорию $mount_path."
        exit 1
    fi

    sudo mount -t drvfs "${DRIVE_LETTER^^}:" "$mount_path" -o "uid=$(id -u $USER),gid=$(id -g $USER),metadata"
fi

Заключение

Таким образом, пересмотрев алгоритм проверки существования монтирования, вы сможете избежать проблем, связанных с доступом к Google Drive в WSL 2. Это также упростит вашу работу с скриптом, позволяя вам не беспокоиться о состоянии виртуальной точки монтирования.

Если у вас будут дополнительные вопросы или потребуется помощь, не стесняйтесь обращаться.

Оцените материал
Добавить комментарий

Капча загружается...