Условно установите раздел Windows

Поскольку я использую двойную загрузку (Windows 10 / CentOS 7), я хочу, чтобы некоторые файлы были разделены между двумя ОС, такими как музыка, фотографии и т. Д. Поэтому я подумал, что было бы неплохо автоматически смонтировать мои данные Windows -разделение во время запуска. Однако это не всегда возможно, потому что мне нужно было спящий режим Windows, перезагрузиться в Linux, чтобы что-то сделать, а затем снова вернуться в Windows.

Итак, как я могу автоматически монтировать этот раздел во время загрузки, но при условии, что: «если он был обнаружен как« нечистый », смонтируйте его только для чтения»?

Создайте помощник FUSE в /usr/bin который пытается установить rw и, если это не удается, повторяет попытку с монтированием ro . (Если вы не знакомы с FUSE, это подсистема, которая позволяет коду пользователя управлять настраиваемыми файловыми системами .)

Создайте файл /usr/bin/windowsfs со следующим содержимым. Сделайте его исполняемым.

 #!/bin/bash mount "$@" || mount "$@" -o ro 

Установите пакет fuse (я не уверен в имени CentOS, но это тот, который предоставляет инструменты и подсистему для поддержки файловых систем FUSE).

Используйте такую ​​строку в /etc/fstab , которая объявляет ваш раздел Windows /dev/sda2 как тип fuse.windowsfs и монтируется в /mnt/dsk

 /dev/sda2 /mnt/dsk fuse.windowsfs defaults 0 0 

Когда эта строка действует, она вызывает помощник FUSE /usr/bin/windowfs для монтирования раздела. Это наш скрипт, который пытается создать загружаемое монтирование, но при необходимости возвращается к монтируемому только для чтения.

Стандартной операции umount /mnt/dsk достаточно, чтобы размонтировать раздел после использования.


Более надежный скрипт windowsfs может выглядеть так, где вы получите сообщение об ошибке с «обычного» монтирования, если оба монтера не сработали:

 #!/bin/bash # exec 3>&1 error1=$(mount "$@" 2>&1 1>&3); ss1=$? ss2=0 [[ 0 -lt $ss1 ]] && { error2=$(mount "$@" -o ro 2>&1 1>&3); ss2=$?; } [[ 0 -lt $ss2 ]] && { error="$error1" ss=$ss1; } || { error="$error2" ss=$ss2; } [[ 0 -lt $ss ]] && echo "$error" >&2 exit $ss