Linux & Tools
February 9

Перенос папки с раздела vfat на раздел ext-4 без изменения filepath

Хитрый трюк не снимая брюк. Решение показалось изящным, поэтому решил документировать.

Абстракт

Мы решили подключить старый HDD для использования с локальным веб-сервером под nginx в Docker-контейнере.

Диск 500 ГБ с одним разделом остался от Windows 10  и использовался для хранения 250 ГБ различного контента: графики для статей, видео и т. д.  HDD железный, тихий, холодный, в хорошем состоянии, WD,  2017 год. 

Минусы: VFAT, dirty bit, помечен msdata, guid sambashare и никак не поменять права даже через sudo chown.

Пока девайс как хранилище работал норм. - я его и не трогал.

Файловая система vfat  и прочие указанные выше "особенности" при попытках использовать драйв в ubuntu с использованием системных возможностей по взаимодействию с контейнерами приводили к постоянным глюкам при копировании из контейнеров, работе с правами, группами и POSIX-совместимыми атрибутами.

Решение: создать новый раздел ext4, чтобы избежать проблем с правами доступа и POSIX. Исходя из ответов от  KDE Partition Manager у меня были мысли отформатировать и разбить на два раздела, так как партишн менеджер нес какой то бред про "заполнение" файловой системой всего диска и невозможность изменения размеров партишн. Звучало правдоподобно и пнуть винду лишний раз за деревянные технологии - святое дело, поэтому всё казалось, шло к форматированию драйва. Ни запаса по питанию, по слотам, по usb портам нет для установки нового диска, и вообще держать почти терабайт дискового пространства на скромном настольном моноблоке вполне достаточно, я считаю. В системе два драйва SSD и HDD это мне нравится и меня устраивает. KDE KDE Partition Manager мне удобен для управления свопом с графическим UI и дизайн приятный.

Мои ковыряния:

Использовал GParted 1.0.0 (libparted 3.3), так как KDE Partition Manager 22.08.1 не смог корректно выполнить разбивку - там другие библиотеки.

Разделили диск:

  • Было:
Device Start End Sectors Size Type 
/dev/sdb1 2048 746254335 746252288 465.9G Microsoft basic data 
  • Стало:
Device Start End Sectors Size Type 
/dev/sdb1 2048 746254335 746252288 355.9G Microsoft basic data 
/dev/sdb2 746254336 976773119 230518784 109.9G Linux filesystem 

После работы GParted права на созданный раздел и на старый vfat стали root.
Разделы стали доступны для монтирования и размонтирования через UI приложения со сменой прав доступа, владельца и группы. Явно то, что gparted вычистил проблему, причину которой мне самостоятельно найти было сложно.

Для корректной работы разделов в моей системе выполнили:

sudo chown -R hakim:hakim /media/hakim/HDD  

Аналогично - sudo chown для второго раздела /dev/sdb2 , монтажную точку для которого сначала  использовал  /media/hakim/HDD-ext4

sudo chown -R hakim:hakim /media/hakim/HDD-ext4

С owner = root на диск особо не попишешь, только для чтения открыт.

После этого появился нормальный доступ на запись к файлам и возможность менять права в UI приложениях типа Dolphin и тп.

Создали монтажную точку и смонтировали туда раздел ext4:

Предварительно переименовали существующую папку /HDD/f-docker  из-за которой собственно, весь сыр-бор. Это папка со скриптами и volumes Docker.

Как оказалось…

Это можно было сделать только так, и по другому - никак:

sudo mkdir -p /media/hakim/HDD/f-docker 
sudo mount -t ext4 /dev/sdb2 /media/hakim/HDD/f-docker  

Попытки монтирования с такой Mount Point через GpartedDolphin и KDE Partition Manager приводили к страшным «ошибкам» и сообщениям о невозможности монтирования ext4-раздела внутри vfat-раздела.

Возможно, ключом к успеху явилось указание в аргументах mount файловой системы раздела.

В итоге, "мандирование" вручную средствами линукс через mount как всегда оказалось лучшим вариантом. Но риски ручного ковыряния конечно  - щекочут нервы.

Прописанные ранее и отлаженные длинные bash скрипты с логированием, которые стартуют и останавливают контейнер, включают https, генерят сертификаты SSL, переименовывают системные бриджи, монтируют папки контейнера в локальные папки, что тоже с vfat не очень то хорошо дружит, еще куча кастомизации для nginx - все должно было переехать на другие адреса в файловой системе. Оставить линк на новую папку с тем же именем нельзя - vfat такого не может.

Вообщем, все настройки развертывания контейнера были уже привязаны к конкретным директориям. Перспектива перелопатить всё чтобы поменять 12 строчек с путями к директориям и забыть две, потом искать полдня - не очень нравилась.

По итогу - ни одного символа не пришлось изменить в скриптах.

Адрес папки

/media/hakim/HDD/f-docker

- так и остался как путь к локальной рабочей директории. Просто скопировал содержимое рабочей папки в корень нового раздела и все.

Такое решение - смонтировать раздел в монтажную точку, которая находится в другом (не системном) разделе, как вложенная папка, не приходил в голову не только мне, но и разрабам gparted, KDE PM, Dolphin приложения которых падали в обморок при попытке такого монтажа. Скорее всего - это баг библиотек которые они используют, можно писать репорт.

Так что членский билет международной мистической секты «Debilы» - не только у меня одного завернут в тряпочку и в погребе спрятан, в жестянке из под голландской гуманитарной ветчины 89-го года.

Вот и всё - три часа ужоса от перспективы бэкапа и восстановления 250ГБ с альтернативой разбора архивов и сокращения этого объема вдвое.

Три с половиной команды в терминале всего-то и пожелания всем не лениться в таких кейсах.