Крепление(8) с креплением(2)

Крепление(8) с креплением(2)

У меня есть программное обеспечение, которое программно отмонтирует раздел (если он не занят) и монтирует его снова после того, как вся работа будет выполнена.

Если я запущу это в терминале:

sudo mount /dev/sdb1 /mnt/fat32 -o sync,dirsync,rw,uid=1000,gid=1000,fmask=0022,dmask=0022,codepage=437,iocharset=iso8859-1,shortname=mixed,showexec,utf8,flush,errors=remount-ro -t vfat

Я получаю это в /proc/self/mountinfo:

100 24 8:17 / /mnt/fat32 rw,relatime shared:61 - vfat /dev/sdb1 rw,sync,dirsync,uid=1000,gid=1000,fmask=0022,dmask=0022,codepage=437,iocharset=iso8859-1,shortname=mixed,showexec,utf8,flush,errors=remount-ro

Поэтому я создал парсер mountinfo и получил данные для восстановления монтирования, но у меня возникли проблемы с преобразованием параметров монтирования ( rw,relatime) и параметров super (последняя часть в /mountinfo: rw,sync,dirsync,...) с помощью mountoptionsи data:

int mount(const char *source, const char *target,
          const char *filesystemtype, unsigned long mountflags,
          const void *data);

Мой подход заключался в том, чтобы преобразовать параметры монтирования в соответствующие mountflagsи указать специальные параметры непосредственно в data, но затем я получаю эту ошибку:

[62857.390803] FAT-fs (sdb1): Unrecognized mount option "rw" or missing value

Поэтому я создал функцию для копирования атрибутов в super options, которая просто соответствует данным, специфичным для файловой системы, и теперь это работает. Но у меня все еще есть проблема: как мне установить, например, syncи dirsyncесли их нет в флагах mount options и если они не для vfat специфичных атрибутов?

Если это можно сделать через командную строку, то это можно сделать и в версии для командной строки, верно?

решение1

Некоторые из параметров, заданныхmount(8)преобразуются в флаги, указанные в mountflagsпараметреmount(2):

  • syncявляется MS_SYNCHRONOUS;
  • dirsyncявляется MS_DIRSYNC;
  • relatimeявляется MS_RELATIME;
  • rwявляется значением по умолчанию, поэтому его нельзя указать; roбудет MS_RDONLY.

решение2

Поэтому я сделал mountinfoпарсер[…]

Лучше использовать setmntent()и getmntent(), которые входят в библиотеку времени выполнения GNU C.

Мой подход заключался в том, чтобы преобразовать параметры монтирования в соответствующие mountflagsи предоставить специальные параметры напрямуюdata[…]

Что вам нужно сделать, так это взять mnt_optsданные вам getmntent()и обработать их в flagsи data. mountКоманда из util-linuxпакета опирается на библиотеку для этого, названнуюlibmount. Часть из них основана на таблицах, специфичных для Linux.

дальнейшее чтение

  • "Файлmtab".Справочное руководство по библиотеке GNU C. 2.23. Фонд свободного программного обеспечения. 2016.
  • Карел Зак (2012). "Варианты крепления".Справочное руководство по libmount2.21. Архивы ядра Linux.

Связанный контент