Вопрос или проблема
Я использую 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
не всегда корректно определяет состояние точки монтирования. Чтобы избежать этой ситуации, вам следует использовать другой подход для проверки наличия монтирования. Вот предложенное решение:
- Проверка состояния монтирования: Вместо использования
[[ -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
- Добавление проверки на существование: Если необходимо создать путь, предусмотрите использование
-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. Это также упростит вашу работу с скриптом, позволяя вам не беспокоиться о состоянии виртуальной точки монтирования.
Если у вас будут дополнительные вопросы или потребуется помощь, не стесняйтесь обращаться.